From e8dff01c41244f42e527357f5738202f1bf75be1 Mon Sep 17 00:00:00 2001 From: RaidMax Date: Sat, 5 May 2018 15:36:26 -0500 Subject: [PATCH] re-added the kill server command (can only be used if run as admin) less warns when using a disposed socket topstats added to tokens as {{TOPSTATS}} fixed topstats reporting for only a single server added fix to iw4 regex for negative score tokens now support multiple lines (using Environment.NewLine to separate) localization includes culture again --- Application/API/EventAPI.cs | 2 +- Application/Application.csproj | 6 +- Application/Localization/Configure.cs | 62 ++- Application/Localization/IW4MAdmin.en-EN.json | 200 --------- Application/Localization/IW4MAdmin.en-US.json | 203 +++++++++ Application/Localization/IW4MAdmin.es-EC.json | 203 +++++++++ Application/Localization/IW4MAdmin.es-ES.json | 197 --------- Application/Localization/IW4MAdmin.pt-BR.json | 203 +++++++++ Application/Localization/IW4MAdmin.pt-PT.json | 197 --------- Application/Localization/IW4MAdmin.ru-RU.json | 392 +++++++++--------- Application/Logger.cs | 12 +- Application/Main.cs | 9 +- Application/Manager.cs | 18 +- Application/RconParsers/IW4RConParser.cs | 8 +- Application/Server.cs | 17 +- Plugins/Login/Commands/CLogin.cs | 6 +- Plugins/Stats/Cheat/Detection.cs | 38 +- Plugins/Stats/Cheat/Strain.cs | 13 +- Plugins/Stats/Cheat/Thresholds.cs | 4 - Plugins/Stats/Commands/ResetStats.cs | 6 +- Plugins/Stats/Commands/TopStats.cs | 81 ++-- Plugins/Stats/Commands/ViewStats.cs | 4 +- Plugins/Stats/Helpers/StatManager.cs | 4 + Plugins/Stats/Plugin.cs | 13 +- SharedLibraryCore/Command.cs | 2 +- SharedLibraryCore/Commands/NativeCommands.cs | 276 ++++++------ .../Configuration/ApplicationConfiguration.cs | 2 +- .../Configuration/ServerConfiguration.cs | 2 +- SharedLibraryCore/Helpers/MessageToken.cs | 10 +- SharedLibraryCore/Localization/Layout.cs | 29 +- SharedLibraryCore/PluginImporter.cs | 4 +- SharedLibraryCore/RCon/Connection.cs | 4 +- SharedLibraryCore/Server.cs | 1 - SharedLibraryCore/Utilities.cs | 31 +- WebfrontCore/Controllers/ActionController.cs | 12 +- WebfrontCore/Controllers/BaseController.cs | 1 + 36 files changed, 1209 insertions(+), 1063 deletions(-) delete mode 100644 Application/Localization/IW4MAdmin.en-EN.json create mode 100644 Application/Localization/IW4MAdmin.en-US.json create mode 100644 Application/Localization/IW4MAdmin.es-EC.json delete mode 100644 Application/Localization/IW4MAdmin.es-ES.json create mode 100644 Application/Localization/IW4MAdmin.pt-BR.json delete mode 100644 Application/Localization/IW4MAdmin.pt-PT.json diff --git a/Application/API/EventAPI.cs b/Application/API/EventAPI.cs index cc8f0a2d0..ec664c0a7 100644 --- a/Application/API/EventAPI.cs +++ b/Application/API/EventAPI.cs @@ -46,7 +46,7 @@ namespace IW4MAdmin.Application.API FlaggedMessageCount = 0; - E.Owner.Broadcast(Utilities.CurrentLocalization.LocalizationSet["GLOBAL_REPORT"]).Wait(); + E.Owner.Broadcast(Utilities.CurrentLocalization.LocalizationIndex["GLOBAL_REPORT"]).Wait(); Events.Enqueue(new EventInfo( EventInfo.EventType.ALERT, EventInfo.EventVersion.IW4MAdmin, diff --git a/Application/Application.csproj b/Application/Application.csproj index 4b5d83804..370817d23 100644 --- a/Application/Application.csproj +++ b/Application/Application.csproj @@ -60,13 +60,13 @@ Always - + PreserveNewest - + PreserveNewest - + PreserveNewest diff --git a/Application/Localization/Configure.cs b/Application/Localization/Configure.cs index ee54bb7b3..58d9ba4bb 100644 --- a/Application/Localization/Configure.cs +++ b/Application/Localization/Configure.cs @@ -9,33 +9,51 @@ namespace IW4MAdmin.Application.Localization { public class Configure { - public static void Initialize() + public static void Initialize(string customLocale) { - string currentLocale = Program.ServerManager.GetApplicationSettings().Configuration()?.CustomLocale ?? - CultureInfo.CurrentCulture?.Name?.Substring(0, 2); + string currentLocale = string.IsNullOrEmpty(customLocale) ? CultureInfo.CurrentCulture.Name : customLocale; + string[] localizationFiles = Directory.GetFiles("Localization", $"*.{currentLocale}.json"); + + // culture doesn't exist so we just want language + if (localizationFiles.Length == 0) + { + localizationFiles = Directory.GetFiles("Localization", $"*.{currentLocale.Substring(0, 2)}*.json"); + } + + // language doesn't exist either so defaulting to english + if (localizationFiles.Length == 0) + { + localizationFiles = Directory.GetFiles("Localization", "*.en-US.json"); + } + + // this should never happen unless the localization folder is empty + if (localizationFiles.Length == 0) + { + throw new Exception("No localization files were found"); + } + + var localizationDict = new Dictionary(); + + foreach (string filePath in localizationFiles) + { + var localizationContents = File.ReadAllText(filePath, Encoding.UTF8); + var eachLocalizationFile = Newtonsoft.Json.JsonConvert.DeserializeObject(localizationContents); + + foreach (var item in eachLocalizationFile.LocalizationIndex.Set) + { + if (!localizationDict.TryAdd(item.Key, item.Value)) + { + Program.ServerManager.GetLogger().WriteError($"Could not add locale string {item.Key} to localization"); + } + } + } - if (currentLocale == null) - throw new Exception("Computer CurrentCulture does not exist"); -#if DEBUG - // currentLocal = "ru-RU"; -#endif string localizationFile = $"Localization{Path.DirectorySeparatorChar}IW4MAdmin.{currentLocale}-{currentLocale.ToUpper()}.json"; - string localizationContents; - if (File.Exists(localizationFile)) + Utilities.CurrentLocalization = new SharedLibraryCore.Localization.Layout(localizationDict) { - localizationContents = File.ReadAllText(localizationFile, Encoding.UTF8); - } - - else - { - localizationFile = $"Localization{Path.DirectorySeparatorChar}IW4MAdmin.en-EN.json"; - localizationContents = File.ReadAllText(localizationFile, Encoding.UTF8); - } - - if (localizationContents.Length < 1) - throw new Exception($"Localization file {localizationFile} does not exist"); - Utilities.CurrentLocalization = Newtonsoft.Json.JsonConvert.DeserializeObject(localizationContents); + LocalizationName = currentLocale, + }; } } } diff --git a/Application/Localization/IW4MAdmin.en-EN.json b/Application/Localization/IW4MAdmin.en-EN.json deleted file mode 100644 index e9145bcd5..000000000 --- a/Application/Localization/IW4MAdmin.en-EN.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "LocalizationName": "en-US", - "LocalizationSet": { - "MANAGER_VERSION_FAIL": "Could not get latest IW4MAdmin version", - "MANAGER_VERSION_UPDATE": "has an update. Latest version is", - "MANAGER_VERSION_CURRENT": "Your version is", - "MANAGER_VERSION_SUCCESS": "IW4MAdmin is up to date", - "MANAGER_INIT_FAIL": "Fatal error during initialization", - "MANAGER_EXIT": "Press any key to exit...", - "MANAGER_SHUTDOWN_SUCCESS": "Shutdown complete", - "MANAGER_MONITORING_TEXT": "Now monitoring", - "MANAGER_CONNECTION_REST": "Connection has been reestablished with", - "SETUP_ENABLE_WEBFRONT": "Enable webfront", - "SETUP_ENABLE_MULTIOWN": "Enable multiple owners", - "SETUP_ENABLE_STEPPEDPRIV": "Enable stepped privilege hierarchy", - "SETUP_ENABLE_CUSTOMSAY": "Enable custom say name", - "SETUP_SAY_NAME": "Enter custom say name", - "SETUP_USE_CUSTOMENCODING": "Use custom encoding parser", - "SETUP_ENCODING_STRING": "Enter encoding string", - "SETUP_ENABLE_VPNS": "Enable client VPNs", - "SETUP_IPHUB_KEY": "Enter iphub.info api key", - "SETUP_DISPLAY_DISCORD": "Display discord link on webfront", - "SETUP_DISCORD_INVITE": "Enter discord invite link", - "SETUP_SERVER_USET6M": "Use Pluto T6 parser", - "SETUP_SERVER_USEIW5M": "Use Pluto IW5 Parser", - "SETUP_SERVER_MANUALLOG": "Enter manual log file path", - "SETUP_SERVER_IP": "Enter server IP Address", - "SETUP_SERVER_PORT": "Enter server port", - "SETUP_SERVER_RCON": "Enter server RCon password", - "SETUP_SERVER_SAVE": "Configuration saved, add another", - "SERVER_ERROR_DNE": "does not exist", - "SERVER_ERROR_LOG": "Invalid game log file", - "SERVER_ERROR_COMMAND_INGAME": "An internal error occured while processing your command", - "SERVER_ERROR_COMMAND_LOG": "command generated an error", - "SERVER_ERROR_UNFIXABLE": "Not monitoring server due to uncorrectable errors", - "SERVER_ERROR_DVAR": "Could not get the dvar value for", - "SERVER_ERROR_DVAR_HELP": "ensure the server has a map loaded", - "SERVER_ERROR_PLUGIN": "An error occured loading plugin", - "SERVER_ERROR_ADDPLAYER": "Unable to add player", - "SERVER_ERROR_POLLING": "reducing polling rate", - "SERVER_ERROR_COMMUNICATION": "Could not communicate with", - "SERVER_ERROR_EXCEPTION": "Unexpected exception on", - "SERVER_KICK_VPNS_NOTALLOWED": "VPNs are not allowed on this server", - "SERVER_KICK_TEXT": "You were kicked", - "SERVER_KICK_MINNAME": "Your name must contain at least 3 characters", - "SERVER_KICK_NAME_INUSE": "Your name is being used by someone else", - "SERVER_KICK_GENERICNAME": "Please change your name using /name", - "SERVER_KICK_CONTROLCHARS": "Your name cannot contain control characters", - "SERVER_TB_TEXT": "You're temporarily banned", - "SERVER_TB_REMAIN": "You are temporarily banned", - "SERVER_BAN_TEXT": "You're banned", - "SERVER_BAN_PREV": "Previously banned for", - "SERVER_BAN_APPEAL": "appeal at", - "SERVER_REPORT_COUNT": "There are ^5{0} ^7recent reports", - "SERVER_WARNLIMT_REACHED": "Too many warnings", - "SERVER_WARNING": "WARNING", - "SERVER_WEBSITE_GENERIC": "this server's website", - "BROADCAST_ONLINE": "^5IW4MADMIN ^7is now ^2ONLINE", - "BROADCAST_OFFLINE": "IW4MAdmin is going offline", - "COMMAND_HELP_SYNTAX": "syntax:", - "COMMAND_HELP_OPTIONAL": "optional", - "COMMAND_UNKNOWN": "You entered an unknown command", - "COMMAND_NOACCESS": "You do not have access to that command", - "COMMAND_NOTAUTHORIZED": "You are not authorized to execute that command", - "COMMAND_MISSINGARGS": "Not enough arguments supplied", - "COMMAND_TARGET_MULTI": "Multiple players match that name", - "COMMAND_TARGET_NOTFOUND": "Unable to find specified player", - "PLUGIN_IMPORTER_NOTFOUND": "No plugins found to load", - "PLUGIN_IMPORTER_REGISTERCMD": "Registered command", - "COMMANDS_OWNER_SUCCESS": "Congratulations, you have claimed ownership of this server!", - "COMMANDS_OWNER_FAIL": "This server already has an owner", - "COMMANDS_WARN_FAIL": "You do not have the required privileges to warn", - "COMMANDS_WARNCLEAR_SUCCESS": "All warning cleared for", - "COMMANDS_KICK_SUCCESS": "has been kicked", - "COMMANDS_KICK_FAIL": "You do not have the required privileges to kick", - "COMMANDS_TEMPBAN_SUCCESS": "has been temporarily banned for", - "COMMANDS_TEMPBAN_FAIL": "You cannot temporarily ban", - "COMMANDS_BAN_SUCCESS": "has been permanently banned", - "COMMANDS_BAN_FAIL": "You cannot ban", - "COMMANDS_UNBAN_SUCCESS": "Successfully unbanned", - "COMMANDS_UNBAN_FAIL": "is not banned", - "COMMANDS_HELP_NOTFOUND": "Could not find that command", - "COMMANDS_HELP_MOREINFO": "Type !help to get command usage syntax", - "COMMANDS_FASTRESTART_UNMASKED": "fast restarted the map", - "COMMANDS_FASTRESTART_MASKED": "The map has been fast restarted", - "COMMANDS_MAPROTATE": "Map rotating in ^55 ^7seconds", - "COMMANDS_SETLEVEL_SELF": "You cannot change your own level", - "COMMANDS_SETLEVEL_OWNER": "There can only be 1 owner. Modify your settings if multiple owners are required", - "COMMANDS_SETLEVEL_STEPPEDDISABLED": "This server does not allow you to promote", - "COMMANDS_SETLEVEL_LEVELTOOHIGH": "You can only promote ^5{0} ^7to ^5{1} ^7or lower privilege", - "COMMANDS_SETLEVEL_SUCCESS_TARGET": "Congratulations! You have been promoted to", - "COMMANDS_SETLEVEL_SUCCESS": "was successfully promoted", - "COMMANDS_SETLEVEL_FAIL": "Invalid group specified", - "COMMANDS_ADMINS_NONE": "No visible administrators online", - "COMMANDS_MAP_SUCCESS": "Changing to map", - "COMMANDS_MAP_UKN": "Attempting to change to unknown map", - "COMMANDS_FIND_MIN": "Please enter at least 3 characters", - "COMMANDS_FIND_EMPTY": "No players found", - "COMMANDS_RULES_NONE": "The server owner has not set any rules", - "COMMANDS_FLAG_SUCCESS": "You have flagged", - "COMMANDS_FLAG_UNFLAG": "You have unflagged", - "COMMANDS_FLAG_FAIL": "You cannot flag", - "COMMANDS_REPORT_FAIL_CAMP": "You cannot report an player for camping", - "COMMANDS_REPORT_FAIL_DUPLICATE": "You have already reported this player", - "COMMANDS_REPORT_FAIL_SELF": "You cannot report yourself", - "COMMANDS_REPORT_FAIL": "You cannot report", - "COMMANDS_REPORT_SUCCESS": "Thank you for your report, an administrator has been notified", - "COMMANDS_REPORTS_CLEAR_SUCCESS": "Reports successfully cleared", - "COMMANDS_REPORTS_NONE": "No players reported yet", - "COMMANDS_MASK_ON": "You are now masked", - "COMMANDS_MASK_OFF": "You are now unmasked", - "COMMANDS_BANINFO_NONE": "No active ban was found for that player", - "COMMANDS_BANINO_SUCCESS": "was banned by ^5{0} ^7for:", - "COMMANDS_ALIAS_ALIASES": "Aliases", - "COMMANDS_ALIAS_IPS": "IPs", - "COMMANDS_RCON_SUCCESS": "Successfully sent RCon command", - "COMMANDS_PLUGINS_LOADED": "Loaded Plugins", - "COMMANDS_IP_SUCCESS": "Your external IP is", - "COMMANDS_PRUNE_FAIL": "Invalid number of inactive days", - "COMMANDS_PRUNE_SUCCESS": "inactive privileged users were pruned", - "COMMANDS_PASSWORD_FAIL": "Your password must be at least 5 characters long", - "COMMANDS_PASSWORD_SUCCESS": "Your password has been set successfully", - "COMMANDS_PING_TARGET": "ping is", - "COMMANDS_PING_SELF": "Your ping is", - "COMMANDS_QUIT_DESC": "quit IW4MAdmin", - "COMMANDS_OWNER_DESC": "claim ownership of the server", - "COMMANDS_WARN_DESC": "warn client for infringing rules", - "COMMANDS_WARNCLEAR_DESC": "remove all warnings for a client", - "COMMANDS_KICK_DESC": "kick a client by name", - "COMMANDS_SAY_DESC": "broadcast message to all clients", - "COMMANDS_TEMPBAN_DESC": "temporarily ban a client for specified time (defaults to 1 hour)", - "COMMANDS_BAN_DESC": "permanently ban a client from the server", - "COMMANDS_UNBAN_DESC": "unban client by client id", - "COMMANDS_WHO_DESC": "give information about yourself", - "COMMANDS_LIST_DESC": "list active clients", - "COMMANDS_HELP_DESC": "list all available commands", - "COMMANDS_FASTRESTART_DESC": "fast restart current map", - "COMMANDS_MAPROTATE_DESC": "cycle to the next map in rotation", - "COMMANDS_SETLEVEL_DESC": "set client to specified privilege level", - "COMMANDS_USAGE_DESC": "get application memory usage", - "COMMANDS_USAGE_TEXT": "is using", - "COMMANDS_UPTIME_DESC": "get current application running time", - "COMMANDS_UPTIME_TEXT": "has been online for", - "COMMANDS_ADMINS_DESC": "list currently connected privileged clients", - "COMMANDS_MAP_DESC": "change to specified map", - "COMMANDS_FIND_DESC": "find client in database", - "COMMANDS_RULES_DESC": "list server rules", - "COMMANDS_PM_DESC": "send message to other client", - "COMMANDS_FLAG_DESC": "flag a suspicious client and announce to admins on join", - "COMMANDS_REPORT_DESC": "report a client for suspicious behavior", - "COMMANDS_REPORTS_DESC": "get or clear recent reports", - "COMMANDS_MASK_DESC": "hide your presence as a privileged client", - "COMMANDS_BANINFO_DESC": "get information about a ban for a client", - "COMMANDS_ALIAS_DESC": "get past aliases and ips of a client", - "COMMANDS_RCON_DESC": "send rcon command to server", - "COMMANDS_PLUGINS_DESC": "view all loaded plugins", - "COMMANDS_IP_DESC": "view your external IP address", - "COMMANDS_PRUNE_DESC": "demote any privileged clients that have not connected recently (defaults to 30 days)", - "COMMANDS_SETPASSWORD_DESC": "set your authentication password", - "COMMANDS_PING_DESC": "get client's ping", - "COMMANDS_ARGS_PLAYER": "player", - "COMMANDS_ARGS_REASON": "reason", - "COMMANDS_ARGS_MESSAGE": "message", - "COMMANDS_ARGS_DURATION": "duration (m|h|d|w|y)", - "COMMANDS_ARGS_CLIENTID": "client id", - "COMMANDS_ARGS_COMMANDS": "commands", - "COMMANDS_ARGS_LEVEL": "level", - "COMMANDS_ARGS_MAP": "map", - "COMMANDS_ARGS_CLEAR": "clear", - "COMMANDS_ARGS_INACTIVE": "inactive days", - "COMMANDS_ARGS_PASSWORD": "password", - "PLUGINS_LOGIN_COMMANDS_LOGIN_DESC": "login using password", - "PLUGINS_LOGIN_COMMANDS_LOGIN_SUCCESS": "You are now logged in", - "PLUGINS_LOGIN_COMMANDS_LOGIN_FAIL": "Your password is incorrect", - "PLUGINS_STATS_COMMANDS_RESET_DESC": "reset your stats to factory-new", - "PLUGINS_STATS_COMMANDS_RESET_SUCCESS": "Your stats for this server have been reset", - "PLUGINS_STATS_COMMANDS_RESET_FAIL": "You must be connected to a server to reset your stats", - "PLUGINS_STATS_COMMANDS_VIEW_DESC": "view your stats", - "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME": "The specified player must be ingame", - "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME_SELF": "You must be ingame to view your stats", - "PLUGINS_STATS_COMMANDS_VIEW_FAIL": "Cannot find the player you specified", - "PLUGINS_STATS_COMMANDS_VIEW_SUCCESS": "Stats for", - "PLUGINS_STATS_COMMANDS_TOP_DESC": "view the top 5 players in this server", - "PLUGINS_STATS_COMMANDS_TOP_TEXT": "Top Players", - "PLUGINS_STATS_TEXT_KILLS": "KILLS", - "PLUGINS_STATS_TEXT_DEATHS": "DEATHS", - "PLUGINS_STATS_TEXT_SKILL": "SKILL", - "GLOBAL_DAYS": "days", - "GLOBAL_HOURS": "hours", - "GLOBAL_MINUTES": "minutes", - "GLOBAL_REPORT": "If you suspect someone of ^5CHEATING ^7use the ^5!report ^7command", - "GLOBAL_ERROR": "Error", - "GLOBAL_WARNING": "Warning", - "GLOBAL_INFO": "Info", - "GLOBAL_VERBOSE": "Verbose", - - "MANAGER_CONSOLE_NOSERV": "No servers are currently being monitored", - "SERVER_PLUGIN_ERROR": "A plugin generated an error" - } -} \ No newline at end of file diff --git a/Application/Localization/IW4MAdmin.en-US.json b/Application/Localization/IW4MAdmin.en-US.json new file mode 100644 index 000000000..a1a39694e --- /dev/null +++ b/Application/Localization/IW4MAdmin.en-US.json @@ -0,0 +1,203 @@ +{ + "LocalizationName": "en-US", + "LocalizationIndex": { + "Set": { + "MANAGER_VERSION_FAIL": "Could not get latest IW4MAdmin version", + "MANAGER_VERSION_UPDATE": "has an update. Latest version is", + "MANAGER_VERSION_CURRENT": "Your version is", + "MANAGER_VERSION_SUCCESS": "IW4MAdmin is up to date", + "MANAGER_INIT_FAIL": "Fatal error during initialization", + "MANAGER_EXIT": "Press any key to exit...", + "MANAGER_SHUTDOWN_SUCCESS": "Shutdown complete", + "MANAGER_MONITORING_TEXT": "Now monitoring", + "MANAGER_CONNECTION_REST": "Connection has been reestablished with", + "SETUP_ENABLE_WEBFRONT": "Enable webfront", + "SETUP_ENABLE_MULTIOWN": "Enable multiple owners", + "SETUP_ENABLE_STEPPEDPRIV": "Enable stepped privilege hierarchy", + "SETUP_ENABLE_CUSTOMSAY": "Enable custom say name", + "SETUP_SAY_NAME": "Enter custom say name", + "SETUP_USE_CUSTOMENCODING": "Use custom encoding parser", + "SETUP_ENCODING_STRING": "Enter encoding string", + "SETUP_ENABLE_VPNS": "Enable client VPNs", + "SETUP_IPHUB_KEY": "Enter iphub.info api key", + "SETUP_DISPLAY_DISCORD": "Display discord link on webfront", + "SETUP_DISCORD_INVITE": "Enter discord invite link", + "SETUP_SERVER_USET6M": "Use Pluto T6 parser", + "SETUP_SERVER_USEIW5M": "Use Pluto IW5 Parser", + "SETUP_SERVER_MANUALLOG": "Enter manual log file path", + "SETUP_SERVER_IP": "Enter server IP Address", + "SETUP_SERVER_PORT": "Enter server port", + "SETUP_SERVER_RCON": "Enter server RCon password", + "SETUP_SERVER_SAVE": "Configuration saved, add another", + "SERVER_ERROR_DNE": "does not exist", + "SERVER_ERROR_LOG": "Invalid game log file", + "SERVER_ERROR_COMMAND_INGAME": "An internal error occured while processing your command", + "SERVER_ERROR_COMMAND_LOG": "command generated an error", + "SERVER_ERROR_UNFIXABLE": "Not monitoring server due to uncorrectable errors", + "SERVER_ERROR_DVAR": "Could not get the dvar value for", + "SERVER_ERROR_DVAR_HELP": "ensure the server has a map loaded", + "SERVER_ERROR_PLUGIN": "An error occured loading plugin", + "SERVER_ERROR_ADDPLAYER": "Unable to add player", + "SERVER_ERROR_POLLING": "reducing polling rate", + "SERVER_ERROR_COMMUNICATION": "Could not communicate with", + "SERVER_ERROR_EXCEPTION": "Unexpected exception on", + "SERVER_KICK_VPNS_NOTALLOWED": "VPNs are not allowed on this server", + "SERVER_KICK_TEXT": "You were kicked", + "SERVER_KICK_MINNAME": "Your name must contain at least 3 characters", + "SERVER_KICK_NAME_INUSE": "Your name is being used by someone else", + "SERVER_KICK_GENERICNAME": "Please change your name using /name", + "SERVER_KICK_CONTROLCHARS": "Your name cannot contain control characters", + "SERVER_TB_TEXT": "You're temporarily banned", + "SERVER_TB_REMAIN": "You are temporarily banned", + "SERVER_BAN_TEXT": "You're banned", + "SERVER_BAN_PREV": "Previously banned for", + "SERVER_BAN_APPEAL": "appeal at", + "SERVER_REPORT_COUNT": "There are ^5{0} ^7recent reports", + "SERVER_WARNLIMT_REACHED": "Too many warnings", + "SERVER_WARNING": "WARNING", + "SERVER_WEBSITE_GENERIC": "this server's website", + "BROADCAST_ONLINE": "^5IW4MADMIN ^7is now ^2ONLINE", + "BROADCAST_OFFLINE": "IW4MAdmin is going offline", + "COMMAND_HELP_SYNTAX": "syntax:", + "COMMAND_HELP_OPTIONAL": "optional", + "COMMAND_UNKNOWN": "You entered an unknown command", + "COMMAND_NOACCESS": "You do not have access to that command", + "COMMAND_NOTAUTHORIZED": "You are not authorized to execute that command", + "COMMAND_MISSINGARGS": "Not enough arguments supplied", + "COMMAND_TARGET_MULTI": "Multiple players match that name", + "COMMAND_TARGET_NOTFOUND": "Unable to find specified player", + "PLUGIN_IMPORTER_NOTFOUND": "No plugins found to load", + "PLUGIN_IMPORTER_REGISTERCMD": "Registered command", + "COMMANDS_OWNER_SUCCESS": "Congratulations, you have claimed ownership of this server!", + "COMMANDS_OWNER_FAIL": "This server already has an owner", + "COMMANDS_WARN_FAIL": "You do not have the required privileges to warn", + "COMMANDS_WARNCLEAR_SUCCESS": "All warning cleared for", + "COMMANDS_KICK_SUCCESS": "has been kicked", + "COMMANDS_KICK_FAIL": "You do not have the required privileges to kick", + "COMMANDS_TEMPBAN_SUCCESS": "has been temporarily banned for", + "COMMANDS_TEMPBAN_FAIL": "You cannot temporarily ban", + "COMMANDS_BAN_SUCCESS": "has been permanently banned", + "COMMANDS_BAN_FAIL": "You cannot ban", + "COMMANDS_UNBAN_SUCCESS": "Successfully unbanned", + "COMMANDS_UNBAN_FAIL": "is not banned", + "COMMANDS_HELP_NOTFOUND": "Could not find that command", + "COMMANDS_HELP_MOREINFO": "Type !help to get command usage syntax", + "COMMANDS_FASTRESTART_UNMASKED": "fast restarted the map", + "COMMANDS_FASTRESTART_MASKED": "The map has been fast restarted", + "COMMANDS_MAPROTATE": "Map rotating in ^55 ^7seconds", + "COMMANDS_SETLEVEL_SELF": "You cannot change your own level", + "COMMANDS_SETLEVEL_OWNER": "There can only be 1 owner. Modify your settings if multiple owners are required", + "COMMANDS_SETLEVEL_STEPPEDDISABLED": "This server does not allow you to promote", + "COMMANDS_SETLEVEL_LEVELTOOHIGH": "You can only promote ^5{0} ^7to ^5{1} ^7or lower privilege", + "COMMANDS_SETLEVEL_SUCCESS_TARGET": "Congratulations! You have been promoted to", + "COMMANDS_SETLEVEL_SUCCESS": "was successfully promoted", + "COMMANDS_SETLEVEL_FAIL": "Invalid group specified", + "COMMANDS_ADMINS_NONE": "No visible administrators online", + "COMMANDS_MAP_SUCCESS": "Changing to map", + "COMMANDS_MAP_UKN": "Attempting to change to unknown map", + "COMMANDS_FIND_MIN": "Please enter at least 3 characters", + "COMMANDS_FIND_EMPTY": "No players found", + "COMMANDS_RULES_NONE": "The server owner has not set any rules", + "COMMANDS_FLAG_SUCCESS": "You have flagged", + "COMMANDS_FLAG_UNFLAG": "You have unflagged", + "COMMANDS_FLAG_FAIL": "You cannot flag", + "COMMANDS_REPORT_FAIL_CAMP": "You cannot report an player for camping", + "COMMANDS_REPORT_FAIL_DUPLICATE": "You have already reported this player", + "COMMANDS_REPORT_FAIL_SELF": "You cannot report yourself", + "COMMANDS_REPORT_FAIL": "You cannot report", + "COMMANDS_REPORT_SUCCESS": "Thank you for your report, an administrator has been notified", + "COMMANDS_REPORTS_CLEAR_SUCCESS": "Reports successfully cleared", + "COMMANDS_REPORTS_NONE": "No players reported yet", + "COMMANDS_MASK_ON": "You are now masked", + "COMMANDS_MASK_OFF": "You are now unmasked", + "COMMANDS_BANINFO_NONE": "No active ban was found for that player", + "COMMANDS_BANINO_SUCCESS": "was banned by ^5{0} ^7for:", + "COMMANDS_ALIAS_ALIASES": "Aliases", + "COMMANDS_ALIAS_IPS": "IPs", + "COMMANDS_RCON_SUCCESS": "Successfully sent RCon command", + "COMMANDS_PLUGINS_LOADED": "Loaded Plugins", + "COMMANDS_IP_SUCCESS": "Your external IP is", + "COMMANDS_PRUNE_FAIL": "Invalid number of inactive days", + "COMMANDS_PRUNE_SUCCESS": "inactive privileged users were pruned", + "COMMANDS_PASSWORD_FAIL": "Your password must be at least 5 characters long", + "COMMANDS_PASSWORD_SUCCESS": "Your password has been set successfully", + "COMMANDS_PING_TARGET": "ping is", + "COMMANDS_PING_SELF": "Your ping is", + "COMMANDS_QUIT_DESC": "quit IW4MAdmin", + "COMMANDS_OWNER_DESC": "claim ownership of the server", + "COMMANDS_WARN_DESC": "warn client for infringing rules", + "COMMANDS_WARNCLEAR_DESC": "remove all warnings for a client", + "COMMANDS_KICK_DESC": "kick a client by name", + "COMMANDS_SAY_DESC": "broadcast message to all clients", + "COMMANDS_TEMPBAN_DESC": "temporarily ban a client for specified time (defaults to 1 hour)", + "COMMANDS_BAN_DESC": "permanently ban a client from the server", + "COMMANDS_UNBAN_DESC": "unban client by client id", + "COMMANDS_WHO_DESC": "give information about yourself", + "COMMANDS_LIST_DESC": "list active clients", + "COMMANDS_HELP_DESC": "list all available commands", + "COMMANDS_FASTRESTART_DESC": "fast restart current map", + "COMMANDS_MAPROTATE_DESC": "cycle to the next map in rotation", + "COMMANDS_SETLEVEL_DESC": "set client to specified privilege level", + "COMMANDS_USAGE_DESC": "get application memory usage", + "COMMANDS_USAGE_TEXT": "is using", + "COMMANDS_UPTIME_DESC": "get current application running time", + "COMMANDS_UPTIME_TEXT": "has been online for", + "COMMANDS_ADMINS_DESC": "list currently connected privileged clients", + "COMMANDS_MAP_DESC": "change to specified map", + "COMMANDS_FIND_DESC": "find client in database", + "COMMANDS_RULES_DESC": "list server rules", + "COMMANDS_PM_DESC": "send message to other client", + "COMMANDS_FLAG_DESC": "flag a suspicious client and announce to admins on join", + "COMMANDS_REPORT_DESC": "report a client for suspicious behavior", + "COMMANDS_REPORTS_DESC": "get or clear recent reports", + "COMMANDS_MASK_DESC": "hide your presence as a privileged client", + "COMMANDS_BANINFO_DESC": "get information about a ban for a client", + "COMMANDS_ALIAS_DESC": "get past aliases and ips of a client", + "COMMANDS_RCON_DESC": "send rcon command to server", + "COMMANDS_PLUGINS_DESC": "view all loaded plugins", + "COMMANDS_IP_DESC": "view your external IP address", + "COMMANDS_PRUNE_DESC": "demote any privileged clients that have not connected recently (defaults to 30 days)", + "COMMANDS_SETPASSWORD_DESC": "set your authentication password", + "COMMANDS_PING_DESC": "get client's ping", + "COMMANDS_ARGS_PLAYER": "player", + "COMMANDS_ARGS_REASON": "reason", + "COMMANDS_ARGS_MESSAGE": "message", + "COMMANDS_ARGS_DURATION": "duration (m|h|d|w|y)", + "COMMANDS_ARGS_CLIENTID": "client id", + "COMMANDS_ARGS_COMMANDS": "commands", + "COMMANDS_ARGS_LEVEL": "level", + "COMMANDS_ARGS_MAP": "map", + "COMMANDS_ARGS_CLEAR": "clear", + "COMMANDS_ARGS_INACTIVE": "inactive days", + "COMMANDS_ARGS_PASSWORD": "password", + "PLUGINS_LOGIN_COMMANDS_LOGIN_DESC": "login using password", + "PLUGINS_LOGIN_COMMANDS_LOGIN_SUCCESS": "You are now logged in", + "PLUGINS_LOGIN_COMMANDS_LOGIN_FAIL": "Your password is incorrect", + "PLUGINS_STATS_COMMANDS_RESET_DESC": "reset your stats to factory-new", + "PLUGINS_STATS_COMMANDS_RESET_SUCCESS": "Your stats for this server have been reset", + "PLUGINS_STATS_COMMANDS_RESET_FAIL": "You must be connected to a server to reset your stats", + "PLUGINS_STATS_COMMANDS_VIEW_DESC": "view your stats", + "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME": "The specified player must be ingame", + "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME_SELF": "You must be ingame to view your stats", + "PLUGINS_STATS_COMMANDS_VIEW_FAIL": "Cannot find the player you specified", + "PLUGINS_STATS_COMMANDS_VIEW_SUCCESS": "Stats for", + "PLUGINS_STATS_COMMANDS_TOP_DESC": "view the top 5 players in this server", + "PLUGINS_STATS_COMMANDS_TOP_TEXT": "Top Players", + "PLUGINS_STATS_TEXT_KILLS": "KILLS", + "PLUGINS_STATS_TEXT_DEATHS": "DEATHS", + "PLUGINS_STATS_TEXT_SKILL": "SKILL", + "GLOBAL_DAYS": "days", + "GLOBAL_HOURS": "hours", + "GLOBAL_MINUTES": "minutes", + "GLOBAL_REPORT": "If you suspect someone of ^5CHEATING ^7use the ^5!report ^7command", + "GLOBAL_ERROR": "Error", + "GLOBAL_WARNING": "Warning", + "GLOBAL_INFO": "Info", + "GLOBAL_VERBOSE": "Verbose", + + "MANAGER_CONSOLE_NOSERV": "No servers are currently being monitored", + "SERVER_PLUGIN_ERROR": "A plugin generated an error", + "PLUGINS_STATS_TEXT_NOQUALIFY": "No players qualify for top stats yet" + } + } +} \ No newline at end of file diff --git a/Application/Localization/IW4MAdmin.es-EC.json b/Application/Localization/IW4MAdmin.es-EC.json new file mode 100644 index 000000000..448f7afd5 --- /dev/null +++ b/Application/Localization/IW4MAdmin.es-EC.json @@ -0,0 +1,203 @@ +{ + "LocalizationName": "es-ES", + "LocalizationIndex": { + "Set": { + "MANAGER_VERSION_FAIL": "No se ha podido conseguir la última versión de IW4MAdmin", + "MANAGER_VERSION_UPDATE": "tiene una actualización. La última versión es", + "MANAGER_VERSION_CURRENT": "Tu versión es", + "MANAGER_VERSION_SUCCESS": "IW4MAdmin está actualizado", + "MANAGER_INIT_FAIL": "Error fatal durante la inicialización", + "MANAGER_EXIT": "Presione cualquier tecla para salir...", + "MANAGER_SHUTDOWN_SUCCESS": "Apagado completo", + "MANAGER_MONITORING_TEXT": "Ahora monitoreando", + "MANAGER_CONNECTION_REST": "La conexión ha sido restablecida con", + "SETUP_ENABLE_WEBFRONT": "Habilitar frente de la web", + "SETUP_ENABLE_MULTIOWN": "Habilitar múltiples propietarios", + "SETUP_ENABLE_STEPPEDPRIV": "Habilitar jerarquía de privilegios por escalones", + "SETUP_ENABLE_CUSTOMSAY": "Habilitar nombre a decir personalizado", + "SETUP_SAY_NAME": "Ingresar nombre a decir personalizado", + "SETUP_USE_CUSTOMENCODING": "Usar analizador de codificación personalizado", + "SETUP_ENCODING_STRING": "Ingresar cadena de codificación", + "SETUP_ENABLE_VPNS": "Habilitar VPNs clientes", + "SETUP_IPHUB_KEY": "Ingresar clave api de iphub.info", + "SETUP_DISPLAY_DISCORD": "Mostrar link de Discord en frente de la web", + "SETUP_DISCORD_INVITE": "Ingresar link de invitación a discord", + "SETUP_SERVER_USET6M": "Usar analizador Pluto T6", + "SETUP_SERVER_USEIW5M": "Usar analizador Pluto IW5", + "SETUP_SERVER_MANUALLOG": "Ingresar manualmente la ruta del archivo de registro", + "SETUP_SERVER_IP": "Ingresar Dirección IP del servidor", + "SETUP_SERVER_PORT": "Ingresar puerto del servidor", + "SETUP_SERVER_RCON": "Ingresar contraseña RCon del servidor", + "SETUP_SERVER_SAVE": "Configuración guardada, añadir otra", + "SERVER_ERROR_DNE": "No existe", + "SERVER_ERROR_LOG": "Archivo de registro del juego invalido", + "SERVER_ERROR_COMMAND_INGAME": "Un error interno ocurrió mientras se procesaba tu comando", + "SERVER_ERROR_COMMAND_LOG": "Comando generó error", + "SERVER_ERROR_UNFIXABLE": "No se está supervisando el servidor debido a errores incorregibles", + "SERVER_ERROR_DVAR": "No se pudo obtener el valor dvar", + "SERVER_ERROR_DVAR_HELP": "asegúrate de que el servidor tenga un mapa cargado", + "SERVER_ERROR_PLUGIN": "Un error ocurrió mientras se cargaba el complemente", + "SERVER_ERROR_ADDPLAYER": "Incapaz de añadir al jugador", + "SERVER_ERROR_POLLING": "reduciendo la tasa de sondeo", + "SERVER_ERROR_COMMUNICATION": "No se ha podido comunicar con", + "SERVER_ERROR_EXCEPTION": "Excepción inesperada en", + "SERVER_KICK_VPNS_NOTALLOWED": "Las VPNs no están permitidas en este servidor", + "SERVER_KICK_TEXT": "Fuiste expulsado", + "SERVER_KICK_MINNAME": "Tu nombre debe contener al menos 3 caracteres", + "SERVER_KICK_NAME_INUSE": "Tu nombre está siendo usado por alguien más", + "SERVER_KICK_GENERICNAME": "Por favor cambia tu nombre usando /name", + "SERVER_KICK_CONTROLCHARS": "Tu nombre no puede contener caracteres de control", + "SERVER_TB_TEXT": "Estás temporalmente baneado", + "SERVER_TB_REMAIN": "Tú estás temporalmente baneado", + "SERVER_BAN_TEXT": "Estás baneado", + "SERVER_BAN_PREV": "Baneado anteriormente por", + "SERVER_BAN_APPEAL": "apela en", + "SERVER_REPORT_COUNT": "Hay ^5{0} ^7reportes recientes", + "SERVER_WARNLIMT_REACHED": "Muchas advertencias", + "SERVER_WARNING": "ADVERTENCIA", + "SERVER_WEBSITE_GENERIC": "el sitio web de este servidor", + "BROADCAST_ONLINE": "^5IW4MADMIN ^7está ahora ^2en línea", + "BROADCAST_OFFLINE": "IW4MAdmin está desconectado", + "COMMAND_HELP_SYNTAX": "sintaxis:", + "COMMAND_HELP_OPTIONAL": "opcional", + "COMMAND_UNKNOWN": "Has ingresado un comando desconocido", + "COMMAND_NOACCESS": "Tú no tienes acceso a ese comando", + "COMMAND_NOTAUTHORIZED": "Tú no estás autorizado para ejecutar ese comando", + "COMMAND_MISSINGARGS": "No se han proporcionado suficientes argumentos", + "COMMAND_TARGET_MULTI": "Múltiples jugadores coinciden con ese nombre", + "COMMAND_TARGET_NOTFOUND": "No se puede encontrar el jugador especificado", + "PLUGIN_IMPORTER_NOTFOUND": "No se encontraron complementos para cargar", + "PLUGIN_IMPORTER_REGISTERCMD": "Comando registrado", + "COMMANDS_OWNER_SUCCESS": "¡Felicidades, has reclamado la propiedad de este servidor!", + "COMMANDS_OWNER_FAIL": "Este servidor ya tiene un propietario", + "COMMANDS_WARN_FAIL": "No tiene los privilegios necesarios para advertir a", + "COMMANDS_WARNCLEAR_SUCCESS": "Todas las advertencias borradas para", + "COMMANDS_KICK_SUCCESS": "ha sido expulsado", + "COMMANDS_KICK_FAIL": "No tienes los privilegios necesarios para expulsar a", + "COMMANDS_TEMPBAN_SUCCESS": "ha sido baneado temporalmente por", + "COMMANDS_TEMPBAN_FAIL": "Tú no puedes banear temporalmente", + "COMMANDS_BAN_SUCCESS": "ha sido baneado permanentemente", + "COMMANDS_BAN_FAIL": "Tú no puedes banear", + "COMMANDS_UNBAN_SUCCESS": "Exitosamente desbaneado", + "COMMANDS_UNBAN_FAIL": "no está baneado", + "COMMANDS_HELP_NOTFOUND": "No se ha podido encontrar ese comando", + "COMMANDS_HELP_MOREINFO": "Escribe !help para obtener la sintaxis de uso del comando", + "COMMANDS_FASTRESTART_UNMASKED": "ha dado rápido reinicio al mapa", + "COMMANDS_FASTRESTART_MASKED": "Al mapa se le ha dado un reinicio rápido", + "COMMANDS_MAPROTATE": "Rotación de mapa en ^55 ^7segundos", + "COMMANDS_SETLEVEL_SELF": "No puedes cambiar tu propio nivel", + "COMMANDS_SETLEVEL_OWNER": "Solo puede haber un propietario. Modifica tu configuración si múltiples propietarios son requeridos", + "COMMANDS_SETLEVEL_STEPPEDDISABLED": "Este servidor no te permite promover", + "COMMANDS_SETLEVEL_LEVELTOOHIGH": "Tú solo puedes promover ^5{0} ^7a ^5{1} ^7o menor privilegio", + "COMMANDS_SETLEVEL_SUCCESS_TARGET": "¡Felicitaciones! has ha sido promovido a", + "COMMANDS_SETLEVEL_SUCCESS": "fue promovido con éxito", + "COMMANDS_SETLEVEL_FAIL": "Grupo inválido especificado", + "COMMANDS_ADMINS_NONE": "No hay administradores visibles en línea", + "COMMANDS_MAP_SUCCESS": "Cambiando al mapa", + "COMMANDS_MAP_UKN": "Intentando cambiar a un mapa desconocido", + "COMMANDS_FIND_MIN": "Por Favor introduzca al menos 3 caracteres", + "COMMANDS_FIND_EMPTY": "No se encontraron jugadores", + "COMMANDS_RULES_NONE": "El propietario del servidor no ha establecido ninguna regla", + "COMMANDS_FLAG_SUCCESS": "Has marcado a", + "COMMANDS_FLAG_UNFLAG": "Has desmarcado a", + "COMMANDS_FLAG_FAIL": "Tú no puedes marcar", + "COMMANDS_REPORT_FAIL_CAMP": "No puedes reportar a un jugador por campear", + "COMMANDS_REPORT_FAIL_DUPLICATE": "Ya has reportado a este jugador", + "COMMANDS_REPORT_FAIL_SELF": "No puedes reportarte a ti mismo", + "COMMANDS_REPORT_FAIL": "Tú no puedes reportar", + "COMMANDS_REPORT_SUCCESS": "Gracias por su reporte, un administrador ha sido notificado", + "COMMANDS_REPORTS_CLEAR_SUCCESS": "Reportes borrados con éxito", + "COMMANDS_REPORTS_NONE": "No hay jugadores reportados aun", + "COMMANDS_MASK_ON": "Ahora estás enmascarado", + "COMMANDS_MASK_OFF": "Ahora estás desenmascarado", + "COMMANDS_BANINFO_NONE": "No se encontró ban activo para ese jugador", + "COMMANDS_BANINO_SUCCESS": "fue baneado por ^5{0} ^7debido a:", + "COMMANDS_ALIAS_ALIASES": "Aliases", + "COMMANDS_ALIAS_IPS": "IPs", + "COMMANDS_RCON_SUCCESS": "Exitosamente enviado el comando RCon", + "COMMANDS_PLUGINS_LOADED": "Complementos cargados", + "COMMANDS_IP_SUCCESS": "Tu IP externa es", + "COMMANDS_PRUNE_FAIL": "Número inválido de días inactivos", + "COMMANDS_PRUNE_SUCCESS": "los usuarios privilegiados inactivos fueron podados", + "COMMANDS_PASSWORD_FAIL": "Tu contraseña debe tener al menos 5 caracteres de largo", + "COMMANDS_PASSWORD_SUCCESS": "Su contraseña ha sido establecida con éxito", + "COMMANDS_PING_TARGET": "ping es", + "COMMANDS_PING_SELF": "Tu ping es", + "COMMANDS_QUIT_DESC": "salir de IW4MAdmin", + "COMMANDS_OWNER_DESC": "reclamar la propiedad del servidor", + "COMMANDS_WARN_DESC": "advertir al cliente por infringir las reglas", + "COMMANDS_WARNCLEAR_DESC": "eliminar todas las advertencias de un cliente", + "COMMANDS_KICK_DESC": "expulsar a un cliente por su nombre", + "COMMANDS_SAY_DESC": "transmitir el mensaje a todos los clientes", + "COMMANDS_TEMPBAN_DESC": "banear temporalmente a un cliente por el tiempo especificado (predeterminado en 1 hora)", + "COMMANDS_BAN_DESC": "banear permanentemente un cliente del servidor", + "COMMANDS_UNBAN_DESC": "desbanear al cliente por ID", + "COMMANDS_WHO_DESC": "da información sobre ti", + "COMMANDS_LIST_DESC": "enlistar clientes activos", + "COMMANDS_HELP_DESC": "enlistar todos los comandos disponibles", + "COMMANDS_FASTRESTART_DESC": "dar reinicio rápido al mapa actial", + "COMMANDS_MAPROTATE_DESC": "pasar al siguiente mapa en rotación", + "COMMANDS_SETLEVEL_DESC": "establecer el cliente al nivel de privilegio especificado", + "COMMANDS_USAGE_DESC": "obtener uso de la memoria de la aplicación", + "COMMANDS_USAGE_TEXT": "está usando", + "COMMANDS_UPTIME_DESC": "obtener el tiempo de ejecución de la aplicación actual", + "COMMANDS_UPTIME_TEXT": "ha estado en línea por", + "COMMANDS_ADMINS_DESC": "enlistar clientes privilegiados actualmente conectados", + "COMMANDS_MAP_DESC": "cambiar al mapa especificado", + "COMMANDS_FIND_DESC": "encontrar cliente en la base de datos", + "COMMANDS_RULES_DESC": "enlistar reglas del servidor", + "COMMANDS_PM_DESC": "enviar mensaje a otro cliente", + "COMMANDS_FLAG_DESC": "marcar un cliente sospechoso y anunciar a los administradores al unirse", + "COMMANDS_REPORT_DESC": "reportar un cliente por comportamiento sospechoso", + "COMMANDS_REPORTS_DESC": "obtener o borrar informes recientes", + "COMMANDS_MASK_DESC": "esconde tu presencia como un cliente privilegiado", + "COMMANDS_BANINFO_DESC": "obtener información sobre el ban de un cliente", + "COMMANDS_ALIAS_DESC": "obtener alias e ips anteriores de un cliente", + "COMMANDS_RCON_DESC": "enviar el comando rcon al servidor", + "COMMANDS_PLUGINS_DESC": "ver todos los complementos cargados", + "COMMANDS_IP_DESC": "ver tu dirección IP externa", + "COMMANDS_PRUNE_DESC": "degradar a los clientes con privilegios que no se hayan conectado recientemente (el valor predeterminado es 30 días)", + "COMMANDS_SETPASSWORD_DESC": "configura tu contraseña de autenticación", + "COMMANDS_PING_DESC": "obtener ping del cliente", + "COMMANDS_ARGS_PLAYER": "jugador", + "COMMANDS_ARGS_REASON": "razón", + "COMMANDS_ARGS_MESSAGE": "mensaje", + "COMMANDS_ARGS_DURATION": "duración (m|h|d|w|y)", + "COMMANDS_ARGS_CLIENTID": "id del cliente", + "COMMANDS_ARGS_COMMANDS": "comandos", + "COMMANDS_ARGS_LEVEL": "nivel", + "COMMANDS_ARGS_MAP": "mapa", + "COMMANDS_ARGS_CLEAR": "borrar", + "COMMANDS_ARGS_INACTIVE": "días inactivo", + "COMMANDS_ARGS_PASSWORD": "contraseña", + "PLUGINS_LOGIN_COMMANDS_LOGIN_DESC": "iniciar sesión usando la contraseña", + "PLUGINS_LOGIN_COMMANDS_LOGIN_SUCCESS": "Ahora está conectado", + "PLUGINS_LOGIN_COMMANDS_LOGIN_FAIL": "tu contraseña es incorrecta", + "PLUGINS_STATS_COMMANDS_RESET_DESC": "restablece tus estadísticas a las nuevas de fábrica", + "PLUGINS_STATS_COMMANDS_RESET_SUCCESS": "Tus estadísticas para este servidor se han restablecido", + "PLUGINS_STATS_COMMANDS_RESET_FAIL": "Debes estar conectado a un servidor para restablecer tus estadísticas", + "PLUGINS_STATS_COMMANDS_VIEW_DESC": "ver tus estadísticas", + "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME": "El jugador especificado debe estar dentro del juego", + "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME_SELF": "Debes estar dentro del juego para ver tus estadísticas", + "PLUGINS_STATS_COMMANDS_VIEW_FAIL": "No se puede encontrar el jugador que especificó", + "PLUGINS_STATS_COMMANDS_VIEW_SUCCESS": "Estadísticas para", + "PLUGINS_STATS_COMMANDS_TOP_DESC": "ver los 5 mejores jugadores en este servidor", + "PLUGINS_STATS_COMMANDS_TOP_TEXT": "Mejores Jugadores", + "PLUGINS_STATS_TEXT_KILLS": "Asesinatos", + "PLUGINS_STATS_TEXT_DEATHS": "Muertes", + "PLUGINS_STATS_TEXT_SKILL": "Habilidad", + "GLOBAL_DAYS": "días", + "GLOBAL_HOURS": "horas", + "GLOBAL_MINUTES": "minutos", + "GLOBAL_REPORT": "Si sospechas que alguien ^5usa cheats ^7usa el comando ^5!report", + "GLOBAL_ERROR": "Error", + "GLOBAL_WARNING": "Advertencia", + "GLOBAL_INFO": "Información", + "GLOBAL_VERBOSE": "Detallado", + + "MANAGER_CONSOLE_NOSERV": "No hay servidores que estén siendo monitoreados en este momento", + "SERVER_PLUGIN_ERROR": "Un complemento generó un error", + "PLUGINS_STATS_TEXT_NOQUALIFY": "No hay jugadores que califiquen para los primeros lugares aun" + } + } +} \ No newline at end of file diff --git a/Application/Localization/IW4MAdmin.es-ES.json b/Application/Localization/IW4MAdmin.es-ES.json deleted file mode 100644 index 490a50582..000000000 --- a/Application/Localization/IW4MAdmin.es-ES.json +++ /dev/null @@ -1,197 +0,0 @@ -{ - "LocalizationName": "es-ES", - "LocalizationSet": { - "MANAGER_VERSION_FAIL": "No se ha podido conseguir la última versión de IW4MAdmin", - "MANAGER_VERSION_UPDATE": "tiene una actualización. La última versión es", - "MANAGER_VERSION_CURRENT": "Tu versión es", - "MANAGER_VERSION_SUCCESS": "IW4MAdmin está actualizado", - "MANAGER_INIT_FAIL": "Error fatal durante la inicialización", - "MANAGER_EXIT": "Presione cualquier tecla para salir...", - "MANAGER_SHUTDOWN_SUCCESS": "Apagado completo", - "MANAGER_MONITORING_TEXT": "Ahora monitoreando", - "MANAGER_CONNECTION_REST": "La conexión ha sido restablecida con", - "SETUP_ENABLE_WEBFRONT": "Habilitar frente de la web", - "SETUP_ENABLE_MULTIOWN": "Habilitar múltiples propietarios", - "SETUP_ENABLE_STEPPEDPRIV": "Habilitar jerarquía de privilegios por escalones", - "SETUP_ENABLE_CUSTOMSAY": "Habilitar nombre a decir personalizado", - "SETUP_SAY_NAME": "Ingresar nombre a decir personalizado", - "SETUP_USE_CUSTOMENCODING": "Usar analizador de codificación personalizado", - "SETUP_ENCODING_STRING": "Ingresar cadena de codificación", - "SETUP_ENABLE_VPNS": "Habilitar VPNs clientes", - "SETUP_IPHUB_KEY": "Ingresar clave api de iphub.info", - "SETUP_DISPLAY_DISCORD": "Mostrar link de Discord en frente de la web", - "SETUP_DISCORD_INVITE": "Ingresar link de invitación a discord", - "SETUP_SERVER_USET6M": "Usar analizador Pluto T6", - "SETUP_SERVER_USEIW5M": "Usar analizador Pluto IW5", - "SETUP_SERVER_MANUALLOG": "Ingresar manualmente la ruta del archivo de registro", - "SETUP_SERVER_IP": "Ingresar Dirección IP del servidor", - "SETUP_SERVER_PORT": "Ingresar puerto del servidor", - "SETUP_SERVER_RCON": "Ingresar contraseña RCon del servidor", - "SETUP_SERVER_SAVE": "Configuración guardada, añadir otra", - "SERVER_ERROR_DNE": "No existe", - "SERVER_ERROR_LOG": "Archivo de registro del juego invalido", - "SERVER_ERROR_COMMAND_INGAME": "Un error interno ocurrió mientras se procesaba tu comando", - "SERVER_ERROR_COMMAND_LOG": "Comando generó error", - "SERVER_ERROR_UNFIXABLE": "No se está supervisando el servidor debido a errores incorregibles", - "SERVER_ERROR_DVAR": "No se pudo obtener el valor dvar", - "SERVER_ERROR_DVAR_HELP": "asegúrate de que el servidor tenga un mapa cargado", - "SERVER_ERROR_PLUGIN": "Un error ocurrió mientras se cargaba el complemente", - "SERVER_ERROR_ADDPLAYER": "Incapaz de añadir al jugador", - "SERVER_ERROR_POLLING": "reduciendo la tasa de sondeo", - "SERVER_ERROR_COMMUNICATION": "No se ha podido comunicar con", - "SERVER_ERROR_EXCEPTION": "Excepción inesperada en", - "SERVER_KICK_VPNS_NOTALLOWED": "Las VPNs no están permitidas en este servidor", - "SERVER_KICK_TEXT": "Fuiste expulsado", - "SERVER_KICK_MINNAME": "Tu nombre debe contener al menos 3 caracteres", - "SERVER_KICK_NAME_INUSE": "Tu nombre está siendo usado por alguien más", - "SERVER_KICK_GENERICNAME": "Por favor cambia tu nombre usando /name", - "SERVER_KICK_CONTROLCHARS": "Tu nombre no puede contener caracteres de control", - "SERVER_TB_TEXT": "Estás temporalmente baneado", - "SERVER_TB_REMAIN": "Tú estás temporalmente baneado", - "SERVER_BAN_TEXT": "Estás baneado", - "SERVER_BAN_PREV": "Baneado anteriormente por", - "SERVER_BAN_APPEAL": "apela en", - "SERVER_REPORT_COUNT": "Hay ^5{0} ^7reportes recientes", - "SERVER_WARNLIMT_REACHED": "Muchas advertencias", - "SERVER_WARNING": "ADVERTENCIA", - "SERVER_WEBSITE_GENERIC": "el sitio web de este servidor", - "BROADCAST_ONLINE": "^5IW4MADMIN ^7está ahora ^2en línea", - "BROADCAST_OFFLINE": "IW4MAdmin está desconectado", - "COMMAND_HELP_SYNTAX": "sintaxis:", - "COMMAND_HELP_OPTIONAL": "opcional", - "COMMAND_UNKNOWN": "Has ingresado un comando desconocido", - "COMMAND_NOACCESS": "Tú no tienes acceso a ese comando", - "COMMAND_NOTAUTHORIZED": "Tú no estás autorizado para ejecutar ese comando", - "COMMAND_MISSINGARGS": "No se han proporcionado suficientes argumentos", - "COMMAND_TARGET_MULTI": "Múltiples jugadores coinciden con ese nombre", - "COMMAND_TARGET_NOTFOUND": "No se puede encontrar el jugador especificado", - "PLUGIN_IMPORTER_NOTFOUND": "No se encontraron complementos para cargar", - "PLUGIN_IMPORTER_REGISTERCMD": "Comando registrado", - "COMMANDS_OWNER_SUCCESS": "¡Felicidades, has reclamado la propiedad de este servidor!", - "COMMANDS_OWNER_FAIL": "Este servidor ya tiene un propietario", - "COMMANDS_WARN_FAIL": "No tiene los privilegios necesarios para advertir a", - "COMMANDS_WARNCLEAR_SUCCESS": "Todas las advertencias borradas para", - "COMMANDS_KICK_SUCCESS": "ha sido expulsado", - "COMMANDS_KICK_FAIL": "No tienes los privilegios necesarios para expulsar a", - "COMMANDS_TEMPBAN_SUCCESS": "ha sido baneado temporalmente por", - "COMMANDS_TEMPBAN_FAIL": "Tú no puedes banear temporalmente", - "COMMANDS_BAN_SUCCESS": "ha sido baneado permanentemente", - "COMMANDS_BAN_FAIL": "Tú no puedes banear", - "COMMANDS_UNBAN_SUCCESS": "Exitosamente desbaneado", - "COMMANDS_UNBAN_FAIL": "no está baneado", - "COMMANDS_HELP_NOTFOUND": "No se ha podido encontrar ese comando", - "COMMANDS_HELP_MOREINFO": "Escribe !help para obtener la sintaxis de uso del comando", - "COMMANDS_FASTRESTART_UNMASKED": "ha dado rápido reinicio al mapa", - "COMMANDS_FASTRESTART_MASKED": "Al mapa se le ha dado un reinicio rápido", - "COMMANDS_MAPROTATE": "Rotación de mapa en ^55 ^7segundos", - "COMMANDS_SETLEVEL_SELF": "No puedes cambiar tu propio nivel", - "COMMANDS_SETLEVEL_OWNER": "Solo puede haber un propietario. Modifica tu configuración si múltiples propietarios son requeridos", - "COMMANDS_SETLEVEL_STEPPEDDISABLED": "Este servidor no te permite promover", - "COMMANDS_SETLEVEL_LEVELTOOHIGH": "Tú solo puedes promover ^5{0} ^7a ^5{1} ^7o menor privilegio", - "COMMANDS_SETLEVEL_SUCCESS_TARGET": "¡Felicitaciones! has ha sido promovido a", - "COMMANDS_SETLEVEL_SUCCESS": "fue promovido con éxito", - "COMMANDS_SETLEVEL_FAIL": "Grupo inválido especificado", - "COMMANDS_ADMINS_NONE": "No hay administradores visibles en línea", - "COMMANDS_MAP_SUCCESS": "Cambiando al mapa", - "COMMANDS_MAP_UKN": "Intentando cambiar a un mapa desconocido", - "COMMANDS_FIND_MIN": "Por Favor introduzca al menos 3 caracteres", - "COMMANDS_FIND_EMPTY": "No se encontraron jugadores", - "COMMANDS_RULES_NONE": "El propietario del servidor no ha establecido ninguna regla", - "COMMANDS_FLAG_SUCCESS": "Has marcado a", - "COMMANDS_FLAG_UNFLAG": "Has desmarcado a", - "COMMANDS_FLAG_FAIL": "Tú no puedes marcar", - "COMMANDS_REPORT_FAIL_CAMP": "No puedes reportar a un jugador por campear", - "COMMANDS_REPORT_FAIL_DUPLICATE": "Ya has reportado a este jugador", - "COMMANDS_REPORT_FAIL_SELF": "No puedes reportarte a ti mismo", - "COMMANDS_REPORT_FAIL": "Tú no puedes reportar", - "COMMANDS_REPORT_SUCCESS": "Gracias por su reporte, un administrador ha sido notificado", - "COMMANDS_REPORTS_CLEAR_SUCCESS": "Reportes borrados con éxito", - "COMMANDS_REPORTS_NONE": "No hay jugadores reportados aun", - "COMMANDS_MASK_ON": "Ahora estás enmascarado", - "COMMANDS_MASK_OFF": "Ahora estás desenmascarado", - "COMMANDS_BANINFO_NONE": "No se encontró ban activo para ese jugador", - "COMMANDS_BANINO_SUCCESS": "fue baneado por ^5{0} ^7debido a:", - "COMMANDS_ALIAS_ALIASES": "Aliases", - "COMMANDS_ALIAS_IPS": "IPs", - "COMMANDS_RCON_SUCCESS": "Exitosamente enviado el comando RCon", - "COMMANDS_PLUGINS_LOADED": "Complementos cargados", - "COMMANDS_IP_SUCCESS": "Tu IP externa es", - "COMMANDS_PRUNE_FAIL": "Número inválido de días inactivos", - "COMMANDS_PRUNE_SUCCESS": "los usuarios privilegiados inactivos fueron podados", - "COMMANDS_PASSWORD_FAIL": "Tu contraseña debe tener al menos 5 caracteres de largo", - "COMMANDS_PASSWORD_SUCCESS": "Su contraseña ha sido establecida con éxito", - "COMMANDS_PING_TARGET": "ping es", - "COMMANDS_PING_SELF": "Tu ping es", - "COMMANDS_QUIT_DESC": "salir de IW4MAdmin", - "COMMANDS_OWNER_DESC": "reclamar la propiedad del servidor", - "COMMANDS_WARN_DESC": "advertir al cliente por infringir las reglas", - "COMMANDS_WARNCLEAR_DESC": "eliminar todas las advertencias de un cliente", - "COMMANDS_KICK_DESC": "expulsar a un cliente por su nombre", - "COMMANDS_SAY_DESC": "transmitir el mensaje a todos los clientes", - "COMMANDS_TEMPBAN_DESC": "banear temporalmente a un cliente por el tiempo especificado (predeterminado en 1 hora)", - "COMMANDS_BAN_DESC": "banear permanentemente un cliente del servidor", - "COMMANDS_UNBAN_DESC": "desbanear al cliente por ID", - "COMMANDS_WHO_DESC": "da información sobre ti", - "COMMANDS_LIST_DESC": "enlistar clientes activos", - "COMMANDS_HELP_DESC": "enlistar todos los comandos disponibles", - "COMMANDS_FASTRESTART_DESC": "dar reinicio rápido al mapa actial", - "COMMANDS_MAPROTATE_DESC": "pasar al siguiente mapa en rotación", - "COMMANDS_SETLEVEL_DESC": "establecer el cliente al nivel de privilegio especificado", - "COMMANDS_USAGE_DESC": "obtener uso de la memoria de la aplicación", - "COMMANDS_USAGE_TEXT": "está usando", - "COMMANDS_UPTIME_DESC": "obtener el tiempo de ejecución de la aplicación actual", - "COMMANDS_UPTIME_TEXT": "ha estado en línea por", - "COMMANDS_ADMINS_DESC": "enlistar clientes privilegiados actualmente conectados", - "COMMANDS_MAP_DESC": "cambiar al mapa especificado", - "COMMANDS_FIND_DESC": "encontrar cliente en la base de datos", - "COMMANDS_RULES_DESC": "enlistar reglas del servidor", - "COMMANDS_PM_DESC": "enviar mensaje a otro cliente", - "COMMANDS_FLAG_DESC": "marcar un cliente sospechoso y anunciar a los administradores al unirse", - "COMMANDS_REPORT_DESC": "reportar un cliente por comportamiento sospechoso", - "COMMANDS_REPORTS_DESC": "obtener o borrar informes recientes", - "COMMANDS_MASK_DESC": "esconde tu presencia como un cliente privilegiado", - "COMMANDS_BANINFO_DESC": "obtener información sobre el ban de un cliente", - "COMMANDS_ALIAS_DESC": "obtener alias e ips anteriores de un cliente", - "COMMANDS_RCON_DESC": "enviar el comando rcon al servidor", - "COMMANDS_PLUGINS_DESC": "ver todos los complementos cargados", - "COMMANDS_IP_DESC": "ver tu dirección IP externa", - "COMMANDS_PRUNE_DESC": "degradar a los clientes con privilegios que no se hayan conectado recientemente (el valor predeterminado es 30 días)", - "COMMANDS_SETPASSWORD_DESC": "configura tu contraseña de autenticación", - "COMMANDS_PING_DESC": "obtener ping del cliente", - "COMMANDS_ARGS_PLAYER": "jugador", - "COMMANDS_ARGS_REASON": "razón", - "COMMANDS_ARGS_MESSAGE": "mensaje", - "COMMANDS_ARGS_DURATION": "duración (m|h|d|w|y)", - "COMMANDS_ARGS_CLIENTID": "id del cliente", - "COMMANDS_ARGS_COMMANDS": "comandos", - "COMMANDS_ARGS_LEVEL": "nivel", - "COMMANDS_ARGS_MAP": "mapa", - "COMMANDS_ARGS_CLEAR": "borrar", - "COMMANDS_ARGS_INACTIVE": "días inactivo", - "COMMANDS_ARGS_PASSWORD": "contraseña", - "PLUGINS_LOGIN_COMMANDS_LOGIN_DESC": "iniciar sesión usando la contraseña", - "PLUGINS_LOGIN_COMMANDS_LOGIN_SUCCESS": "Ahora está conectado", - "PLUGINS_LOGIN_COMMANDS_LOGIN_FAIL": "tu contraseña es incorrecta", - "PLUGINS_STATS_COMMANDS_RESET_DESC": "restablece tus estadísticas a las nuevas de fábrica", - "PLUGINS_STATS_COMMANDS_RESET_SUCCESS": "Tus estadísticas para este servidor se han restablecido", - "PLUGINS_STATS_COMMANDS_RESET_FAIL": "Debes estar conectado a un servidor para restablecer tus estadísticas", - "PLUGINS_STATS_COMMANDS_VIEW_DESC": "ver tus estadísticas", - "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME": "El jugador especificado debe estar dentro del juego", - "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME_SELF": "Debes estar dentro del juego para ver tus estadísticas", - "PLUGINS_STATS_COMMANDS_VIEW_FAIL": "No se puede encontrar el jugador que especificó", - "PLUGINS_STATS_COMMANDS_VIEW_SUCCESS": "Estadísticas para", - "PLUGINS_STATS_COMMANDS_TOP_DESC": "ver los 5 mejores jugadores en este servidor", - "PLUGINS_STATS_COMMANDS_TOP_TEXT": "Mejores Jugadores", - "PLUGINS_STATS_TEXT_KILLS": "Asesinatos", - "PLUGINS_STATS_TEXT_DEATHS": "Muertes", - "PLUGINS_STATS_TEXT_SKILL": "Habilidad", - "GLOBAL_DAYS": "días", - "GLOBAL_HOURS": "horas", - "GLOBAL_MINUTES": "minutos", - "GLOBAL_REPORT": "Si sospechas que alguien ^5usa cheats ^7usa el comando ^5!report", - "GLOBAL_ERROR": "Error", - "GLOBAL_WARNING": "Advertencia", - "GLOBAL_INFO": "Información", - "GLOBAL_VERBOSE": "Detallado" - } -} \ No newline at end of file diff --git a/Application/Localization/IW4MAdmin.pt-BR.json b/Application/Localization/IW4MAdmin.pt-BR.json new file mode 100644 index 000000000..508893cf4 --- /dev/null +++ b/Application/Localization/IW4MAdmin.pt-BR.json @@ -0,0 +1,203 @@ +{ + "LocalizationName": "pt-BR", + "LocalizationIndex": { + "Set": { + "MANAGER_VERSION_FAIL": "Não foi possível obter a versão mais recente do IW4MAdmin", + "MANAGER_VERSION_UPDATE": "Há uma atualização disponível. A versão mais recente é", + "MANAGER_VERSION_CURRENT": "Está é a sua versão", + "MANAGER_VERSION_SUCCESS": "O IW4MAdmin está atualizado", + "MANAGER_INIT_FAIL": "Erro fatal durante a inicialização", + "MANAGER_EXIT": "Pressione qualquer tecla para sair...", + "MANAGER_SHUTDOWN_SUCCESS": "Desligamento concluído", + "MANAGER_MONITORING_TEXT": "Agora monitorando", + "MANAGER_CONNECTION_REST": "A conexão foi reestabelecida com", + "SETUP_ENABLE_WEBFRONT": "Habilitar o módulo da web do IW4MAdmin", + "SETUP_ENABLE_MULTIOWN": "Ativar vários proprietários", + "SETUP_ENABLE_STEPPEDPRIV": "Ativar hierarquia de privilégios escalonada", + "SETUP_ENABLE_CUSTOMSAY": "Habilitar a customização do nome do comando say", + "SETUP_SAY_NAME": "Digite o nome customizado do comando say", + "SETUP_USE_CUSTOMENCODING": "Usar o analisador de codificação customizado", + "SETUP_ENCODING_STRING": "Digite a string de codificação", + "SETUP_ENABLE_VPNS": "Habilitar que os usuários usem VPN", + "SETUP_IPHUB_KEY": "Digite iphub.info api key", + "SETUP_DISPLAY_DISCORD": "Exibir link do Discord no módulo de web", + "SETUP_DISCORD_INVITE": "Digitar link do convite do Discord", + "SETUP_SERVER_USET6M": "Usar Pluto T6 parser", + "SETUP_SERVER_USEIW5M": "Usar Pluto IW5 Parser", + "SETUP_SERVER_MANUALLOG": "Insira o caminho do arquivo de log manualmente", + "SETUP_SERVER_IP": "Digite o endereço IP do servidor", + "SETUP_SERVER_PORT": "Digite a porta do servidor", + "SETUP_SERVER_RCON": "Digite a senha do RCon do servidor", + "SETUP_SERVER_SAVE": "Configuração salva, adicionar outra", + "SERVER_ERROR_DNE": "não existe", + "SERVER_ERROR_LOG": "Log do jogo inválido", + "SERVER_ERROR_COMMAND_INGAME": "Ocorreu um erro interno ao processar seu comando", + "SERVER_ERROR_COMMAND_LOG": "o comando gerou um erro", + "SERVER_ERROR_UNFIXABLE": "Não monitorando o servidor devido a erros incorrigíveis", + "SERVER_ERROR_DVAR": "Não foi possível obter o valor de dvar para", + "SERVER_ERROR_DVAR_HELP": "garanta que o servidor tenha um mapa carregado", + "SERVER_ERROR_PLUGIN": "Ocorreu um erro ao carregar o plug-in", + "SERVER_ERROR_ADDPLAYER": "Não foi possível adicionar o jogador", + "SERVER_ERROR_POLLING": "reduzir a taxa de sondagem do server", + "SERVER_ERROR_COMMUNICATION": "Não foi possível fazer a comunicação com", + "SERVER_ERROR_EXCEPTION": "Exceção inesperada em", + "SERVER_KICK_VPNS_NOTALLOWED": "VPNs não são permitidas neste servidor", + "SERVER_KICK_TEXT": "Você foi expulso", + "SERVER_KICK_MINNAME": "Seu nome deve conter no mínimo três caracteres", + "SERVER_KICK_NAME_INUSE": "Seu nome já está sendo usado por outra pessoa", + "SERVER_KICK_GENERICNAME": "Por favor, mude o seu nome usando o comando /name no console", + "SERVER_KICK_CONTROLCHARS": "Seu nome não pode conter caracteres de controle", + "SERVER_TB_TEXT": "Você está banido temporariamente", + "SERVER_TB_REMAIN": "Você está banido temporariamente", + "SERVER_BAN_TEXT": "Você está banido", + "SERVER_BAN_PREV": "Banido preventivamente por", + "SERVER_BAN_APPEAL": "apele em", + "SERVER_REPORT_COUNT": "Você tem ^5{0} ^7denúncias recentes", + "SERVER_WARNLIMT_REACHED": "Avisos demais! Leia o chat da próxima vez", + "SERVER_WARNING": "AVISO", + "SERVER_WEBSITE_GENERIC": "este é o site do servidor", + "BROADCAST_ONLINE": "^5IW4MADMIN ^7agora está ^2ONLINE", + "BROADCAST_OFFLINE": "IW4MAdmin ficou offline", + "COMMAND_HELP_SYNTAX": "sintaxe:", + "COMMAND_HELP_OPTIONAL": "opcional", + "COMMAND_UNKNOWN": "Você digitou um comando desconhecido", + "COMMAND_NOACCESS": "Você não tem acesso a este comando", + "COMMAND_NOTAUTHORIZED": "Você não está autorizado a executar este comando", + "COMMAND_MISSINGARGS": "Não foram oferecidos argumentos suficientes", + "COMMAND_TARGET_MULTI": "Vários jogadores correspondem a esse nome", + "COMMAND_TARGET_NOTFOUND": "Não é possível encontrar o jogador especificado", + "PLUGIN_IMPORTER_NOTFOUND": "Não foram encontrados plugins para carregar", + "PLUGIN_IMPORTER_REGISTERCMD": "Comando registrado", + "COMMANDS_OWNER_SUCCESS": "Parabéns, você reivindicou a propriedade deste servidor!", + "COMMANDS_OWNER_FAIL": "Este servidor já tem um dono", + "COMMANDS_WARN_FAIL": "Você não tem os privilégios necessários para fazer o Aviso", + "COMMANDS_WARNCLEAR_SUCCESS": "Todos os avisos foram apagados para", + "COMMANDS_KICK_SUCCESS": "foi expulso", + "COMMANDS_KICK_FAIL": "Você não tem os privilégios necessários para expulsar", + "COMMANDS_TEMPBAN_SUCCESS": "foi banido temporariamente por", + "COMMANDS_TEMPBAN_FAIL": "Você não pode banir temporariamente", + "COMMANDS_BAN_SUCCESS": "foi banido permanentemente", + "COMMANDS_BAN_FAIL": "Você não pode banir de maneira permanente", + "COMMANDS_UNBAN_SUCCESS": "Foi retirado o banimento com sucesso", + "COMMANDS_UNBAN_FAIL": "não está banido", + "COMMANDS_HELP_NOTFOUND": "Não foi possível encontrar esse comando", + "COMMANDS_HELP_MOREINFO": "Digite !help para saber como usar o comando", + "COMMANDS_FASTRESTART_UNMASKED": "reiniciou rapidamente o mapa", + "COMMANDS_FASTRESTART_MASKED": "O mapa foi reiniciado rapidamente", + "COMMANDS_MAPROTATE": "Rotacionando o mapa em ^55 ^7segundos", + "COMMANDS_SETLEVEL_SELF": "Você não pode mudar seu próprio nível", + "COMMANDS_SETLEVEL_OWNER": "Só pode haver 1 dono. Modifique suas configurações se vários proprietários forem necessários", + "COMMANDS_SETLEVEL_STEPPEDDISABLED": "Este servidor não permite que você promova", + "COMMANDS_SETLEVEL_LEVELTOOHIGH": "Você só pode promover do ^5{0} ^7para ^5{1} ^7ou um nível menor", + "COMMANDS_SETLEVEL_SUCCESS_TARGET": "Parabéns! Você foi promovido para", + "COMMANDS_SETLEVEL_SUCCESS": "foi promovido com sucesso", + "COMMANDS_SETLEVEL_FAIL": "grupo especificado inválido", + "COMMANDS_ADMINS_NONE": "Sem administradores visíveis online", + "COMMANDS_MAP_SUCCESS": "Mudando o mapa para", + "COMMANDS_MAP_UKN": "Tentando mudar para o mapa desconhecido", + "COMMANDS_FIND_MIN": "Por favor, insira pelo menos 3 caracteres", + "COMMANDS_FIND_EMPTY": "Nenhum jogador foi encontrado", + "COMMANDS_RULES_NONE": "O proprietário do servidor não definiu nenhuma regra, sinta-se livre", + "COMMANDS_FLAG_SUCCESS": "Você sinalizou", + "COMMANDS_FLAG_UNFLAG": "Você tirou a sinalização de", + "COMMANDS_FLAG_FAIL": "Você não pode sinalizar", + "COMMANDS_REPORT_FAIL_CAMP": "Você não pode denunciar o jogador por camperar", + "COMMANDS_REPORT_FAIL_DUPLICATE": "Você já denunciou o jogador", + "COMMANDS_REPORT_FAIL_SELF": "Você não pode se reportar", + "COMMANDS_REPORT_FAIL": "Você não pode reportar", + "COMMANDS_REPORT_SUCCESS": "Obrigado pela sua denúncia, um administrador foi notificado", + "COMMANDS_REPORTS_CLEAR_SUCCESS": "Lista de denúncias limpa com sucesso", + "COMMANDS_REPORTS_NONE": "Ninguém foi denunciado ainda", + "COMMANDS_MASK_ON": "Você foi mascarado", + "COMMANDS_MASK_OFF": "Você foi desmascarado", + "COMMANDS_BANINFO_NONE": "Nenhum banimento ativo foi encontrado para esse jogador", + "COMMANDS_BANINO_SUCCESS": "foi banido por ^5{0} ^7por:", + "COMMANDS_ALIAS_ALIASES": "Nomes registrados", + "COMMANDS_ALIAS_IPS": "IPs", + "COMMANDS_RCON_SUCCESS": "O comando para o RCon foi enviado com sucesso", + "COMMANDS_PLUGINS_LOADED": "Plugins carregados", + "COMMANDS_IP_SUCCESS": "Seu endereço IP externo é", + "COMMANDS_PRUNE_FAIL": "Número inválido de dias ativo", + "COMMANDS_PRUNE_SUCCESS": "usuários privilegiados inativos foram removidos", + "COMMANDS_PASSWORD_FAIL": "Sua senha deve ter pelo menos 5 caracteres", + "COMMANDS_PASSWORD_SUCCESS": "Sua senha foi configurada com sucesso", + "COMMANDS_PING_TARGET": "latência é", + "COMMANDS_PING_SELF": "Sua latência é", + "COMMANDS_QUIT_DESC": "sair do IW4MAdmin", + "COMMANDS_OWNER_DESC": "reivindicar a propriedade do servidor", + "COMMANDS_WARN_DESC": "avisa o cliente por infringir regras", + "COMMANDS_WARNCLEAR_DESC": "remove todos os avisos para um cliente", + "COMMANDS_KICK_DESC": "expulsa o cliente pelo nome", + "COMMANDS_SAY_DESC": "transmite mensagem para todos os clientes", + "COMMANDS_TEMPBAN_DESC": "bane temporariamente um cliente por tempo especificado (o padrão é 1 hora)", + "COMMANDS_BAN_DESC": "banir permanentemente um cliente do servidor", + "COMMANDS_UNBAN_DESC": "retira o ban de um jogador pelo seu ID", + "COMMANDS_WHO_DESC": "dá informações sobre você", + "COMMANDS_LIST_DESC": "lista os jogadores ativos na partida", + "COMMANDS_HELP_DESC": "lista todos os comandos disponíveis", + "COMMANDS_FASTRESTART_DESC": "reinicializa rapidamente o mapa, não recomendável o uso várias vezes seguidas", + "COMMANDS_MAPROTATE_DESC": "avança para o próximo mapa da rotação", + "COMMANDS_SETLEVEL_DESC": "define o jogador para o nível de privilégio especificado", + "COMMANDS_USAGE_DESC": "vê quanto o aplicativo está usando de memória ram do seu computador", + "COMMANDS_USAGE_TEXT": "está usando", + "COMMANDS_UPTIME_DESC": "obtém o tempo de execução do aplicativo a quando aberto", + "COMMANDS_UPTIME_TEXT": "está online por", + "COMMANDS_ADMINS_DESC": "lista os clientes privilegiados conectados no momento", + "COMMANDS_MAP_DESC": "muda para o mapa especificado", + "COMMANDS_FIND_DESC": "acha o jogador na base de dados", + "COMMANDS_RULES_DESC": "lista as regras do servidor", + "COMMANDS_PM_DESC": "envia a mensagem para o outro jogador de maneira privada, use /!pm para ter efeito, se possível", + "COMMANDS_FLAG_DESC": "sinaliza um cliente suspeito e anuncia aos administradores ao entrar no servidor", + "COMMANDS_REPORT_DESC": "denuncia o jogador por comportamento suspeito", + "COMMANDS_REPORTS_DESC": "obtém ou limpa as denúncias recentes", + "COMMANDS_MASK_DESC": "esconda sua presença como um cliente privilegiado", + "COMMANDS_BANINFO_DESC": "obtém informações sobre um banimento para um jogador", + "COMMANDS_ALIAS_DESC": "obtém a lista de histórico de nomes que o jogador usou no servidor", + "COMMANDS_RCON_DESC": "envia o comando Rcon para o servidor", + "COMMANDS_PLUGINS_DESC": "mostra todos os plugins que estão carregados", + "COMMANDS_IP_DESC": "mostra o seu endereço IP externo", + "COMMANDS_PRUNE_DESC": "rebaixa qualquer cliente privilegiado que não tenha se conectado recentemente (o padrão é 30 dias)", + "COMMANDS_SETPASSWORD_DESC": "define sua senha de autenticação", + "COMMANDS_PING_DESC": "mostra o quanto de latência tem o jogador", + "COMMANDS_ARGS_PLAYER": "jogador", + "COMMANDS_ARGS_REASON": "razão", + "COMMANDS_ARGS_MESSAGE": "mensagem", + "COMMANDS_ARGS_DURATION": "duração (minutos|horas|dias|semanas|anos)", + "COMMANDS_ARGS_CLIENTID": "id do jogador", + "COMMANDS_ARGS_COMMANDS": "comandos", + "COMMANDS_ARGS_LEVEL": "nível", + "COMMANDS_ARGS_MAP": "mapa", + "COMMANDS_ARGS_CLEAR": "limpar", + "COMMANDS_ARGS_INACTIVE": "dias inativos", + "COMMANDS_ARGS_PASSWORD": "senha", + "PLUGINS_LOGIN_COMMANDS_LOGIN_DESC": "Logar-se usando a senha", + "PLUGINS_LOGIN_COMMANDS_LOGIN_SUCCESS": "Você agora está logado", + "PLUGINS_LOGIN_COMMANDS_LOGIN_FAIL": "Sua senha está errada", + "PLUGINS_STATS_COMMANDS_RESET_DESC": "reinicia suas estatísticas para uma nova", + "PLUGINS_STATS_COMMANDS_RESET_SUCCESS": "Suas estatísticas nesse servidor foram reiniciadas", + "PLUGINS_STATS_COMMANDS_RESET_FAIL": "Você deve estar conectado a um servidor para reiniciar as suas estatísticas", + "PLUGINS_STATS_COMMANDS_VIEW_DESC": "mostra suas estatísticas", + "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME": "o jogador especificado deve estar jogando", + "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME_SELF": "Você deve estar no jogo para ver suas estatísticas", + "PLUGINS_STATS_COMMANDS_VIEW_FAIL": "Não foi encontrado o jogador que você especificou", + "PLUGINS_STATS_COMMANDS_VIEW_SUCCESS": "Estatísticas para", + "PLUGINS_STATS_COMMANDS_TOP_DESC": "visualiza os 5 melhores jogadores do servidor", + "PLUGINS_STATS_COMMANDS_TOP_TEXT": "Top Jogadores", + "PLUGINS_STATS_TEXT_KILLS": "BAIXAS", + "PLUGINS_STATS_TEXT_DEATHS": "MORTES", + "PLUGINS_STATS_TEXT_SKILL": "HABILIDADE", + "GLOBAL_DAYS": "dias", + "GLOBAL_HOURS": "horas", + "GLOBAL_MINUTES": "minutos", + "GLOBAL_REPORT": "Se você está suspeitando alguém de alguma ^5TRAPAÇA ^7use o comando ^5!report", + "GLOBAL_ERROR": "Erro", + "GLOBAL_WARNING": "AVISO", + "GLOBAL_INFO": "Informação", + "GLOBAL_VERBOSE": "Verbose", + + "MANAGER_CONSOLE_NOSERV": "Nenhum servidor está sendo monitorado no momento", + "SERVER_PLUGIN_ERROR": "Um plugin gerou um erro", + "PLUGINS_STATS_TEXT_NOQUALIFY": "Não há ainda jogadores qualificados para as melhores estatísticas" + } + } +} diff --git a/Application/Localization/IW4MAdmin.pt-PT.json b/Application/Localization/IW4MAdmin.pt-PT.json deleted file mode 100644 index 570c64402..000000000 --- a/Application/Localization/IW4MAdmin.pt-PT.json +++ /dev/null @@ -1,197 +0,0 @@ -{ - "LocalizationName": "pt-BR", - "LocalizationSet": { - "MANAGER_VERSION_FAIL": "Não foi possível obter a versão mais recente do IW4MAdmin", - "MANAGER_VERSION_UPDATE": "Há uma atualização disponível. A versão mais recente é", - "MANAGER_VERSION_CURRENT": "Está é a sua versão", - "MANAGER_VERSION_SUCCESS": "O IW4MAdmin está atualizado", - "MANAGER_INIT_FAIL": "Erro fatal durante a inicialização", - "MANAGER_EXIT": "Pressione qualquer tecla para sair...", - "MANAGER_SHUTDOWN_SUCCESS": "Desligamento concluído", - "MANAGER_MONITORING_TEXT": "Agora monitorando", - "MANAGER_CONNECTION_REST": "A conexão foi reestabelecida com", - "SETUP_ENABLE_WEBFRONT": "Habilitar o módulo da web do IW4MAdmin", - "SETUP_ENABLE_MULTIOWN": "Ativar vários proprietários", - "SETUP_ENABLE_STEPPEDPRIV": "Ativar hierarquia de privilégios escalonada", - "SETUP_ENABLE_CUSTOMSAY": "Habilitar a customização do nome do comando say", - "SETUP_SAY_NAME": "Digite o nome customizado do comando say", - "SETUP_USE_CUSTOMENCODING": "Usar o analisador de codificação customizado", - "SETUP_ENCODING_STRING": "Digite a string de codificação", - "SETUP_ENABLE_VPNS": "Habilitar que os usuários usem VPN", - "SETUP_IPHUB_KEY": "Digite iphub.info api key", - "SETUP_DISPLAY_DISCORD": "Exibir link do Discord no módulo de web", - "SETUP_DISCORD_INVITE": "Digitar link do convite do Discord", - "SETUP_SERVER_USET6M": "Usar Pluto T6 parser", - "SETUP_SERVER_USEIW5M": "Usar Pluto IW5 Parser", - "SETUP_SERVER_MANUALLOG": "Insira o caminho do arquivo de log manualmente", - "SETUP_SERVER_IP": "Digite o endereço IP do servidor", - "SETUP_SERVER_PORT": "Digite a porta do servidor", - "SETUP_SERVER_RCON": "Digite a senha do RCon do servidor", - "SETUP_SERVER_SAVE": "Configuração salva, adicionar outra", - "SERVER_ERROR_DNE": "não existe", - "SERVER_ERROR_LOG": "Log do jogo inválido", - "SERVER_ERROR_COMMAND_INGAME": "Ocorreu um erro interno ao processar seu comando", - "SERVER_ERROR_COMMAND_LOG": "o comando gerou um erro", - "SERVER_ERROR_UNFIXABLE": "Não monitorando o servidor devido a erros incorrigíveis", - "SERVER_ERROR_DVAR": "Não foi possível obter o valor de dvar para", - "SERVER_ERROR_DVAR_HELP": "garanta que o servidor tenha um mapa carregado", - "SERVER_ERROR_PLUGIN": "Ocorreu um erro ao carregar o plug-in", - "SERVER_ERROR_ADDPLAYER": "Não foi possível adicionar o jogador", - "SERVER_ERROR_POLLING": "reduzir a taxa de sondagem do server", - "SERVER_ERROR_COMMUNICATION": "Não foi possível fazer a comunicação com", - "SERVER_ERROR_EXCEPTION": "Exceção inesperada em", - "SERVER_KICK_VPNS_NOTALLOWED": "VPNs não são permitidas neste servidor", - "SERVER_KICK_TEXT": "Você foi expulso", - "SERVER_KICK_MINNAME": "Seu nome deve conter no mínimo três caracteres", - "SERVER_KICK_NAME_INUSE": "Seu nome já está sendo usado por outra pessoa", - "SERVER_KICK_GENERICNAME": "Por favor, mude o seu nome usando o comando /name no console", - "SERVER_KICK_CONTROLCHARS": "Seu nome não pode conter caracteres de controle", - "SERVER_TB_TEXT": "Você está banido temporariamente", - "SERVER_TB_REMAIN": "Você está banido temporariamente", - "SERVER_BAN_TEXT": "Você está banido", - "SERVER_BAN_PREV": "Banido preventivamente por", - "SERVER_BAN_APPEAL": "apele em", - "SERVER_REPORT_COUNT": "Você tem ^5{0} ^7denúncias recentes", - "SERVER_WARNLIMT_REACHED": "Avisos demais! Leia o chat da próxima vez", - "SERVER_WARNING": "AVISO", - "SERVER_WEBSITE_GENERIC": "este é o site do servidor", - "BROADCAST_ONLINE": "^5IW4MADMIN ^7agora está ^2ONLINE", - "BROADCAST_OFFLINE": "IW4MAdmin ficou offline", - "COMMAND_HELP_SYNTAX": "sintaxe:", - "COMMAND_HELP_OPTIONAL": "opcional", - "COMMAND_UNKNOWN": "Você digitou um comando desconhecido", - "COMMAND_NOACCESS": "Você não tem acesso a este comando", - "COMMAND_NOTAUTHORIZED": "Você não está autorizado a executar este comando", - "COMMAND_MISSINGARGS": "Não foram oferecidos argumentos suficientes", - "COMMAND_TARGET_MULTI": "Vários jogadores correspondem a esse nome", - "COMMAND_TARGET_NOTFOUND": "Não é possível encontrar o jogador especificado", - "PLUGIN_IMPORTER_NOTFOUND": "Não foram encontrados plugins para carregar", - "PLUGIN_IMPORTER_REGISTERCMD": "Comando registrado", - "COMMANDS_OWNER_SUCCESS": "Parabéns, você reivindicou a propriedade deste servidor!", - "COMMANDS_OWNER_FAIL": "Este servidor já tem um dono", - "COMMANDS_WARN_FAIL": "Você não tem os privilégios necessários para fazer o Aviso", - "COMMANDS_WARNCLEAR_SUCCESS": "Todos os avisos foram apagados para", - "COMMANDS_KICK_SUCCESS": "foi expulso", - "COMMANDS_KICK_FAIL": "Você não tem os privilégios necessários para expulsar", - "COMMANDS_TEMPBAN_SUCCESS": "foi banido temporariamente por", - "COMMANDS_TEMPBAN_FAIL": "Você não pode banir temporariamente", - "COMMANDS_BAN_SUCCESS": "foi banido permanentemente", - "COMMANDS_BAN_FAIL": "Você não pode banir de maneira permanente", - "COMMANDS_UNBAN_SUCCESS": "Foi retirado o banimento com sucesso", - "COMMANDS_UNBAN_FAIL": "não está banido", - "COMMANDS_HELP_NOTFOUND": "Não foi possível encontrar esse comando", - "COMMANDS_HELP_MOREINFO": "Digite !help para saber como usar o comando", - "COMMANDS_FASTRESTART_UNMASKED": "reiniciou rapidamente o mapa", - "COMMANDS_FASTRESTART_MASKED": "O mapa foi reiniciado rapidamente", - "COMMANDS_MAPROTATE": "Rotacionando o mapa em ^55 ^7segundos", - "COMMANDS_SETLEVEL_SELF": "Você não pode mudar seu próprio nível", - "COMMANDS_SETLEVEL_OWNER": "Só pode haver 1 dono. Modifique suas configurações se vários proprietários forem necessários", - "COMMANDS_SETLEVEL_STEPPEDDISABLED": "Este servidor não permite que você promova", - "COMMANDS_SETLEVEL_LEVELTOOHIGH": "Você só pode promover do ^5{0} ^7para ^5{1} ^7ou um nível menor", - "COMMANDS_SETLEVEL_SUCCESS_TARGET": "Parabéns! Você foi promovido para", - "COMMANDS_SETLEVEL_SUCCESS": "foi promovido com sucesso", - "COMMANDS_SETLEVEL_FAIL": "grupo especificado inválido", - "COMMANDS_ADMINS_NONE": "Sem administradores visíveis online", - "COMMANDS_MAP_SUCCESS": "Mudando o mapa para", - "COMMANDS_MAP_UKN": "Tentando mudar para o mapa desconhecido", - "COMMANDS_FIND_MIN": "Por favor, insira pelo menos 3 caracteres", - "COMMANDS_FIND_EMPTY": "Nenhum jogador foi encontrado", - "COMMANDS_RULES_NONE": "O proprietário do servidor não definiu nenhuma regra, sinta-se livre", - "COMMANDS_FLAG_SUCCESS": "Você sinalizou", - "COMMANDS_FLAG_UNFLAG": "Você tirou a sinalização de", - "COMMANDS_FLAG_FAIL": "Você não pode sinalizar", - "COMMANDS_REPORT_FAIL_CAMP": "Você não pode denunciar o jogador por camperar", - "COMMANDS_REPORT_FAIL_DUPLICATE": "Você já denunciou o jogador", - "COMMANDS_REPORT_FAIL_SELF": "Você não pode se reportar", - "COMMANDS_REPORT_FAIL": "Você não pode reportar", - "COMMANDS_REPORT_SUCCESS": "Obrigado pela sua denúncia, um administrador foi notificado", - "COMMANDS_REPORTS_CLEAR_SUCCESS": "Lista de denúncias limpa com sucesso", - "COMMANDS_REPORTS_NONE": "Ninguém foi denunciado ainda", - "COMMANDS_MASK_ON": "Você foi mascarado", - "COMMANDS_MASK_OFF": "Você foi desmascarado", - "COMMANDS_BANINFO_NONE": "Nenhum banimento ativo foi encontrado para esse jogador", - "COMMANDS_BANINO_SUCCESS": "foi banido por ^5{0} ^7por:", - "COMMANDS_ALIAS_ALIASES": "Nomes registrados", - "COMMANDS_ALIAS_IPS": "IPs", - "COMMANDS_RCON_SUCCESS": "O comando para o RCon foi enviado com sucesso", - "COMMANDS_PLUGINS_LOADED": "Plugins carregados", - "COMMANDS_IP_SUCCESS": "Seu endereço IP externo é", - "COMMANDS_PRUNE_FAIL": "Número inválido de dias ativo", - "COMMANDS_PRUNE_SUCCESS": "usuários privilegiados inativos foram removidos", - "COMMANDS_PASSWORD_FAIL": "Sua senha deve ter pelo menos 5 caracteres", - "COMMANDS_PASSWORD_SUCCESS": "Sua senha foi configurada com sucesso", - "COMMANDS_PING_TARGET": "latência é", - "COMMANDS_PING_SELF": "Sua latência é", - "COMMANDS_QUIT_DESC": "sair do IW4MAdmin", - "COMMANDS_OWNER_DESC": "reivindicar a propriedade do servidor", - "COMMANDS_WARN_DESC": "avisa o cliente por infringir regras", - "COMMANDS_WARNCLEAR_DESC": "remove todos os avisos para um cliente", - "COMMANDS_KICK_DESC": "expulsa o cliente pelo nome", - "COMMANDS_SAY_DESC": "transmite mensagem para todos os clientes", - "COMMANDS_TEMPBAN_DESC": "bane temporariamente um cliente por tempo especificado (o padrão é 1 hora)", - "COMMANDS_BAN_DESC": "banir permanentemente um cliente do servidor", - "COMMANDS_UNBAN_DESC": "retira o ban de um jogador pelo seu ID", - "COMMANDS_WHO_DESC": "dá informações sobre você", - "COMMANDS_LIST_DESC": "lista os jogadores ativos na partida", - "COMMANDS_HELP_DESC": "lista todos os comandos disponíveis", - "COMMANDS_FASTRESTART_DESC": "reinicializa rapidamente o mapa, não recomendável o uso várias vezes seguidas", - "COMMANDS_MAPROTATE_DESC": "avança para o próximo mapa da rotação", - "COMMANDS_SETLEVEL_DESC": "define o jogador para o nível de privilégio especificado", - "COMMANDS_USAGE_DESC": "vê quanto o aplicativo está usando de memória ram do seu computador", - "COMMANDS_USAGE_TEXT": "está usando", - "COMMANDS_UPTIME_DESC": "obtém o tempo de execução do aplicativo a quando aberto", - "COMMANDS_UPTIME_TEXT": "está online por", - "COMMANDS_ADMINS_DESC": "lista os clientes privilegiados conectados no momento", - "COMMANDS_MAP_DESC": "muda para o mapa especificado", - "COMMANDS_FIND_DESC": "acha o jogador na base de dados", - "COMMANDS_RULES_DESC": "lista as regras do servidor", - "COMMANDS_PM_DESC": "envia a mensagem para o outro jogador de maneira privada, use /!pm para ter efeito, se possível", - "COMMANDS_FLAG_DESC": "sinaliza um cliente suspeito e anuncia aos administradores ao entrar no servidor", - "COMMANDS_REPORT_DESC": "denuncia o jogador por comportamento suspeito", - "COMMANDS_REPORTS_DESC": "obtém ou limpa as denúncias recentes", - "COMMANDS_MASK_DESC": "esconda sua presença como um cliente privilegiado", - "COMMANDS_BANINFO_DESC": "obtém informações sobre um banimento para um jogador", - "COMMANDS_ALIAS_DESC": "obtém a lista de histórico de nomes que o jogador usou no servidor", - "COMMANDS_RCON_DESC": "envia o comando Rcon para o servidor", - "COMMANDS_PLUGINS_DESC": "mostra todos os plugins que estão carregados", - "COMMANDS_IP_DESC": "mostra o seu endereço IP externo", - "COMMANDS_PRUNE_DESC": "rebaixa qualquer cliente privilegiado que não tenha se conectado recentemente (o padrão é 30 dias)", - "COMMANDS_SETPASSWORD_DESC": "define sua senha de autenticação", - "COMMANDS_PING_DESC": "mostra o quanto de latência tem o jogador", - "COMMANDS_ARGS_PLAYER": "jogador", - "COMMANDS_ARGS_REASON": "razão", - "COMMANDS_ARGS_MESSAGE": "mensagem", - "COMMANDS_ARGS_DURATION": "duração (minutos|horas|dias|semanas|anos)", - "COMMANDS_ARGS_CLIENTID": "id do jogador", - "COMMANDS_ARGS_COMMANDS": "comandos", - "COMMANDS_ARGS_LEVEL": "nível", - "COMMANDS_ARGS_MAP": "mapa", - "COMMANDS_ARGS_CLEAR": "limpar", - "COMMANDS_ARGS_INACTIVE": "dias inativos", - "COMMANDS_ARGS_PASSWORD": "senha", - "PLUGINS_LOGIN_COMMANDS_LOGIN_DESC": "Logar-se usando a senha", - "PLUGINS_LOGIN_COMMANDS_LOGIN_SUCCESS": "Você agora está logado", - "PLUGINS_LOGIN_COMMANDS_LOGIN_FAIL": "Sua senha está errada", - "PLUGINS_STATS_COMMANDS_RESET_DESC": "reinicia suas estatísticas para uma nova", - "PLUGINS_STATS_COMMANDS_RESET_SUCCESS": "Suas estatísticas nesse servidor foram reiniciadas", - "PLUGINS_STATS_COMMANDS_RESET_FAIL": "Você deve estar conectado a um servidor para reiniciar as suas estatísticas", - "PLUGINS_STATS_COMMANDS_VIEW_DESC": "mostra suas estatísticas", - "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME": "o jogador especificado deve estar jogando", - "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME_SELF": "Você deve estar no jogo para ver suas estatísticas", - "PLUGINS_STATS_COMMANDS_VIEW_FAIL": "Não foi encontrado o jogador que você especificou", - "PLUGINS_STATS_COMMANDS_VIEW_SUCCESS": "Estatísticas para", - "PLUGINS_STATS_COMMANDS_TOP_DESC": "visualiza os 5 melhores jogadores do servidor", - "PLUGINS_STATS_COMMANDS_TOP_TEXT": "Top Jogadores", - "PLUGINS_STATS_TEXT_KILLS": "BAIXAS", - "PLUGINS_STATS_TEXT_DEATHS": "MORTES", - "PLUGINS_STATS_TEXT_SKILL": "HABILIDADE", - "GLOBAL_DAYS": "dias", - "GLOBAL_HOURS": "horas", - "GLOBAL_MINUTES": "minutos", - "GLOBAL_REPORT": "Se você está suspeitando alguém de alguma ^5TRAPAÇA ^7use o comando ^5!report", - "GLOBAL_ERROR": "Erro", - "GLOBAL_WARNING": "AVISO", - "GLOBAL_INFO": "Informação", - "GLOBAL_VERBOSE": "Verbose" - } -} diff --git a/Application/Localization/IW4MAdmin.ru-RU.json b/Application/Localization/IW4MAdmin.ru-RU.json index 60d9430a5..8b635752b 100644 --- a/Application/Localization/IW4MAdmin.ru-RU.json +++ b/Application/Localization/IW4MAdmin.ru-RU.json @@ -1,197 +1,203 @@ { "LocalizationName": "ru-RU", - "LocalizationSet": { - "MANAGER_VERSION_FAIL": "Не удалось получить последнюю версию IW4MAdmin", - "MANAGER_VERSION_UPDATE": "- есть обновление. Последняя версия:", - "MANAGER_VERSION_CURRENT": "Ваша версия:", - "MANAGER_VERSION_SUCCESS": "IW4MAdmin обновлен", - "MANAGER_INIT_FAIL": "Критическая ошибка во время инициализации", - "MANAGER_EXIT": "Нажмите любую клавишу, чтобы выйти...", - "SETUP_ENABLE_WEBFRONT": "Включить веб-интерфейс", - "SETUP_ENABLE_MULTIOWN": "Включить поддержку нескольких владельцев", - "SETUP_ENABLE_STEPPEDPRIV": "Включить последовательную иерархию прав", - "SETUP_ENABLE_CUSTOMSAY": "Включить кастомное имя для чата", - "SETUP_SAY_NAME": "Введите кастомное имя для чата", - "SETUP_USE_CUSTOMENCODING": "Использовать кастомную кодировку парсера", - "SETUP_ENCODING_STRING": "Введите кодировку", - "SETUP_ENABLE_VPNS": "Включить поддержку VPN у игроков", - "SETUP_IPHUB_KEY": "Введите iphub.info api-ключ", - "SETUP_DISPLAY_DISCORD": "Отображать ссылку на Discord в веб-интерфейсе", - "SETUP_DISCORD_INVITE": "Введите ссылку-приглашение в Discord", - "SETUP_SERVER_USET6M": "Использовать Pluto T6 парсер", - "SETUP_SERVER_USEIW5M": "Использовать парсер Pluto IW5", - "SETUP_SERVER_MANUALLOG": "Введите путь для лог-файла", - "SETUP_SERVER_IP": "Введите IP-адрес сервера", - "SETUP_SERVER_PORT": "Введите порт сервера", - "SETUP_SERVER_RCON": "Введите RCon пароль сервера", - "SETUP_SERVER_SAVE": "Настройки сохранены, добавить", - "SERVER_KICK_VPNS_NOTALLOWED": "Использование VPN не разрешено на этом сервере", - "SERVER_KICK_TEXT": "Вы были исключены", - "SERVER_KICK_MINNAME": "Ваше имя должно содержать хотя бы 3 символа", - "SERVER_KICK_NAME_INUSE": "Ваше имя используется кем-то другим", - "SERVER_KICK_GENERICNAME": "Пожалуйста, смените ваше имя, используя /name", - "SERVER_KICK_CONTROLCHARS": "Ваше имя не должно содержать спецсимволы", - "SERVER_TB_TEXT": "Вы временно забанены", - "SERVER_TB_REMAIN": "Вы временно забанены", - "SERVER_BAN_TEXT": "Вы забанены", - "SERVER_BAN_PREV": "Ранее забанены за", - "SERVER_BAN_APPEAL": "оспорить:", - "SERVER_REPORT_COUNT": "Имеется ^5{0} ^7жалоб за последнее время", - "SERVER_WARNLIMT_REACHED": "Слишком много предупреждений", - "SERVER_WARNING": "Предупреждение", - "SERVER_WEBSITE_GENERIC": "веб-сайт этого сервера", - "BROADCAST_ONLINE": "^5IW4MADMIN ^7сейчас СЕТИ", - "BROADCAST_OFFLINE": "IW4MAdmin отключается", - "COMMAND_HELP_SYNTAX": "синтаксис:", - "COMMAND_HELP_OPTIONAL": "опционально", - "COMMAND_UNKNOWN": "Вы ввели неизвестную команду", - "COMMAND_NOACCESS": "У вас нет доступа к этой команде", - "COMMAND_NOTAUTHORIZED": "Вы не авторизованы для исполнения этой команды", - "COMMAND_MISSINGARGS": "Недостаточно аргументов приведено", - "COMMAND_TARGET_MULTI": "Несколько игроков соответствуют этому имени", - "COMMAND_TARGET_NOTFOUND": "Невозможно найти указанного игрока", - "PLUGIN_IMPORTER_NOTFOUND": "Не найдено плагинов для загрузки", - "PLUGIN_IMPORTER_REGISTERCMD": "Зарегистрированная команда", - "COMMANDS_OWNER_SUCCESS": "Поздравления, вы утвердили владение этим сервером!", - "COMMANDS_OWNER_FAIL": "Этот сервер уже имеет владельца", - "COMMANDS_WARN_FAIL": "У вас недостаточно прав, чтобы выносить предупреждения", - "COMMANDS_WARNCLEAR_SUCCESS": "Все предупреждения очищены за", - "COMMANDS_KICK_SUCCESS": "был исключен", - "COMMANDS_KICK_FAIL": "У вас нет достаточных прав, чтобы исключать", - "COMMANDS_TEMPBAN_SUCCESS": "был временно забанен за", - "COMMANDS_TEMPBAN_FAIL": "Вы не можете выдавать временный бан", - "COMMANDS_BAN_SUCCESS": "был забанен навсегда", - "COMMANDS_BAN_FAIL": "Вы не можете выдавать бан", - "COMMANDS_UNBAN_SUCCESS": "Успешно разбанен", - "COMMANDS_UNBAN_FAIL": "не забанен", - "COMMANDS_HELP_NOTFOUND": "Не удалось найти эту команду", - "COMMANDS_HELP_MOREINFO": "Введите !help <имя команды>, чтобы узнать синтаксис для использования команды", - "COMMANDS_FASTRESTART_UNMASKED": "перезапустил карту", - "COMMANDS_FASTRESTART_MASKED": "Карта была перезапущена", - "COMMANDS_MAPROTATE": "Смена карты через ^55 ^7секунд", - "COMMANDS_SETLEVEL_SELF": "Вы не можете изменить свой уровень", - "COMMANDS_SETLEVEL_OWNER": "Может быть только 1 владелец. Измените настройки, если требуется несколько владельцов", - "COMMANDS_SETLEVEL_STEPPEDDISABLED": "Этот сервер не разрешает вам повыситься", - "COMMANDS_SETLEVEL_LEVELTOOHIGH": "Вы только можете повысить ^5{0} ^7до ^5{1} ^7или понизиться в правах", - "COMMANDS_SETLEVEL_SUCCESS_TARGET": "Поздравления! Вы были повышены до", - "COMMANDS_SETLEVEL_SUCCESS": "был успешно повышен", - "COMMANDS_SETLEVEL_FAIL": "Указана неверная группа", - "COMMANDS_ADMINS_NONE": "Нет администраторов в сети", - "COMMANDS_MAP_SUCCESS": "Смена карты на", - "COMMANDS_MAP_UKN": "Попытка сменить на неизвестную карту", - "COMMANDS_FIND_MIN": "Пожалуйста, введите хотя бы 3 символа", - "COMMANDS_FIND_EMPTY": "Не найдено игроков", - "COMMANDS_RULES_NONE": "Владелец сервера не установил никаких правил", - "COMMANDS_FLAG_SUCCESS": "Вы были отмечены", - "COMMANDS_FLAG_UNFLAG": "С вас сняли отметку", - "COMMANDS_FLAG_FAIL": "Вы не можете ставить отметки", - "COMMANDS_REPORT_FAIL_CAMP": "Вы не можете пожаловаться на игрока за кемперство", - "COMMANDS_REPORT_FAIL_DUPLICATE": "Вы уже пожаловались на этого игрока", - "COMMANDS_REPORT_FAIL_SELF": "Вы не можете пожаловаться на самого себя", - "COMMANDS_REPORT_FAIL": "Вы не можете пожаловаться", - "COMMANDS_REPORT_SUCCESS": "Спасибо за вашу жалобу, администратор оповещен", - "COMMANDS_REPORTS_CLEAR_SUCCESS": "Жалобы успешно очищены", - "COMMANDS_REPORTS_NONE": "Пока нет жалоб на игроков", - "COMMANDS_MASK_ON": "Вы теперь замаскированы", - "COMMANDS_MASK_OFF": "Вы теперь демаскированы", - "COMMANDS_BANINFO_NONE": "Не найдено действующего бана для этого игрока", - "COMMANDS_BANINO_SUCCESS": "был забанен игроком ^5{0} ^7на:", - "COMMANDS_ALIAS_ALIASES": "Имена", - "COMMANDS_ALIAS_IPS": "IP", - "COMMANDS_RCON_SUCCESS": "Успешно отправлена команда RCon", - "COMMANDS_PLUGINS_LOADED": "Загруженные плагины", - "COMMANDS_IP_SUCCESS": "Ваш внешний IP:", - "COMMANDS_PRUNE_FAIL": "Неверное количество дней бездействия", - "COMMANDS_PRUNE_SUCCESS": "бездействующих пользователей с правами было сокращено", - "COMMANDS_PASSWORD_FAIL": "Ваш пароль должен быть хотя бы 5 символов в длину", - "COMMANDS_PASSWORD_SUCCESS": "Ваш пароль был успешно установлен", - "COMMANDS_PING_TARGET": "пинг:", - "COMMANDS_PING_SELF": "Ваш пинг:", - "MANAGER_SHUTDOWN_SUCCESS": "Выключение завершено", - "MANAGER_MONITORING_TEXT": "Идет мониторинг", - "MANAGER_CONNECTION_REST": "Соединение было восстановлено с помощью", - "SERVER_ERROR_DNE": "не существует", - "SERVER_ERROR_LOG": "Неверный файл игрового лога", - "SERVER_ERROR_COMMAND_INGAME": "Произошла внутренняя ошибка при обработке вашей команды", - "SERVER_ERROR_COMMAND_LOG": "команда сгенерировала ошибку", - "SERVER_ERROR_UNFIXABLE": "Мониторинг сервера выключен из-за неисправимых ошибок", - "SERVER_ERROR_DVAR": "Не удалось получить значение dvar:", - "SERVER_ERROR_DVAR_HELP": "убедитесь, что на сервере загружена карта", - "SERVER_ERROR_PLUGIN": "Произошла ошибка загрузки плагина", - "SERVER_ERROR_ADDPLAYER": "Не удалось добавить игрока", - "SERVER_ERROR_POLLING": "снижение частоты обновления данных", - "SERVER_ERROR_COMMUNICATION": "Не удалось связаться с", - "SERVER_ERROR_EXCEPTION": "Неожиданное исключение на", - "COMMANDS_QUIT_DESC": "покинуть IW4MAdmin", - "COMMANDS_OWNER_DESC": "утверить владение сервером", - "COMMANDS_WARN_DESC": "предупредить игрока за нарушение правил", - "COMMANDS_WARNCLEAR_DESC": "удалить все предупреждения у игрока", - "COMMANDS_KICK_DESC": "исключить игрока по имени", - "COMMANDS_SAY_DESC": "транслировать сообщения всем игрокам", - "COMMANDS_TEMPBAN_DESC": "временно забанить игрока на определенное время (по умолчанию: 1 час)", - "COMMANDS_BAN_DESC": "навсегда забанить игрока на сервере", - "COMMANDS_UNBAN_DESC": "разбанить игрока по ID игрока", - "COMMANDS_WHO_DESC": "предоставить информацию о себе", - "COMMANDS_LIST_DESC": "перечислить действующих игроков", - "COMMANDS_HELP_DESC": "перечислить все доступные команды", - "COMMANDS_FASTRESTART_DESC": "перезапустить нынешнюю карту", - "COMMANDS_MAPROTATE_DESC": "переключиться на следующую карту в ротации", - "COMMANDS_SETLEVEL_DESC": "установить особый уровень прав игроку", - "COMMANDS_USAGE_DESC": "узнать о потреблении памяти приложением", - "COMMANDS_USAGE_TEXT": "используется", - "COMMANDS_UPTIME_DESC": "получить время с начала запуска текущего приложения", - "COMMANDS_UPTIME_TEXT": "был в сети", - "COMMANDS_ADMINS_DESC": "перечислить присоединенных на данный момент игроков с правами", - "COMMANDS_MAP_DESC": "сменить на определенную карту", - "COMMANDS_FIND_DESC": "найти игрока в базе данных", - "COMMANDS_RULES_DESC": "перечислить правила сервера", - "COMMANDS_PM_DESC": "отправить сообщение другому игроку", - "COMMANDS_FLAG_DESC": "отметить подозрительного игрока и сообщить администраторам, чтобы присоединились", - "COMMANDS_REPORT_DESC": "пожаловаться на игрока за подозрительное поведение", - "COMMANDS_REPORTS_DESC": "получить или очистить последние жалобы", - "COMMANDS_MASK_DESC": "скрыть свое присутствие как игрока с правами", - "COMMANDS_BANINFO_DESC": "получить информацию о бане игрока", - "COMMANDS_ALIAS_DESC": "получить прошлые имена и IP игрока", - "COMMANDS_RCON_DESC": "отправить RCon команду на сервер", - "COMMANDS_PLUGINS_DESC": "просмотреть все загруженные плагины", - "COMMANDS_IP_DESC": "просмотреть ваш внешний IP-адрес", - "COMMANDS_PRUNE_DESC": "понизить любых игроков с правами, которые не подключались за последнее время (по умолчанию: 30 дней)", - "COMMANDS_SETPASSWORD_DESC": "установить свой пароль аутентификации", - "COMMANDS_PING_DESC": "получить пинг игрока", - "COMMANDS_ARGS_PLAYER": "игрок", - "COMMANDS_ARGS_REASON": "причина", - "COMMANDS_ARGS_MESSAGE": "сообщение", - "COMMANDS_ARGS_DURATION": "длительность (m|h|d|w|y)", - "COMMANDS_ARGS_CLIENTID": "ID игрока", - "COMMANDS_ARGS_COMMANDS": "команды", - "COMMANDS_ARGS_LEVEL": "уровень", - "COMMANDS_ARGS_MAP": "карта", - "COMMANDS_ARGS_CLEAR": "очистить", - "COMMANDS_ARGS_INACTIVE": "дни бездействия", - "COMMANDS_ARGS_PASSWORD": "пароль", - "PLUGINS_LOGIN_COMMANDS_LOGIN_DESC": "войти, используя пароль", - "PLUGINS_LOGIN_COMMANDS_LOGIN_SUCCESS": "Вы теперь вошли", - "PLUGINS_LOGIN_COMMANDS_LOGIN_FAIL": "Ваш пароль неверный", - "PLUGINS_STATS_COMMANDS_RESET_DESC": "сбросить вашу статистику под ноль", - "PLUGINS_STATS_COMMANDS_RESET_SUCCESS": "Ваша статистика на этом сервере была сброшена", - "PLUGINS_STATS_COMMANDS_RESET_FAIL": "Вы должны быть подключены к серверу, чтобы сбросить свою статистику", - "PLUGINS_STATS_COMMANDS_VIEW_DESC": "просмотреть свою статистику", - "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME": "Указанный игрок должен быть в игре", - "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME_SELF": "Вы должны быть в игре, чтобы просмотреть свою статистику", - "PLUGINS_STATS_COMMANDS_VIEW_FAIL": "Не удается найти игрока, которого вы указали.", - "PLUGINS_STATS_COMMANDS_VIEW_SUCCESS": "Статистика", - "PLUGINS_STATS_COMMANDS_TOP_DESC": "показать топ-5 лучших игроков на этом сервере", - "PLUGINS_STATS_COMMANDS_TOP_TEXT": "Лучшие игроки", - "PLUGINS_STATS_TEXT_KILLS": "УБИЙСТВ", - "PLUGINS_STATS_TEXT_DEATHS": "СМЕРТЕЙ", - "PLUGINS_STATS_TEXT_SKILL": "МАСТЕРСТВО", - "GLOBAL_DAYS": "дней", - "GLOBAL_HOURS": "часов", - "GLOBAL_MINUTES": "минут", - "GLOBAL_REPORT": "Если вы подозреваете кого-то в ^5ЧИТЕРСТВЕ^7, используйте команду ^5!report", - "GLOBAL_ERROR": "Ошибка", - "GLOBAL_WARNING": "Предупреждение", - "GLOBAL_INFO": "Информация", - "GLOBAL_VERBOSE": "Подробно" + "LocalizationIndex": { + "Set": { + "MANAGER_VERSION_FAIL": "Не удалось получить последнюю версию IW4MAdmin", + "MANAGER_VERSION_UPDATE": "- есть обновление. Последняя версия:", + "MANAGER_VERSION_CURRENT": "Ваша версия:", + "MANAGER_VERSION_SUCCESS": "IW4MAdmin обновлен", + "MANAGER_INIT_FAIL": "Критическая ошибка во время инициализации", + "MANAGER_EXIT": "Нажмите любую клавишу, чтобы выйти...", + "SETUP_ENABLE_WEBFRONT": "Включить веб-интерфейс", + "SETUP_ENABLE_MULTIOWN": "Включить поддержку нескольких владельцев", + "SETUP_ENABLE_STEPPEDPRIV": "Включить последовательную иерархию прав", + "SETUP_ENABLE_CUSTOMSAY": "Включить кастомное имя для чата", + "SETUP_SAY_NAME": "Введите кастомное имя для чата", + "SETUP_USE_CUSTOMENCODING": "Использовать кастомную кодировку парсера", + "SETUP_ENCODING_STRING": "Введите кодировку", + "SETUP_ENABLE_VPNS": "Включить поддержку VPN у игроков", + "SETUP_IPHUB_KEY": "Введите iphub.info api-ключ", + "SETUP_DISPLAY_DISCORD": "Отображать ссылку на Discord в веб-интерфейсе", + "SETUP_DISCORD_INVITE": "Введите ссылку-приглашение в Discord", + "SETUP_SERVER_USET6M": "Использовать Pluto T6 парсер", + "SETUP_SERVER_USEIW5M": "Использовать парсер Pluto IW5", + "SETUP_SERVER_MANUALLOG": "Введите путь для лог-файла", + "SETUP_SERVER_IP": "Введите IP-адрес сервера", + "SETUP_SERVER_PORT": "Введите порт сервера", + "SETUP_SERVER_RCON": "Введите RCon пароль сервера", + "SETUP_SERVER_SAVE": "Настройки сохранены, добавить", + "SERVER_KICK_VPNS_NOTALLOWED": "Использование VPN не разрешено на этом сервере", + "SERVER_KICK_TEXT": "Вы были исключены", + "SERVER_KICK_MINNAME": "Ваше имя должно содержать хотя бы 3 символа", + "SERVER_KICK_NAME_INUSE": "Ваше имя используется кем-то другим", + "SERVER_KICK_GENERICNAME": "Пожалуйста, смените ваше имя, используя /name", + "SERVER_KICK_CONTROLCHARS": "Ваше имя не должно содержать спецсимволы", + "SERVER_TB_TEXT": "Вы временно забанены", + "SERVER_TB_REMAIN": "Вы временно забанены", + "SERVER_BAN_TEXT": "Вы забанены", + "SERVER_BAN_PREV": "Ранее забанены за", + "SERVER_BAN_APPEAL": "оспорить:", + "SERVER_REPORT_COUNT": "Имеется ^5{0} ^7жалоб за последнее время", + "SERVER_WARNLIMT_REACHED": "Слишком много предупреждений", + "SERVER_WARNING": "Предупреждение", + "SERVER_WEBSITE_GENERIC": "веб-сайт этого сервера", + "BROADCAST_ONLINE": "^5IW4MADMIN ^7сейчас СЕТИ", + "BROADCAST_OFFLINE": "IW4MAdmin отключается", + "COMMAND_HELP_SYNTAX": "синтаксис:", + "COMMAND_HELP_OPTIONAL": "опционально", + "COMMAND_UNKNOWN": "Вы ввели неизвестную команду", + "COMMAND_NOACCESS": "У вас нет доступа к этой команде", + "COMMAND_NOTAUTHORIZED": "Вы не авторизованы для исполнения этой команды", + "COMMAND_MISSINGARGS": "Недостаточно аргументов приведено", + "COMMAND_TARGET_MULTI": "Несколько игроков соответствуют этому имени", + "COMMAND_TARGET_NOTFOUND": "Невозможно найти указанного игрока", + "PLUGIN_IMPORTER_NOTFOUND": "Не найдено плагинов для загрузки", + "PLUGIN_IMPORTER_REGISTERCMD": "Зарегистрированная команда", + "COMMANDS_OWNER_SUCCESS": "Поздравления, вы утвердили владение этим сервером!", + "COMMANDS_OWNER_FAIL": "Этот сервер уже имеет владельца", + "COMMANDS_WARN_FAIL": "У вас недостаточно прав, чтобы выносить предупреждения", + "COMMANDS_WARNCLEAR_SUCCESS": "Все предупреждения очищены за", + "COMMANDS_KICK_SUCCESS": "был исключен", + "COMMANDS_KICK_FAIL": "У вас нет достаточных прав, чтобы исключать", + "COMMANDS_TEMPBAN_SUCCESS": "был временно забанен за", + "COMMANDS_TEMPBAN_FAIL": "Вы не можете выдавать временный бан", + "COMMANDS_BAN_SUCCESS": "был забанен навсегда", + "COMMANDS_BAN_FAIL": "Вы не можете выдавать бан", + "COMMANDS_UNBAN_SUCCESS": "Успешно разбанен", + "COMMANDS_UNBAN_FAIL": "не забанен", + "COMMANDS_HELP_NOTFOUND": "Не удалось найти эту команду", + "COMMANDS_HELP_MOREINFO": "Введите !help <имя команды>, чтобы узнать синтаксис для использования команды", + "COMMANDS_FASTRESTART_UNMASKED": "перезапустил карту", + "COMMANDS_FASTRESTART_MASKED": "Карта была перезапущена", + "COMMANDS_MAPROTATE": "Смена карты через ^55 ^7секунд", + "COMMANDS_SETLEVEL_SELF": "Вы не можете изменить свой уровень", + "COMMANDS_SETLEVEL_OWNER": "Может быть только 1 владелец. Измените настройки, если требуется несколько владельцов", + "COMMANDS_SETLEVEL_STEPPEDDISABLED": "Этот сервер не разрешает вам повыситься", + "COMMANDS_SETLEVEL_LEVELTOOHIGH": "Вы только можете повысить ^5{0} ^7до ^5{1} ^7или понизиться в правах", + "COMMANDS_SETLEVEL_SUCCESS_TARGET": "Поздравления! Вы были повышены до", + "COMMANDS_SETLEVEL_SUCCESS": "был успешно повышен", + "COMMANDS_SETLEVEL_FAIL": "Указана неверная группа", + "COMMANDS_ADMINS_NONE": "Нет администраторов в сети", + "COMMANDS_MAP_SUCCESS": "Смена карты на", + "COMMANDS_MAP_UKN": "Попытка сменить на неизвестную карту", + "COMMANDS_FIND_MIN": "Пожалуйста, введите хотя бы 3 символа", + "COMMANDS_FIND_EMPTY": "Не найдено игроков", + "COMMANDS_RULES_NONE": "Владелец сервера не установил никаких правил", + "COMMANDS_FLAG_SUCCESS": "Вы были отмечены", + "COMMANDS_FLAG_UNFLAG": "С вас сняли отметку", + "COMMANDS_FLAG_FAIL": "Вы не можете ставить отметки", + "COMMANDS_REPORT_FAIL_CAMP": "Вы не можете пожаловаться на игрока за кемперство", + "COMMANDS_REPORT_FAIL_DUPLICATE": "Вы уже пожаловались на этого игрока", + "COMMANDS_REPORT_FAIL_SELF": "Вы не можете пожаловаться на самого себя", + "COMMANDS_REPORT_FAIL": "Вы не можете пожаловаться", + "COMMANDS_REPORT_SUCCESS": "Спасибо за вашу жалобу, администратор оповещен", + "COMMANDS_REPORTS_CLEAR_SUCCESS": "Жалобы успешно очищены", + "COMMANDS_REPORTS_NONE": "Пока нет жалоб на игроков", + "COMMANDS_MASK_ON": "Вы теперь замаскированы", + "COMMANDS_MASK_OFF": "Вы теперь демаскированы", + "COMMANDS_BANINFO_NONE": "Не найдено действующего бана для этого игрока", + "COMMANDS_BANINO_SUCCESS": "был забанен игроком ^5{0} ^7на:", + "COMMANDS_ALIAS_ALIASES": "Имена", + "COMMANDS_ALIAS_IPS": "IP", + "COMMANDS_RCON_SUCCESS": "Успешно отправлена команда RCon", + "COMMANDS_PLUGINS_LOADED": "Загруженные плагины", + "COMMANDS_IP_SUCCESS": "Ваш внешний IP:", + "COMMANDS_PRUNE_FAIL": "Неверное количество дней бездействия", + "COMMANDS_PRUNE_SUCCESS": "бездействующих пользователей с правами было сокращено", + "COMMANDS_PASSWORD_FAIL": "Ваш пароль должен быть хотя бы 5 символов в длину", + "COMMANDS_PASSWORD_SUCCESS": "Ваш пароль был успешно установлен", + "COMMANDS_PING_TARGET": "пинг:", + "COMMANDS_PING_SELF": "Ваш пинг:", + "MANAGER_SHUTDOWN_SUCCESS": "Выключение завершено", + "MANAGER_MONITORING_TEXT": "Идет мониторинг", + "MANAGER_CONNECTION_REST": "Соединение было восстановлено с помощью", + "SERVER_ERROR_DNE": "не существует", + "SERVER_ERROR_LOG": "Неверный файл игрового лога", + "SERVER_ERROR_COMMAND_INGAME": "Произошла внутренняя ошибка при обработке вашей команды", + "SERVER_ERROR_COMMAND_LOG": "команда сгенерировала ошибку", + "SERVER_ERROR_UNFIXABLE": "Мониторинг сервера выключен из-за неисправимых ошибок", + "SERVER_ERROR_DVAR": "Не удалось получить значение dvar:", + "SERVER_ERROR_DVAR_HELP": "убедитесь, что на сервере загружена карта", + "SERVER_ERROR_PLUGIN": "Произошла ошибка загрузки плагина", + "SERVER_ERROR_ADDPLAYER": "Не удалось добавить игрока", + "SERVER_ERROR_POLLING": "снижение частоты обновления данных", + "SERVER_ERROR_COMMUNICATION": "Не удалось связаться с", + "SERVER_ERROR_EXCEPTION": "Неожиданное исключение на", + "COMMANDS_QUIT_DESC": "покинуть IW4MAdmin", + "COMMANDS_OWNER_DESC": "утверить владение сервером", + "COMMANDS_WARN_DESC": "предупредить игрока за нарушение правил", + "COMMANDS_WARNCLEAR_DESC": "удалить все предупреждения у игрока", + "COMMANDS_KICK_DESC": "исключить игрока по имени", + "COMMANDS_SAY_DESC": "транслировать сообщения всем игрокам", + "COMMANDS_TEMPBAN_DESC": "временно забанить игрока на определенное время (по умолчанию: 1 час)", + "COMMANDS_BAN_DESC": "навсегда забанить игрока на сервере", + "COMMANDS_UNBAN_DESC": "разбанить игрока по ID игрока", + "COMMANDS_WHO_DESC": "предоставить информацию о себе", + "COMMANDS_LIST_DESC": "перечислить действующих игроков", + "COMMANDS_HELP_DESC": "перечислить все доступные команды", + "COMMANDS_FASTRESTART_DESC": "перезапустить нынешнюю карту", + "COMMANDS_MAPROTATE_DESC": "переключиться на следующую карту в ротации", + "COMMANDS_SETLEVEL_DESC": "установить особый уровень прав игроку", + "COMMANDS_USAGE_DESC": "узнать о потреблении памяти приложением", + "COMMANDS_USAGE_TEXT": "используется", + "COMMANDS_UPTIME_DESC": "получить время с начала запуска текущего приложения", + "COMMANDS_UPTIME_TEXT": "был в сети", + "COMMANDS_ADMINS_DESC": "перечислить присоединенных на данный момент игроков с правами", + "COMMANDS_MAP_DESC": "сменить на определенную карту", + "COMMANDS_FIND_DESC": "найти игрока в базе данных", + "COMMANDS_RULES_DESC": "перечислить правила сервера", + "COMMANDS_PM_DESC": "отправить сообщение другому игроку", + "COMMANDS_FLAG_DESC": "отметить подозрительного игрока и сообщить администраторам, чтобы присоединились", + "COMMANDS_REPORT_DESC": "пожаловаться на игрока за подозрительное поведение", + "COMMANDS_REPORTS_DESC": "получить или очистить последние жалобы", + "COMMANDS_MASK_DESC": "скрыть свое присутствие как игрока с правами", + "COMMANDS_BANINFO_DESC": "получить информацию о бане игрока", + "COMMANDS_ALIAS_DESC": "получить прошлые имена и IP игрока", + "COMMANDS_RCON_DESC": "отправить RCon команду на сервер", + "COMMANDS_PLUGINS_DESC": "просмотреть все загруженные плагины", + "COMMANDS_IP_DESC": "просмотреть ваш внешний IP-адрес", + "COMMANDS_PRUNE_DESC": "понизить любых игроков с правами, которые не подключались за последнее время (по умолчанию: 30 дней)", + "COMMANDS_SETPASSWORD_DESC": "установить свой пароль аутентификации", + "COMMANDS_PING_DESC": "получить пинг игрока", + "COMMANDS_ARGS_PLAYER": "игрок", + "COMMANDS_ARGS_REASON": "причина", + "COMMANDS_ARGS_MESSAGE": "сообщение", + "COMMANDS_ARGS_DURATION": "длительность (m|h|d|w|y)", + "COMMANDS_ARGS_CLIENTID": "ID игрока", + "COMMANDS_ARGS_COMMANDS": "команды", + "COMMANDS_ARGS_LEVEL": "уровень", + "COMMANDS_ARGS_MAP": "карта", + "COMMANDS_ARGS_CLEAR": "очистить", + "COMMANDS_ARGS_INACTIVE": "дни бездействия", + "COMMANDS_ARGS_PASSWORD": "пароль", + "PLUGINS_LOGIN_COMMANDS_LOGIN_DESC": "войти, используя пароль", + "PLUGINS_LOGIN_COMMANDS_LOGIN_SUCCESS": "Вы теперь вошли", + "PLUGINS_LOGIN_COMMANDS_LOGIN_FAIL": "Ваш пароль неверный", + "PLUGINS_STATS_COMMANDS_RESET_DESC": "сбросить вашу статистику под ноль", + "PLUGINS_STATS_COMMANDS_RESET_SUCCESS": "Ваша статистика на этом сервере была сброшена", + "PLUGINS_STATS_COMMANDS_RESET_FAIL": "Вы должны быть подключены к серверу, чтобы сбросить свою статистику", + "PLUGINS_STATS_COMMANDS_VIEW_DESC": "просмотреть свою статистику", + "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME": "Указанный игрок должен быть в игре", + "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME_SELF": "Вы должны быть в игре, чтобы просмотреть свою статистику", + "PLUGINS_STATS_COMMANDS_VIEW_FAIL": "Не удается найти игрока, которого вы указали.", + "PLUGINS_STATS_COMMANDS_VIEW_SUCCESS": "Статистика", + "PLUGINS_STATS_COMMANDS_TOP_DESC": "показать топ-5 лучших игроков на этом сервере", + "PLUGINS_STATS_COMMANDS_TOP_TEXT": "Лучшие игроки", + "PLUGINS_STATS_TEXT_KILLS": "УБИЙСТВ", + "PLUGINS_STATS_TEXT_DEATHS": "СМЕРТЕЙ", + "PLUGINS_STATS_TEXT_SKILL": "МАСТЕРСТВО", + "GLOBAL_DAYS": "дней", + "GLOBAL_HOURS": "часов", + "GLOBAL_MINUTES": "минут", + "GLOBAL_REPORT": "Если вы подозреваете кого-то в ^5ЧИТЕРСТВЕ^7, используйте команду ^5!report", + "GLOBAL_ERROR": "Ошибка", + "GLOBAL_WARNING": "Предупреждение", + "GLOBAL_INFO": "Информация", + "GLOBAL_VERBOSE": "Подробно", + + "MANAGER_CONSOLE_NOSERV": "На данный момент нет серверов под мониторингом", + "SERVER_PLUGIN_ERROR": "Плагин произвел ошибку", + "PLUGINS_STATS_TEXT_NOQUALIFY": "Ещё нет совернующихся игроков за лучшую статистику" + } } } \ No newline at end of file diff --git a/Application/Logger.cs b/Application/Logger.cs index 90a63f0f6..ef0c5eaaa 100644 --- a/Application/Logger.cs +++ b/Application/Logger.cs @@ -8,7 +8,7 @@ namespace IW4MAdmin.Application class Logger : SharedLibraryCore.Interfaces.ILogger { enum LogType - { + { Verbose, Info, Debug, @@ -30,8 +30,14 @@ namespace IW4MAdmin.Application void Write(string msg, LogType type) { - if (!Utilities.CurrentLocalization.LocalizationSet.TryGetValue($"GLOBAL_{type.ToString().ToUpper()}", out string stringType)) - stringType = type.ToString(); + string stringType = type.ToString(); + + try + { + stringType = Utilities.CurrentLocalization.LocalizationIndex[$"GLOBAL_{type.ToString().ToUpper()}"]; + } + + catch (Exception) { } string LogLine = $"[{DateTime.Now.ToString("HH:mm:ss")}] - {stringType}: {msg}"; lock (ThreadLock) diff --git a/Application/Main.cs b/Application/Main.cs index adc554673..b238ba7b7 100644 --- a/Application/Main.cs +++ b/Application/Main.cs @@ -8,6 +8,8 @@ using SharedLibraryCore.Objects; using SharedLibraryCore.Database; using System.Text; using System.Threading; +using System.Collections.Generic; +using SharedLibraryCore.Localization; namespace IW4MAdmin.Application { @@ -21,8 +23,7 @@ namespace IW4MAdmin.Application { AppDomain.CurrentDomain.SetData("DataDirectory", OperatingDirectory); //System.Diagnostics.Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.BelowNormal; - Localization.Configure.Initialize(); - var loc = Utilities.CurrentLocalization.LocalizationSet; + Console.OutputEncoding = Encoding.UTF8; Console.ForegroundColor = ConsoleColor.Gray; @@ -35,11 +36,15 @@ namespace IW4MAdmin.Application Console.WriteLine($" Version {Version.ToString("0.0")}"); Console.WriteLine("====================================================="); + Index loc = null; + try { CheckDirectories(); ServerManager = ApplicationManager.GetInstance(); + Localization.Configure.Initialize(ServerManager.GetApplicationSettings().Configuration()?.CustomLocale); + loc = Utilities.CurrentLocalization.LocalizationIndex; using (var db = new DatabaseContext(ServerManager.GetApplicationSettings().Configuration()?.ConnectionString)) new ContextSeed(db).Seed().Wait(); diff --git a/Application/Manager.cs b/Application/Manager.cs index 81411dcbd..28a67f494 100644 --- a/Application/Manager.cs +++ b/Application/Manager.cs @@ -132,7 +132,7 @@ namespace IW4MAdmin.Application catch (Exception E) { - Logger.WriteError($"{Utilities.CurrentLocalization.LocalizationSet["SERVER_ERROR_EXCEPTION"]} {sensitiveEvent.Owner}"); + Logger.WriteError($"{Utilities.CurrentLocalization.LocalizationIndex["SERVER_ERROR_EXCEPTION"]} {sensitiveEvent.Owner}"); Logger.WriteDebug("Error Message: " + E.Message); Logger.WriteDebug("Error Trace: " + E.StackTrace); sensitiveEvent.OnProcessed.Set(); @@ -203,7 +203,7 @@ namespace IW4MAdmin.Application do { newConfig.Servers.Add((ServerConfiguration)new ServerConfiguration().Generate()); - } while (Utilities.PromptBool(Utilities.CurrentLocalization.LocalizationSet["SETUP_SERVER_SAVE"])); + } while (Utilities.PromptBool(Utilities.CurrentLocalization.LocalizationIndex["SETUP_SERVER_SAVE"])); config = newConfig; await ConfigHandler.Save(); @@ -244,7 +244,7 @@ namespace IW4MAdmin.Application catch (Exception e) { - Logger.WriteError($"{Utilities.CurrentLocalization.LocalizationSet["SERVER_ERROR_PLUGIN"]} {Plugin.Name}"); + Logger.WriteError($"{Utilities.CurrentLocalization.LocalizationIndex["SERVER_ERROR_PLUGIN"]} {Plugin.Name}"); Logger.WriteDebug($"Exception: {e.Message}"); Logger.WriteDebug($"Stack Trace: {e.StackTrace}"); } @@ -286,7 +286,7 @@ namespace IW4MAdmin.Application Commands.Add(new CIP()); Commands.Add(new CMask()); Commands.Add(new CPruneAdmins()); - //Commands.Add(new CKillServer()); + Commands.Add(new CKillServer()); Commands.Add(new CSetPassword()); Commands.Add(new CPing()); @@ -307,16 +307,16 @@ namespace IW4MAdmin.Application _servers.Add(ServerInstance); } - Logger.WriteVerbose($"{Utilities.CurrentLocalization.LocalizationSet["MANAGER_MONITORING_TEXT"]} {ServerInstance.Hostname}"); + Logger.WriteVerbose($"{Utilities.CurrentLocalization.LocalizationIndex["MANAGER_MONITORING_TEXT"]} {ServerInstance.Hostname}"); // add the start event for this server Handler.AddEvent(new GameEvent(GameEvent.EventType.Start, "Server started", null, null, ServerInstance)); } catch (ServerException e) { - Logger.WriteError($"{Utilities.CurrentLocalization.LocalizationSet["SERVER_ERROR_UNFIXABLE"]} [{Conf.IPAddress}:{Conf.Port}]"); + Logger.WriteError($"{Utilities.CurrentLocalization.LocalizationIndex["SERVER_ERROR_UNFIXABLE"]} [{Conf.IPAddress}:{Conf.Port}]"); if (e.GetType() == typeof(DvarException)) - Logger.WriteDebug($"{Utilities.CurrentLocalization.LocalizationSet["SERVER_ERROR_DVAR"]} {(e as DvarException).Data["dvar_name"]} ({Utilities.CurrentLocalization.LocalizationSet["SERVER_ERROR_DVAR_HELP"]})"); + Logger.WriteDebug($"{Utilities.CurrentLocalization.LocalizationIndex["SERVER_ERROR_DVAR"]} {(e as DvarException).Data["dvar_name"]} ({Utilities.CurrentLocalization.LocalizationIndex["SERVER_ERROR_DVAR_HELP"]})"); else if (e.GetType() == typeof(NetworkException)) { Logger.WriteDebug(e.Message); @@ -418,7 +418,7 @@ namespace IW4MAdmin.Application catch (Exception E) { - Logger.WriteError($"{Utilities.CurrentLocalization.LocalizationSet["SERVER_ERROR_EXCEPTION"]} {newEvent.Owner}"); + Logger.WriteError($"{Utilities.CurrentLocalization.LocalizationIndex["SERVER_ERROR_EXCEPTION"]} {newEvent.Owner}"); Logger.WriteDebug("Error Message: " + E.Message); Logger.WriteDebug("Error Trace: " + E.StackTrace); newEvent.OnProcessed.Set(); @@ -435,7 +435,7 @@ namespace IW4MAdmin.Application HeartbeatTimer.Change(0, Timeout.Infinite); foreach (var S in Servers) - S.Broadcast(Utilities.CurrentLocalization.LocalizationSet["BROADCAST_OFFLINE"]).Wait(); + S.Broadcast("^1" + Utilities.CurrentLocalization.LocalizationIndex["BROADCAST_OFFLINE"]).Wait(); #endif _servers.Clear(); } diff --git a/Application/RconParsers/IW4RConParser.cs b/Application/RconParsers/IW4RConParser.cs index 71ebf6ca5..5799d077f 100644 --- a/Application/RconParsers/IW4RConParser.cs +++ b/Application/RconParsers/IW4RConParser.cs @@ -23,7 +23,7 @@ namespace Application.RconParsers TempBan = "tempbanclient {0} \"{1}\"" }; - private static string StatusRegex = @"^( *[0-9]+) +([0-9]+) +((?:[A-Z]+|[0-9]+)) +((?:[a-z]|[0-9]){16}|bot[0-9]+) +(.{0,20}) +([0-9]+) +(\d+\.\d+\.\d+.\d+\:-*\d{1,5}|0+.0+:-*\d{1,5}) +(-*[0-9]+) +([0-9]+) *$"; + private static string StatusRegex = @"^( *[0-9]+) +-*([0-9]+) +((?:[A-Z]+|[0-9]+)) +((?:[a-z]|[0-9]){16}|bot[0-9]+) +(.{0,20}) +([0-9]+) +(\d+\.\d+\.\d+.\d+\:-*\d{1,5}|0+.0+:-*\d{1,5}) +(-*[0-9]+) +([0-9]+) *$"; public async Task ExecuteCommandAsync(Connection connection, string command) { @@ -118,7 +118,6 @@ namespace Application.RconParsers if (P.IsBot) { - P.NetworkId = -(P.ClientNumber + 1); P.IPAddress = P.ClientNumber + 1; } @@ -126,6 +125,11 @@ namespace Application.RconParsers } } + // this happens if status is requested while map is rotating + if (Status[1] == "Rotating map...") + { + throw new ServerException("Server is rotating map"); + } if (Status.Length > 5 && validMatches == 0) { diff --git a/Application/Server.cs b/Application/Server.cs index 4b31397b4..0359c5bd8 100644 --- a/Application/Server.cs +++ b/Application/Server.cs @@ -19,13 +19,14 @@ using Application.Misc; using Application.RconParsers; using IW4MAdmin.Application.EventParsers; using IW4MAdmin.Application.IO; +using SharedLibraryCore.Localization; namespace IW4MAdmin { public class IW4MServer : Server { private CancellationToken cts; - private static Dictionary loc = Utilities.CurrentLocalization.LocalizationSet; + private static Index loc = Utilities.CurrentLocalization.LocalizationIndex; private GameLogEvent LogEvent; @@ -203,7 +204,7 @@ namespace IW4MAdmin if (!Manager.GetApplicationSettings().Configuration().EnableClientVPNs && await VPNCheck.UsingVPN(player.IPAddressString, Manager.GetApplicationSettings().Configuration().IPHubAPIKey)) { - await player.Kick(Utilities.CurrentLocalization.LocalizationSet["SERVER_KICK_VPNS_NOTALLOWED"], new Player() { ClientId = 1 }); + await player.Kick(Utilities.CurrentLocalization.LocalizationIndex["SERVER_KICK_VPNS_NOTALLOWED"], new Player() { ClientId = 1 }); } return true; @@ -709,7 +710,11 @@ namespace IW4MAdmin && BroadcastMessages.Count > 0 && ClientNum > 0) { - await Broadcast(Utilities.ProcessMessageToken(Manager.GetMessageTokens(), BroadcastMessages[NextMessage])); + string[] messages = this.ProcessMessageToken(Manager.GetMessageTokens(), BroadcastMessages[NextMessage]).Split(Environment.NewLine); + + foreach(string message in messages) + await Broadcast(message); + NextMessage = NextMessage == (BroadcastMessages.Count - 1) ? 0 : NextMessage + 1; start = DateTime.Now; } @@ -821,7 +826,7 @@ namespace IW4MAdmin CustomCallback = await ScriptLoaded(); string mainPath = EventParser.GetGameDir(); #if DEBUG - basepath.Value = @"\\192.168.88.253\mw2"; + basepath.Value = @"\\192.168.88.253\Call of Duty Black Ops II"; #endif string logPath; if (GameName == Game.IW5) @@ -1051,8 +1056,8 @@ namespace IW4MAdmin override public void InitializeTokens() { - Manager.GetMessageTokens().Add(new SharedLibraryCore.Helpers.MessageToken("TOTALPLAYERS", Manager.GetClientService().GetTotalClientsAsync().Result.ToString)); - Manager.GetMessageTokens().Add(new SharedLibraryCore.Helpers.MessageToken("VERSION", Application.Program.Version.ToString)); + Manager.GetMessageTokens().Add(new SharedLibraryCore.Helpers.MessageToken("TOTALPLAYERS", (Server s) => Manager.GetClientService().GetTotalClientsAsync().Result.ToString())); + Manager.GetMessageTokens().Add(new SharedLibraryCore.Helpers.MessageToken("VERSION", (Server s) => Application.Program.Version.ToString())); } } } diff --git a/Plugins/Login/Commands/CLogin.cs b/Plugins/Login/Commands/CLogin.cs index c12937eb8..31666de63 100644 --- a/Plugins/Login/Commands/CLogin.cs +++ b/Plugins/Login/Commands/CLogin.cs @@ -8,7 +8,7 @@ namespace IW4MAdmin.Plugins.Login.Commands { public class CLogin : Command { - public CLogin() : base("login", Utilities.CurrentLocalization.LocalizationSet["PLUGINS_LOGIN_COMMANDS_LOGIN_DESC"], "li", Player.Permission.Trusted, false, new CommandArgument[] + public CLogin() : base("login", Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_LOGIN_COMMANDS_LOGIN_DESC"], "li", Player.Permission.Trusted, false, new CommandArgument[] { new CommandArgument() { @@ -25,12 +25,12 @@ namespace IW4MAdmin.Plugins.Login.Commands if (hashedPassword[0] == client.Password) { Plugin.AuthorizedClients[E.Origin.ClientId] = true; - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["PLUGINS_LOGIN_COMMANDS_LOGIN_SUCCESS"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_LOGIN_COMMANDS_LOGIN_SUCCESS"]); } else { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["PLUGINS_LOGIN_COMMANDS_LOGIN_FAIL"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_LOGIN_COMMANDS_LOGIN_FAIL"]); } } } diff --git a/Plugins/Stats/Cheat/Detection.cs b/Plugins/Stats/Cheat/Detection.cs index 6a248a888..33c2d30a7 100644 --- a/Plugins/Stats/Cheat/Detection.cs +++ b/Plugins/Stats/Cheat/Detection.cs @@ -18,6 +18,7 @@ namespace IW4MAdmin.Plugins.Stats.Cheat Dictionary HitLocationCount; EFClientStatistics ClientStats; DateTime LastKill; + long LastOffset; ILogger Log; Strain Strain; @@ -65,7 +66,6 @@ namespace IW4MAdmin.Plugins.Stats.Cheat return new DetectionPenaltyResult() { ClientPenalty = Penalty.PenaltyType.Any, - RatioAmount = 0 }; if (LastKill == DateTime.MinValue) @@ -79,6 +79,7 @@ namespace IW4MAdmin.Plugins.Stats.Cheat // make sure it's divisible by 2 if (kill.AnglesList.Count % 2 == 0) { + /* double maxDistance = 0; for (int i = 0; i < kill.AnglesList.Count - 1; i += 1) { @@ -92,7 +93,9 @@ namespace IW4MAdmin.Plugins.Stats.Cheat { maxDistance = currDistance; } - } + if (maxDistance > hitLoc.MaxAngleDistance) + hitLoc.MaxAngleDistance = (float)maxDistance; + }*/ double realAgainstPredict = Vector3.AbsoluteDistance(kill.ViewAngles, kill.AnglesList[10]); @@ -102,9 +105,6 @@ namespace IW4MAdmin.Plugins.Stats.Cheat double newAverage = (previousAverage * (hitLoc.HitCount - 1) + realAgainstPredict) / hitLoc.HitCount; hitLoc.HitOffsetAverage = (float)newAverage; - if (maxDistance > hitLoc.MaxAngleDistance) - hitLoc.MaxAngleDistance = (float)maxDistance; - if (double.IsNaN(hitLoc.HitOffsetAverage)) { Log.WriteWarning("[Detection::ProcessKill] HitOffsetAvgerage NaN"); @@ -116,38 +116,40 @@ namespace IW4MAdmin.Plugins.Stats.Cheat .Where(hl => new List() { 4, 5, 2, 3, }.Contains((int)hl.Location)) .Where(hl => ClientStats.SessionKills > Thresholds.MediumSampleMinKills + 30); - double banAverage = hitlocations.Count() > 0 ? hitlocations.Average(c =>c.HitOffsetAverage) : 0; + var validOffsets = ClientStats.HitLocations.Where(hl => hl.HitCount > 0); + double hitOffsetAverage = validOffsets.Sum(o => o.HitCount * o.HitOffsetAverage) / (double)validOffsets.Sum(o => o.HitCount); - if (banAverage > Thresholds.MaxOffset) + if (hitOffsetAverage > Thresholds.MaxOffset) { return new DetectionPenaltyResult() { ClientPenalty = Penalty.PenaltyType.Ban, - RatioAmount = banAverage, + RatioAmount = hitOffsetAverage, KillCount = ClientStats.SessionKills, }; } #if DEBUG - Log.WriteDebug($"MaxDistance={maxDistance}, PredictVsReal={realAgainstPredict}"); + Log.WriteDebug($"PredictVsReal={realAgainstPredict}"); #endif } - var currentStrain = Strain.GetStrain(kill.ViewAngles, (kill.When - LastKill).TotalMilliseconds); + var currentStrain = Strain.GetStrain(kill.ViewAngles, kill.TimeOffset - LastOffset); + LastOffset = kill.TimeOffset; if (currentStrain > ClientStats.MaxStrain) { ClientStats.MaxStrain = currentStrain; + } - if (ClientStats.MaxStrain > Thresholds.MaxStrain) + if (Strain.TimesReachedMaxStrain >= 3) + { + return new DetectionPenaltyResult() { - return new DetectionPenaltyResult() - { - ClientPenalty = Penalty.PenaltyType.Ban, - RatioAmount = ClientStats.MaxStrain, - KillCount = ClientStats.SessionKills, - }; - } + ClientPenalty = Penalty.PenaltyType.Ban, + RatioAmount = ClientStats.MaxStrain, + KillCount = ClientStats.SessionKills, + }; } #if DEBUG diff --git a/Plugins/Stats/Cheat/Strain.cs b/Plugins/Stats/Cheat/Strain.cs index 046d25a2f..22b8f577c 100644 --- a/Plugins/Stats/Cheat/Strain.cs +++ b/Plugins/Stats/Cheat/Strain.cs @@ -11,6 +11,8 @@ namespace IW4MAdmin.Plugins.Stats.Cheat private double CurrentStrain; private Vector3 LastAngle; + public int TimesReachedMaxStrain { get; private set; } + public double GetStrain(Vector3 newAngle, double deltaTime) { if (LastAngle == null) @@ -30,15 +32,12 @@ namespace IW4MAdmin.Plugins.Stats.Cheat } double newStrain = Math.Pow(distance[0] + distance[1], 0.99) / deltaTime; - - if (newStrain + CurrentStrain > 0.25) - { - Console.WriteLine($"{LastAngle}-{newAngle}-{decayFactor}-{CurrentStrain}-{newStrain}-{distance[0]}-{distance[1]}-{deltaTime}"); - } - CurrentStrain += newStrain; + + if (CurrentStrain > Thresholds.MaxStrain) + TimesReachedMaxStrain++; + LastAngle = newAngle; - return CurrentStrain; } diff --git a/Plugins/Stats/Cheat/Thresholds.cs b/Plugins/Stats/Cheat/Thresholds.cs index ead661580..4a80dcf91 100644 --- a/Plugins/Stats/Cheat/Thresholds.cs +++ b/Plugins/Stats/Cheat/Thresholds.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace IW4MAdmin.Plugins.Stats.Cheat { diff --git a/Plugins/Stats/Commands/ResetStats.cs b/Plugins/Stats/Commands/ResetStats.cs index 185233c2a..8135ffc6e 100644 --- a/Plugins/Stats/Commands/ResetStats.cs +++ b/Plugins/Stats/Commands/ResetStats.cs @@ -11,7 +11,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands { public class ResetStats : Command { - public ResetStats() : base("resetstats", Utilities.CurrentLocalization.LocalizationSet["PLUGINS_STATS_COMMANDS_RESET_DESC"], "rs", Player.Permission.User, false) { } + public ResetStats() : base("resetstats", Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_RESET_DESC"], "rs", Player.Permission.User, false) { } public override async Task ExecuteAsync(GameEvent E) { @@ -32,12 +32,12 @@ namespace IW4MAdmin.Plugins.Stats.Commands // fixme: this doesn't work properly when another context exists await svc.SaveChangesAsync(); - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["PLUGINS_STATS_COMMANDS_RESET_SUCCESS"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_RESET_SUCCESS"]); } else { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["PLUGINS_STATS_COMMANDS_RESET_FAIL"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_RESET_FAIL"]); } } } diff --git a/Plugins/Stats/Commands/TopStats.cs b/Plugins/Stats/Commands/TopStats.cs index ef1daf48d..e2277b026 100644 --- a/Plugins/Stats/Commands/TopStats.cs +++ b/Plugins/Stats/Commands/TopStats.cs @@ -8,53 +8,70 @@ using SharedLibraryCore.Objects; using SharedLibraryCore.Services; using IW4MAdmin.Plugins.Stats.Models; using SharedLibraryCore.Database; +using System.Collections.Generic; + namespace IW4MAdmin.Plugins.Stats.Commands { class TopStats : Command { - public TopStats() : base("topstats", Utilities.CurrentLocalization.LocalizationSet["PLUGINS_STATS_COMMANDS_TOP_DESC"], "ts", Player.Permission.User, false) { } - public override async Task ExecuteAsync(GameEvent E) + public static async Task> GetTopStats(Server s) { - var statsSvc = new GenericRepository(); - int serverId = E.Owner.GetHashCode(); + int serverId = s.GetHashCode(); + List topStatsText = new List() + { + $"^5--{Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_TOP_TEXT"]}--" + }; using (var db = new DatabaseContext()) { + db.ChangeTracker.AutoDetectChangesEnabled = false; + db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + var thirtyDaysAgo = DateTime.UtcNow.AddMonths(-1); - var topStats = await (from stats in db.Set() - join client in db.Clients - on stats.ClientId equals client.ClientId - join alias in db.Aliases - on client.CurrentAliasId equals alias.AliasId - where stats.TimePlayed >= 3600 - where client.Level != Player.Permission.Banned - where client.LastConnection >= thirtyDaysAgo - orderby stats.Skill descending - select new - { - alias.Name, - stats.KDR, - stats.Skill - }) - .Take(5) - .ToListAsync(); + var iqStats = (from stats in db.Set() + join client in db.Clients + on stats.ClientId equals client.ClientId + join alias in db.Aliases + on client.CurrentAliasId equals alias.AliasId + where stats.ServerId == serverId + where stats.TimePlayed >= 3600 + where client.Level != Player.Permission.Banned + where client.LastConnection >= thirtyDaysAgo + orderby stats.Skill descending + select $"^3{client.Name}^7 - ^5{stats.KDR} ^7KDR | ^5{stats.Skill} ^7{Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_TEXT_SKILL"]}") + .Take(5); - if (!E.Message.IsBroadcastCommand()) + topStatsText.AddRange(await iqStats.ToListAsync()); + } + + // no one qualified + if (topStatsText.Count == 0) + { + topStatsText = new List() { - await E.Origin.Tell($"^5--{Utilities.CurrentLocalization.LocalizationSet["PLUGINS_STATS_COMMANDS_TOP_TEXT"]}--"); + Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_TEXT_NOQUALIFY"] + }; + } - foreach (var stat in topStats) - await E.Origin.Tell($"^3{stat.Name}^7 - ^5{stat.KDR} ^7KDR | ^5{stat.Skill} ^7{Utilities.CurrentLocalization.LocalizationSet["PLUGINS_STATS_TEXT_SKILL"]}"); - } - else - { - await E.Owner.Broadcast($"^5--{Utilities.CurrentLocalization.LocalizationSet["PLUGINS_STATS_COMMANDS_TOP_TEXT"]}--"); + return topStatsText; + } - foreach (var stat in topStats) - await E.Owner.Broadcast($"^3{stat.Name}^7 - ^5{stat.KDR} ^7KDR | ^5{stat.Skill} ^7{Utilities.CurrentLocalization.LocalizationSet["PLUGINS_STATS_TEXT_SKILL"]}"); - } + public TopStats() : base("topstats", Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_TOP_DESC"], "ts", Player.Permission.User, false) { } + + public override async Task ExecuteAsync(GameEvent E) + { + var topStats = await GetTopStats(E.Owner); + if (!E.Message.IsBroadcastCommand()) + { + foreach (var stat in topStats) + await E.Origin.Tell(stat); + } + else + { + foreach (var stat in topStats) + await E.Owner.Broadcast(stat); } } } diff --git a/Plugins/Stats/Commands/ViewStats.cs b/Plugins/Stats/Commands/ViewStats.cs index 8053674b8..cda1193ed 100644 --- a/Plugins/Stats/Commands/ViewStats.cs +++ b/Plugins/Stats/Commands/ViewStats.cs @@ -12,7 +12,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands { public class CViewStats : Command { - public CViewStats() : base("stats", Utilities.CurrentLocalization.LocalizationSet["PLUGINS_STATS_COMMANDS_VIEW_DESC"], "xlrstats", Player.Permission.User, false, new CommandArgument[] + public CViewStats() : base("stats", Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_VIEW_DESC"], "xlrstats", Player.Permission.User, false, new CommandArgument[] { new CommandArgument() { @@ -24,7 +24,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands public override async Task ExecuteAsync(GameEvent E) { - var loc = Utilities.CurrentLocalization.LocalizationSet; + var loc = Utilities.CurrentLocalization.LocalizationIndex; if (E.Target?.ClientNumber < 0) { diff --git a/Plugins/Stats/Helpers/StatManager.cs b/Plugins/Stats/Helpers/StatManager.cs index c01b408c3..3678f1aa2 100644 --- a/Plugins/Stats/Helpers/StatManager.cs +++ b/Plugins/Stats/Helpers/StatManager.cs @@ -320,6 +320,10 @@ namespace IW4MAdmin.Plugins.Stats.Helpers { async Task executePenalty(Cheat.DetectionPenaltyResult penalty) { +#if DEBUG + Log.WriteVerbose("Player Banned"); + return; +#endif // prevent multiple bans from occuring if (attacker.Level == Player.Permission.Banned) { diff --git a/Plugins/Stats/Plugin.cs b/Plugins/Stats/Plugin.cs index 17f489554..0c4971b02 100644 --- a/Plugins/Stats/Plugin.cs +++ b/Plugins/Stats/Plugin.cs @@ -170,7 +170,8 @@ namespace IW4MAdmin.Plugins.Stats (double)clientStats.Where(c => c.HitLocations.Count > 0) .Sum(c => c.HitLocations.Where(hl => hl.Location != IW4Info.HitLocation.none).Sum(f => f.HitCount)), 2); - hitOffsetAverage = clientStats.Sum(c => c.AverageHitOffset) / Math.Max(1, clientStats.Where(c => c.AverageHitOffset > 0).Count()); + var validOffsets = clientStats.Where(c => c.HitLocations.Count(hl => hl.HitCount > 0) > 0).SelectMany(hl => hl.HitLocations); + hitOffsetAverage = validOffsets.Sum(o => o.HitCount * o.HitOffsetAverage) / (double)validOffsets.Sum(o => o.HitCount); } return new List() @@ -248,22 +249,28 @@ namespace IW4MAdmin.Plugins.Stats MetaService.AddMeta(getMessages); - string totalKills() + string totalKills(Server server) { var serverStats = new GenericRepository(); return serverStats.Find(s => s.Active) .Sum(c => c.TotalKills).ToString("#,##0"); } - string totalPlayTime() + string totalPlayTime(Server server) { var serverStats = new GenericRepository(); return Math.Ceiling((serverStats.GetQuery(s => s.Active) .Sum(c => c.TotalPlayTime) / 3600.0)).ToString("#,##0"); } + string topStats(Server s) + { + return String.Join(Environment.NewLine, Commands.TopStats.GetTopStats(s).Result); + } + manager.GetMessageTokens().Add(new MessageToken("TOTALKILLS", totalKills)); manager.GetMessageTokens().Add(new MessageToken("TOTALPLAYTIME", totalPlayTime)); + manager.GetMessageTokens().Add(new MessageToken("TOPSTATS", topStats)); ServerManager = manager; diff --git a/SharedLibraryCore/Command.cs b/SharedLibraryCore/Command.cs index 4b46d3c87..735594c32 100644 --- a/SharedLibraryCore/Command.cs +++ b/SharedLibraryCore/Command.cs @@ -29,7 +29,7 @@ namespace SharedLibraryCore public String Name { get; private set; } public String Description { get; private set; } - public String Syntax => $"{Utilities.CurrentLocalization.LocalizationSet["COMMAND_HELP_SYNTAX"]} !{Alias} {String.Join(" ", Arguments.Select(a => $"<{(a.Required ? "" : Utilities.CurrentLocalization.LocalizationSet["COMMAND_HELP_OPTIONAL"] + " ")}{a.Name}>"))}"; + public String Syntax => $"{Utilities.CurrentLocalization.LocalizationIndex["COMMAND_HELP_SYNTAX"]} !{Alias} {String.Join(" ", Arguments.Select(a => $"<{(a.Required ? "" : Utilities.CurrentLocalization.LocalizationIndex["COMMAND_HELP_OPTIONAL"] + " ")}{a.Name}>"))}"; public String Alias { get; private set; } public int RequiredArgumentCount => Arguments.Count(c => c.Required); public bool RequiresTarget { get; private set; } diff --git a/SharedLibraryCore/Commands/NativeCommands.cs b/SharedLibraryCore/Commands/NativeCommands.cs index f49eb96a5..af59ba569 100644 --- a/SharedLibraryCore/Commands/NativeCommands.cs +++ b/SharedLibraryCore/Commands/NativeCommands.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace SharedLibraryCore.Commands @@ -14,7 +15,7 @@ namespace SharedLibraryCore.Commands public class CQuit : Command { public CQuit() : - base("quit", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_QUIT_DESC"], "q", Player.Permission.Owner, false) + base("quit", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_QUIT_DESC"], "q", Player.Permission.Owner, false) { } public override Task ExecuteAsync(GameEvent E) @@ -26,7 +27,7 @@ namespace SharedLibraryCore.Commands public class COwner : Command { public COwner() : - base("owner", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_OWNER_DESC"], "iamgod", Player.Permission.User, false) + base("owner", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_OWNER_DESC"], "iamgod", Player.Permission.User, false) { } public override async Task ExecuteAsync(GameEvent E) @@ -34,29 +35,29 @@ namespace SharedLibraryCore.Commands if ((await (E.Owner.Manager.GetClientService() as ClientService).GetOwners()).Count == 0) { E.Origin.Level = Player.Permission.Owner; - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_OWNER_SUCCESS"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_OWNER_SUCCESS"]); // so setpassword/login works E.Owner.Manager.GetPrivilegedClients().Add(E.Origin.ClientId, E.Origin); await E.Owner.Manager.GetClientService().Update(E.Origin); } else - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_OWNER_FAIL"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_OWNER_FAIL"]); } } public class CWarn : Command { public CWarn() : - base("warn", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_WARN_DESC"], "w", Player.Permission.Trusted, true, new CommandArgument[] + base("warn", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_WARN_DESC"], "w", Player.Permission.Trusted, true, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_PLAYER"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PLAYER"], Required = true }, new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_REASON"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_REASON"], Required = true } }) @@ -65,7 +66,7 @@ namespace SharedLibraryCore.Commands public override async Task ExecuteAsync(GameEvent E) { if (E.Origin.Level <= E.Target.Level) - await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_WARN_FAIL"]} {E.Target.Name}"); + await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_WARN_FAIL"]} {E.Target.Name}"); else await E.Target.Warn(E.Data, E.Origin); } @@ -74,11 +75,11 @@ namespace SharedLibraryCore.Commands public class CWarnClear : Command { public CWarnClear() : - base("warnclear", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_WARNCLEAR_DESC"], "wc", Player.Permission.Trusted, true, new CommandArgument[] + base("warnclear", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_WARNCLEAR_DESC"], "wc", Player.Permission.Trusted, true, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_PLAYER"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PLAYER"], Required = true } }) @@ -87,7 +88,7 @@ namespace SharedLibraryCore.Commands public override async Task ExecuteAsync(GameEvent E) { E.Target.Warnings = 0; - String Message = $"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_WARNCLEAR_SUCCESS"]} {E.Target.Name}"; + String Message = $"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_WARNCLEAR_SUCCESS"]} {E.Target.Name}"; await E.Owner.Broadcast(Message); } } @@ -95,16 +96,16 @@ namespace SharedLibraryCore.Commands public class CKick : Command { public CKick() : - base("kick", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_KICK_DESC"], "k", Player.Permission.Moderator, true, new CommandArgument[] + base("kick", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_KICK_DESC"], "k", Player.Permission.Moderator, true, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_PLAYER"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PLAYER"], Required = true }, new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_REASON"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_REASON"], Required = true } }) @@ -116,21 +117,21 @@ namespace SharedLibraryCore.Commands { E.Owner.Manager.GetEventHandler().AddEvent(new GameEvent(GameEvent.EventType.Kick, E.Data, E.Origin, E.Target, E.Owner)); await E.Target.Kick(E.Data, E.Origin); - await E.Origin.Tell($"^5{E.Target} ^7{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_KICK_SUCCESS"]}"); + await E.Origin.Tell($"^5{E.Target} ^7{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_KICK_SUCCESS"]}"); } else - await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_KICK_FAIL"]} {E.Target.Name}"); + await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_KICK_FAIL"]} {E.Target.Name}"); } } public class CSay : Command { public CSay() : - base("say", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_SAY_DESC"], "s", Player.Permission.Moderator, false, new CommandArgument[] + base("say", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_SAY_DESC"], "s", Player.Permission.Moderator, false, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_MESSAGE"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_MESSAGE"], Required = true } }) @@ -145,21 +146,21 @@ namespace SharedLibraryCore.Commands public class CTempBan : Command { public CTempBan() : - base("tempban", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_TEMPBAN_DESC"], "tb", Player.Permission.Administrator, true, new CommandArgument[] + base("tempban", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_TEMPBAN_DESC"], "tb", Player.Permission.Administrator, true, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_PLAYER"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PLAYER"], Required = true }, new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_DURATION"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_DURATION"], Required = true, }, new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_REASON"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_REASON"], Required = true } }) @@ -175,26 +176,26 @@ namespace SharedLibraryCore.Commands if (E.Origin.Level > E.Target.Level) { await E.Target.TempBan(Message, length, E.Origin); - await E.Origin.Tell($"^5{E.Target} ^7{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_TEMPBAN_SUCCESS"]} ^5{length.TimeSpanText()}"); + await E.Origin.Tell($"^5{E.Target} ^7{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_TEMPBAN_SUCCESS"]} ^5{length.TimeSpanText()}"); } else - await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_TEMPBAN_FAIL"]} {E.Target.Name}"); + await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_TEMPBAN_FAIL"]} {E.Target.Name}"); } } public class CBan : Command { public CBan() : - base("ban", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_BAN_DESC"], "b", Player.Permission.SeniorAdmin, true, new CommandArgument[] + base("ban", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_BAN_DESC"], "b", Player.Permission.SeniorAdmin, true, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_PLAYER"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PLAYER"], Required = true }, new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_REASON"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_REASON"], Required = true } }) @@ -205,26 +206,26 @@ namespace SharedLibraryCore.Commands if (E.Origin.Level > E.Target.Level) { await E.Target.Ban(E.Data, E.Origin); - await E.Origin.Tell($"^5{E.Target} ^7{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_BAN_SUCCESS"]}"); + await E.Origin.Tell($"^5{E.Target} ^7{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_BAN_SUCCESS"]}"); } else - await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_BAN_FAIL"]} {E.Target.Name}"); + await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_BAN_FAIL"]} {E.Target.Name}"); } } public class CUnban : Command { public CUnban() : - base("unban", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_UNBAN_DESC"], "ub", Player.Permission.SeniorAdmin, true, new CommandArgument[] + base("unban", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_UNBAN_DESC"], "ub", Player.Permission.SeniorAdmin, true, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_CLIENTID"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_CLIENTID"], Required = true, }, new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_REASON"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_REASON"], Required = true } }) @@ -236,11 +237,11 @@ namespace SharedLibraryCore.Commands if (penalties.Where(p => p.Type == Penalty.PenaltyType.Ban || p.Type == Penalty.PenaltyType.TempBan).FirstOrDefault() != null) { await E.Owner.Unban(E.Data, E.Target, E.Origin); - await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_UNBAN_SUCCESS"]} {E.Target}"); + await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_UNBAN_SUCCESS"]} {E.Target}"); } else { - await E.Origin.Tell($"{E.Target} {Utilities.CurrentLocalization.LocalizationSet["COMMANDS_UNBAN_FAIL"]}"); + await E.Origin.Tell($"{E.Target} {Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_UNBAN_FAIL"]}"); } } } @@ -248,7 +249,7 @@ namespace SharedLibraryCore.Commands public class CWhoAmI : Command { public CWhoAmI() : - base("whoami", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_WHO_DESC"], "who", Player.Permission.User, false) + base("whoami", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_WHO_DESC"], "who", Player.Permission.User, false) { } public override async Task ExecuteAsync(GameEvent E) @@ -261,7 +262,7 @@ namespace SharedLibraryCore.Commands public class CList : Command { public CList() : - base("list", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_LIST_DESC"], "l", Player.Permission.Moderator, false) + base("list", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_LIST_DESC"], "l", Player.Permission.Moderator, false) { } public override async Task ExecuteAsync(GameEvent E) @@ -296,11 +297,11 @@ namespace SharedLibraryCore.Commands public class CHelp : Command { public CHelp() : - base("help", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_HELP_DESC"], "h", Player.Permission.User, false, new CommandArgument[] + base("help", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_HELP_DESC"], "h", Player.Permission.User, false, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_COMMANDS"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_COMMANDS"], Required = false } }) @@ -325,7 +326,7 @@ namespace SharedLibraryCore.Commands } if (!found) - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_HELP_NOTFOUND"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_HELP_NOTFOUND"]); } else @@ -352,7 +353,7 @@ namespace SharedLibraryCore.Commands } } await E.Origin.Tell(helpResponse.ToString()); - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_HELP_MOREINFO"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_HELP_MOREINFO"]); } } } @@ -360,7 +361,7 @@ namespace SharedLibraryCore.Commands public class CFastRestart : Command { public CFastRestart() : - base("fastrestart", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_FASTRESTART_DESC"], "fr", Player.Permission.Moderator, false) + base("fastrestart", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_FASTRESTART_DESC"], "fr", Player.Permission.Moderator, false) { } public override async Task ExecuteAsync(GameEvent E) @@ -368,24 +369,24 @@ namespace SharedLibraryCore.Commands await E.Owner.ExecuteCommandAsync("fast_restart"); if (!E.Origin.Masked) - await E.Owner.Broadcast($"^5{E.Origin.Name} ^7{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_FASTRESTART_UNMASKED"]}"); + await E.Owner.Broadcast($"^5{E.Origin.Name} ^7{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_FASTRESTART_UNMASKED"]}"); else - await E.Owner.Broadcast(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_FASTRESTART_MASKED"]); + await E.Owner.Broadcast(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_FASTRESTART_MASKED"]); } } public class CMapRotate : Command { public CMapRotate() : - base("maprotate", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_MAPROTATE_DESC"], "mr", Player.Permission.Administrator, false) + base("maprotate", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_MAPROTATE_DESC"], "mr", Player.Permission.Administrator, false) { } public override async Task ExecuteAsync(GameEvent E) { if (!E.Origin.Masked) - await E.Owner.Broadcast($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_MAPROTATE"]} [^5{E.Origin.Name}^7]"); + await E.Owner.Broadcast($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_MAPROTATE"]} [^5{E.Origin.Name}^7]"); else - await E.Owner.Broadcast(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_MAPROTATE"]); + await E.Owner.Broadcast(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_MAPROTATE"]); Task.Delay(5000).Wait(); await E.Owner.ExecuteCommandAsync("map_rotate"); } @@ -394,16 +395,16 @@ namespace SharedLibraryCore.Commands public class CSetLevel : Command { public CSetLevel() : - base("setlevel", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_SETLEVEL_DESC"], "sl", Player.Permission.Moderator, true, new CommandArgument[] + base("setlevel", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_SETLEVEL_DESC"], "sl", Player.Permission.Moderator, true, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_PLAYER"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PLAYER"], Required = true }, new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_LEVEL"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_LEVEL"], Required = true } }) @@ -413,7 +414,7 @@ namespace SharedLibraryCore.Commands { if (E.Target == E.Origin) { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_SETLEVEL_SELF"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_SETLEVEL_SELF"]); return; } @@ -422,14 +423,14 @@ namespace SharedLibraryCore.Commands if (newPerm == Player.Permission.Owner && !E.Owner.Manager.GetApplicationSettings().Configuration().EnableMultipleOwners) { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_SETLEVEL_OWNER"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_SETLEVEL_OWNER"]); return; } if (E.Origin.Level < Player.Permission.Owner && !E.Owner.Manager.GetApplicationSettings().Configuration().EnableSteppedHierarchy) { - await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_SETLEVEL_STEPPEDDISABLED"]} ^5{E.Target.Name}"); + await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_SETLEVEL_STEPPEDDISABLED"]} ^5{E.Target.Name}"); return; } @@ -437,7 +438,7 @@ namespace SharedLibraryCore.Commands { if (E.Origin.Level < Player.Permission.Owner) { - await E.Origin.Tell(string.Format(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_SETLEVEL_LEVELTOOHIGH"], E.Target.Name, (E.Origin.Level - 1).ToString())); + await E.Origin.Tell(string.Format(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_SETLEVEL_LEVELTOOHIGH"], E.Target.Name, (E.Origin.Level - 1).ToString())); return; } } @@ -450,7 +451,7 @@ namespace SharedLibraryCore.Commands if (ActiveClient != null) { ActiveClient.Level = newPerm; - await ActiveClient.Tell($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_SETLEVEL_SUCCESS_TARGET"]} {newPerm}"); + await ActiveClient.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_SETLEVEL_SUCCESS_TARGET"]} {newPerm}"); } else @@ -470,36 +471,36 @@ namespace SharedLibraryCore.Commands E.Owner.Manager.GetPrivilegedClients()[E.Target.ClientId] = E.Target; } - await E.Origin.Tell($"{E.Target.Name} {Utilities.CurrentLocalization.LocalizationSet["COMMANDS_SETLEVEL_SUCCESS"]}"); + await E.Origin.Tell($"{E.Target.Name} {Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_SETLEVEL_SUCCESS"]}"); } else - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_SETLEVEL_FAIL"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_SETLEVEL_FAIL"]); } } public class CUsage : Command { public CUsage() : - base("usage", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_USAGE_DESC"], "us", Player.Permission.Moderator, false) + base("usage", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_USAGE_DESC"], "us", Player.Permission.Moderator, false) { } public override async Task ExecuteAsync(GameEvent E) { - await E.Origin.Tell($"IW4MAdmin {Utilities.CurrentLocalization.LocalizationSet["COMMANDS_USAGE_TEXT"]}" + Math.Round(((System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64 / 2048f) / 1200f), 1) + "MB"); + await E.Origin.Tell($"IW4MAdmin {Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_USAGE_TEXT"]}" + Math.Round(((System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64 / 2048f) / 1200f), 1) + "MB"); } } public class CUptime : Command { public CUptime() : - base("uptime", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_UPTIME_DESC"], "up", Player.Permission.Moderator, false) + base("uptime", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_UPTIME_DESC"], "up", Player.Permission.Moderator, false) { } public override async Task ExecuteAsync(GameEvent E) { TimeSpan uptime = DateTime.Now - System.Diagnostics.Process.GetCurrentProcess().StartTime; - var loc = Utilities.CurrentLocalization.LocalizationSet; + var loc = Utilities.CurrentLocalization.LocalizationIndex; await E.Origin.Tell($"IW4M Admin {loc["COMMANDS_UPTIME_TEXT"]} {uptime.Days} {loc["GLOBAL_DAYS"]}, {uptime.Hours} {loc["GLOBAL_HOURS"]}, {uptime.Minutes} {loc["GLOBAL_MINUTES"]}"); } } @@ -507,7 +508,7 @@ namespace SharedLibraryCore.Commands public class CListAdmins : Command { public CListAdmins() : - base("admins", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ADMINS_DESC"], "a", Player.Permission.User, false) + base("admins", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ADMINS_DESC"], "a", Player.Permission.User, false) { } public override async Task ExecuteAsync(GameEvent E) @@ -527,18 +528,18 @@ namespace SharedLibraryCore.Commands } if (numOnline == 0) - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ADMINS_NONE"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ADMINS_NONE"]); } } public class CLoadMap : Command { public CLoadMap() : - base("map", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_MAP_DESC"], "m", Player.Permission.Administrator, false, new CommandArgument[] + base("map", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_MAP_DESC"], "m", Player.Permission.Administrator, false, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_MAP"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_MAP"], Required = true } }) @@ -551,14 +552,14 @@ namespace SharedLibraryCore.Commands { if (m.Name.ToLower() == newMap || m.Alias.ToLower() == newMap) { - await E.Owner.Broadcast($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_MAP_SUCCESS"]} ^5{m.Alias}"); + await E.Owner.Broadcast($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_MAP_SUCCESS"]} ^5{m.Alias}"); Task.Delay(5000).Wait(); await E.Owner.LoadMap(m.Name); return; } } - await E.Owner.Broadcast($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_MAP_UKN"]} ^5{newMap}"); + await E.Owner.Broadcast($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_MAP_UKN"]} ^5{newMap}"); Task.Delay(5000).Wait(); await E.Owner.LoadMap(newMap); } @@ -567,11 +568,11 @@ namespace SharedLibraryCore.Commands public class CFindPlayer : Command { public CFindPlayer() : - base("find", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_FIND_DESC"], "f", Player.Permission.Administrator, false, new CommandArgument[] + base("find", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_FIND_DESC"], "f", Player.Permission.Administrator, false, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_PLAYER"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PLAYER"], Required = true } }) @@ -581,7 +582,7 @@ namespace SharedLibraryCore.Commands { if (E.Data.Length < 3) { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_FIND_MIN"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_FIND_MIN"]); return; } @@ -592,7 +593,7 @@ namespace SharedLibraryCore.Commands if (db_players.Count == 0) { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_FIND_EMPTY"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_FIND_EMPTY"]); return; } @@ -610,7 +611,7 @@ namespace SharedLibraryCore.Commands public class CListRules : Command { public CListRules() : - base("rules", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_RULES_DESC"], "r", Player.Permission.User, false) + base("rules", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_RULES_DESC"], "r", Player.Permission.User, false) { } public override async Task ExecuteAsync(GameEvent E) @@ -619,9 +620,9 @@ namespace SharedLibraryCore.Commands E.Owner.ServerConfig.Rules?.Count < 1) { if (E.Message.IsBroadcastCommand()) - await E.Owner.Broadcast(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_RULES_NONE"]); + await E.Owner.Broadcast(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_RULES_NONE"]); else - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_RULES_NONE"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_RULES_NONE"]); } else @@ -645,16 +646,16 @@ namespace SharedLibraryCore.Commands public class CPrivateMessage : Command { public CPrivateMessage() : - base("privatemessage", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_PM_DESC"], "pm", Player.Permission.User, true, new CommandArgument[] + base("privatemessage", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_PM_DESC"], "pm", Player.Permission.User, true, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_PLAYER"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PLAYER"], Required = true }, new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_MESSAGE"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_MESSAGE"], Required = true } }) @@ -670,16 +671,16 @@ namespace SharedLibraryCore.Commands public class CFlag : Command { public CFlag() : - base("flag", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_FLAG_DESC"], "fp", Player.Permission.Moderator, true, new CommandArgument[] + base("flag", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_FLAG_DESC"], "fp", Player.Permission.Moderator, true, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_PLAYER"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PLAYER"], Required = true }, new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_REASON"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_REASON"], Required = true } }) @@ -690,7 +691,7 @@ namespace SharedLibraryCore.Commands // todo: move unflag to seperate command if (E.Target.Level >= E.Origin.Level) { - await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_FLAG_FAIL"]} ^5{E.Target.Name}"); + await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_FLAG_FAIL"]} ^5{E.Target.Name}"); return; } @@ -698,7 +699,7 @@ namespace SharedLibraryCore.Commands { E.Target.Level = Player.Permission.User; await E.Owner.Manager.GetClientService().Update(E.Target); - await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_FLAG_UNFLAG"]} ^5{E.Target.Name}"); + await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_FLAG_UNFLAG"]} ^5{E.Target.Name}"); } else @@ -719,7 +720,7 @@ namespace SharedLibraryCore.Commands await E.Owner.Manager.GetPenaltyService().Create(newPenalty); E.Owner.Manager.GetEventHandler().AddEvent(new GameEvent(GameEvent.EventType.Flag, E.Data, E.Origin, E.Target, E.Owner)); - await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_FLAG_SUCCESS"]} ^5{E.Target.Name}"); + await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_FLAG_SUCCESS"]} ^5{E.Target.Name}"); } } @@ -728,16 +729,16 @@ namespace SharedLibraryCore.Commands public class CReport : Command { public CReport() : - base("report", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_REPORT_DESC"], "rep", Player.Permission.User, true, new CommandArgument[] + base("report", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_REPORT_DESC"], "rep", Player.Permission.User, true, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_PLAYER"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PLAYER"], Required = true }, new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_REASON"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_REASON"], Required = true } }) @@ -747,31 +748,31 @@ namespace SharedLibraryCore.Commands { if (E.Data.ToLower().Contains("camp")) { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_REPORT_FAIL_CAMP"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_REPORT_FAIL_CAMP"]); return; } if (E.Owner.Reports.Find(x => (x.Origin == E.Origin && x.Target.NetworkId == E.Target.NetworkId)) != null) { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_REPORT_FAIL_DUPLICATE"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_REPORT_FAIL_DUPLICATE"]); return; } if (E.Target == E.Origin) { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_REPORT_FAIL_SELF"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_REPORT_FAIL_SELF"]); return; } if (E.Target.Level > E.Origin.Level) { - await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_REPORT_FAIL"]} {E.Target.Name}"); + await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_REPORT_FAIL"]} {E.Target.Name}"); return; } E.Owner.Reports.Add(new Report(E.Target, E.Origin, E.Data)); - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_REPORT_SUCCESS"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_REPORT_SUCCESS"]); E.Owner.Manager.GetEventHandler().AddEvent(new GameEvent(GameEvent.EventType.Report, E.Data, E.Origin, E.Target, E.Owner)); await E.Owner.ToAdmins(String.Format("^5{0}^7->^1{1}^7: {2}", E.Origin.Name, E.Target.Name, E.Data)); } @@ -780,11 +781,11 @@ namespace SharedLibraryCore.Commands public class CListReports : Command { public CListReports() : - base("reports", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_REPORTS_DESC"], "reps", Player.Permission.Moderator, false, new CommandArgument[] + base("reports", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_REPORTS_DESC"], "reps", Player.Permission.Moderator, false, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_CLEAR"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_CLEAR"], Required = false } }) @@ -792,16 +793,16 @@ namespace SharedLibraryCore.Commands public override async Task ExecuteAsync(GameEvent E) { - if (E.Data != null && E.Data.ToLower().Contains(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_CLEAR"])) + if (E.Data != null && E.Data.ToLower().Contains(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_CLEAR"])) { E.Owner.Reports = new List(); - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_REPORTS_CLEAR_SUCCESS"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_REPORTS_CLEAR_SUCCESS"]); return; } if (E.Owner.Reports.Count < 1) { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_REPORTS_NONE"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_REPORTS_NONE"]); return; } @@ -813,7 +814,7 @@ namespace SharedLibraryCore.Commands public class CMask : Command { public CMask() : - base("mask", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_MASK_DESC"], "hide", Player.Permission.Moderator, false) + base("mask", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_MASK_DESC"], "hide", Player.Permission.Moderator, false) { } public override async Task ExecuteAsync(GameEvent E) @@ -821,12 +822,12 @@ namespace SharedLibraryCore.Commands if (E.Origin.Masked) { E.Origin.Masked = false; - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_MASK_OFF"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_MASK_OFF"]); } else { E.Origin.Masked = true; - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_MASK_ON"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_MASK_ON"]); } await E.Owner.Manager.GetClientService().Update(E.Origin); @@ -836,11 +837,11 @@ namespace SharedLibraryCore.Commands public class CListBanInfo : Command { public CListBanInfo() : - base("baninfo", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_BANINFO_DESC"], "bi", Player.Permission.Moderator, true, new CommandArgument[] + base("baninfo", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_BANINFO_DESC"], "bi", Player.Permission.Moderator, true, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_PLAYER"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PLAYER"], Required = true } }) @@ -854,12 +855,12 @@ namespace SharedLibraryCore.Commands if (penalty == null) { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_BANINFO_NONE"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_BANINFO_NONE"]); return; } string timeRemaining = penalty.Type == Penalty.PenaltyType.TempBan ? $"({(penalty.Expires - DateTime.UtcNow).TimeSpanText()} remaining)" : ""; - string success = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_BANINO_SUCCESS"]; + string success = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_BANINO_SUCCESS"]; await E.Origin.Tell($"^1{E.Target.Name} ^7{string.Format(success, penalty.Punisher.Name)} {penalty.Punisher.Name} {timeRemaining}"); } @@ -869,11 +870,11 @@ namespace SharedLibraryCore.Commands public class CListAlias : Command { public CListAlias() : - base("alias", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ALIAS_DESC"], "known", Player.Permission.Moderator, true, new CommandArgument[] + base("alias", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ALIAS_DESC"], "known", Player.Permission.Moderator, true, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_PLAYER"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PLAYER"], Required = true, } }) @@ -887,12 +888,12 @@ namespace SharedLibraryCore.Commands await E.Target.Tell($"[^3{E.Target}^7]"); - message.Append($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ALIAS_ALIASES"]}: "); + message.Append($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ALIAS_ALIASES"]}: "); message.Append(String.Join(" | ", names)); await E.Origin.Tell(message.ToString()); message.Clear(); - message.Append($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ALIAS_IPS"]}: "); + message.Append($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ALIAS_IPS"]}: "); message.Append(String.Join(" | ", IPs)); await E.Origin.Tell(message.ToString()); } @@ -901,11 +902,11 @@ namespace SharedLibraryCore.Commands public class CExecuteRCON : Command { public CExecuteRCON() : - base("rcon", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_RCON_DESC"], "rcon", Player.Permission.Owner, false, new CommandArgument[] + base("rcon", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_RCON_DESC"], "rcon", Player.Permission.Owner, false, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_COMMANDS"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_COMMANDS"], Required = true } }) @@ -917,19 +918,19 @@ namespace SharedLibraryCore.Commands foreach (string S in Response) await E.Origin.Tell(S.StripColors()); if (Response.Length == 0) - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_RCON_SUCCESS"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_RCON_SUCCESS"]); } } public class CPlugins : Command { public CPlugins() : - base("plugins", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_PLUGINS_DESC"], "p", Player.Permission.Administrator, false) + base("plugins", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_PLUGINS_DESC"], "p", Player.Permission.Administrator, false) { } public override async Task ExecuteAsync(GameEvent E) { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_PLUGINS_LOADED"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_PLUGINS_LOADED"]); foreach (var P in Plugins.PluginImporter.ActivePlugins) { await E.Origin.Tell(String.Format("^3{0} ^7[v^3{1}^7] by ^5{2}^7", P.Name, P.Version, P.Author)); @@ -940,22 +941,22 @@ namespace SharedLibraryCore.Commands public class CIP : Command { public CIP() : - base("getexternalip", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_IP_DESC"], "ip", Player.Permission.User, false) + base("getexternalip", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_IP_DESC"], "ip", Player.Permission.User, false) { } public override async Task ExecuteAsync(GameEvent E) { - await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_IP_SUCCESS"]} ^5{E.Origin.IPAddressString}"); + await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_IP_SUCCESS"]} ^5{E.Origin.IPAddressString}"); } } public class CPruneAdmins : Command { - public CPruneAdmins() : base("prune", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_PRUNE_DESC"], "pa", Player.Permission.Owner, false, new CommandArgument[] + public CPruneAdmins() : base("prune", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_PRUNE_DESC"], "pa", Player.Permission.Owner, false, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_INACTIVE"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_INACTIVE"], Required = false } }) @@ -977,7 +978,7 @@ namespace SharedLibraryCore.Commands catch (FormatException) { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_PRUNE_FAIL"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_PRUNE_FAIL"]); return; } @@ -994,18 +995,18 @@ namespace SharedLibraryCore.Commands inactiveUsers.ForEach(c => c.Level = Player.Permission.User); await context.SaveChangesAsync(); } - await E.Origin.Tell($"^5{inactiveUsers.Count} ^7{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_PRUNE_SUCCESS"]}"); + await E.Origin.Tell($"^5{inactiveUsers.Count} ^7{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_PRUNE_SUCCESS"]}"); } } public class CSetPassword : Command { - public CSetPassword() : base("setpassword", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_SETPASSWORD_DESC"], "sp", Player.Permission.Moderator, false, new CommandArgument[] + public CSetPassword() : base("setpassword", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_SETPASSWORD_DESC"], "sp", Player.Permission.Moderator, false, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_PASSWORD"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PASSWORD"], Required = true } }) @@ -1015,7 +1016,7 @@ namespace SharedLibraryCore.Commands { if (E.Data.Length < 5) { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_PASSWORD_FAIL"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_PASSWORD_FAIL"]); return; } @@ -1029,11 +1030,10 @@ namespace SharedLibraryCore.Commands E.Owner.Manager.GetPrivilegedClients()[E.Origin.ClientId].PasswordSalt = hashedPassword[1]; await E.Owner.Manager.GetClientService().Update(E.Origin); - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationSet["COMMANDS_PASSWORD_SUCCESS"]); + await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_PASSWORD_SUCCESS"]); } } - /* public class CKillServer : Command { public CKillServer() : base("killserver", "kill the game server", "kill", Player.Permission.Administrator, false) @@ -1043,7 +1043,21 @@ namespace SharedLibraryCore.Commands public override async Task ExecuteAsync(GameEvent E) { var gameserverProcesses = System.Diagnostics.Process.GetProcessesByName("iw4x"); - var currentProcess = gameserverProcesses.FirstOrDefault(g => g.MainWindowTitle.Contains(E.Owner.Hostname)); + + System.Diagnostics.Process currentProcess = null; + + foreach (var p in gameserverProcesses) + { + string cmdLine = Utilities.GetCommandLine(p.Id); + + var regex = Regex.Match(cmdLine, @".*((?:\+set|\+) net_port) +([0-9]+).*"); + + if (regex.Success && Int32.Parse(regex.Groups[2].Value) == E.Owner.GetPort()) + { + currentProcess = p; + } + } + if (currentProcess == null) { @@ -1063,7 +1077,7 @@ namespace SharedLibraryCore.Commands } } - catch (NetworkException) + catch (Exceptions.NetworkException) { await E.Origin.Tell("Unable to cleanly shutdown server, forcing"); } @@ -1085,16 +1099,16 @@ namespace SharedLibraryCore.Commands } } } - }*/ + } public class CPing : Command { - public CPing() : base("ping", Utilities.CurrentLocalization.LocalizationSet["COMMANDS_PING_DESC"], "pi", Player.Permission.User, false, new CommandArgument[] + public CPing() : base("ping", Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_PING_DESC"], "pi", Player.Permission.User, false, new CommandArgument[] { new CommandArgument() { - Name = Utilities.CurrentLocalization.LocalizationSet["COMMANDS_ARGS_PLAYER"], + Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PLAYER"], Required = false } }) @@ -1105,16 +1119,16 @@ namespace SharedLibraryCore.Commands if (E.Message.IsBroadcastCommand()) { if (E.Target == null) - await E.Owner.Broadcast($"{E.Origin.Name}'s {Utilities.CurrentLocalization.LocalizationSet["COMMANDS_PING_TARGET"]} ^5{E.Origin.Ping}^7ms"); + await E.Owner.Broadcast($"{E.Origin.Name}'s {Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_PING_TARGET"]} ^5{E.Origin.Ping}^7ms"); else - await E.Owner.Broadcast($"{E.Target.Name}'s {Utilities.CurrentLocalization.LocalizationSet["COMMANDS_PING_TARGET"]} ^5{E.Target.Ping}^7ms"); + await E.Owner.Broadcast($"{E.Target.Name}'s {Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_PING_TARGET"]} ^5{E.Target.Ping}^7ms"); } else { if (E.Target == null) - await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationSet["COMMANDS_PING_SELF"]} ^5{E.Origin.Ping}^7ms"); + await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_PING_SELF"]} ^5{E.Origin.Ping}^7ms"); else - await E.Origin.Tell($"{E.Target.Name}'s {Utilities.CurrentLocalization.LocalizationSet["COMMANDS_PING_TARGET"]} ^5{E.Target.Ping}^7ms"); + await E.Origin.Tell($"{E.Target.Name}'s {Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_PING_TARGET"]} ^5{E.Target.Ping}^7ms"); } } } diff --git a/SharedLibraryCore/Configuration/ApplicationConfiguration.cs b/SharedLibraryCore/Configuration/ApplicationConfiguration.cs index 6c4d2ab5b..7454de6ad 100644 --- a/SharedLibraryCore/Configuration/ApplicationConfiguration.cs +++ b/SharedLibraryCore/Configuration/ApplicationConfiguration.cs @@ -29,7 +29,7 @@ namespace SharedLibraryCore.Configuration public IBaseConfiguration Generate() { - var loc = Utilities.CurrentLocalization.LocalizationSet; + var loc = Utilities.CurrentLocalization.LocalizationIndex; Id = Guid.NewGuid().ToString(); EnableWebFront = Utilities.PromptBool(loc["SETUP_ENABLE_WEBFRONT"]); diff --git a/SharedLibraryCore/Configuration/ServerConfiguration.cs b/SharedLibraryCore/Configuration/ServerConfiguration.cs index 83e161f95..fc6cb814e 100644 --- a/SharedLibraryCore/Configuration/ServerConfiguration.cs +++ b/SharedLibraryCore/Configuration/ServerConfiguration.cs @@ -17,7 +17,7 @@ namespace SharedLibraryCore.Configuration public IBaseConfiguration Generate() { - var loc = Utilities.CurrentLocalization.LocalizationSet; + var loc = Utilities.CurrentLocalization.LocalizationIndex; while (string.IsNullOrEmpty(IPAddress)) { diff --git a/SharedLibraryCore/Helpers/MessageToken.cs b/SharedLibraryCore/Helpers/MessageToken.cs index 409d89195..6f2dd65c1 100644 --- a/SharedLibraryCore/Helpers/MessageToken.cs +++ b/SharedLibraryCore/Helpers/MessageToken.cs @@ -5,16 +5,16 @@ namespace SharedLibraryCore.Helpers public class MessageToken { public string Name { get; private set; } - Func Value; - public MessageToken(string Name, Func Value) + Func Value; + public MessageToken(string Name, Func Value) { this.Name = Name; this.Value = Value; } - - public override string ToString() + + public string Process(Server server) { - return Value().ToString(); + return this.Value(server); } } } diff --git a/SharedLibraryCore/Localization/Layout.cs b/SharedLibraryCore/Localization/Layout.cs index 5f6d6580c..3cbf48725 100644 --- a/SharedLibraryCore/Localization/Layout.cs +++ b/SharedLibraryCore/Localization/Layout.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.Text; @@ -7,6 +8,30 @@ namespace SharedLibraryCore.Localization public class Layout { public string LocalizationName { get; set; } - public Dictionary LocalizationSet { get; set; } + public Index LocalizationIndex { get; set; } + + public Layout(Dictionary set) + { + LocalizationIndex = new Index() + { + Set = set + }; + } } + + public class Index + { + public Dictionary Set { get; set; } + + public string this[string key] + { + get + { + if (!Set.TryGetValue(key, out string value)) + throw new Exception($"Invalid locale key {key}"); + return value; + } + } + } + } diff --git a/SharedLibraryCore/PluginImporter.cs b/SharedLibraryCore/PluginImporter.cs index a187b2662..0afa0a860 100644 --- a/SharedLibraryCore/PluginImporter.cs +++ b/SharedLibraryCore/PluginImporter.cs @@ -17,7 +17,7 @@ namespace SharedLibraryCore.Plugins if (dllFileNames.Length == 0) { - Manager.GetLogger().WriteDebug(Utilities.CurrentLocalization.LocalizationSet["PLUGIN_IMPORTER_NOTFOUND"]); + Manager.GetLogger().WriteDebug(Utilities.CurrentLocalization.LocalizationIndex["PLUGIN_IMPORTER_NOTFOUND"]); return true; } @@ -43,7 +43,7 @@ namespace SharedLibraryCore.Plugins Object commandObject = Activator.CreateInstance(assemblyType); Command newCommand = (Command)commandObject; ActiveCommands.Add(newCommand); - Manager.GetLogger().WriteDebug($"{Utilities.CurrentLocalization.LocalizationSet["PLUGIN_IMPORTER_REGISTERCMD"]} \"{newCommand.Name}\""); + Manager.GetLogger().WriteDebug($"{Utilities.CurrentLocalization.LocalizationIndex["PLUGIN_IMPORTER_REGISTERCMD"]} \"{newCommand.Name}\""); LoadedCommands++; continue; } diff --git a/SharedLibraryCore/RCon/Connection.cs b/SharedLibraryCore/RCon/Connection.cs index 04cf6561a..53eb55642 100644 --- a/SharedLibraryCore/RCon/Connection.cs +++ b/SharedLibraryCore/RCon/Connection.cs @@ -144,7 +144,7 @@ namespace SharedLibraryCore.RCon if (!connectionState.Buffer.Take(4).ToArray().SequenceEqual(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF })) throw new NetworkException("Unexpected packet received"); - if (serverConnection.Available > 0) + if (FailedReceives == 0 && serverConnection.Available > 0) { serverConnection.BeginReceive(connectionState.Buffer, 0, connectionState.Buffer.Length, 0, new AsyncCallback(OnReceivedCallback), connectionState); @@ -276,7 +276,7 @@ namespace SharedLibraryCore.RCon if (FailedReceives >= 4) { - throw new NetworkException($"Could not receive data from {socketConnection.RemoteEndPoint}"); + throw new NetworkException($"{Utilities.CurrentLocalization.LocalizationIndex["SERVER_ERROR_COMMUNICATION"]} {socketConnection.RemoteEndPoint}"); } } diff --git a/SharedLibraryCore/Server.cs b/SharedLibraryCore/Server.cs index 44ac35227..fcdd4f847 100644 --- a/SharedLibraryCore/Server.cs +++ b/SharedLibraryCore/Server.cs @@ -137,7 +137,6 @@ namespace SharedLibraryCore }; Manager.GetEventHandler().AddEvent(e); - await this.ExecuteCommandAsync(formattedMessage); #else Logger.WriteVerbose(Message.StripColors()); await Task.CompletedTask; diff --git a/SharedLibraryCore/Utilities.cs b/SharedLibraryCore/Utilities.cs index b78d906ca..49a0a749c 100644 --- a/SharedLibraryCore/Utilities.cs +++ b/SharedLibraryCore/Utilities.cs @@ -10,6 +10,7 @@ using System.Reflection; using System.IO; using System.Threading.Tasks; using System.Globalization; +using System.Diagnostics; namespace SharedLibraryCore { @@ -101,7 +102,7 @@ namespace SharedLibraryCore } } - public static String ProcessMessageToken(IList tokens, String str) + public static String ProcessMessageToken(this Server server, IList tokens, String str) { MatchCollection RegexMatches = Regex.Matches(str, @"\{\{[A-Z]+\}\}", RegexOptions.IgnoreCase); foreach (Match M in RegexMatches) @@ -112,7 +113,7 @@ namespace SharedLibraryCore var found = tokens.FirstOrDefault(t => t.Name.ToLower() == Identifier.ToLower()); if (found != null) - str = str.Replace(Match, found.ToString()); + str = str.Replace(Match, found.Process(server)); } return str; @@ -185,7 +186,7 @@ namespace SharedLibraryCore return id; var bot = Regex.Match(str, @"bot[0-9]+").Value; if (!string.IsNullOrEmpty(bot)) - return -Convert.ToInt64(bot.Substring(3)); + return -Convert.ToInt64(bot.Substring(3)) + 1; return 0; } @@ -378,6 +379,30 @@ namespace SharedLibraryCore return dict; } + /* https://loune.net/2017/06/running-shell-bash-commands-in-net-core/ */ + public static string GetCommandLine(int pId) + { + var cmdProcess = new Process() + { + StartInfo = new ProcessStartInfo() + { + FileName = "cmd.exe", + Arguments = $"/c wmic process where processid={pId} get CommandLine", + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true, + } + }; + + cmdProcess.Start(); + cmdProcess.WaitForExit(); + + string[] cmdLine = cmdProcess.StandardOutput.ReadToEnd().Split("\r\n", StringSplitOptions.RemoveEmptyEntries); + + return cmdLine.Length > 1 ? cmdLine[1] : cmdLine[0]; + } + + public static Task> GetDvarAsync(this Server server, string dvarName) => server.RconParser.GetDvarAsync(server.RemoteConnection, dvarName); public static Task SetDvarAsync(this Server server, string dvarName, object dvarValue) => server.RconParser.SetDvarAsync(server.RemoteConnection, dvarName, dvarValue); diff --git a/WebfrontCore/Controllers/ActionController.cs b/WebfrontCore/Controllers/ActionController.cs index 2bfc9abc8..ce444834e 100644 --- a/WebfrontCore/Controllers/ActionController.cs +++ b/WebfrontCore/Controllers/ActionController.cs @@ -14,15 +14,14 @@ namespace WebfrontCore.Controllers { var info = new ActionInfo() { - ActionButtonLabel = "Ban", + ActionButtonLabel = Localization["WEBFRONT_ACTION_BAN_NAME"], Name = "Ban", Inputs = new List() { new InputInfo() { Name = "Reason", - Label = "Reason", - Placeholder = "" + Label = Localization["WEBFRONT_ACTION_LABEL_REASON"], } }, Action = "BanAsync" @@ -46,15 +45,14 @@ namespace WebfrontCore.Controllers { var info = new ActionInfo() { - ActionButtonLabel = "Unban", + ActionButtonLabel = Localization["WEBFRONT_ACTION_UNBAN_NAME"], Name = "Unban", Inputs = new List() { new InputInfo() { Name = "Reason", - Label = "Reason", - Placeholder = "" + Label = Localization["WEBFRONT_ACTION_LABEL_REASON"], } }, Action = "UnbanAsync" @@ -78,7 +76,7 @@ namespace WebfrontCore.Controllers { var login = new ActionInfo() { - ActionButtonLabel = "Login", + ActionButtonLabel = Localization["WEBFRONT_ACTION_LOGIN_NAME"], Name = "Login", Inputs = new List() { diff --git a/WebfrontCore/Controllers/BaseController.cs b/WebfrontCore/Controllers/BaseController.cs index 3d0951ddc..a83b7c2d0 100644 --- a/WebfrontCore/Controllers/BaseController.cs +++ b/WebfrontCore/Controllers/BaseController.cs @@ -17,6 +17,7 @@ namespace WebfrontCore.Controllers protected IManager Manager; protected readonly DatabaseContext Context; protected bool Authorized { get; private set; } + protected SharedLibraryCore.Localization.Index Localization { get; private set; } protected EFClient Client { get; private set; } private static byte[] LocalHost = { 127, 0, 0, 1 }; private static string DiscordLink;