para saber como usar o comando",
- "COMMANDS_HELP_NOTFOUND": "Não foi possível encontrar esse comando",
- "COMMANDS_IP_DESC": "mostrar o seu endereço IP externo",
- "COMMANDS_IP_SUCCESS": "Seu endereço IP externo é",
- "COMMANDS_KICK_DESC": "expulsa o jogador pelo nome",
- "COMMANDS_KICK_FAIL": "Você não tem os privilégios necessários para expulsar",
- "COMMANDS_KICK_SUCCESS": "foi expulso",
- "COMMANDS_LIST_DESC": "lista os jogadores ativos na partida",
- "COMMANDS_MAP_DESC": "muda para o mapa especificado",
- "COMMANDS_MAP_SUCCESS": "Mudando o mapa para",
- "COMMANDS_MAP_UKN": "Tentando mudar para o mapa desconhecido",
- "COMMANDS_MAPROTATE": "Rotacionando o mapa em ^55 ^7segundos",
- "COMMANDS_MAPROTATE_DESC": "avança para o próximo mapa da rotação",
- "COMMANDS_MASK_DESC": "esconde a sua presença como um jogador privilegiado",
- "COMMANDS_MASK_OFF": "Você foi desmascarado",
- "COMMANDS_MASK_ON": "Você agora está mascarado",
- "COMMANDS_OWNER_DESC": "reivindica a propriedade do servidor",
- "COMMANDS_OWNER_FAIL": "Este servidor já tem um dono",
- "COMMANDS_OWNER_SUCCESS": "Parabéns, você reivindicou a propriedade deste servidor!",
- "COMMANDS_PASSWORD_FAIL": "Sua senha deve ter pelo menos 5 caracteres",
- "COMMANDS_PASSWORD_SUCCESS": "Sua senha foi configurada com sucesso",
- "COMMANDS_PING_DESC": "mostra o quanto de latência tem o jogador",
- "COMMANDS_PING_SELF": "Sua latência é",
- "COMMANDS_PING_TARGET": "latência é",
- "COMMANDS_PLUGINS_DESC": "mostra todos os plugins que estão carregados",
- "COMMANDS_PLUGINS_LOADED": "Plugins carregados",
- "COMMANDS_PM_DESC": "envia a mensagem para o outro jogador de maneira privada, use /!pm para ter efeito, se possível",
- "COMMANDS_PRUNE_DESC": "rebaixa qualquer jogador privilegiado que não tenha se conectado recentemente (o padrão é 30 dias)",
- "COMMANDS_PRUNE_FAIL": "Número inválido de dias ativo",
- "COMMANDS_PRUNE_SUCCESS": "usuários privilegiados inativos foram removidos",
- "COMMANDS_QUIT_DESC": "sair do IW4MAdmin",
- "COMMANDS_RCON_DESC": "envia o comando Rcon para o servidor",
- "COMMANDS_RCON_SUCCESS": "O comando para o RCon foi enviado com sucesso!",
- "COMMANDS_REPORT_DESC": "denuncia o jogador por comportamento suspeito",
- "COMMANDS_REPORT_FAIL": "Você não pode reportar",
- "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 reportar a si mesmo",
- "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_DESC": "obtém ou limpa as denúncias recentes",
- "COMMANDS_REPORTS_NONE": "Ninguém foi denunciado ainda",
- "COMMANDS_RULES_DESC": "lista as regras do servidor",
- "COMMANDS_RULES_NONE": "O proprietário do servidor não definiu nenhuma regra, sinta-se livre",
- "COMMANDS_SAY_DESC": "transmite mensagem para todos os jogadores",
- "COMMANDS_SETLEVEL_DESC": "define o jogador para o nível de privilégio especificado",
- "COMMANDS_SETLEVEL_FAIL": "grupo especificado inválido",
- "COMMANDS_SETLEVEL_LEVELTOOHIGH": "Você só pode promover do ^5{0} ^7para ^5{1} ^7ou um nível menor",
- "COMMANDS_SETLEVEL_OWNER": "Só pode haver 1 dono. Modifique suas configurações se vários proprietários forem necessários",
- "COMMANDS_SETLEVEL_SELF": "Você não pode mudar seu próprio nível",
- "COMMANDS_SETLEVEL_STEPPEDDISABLED": "Este servidor não permite que você promova",
- "COMMANDS_SETLEVEL_SUCCESS": "foi promovido com sucesso",
- "COMMANDS_SETLEVEL_SUCCESS_TARGET": "Parabéns! Você foi promovido para",
- "COMMANDS_SETPASSWORD_DESC": "define sua senha de autenticação",
- "COMMANDS_TEMPBAN_DESC": "bane temporariamente um jogador por tempo especificado (o padrão é 1 hora)",
- "COMMANDS_TEMPBAN_FAIL": "Você não pode banir temporariamente",
- "COMMANDS_TEMPBAN_SUCCESS": "foi banido temporariamente por",
- "COMMANDS_UNBAN_DESC": "retira o banimento de um jogador pelo seu ID",
- "COMMANDS_UNBAN_FAIL": "não está banido",
- "COMMANDS_UNBAN_SUCCESS": "Foi retirado o banimento com sucesso",
- "COMMANDS_UPTIME_DESC": "obtém o tempo de execução do aplicativo a quando aberto",
- "COMMANDS_UPTIME_TEXT": "está online por",
- "COMMANDS_USAGE_DESC": "vê quanto o aplicativo está usando de memória RAM do seu computador",
- "COMMANDS_USAGE_TEXT": "está usando",
- "COMMANDS_WARN_DESC": "adverte o cliente por infringir as regras",
- "COMMANDS_WARN_FAIL": "Você não tem os privilégios necessários para advertir",
- "COMMANDS_WARNCLEAR_DESC": "remove todos os avisos para um cliente",
- "COMMANDS_WARNCLEAR_SUCCESS": "Todos as advertências foram apagados para",
- "COMMANDS_WHO_DESC": "dá informações sobre você",
- "GLOBAL_TIME_DAYS": "dias",
- "GLOBAL_ERROR": "Erro",
- "GLOBAL_TIME_HOURS": "horas",
- "GLOBAL_INFO": "Informação",
- "GLOBAL_TIME_MINUTES": "minutos",
- "GLOBAL_REPORT": "Se você está suspeitando alguém de alguma ^5TRAPAÇA ^7use o comando ^5!report",
- "GLOBAL_VERBOSE": "Detalhe",
- "GLOBAL_WARNING": "AVISO",
- "MANAGER_CONNECTION_REST": "A conexão foi reestabelecida com",
- "MANAGER_CONSOLE_NOSERV": "Não há servidores sendo monitorados neste momento",
- "MANAGER_EXIT": "Pressione qualquer tecla para sair...",
- "MANAGER_INIT_FAIL": "Erro fatal durante a inicialização",
- "MANAGER_MONITORING_TEXT": "Agora monitorando",
- "MANAGER_SHUTDOWN_SUCCESS": "Desligamento concluído",
- "MANAGER_VERSION_CURRENT": "Está é a sua versão",
- "MANAGER_VERSION_FAIL": "Não foi possível obter a versão mais recente do IW4MAdmin",
- "MANAGER_VERSION_SUCCESS": "O IW4MAdmin está atualizado",
- "MANAGER_VERSION_UPDATE": "Há uma atualização disponível. A versão mais recente é",
- "PLUGIN_IMPORTER_NOTFOUND": "Não foram encontrados plugins para carregar",
- "PLUGIN_IMPORTER_REGISTERCMD": "Comando registrado",
- "PLUGINS_LOGIN_COMMANDS_LOGIN_DESC": "Inicie a sua sessão usando a senha",
- "PLUGINS_LOGIN_COMMANDS_LOGIN_FAIL": "Sua senha está errada",
- "PLUGINS_LOGIN_COMMANDS_LOGIN_SUCCESS": "Você agora está conectado",
- "PLUGINS_STATS_COMMANDS_RESET_DESC": "reinicia suas estatísticas para uma nova",
- "PLUGINS_STATS_COMMANDS_RESET_FAIL": "Você deve estar conectado a um servidor para reiniciar as suas estatísticas",
- "PLUGINS_STATS_COMMANDS_RESET_SUCCESS": "Suas estatísticas nesse servidor foram reiniciadas",
- "PLUGINS_STATS_COMMANDS_TOP_DESC": "visualiza os 5 melhores jogadores do servidor",
- "PLUGINS_STATS_COMMANDS_TOP_TEXT": "Top Jogadores",
- "PLUGINS_STATS_COMMANDS_VIEW_DESC": "mostra suas estatísticas",
- "PLUGINS_STATS_COMMANDS_VIEW_FAIL": "Não foi encontrado o jogador que você especificou",
- "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME": "o jogador especificado deve estar dentro do jogo",
- "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME_SELF": "Você deve estar no jogo para ver suas estatísticas",
- "PLUGINS_STATS_COMMANDS_VIEW_SUCCESS": "Estatísticas para",
- "PLUGINS_STATS_TEXT_DEATHS": "MORTES",
- "PLUGINS_STATS_TEXT_KILLS": "BAIXAS",
- "PLUGINS_STATS_TEXT_NOQUALIFY": "Não há ainda jogadores qualificados para os primeiros lugares",
- "PLUGINS_STATS_TEXT_SKILL": "HABILIDADE",
- "SERVER_BAN_APPEAL": "apele em",
- "SERVER_BAN_PREV": "Banido preventivamente por",
- "SERVER_BAN_TEXT": "Você está banido",
- "SERVER_ERROR_ADDPLAYER": "Não foi possível adicionar o jogador",
- "SERVER_ERROR_COMMAND_INGAME": "Ocorreu um erro interno ao processar seu comando",
- "SERVER_ERROR_COMMAND_LOG": "o comando gerou um erro",
- "SERVER_ERROR_COMMUNICATION": "Não foi possível fazer a comunicação com",
- "SERVER_ERROR_DNE": "não existe",
- "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_EXCEPTION": "Exceção inesperada em",
- "SERVER_ERROR_LOG": "Log do jogo inválido",
- "SERVER_ERROR_PLUGIN": "Ocorreu um erro ao carregar o plug-in",
- "SERVER_ERROR_POLLING": "reduzir a taxa de sondagem do server",
- "SERVER_ERROR_UNFIXABLE": "Não monitorando o servidor devido a erros incorrigíveis",
- "SERVER_KICK_CONTROLCHARS": "Seu nome não pode conter caracteres de controle",
- "SERVER_KICK_GENERICNAME": "Por favor, mude o seu nome usando o comando /name no console",
- "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_TEXT": "Você foi expulso",
- "SERVER_KICK_VPNS_NOTALLOWED": "VPNs não são permitidas neste servidor",
- "SERVER_PLUGIN_ERROR": "Um plugin gerou erro",
- "SERVER_REPORT_COUNT": "Você tem ^5{0} ^7denúncias recentes",
- "SERVER_TB_REMAIN": "Você está banido temporariamente",
- "SERVER_TB_TEXT": "Você está banido temporariamente",
- "SERVER_WARNING": "AVISO",
- "SERVER_WARNLIMT_REACHED": "Avisos demais! Leia o chat da próxima vez",
- "SERVER_WEBSITE_GENERIC": "este é o site do servidor",
- "SETUP_DISPLAY_SOCIAL": "Digitar link do convite do seu site no módulo da web (Discord, YouTube, etc.)",
- "SETUP_ENABLE_CUSTOMSAY": "Habilitar a customização do nome do comando say",
- "SETUP_ENABLE_MULTIOWN": "Habilitar vários proprietários",
- "SETUP_ENABLE_STEPPEDPRIV": "Ativar hierarquia de privilégios escalonada",
- "SETUP_ENABLE_VPNS": "Habilitar que os usuários usem VPN",
- "SETUP_ENABLE_WEBFRONT": "Habilitar o módulo da web do IW4MAdmin",
- "SETUP_ENCODING_STRING": "Digite sequência de codificação",
- "SETUP_IPHUB_KEY": "Digite iphub.info api key",
- "SETUP_SAY_NAME": "Habilitar a customização do nome do comando say",
- "SETUP_SERVER_IP": "Digite o endereço IP do servidor",
- "SETUP_SERVER_MANUALLOG": "Insira o caminho do arquivo de log manualmente",
- "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",
- "SETUP_SERVER_USEIW5M": "Usar analisador Pluto IW5 ",
- "SETUP_SERVER_USET6M": "Usar analisador Pluto T6 ",
- "SETUP_SOCIAL_LINK": "Digite o link da Rede Social",
- "SETUP_SOCIAL_TITLE": "Digite o nome da rede social",
- "SETUP_USE_CUSTOMENCODING": "Usar o analisador de codificação customizado",
- "WEBFRONT_ACTION_BAN_NAME": "Banir",
- "WEBFRONT_ACTION_LABEL_ID": "ID do cliente",
- "WEBFRONT_ACTION_LABEL_PASSWORD": "Senha",
- "WEBFRONT_ACTION_LABEL_REASON": "Razão",
- "WEBFRONT_ACTION_LOGIN_NAME": "Iniciar a sessão",
- "WEBFRONT_ACTION_UNBAN_NAME": "Retirar o banimento",
- "WEBFRONT_CLIENT_META_FALSE": "Não está",
- "WEBFRONT_CLIENT_META_JOINED": "Entrou com o nome",
- "WEBFRONT_CLIENT_META_MASKED": "Mascarado",
- "WEBFRONT_CLIENT_META_TRUE": "Está",
- "WEBFRONT_CLIENT_PRIVILEGED_TITLE": "Jogadores Privilegiados",
- "WEBFRONT_CLIENT_PROFILE_TITLE": "Pefil",
- "WEBFRONT_CLIENT_SEARCH_MATCHING": "Jogadores correspondidos",
- "WEBFRONT_CONSOLE_EXECUTE": "Executar",
- "WEBFRONT_CONSOLE_TITLE": "Console da Web",
- "WEBFRONT_ERROR_DESC": "O IW4MAdmin encontrou um erro",
- "WEBFRONT_ERROR_GENERIC_DESC": "Ocorreu um erro ao processar seu pedido",
- "WEBFRONT_ERROR_GENERIC_TITLE": "Desculpe!",
- "WEBFRONT_ERROR_TITLE": "Erro!",
- "WEBFRONT_HOME_TITLE": "Visão geral do servidor",
- "WEBFRONT_NAV_CONSOLE": "Console",
- "WEBFRONT_NAV_DISCORD": "Discord",
- "WEBFRONT_NAV_HOME": "Início",
- "WEBFRONT_NAV_LOGOUT": "Encerrar a sessão",
- "WEBFRONT_NAV_PENALTIES": "Penalidades",
- "WEBFRONT_NAV_PRIVILEGED": "Administradores",
- "WEBFRONT_NAV_PROFILE": "Perfil do Jogador",
- "WEBFRONT_NAV_SEARCH": "Achar jogador",
- "WEBFRONT_NAV_SOCIAL": "Rede Social",
- "WEBFRONT_PENALTY_TEMPLATE_ADMIN": "Administrador",
- "WEBFRONT_PENALTY_TEMPLATE_AGO": "atrás",
- "WEBFRONT_PENALTY_TEMPLATE_NAME": "Nome",
- "WEBFRONT_PENALTY_TEMPLATE_OFFENSE": "Ofensa",
- "WEBFRONT_PENALTY_TEMPLATE_REMAINING": "restantes",
- "WEBFRONT_PENALTY_TEMPLATE_SHOW": "Mostrar",
- "WEBFRONT_PENALTY_TEMPLATE_SHOWONLY": "Mostrar somente",
- "WEBFRONT_PENALTY_TEMPLATE_TIME": "Tempo/Restante",
- "WEBFRONT_PENALTY_TEMPLATE_TYPE": "Tipo",
- "WEBFRONT_PENALTY_TITLE": "Penalidades dos jogadores",
- "WEBFRONT_PROFILE_FSEEN": "Visto primeiro em",
- "WEBFRONT_PROFILE_LEVEL": "Nível",
- "WEBFRONT_PROFILE_LSEEN": "Visto por último em",
- "WEBFRONT_PROFILE_PLAYER": "Jogou",
- "PLUGIN_STATS_SETUP_ENABLEAC": "Habilitar a anti-trapaça no servidor (Somente IW4/MW2)",
- "PLUGIN_STATS_ERROR_ADD": "Não foi possível adicionar o servidor para as estatísticas do servidor",
- "PLUGIN_STATS_CHEAT_DETECTED": "Aparentemente você está trapaceando",
- "PLUGINS_STATS_TEXT_KDR": "KDR",
- "PLUGINS_STATS_META_SPM": "Pontuação por minuto",
- "PLUGINS_WELCOME_USERANNOUNCE": "^5{{ClientName}} ^7 vem de ^5{{ClientLocation}}",
- "PLUGINS_WELCOME_USERWELCOME": "Bem-vindo ^5{{ClientName}}^7, esta é a sua visita de número ^5{{TimesConnected}} ^7 no servidor!",
- "PLUGINS_WELCOME_PRIVANNOUNCE": "{{ClientLevel}} {{ClientName}} entrou no servidor",
- "PLUGINS_LOGIN_AUTH": "não está registrado",
- "PLUGINS_PROFANITY_SETUP_ENABLE": "Habilitar o plugin de anti-palavrão",
- "PLUGINS_PROFANITY_WARNMSG": "Por favor, não use palavras ofensivas neste servidor",
- "PLUGINS_PROFANITY_KICKMSG": "Uso excessivo de palavrão, lave a boca da próxima vez",
- "GLOBAL_DEBUG": "Depuração",
- "COMMANDS_UNFLAG_DESC": "Remover a sinalização do jogador",
- "COMMANDS_UNFLAG_FAIL": "Você não pode retirar a sinalização do jogador",
- "COMMANDS_UNFLAG_NOTFLAGGED": "O jogador não está sinalizado",
- "COMMANDS_FLAG_ALREADYFLAGGED": "O jogador já está sinalizado",
- "PLUGINS_STATS_COMMANDS_MOSTPLAYED_TEXT": "Mais jogado",
- "PLUGINS_STATS_COMMANDS_MOSTPLAYED_DESC": "ver o top 5 de jogadores mais dedicados no servidor",
- "WEBFRONT_PROFILE_MESSAGES": "Mensagens",
- "WEBFRONT_CLIENT_META_CONNECTIONS": "Conexões",
- "PLUGINS_STATS_COMMANDS_TOPSTATS_RATING": "Classificação",
- "PLUGINS_STATS_COMMANDS_PERFORMANCE": "Desempenho"
- }
- }
-}
\ No newline at end of file
diff --git a/Application/Localization/IW4MAdmin.ru-RU.json b/Application/Localization/IW4MAdmin.ru-RU.json
deleted file mode 100644
index a92b6d9e2..000000000
--- a/Application/Localization/IW4MAdmin.ru-RU.json
+++ /dev/null
@@ -1,269 +0,0 @@
-{
- "LocalizationName": "ru-RU",
- "LocalizationIndex": {
- "Set": {
- "BROADCAST_OFFLINE": "^5IW4MAdmin ^1ВЫКЛЮЧАЕТСЯ",
- "BROADCAST_ONLINE": "^5IW4MADMIN ^7сейчас В СЕТИ",
- "COMMAND_HELP_OPTIONAL": "опционально",
- "COMMAND_HELP_SYNTAX": "Проблема с выражением мысли ( пересмотри слова)",
- "COMMAND_MISSINGARGS": "Приведено недостаточно аргументов",
- "COMMAND_NOACCESS": "У вас нет доступа к этой команде",
- "COMMAND_NOTAUTHORIZED": "Вы не авторизованы для исполнения этой команды",
- "COMMAND_TARGET_MULTI": "Несколько игроков соответствуют этому имени",
- "COMMAND_TARGET_NOTFOUND": "Невозможно найти указанного игрока",
- "COMMAND_UNKNOWN": "Вы ввели неизвестную команду",
- "COMMANDS_ADMINS_DESC": "перечислить присоединенных на данный момент игроков с правами",
- "COMMANDS_ADMINS_NONE": "Нет видимых администраторов в сети",
- "COMMANDS_ALIAS_ALIASES": "Имена",
- "COMMANDS_ALIAS_DESC": "получить прошлые имена и IP игрока",
- "COMMANDS_ALIAS_IPS": "IP",
- "COMMANDS_ARGS_CLEAR": "очистить",
- "COMMANDS_ARGS_CLIENTID": "ID игрока",
- "COMMANDS_ARGS_COMMANDS": "команды",
- "COMMANDS_ARGS_DURATION": "длительность (m|h|d|w|y)",
- "COMMANDS_ARGS_INACTIVE": "дни бездействия",
- "COMMANDS_ARGS_LEVEL": "уровень",
- "COMMANDS_ARGS_MAP": "карта",
- "COMMANDS_ARGS_MESSAGE": "сообщение",
- "COMMANDS_ARGS_PASSWORD": "пароль",
- "COMMANDS_ARGS_PLAYER": "игрок",
- "COMMANDS_ARGS_REASON": "причина",
- "COMMANDS_BAN_DESC": "навсегда забанить игрока на сервере",
- "COMMANDS_BAN_FAIL": "Вы не можете выдавать бан",
- "COMMANDS_BAN_SUCCESS": "был забанен навсегда",
- "COMMANDS_BANINFO_DESC": "получить информацию о бане игрока",
- "COMMANDS_BANINFO_NONE": "Не найдено действующего бана для этого игрока",
- "COMMANDS_BANINO_SUCCESS": "был забанен игроком ^5{0} ^7на:",
- "COMMANDS_FASTRESTART_DESC": "перезапустить нынешнюю карту",
- "COMMANDS_FASTRESTART_MASKED": "Карта была перезапущена",
- "COMMANDS_FASTRESTART_UNMASKED": "перезапустил карту",
- "COMMANDS_FIND_DESC": "найти игрока в базе данных",
- "COMMANDS_FIND_EMPTY": "Не найдено игроков",
- "COMMANDS_FIND_MIN": "Пожалуйста, введите хотя бы 3 символа",
- "COMMANDS_FLAG_DESC": "отметить подозрительного игрока и сообщить администраторам, чтобы присоединились",
- "COMMANDS_FLAG_FAIL": "Вы не можете ставить отметки",
- "COMMANDS_FLAG_SUCCESS": "Вы отметили",
- "COMMANDS_FLAG_UNFLAG": "Вы сняли отметку",
- "COMMANDS_HELP_DESC": "перечислить все доступные команды",
- "COMMANDS_HELP_MOREINFO": "Введите !help <имя команды>, чтобы узнать синтаксис для использования команды",
- "COMMANDS_HELP_NOTFOUND": "Не удалось найти эту команду",
- "COMMANDS_IP_DESC": "просмотреть ваш внешний IP-адрес",
- "COMMANDS_IP_SUCCESS": "Ваш внешний IP:",
- "COMMANDS_KICK_DESC": "исключить игрока по имени",
- "COMMANDS_KICK_FAIL": "У вас нет достаточных прав, чтобы исключать",
- "COMMANDS_KICK_SUCCESS": "был исключен",
- "COMMANDS_LIST_DESC": "перечислить действующих игроков",
- "COMMANDS_MAP_DESC": "сменить на определенную карту",
- "COMMANDS_MAP_SUCCESS": "Смена карты на",
- "COMMANDS_MAP_UKN": "Попытка сменить на неизвестную карту",
- "COMMANDS_MAPROTATE": "Смена карты через ^55 ^7секунд",
- "COMMANDS_MAPROTATE_DESC": "переключиться на следующую карту в ротации",
- "COMMANDS_MASK_DESC": "скрыть свое присутствие как игрока с правами",
- "COMMANDS_MASK_OFF": "Вы теперь демаскированы",
- "COMMANDS_MASK_ON": "Вы теперь замаскированы",
- "COMMANDS_OWNER_DESC": "утверить владение сервером",
- "COMMANDS_OWNER_FAIL": "Этот сервер уже имеет владельца",
- "COMMANDS_OWNER_SUCCESS": "Поздравляю, вы утвердили владение этим сервером!",
- "COMMANDS_PASSWORD_FAIL": "Ваш пароль должен быть хотя бы 5 символов в длину",
- "COMMANDS_PASSWORD_SUCCESS": "Ваш пароль был успешно установлен",
- "COMMANDS_PING_DESC": "получить пинг игрока",
- "COMMANDS_PING_SELF": "Ваш пинг:",
- "COMMANDS_PING_TARGET": "пинг:",
- "COMMANDS_PLUGINS_DESC": "просмотреть все загруженные плагины",
- "COMMANDS_PLUGINS_LOADED": "Загруженные плагины",
- "COMMANDS_PM_DESC": "отправить сообщение другому игроку",
- "COMMANDS_PRUNE_DESC": "понизить любых игроков с правами, которые не подключались за последнее время (по умолчанию: 30 дней)",
- "COMMANDS_PRUNE_FAIL": "Неверное количество дней бездействия",
- "COMMANDS_PRUNE_SUCCESS": "бездействующих пользователей с правами было сокращено",
- "COMMANDS_QUIT_DESC": "покинуть IW4MAdmin",
- "COMMANDS_RCON_DESC": "отправить RCon команду на сервер",
- "COMMANDS_RCON_SUCCESS": "Успешно отправлена команда RCon",
- "COMMANDS_REPORT_DESC": "пожаловаться на игрока за подозрительное поведение",
- "COMMANDS_REPORT_FAIL": "Вы не можете пожаловаться",
- "COMMANDS_REPORT_FAIL_CAMP": "Вы не можете пожаловаться на игрока за кемперство",
- "COMMANDS_REPORT_FAIL_DUPLICATE": "Вы уже пожаловались на этого игрока",
- "COMMANDS_REPORT_FAIL_SELF": "Вы не можете пожаловаться на самого себя",
- "COMMANDS_REPORT_SUCCESS": "Спасибо за вашу жалобу, администратор оповещен",
- "COMMANDS_REPORTS_CLEAR_SUCCESS": "Жалобы успешно очищены",
- "COMMANDS_REPORTS_DESC": "получить или очистить последние жалобы",
- "COMMANDS_REPORTS_NONE": "Пока нет жалоб на игроков",
- "COMMANDS_RULES_DESC": "перечислить правила сервера",
- "COMMANDS_RULES_NONE": "Владелец сервера не установил никаких правил",
- "COMMANDS_SAY_DESC": "транслировать сообщения всем игрокам",
- "COMMANDS_SETLEVEL_DESC": "установить особый уровень прав игроку",
- "COMMANDS_SETLEVEL_FAIL": "Указана неверная группа",
- "COMMANDS_SETLEVEL_LEVELTOOHIGH": "Вы только можете повысить ^5{0} ^7до ^5{1} ^7или понизить в правах",
- "COMMANDS_SETLEVEL_OWNER": "Может быть только 1 владелец. Измените настройки, если требуется несколько владельцов",
- "COMMANDS_SETLEVEL_SELF": "Вы не можете изменить свой уровень",
- "COMMANDS_SETLEVEL_STEPPEDDISABLED": "Этот сервер не разрешает вам повыситься",
- "COMMANDS_SETLEVEL_SUCCESS": "был успешно повышен",
- "COMMANDS_SETLEVEL_SUCCESS_TARGET": "Поздравляю! Вы были повышены до",
- "COMMANDS_SETPASSWORD_DESC": "установить свой пароль аутентификации",
- "COMMANDS_TEMPBAN_DESC": "временно забанить игрока на определенное время (по умолчанию: 1 час)",
- "COMMANDS_TEMPBAN_FAIL": "Вы не можете выдавать временный бан",
- "COMMANDS_TEMPBAN_SUCCESS": "был временно забанен за",
- "COMMANDS_UNBAN_DESC": "разбанить игрока по ID игрока",
- "COMMANDS_UNBAN_FAIL": "не забанен",
- "COMMANDS_UNBAN_SUCCESS": "Успешно разбанен",
- "COMMANDS_UPTIME_DESC": "получить время с начала запуска текущего приложения",
- "COMMANDS_UPTIME_TEXT": "был в сети",
- "COMMANDS_USAGE_DESC": "узнать о потреблении памяти приложением",
- "COMMANDS_USAGE_TEXT": "используется",
- "COMMANDS_WARN_DESC": "предупредить игрока за нарушение правил",
- "COMMANDS_WARN_FAIL": "У вас недостаточно прав, чтобы выносить предупреждения",
- "COMMANDS_WARNCLEAR_DESC": "удалить все предупреждения у игрока",
- "COMMANDS_WARNCLEAR_SUCCESS": "Все предупреждения очищены у",
- "COMMANDS_WHO_DESC": "предоставить информацию о себе",
- "GLOBAL_TIME_DAYS": "дней",
- "GLOBAL_ERROR": "Ошибка",
- "GLOBAL_TIME_HOURS": "часов",
- "GLOBAL_INFO": "Информация",
- "GLOBAL_TIME_MINUTES": "минут",
- "GLOBAL_REPORT": "Если вы подозреваете кого-то в ^5ЧИТЕРСТВЕ^7, используйте команду ^5!report",
- "GLOBAL_VERBOSE": "Подробно",
- "GLOBAL_WARNING": "Предупреждение",
- "MANAGER_CONNECTION_REST": "Соединение было восстановлено с помощью",
- "MANAGER_CONSOLE_NOSERV": "На данный момент нет серверов под мониторингом",
- "MANAGER_EXIT": "Нажмите любую клавишу, чтобы выйти...",
- "MANAGER_INIT_FAIL": "Критическая ошибка во время инициализации",
- "MANAGER_MONITORING_TEXT": "Идет мониторинг",
- "MANAGER_SHUTDOWN_SUCCESS": "Выключение завершено",
- "MANAGER_VERSION_CURRENT": "Ваша версия:",
- "MANAGER_VERSION_FAIL": "Не удалось получить последнюю версию IW4MAdmin",
- "MANAGER_VERSION_SUCCESS": "IW4MAdmin обновлен",
- "MANAGER_VERSION_UPDATE": "- есть обновление. Последняя версия:",
- "PLUGIN_IMPORTER_NOTFOUND": "Не найдено плагинов для загрузки",
- "PLUGIN_IMPORTER_REGISTERCMD": "Зарегистрированная команда",
- "PLUGINS_LOGIN_COMMANDS_LOGIN_DESC": "войти, используя пароль",
- "PLUGINS_LOGIN_COMMANDS_LOGIN_FAIL": "Ваш пароль неверный",
- "PLUGINS_LOGIN_COMMANDS_LOGIN_SUCCESS": "Вы теперь вошли",
- "PLUGINS_STATS_COMMANDS_RESET_DESC": "сбросить вашу статистику под ноль",
- "PLUGINS_STATS_COMMANDS_RESET_FAIL": "Вы должны быть подключены к серверу, чтобы сбросить свою статистику",
- "PLUGINS_STATS_COMMANDS_RESET_SUCCESS": "Ваша статистика на этом сервере была сброшена",
- "PLUGINS_STATS_COMMANDS_TOP_DESC": "показать топ-5 лучших игроков на этом сервере",
- "PLUGINS_STATS_COMMANDS_TOP_TEXT": "Лучшие игроки",
- "PLUGINS_STATS_COMMANDS_VIEW_DESC": "просмотреть свою статистику",
- "PLUGINS_STATS_COMMANDS_VIEW_FAIL": "Не удается найти игрока, которого вы указали.",
- "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME": "Указанный игрок должен быть в игре",
- "PLUGINS_STATS_COMMANDS_VIEW_FAIL_INGAME_SELF": "Вы должны быть в игре, чтобы просмотреть свою статистику",
- "PLUGINS_STATS_COMMANDS_VIEW_SUCCESS": "Статистика",
- "PLUGINS_STATS_TEXT_DEATHS": "СМЕРТЕЙ",
- "PLUGINS_STATS_TEXT_KILLS": "УБИЙСТВ",
- "PLUGINS_STATS_TEXT_NOQUALIFY": "Ещё нет совернующихся игроков за лучшую статистику",
- "PLUGINS_STATS_TEXT_SKILL": "МАСТЕРСТВО",
- "SERVER_BAN_APPEAL": "оспорить:",
- "SERVER_BAN_PREV": "Ранее забанены за",
- "SERVER_BAN_TEXT": "Вы забанены",
- "SERVER_ERROR_ADDPLAYER": "Не удалось добавить игрока",
- "SERVER_ERROR_COMMAND_INGAME": "Произошла внутренняя ошибка при обработке вашей команды",
- "SERVER_ERROR_COMMAND_LOG": "команда сгенерировала ошибку",
- "SERVER_ERROR_COMMUNICATION": "Не удалось связаться с",
- "SERVER_ERROR_DNE": "не существует",
- "SERVER_ERROR_DVAR": "Не удалось получить значение dvar:",
- "SERVER_ERROR_DVAR_HELP": "убедитесь, что на сервере загружена карта",
- "SERVER_ERROR_EXCEPTION": "Неожиданное исключение на",
- "SERVER_ERROR_LOG": "Неверный игровой лог-файл",
- "SERVER_ERROR_PLUGIN": "Произошла ошибка загрузки плагина",
- "SERVER_ERROR_POLLING": "снижение частоты обновления данных",
- "SERVER_ERROR_UNFIXABLE": "Мониторинг сервера выключен из-за неисправимых ошибок",
- "SERVER_KICK_CONTROLCHARS": "Ваше имя не должно содержать спецсимволы",
- "SERVER_KICK_GENERICNAME": "Пожалуйста, смените ваше имя, используя /name",
- "SERVER_KICK_MINNAME": "Ваше имя должно содержать хотя бы 3 символа",
- "SERVER_KICK_NAME_INUSE": "Ваше имя используется кем-то другим",
- "SERVER_KICK_TEXT": "Вы были исключены",
- "SERVER_KICK_VPNS_NOTALLOWED": "Использование VPN не разрешено на этом сервере",
- "SERVER_PLUGIN_ERROR": "Плагин образовал ошибку",
- "SERVER_REPORT_COUNT": "Имеется ^5{0} ^7жалоб за последнее время",
- "SERVER_TB_REMAIN": "Вы временно забанены",
- "SERVER_TB_TEXT": "Вы временно забанены",
- "SERVER_WARNING": "ПРЕДУПРЕЖДЕНИЕ",
- "SERVER_WARNLIMT_REACHED": "Слишком много предупреждений",
- "SERVER_WEBSITE_GENERIC": "веб-сайт этого сервера",
- "SETUP_DISPLAY_SOCIAL": "Отображать ссылку на социальную сеть в веб-интерфейсе (Discord, веб-сайт, ВК, и т.д.)",
- "SETUP_ENABLE_CUSTOMSAY": "Включить кастомное имя для чата",
- "SETUP_ENABLE_MULTIOWN": "Включить поддержку нескольких владельцев",
- "SETUP_ENABLE_STEPPEDPRIV": "Включить последовательную иерархию прав",
- "SETUP_ENABLE_VPNS": "Включить поддержку VPN у игроков",
- "SETUP_ENABLE_WEBFRONT": "Включить веб-интерфейс",
- "SETUP_ENCODING_STRING": "Введите кодировку",
- "SETUP_IPHUB_KEY": "Введите iphub.info api-ключ",
- "SETUP_SAY_NAME": "Введите кастомное имя для чата",
- "SETUP_SERVER_IP": "Введите IP-адрес сервера",
- "SETUP_SERVER_MANUALLOG": "Введите путь для лог-файла",
- "SETUP_SERVER_PORT": "Введите порт сервера",
- "SETUP_SERVER_RCON": "Введите RCon пароль сервера",
- "SETUP_SERVER_SAVE": "Настройки сохранены, добавить",
- "SETUP_SERVER_USEIW5M": "Использовать парсер Pluto IW5",
- "SETUP_SERVER_USET6M": "Использовать парсер Pluto T6",
- "SETUP_SOCIAL_LINK": "Ввести ссылку на социальную сеть",
- "SETUP_SOCIAL_TITLE": "Ввести имя социальной сети",
- "SETUP_USE_CUSTOMENCODING": "Использовать кастомную кодировку парсера",
- "WEBFRONT_ACTION_BAN_NAME": "Забанить",
- "WEBFRONT_ACTION_LABEL_ID": "ID игрока",
- "WEBFRONT_ACTION_LABEL_PASSWORD": "Пароль",
- "WEBFRONT_ACTION_LABEL_REASON": "Причина",
- "WEBFRONT_ACTION_LOGIN_NAME": "Войти",
- "WEBFRONT_ACTION_UNBAN_NAME": "Разбанить",
- "WEBFRONT_CLIENT_META_FALSE": "не",
- "WEBFRONT_CLIENT_META_JOINED": "Присоединился с именем",
- "WEBFRONT_CLIENT_META_MASKED": "Замаскирован",
- "WEBFRONT_CLIENT_META_TRUE": "Это",
- "WEBFRONT_CLIENT_PRIVILEGED_TITLE": "Игроки с правами",
- "WEBFRONT_CLIENT_PROFILE_TITLE": "Профиль",
- "WEBFRONT_CLIENT_SEARCH_MATCHING": "Подходящие игроки",
- "WEBFRONT_CONSOLE_EXECUTE": "Выполнить",
- "WEBFRONT_CONSOLE_TITLE": "Веб-консоль",
- "WEBFRONT_ERROR_DESC": "IW4MAdmin столкнулся с ошибкой",
- "WEBFRONT_ERROR_GENERIC_DESC": "Произошла ошибка во время обработки вашего запроса",
- "WEBFRONT_ERROR_GENERIC_TITLE": "Извините!",
- "WEBFRONT_ERROR_TITLE": "Ошибка!",
- "WEBFRONT_HOME_TITLE": "Обзор сервера",
- "WEBFRONT_NAV_CONSOLE": "Консоль",
- "WEBFRONT_NAV_DISCORD": "Дискорд ",
- "WEBFRONT_NAV_HOME": "Обзор Серверов ",
- "WEBFRONT_NAV_LOGOUT": "Выйти",
- "WEBFRONT_NAV_PENALTIES": "Наказания",
- "WEBFRONT_NAV_PRIVILEGED": "Админы",
- "WEBFRONT_NAV_PROFILE": "Профиль игрока",
- "WEBFRONT_NAV_SEARCH": "Найти игрока",
- "WEBFRONT_NAV_SOCIAL": "Соц. сети",
- "WEBFRONT_PENALTY_TEMPLATE_ADMIN": "Админ",
- "WEBFRONT_PENALTY_TEMPLATE_AGO": "назад",
- "WEBFRONT_PENALTY_TEMPLATE_NAME": "Имя",
- "WEBFRONT_PENALTY_TEMPLATE_OFFENSE": "Нарушение",
- "WEBFRONT_PENALTY_TEMPLATE_REMAINING": "осталось",
- "WEBFRONT_PENALTY_TEMPLATE_SHOW": "Показывать",
- "WEBFRONT_PENALTY_TEMPLATE_SHOWONLY": "Показывать только",
- "WEBFRONT_PENALTY_TEMPLATE_TIME": "Время/Осталось",
- "WEBFRONT_PENALTY_TEMPLATE_TYPE": "Тип",
- "WEBFRONT_PENALTY_TITLE": "Наказания игроков",
- "WEBFRONT_PROFILE_FSEEN": "Впервые заходил",
- "WEBFRONT_PROFILE_LEVEL": "Уровень",
- "WEBFRONT_PROFILE_LSEEN": "Последний раз заходил",
- "WEBFRONT_PROFILE_PLAYER": "Наиграл",
- "PLUGIN_STATS_SETUP_ENABLEAC": "Включить серверный античит (только IW4)",
- "PLUGIN_STATS_ERROR_ADD": "Не удалось добавить сервер в статистику серверов",
- "PLUGIN_STATS_CHEAT_DETECTED": "Кажется, вы читерите",
- "PLUGINS_STATS_TEXT_KDR": "Вот так ..",
- "PLUGINS_STATS_META_SPM": "Счёт за минуту",
- "PLUGINS_WELCOME_USERANNOUNCE": "^5{{ClientName}} ^7из ^5{{ClientLocation}}",
- "PLUGINS_WELCOME_USERWELCOME": "Добро пожаловать, ^5{{ClientName}}^7. Это ваше ^5{{TimesConnected}} ^7подключение по счёту!",
- "PLUGINS_WELCOME_PRIVANNOUNCE": "{{ClientLevel}} {{ClientName}} присоединился к серверу",
- "PLUGINS_LOGIN_AUTH": "Сперва Подключись",
- "PLUGINS_PROFANITY_SETUP_ENABLE": "Включить сдерживание ненормативной лексики",
- "PLUGINS_PROFANITY_WARNMSG": "Пожалуйта, не ругайтесь на этом сервере",
- "PLUGINS_PROFANITY_KICKMSG": "Чрезмерное употребление ненормативной лексики",
- "GLOBAL_DEBUG": "Отлаживание ",
- "COMMANDS_UNFLAG_DESC": "Снять все подозрение с игрока !",
- "COMMANDS_UNFLAG_FAIL": "Вы не можете снять подозрения..",
- "COMMANDS_UNFLAG_NOTFLAGGED": "Игрок без подозрения !",
- "COMMANDS_FLAG_ALREADYFLAGGED": "Игрок помечен ! ",
- "PLUGINS_STATS_COMMANDS_MOSTPLAYED_TEXT": "Самые популярные",
- "PLUGINS_STATS_COMMANDS_MOSTPLAYED_DESC": "просмотр 5 лучших игроков на сервере",
- "WEBFRONT_PROFILE_MESSAGES": "Сообщения",
- "WEBFRONT_CLIENT_META_CONNECTIONS": "Подключения",
- "PLUGINS_STATS_COMMANDS_TOPSTATS_RATING": "Рейтинг",
- "PLUGINS_STATS_COMMANDS_PERFORMANCE": "Эффективность"
- }
- }
-}
\ No newline at end of file
diff --git a/Plugins/ScriptPlugins/ParserRektT5M.js b/Plugins/ScriptPlugins/ParserRektT5M.js
index 5a1213fd5..40774e767 100644
--- a/Plugins/ScriptPlugins/ParserRektT5M.js
+++ b/Plugins/ScriptPlugins/ParserRektT5M.js
@@ -17,7 +17,7 @@ var plugin = {
eventParser.Configuration.GameDirectory = 'data';
rconParser.Configuration.CommandPrefixes.RConResponse = '\xff\xff\xff\xff\1print';
- rconParser.Configuration.CommandPrefixes.Tell = 'contell {0} {1}';
+ rconParser.Configuration.CommandPrefixes.Tell = 'tell {0} {1}';
rconParser.Configuration.CommandPrefixes.RConGetInfo = undefined;
rconParser.Version = 'Call of Duty Multiplayer - Ship COD_T5_S MP build 7.0.189 CL(1022875) CODPCAB-V64 CEG Wed Nov 02 18:02:23 2011 win-x86';
diff --git a/Plugins/Stats/Controllers/StatsController.cs b/Plugins/Stats/Controllers/StatsController.cs
index 7e882964b..1874736ba 100644
--- a/Plugins/Stats/Controllers/StatsController.cs
+++ b/Plugins/Stats/Controllers/StatsController.cs
@@ -71,15 +71,32 @@ namespace IW4MAdmin.Plugins.Stats.Web.Controllers
ClientId = message.ClientId,
Message = message.Message,
Name = message.Client.CurrentAlias.Name,
- Time = message.TimeSent
+ Time = message.TimeSent,
+ ServerGame = message.Server.GameName ?? Server.Game.IW4
};
#if DEBUG == true
var messagesSql = iqMessages.ToSql();
#endif
-
var messages = await iqMessages.ToListAsync();
+ foreach (var message in messages)
+ {
+ if (message.Message.IsQuickMessage())
+ {
+ try
+ {
+ var quickMessages = Manager.GetApplicationSettings().Configuration()
+ .QuickMessages
+ .First(_qm => _qm.Game == message.ServerGame);
+ message.Message = quickMessages.Messages[message.Message.Substring(1)];
+ message.IsQuickMessage = true;
+
+ }
+ catch { }
+ }
+ }
+
return View("_MessageContext", messages);
}
}
diff --git a/Plugins/Stats/Helpers/StatManager.cs b/Plugins/Stats/Helpers/StatManager.cs
index ab7eb1e3f..edc3a0d62 100644
--- a/Plugins/Stats/Helpers/StatManager.cs
+++ b/Plugins/Stats/Helpers/StatManager.cs
@@ -222,13 +222,22 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
{
Port = sv.GetPort(),
EndPoint = sv.ToString(),
- ServerId = serverId
+ ServerId = serverId,
+ GameName = sv.GameName
};
server = serverSet.Add(server).Entity;
// this doesn't need to be async as it's during initialization
ctx.SaveChanges();
}
+
+ // we want to set the gamename up if it's never been set, or it changed
+ else if (!server.GameName.HasValue || server.GameName.HasValue && server.GameName.Value != sv.GameName)
+ {
+ server.GameName = sv.GameName;
+ ctx.Entry(server).Property(_prop => _prop.GameName).IsModified = true;
+ ctx.SaveChanges();
+ }
}
// check to see if the stats have ever been initialized
diff --git a/Plugins/Stats/Models/EFServer.cs b/Plugins/Stats/Models/EFServer.cs
index 3aa5bc7fc..104254165 100644
--- a/Plugins/Stats/Models/EFServer.cs
+++ b/Plugins/Stats/Models/EFServer.cs
@@ -2,6 +2,7 @@
using SharedLibraryCore.Database.Models;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
+using static SharedLibraryCore.Server;
namespace IW4MAdmin.Plugins.Stats.Models
{
@@ -13,5 +14,6 @@ namespace IW4MAdmin.Plugins.Stats.Models
[Required]
public int Port { get; set; }
public string EndPoint { get; set; }
+ public Game? GameName { get; set; }
}
}
diff --git a/Plugins/Stats/Plugin.cs b/Plugins/Stats/Plugin.cs
index 354da570e..211b8ecbd 100644
--- a/Plugins/Stats/Plugin.cs
+++ b/Plugins/Stats/Plugin.cs
@@ -408,11 +408,36 @@ namespace IW4MAdmin.Plugins.Stats
messageMeta = await messages.Select(m => new ProfileMeta()
{
Key = null,
- Value = m.Message,
+ Value = new { m.Message, m.Server.GameName },
When = m.TimeSent,
Extra = m.ServerId.ToString(),
Type = ProfileMeta.MetaType.ChatMessage
}).ToListAsync();
+
+ foreach (var message in messageMeta)
+ {
+ if ((message.Value.Message as string).IsQuickMessage())
+ {
+ try
+ {
+ var quickMessages = ServerManager.GetApplicationSettings().Configuration()
+ .QuickMessages
+ .First(_qm => _qm.Game == message.Value.GameName);
+ message.Value = quickMessages.Messages[(message.Value.Message as string).Substring(1)];
+ message.Type = ProfileMeta.MetaType.QuickMessage;
+ }
+ catch
+ {
+ message.Value = message.Value.Message;
+ }
+ }
+
+ else
+ {
+ message.Value = message.Value.Message;
+ }
+ }
+
}
return messageMeta;
diff --git a/Plugins/Web/StatsWeb/Views/Stats/_MessageContext.cshtml b/Plugins/Web/StatsWeb/Views/Stats/_MessageContext.cshtml
index 311d36b03..34ae40317 100644
--- a/Plugins/Web/StatsWeb/Views/Stats/_MessageContext.cshtml
+++ b/Plugins/Web/StatsWeb/Views/Stats/_MessageContext.cshtml
@@ -8,7 +8,7 @@
@foreach (var message in Model)
{
- @message.Name — @message.Message
+ @message.Name — @message.Message
}
\ No newline at end of file
diff --git a/SharedLibraryCore/Database/DatabaseContext.cs b/SharedLibraryCore/Database/DatabaseContext.cs
index b55876779..b9d9b10ff 100644
--- a/SharedLibraryCore/Database/DatabaseContext.cs
+++ b/SharedLibraryCore/Database/DatabaseContext.cs
@@ -4,7 +4,6 @@ using SharedLibraryCore.Database.Models;
using SharedLibraryCore.Interfaces;
using System;
using System.Collections.Generic;
-using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
@@ -45,8 +44,9 @@ namespace SharedLibraryCore.Database
public override void Dispose()
{
#if DEBUG == true
- activeContextCount--;
+
Console.WriteLine($"Disposed DB Context #{activeContextCount}");
+ activeContextCount--;
#endif
}
diff --git a/SharedLibraryCore/Dtos/ChatInfo.cs b/SharedLibraryCore/Dtos/ChatInfo.cs
index 6c2d089b5..c67687f12 100644
--- a/SharedLibraryCore/Dtos/ChatInfo.cs
+++ b/SharedLibraryCore/Dtos/ChatInfo.cs
@@ -1,4 +1,5 @@
using System;
+using static SharedLibraryCore.Server;
namespace SharedLibraryCore.Dtos
{
@@ -8,5 +9,7 @@ namespace SharedLibraryCore.Dtos
public string Message { get; set; }
public DateTime Time { get; set; }
public string Name { get; set; }
+ public Game ServerGame { get; set; }
+ public bool IsQuickMessage { get; set; }
}
}
\ No newline at end of file
diff --git a/SharedLibraryCore/Dtos/ProfileMeta.cs b/SharedLibraryCore/Dtos/ProfileMeta.cs
index 07b4abd3f..98af69d5f 100644
--- a/SharedLibraryCore/Dtos/ProfileMeta.cs
+++ b/SharedLibraryCore/Dtos/ProfileMeta.cs
@@ -16,6 +16,7 @@ namespace SharedLibraryCore.Dtos
ChatMessage,
Penalized,
ReceivedPenalty,
+ QuickMessage
}
public DateTime When { get; set; }
diff --git a/SharedLibraryCore/Migrations/20190423142128_AddGameNameToEFServer.Designer.cs b/SharedLibraryCore/Migrations/20190423142128_AddGameNameToEFServer.Designer.cs
new file mode 100644
index 000000000..3c9e23081
--- /dev/null
+++ b/SharedLibraryCore/Migrations/20190423142128_AddGameNameToEFServer.Designer.cs
@@ -0,0 +1,699 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using SharedLibraryCore.Database;
+
+namespace SharedLibraryCore.Migrations
+{
+ [DbContext(typeof(DatabaseContext))]
+ [Migration("20190423142128_AddGameNameToEFServer")]
+ partial class AddGameNameToEFServer
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "2.2.2-servicing-10034");
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFACSnapshot", b =>
+ {
+ b.Property("SnapshotId")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("ClientId");
+
+ b.Property("CurrentSessionLength");
+
+ b.Property("CurrentStrain");
+
+ b.Property("CurrentViewAngleId");
+
+ b.Property("Deaths");
+
+ b.Property("Distance");
+
+ b.Property("EloRating");
+
+ b.Property("HitDestinationId");
+
+ b.Property("HitLocation");
+
+ b.Property("HitOriginId");
+
+ b.Property("HitType");
+
+ b.Property("Hits");
+
+ b.Property("Kills");
+
+ b.Property("LastStrainAngleId");
+
+ b.Property("SessionAngleOffset");
+
+ b.Property("SessionSPM");
+
+ b.Property("SessionScore");
+
+ b.Property("StrainAngleBetween");
+
+ b.Property("TimeSinceLastEvent");
+
+ b.Property("WeaponId");
+
+ b.Property("When");
+
+ b.HasKey("SnapshotId");
+
+ b.HasIndex("ClientId");
+
+ b.HasIndex("CurrentViewAngleId");
+
+ b.HasIndex("HitDestinationId");
+
+ b.HasIndex("HitOriginId");
+
+ b.HasIndex("LastStrainAngleId");
+
+ b.ToTable("EFACSnapshot");
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientKill", b =>
+ {
+ b.Property("KillId")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("AttackerId");
+
+ b.Property("Damage");
+
+ b.Property("DeathOriginVector3Id");
+
+ b.Property("DeathType");
+
+ b.Property("Fraction");
+
+ b.Property("HitLoc");
+
+ b.Property("IsKill");
+
+ b.Property("KillOriginVector3Id");
+
+ b.Property("Map");
+
+ b.Property("ServerId");
+
+ b.Property("VictimId");
+
+ b.Property("ViewAnglesVector3Id");
+
+ b.Property("VisibilityPercentage");
+
+ b.Property("Weapon");
+
+ b.Property("When");
+
+ b.HasKey("KillId");
+
+ b.HasIndex("AttackerId");
+
+ b.HasIndex("DeathOriginVector3Id");
+
+ b.HasIndex("KillOriginVector3Id");
+
+ b.HasIndex("ServerId");
+
+ b.HasIndex("VictimId");
+
+ b.HasIndex("ViewAnglesVector3Id");
+
+ b.ToTable("EFClientKills");
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientMessage", b =>
+ {
+ b.Property("MessageId")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("ClientId");
+
+ b.Property("Message");
+
+ b.Property("ServerId");
+
+ b.Property("TimeSent");
+
+ b.HasKey("MessageId");
+
+ b.HasIndex("ClientId");
+
+ b.HasIndex("ServerId");
+
+ b.HasIndex("TimeSent");
+
+ b.ToTable("EFClientMessages");
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientRatingHistory", b =>
+ {
+ b.Property("RatingHistoryId")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("ClientId");
+
+ b.HasKey("RatingHistoryId");
+
+ b.HasIndex("ClientId");
+
+ b.ToTable("EFClientRatingHistory");
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientStatistics", b =>
+ {
+ b.Property("ClientId");
+
+ b.Property("ServerId");
+
+ b.Property("Active");
+
+ b.Property("Deaths");
+
+ b.Property("EloRating");
+
+ b.Property("Kills");
+
+ b.Property("MaxStrain");
+
+ b.Property("RollingWeightedKDR");
+
+ b.Property("SPM");
+
+ b.Property("Skill");
+
+ b.Property("TimePlayed");
+
+ b.Property("VisionAverage");
+
+ b.HasKey("ClientId", "ServerId");
+
+ b.HasIndex("ServerId");
+
+ b.ToTable("EFClientStatistics");
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFHitLocationCount", b =>
+ {
+ b.Property("HitLocationCountId")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("ClientId")
+ .HasColumnName("EFClientStatistics_ClientId");
+
+ b.Property("HitCount");
+
+ b.Property("HitOffsetAverage");
+
+ b.Property("Location");
+
+ b.Property("MaxAngleDistance");
+
+ b.Property("ServerId")
+ .HasColumnName("EFClientStatistics_ServerId");
+
+ b.HasKey("HitLocationCountId");
+
+ b.HasIndex("ServerId");
+
+ b.HasIndex("ClientId", "ServerId");
+
+ b.ToTable("EFHitLocationCounts");
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFRating", b =>
+ {
+ b.Property("RatingId")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("ActivityAmount");
+
+ b.Property("Newest");
+
+ b.Property("Performance");
+
+ b.Property("Ranking");
+
+ b.Property("RatingHistoryId");
+
+ b.Property("ServerId");
+
+ b.Property("When");
+
+ b.HasKey("RatingId");
+
+ b.HasIndex("Performance");
+
+ b.HasIndex("Ranking");
+
+ b.HasIndex("RatingHistoryId");
+
+ b.HasIndex("ServerId");
+
+ b.HasIndex("When");
+
+ b.ToTable("EFRating");
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFServer", b =>
+ {
+ b.Property("ServerId");
+
+ b.Property("Active");
+
+ b.Property("EndPoint");
+
+ b.Property("GameName");
+
+ b.Property("Port");
+
+ b.HasKey("ServerId");
+
+ b.ToTable("EFServers");
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFServerStatistics", b =>
+ {
+ b.Property("StatisticId")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("ServerId");
+
+ b.Property("TotalKills");
+
+ b.Property("TotalPlayTime");
+
+ b.HasKey("StatisticId");
+
+ b.HasIndex("ServerId");
+
+ b.ToTable("EFServerStatistics");
+ });
+
+ modelBuilder.Entity("SharedLibraryCore.Database.Models.EFAlias", b =>
+ {
+ b.Property("AliasId")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("DateAdded");
+
+ b.Property("IPAddress");
+
+ b.Property("LinkId");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(24);
+
+ b.HasKey("AliasId");
+
+ b.HasIndex("IPAddress");
+
+ b.HasIndex("LinkId");
+
+ b.HasIndex("Name");
+
+ b.ToTable("EFAlias");
+ });
+
+ modelBuilder.Entity("SharedLibraryCore.Database.Models.EFAliasLink", b =>
+ {
+ b.Property("AliasLinkId")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.HasKey("AliasLinkId");
+
+ b.ToTable("EFAliasLinks");
+ });
+
+ modelBuilder.Entity("SharedLibraryCore.Database.Models.EFChangeHistory", b =>
+ {
+ b.Property("ChangeHistoryId")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("Comment")
+ .HasMaxLength(128);
+
+ b.Property("CurrentValue");
+
+ b.Property("OriginEntityId");
+
+ b.Property("PreviousValue");
+
+ b.Property("TargetEntityId");
+
+ b.Property("TimeChanged");
+
+ b.Property("TypeOfChange");
+
+ b.HasKey("ChangeHistoryId");
+
+ b.ToTable("EFChangeHistory");
+ });
+
+ modelBuilder.Entity("SharedLibraryCore.Database.Models.EFClient", b =>
+ {
+ b.Property("ClientId")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("AliasLinkId");
+
+ b.Property("Connections");
+
+ b.Property("CurrentAliasId");
+
+ b.Property("FirstConnection");
+
+ b.Property("LastConnection");
+
+ b.Property("Level");
+
+ b.Property("Masked");
+
+ b.Property("NetworkId");
+
+ b.Property("Password");
+
+ b.Property("PasswordSalt");
+
+ b.Property("TotalConnectionTime");
+
+ b.HasKey("ClientId");
+
+ b.HasIndex("AliasLinkId");
+
+ b.HasIndex("CurrentAliasId");
+
+ b.HasIndex("NetworkId")
+ .IsUnique();
+
+ b.ToTable("EFClients");
+ });
+
+ modelBuilder.Entity("SharedLibraryCore.Database.Models.EFMeta", b =>
+ {
+ b.Property("MetaId")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("ClientId");
+
+ b.Property("Created");
+
+ b.Property("Extra");
+
+ b.Property("Key")
+ .IsRequired()
+ .HasMaxLength(32);
+
+ b.Property("Updated");
+
+ b.Property("Value")
+ .IsRequired();
+
+ b.HasKey("MetaId");
+
+ b.HasIndex("ClientId");
+
+ b.HasIndex("Key");
+
+ b.ToTable("EFMeta");
+ });
+
+ modelBuilder.Entity("SharedLibraryCore.Database.Models.EFPenalty", b =>
+ {
+ b.Property("PenaltyId")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("AutomatedOffense");
+
+ b.Property("Expires");
+
+ b.Property("IsEvadedOffense");
+
+ b.Property("LinkId");
+
+ b.Property("OffenderId");
+
+ b.Property("Offense")
+ .IsRequired();
+
+ b.Property("PunisherId");
+
+ b.Property("Type");
+
+ b.Property("When");
+
+ b.HasKey("PenaltyId");
+
+ b.HasIndex("LinkId");
+
+ b.HasIndex("OffenderId");
+
+ b.HasIndex("PunisherId");
+
+ b.ToTable("EFPenalties");
+ });
+
+ modelBuilder.Entity("SharedLibraryCore.Helpers.Vector3", b =>
+ {
+ b.Property("Vector3Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("EFACSnapshotSnapshotId");
+
+ b.Property("X");
+
+ b.Property("Y");
+
+ b.Property("Z");
+
+ b.HasKey("Vector3Id");
+
+ b.HasIndex("EFACSnapshotSnapshotId");
+
+ b.ToTable("Vector3");
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFACSnapshot", b =>
+ {
+ b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
+ .WithMany()
+ .HasForeignKey("ClientId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("SharedLibraryCore.Helpers.Vector3", "CurrentViewAngle")
+ .WithMany()
+ .HasForeignKey("CurrentViewAngleId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("SharedLibraryCore.Helpers.Vector3", "HitDestination")
+ .WithMany()
+ .HasForeignKey("HitDestinationId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("SharedLibraryCore.Helpers.Vector3", "HitOrigin")
+ .WithMany()
+ .HasForeignKey("HitOriginId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("SharedLibraryCore.Helpers.Vector3", "LastStrainAngle")
+ .WithMany()
+ .HasForeignKey("LastStrainAngleId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientKill", b =>
+ {
+ b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Attacker")
+ .WithMany()
+ .HasForeignKey("AttackerId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("SharedLibraryCore.Helpers.Vector3", "DeathOrigin")
+ .WithMany()
+ .HasForeignKey("DeathOriginVector3Id");
+
+ b.HasOne("SharedLibraryCore.Helpers.Vector3", "KillOrigin")
+ .WithMany()
+ .HasForeignKey("KillOriginVector3Id");
+
+ b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
+ .WithMany()
+ .HasForeignKey("ServerId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Victim")
+ .WithMany()
+ .HasForeignKey("VictimId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("SharedLibraryCore.Helpers.Vector3", "ViewAngles")
+ .WithMany()
+ .HasForeignKey("ViewAnglesVector3Id");
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientMessage", b =>
+ {
+ b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
+ .WithMany()
+ .HasForeignKey("ClientId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
+ .WithMany()
+ .HasForeignKey("ServerId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientRatingHistory", b =>
+ {
+ b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
+ .WithMany()
+ .HasForeignKey("ClientId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientStatistics", b =>
+ {
+ b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
+ .WithMany()
+ .HasForeignKey("ClientId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
+ .WithMany()
+ .HasForeignKey("ServerId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFHitLocationCount", b =>
+ {
+ b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
+ .WithMany()
+ .HasForeignKey("ClientId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
+ .WithMany()
+ .HasForeignKey("ServerId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFClientStatistics")
+ .WithMany("HitLocations")
+ .HasForeignKey("ClientId", "ServerId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFRating", b =>
+ {
+ b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFClientRatingHistory", "RatingHistory")
+ .WithMany("Ratings")
+ .HasForeignKey("RatingHistoryId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
+ .WithMany()
+ .HasForeignKey("ServerId");
+ });
+
+ modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFServerStatistics", b =>
+ {
+ b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
+ .WithMany()
+ .HasForeignKey("ServerId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("SharedLibraryCore.Database.Models.EFAlias", b =>
+ {
+ b.HasOne("SharedLibraryCore.Database.Models.EFAliasLink", "Link")
+ .WithMany("Children")
+ .HasForeignKey("LinkId")
+ .OnDelete(DeleteBehavior.Restrict);
+ });
+
+ modelBuilder.Entity("SharedLibraryCore.Database.Models.EFClient", b =>
+ {
+ b.HasOne("SharedLibraryCore.Database.Models.EFAliasLink", "AliasLink")
+ .WithMany()
+ .HasForeignKey("AliasLinkId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("SharedLibraryCore.Database.Models.EFAlias", "CurrentAlias")
+ .WithMany()
+ .HasForeignKey("CurrentAliasId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("SharedLibraryCore.Database.Models.EFMeta", b =>
+ {
+ b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
+ .WithMany("Meta")
+ .HasForeignKey("ClientId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("SharedLibraryCore.Database.Models.EFPenalty", b =>
+ {
+ b.HasOne("SharedLibraryCore.Database.Models.EFAliasLink", "Link")
+ .WithMany("ReceivedPenalties")
+ .HasForeignKey("LinkId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Offender")
+ .WithMany("ReceivedPenalties")
+ .HasForeignKey("OffenderId")
+ .OnDelete(DeleteBehavior.Restrict);
+
+ b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Punisher")
+ .WithMany("AdministeredPenalties")
+ .HasForeignKey("PunisherId")
+ .OnDelete(DeleteBehavior.Restrict);
+ });
+
+ modelBuilder.Entity("SharedLibraryCore.Helpers.Vector3", b =>
+ {
+ b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFACSnapshot")
+ .WithMany("PredictedViewAngles")
+ .HasForeignKey("EFACSnapshotSnapshotId");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/SharedLibraryCore/Migrations/20190423142128_AddGameNameToEFServer.cs b/SharedLibraryCore/Migrations/20190423142128_AddGameNameToEFServer.cs
new file mode 100644
index 000000000..28e7155c5
--- /dev/null
+++ b/SharedLibraryCore/Migrations/20190423142128_AddGameNameToEFServer.cs
@@ -0,0 +1,22 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace SharedLibraryCore.Migrations
+{
+ public partial class AddGameNameToEFServer : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AddColumn(
+ name: "GameName",
+ table: "EFServers",
+ nullable: true);
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropColumn(
+ name: "GameName",
+ table: "EFServers");
+ }
+ }
+}
diff --git a/SharedLibraryCore/Migrations/DatabaseContextModelSnapshot.cs b/SharedLibraryCore/Migrations/DatabaseContextModelSnapshot.cs
index 2ecfd4260..9480f0c5f 100644
--- a/SharedLibraryCore/Migrations/DatabaseContextModelSnapshot.cs
+++ b/SharedLibraryCore/Migrations/DatabaseContextModelSnapshot.cs
@@ -283,6 +283,8 @@ namespace SharedLibraryCore.Migrations
b.Property("EndPoint");
+ b.Property("GameName");
+
b.Property("Port");
b.HasKey("ServerId");
@@ -432,7 +434,8 @@ namespace SharedLibraryCore.Migrations
b.Property("Extra");
b.Property("Key")
- .IsRequired();
+ .IsRequired()
+ .HasMaxLength(32);
b.Property("Updated");
diff --git a/SharedLibraryCore/RCon/Connection.cs b/SharedLibraryCore/RCon/Connection.cs
index b4fa6debe..13e255c74 100644
--- a/SharedLibraryCore/RCon/Connection.cs
+++ b/SharedLibraryCore/RCon/Connection.cs
@@ -120,7 +120,7 @@ namespace SharedLibraryCore.RCon
retrySend:
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
{
- //DontFragment = true,
+ DontFragment = true,
Ttl = 100,
ExclusiveAddressUse = true,
})
@@ -138,7 +138,7 @@ namespace SharedLibraryCore.RCon
if (response.Length == 0 && waitForResponse)
{
- throw new Exception();
+ throw new NetworkException("Expected response but got 0 bytes back");
}
connectionState.OnComplete.Release(1);
@@ -149,18 +149,16 @@ namespace SharedLibraryCore.RCon
{
if (connectionState.ConnectionAttempts < StaticHelpers.AllowedConnectionFails)
{
- // Log.WriteWarning($"{Utilities.CurrentLocalization.LocalizationIndex["SERVER_ERROR_COMMUNICATION"]} [{this.Endpoint}] ({connectionState.ConnectionAttempts}/{StaticHelpers.AllowedConnectionFails})");
await Task.Delay(StaticHelpers.FloodProtectionInterval);
goto retrySend;
}
connectionState.OnComplete.Release(1);
- //Log.WriteDebug(ex.GetExceptionInfo());
throw new NetworkException(Utilities.CurrentLocalization.LocalizationIndex["SERVER_ERROR_COMMUNICATION"].FormatExt(Endpoint));
}
}
- string responseString = Encoding.GetEncoding("windows-1252").GetString(response, 0, response.Length) + '\n';
+ string responseString = defaultEncoding.GetString(response, 0, response.Length) + '\n';
if (responseString.Contains("Invalid password"))
{
@@ -229,6 +227,8 @@ namespace SharedLibraryCore.RCon
}
}
+ rconSocket.Close();
+
byte[] response = connectionState.ReceiveBuffer
.Take(connectionState.ReceiveEventArgs.BytesTransferred)
.ToArray();
diff --git a/SharedLibraryCore/Utilities.cs b/SharedLibraryCore/Utilities.cs
index fb8fbeb9c..18acdefac 100644
--- a/SharedLibraryCore/Utilities.cs
+++ b/SharedLibraryCore/Utilities.cs
@@ -782,6 +782,11 @@ namespace SharedLibraryCore
}
}
+ public static bool IsQuickMessage(this string message)
+ {
+ return Regex.IsMatch(message, @"^\u0014(?:[A-Z]|_)+$");
+ }
+
#if DEBUG == true
private static readonly TypeInfo QueryCompilerTypeInfo = typeof(QueryCompiler).GetTypeInfo();
diff --git a/WebfrontCore/Views/Shared/Components/ProfileMetaList/_List.cshtml b/WebfrontCore/Views/Shared/Components/ProfileMetaList/_List.cshtml
index ae91e64c0..182a4d9fd 100644
--- a/WebfrontCore/Views/Shared/Components/ProfileMetaList/_List.cshtml
+++ b/WebfrontCore/Views/Shared/Components/ProfileMetaList/_List.cshtml
@@ -51,11 +51,13 @@
}
@switch (meta.Type)
- {
- case SharedLibraryCore.Dtos.ProfileMeta.MetaType.ChatMessage:
+ {
+
+ case SharedLibraryCore.Dtos.ProfileMeta.MetaType.ChatMessage:
+ case SharedLibraryCore.Dtos.ProfileMeta.MetaType.QuickMessage:
>
- @meta.Value
+ @meta.Value
break;
case SharedLibraryCore.Dtos.ProfileMeta.MetaType.ReceivedPenalty: