From 6fe6b7a067c0bce6cc79643b3ae1053ede5b4e91 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 5 Sep 2016 09:12:17 +1000 Subject: [PATCH] Ask to confirm before changing rank of non-existent players. --- Commands/Moderation/CmdBan.cs | 2 +- Commands/Moderation/CmdSetRank.cs | 23 +++++++++++-------- Commands/Moderation/RankCmd.cs | 38 ++++++++++++++++++++++++++++++- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/Commands/Moderation/CmdBan.cs b/Commands/Moderation/CmdBan.cs index 9beb77e07..b7deb18b0 100644 --- a/Commands/Moderation/CmdBan.cs +++ b/Commands/Moderation/CmdBan.cs @@ -35,7 +35,7 @@ namespace MCGalaxy.Commands.Moderation { } string[] args = message.SplitSpaces(2); - string reason = args.Length > 1 ? args[1] : Server.defaultBanMessage; + string reason = args.Length > 1 ? args[1] : Server.defaultBanMessage; if (reason == "-") reason = "&c-"; reason = GetReason(p, reason); if (reason == null) return; diff --git a/Commands/Moderation/CmdSetRank.cs b/Commands/Moderation/CmdSetRank.cs index e5ceeca10..2a6e4f3d8 100644 --- a/Commands/Moderation/CmdSetRank.cs +++ b/Commands/Moderation/CmdSetRank.cs @@ -31,17 +31,22 @@ namespace MCGalaxy.Commands.Moderation { string[] args = message.SplitSpaces(3); if (args.Length < 2) { Help(p); return; } string rank = null, name = null; - - if (args[0].CaselessEq("+up") || args[0].CaselessEq("-down")) { - rank = args[0]; name = args[1]; - } else { - rank = args[1]; name = args[0]; - } - string reason = args.Length > 2 ? args[2] : null, rankMsg = null; - Player who = PlayerInfo.Find(name); + + if (args[0].CaselessEq("+up")) { + rank = args[0]; + name = RankCmd.FindName(p, "promote", "", args[1], ref reason); + } else if (args[0].CaselessEq("-down")) { + rank = args[0]; + name = RankCmd.FindName(p, "demote", "", args[1], ref reason); + } else { + rank = args[1]; + name = RankCmd.FindName(p, "rank", " " + rank, args[0], ref reason); + } + if (name == null) return; + + Player who = PlayerInfo.FindExact(name); if (who == p && who != null) { Player.Message(p, "Cannot change your own rank."); return; } - if (who != null) name = who.name; Group curRank = who != null ? who.group : PlayerInfo.GetGroup(name); Group newRank = TargetRank(p, rank.ToLower(), curRank); diff --git a/Commands/Moderation/RankCmd.cs b/Commands/Moderation/RankCmd.cs index 37c9e7130..290d522f8 100644 --- a/Commands/Moderation/RankCmd.cs +++ b/Commands/Moderation/RankCmd.cs @@ -20,7 +20,7 @@ using System.IO; namespace MCGalaxy.Commands.Moderation { internal static class RankCmd { - + internal static void ChangeRank(string name, Group oldRank, Group newRank, Player who, bool saveToNewRank = true) { Server.reviewlist.Remove(name); @@ -42,5 +42,41 @@ namespace MCGalaxy.Commands.Moderation { who.Send(Packet.MakeUserType(who)); Entities.SpawnEntities(who, false); } + + internal static string FindName(Player p, string action, string cmdArgs, + string name, ref string reason) { + string match = MatchName(p, ref name); + if (match != null) { + if (match.CaselessEq(name)) return match; + // Not an exact match, may be wanting to ban an offline account + Player.Message(p, "1 player matches \"{0}\": {1}", name, match); + } + + string confirmed = IsConfirmed(reason); + if (confirmed != null) { reason = confirmed; return name; } + string msgReason = String.IsNullOrEmpty(reason) ? "" : " " + reason; + Player.Message(p, "If you still want to {0} {1}, use %T/{0} {1}{2} confirm {3}", + action, name, cmdArgs, msgReason); + return null; + } + + static string MatchName(Player p, ref string name) { + int matches = 0; + Player target = PlayerInfo.FindMatches(p, name, out matches); + if (matches > 1) return null; + if (matches == 1) { name = target.name; return name; } + + Player.Message(p, "Searching PlayerDB..."); + return PlayerInfo.FindOfflineNameMatches(p, name); + } + + static string IsConfirmed(string reason) { + if (reason == null) return null; + if (reason.CaselessEq("confirm")) + return ""; + if (reason.CaselessStarts("confirm ")) + return reason.Substring("confirm ".Length); + return null; + } } }