diff --git a/Source/Game/Chat/CommandArgs.cs b/Source/Game/Chat/CommandArgs.cs index 2a15e039b..bb99c83eb 100644 --- a/Source/Game/Chat/CommandArgs.cs +++ b/Source/Game/Chat/CommandArgs.cs @@ -241,6 +241,9 @@ namespace Game.Chat case nameof(Tail): val = new Tail(); return val.TryConsume(handler, args); + case nameof(QuotedString): + val = new QuotedString(); + return val.TryConsume(handler, args); case nameof(PlayerIdentifier): val = new PlayerIdentifier(); return val.TryConsume(handler, args); diff --git a/Source/Game/Chat/CommandHandler.cs b/Source/Game/Chat/CommandHandler.cs index a7256e1a3..6f97f1f0c 100644 --- a/Source/Game/Chat/CommandHandler.cs +++ b/Source/Game/Chat/CommandHandler.cs @@ -143,7 +143,7 @@ namespace Game.Chat return null; if (!str.Contains("\"")) - return null; + return str; return str.Replace("\"", String.Empty); } diff --git a/Source/Game/Chat/CommandTags.cs b/Source/Game/Chat/CommandTags.cs index 9094f6c85..9fcc59c97 100644 --- a/Source/Game/Chat/CommandTags.cs +++ b/Source/Game/Chat/CommandTags.cs @@ -85,9 +85,8 @@ namespace Game.Chat _guid = ObjectGuid.Create(HighGuid.Player, tempVal); if ((_player = Global.ObjAccessor.FindPlayerByLowGUID(_guid.GetCounter())) != null) _name = _player.GetName(); - else - if (!Global.CharacterCacheStorage.GetCharacterNameByGuid(_guid, out _name)) - return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserCharGuidNoExist, _guid.ToString())); + else if (!Global.CharacterCacheStorage.GetCharacterNameByGuid(_guid, out _name)) + return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserCharGuidNoExist, _guid.ToString())); return next; } else @@ -185,4 +184,49 @@ namespace Game.Chat return new ChatCommandResult(str); } } + + struct QuotedString + { + string str; + + public bool IsEmpty() { return str.IsEmpty(); } + + public static implicit operator string(QuotedString quotedString) + { + return quotedString.str; + } + + public ChatCommandResult TryConsume(CommandHandler handler, string args) + { + str = ""; + + if (args.IsEmpty()) + return ChatCommandResult.FromErrorMessage(""); + if ((args[0] != '"') && (args[0] != '\'')) + return CommandArgs.TryConsume(out dynamic str, typeof(string), handler, args); + + char QUOTE = args[0]; + for (var i = 1; i < args.Length; ++i) + { + if (args[i] == QUOTE) + { + var (remainingToken, tail) = args.Substring(i + 1).Tokenize(); + if (remainingToken.IsEmpty()) // if this is not empty, then we did not consume the full token + return new ChatCommandResult(tail); + else + return ChatCommandResult.FromErrorMessage(""); + } + + if (args[i] == '\\') + { + ++i; + if (!(i < args.Length)) + break; + } + str += args[i]; + } + // if we reach this, we did not find a closing quote + return ChatCommandResult.FromErrorMessage(""); + } + } } diff --git a/Source/Game/Chat/Commands/BanCommands.cs b/Source/Game/Chat/Commands/BanCommands.cs index fc29c35c8..2ff6bb939 100644 --- a/Source/Game/Chat/Commands/BanCommands.cs +++ b/Source/Game/Chat/Commands/BanCommands.cs @@ -17,7 +17,6 @@ using Framework.Constants; using Framework.Database; -using Framework.IO; using Game.Entities; using System; using System.Net; @@ -28,33 +27,24 @@ namespace Game.Chat.Commands class BanCommands { [Command("account", RBACPermissions.CommandBanAccount, true)] - static bool HandleBanAccountCommand(CommandHandler handler, StringArguments args) + static bool HandleBanAccountCommand(CommandHandler handler, string playerName, uint duration, string reason) { - return HandleBanHelper(BanMode.Account, args, handler); + return HandleBanHelper(BanMode.Account, playerName, duration, reason, handler); } [Command("character", RBACPermissions.CommandBanCharacter, true)] - static bool HandleBanCharacterCommand(CommandHandler handler, StringArguments args) + static bool HandleBanCharacterCommand(CommandHandler handler, string playerName, uint duration, string reason) { - if (args.Empty()) + if (playerName.IsEmpty()) return false; - string name = args.NextString(); - if (string.IsNullOrEmpty(name)) + if (duration == 0) return false; - string durationStr = args.NextString(); - if (string.IsNullOrEmpty(durationStr)) + if (reason.IsEmpty()) return false; - if (!uint.TryParse(durationStr, out uint duration)) - return false; - - string reasonStr = args.NextString(""); - if (string.IsNullOrEmpty(reasonStr)) - return false; - - if (!ObjectManager.NormalizePlayerName(ref name)) + if (!ObjectManager.NormalizePlayerName(ref playerName)) { handler.SendSysMessage(CypherStrings.PlayerNotFound); return false; @@ -62,31 +52,31 @@ namespace Game.Chat.Commands string author = handler.GetSession() != null ? handler.GetSession().GetPlayerName() : "Server"; - switch (Global.WorldMgr.BanCharacter(name, durationStr, reasonStr, author)) + switch (Global.WorldMgr.BanCharacter(playerName, duration, reason, author)) { case BanReturn.Success: + { + if (duration > 0) { - if (duration > 0) - { - if (WorldConfig.GetBoolValue(WorldCfg.ShowBanInWorld)) - Global.WorldMgr.SendWorldText(CypherStrings.BanCharacterYoubannedmessageWorld, author, name, Time.secsToTimeString(Time.TimeStringToSecs(durationStr), TimeFormat.ShortText), reasonStr); - else - handler.SendSysMessage(CypherStrings.BanYoubanned, name, Time.secsToTimeString(Time.TimeStringToSecs(durationStr), TimeFormat.ShortText), reasonStr); - } + if (WorldConfig.GetBoolValue(WorldCfg.ShowBanInWorld)) + Global.WorldMgr.SendWorldText(CypherStrings.BanCharacterYoubannedmessageWorld, author, playerName, Time.secsToTimeString(duration, TimeFormat.ShortText), reason); else - { - if (WorldConfig.GetBoolValue(WorldCfg.ShowBanInWorld)) - Global.WorldMgr.SendWorldText(CypherStrings.BanCharacterYoupermbannedmessageWorld, author, name, reasonStr); - else - handler.SendSysMessage(CypherStrings.BanYoupermbanned, name, reasonStr); - } - break; + handler.SendSysMessage(CypherStrings.BanYoubanned, playerName, Time.secsToTimeString(duration, TimeFormat.ShortText), reason); } - case BanReturn.Notfound: + else { - handler.SendSysMessage(CypherStrings.BanNotfound, "character", name); - return false; + if (WorldConfig.GetBoolValue(WorldCfg.ShowBanInWorld)) + Global.WorldMgr.SendWorldText(CypherStrings.BanCharacterYoupermbannedmessageWorld, author, playerName, reason); + else + handler.SendSysMessage(CypherStrings.BanYoupermbanned, playerName, reason); } + break; + } + case BanReturn.Notfound: + { + handler.SendSysMessage(CypherStrings.BanNotfound, "character", playerName); + return false; + } default: break; } @@ -95,32 +85,23 @@ namespace Game.Chat.Commands } [Command("playeraccount", RBACPermissions.CommandBanPlayeraccount, true)] - static bool HandleBanAccountByCharCommand(CommandHandler handler, StringArguments args) + static bool HandleBanAccountByCharCommand(CommandHandler handler, string playerName, uint duration, string reason) { - return HandleBanHelper(BanMode.Character, args, handler); + return HandleBanHelper(BanMode.Character, playerName, duration, reason, handler); } [Command("ip", RBACPermissions.CommandBanIp, true)] - static bool HandleBanIPCommand(CommandHandler handler, StringArguments args) + static bool HandleBanIPCommand(CommandHandler handler, string ipAddress, uint duration, string reason) { - return HandleBanHelper(BanMode.IP, args, handler); + return HandleBanHelper(BanMode.IP, ipAddress, duration, reason, handler); } - static bool HandleBanHelper(BanMode mode, StringArguments args, CommandHandler handler) + static bool HandleBanHelper(BanMode mode, string nameOrIP, uint duration, string reason, CommandHandler handler) { - if (args.Empty()) + if (nameOrIP.IsEmpty()) return false; - string nameOrIP = args.NextString(); - if (string.IsNullOrEmpty(nameOrIP)) - return false; - - string durationStr = args.NextString(); - if (!uint.TryParse(durationStr, out uint duration)) - return false; - - string reasonStr = args.NextString(""); - if (string.IsNullOrEmpty(reasonStr)) + if (reason.IsEmpty()) return false; switch (mode) @@ -139,22 +120,22 @@ namespace Game.Chat.Commands } string author = handler.GetSession() ? handler.GetSession().GetPlayerName() : "Server"; - switch (Global.WorldMgr.BanAccount(mode, nameOrIP, durationStr, reasonStr, author)) + switch (Global.WorldMgr.BanAccount(mode, nameOrIP, duration, reason, author)) { case BanReturn.Success: if (duration > 0) { if (WorldConfig.GetBoolValue(WorldCfg.ShowBanInWorld)) - Global.WorldMgr.SendWorldText(CypherStrings.BanAccountYoubannedmessageWorld, author, nameOrIP, Time.secsToTimeString(Time.TimeStringToSecs(durationStr)), reasonStr); + Global.WorldMgr.SendWorldText(CypherStrings.BanAccountYoubannedmessageWorld, author, nameOrIP, Time.secsToTimeString(duration), reason); else - handler.SendSysMessage(CypherStrings.BanYoubanned, nameOrIP, Time.secsToTimeString(Time.TimeStringToSecs(durationStr), TimeFormat.ShortText), reasonStr); + handler.SendSysMessage(CypherStrings.BanYoubanned, nameOrIP, Time.secsToTimeString(duration, TimeFormat.ShortText), reason); } else { if (WorldConfig.GetBoolValue(WorldCfg.ShowBanInWorld)) - Global.WorldMgr.SendWorldText(CypherStrings.BanAccountYoupermbannedmessageWorld, author, nameOrIP, reasonStr); + Global.WorldMgr.SendWorldText(CypherStrings.BanAccountYoupermbannedmessageWorld, author, nameOrIP, reason); else - handler.SendSysMessage(CypherStrings.BanYoupermbanned, nameOrIP, reasonStr); + handler.SendSysMessage(CypherStrings.BanYoupermbanned, nameOrIP, reason); } break; case BanReturn.SyntaxError: @@ -186,13 +167,9 @@ namespace Game.Chat.Commands class BanInfoCommands { [Command("account", RBACPermissions.CommandBaninfoAccount, true)] - static bool HandleBanInfoAccountCommand(CommandHandler handler, StringArguments args) + static bool HandleBanInfoAccountCommand(CommandHandler handler, string accountName) { - if (args.Empty()) - return false; - - string accountName = args.NextString(""); - if (string.IsNullOrEmpty(accountName)) + if (accountName.IsEmpty()) return false; uint accountId = Global.AccountMgr.GetId(accountName); @@ -206,12 +183,8 @@ namespace Game.Chat.Commands } [Command("character", RBACPermissions.CommandBaninfoCharacter, true)] - static bool HandleBanInfoCharacterCommand(CommandHandler handler, StringArguments args) + static bool HandleBanInfoCharacterCommand(CommandHandler handler, string name) { - if (args.Empty()) - return false; - - string name = args.NextString(); if (!ObjectManager.NormalizePlayerName(ref name)) { handler.SendSysMessage(CypherStrings.BaninfoNocharacter); @@ -251,7 +224,7 @@ namespace Game.Chat.Commands active = true; bool permanent = (result.Read(1) == 0L); string banTime = permanent ? handler.GetCypherString(CypherStrings.BaninfoInfinite) : Time.secsToTimeString(result.Read(1), TimeFormat.ShortText); - handler.SendSysMessage(CypherStrings.BaninfoHistoryentry, Time.UnixTimeToDateTime(result.Read(0)).ToShortTimeString(), banTime, + handler.SendSysMessage(CypherStrings.BaninfoHistoryentry, Time.UnixTimeToDateTime(result.Read(0)).ToShortTimeString(), banTime, active ? handler.GetCypherString(CypherStrings.Yes) : handler.GetCypherString(CypherStrings.No), result.Read(4), result.Read(5)); } while (result.NextRow()); @@ -260,13 +233,9 @@ namespace Game.Chat.Commands } [Command("ip", RBACPermissions.CommandBaninfoIp, true)] - static bool HandleBanInfoIPCommand(CommandHandler handler, StringArguments args) + static bool HandleBanInfoIPCommand(CommandHandler handler, string ip) { - if (args.Empty()) - return false; - - string ip = args.NextString(""); - if (string.IsNullOrEmpty(ip)) + if (ip.IsEmpty()) return false; SQLResult result = DB.Login.Query("SELECT ip, FROM_UNIXTIME(bandate), FROM_UNIXTIME(unbandate), unbandate-UNIX_TIMESTAMP(), banreason, bannedby, unbandate-bandate FROM ip_banned WHERE ip = '{0}'", ip); @@ -277,8 +246,8 @@ namespace Game.Chat.Commands } bool permanent = result.Read(6) == 0; - handler.SendSysMessage(CypherStrings.BaninfoIpentry, result.Read(0), result.Read(1), permanent ? handler.GetCypherString( CypherStrings.BaninfoNever) : result.Read(2), - permanent ? handler.GetCypherString( CypherStrings.BaninfoInfinite) : Time.secsToTimeString(result.Read(3), TimeFormat.ShortText), result.Read(4), result.Read(5)); + handler.SendSysMessage(CypherStrings.BaninfoIpentry, result.Read(0), result.Read(1), permanent ? handler.GetCypherString(CypherStrings.BaninfoNever) : result.Read(2), + permanent ? handler.GetCypherString(CypherStrings.BaninfoInfinite) : Time.secsToTimeString(result.Read(3), TimeFormat.ShortText), result.Read(4), result.Read(5)); return true; } @@ -308,23 +277,19 @@ namespace Game.Chat.Commands return true; } - } [CommandGroup("banlist")] class BanListCommands { [Command("account", RBACPermissions.CommandBanlistAccount, true)] - static bool HandleBanListAccountCommand(CommandHandler handler, StringArguments args) + static bool HandleBanListAccountCommand(CommandHandler handler, [OptionalArg] string filter) { PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.DelExpiredIpBans); DB.Login.Execute(stmt); - string filterStr = args.NextString(); - string filter = !string.IsNullOrEmpty(filterStr) ? filterStr : ""; - SQLResult result; - if (string.IsNullOrEmpty(filter)) + if (filter.IsEmpty()) { stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_ACCOUNT_BANNED_ALL); result = DB.Login.Query(stmt); @@ -346,13 +311,9 @@ namespace Game.Chat.Commands } [Command("character", RBACPermissions.CommandBanlistCharacter, true)] - static bool HandleBanListCharacterCommand(CommandHandler handler, StringArguments args) + static bool HandleBanListCharacterCommand(CommandHandler handler, string filter) { - if (args.Empty()) - return false; - - string filter = args.NextString(); - if (string.IsNullOrEmpty(filter)) + if (filter.IsEmpty()) return false; PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_GUID_BY_NAME_FILTER); @@ -431,17 +392,14 @@ namespace Game.Chat.Commands } [Command("ip", RBACPermissions.CommandBanlistIp, true)] - static bool HandleBanListIPCommand(CommandHandler handler, StringArguments args) + static bool HandleBanListIPCommand(CommandHandler handler, [OptionalArg] string filter) { PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.DelExpiredIpBans); DB.Login.Execute(stmt); - string filterStr = args.NextString(); - string filter = !string.IsNullOrEmpty(filterStr) ? filterStr : ""; - SQLResult result; - if (string.IsNullOrEmpty(filter)) + if (filter.IsEmpty()) { stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_IP_BANNED_ALL); result = DB.Login.Query(stmt); @@ -570,7 +528,7 @@ namespace Game.Chat.Commands } else { - long timeUnban = banInfo.Read (1); + long timeUnban = banInfo.Read(1); DateTime tmUnban; tmUnban = Time.UnixTimeToDateTime(timeUnban); handler.SendSysMessage("|{0}|{1:D2}-{2:D2}-{3:D2} {4:D2}:{5:D2}|{6:D2}-{7:D2}-{8:D2} {9:D2}:{10:D2}|{11}|{12}|", @@ -595,18 +553,14 @@ namespace Game.Chat.Commands class UnBanCommands { [Command("account", RBACPermissions.CommandUnbanAccount, true)] - static bool HandleUnBanAccountCommand(CommandHandler handler, StringArguments args) + static bool HandleUnBanAccountCommand(CommandHandler handler, string name) { - return HandleUnBanHelper(BanMode.Account, args, handler); + return HandleUnBanHelper(BanMode.Account, name, handler); } [Command("character", RBACPermissions.CommandUnbanCharacter, true)] - static bool HandleUnBanCharacterCommand(CommandHandler handler, StringArguments args) + static bool HandleUnBanCharacterCommand(CommandHandler handler, string name) { - if (args.Empty()) - return false; - - string name = args.NextString(); if (!ObjectManager.NormalizePlayerName(ref name)) { handler.SendSysMessage(CypherStrings.PlayerNotFound); @@ -624,47 +578,43 @@ namespace Game.Chat.Commands } [Command("playeraccount", RBACPermissions.CommandUnbanPlayeraccount, true)] - static bool HandleUnBanAccountByCharCommand(CommandHandler handler, StringArguments args) + static bool HandleUnBanAccountByCharCommand(CommandHandler handler, string name) { - return HandleUnBanHelper(BanMode.Character, args, handler); + return HandleUnBanHelper(BanMode.Character, name, handler); } [Command("ip", RBACPermissions.CommandUnbanIp, true)] - static bool HandleUnBanIPCommand(CommandHandler handler, StringArguments args) + static bool HandleUnBanIPCommand(CommandHandler handler, string ip) { - return HandleUnBanHelper(BanMode.IP, args, handler); + return HandleUnBanHelper(BanMode.IP, ip, handler); } - static bool HandleUnBanHelper(BanMode mode, StringArguments args, CommandHandler handler) + static bool HandleUnBanHelper(BanMode mode, string nameOrIp, CommandHandler handler) { - if (args.Empty()) - return false; - - string nameOrIP = args.NextString(); - if (string.IsNullOrEmpty(nameOrIP)) + if (nameOrIp.IsEmpty()) return false; switch (mode) { case BanMode.Character: - if (!ObjectManager.NormalizePlayerName(ref nameOrIP)) + if (!ObjectManager.NormalizePlayerName(ref nameOrIp)) { handler.SendSysMessage(CypherStrings.PlayerNotFound); return false; } break; case BanMode.IP: - if (!IPAddress.TryParse(nameOrIP, out _)) + if (!IPAddress.TryParse(nameOrIp, out _)) return false; break; } - if (Global.WorldMgr.RemoveBanAccount(mode, nameOrIP)) - handler.SendSysMessage(CypherStrings.UnbanUnbanned, nameOrIP); + if (Global.WorldMgr.RemoveBanAccount(mode, nameOrIp)) + handler.SendSysMessage(CypherStrings.UnbanUnbanned, nameOrIp); else - handler.SendSysMessage(CypherStrings.UnbanError, nameOrIP); + handler.SendSysMessage(CypherStrings.UnbanError, nameOrIp); return true; } } -} +} \ No newline at end of file diff --git a/Source/Game/Chat/Commands/DisableCommands.cs b/Source/Game/Chat/Commands/DisableCommands.cs index f5f904085..f2c3fd94b 100644 --- a/Source/Game/Chat/Commands/DisableCommands.cs +++ b/Source/Game/Chat/Commands/DisableCommands.cs @@ -17,8 +17,8 @@ using Framework.Constants; using Framework.Database; -using Framework.IO; using Game.DataStorage; +using System; namespace Game.Chat.Commands { @@ -28,19 +28,14 @@ namespace Game.Chat.Commands [CommandGroup("add")] class DisableAddCommands { - static bool HandleAddDisables(StringArguments args, CommandHandler handler, DisableType disableType) + static bool HandleAddDisables(uint entry, uint flags, string disableComment, CommandHandler handler, DisableType disableType) { - uint entry = args.NextUInt32(); if (entry == 0) return false; - uint flags = args.NextUInt32(); - - string disableComment = args.NextString(""); - if (string.IsNullOrEmpty(disableComment)) + if (disableComment.IsEmpty()) return false; - string disableTypeStr = ""; switch (disableType) { case DisableType.Spell: @@ -50,7 +45,6 @@ namespace Game.Chat.Commands handler.SendSysMessage(CypherStrings.CommandNospellfound); return false; } - disableTypeStr = "spell"; break; } case DisableType.Quest: @@ -60,7 +54,6 @@ namespace Game.Chat.Commands handler.SendSysMessage(CypherStrings.CommandNoquestfound, entry); return false; } - disableTypeStr = "quest"; break; } case DisableType.Map: @@ -70,7 +63,6 @@ namespace Game.Chat.Commands handler.SendSysMessage(CypherStrings.CommandNomapfound); return false; } - disableTypeStr = "map"; break; } case DisableType.Battleground: @@ -80,7 +72,6 @@ namespace Game.Chat.Commands handler.SendSysMessage(CypherStrings.CommandNoBattlegroundFound); return false; } - disableTypeStr = "Battleground"; break; } case DisableType.Criteria: @@ -90,7 +81,6 @@ namespace Game.Chat.Commands handler.SendSysMessage(CypherStrings.CommandNoAchievementCriteriaFound); return false; } - disableTypeStr = "criteria"; break; } case DisableType.OutdoorPVP: @@ -100,7 +90,6 @@ namespace Game.Chat.Commands handler.SendSysMessage(CypherStrings.CommandNoOutdoorPvpForund); return false; } - disableTypeStr = "outdoorpvp"; break; } case DisableType.VMAP: @@ -110,7 +99,6 @@ namespace Game.Chat.Commands handler.SendSysMessage(CypherStrings.CommandNomapfound); return false; } - disableTypeStr = "vmap"; break; } case DisableType.MMAP: @@ -120,7 +108,6 @@ namespace Game.Chat.Commands handler.SendSysMessage(CypherStrings.CommandNomapfound); return false; } - disableTypeStr = "mmap"; break; } default: @@ -133,7 +120,7 @@ namespace Game.Chat.Commands SQLResult result = DB.World.Query(stmt); if (!result.IsEmpty()) { - handler.SendSysMessage("This {0} (Id: {1}) is already disabled.", disableTypeStr, entry); + handler.SendSysMessage($"This {disableType} (Id: {entry}) is already disabled."); return false; } @@ -144,128 +131,74 @@ namespace Game.Chat.Commands stmt.AddValue(3, disableComment); DB.World.Execute(stmt); - handler.SendSysMessage("Add Disabled {0} (Id: {1}) for reason {2}", disableTypeStr, entry, disableComment); + handler.SendSysMessage($"Add Disabled {disableType} (Id: {entry}) for reason {disableComment}"); return true; } [Command("spell", RBACPermissions.CommandDisableAddSpell, true)] - static bool HandleAddDisableSpellCommand(CommandHandler handler, StringArguments args) + static bool HandleAddDisableSpellCommand(CommandHandler handler, uint entry, uint flags, string disableComment) { - if (args.Empty()) - return false; - - return HandleAddDisables(args, handler, DisableType.Spell); + return HandleAddDisables(entry, flags, disableComment, handler, DisableType.Spell); } [Command("quest", RBACPermissions.CommandDisableAddQuest, true)] - static bool HandleAddDisableQuestCommand(CommandHandler handler, StringArguments args) + static bool HandleAddDisableQuestCommand(CommandHandler handler, uint entry, uint flags, string disableComment) { - if (args.Empty()) - return false; - - return HandleAddDisables(args, handler, DisableType.Quest); + return HandleAddDisables(entry, flags, disableComment, handler, DisableType.Quest); } [Command("map", RBACPermissions.CommandDisableAddMap, true)] - static bool HandleAddDisableMapCommand(CommandHandler handler, StringArguments args) + static bool HandleAddDisableMapCommand(CommandHandler handler, uint entry, uint flags, string disableComment) { - if (args.Empty()) - return false; - - return HandleAddDisables(args, handler, DisableType.Map); + return HandleAddDisables(entry, flags, disableComment, handler, DisableType.Map); } [Command("Battleground", RBACPermissions.CommandDisableAddBattleground, true)] - static bool HandleAddDisableBattlegroundCommand(CommandHandler handler, StringArguments args) + static bool HandleAddDisableBattlegroundCommand(CommandHandler handler, uint entry, uint flags, string disableComment) { - if (args.Empty()) - return false; - - return HandleAddDisables(args, handler, DisableType.Battleground); + return HandleAddDisables(entry, flags, disableComment, handler, DisableType.Battleground); } [Command("criteria", RBACPermissions.CommandDisableAddCriteria, true)] - static bool HandleAddDisableCriteriaCommand(CommandHandler handler, StringArguments args) + static bool HandleAddDisableCriteriaCommand(CommandHandler handler, uint entry, uint flags, string disableComment) { - if (args.Empty()) - return false; - - return HandleAddDisables(args, handler, DisableType.Criteria); + return HandleAddDisables(entry, flags, disableComment, handler, DisableType.Criteria); } [Command("outdoorpvp", RBACPermissions.CommandDisableAddOutdoorpvp, true)] - static bool HandleAddDisableOutdoorPvPCommand(CommandHandler handler, StringArguments args) + static bool HandleAddDisableOutdoorPvPCommand(CommandHandler handler, uint entry, uint flags, string disableComment) { - if (args.Empty()) - return false; - - HandleAddDisables(args, handler, DisableType.OutdoorPVP); - return true; + return HandleAddDisables(entry, flags, disableComment, handler, DisableType.OutdoorPVP); } [Command("vmap", RBACPermissions.CommandDisableAddVmap, true)] - static bool HandleAddDisableVmapCommand(CommandHandler handler, StringArguments args) + static bool HandleAddDisableVmapCommand(CommandHandler handler, uint entry, uint flags, string disableComment) { - if (args.Empty()) - return false; - - return HandleAddDisables(args, handler, DisableType.VMAP); + return HandleAddDisables(entry, flags, disableComment, handler, DisableType.VMAP); } [Command("mmap", RBACPermissions.CommandDisableAddMmap, true)] - static bool HandleAddDisableMMapCommand(CommandHandler handler, StringArguments args) + static bool HandleAddDisableMMapCommand(CommandHandler handler, uint entry, uint flags, string disableComment) { - if (args.Empty()) - return false; - - return HandleAddDisables(args, handler, DisableType.MMAP); + return HandleAddDisables(entry, flags, disableComment, handler, DisableType.MMAP); } } [CommandGroup("remove")] class DisableRemoveCommands { - static bool HandleRemoveDisables(StringArguments args, CommandHandler handler, DisableType disableType) + static bool HandleRemoveDisables(uint entry, CommandHandler handler, DisableType disableType) { - if (!uint.TryParse(args.NextString(), out uint entry) || entry == 0) + if (entry == 0) return false; - string disableTypeStr = ""; - switch (disableType) - { - case DisableType.Spell: - disableTypeStr = "spell"; - break; - case DisableType.Quest: - disableTypeStr = "quest"; - break; - case DisableType.Map: - disableTypeStr = "map"; - break; - case DisableType.Battleground: - disableTypeStr = "Battleground"; - break; - case DisableType.Criteria: - disableTypeStr = "criteria"; - break; - case DisableType.OutdoorPVP: - disableTypeStr = "outdoorpvp"; - break; - case DisableType.VMAP: - disableTypeStr = "vmap"; - break; - case DisableType.MMAP: - disableTypeStr = "mmap"; - break; - } - PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.SEL_DISABLES); stmt.AddValue(0, entry); stmt.AddValue(1, (byte)disableType); SQLResult result = DB.World.Query(stmt); if (result.IsEmpty()) { - handler.SendSysMessage("This {0} (Id: {1}) is not disabled.", disableTypeStr, entry); + handler.SendSysMessage($"This {disableType} (Id: {entry}) is not disabled."); return false; } @@ -274,80 +207,56 @@ namespace Game.Chat.Commands stmt.AddValue(1, (byte)disableType); DB.World.Execute(stmt); - handler.SendSysMessage("Remove Disabled {0} (Id: {1})", disableTypeStr, entry); + handler.SendSysMessage($"Remove Disabled {disableType} (Id: {entry})"); return true; } [Command("spell", RBACPermissions.CommandDisableRemoveSpell, true)] - static bool HandleRemoveDisableSpellCommand(CommandHandler handler, StringArguments args) + static bool HandleRemoveDisableSpellCommand(CommandHandler handler, uint entry) { - if (args.Empty()) - return false; - - return HandleRemoveDisables(args, handler, DisableType.Spell); + return HandleRemoveDisables(entry, handler, DisableType.Spell); } [Command("quest", RBACPermissions.CommandDisableRemoveQuest, true)] - static bool HandleRemoveDisableQuestCommand(CommandHandler handler, StringArguments args) + static bool HandleRemoveDisableQuestCommand(CommandHandler handler, uint entry) { - if (args.Empty()) - return false; - - return HandleRemoveDisables(args, handler, DisableType.Quest); + return HandleRemoveDisables(entry, handler, DisableType.Quest); } [Command("map", RBACPermissions.CommandDisableRemoveMap, true)] - static bool HandleRemoveDisableMapCommand(CommandHandler handler, StringArguments args) + static bool HandleRemoveDisableMapCommand(CommandHandler handler, uint entry) { - if (args.Empty()) - return false; - - return HandleRemoveDisables(args, handler, DisableType.Map); + return HandleRemoveDisables(entry, handler, DisableType.Map); } [Command("Battleground", RBACPermissions.CommandDisableRemoveBattleground, true)] - static bool HandleRemoveDisableBattlegroundCommand(CommandHandler handler, StringArguments args) + static bool HandleRemoveDisableBattlegroundCommand(CommandHandler handler, uint entry) { - if (args.Empty()) - return false; - - return HandleRemoveDisables(args, handler, DisableType.Battleground); + return HandleRemoveDisables(entry, handler, DisableType.Battleground); } [Command("criteria", RBACPermissions.CommandDisableRemoveCriteria, true)] - static bool HandleRemoveDisableCriteriaCommand(CommandHandler handler, StringArguments args) + static bool HandleRemoveDisableCriteriaCommand(CommandHandler handler, uint entry) { - if (args.Empty()) - return false; - - return HandleRemoveDisables(args, handler, DisableType.Criteria); + return HandleRemoveDisables(entry, handler, DisableType.Criteria); } [Command("outdoorpvp", RBACPermissions.CommandDisableRemoveOutdoorpvp, true)] - static bool HandleRemoveDisableOutdoorPvPCommand(CommandHandler handler, StringArguments args) + static bool HandleRemoveDisableOutdoorPvPCommand(CommandHandler handler, uint entry) { - if (args.Empty()) - return false; - - return HandleRemoveDisables(args, handler, DisableType.OutdoorPVP); + return HandleRemoveDisables(entry, handler, DisableType.OutdoorPVP); } [Command("vmap", RBACPermissions.CommandDisableRemoveVmap, true)] - static bool HandleRemoveDisableVmapCommand(CommandHandler handler, StringArguments args) + static bool HandleRemoveDisableVmapCommand(CommandHandler handler, uint entry) { - if (args.Empty()) - return false; - - return HandleRemoveDisables(args, handler, DisableType.VMAP); + return HandleRemoveDisables(entry, handler, DisableType.VMAP); } [Command("mmap", RBACPermissions.CommandDisableRemoveMmap, true)] - static bool HandleRemoveDisableMMapCommand(CommandHandler handler, StringArguments args) + static bool HandleRemoveDisableMMapCommand(CommandHandler handler, uint entry) { - if (args.Empty()) - return false; - - return HandleRemoveDisables(args, handler, DisableType.MMAP); + return HandleRemoveDisables(entry, handler, DisableType.MMAP); } } } diff --git a/Source/Game/Chat/Commands/GroupCommands.cs b/Source/Game/Chat/Commands/GroupCommands.cs index 3d6bea7b1..63edb3300 100644 --- a/Source/Game/Chat/Commands/GroupCommands.cs +++ b/Source/Game/Chat/Commands/GroupCommands.cs @@ -32,13 +32,9 @@ namespace Game.Chat class GroupCommands { [Command("disband", RBACPermissions.CommandGroupDisband)] - static bool HandleGroupDisbandCommand(CommandHandler handler, StringArguments args) + static bool HandleGroupDisbandCommand(CommandHandler handler, string name) { - Player player; - Group group; - string nameStr = args.NextString(); - - if (!handler.GetPlayerGroupAndGUIDByName(nameStr, out player, out group, out _)) + if (!handler.GetPlayerGroupAndGUIDByName(name, out Player player, out Group group, out _)) return false; if (!group) @@ -52,19 +48,9 @@ namespace Game.Chat } [Command("join", RBACPermissions.CommandGroupJoin)] - static bool HandleGroupJoinCommand(CommandHandler handler, StringArguments args) + static bool HandleGroupJoinCommand(CommandHandler handler, string playerNameGroup, string playerName) { - if (args.Empty()) - return false; - - Player playerSource; - Player playerTarget; - Group groupSource; - Group groupTarget; - string nameplgrStr = args.NextString(); - string nameplStr = args.NextString(); - - if (!handler.GetPlayerGroupAndGUIDByName(nameplgrStr, out playerSource, out groupSource, out _, true)) + if (!handler.GetPlayerGroupAndGUIDByName(playerNameGroup, out Player playerSource, out Group groupSource, out _, true)) return false; if (!groupSource) @@ -73,7 +59,7 @@ namespace Game.Chat return false; } - if (!handler.GetPlayerGroupAndGUIDByName(nameplStr, out playerTarget, out groupTarget, out _, true)) + if (!handler.GetPlayerGroupAndGUIDByName(playerName, out Player playerTarget, out Group groupTarget, out _, true)) return false; if (groupTarget || playerTarget.GetGroup() == groupSource) @@ -95,13 +81,9 @@ namespace Game.Chat } [Command("leader", RBACPermissions.CommandGroupLeader)] - static bool HandleGroupLeaderCommand(CommandHandler handler, StringArguments args) + static bool HandleGroupLeaderCommand(CommandHandler handler, string name) { - Player player; - Group group; - ObjectGuid guid; - - if (!handler.GetPlayerGroupAndGUIDByName(args.NextString(), out player, out group, out guid)) + if (!handler.GetPlayerGroupAndGUIDByName(name, out Player player, out Group group, out ObjectGuid guid)) return false; if (!group) @@ -277,14 +259,9 @@ namespace Game.Chat } [Command("remove", RBACPermissions.CommandGroupRemove)] - static bool HandleGroupRemoveCommand(CommandHandler handler, StringArguments args) + static bool HandleGroupRemoveCommand(CommandHandler handler, string name) { - Player player; - Group group; - ObjectGuid guid; - string nameStr = args.NextString(); - - if (!handler.GetPlayerGroupAndGUIDByName(nameStr, out player, out group, out guid)) + if (!handler.GetPlayerGroupAndGUIDByName(name, out Player player, out Group group, out ObjectGuid guid)) return false; if (!group) @@ -298,13 +275,14 @@ namespace Game.Chat } [Command("repair", RBACPermissions.CommandRepairitems, true)] - static bool HandleGroupRepairCommand(CommandHandler handler, StringArguments args) + static bool HandleGroupRepairCommand(CommandHandler handler, PlayerIdentifier playerTarget) { - Player playerTarget; - if (!handler.ExtractPlayerTarget(args, out playerTarget)) + if (playerTarget == null) + playerTarget = PlayerIdentifier.FromTargetOrSelf(handler); + if (playerTarget == null || !playerTarget.IsConnected()) return false; - Group groupTarget = playerTarget.GetGroup(); + Group groupTarget = playerTarget.GetConnectedPlayer().GetGroup(); if (groupTarget == null) return false; @@ -319,13 +297,14 @@ namespace Game.Chat } [Command("revive", RBACPermissions.CommandRevive, true)] - static bool HandleGroupReviveCommand(CommandHandler handler, StringArguments args) + static bool HandleGroupReviveCommand(CommandHandler handler, PlayerIdentifier playerTarget) { - Player playerTarget; - if (!handler.ExtractPlayerTarget(args, out playerTarget)) + if (playerTarget == null) + playerTarget = PlayerIdentifier.FromTargetOrSelf(handler); + if (playerTarget == null || !playerTarget.IsConnected()) return false; - Group groupTarget = playerTarget.GetGroup(); + Group groupTarget = playerTarget.GetConnectedPlayer().GetGroup(); if (groupTarget == null) return false; @@ -344,12 +323,15 @@ namespace Game.Chat } [Command("summon", RBACPermissions.CommandGroupSummon)] - static bool HandleGroupSummonCommand(CommandHandler handler, StringArguments args) + static bool HandleGroupSummonCommand(CommandHandler handler, PlayerIdentifier playerTarget) { - Player target; - if (!handler.ExtractPlayerTarget(args, out target)) + if (playerTarget == null) + playerTarget = PlayerIdentifier.FromTargetOrSelf(handler); + if (playerTarget == null || !playerTarget.IsConnected()) return false; + Player target = playerTarget.GetConnectedPlayer(); + // check online security if (handler.HasLowerSecurity(target, ObjectGuid.Empty)) return false; @@ -437,36 +419,32 @@ namespace Game.Chat class GroupSetCommands { [Command("assistant", RBACPermissions.CommandGroupAssistant)] - static bool HandleGroupSetAssistantCommand(CommandHandler handler, StringArguments args) + static bool HandleGroupSetAssistantCommand(CommandHandler handler, string name) { - return GroupFlagCommand(args, handler, GroupMemberFlags.Assistant, "Assistant"); + return GroupFlagCommand(name, handler, GroupMemberFlags.Assistant); } [Command("leader", RBACPermissions.CommandGroupLeader)] - static bool HandleGroupSetLeaderCommand(CommandHandler handler, StringArguments args) + static bool HandleGroupSetLeaderCommand(CommandHandler handler, string name) { - return HandleGroupLeaderCommand(handler, args); + return HandleGroupLeaderCommand(handler, name); } [Command("mainassist", RBACPermissions.CommandGroupMainassist)] - static bool HandleGroupSetMainAssistCommand(CommandHandler handler, StringArguments args) + static bool HandleGroupSetMainAssistCommand(CommandHandler handler, string name) { - return GroupFlagCommand(args, handler, GroupMemberFlags.MainAssist, "Main Assist"); + return GroupFlagCommand(name, handler, GroupMemberFlags.MainAssist); } [Command("maintank", RBACPermissions.CommandGroupMaintank)] - static bool HandleGroupSetMainTankCommand(CommandHandler handler, StringArguments args) + static bool HandleGroupSetMainTankCommand(CommandHandler handler, string name) { - return GroupFlagCommand(args, handler, GroupMemberFlags.MainTank, "Main Tank"); + return GroupFlagCommand(name, handler, GroupMemberFlags.MainTank); } - static bool GroupFlagCommand(StringArguments args, CommandHandler handler, GroupMemberFlags flag, string what) + static bool GroupFlagCommand(string name, CommandHandler handler, GroupMemberFlags flag) { - Player player; - Group group; - ObjectGuid guid; - - if (!handler.GetPlayerGroupAndGUIDByName(args.NextString(), out player, out group, out guid)) + if (!handler.GetPlayerGroupAndGUIDByName(name, out Player player, out Group group, out ObjectGuid guid)) return false; if (!group) @@ -490,12 +468,12 @@ namespace Game.Chat if (group.GetMemberFlags(guid).HasAnyFlag(flag)) { group.SetGroupMemberFlag(guid, false, flag); - handler.SendSysMessage(CypherStrings.GroupRoleChanged, player.GetName(), "no longer", what); + handler.SendSysMessage(CypherStrings.GroupRoleChanged, player.GetName(), "no longer", flag); } else { group.SetGroupMemberFlag(guid, true, flag); - handler.SendSysMessage(CypherStrings.GroupRoleChanged, player.GetName(), "now", what); + handler.SendSysMessage(CypherStrings.GroupRoleChanged, player.GetName(), "now", flag); } return true; } diff --git a/Source/Game/Chat/Commands/GuildCommands.cs b/Source/Game/Chat/Commands/GuildCommands.cs index c005042ce..0942989ee 100644 --- a/Source/Game/Chat/Commands/GuildCommands.cs +++ b/Source/Game/Chat/Commands/GuildCommands.cs @@ -70,10 +70,9 @@ namespace Game.Chat } [Command("delete", RBACPermissions.CommandGuildDelete, true)] - static bool HandleGuildDeleteCommand(CommandHandler handler, StringArguments args) + static bool HandleGuildDeleteCommand(CommandHandler handler, QuotedString guildName) { - string guildName = handler.ExtractQuotedArg(args.NextString()); - if (string.IsNullOrEmpty(guildName)) + if (guildName.IsEmpty()) return false; Guild guild = Global.GuildMgr.GetGuildByName(guildName); @@ -85,37 +84,34 @@ namespace Game.Chat } [Command("invite", RBACPermissions.CommandGuildInvite, true)] - static bool HandleGuildInviteCommand(CommandHandler handler, StringArguments args) + static bool HandleGuildInviteCommand(CommandHandler handler, PlayerIdentifier targetIdentifier, QuotedString guildName) { - if (args.Empty()) + if (targetIdentifier == null) + targetIdentifier = PlayerIdentifier.FromTargetOrSelf(handler); + if (targetIdentifier == null) return false; - Player target; - if (!handler.ExtractPlayerTarget(args[0] != '"' ? args : null, out target)) - return false; - - string guildName = handler.ExtractQuotedArg(args.NextString()); - if (string.IsNullOrEmpty(guildName)) + if (guildName.IsEmpty()) return false; Guild targetGuild = Global.GuildMgr.GetGuildByName(guildName); if (targetGuild == null) return false; - targetGuild.AddMember(null, target.GetGUID()); + targetGuild.AddMember(null, targetIdentifier.GetGUID()); return true; } [Command("uninvite", RBACPermissions.CommandGuildUninvite, true)] - static bool HandleGuildUninviteCommand(CommandHandler handler, StringArguments args) + static bool HandleGuildUninviteCommand(CommandHandler handler, PlayerIdentifier targetIdentifier, QuotedString guildName) { - Player target; - ObjectGuid targetGuid; - if (!handler.ExtractPlayerTarget(args, out target, out targetGuid)) + if (targetIdentifier == null) + targetIdentifier = PlayerIdentifier.FromTargetOrSelf(handler); + if (targetIdentifier == null) return false; - ulong guildId = target != null ? target.GetGuildId() : Global.CharacterCacheStorage.GetCharacterGuildIdByGuid(targetGuid); + ulong guildId = targetIdentifier.IsConnected() ? targetIdentifier.GetConnectedPlayer().GetGuildId() : Global.CharacterCacheStorage.GetCharacterGuildIdByGuid(targetIdentifier.GetGUID()); if (guildId == 0) return false; @@ -123,7 +119,7 @@ namespace Game.Chat if (targetGuild == null) return false; - targetGuild.DeleteMember(null, targetGuid, false, true, true); + targetGuild.DeleteMember(null, targetIdentifier.GetGUID(), false, true, true); return true; } @@ -147,45 +143,40 @@ namespace Game.Chat } [Command("rename", RBACPermissions.CommandGuildRename, true)] - static bool HandleGuildRenameCommand(CommandHandler handler, StringArguments args) + static bool HandleGuildRenameCommand(CommandHandler handler, QuotedString oldGuildName, QuotedString newGuildName) { - if (args.Empty()) - return false; - - string oldGuildStr = handler.ExtractQuotedArg(args.NextString()); - if (string.IsNullOrEmpty(oldGuildStr)) + if (oldGuildName.IsEmpty()) { handler.SendSysMessage(CypherStrings.BadValue); return false; } - string newGuildStr = handler.ExtractQuotedArg(args.NextString()); - if (string.IsNullOrEmpty(newGuildStr)) + if (newGuildName.IsEmpty()) { handler.SendSysMessage(CypherStrings.InsertGuildName); return false; } - Guild guild = Global.GuildMgr.GetGuildByName(oldGuildStr); + Guild guild = Global.GuildMgr.GetGuildByName(oldGuildName); if (!guild) { - handler.SendSysMessage(CypherStrings.CommandCouldnotfind, oldGuildStr); + handler.SendSysMessage(CypherStrings.CommandCouldnotfind, oldGuildName); return false; } - if (Global.GuildMgr.GetGuildByName(newGuildStr)) + if (Global.GuildMgr.GetGuildByName(newGuildName)) { - handler.SendSysMessage(CypherStrings.GuildRenameAlreadyExists, newGuildStr); + handler.SendSysMessage(CypherStrings.GuildRenameAlreadyExists, newGuildName); return false; } - if (!guild.SetName(newGuildStr)) + if (!guild.SetName(newGuildName)) { handler.SendSysMessage(CypherStrings.BadValue); return false; } - handler.SendSysMessage(CypherStrings.GuildRenameDone, oldGuildStr, newGuildStr); + handler.SendSysMessage(CypherStrings.GuildRenameDone, oldGuildName, newGuildName); return true; } diff --git a/Source/Game/Chat/Commands/SendCommands.cs b/Source/Game/Chat/Commands/SendCommands.cs index 2a59a00e8..fc97b2130 100644 --- a/Source/Game/Chat/Commands/SendCommands.cs +++ b/Source/Game/Chat/Commands/SendCommands.cs @@ -15,11 +15,12 @@ * along with this program. If not, see . */ +using Framework.Collections; using Framework.Constants; using Framework.Database; -using Framework.IO; using Game.Entities; using Game.Mails; +using System; using System.Collections.Generic; namespace Game.Chat.Commands @@ -28,29 +29,15 @@ namespace Game.Chat.Commands class SendCommands { [Command("mail", RBACPermissions.CommandSendMail, true)] - static bool HandleSendMailCommand(CommandHandler handler, StringArguments args) + static bool HandleSendMailCommand(CommandHandler handler, PlayerIdentifier playerIdentifier, QuotedString subject, QuotedString text) { // format: name "subject text" "mail text" - Player target; - ObjectGuid targetGuid; - string targetName; - if (!handler.ExtractPlayerTarget(args, out target, out targetGuid, out targetName)) + if (playerIdentifier == null) + playerIdentifier = PlayerIdentifier.FromTarget(handler); + if (playerIdentifier == null) return false; - string tail1 = args.NextString(""); - if (string.IsNullOrEmpty(tail1)) - return false; - - string subject = handler.ExtractQuotedArg(tail1); - if (string.IsNullOrEmpty(subject)) - return false; - - string tail2 = args.NextString(""); - if (string.IsNullOrEmpty(tail2)) - return false; - - string text = handler.ExtractQuotedArg(tail2); - if (string.IsNullOrEmpty(text)) + if (subject.IsEmpty() || text.IsEmpty()) return false; // from console show not existed sender @@ -59,78 +46,58 @@ namespace Game.Chat.Commands // @todo Fix poor design SQLTransaction trans = new(); new MailDraft(subject, text) - .SendMailTo(trans, new MailReceiver(target, targetGuid.GetCounter()), sender); + .SendMailTo(trans, new MailReceiver(playerIdentifier.GetGUID().GetCounter()), sender); DB.Characters.CommitTransaction(trans); - string nameLink = handler.PlayerLink(targetName); + string nameLink = handler.PlayerLink(playerIdentifier.GetName()); handler.SendSysMessage(CypherStrings.MailSent, nameLink); return true; } [Command("items", RBACPermissions.CommandSendItems, true)] - static bool HandleSendItemsCommand(CommandHandler handler, StringArguments args) + static bool HandleSendItemsCommand(CommandHandler handler, PlayerIdentifier playerIdentifier, QuotedString subject, QuotedString text, string itemsStr) { // format: name "subject text" "mail text" item1[:count1] item2[:count2] ... item12[:count12] - Player receiver; - ObjectGuid receiverGuid; - string receiverName; - if (!handler.ExtractPlayerTarget(args, out receiver, out receiverGuid, out receiverName)) + if (playerIdentifier == null) + playerIdentifier = PlayerIdentifier.FromTarget(handler); + if (playerIdentifier == null) return false; - string tail1 = args.NextString(""); - if (string.IsNullOrEmpty(tail1)) - return false; - - string subject = handler.ExtractQuotedArg(tail1); - if (string.IsNullOrEmpty(subject)) - return false; - - string tail2 = args.NextString(""); - if (string.IsNullOrEmpty(tail2)) - return false; - - string text = handler.ExtractQuotedArg(tail2); - if (string.IsNullOrEmpty(text)) + if (subject.IsEmpty() || text.IsEmpty()) return false; // extract items List> items = new(); - // get all tail string - StringArguments tail = new(args.NextString("")); - - // get from tail next item str - StringArguments itemStr; - while (!(itemStr = new StringArguments(tail.NextString(" "))).Empty()) + var tokens = new StringArray(itemsStr, ' '); + for (var i = 0; i < tokens.Length; ++i) { // parse item str - string itemIdStr = itemStr.NextString(":"); - string itemCountStr = itemStr.NextString(" "); - - if (!uint.TryParse(itemIdStr, out uint itemId) || itemId == 0) + string[] itemIdAndCountStr = tokens[i].Split(':'); + if (!uint.TryParse(itemIdAndCountStr[0], out uint itemId) || itemId == 0) return false; - ItemTemplate item_proto = Global.ObjectMgr.GetItemTemplate(itemId); - if (item_proto == null) + ItemTemplate itemProto = Global.ObjectMgr.GetItemTemplate(itemId); + if (itemProto == null) { handler.SendSysMessage(CypherStrings.CommandItemidinvalid, itemId); return false; } - if (string.IsNullOrEmpty(itemCountStr) || !uint.TryParse(itemCountStr, out uint itemCount)) + if (itemIdAndCountStr[1].IsEmpty() || !uint.TryParse(itemIdAndCountStr[1], out uint itemCount)) itemCount = 1; - if (itemCount < 1 || (item_proto.GetMaxCount() > 0 && itemCount > item_proto.GetMaxCount())) + if (itemCount < 1 || (itemProto.GetMaxCount() > 0 && itemCount > itemProto.GetMaxCount())) { handler.SendSysMessage(CypherStrings.CommandInvalidItemCount, itemCount, itemId); return false; } - while (itemCount > item_proto.GetMaxStackSize()) + while (itemCount > itemProto.GetMaxStackSize()) { - items.Add(new KeyValuePair(itemId, item_proto.GetMaxStackSize())); - itemCount -= item_proto.GetMaxStackSize(); + items.Add(new KeyValuePair(itemId, itemProto.GetMaxStackSize())); + itemCount -= itemProto.GetMaxStackSize(); } items.Add(new KeyValuePair(itemId, itemCount)); @@ -160,44 +127,26 @@ namespace Game.Chat.Commands } } - draft.SendMailTo(trans, new MailReceiver(receiver, receiverGuid.GetCounter()), sender); + draft.SendMailTo(trans, new MailReceiver(playerIdentifier.GetGUID().GetCounter()), sender); DB.Characters.CommitTransaction(trans); - string nameLink = handler.PlayerLink(receiverName); + string nameLink = handler.PlayerLink(playerIdentifier.GetName()); handler.SendSysMessage(CypherStrings.MailSent, nameLink); return true; } [Command("money", RBACPermissions.CommandSendMoney, true)] - static bool HandleSendMoneyCommand(CommandHandler handler, StringArguments args) + static bool HandleSendMoneyCommand(CommandHandler handler, PlayerIdentifier playerIdentifier, QuotedString subject, QuotedString text, long money) { // format: name "subject text" "mail text" money - - Player receiver; - ObjectGuid receiverGuid; - string receiverName; - if (!handler.ExtractPlayerTarget(args, out receiver, out receiverGuid, out receiverName)) + if (playerIdentifier == null) + playerIdentifier = PlayerIdentifier.FromTarget(handler); + if (playerIdentifier == null) return false; - string tail1 = args.NextString(""); - if (string.IsNullOrEmpty(tail1)) + if (subject.IsEmpty() || text.IsEmpty()) return false; - string subject = handler.ExtractQuotedArg(tail1); - if (string.IsNullOrEmpty(subject)) - return false; - - string tail2 = args.NextString(""); - if (string.IsNullOrEmpty(tail2)) - return false; - - string text = handler.ExtractQuotedArg(tail2); - if (string.IsNullOrEmpty(text)) - return false; - - if (!long.TryParse(args.NextString(""), out long money)) - money = 0; - if (money <= 0) return false; @@ -208,40 +157,40 @@ namespace Game.Chat.Commands new MailDraft(subject, text) .AddMoney((uint)money) - .SendMailTo(trans, new MailReceiver(receiver, receiverGuid.GetCounter()), sender); + .SendMailTo(trans, new MailReceiver(playerIdentifier.GetGUID().GetCounter()), sender); DB.Characters.CommitTransaction(trans); - string nameLink = handler.PlayerLink(receiverName); + string nameLink = handler.PlayerLink(playerIdentifier.GetName()); handler.SendSysMessage(CypherStrings.MailSent, nameLink); return true; } [Command("message", RBACPermissions.CommandSendMessage, true)] - static bool HandleSendMessageCommand(CommandHandler handler, StringArguments args) + static bool HandleSendMessageCommand(CommandHandler handler, PlayerIdentifier playerIdentifier, QuotedString msgStr) { // - Find the player - Player player; - if (!handler.ExtractPlayerTarget(args, out player)) + if (playerIdentifier == null) + playerIdentifier = PlayerIdentifier.FromTarget(handler); + if (playerIdentifier == null || !playerIdentifier.IsConnected()) return false; - string msgStr = args.NextString(""); - if (string.IsNullOrEmpty(msgStr)) + if (!msgStr.IsEmpty()) return false; // Check that he is not logging out. - if (player.GetSession().IsLogingOut()) + if (playerIdentifier.GetConnectedPlayer().GetSession().IsLogingOut()) { handler.SendSysMessage(CypherStrings.PlayerNotFound); return false; } // - Send the message - player.GetSession().SendNotification("{0}", msgStr); - player.GetSession().SendNotification("|cffff0000[Message from administrator]:|r"); + playerIdentifier.GetConnectedPlayer().GetSession().SendNotification("{0}", msgStr); + playerIdentifier.GetConnectedPlayer().GetSession().SendNotification("|cffff0000[Message from administrator]:|r"); // Confirmation message - string nameLink = handler.GetNameLink(player); + string nameLink = handler.GetNameLink(playerIdentifier.GetConnectedPlayer()); handler.SendSysMessage(CypherStrings.Sendmessage, nameLink, msgStr); return true; diff --git a/Source/Game/World/WorldManager.cs b/Source/Game/World/WorldManager.cs index 27d31a204..befc5eb5a 100644 --- a/Source/Game/World/WorldManager.cs +++ b/Source/Game/World/WorldManager.cs @@ -1745,12 +1745,16 @@ namespace Game /// Ban an account or ban an IP address, duration will be parsed using TimeStringToSecs if it is positive, otherwise permban public BanReturn BanCharacter(string name, string duration, string reason, string author) + { + uint durationSecs = Time.TimeStringToSecs(duration); + return BanAccount(BanMode.Character, name, durationSecs, reason, author); + } + + public BanReturn BanCharacter(string name, uint durationSecs, string reason, string author) { Player pBanned = Global.ObjAccessor.FindConnectedPlayerByName(name); ObjectGuid guid; - uint duration_secs = Time.TimeStringToSecs(duration); - // Pick a player to ban if not online if (!pBanned) { @@ -1771,7 +1775,7 @@ namespace Game stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_CHARACTER_BAN); stmt.AddValue(0, guid.GetCounter()); - stmt.AddValue(1, (long)duration_secs); + stmt.AddValue(1, (long)durationSecs); stmt.AddValue(2, author); stmt.AddValue(3, reason); trans.Append(stmt);