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