From 6e9dcc2ed22c5e982a2e409d0073809f25509a56 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 15 Jun 2018 17:48:46 +1000 Subject: [PATCH] More consistent permission denied messages for moderation commands --- MCGalaxy/Blocks/Extended/Portal.cs | 2 +- MCGalaxy/Commands/Command.Helpers.cs | 2 +- MCGalaxy/Commands/Information/CmdRules.cs | 2 +- MCGalaxy/Commands/Moderation/CmdBan.cs | 20 ++++++--------- MCGalaxy/Commands/Moderation/CmdFreeze.cs | 7 +++--- MCGalaxy/Commands/Moderation/CmdMute.cs | 6 +++-- MCGalaxy/Commands/Moderation/CmdTempBan.cs | 9 +++---- MCGalaxy/Commands/Moderation/CmdWarn.cs | 26 ++++++-------------- MCGalaxy/Commands/Moderation/ModActionCmd.cs | 13 ++++++++++ MCGalaxy/Database/Backends/MySQL.cs | 14 ++++++----- MCGalaxy/Database/Database.cs | 22 ++++++++++------- MCGalaxy/Database/ParameterisedQuery.cs | 2 -- MCGalaxy/Database/PlayerDB.cs | 6 ++--- MCGalaxy/Player/PlayerInfo.cs | 2 +- 14 files changed, 68 insertions(+), 65 deletions(-) diff --git a/MCGalaxy/Blocks/Extended/Portal.cs b/MCGalaxy/Blocks/Extended/Portal.cs index 0ea64e872..e39bda993 100644 --- a/MCGalaxy/Blocks/Extended/Portal.cs +++ b/MCGalaxy/Blocks/Extended/Portal.cs @@ -73,7 +73,7 @@ namespace MCGalaxy.Blocks.Extended { static PortalExit ParseExit(IDataRecord record) { PortalExit data = new PortalExit(); - data.Map = record.GetString(0).Cp437ToUnicode(); + data.Map = record.GetText(0).Cp437ToUnicode(); data.X = (ushort)record.GetInt32(1); data.Y = (ushort)record.GetInt32(2); diff --git a/MCGalaxy/Commands/Command.Helpers.cs b/MCGalaxy/Commands/Command.Helpers.cs index f93db887f..76f615a63 100644 --- a/MCGalaxy/Commands/Command.Helpers.cs +++ b/MCGalaxy/Commands/Command.Helpers.cs @@ -64,7 +64,7 @@ namespace MCGalaxy { return false; } - protected static void MessageTooHighRank(Player p, string action, bool canAffectOwnRank) { + protected internal static void MessageTooHighRank(Player p, string action, bool canAffectOwnRank) { MessageTooHighRank(p, action, p.group, canAffectOwnRank); } diff --git a/MCGalaxy/Commands/Information/CmdRules.cs b/MCGalaxy/Commands/Information/CmdRules.cs index a3b60ad1d..e88a97a34 100644 --- a/MCGalaxy/Commands/Information/CmdRules.cs +++ b/MCGalaxy/Commands/Information/CmdRules.cs @@ -44,7 +44,7 @@ namespace MCGalaxy.Commands.Info { } if (who != null) who.hasreadrules = true; - string[] rules = rulesFile.GetText(); + string[] rules = rulesFile.GetText(); Player.Message(who, "Server Rules:"); Player.MessageLines(who, rules); diff --git a/MCGalaxy/Commands/Moderation/CmdBan.cs b/MCGalaxy/Commands/Moderation/CmdBan.cs index 1d30305a4..9e2df9cc9 100644 --- a/MCGalaxy/Commands/Moderation/CmdBan.cs +++ b/MCGalaxy/Commands/Moderation/CmdBan.cs @@ -38,25 +38,19 @@ namespace MCGalaxy.Commands.Moderation { reason = ModActionCmd.ExpandReason(p, reason); if (reason == null) return; - Group group = PlayerInfo.GetGroup(target); - if (!CheckPerms(target, group, p)) return; + Group group = ModActionCmd.CheckTarget(p, "ban", target); + if (group == null) return; + + if (group.Permission == LevelPermission.Banned) { + Player.Message(p, "{0} %Sis already banned.", PlayerInfo.GetColoredName(p, target)); + return; + } ModAction action = new ModAction(target, p, ModActionType.Ban, reason); action.targetGroup = group; OnModActionEvent.Call(action); } - static bool CheckPerms(string name, Group group, Player p) { - if (group.Permission == LevelPermission.Banned) { - Player.Message(p, "{0} %Sis already banned.", PlayerInfo.GetColoredName(p, name)); - return false; - } - if (p != null && group.Permission >= p.Rank) { - MessageTooHighRank(p, "ban", false); return false; - } - return true; - } - public override void Help(Player p) { Player.Message(p, "%T/Ban [player] "); Player.Message(p, "%HBans a player (and kicks them if online)."); diff --git a/MCGalaxy/Commands/Moderation/CmdFreeze.cs b/MCGalaxy/Commands/Moderation/CmdFreeze.cs index abb206170..a98e3f341 100644 --- a/MCGalaxy/Commands/Moderation/CmdFreeze.cs +++ b/MCGalaxy/Commands/Moderation/CmdFreeze.cs @@ -30,9 +30,10 @@ namespace MCGalaxy.Commands.Moderation { string[] args = message.SplitSpaces(3); Player who = PlayerInfo.FindMatches(p, args[0]); - if (who == null) return; - if (p != null && p == who) { Player.Message(p, "Cannot freeze yourself."); return; } - if (p != null && who.Rank >= p.Rank) { MessageTooHighRank(p, "freeze", false); return; } + if (who == null) return; + + Group group = ModActionCmd.CheckTarget(p, "freeze", who.name); + if (group == null) return; if (who.frozen) { string reason = args.Length > 1 ? args[1] : ""; diff --git a/MCGalaxy/Commands/Moderation/CmdMute.cs b/MCGalaxy/Commands/Moderation/CmdMute.cs index 77089a133..d594f2dc5 100644 --- a/MCGalaxy/Commands/Moderation/CmdMute.cs +++ b/MCGalaxy/Commands/Moderation/CmdMute.cs @@ -34,12 +34,12 @@ namespace MCGalaxy.Commands.Moderation { if (Server.muted.Contains(args[0])) Unmute(p, args[0], args); return; } - if (p != null && p == who) { Player.Message(p, "You cannot mute or unmute yourself."); return; } if (who.muted) { Unmute(p, who.name, args); } else { - if (p != null && who.Rank >= p.Rank) { MessageTooHighRank(p, "mute", false); return; } + Group group = ModActionCmd.CheckTarget(p, "mute", who.name); + if (group == null) return; TimeSpan duration = TimeSpan.FromSeconds(ServerConfig.ChatSpamMuteTime); if (args.Length > 1) { @@ -60,6 +60,8 @@ namespace MCGalaxy.Commands.Moderation { reason = ModActionCmd.ExpandReason(p, reason); if (reason == null) return; + if (p != null && p.name == name) { Player.Message(p, "You cannot unmute yourself."); return; } + ModAction action = new ModAction(name, p, ModActionType.Unmuted, reason); OnModActionEvent.Call(action); } diff --git a/MCGalaxy/Commands/Moderation/CmdTempBan.cs b/MCGalaxy/Commands/Moderation/CmdTempBan.cs index 2e47ab623..033f1bb8b 100644 --- a/MCGalaxy/Commands/Moderation/CmdTempBan.cs +++ b/MCGalaxy/Commands/Moderation/CmdTempBan.cs @@ -35,10 +35,9 @@ namespace MCGalaxy.Commands.Moderation { args[0], ref reason); if (target == null) return; - Group grp = PlayerInfo.GetGroup(target); - if (p != null && grp.Permission >= p.Rank) { - MessageTooHighRank(p, "temp ban", false); return; - } + Group group = ModActionCmd.CheckTarget(p, "temp ban", target); + if (group == null) return; + if (Server.tempBans.Contains(target)) { Player.Message(p, "{0} %Sis already temp-banned.", PlayerInfo.GetColoredName(p, target)); return; @@ -52,7 +51,7 @@ namespace MCGalaxy.Commands.Moderation { if (reason == null) return; ModAction action = new ModAction(target, p, ModActionType.Ban, reason, span); - action.targetGroup = grp; + action.targetGroup = group; OnModActionEvent.Call(action); } diff --git a/MCGalaxy/Commands/Moderation/CmdWarn.cs b/MCGalaxy/Commands/Moderation/CmdWarn.cs index 5fd8453eb..d2ae3bbb2 100644 --- a/MCGalaxy/Commands/Moderation/CmdWarn.cs +++ b/MCGalaxy/Commands/Moderation/CmdWarn.cs @@ -27,28 +27,18 @@ namespace MCGalaxy.Commands.Moderation { public override void Use(Player p, string message) { if (message.Length == 0) { Help(p); return; } string[] args = message.SplitSpaces(2); - Player who = PlayerInfo.FindMatches(p, args[0]); - + string reason = args.Length == 1 ? "you know why." : args[1]; + string target = ModActionCmd.FindName(p, "warn", "Warn", "", args[0], ref reason); + if (target == null) return; + reason = ModActionCmd.ExpandReason(p, reason); if (reason == null) return; - - if (who == null) { WarnOffline(p, args, reason); return; } - if (who == p) { Player.Message(p, "you can't warn yourself"); return; } - if (p != null && p.Rank <= who.Rank) { - MessageTooHighRank(p, "warn", false); return; - } + + Group group = ModActionCmd.CheckTarget(p, "warn", target); + if (group == null) return; - ModAction action = new ModAction(who.name, p, ModActionType.Warned, reason); - OnModActionEvent.Call(action); - } - - static void WarnOffline(Player p, string[] args, string reason) { - Player.Message(p, "Searching PlayerDB.."); - string offName = PlayerDB.MatchNames(p, args[0]); - if (offName == null) return; - - ModAction action = new ModAction(offName, p, ModActionType.Warned, reason); + ModAction action = new ModAction(target, p, ModActionType.Warned, reason); OnModActionEvent.Call(action); } diff --git a/MCGalaxy/Commands/Moderation/ModActionCmd.cs b/MCGalaxy/Commands/Moderation/ModActionCmd.cs index eb046bfdb..2c925a814 100644 --- a/MCGalaxy/Commands/Moderation/ModActionCmd.cs +++ b/MCGalaxy/Commands/Moderation/ModActionCmd.cs @@ -31,6 +31,7 @@ namespace MCGalaxy.Commands.Moderation { /// Expands @[rule number] to the actual rule with that number. public static string ExpandReason(Player p, string reason) { if (reason.Length == 0 || reason[0] != '@') return reason; + reason = reason.Substring(1); int num; if (!int.TryParse(reason, out num)) return "@" + reason; @@ -126,6 +127,18 @@ namespace MCGalaxy.Commands.Moderation { } } + internal static Group CheckTarget(Player p, string action, string target) { + if (p != null && target == p.name) { + Player.Message(p, "You canot {0} yourself", action); return null; + } + + Group group = PlayerInfo.GetGroup(target); + if (p != null && p.Rank <= group.Permission) { + Command.MessageTooHighRank(p, action, false); return null; + } + return group; + } + /// Finds the matching name(s) for the input name, /// and requires a confirmation message for non-existent players. diff --git a/MCGalaxy/Database/Backends/MySQL.cs b/MCGalaxy/Database/Backends/MySQL.cs index e99657477..fb00cfcf3 100644 --- a/MCGalaxy/Database/Backends/MySQL.cs +++ b/MCGalaxy/Database/Backends/MySQL.cs @@ -140,17 +140,19 @@ namespace MCGalaxy.SQL { List fields = new List(); Database.Iterate("DESCRIBE `" + table + "`", fields, Database.ReadFields); + const int i_name = 0, i_type = 1, i_null = 2, i_key = 3, i_def = 4, i_extra = 5; string pri = ""; + for (int i = 0; i < fields.Count; i++) { - string[] field = fields[i]; + string[] field = fields[i]; + if (field[i_key].CaselessEq("pri")) pri = field[i_name]; - if (field[3].CaselessEq("pri")) pri = field[0]; - string value = field[2].CaselessEq("no") ? "NOT NULL" : "DEFAULT NULL"; - if (field[4].Length > 0) value += " DEFAULT '" + field[4] + "'"; - if (field[5].Length > 0) value += " " + field[5]; + string meta = field[i_null].CaselessEq("no") ? "NOT NULL" : "DEFAULT NULL"; + if (field[i_def].Length > 0) meta += " DEFAULT '" + field[i_def] + "'"; + if (field[i_extra].Length > 0) meta += " " + field[i_extra]; string suffix = pri.Length == 0 && (i == fields.Count - 1) ? "" : ","; - w.WriteLine("`{0}` {1} {2}{3}", field[0], field[1], value, suffix); + w.WriteLine("`{0}` {1} {2}{3}", field[i_name], field[i_type], meta, suffix); } if (pri.Length > 0) w.Write("PRIMARY KEY (`{0}`)", pri); diff --git a/MCGalaxy/Database/Database.cs b/MCGalaxy/Database/Database.cs index 58ba8b826..b44a99a15 100644 --- a/MCGalaxy/Database/Database.cs +++ b/MCGalaxy/Database/Database.cs @@ -33,14 +33,14 @@ namespace MCGalaxy.SQL { return (int)Backend.ReadRows(table, "COUNT(*)", 0, ReadInt, modifier, args); } - static object ReadString(IDataRecord record, object arg) { return record.GetString(0); } + static object ReadString(IDataRecord record, object arg) { return record.GetText(0); } public static string ReadString(string table, string column, string modifier = "", params object[] args) { return (string)Backend.ReadRows(table, column, null, ReadString, modifier, args); } internal static object ReadList(IDataRecord record, object arg) { - ((List)arg).Add(record.GetString(0)); return arg; + ((List)arg).Add(record.GetText(0)); return arg; } internal static List GetStrings(string sql, params object[] args) { List values = new List(); @@ -50,7 +50,7 @@ namespace MCGalaxy.SQL { internal static object ReadFields(IDataRecord record, object arg) { string[] field = new string[record.FieldCount]; - for (int i = 0; i < field.Length; i++) { field[i] = record.GetString(i); } + for (int i = 0; i < field.Length; i++) { field[i] = record.GetText(i); } ((List)arg).Add(field); return arg; } @@ -107,20 +107,24 @@ namespace MCGalaxy.SQL { return arg; } + + internal static string GetText(this IDataRecord record, int col) { + return record.IsDBNull(col) ? "" : record.GetString(col); + } internal static string GetText(this IDataRecord record, string name) { - int i = record.GetOrdinal(name); - return record.IsDBNull(i) ? "" : record.GetString(i); + int col = record.GetOrdinal(name); + return record.IsDBNull(col) ? "" : record.GetString(col); } internal static int GetInt(this IDataRecord record, string name) { - int i = record.GetOrdinal(name); - return record.IsDBNull(i) ? 0 : record.GetInt32(i); + int col = record.GetOrdinal(name); + return record.IsDBNull(col) ? 0 : record.GetInt32(col); } internal static long GetLong(this IDataRecord record, string name) { - int i = record.GetOrdinal(name); - return record.IsDBNull(i) ? 0 : record.GetInt64(i); + int col = record.GetOrdinal(name); + return record.IsDBNull(col) ? 0 : record.GetInt64(col); } internal static DateTime GetDateTime(this IDataRecord record, string name) { diff --git a/MCGalaxy/Database/ParameterisedQuery.cs b/MCGalaxy/Database/ParameterisedQuery.cs index d87db736f..55c3877f6 100644 --- a/MCGalaxy/Database/ParameterisedQuery.cs +++ b/MCGalaxy/Database/ParameterisedQuery.cs @@ -16,9 +16,7 @@ permissions and limitations under the Licenses. */ using System; -using System.Collections.Generic; using System.Data; -using System.Data.Common; namespace MCGalaxy.SQL { diff --git a/MCGalaxy/Database/PlayerDB.cs b/MCGalaxy/Database/PlayerDB.cs index 576f5b4d2..d95d9db72 100644 --- a/MCGalaxy/Database/PlayerDB.cs +++ b/MCGalaxy/Database/PlayerDB.cs @@ -107,7 +107,7 @@ namespace MCGalaxy.DB { public static string MatchNames(Player p, string name) { List names = new List(); - MatchMulti("Players", "Name", names, Database.ReadList); + MatchMulti(name, "Name", names, Database.ReadList); int matches; return Matcher.Find(p, name, out matches, names, @@ -116,7 +116,7 @@ namespace MCGalaxy.DB { public static string[] MatchValues(Player p, string name, string columns) { List name_values = new List(); - MatchMulti("Players", columns, name_values, Database.ReadFields); + MatchMulti(name, columns, name_values, Database.ReadFields); int matches; return Matcher.Find(p, name, out matches, name_values, @@ -130,7 +130,7 @@ namespace MCGalaxy.DB { public static PlayerData Match(Player p, string name) { List stats = new List(); - MatchMulti("Players", "*", stats, Database.ReadList); + MatchMulti(name, "*", stats, ReadStats); int matches; return Matcher.Find(p, name, out matches, stats, diff --git a/MCGalaxy/Player/PlayerInfo.cs b/MCGalaxy/Player/PlayerInfo.cs index 9d8eb7149..20264c860 100644 --- a/MCGalaxy/Player/PlayerInfo.cs +++ b/MCGalaxy/Player/PlayerInfo.cs @@ -109,7 +109,7 @@ namespace MCGalaxy { static object ReadAccounts(IDataRecord record, object arg) { List names = (List)arg; - string name = record.GetString(0); + string name = record.GetText(0); if (!names.CaselessContains(name)) names.Add(name); return arg;