diff --git a/Application/Application.csproj b/Application/Application.csproj index ca9bec2b6..718eb33f2 100644 --- a/Application/Application.csproj +++ b/Application/Application.csproj @@ -56,12 +56,15 @@ Always - + PreserveNewest PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Application/IO/GameLogEvent.cs b/Application/IO/GameLogEvent.cs index 56e96d408..cbd14712b 100644 --- a/Application/IO/GameLogEvent.cs +++ b/Application/IO/GameLogEvent.cs @@ -17,7 +17,6 @@ namespace IW4MAdmin.Application.IO GameLogReader Reader; Timer RefreshInfoTimer; string GameLogFile; - FileInfo Info; public GameLogEvent(Server server, string gameLogPath, string gameLogName) { @@ -26,13 +25,11 @@ namespace IW4MAdmin.Application.IO Server = server; RefreshInfoTimer = new Timer((sender) => { - var newInfo = new FileInfo(GameLogFile); - if (newInfo.Length - Info?.Length > 0) - LogPathWatcher_Changed(this, new FileSystemEventArgs(WatcherChangeTypes.Changed, "", "")); - Info = newInfo; + long newLength = new FileInfo(GameLogFile).Length; + UpdateLogEvents(newLength); }, null, 0, 100); - LogPathWatcher = new FileSystemWatcher() + /*LogPathWatcher = new FileSystemWatcher() { Path = gameLogPath.Replace(gameLogName, ""), Filter = gameLogName, @@ -40,33 +37,33 @@ namespace IW4MAdmin.Application.IO InternalBufferSize = 4096 }; - LogPathWatcher.Changed += LogPathWatcher_Changed; - LogPathWatcher.EnableRaisingEvents = true; + // LogPathWatcher.Changed += LogPathWatcher_Changed; + LogPathWatcher.EnableRaisingEvents = true;*/ } + /* ~GameLogEvent() { LogPathWatcher.EnableRaisingEvents = false; - } + }*/ - private void LogPathWatcher_Changed(object sender, FileSystemEventArgs e) + private void UpdateLogEvents(long fileSize) { - // retrieve the new file size - long newFileSize = new FileInfo(GameLogFile).Length; - if (PreviousFileSize == 0) - PreviousFileSize = newFileSize; + PreviousFileSize = fileSize; - long fileDiff = newFileSize - PreviousFileSize; + long fileDiff = fileSize - PreviousFileSize; if (fileDiff < 1) return; - var events = Reader.EventsFromLog(Server, fileDiff); + PreviousFileSize = fileSize; + + var events = Reader.EventsFromLog(Server, fileDiff, 0); foreach (var ev in events) Server.Manager.GetEventHandler().AddEvent(ev); - PreviousFileSize = newFileSize; + PreviousFileSize = fileSize; } } } diff --git a/Application/IO/GameLogReader.cs b/Application/IO/GameLogReader.cs index f6e60fae4..458a00acc 100644 --- a/Application/IO/GameLogReader.cs +++ b/Application/IO/GameLogReader.cs @@ -18,29 +18,41 @@ namespace IW4MAdmin.Application.IO Parser = parser; } - public ICollection EventsFromLog(Server server, long fileSizeDiff) + public ICollection EventsFromLog(Server server, long fileSizeDiff, long startPosition) { // allocate the bytes for the new log lines - byte[] fileBytes = new byte[fileSizeDiff]; + List logLines = new List(); // open the file as a stream - using (var rd = new BinaryReader(new FileStream(LogFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Utilities.EncodingType)) + using (var rd = new StreamReader(new FileStream(LogFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Utilities.EncodingType)) { - rd.BaseStream.Seek(rd.BaseStream.Length - fileSizeDiff - 1, SeekOrigin.Begin); + // take the old start position and go back the number of new characters + rd.BaseStream.Seek(-fileSizeDiff, SeekOrigin.End); // the difference should be in the range of a int :P - rd.Read(fileBytes, 0, (int)fileSizeDiff); + string newLine; + while (!String.IsNullOrEmpty(newLine = rd.ReadLine())) + { + logLines.Add(newLine.Replace("\r\n", "")); + } } - // convert to event line list - string[] logLines = Utilities.EncodingType.GetString(fileBytes).Replace("\r", "").Split('\n'); - List events = new List(); // parse each line foreach (string eventLine in logLines) { if (eventLine.Length > 0) - events.Add(Parser.GetEvent(server, eventLine)); + { + try + { + // todo: catch elsewhere + events.Add(Parser.GetEvent(server, eventLine)); + } + + catch (Exception e) + { + } + } } return events; diff --git a/Application/Localization/Configure.cs b/Application/Localization/Configure.cs index 78e7c7c64..eeff68aa7 100644 --- a/Application/Localization/Configure.cs +++ b/Application/Localization/Configure.cs @@ -12,7 +12,10 @@ namespace IW4MAdmin.Application.Localization public static void Initialize() { string currentLocale = Program.ServerManager.GetApplicationSettings().Configuration().CustomLocale ?? - CultureInfo.CurrentCulture.Name.Substring(0, 2); + CultureInfo.CurrentCulture.Name?.Substring(0, 2); + + if (currentLocale == null) + throw new Exception("Computer CurrentCulture does not exist"); #if DEBUG // currentLocal = "ru-RU"; #endif @@ -26,10 +29,12 @@ namespace IW4MAdmin.Application.Localization else { - localizationFile = $"Localization{Path.DirectorySeparatorChar}IW4MAdmin.en-US.json"; + 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); } } diff --git a/Application/Localization/IW4MAdmin.en-US.json b/Application/Localization/IW4MAdmin.en-EN.json similarity index 100% rename from Application/Localization/IW4MAdmin.en-US.json rename to Application/Localization/IW4MAdmin.en-EN.json diff --git a/Application/Localization/IW4MAdmin.pt-PT.json b/Application/Localization/IW4MAdmin.pt-PT.json new file mode 100644 index 000000000..e86a8ed9d --- /dev/null +++ b/Application/Localization/IW4MAdmin.pt-PT.json @@ -0,0 +1,198 @@ +// translated by Daniel aka Vou te comer +{ + "LocalizationName": "pt-BR", + "LocalizationSet": { + "MANAGER_VERSION_FAIL": "Não foi possível obter a versão mais recente do IW4MAdmin", + "MANAGER_VERSION_UPDATE": "Tem uma atualização. 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 propietá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 possivel 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 expluso", + "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 reniciado rapidamente", + "COMMANDS_MAPROTATE": "Rotacionando o mapa em ^55 ^7segundos", + "COMMANDS_SETLEVEL_SELF": "Você não pode mudar seu própio 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 desmarcarado", + "COMMANDS_BANINFO_NONE": "Nenhum banimento ativo foi encontrado para esse jogador", + "COMMANDS_BANINO_SUCCESS": "foi bannido 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": "renincializa 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": "commandos", + "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 connectado 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" + } +} \ No newline at end of file diff --git a/Application/Manager.cs b/Application/Manager.cs index 9561cafe7..4fe102d2e 100644 --- a/Application/Manager.cs +++ b/Application/Manager.cs @@ -366,7 +366,10 @@ namespace IW4MAdmin.Application { try { - Task.WaitAll(newEvent.Owner.ExecuteEvent(newEvent)); + newEvent.Owner.ExecuteEvent(newEvent).Wait(); +#if DEBUG + Logger.WriteDebug("Processed Event"); +#endif } catch (Exception E) @@ -374,6 +377,8 @@ namespace IW4MAdmin.Application Logger.WriteError($"{Utilities.CurrentLocalization.LocalizationSet["SERVER_ERROR_EXCEPTION"]} {newEvent.Owner}"); Logger.WriteDebug("Error Message: " + E.Message); Logger.WriteDebug("Error Trace: " + E.StackTrace); + newEvent.OnProcessed.Set(); + continue; } // tell anyone waiting for the output that we're done newEvent.OnProcessed.Set(); diff --git a/Application/Server.cs b/Application/Server.cs index 0c9bdc6ed..f520ffa99 100644 --- a/Application/Server.cs +++ b/Application/Server.cs @@ -984,8 +984,8 @@ namespace IW4MAdmin Link = Target.AliasLink }; - await Manager.GetPenaltyService().Create(unbanPenalty); await Manager.GetPenaltyService().RemoveActivePenalties(Target.AliasLink.AliasLinkId); + await Manager.GetPenaltyService().Create(unbanPenalty); } override public void InitializeTokens() diff --git a/Plugins/Login/Plugin.cs b/Plugins/Login/Plugin.cs index 2e276af48..14d87b81a 100644 --- a/Plugins/Login/Plugin.cs +++ b/Plugins/Login/Plugin.cs @@ -37,7 +37,8 @@ namespace IW4MAdmin.Plugins.Login if (E.Type == GameEvent.EventType.Command) { - if (E.Origin.Level < Player.Permission.Moderator) + if (E.Origin.Level < Player.Permission.Moderator || + E.Origin.Level == Player.Permission.Console) return Task.CompletedTask; E.Owner.Manager.GetPrivilegedClients().TryGetValue(E.Origin.ClientId, out Player client); diff --git a/SharedLibraryCore/Services/PenaltyService.cs b/SharedLibraryCore/Services/PenaltyService.cs index bc34f0e61..c3e82a4c6 100644 --- a/SharedLibraryCore/Services/PenaltyService.cs +++ b/SharedLibraryCore/Services/PenaltyService.cs @@ -249,9 +249,14 @@ namespace SharedLibraryCore.Services p.Active = false; // reset the player levels if (p.Type == Objects.Penalty.PenaltyType.Ban) - await context.Clients - .Where(c => c.AliasLinkId == p.LinkId) - .ForEachAsync(c => c.Level = Objects.Player.Permission.User); + { + using (var internalContext = new DatabaseContext()) + { + await internalContext.Clients + .Where(c => c.AliasLinkId == p.LinkId) + .ForEachAsync(c => c.Level = Objects.Player.Permission.User); + } + } }); await context.SaveChangesAsync(); diff --git a/WebfrontCore/Controllers/BaseController.cs b/WebfrontCore/Controllers/BaseController.cs index a409ebd01..29718a905 100644 --- a/WebfrontCore/Controllers/BaseController.cs +++ b/WebfrontCore/Controllers/BaseController.cs @@ -22,7 +22,7 @@ namespace WebfrontCore.Controllers public BaseController() { - var Manager = Program.Manager; + Manager = Program.Manager; if (Manager.GetApplicationSettings().Configuration().EnableDiscordLink) { string inviteLink = Manager.GetApplicationSettings().Configuration().DiscordInviteCode; diff --git a/WebfrontCore/Controllers/ConsoleController.cs b/WebfrontCore/Controllers/ConsoleController.cs index 6868da350..2ff1dfdd8 100644 --- a/WebfrontCore/Controllers/ConsoleController.cs +++ b/WebfrontCore/Controllers/ConsoleController.cs @@ -48,7 +48,7 @@ namespace WebfrontCore.Controllers Manager.GetEventHandler().AddEvent(remoteEvent); // wait for the event to process - remoteEvent.OnProcessed.Wait(); + await Task.Run(() => remoteEvent.OnProcessed.Wait()); var response = server.CommandResult.Where(c => c.ClientId == client.ClientId).ToList(); // remove the added command response