properly implement sv_sayName for custom say name
prevent trying to register live radar page for every server (oops) optimize event processing to prevent slow plugins from affecting command processing enable database connection resilency trim extra characters from T7 reassembled response
This commit is contained in:
parent
0b643b2099
commit
3ae2e42718
@ -5,6 +5,7 @@ using SharedLibraryCore.Interfaces;
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace IW4MAdmin.Application
|
namespace IW4MAdmin.Application
|
||||||
{
|
{
|
||||||
@ -12,9 +13,6 @@ namespace IW4MAdmin.Application
|
|||||||
{
|
{
|
||||||
readonly ApplicationManager Manager;
|
readonly ApplicationManager Manager;
|
||||||
private readonly EventProfiler _profiler;
|
private readonly EventProfiler _profiler;
|
||||||
private delegate void GameEventAddedEventHandler(object sender, GameEventArgs args);
|
|
||||||
private event GameEventAddedEventHandler GameEventAdded;
|
|
||||||
|
|
||||||
private static readonly GameEvent.EventType[] overrideEvents = new[]
|
private static readonly GameEvent.EventType[] overrideEvents = new[]
|
||||||
{
|
{
|
||||||
GameEvent.EventType.Connect,
|
GameEvent.EventType.Connect,
|
||||||
@ -27,14 +25,16 @@ namespace IW4MAdmin.Application
|
|||||||
{
|
{
|
||||||
Manager = (ApplicationManager)mgr;
|
Manager = (ApplicationManager)mgr;
|
||||||
_profiler = new EventProfiler(mgr.GetLogger(0));
|
_profiler = new EventProfiler(mgr.GetLogger(0));
|
||||||
GameEventAdded += GameEventHandler_GameEventAdded;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void GameEventHandler_GameEventAdded(object sender, GameEventArgs args)
|
private Task GameEventHandler_GameEventAdded(object sender, GameEventArgs args)
|
||||||
{
|
{
|
||||||
|
#if DEBUG
|
||||||
var start = DateTime.Now;
|
var start = DateTime.Now;
|
||||||
await Manager.ExecuteEvent(args.Event);
|
#endif
|
||||||
EventApi.OnGameEvent(sender, args);
|
EventApi.OnGameEvent(sender, args);
|
||||||
|
return Manager.ExecuteEvent(args.Event);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
_profiler.Profile(start, DateTime.Now, args.Event);
|
_profiler.Profile(start, DateTime.Now, args.Event);
|
||||||
#endif
|
#endif
|
||||||
@ -53,7 +53,8 @@ namespace IW4MAdmin.Application
|
|||||||
#if DEBUG
|
#if DEBUG
|
||||||
gameEvent.Owner.Logger.WriteDebug($"Adding event with id {gameEvent.Id}");
|
gameEvent.Owner.Logger.WriteDebug($"Adding event with id {gameEvent.Id}");
|
||||||
#endif
|
#endif
|
||||||
GameEventAdded?.Invoke(this, new GameEventArgs(null, false, gameEvent));
|
//GameEventAdded?.Invoke(this, new GameEventArgs(null, false, gameEvent));
|
||||||
|
Task.Run(() => GameEventHandler_GameEventAdded(this, new GameEventArgs(null, false, gameEvent)));
|
||||||
}
|
}
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
else
|
else
|
||||||
|
@ -152,36 +152,49 @@ namespace IW4MAdmin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var plugin in Manager.Plugins)
|
try
|
||||||
{
|
{
|
||||||
try
|
var loginPlugin = Manager.Plugins.FirstOrDefault(_plugin => _plugin.Name == "Login");
|
||||||
{
|
|
||||||
// we don't want to run the events on parser plugins
|
|
||||||
if (plugin is ScriptPlugin scriptPlugin && scriptPlugin.IsParser)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
await plugin.OnEventAsync(E, this);
|
if (loginPlugin != null)
|
||||||
}
|
|
||||||
catch (AuthorizationException e)
|
|
||||||
{
|
{
|
||||||
E.Origin.Tell($"{loc["COMMAND_NOTAUTHORIZED"]} - {e.Message}");
|
await loginPlugin.OnEventAsync(E, this);
|
||||||
canExecuteCommand = false;
|
|
||||||
}
|
|
||||||
catch (Exception Except)
|
|
||||||
{
|
|
||||||
Logger.WriteError($"{loc["SERVER_PLUGIN_ERROR"]} [{plugin.Name}]");
|
|
||||||
Logger.WriteDebug(Except.GetExceptionInfo());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
catch (AuthorizationException e)
|
||||||
|
{
|
||||||
|
E.Origin.Tell($"{loc["COMMAND_NOTAUTHORIZED"]} - {e.Message}");
|
||||||
|
canExecuteCommand = false;
|
||||||
|
}
|
||||||
|
|
||||||
// hack: this prevents commands from getting executing that 'shouldn't' be
|
// hack: this prevents commands from getting executing that 'shouldn't' be
|
||||||
if (E.Type == GameEvent.EventType.Command && E.Extra is Command command &&
|
if (E.Type == GameEvent.EventType.Command && E.Extra is Command command &&
|
||||||
(canExecuteCommand || E.Origin?.Level == Permission.Console))
|
(canExecuteCommand || E.Origin?.Level == Permission.Console))
|
||||||
{
|
{
|
||||||
await command.ExecuteAsync(E);
|
await command.ExecuteAsync(E);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var pluginTasks = Manager.Plugins.Where(_plugin => _plugin.Name != "Login").Select(async _plugin =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// we don't want to run the events on parser plugins
|
||||||
|
if (_plugin is ScriptPlugin scriptPlugin && scriptPlugin.IsParser)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await _plugin.OnEventAsync(E, this);
|
||||||
|
}
|
||||||
|
catch (Exception Except)
|
||||||
|
{
|
||||||
|
Logger.WriteError($"{loc["SERVER_PLUGIN_ERROR"]} [{_plugin.Name}]");
|
||||||
|
Logger.WriteDebug(Except.GetExceptionInfo());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Parallel.ForEach(pluginTasks, async (_task) => await _task);
|
||||||
}
|
}
|
||||||
|
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@ -944,6 +957,11 @@ namespace IW4MAdmin
|
|||||||
var logsync = await this.GetDvarAsync<int>("g_logsync");
|
var logsync = await this.GetDvarAsync<int>("g_logsync");
|
||||||
var ip = await this.GetDvarAsync<string>("net_ip");
|
var ip = await this.GetDvarAsync<string>("net_ip");
|
||||||
|
|
||||||
|
if (Manager.GetApplicationSettings().Configuration().EnableCustomSayName)
|
||||||
|
{
|
||||||
|
await this.SetDvarAsync("sv_sayname", Manager.GetApplicationSettings().Configuration().CustomSayName);
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var website = await this.GetDvarAsync<string>("_website");
|
var website = await this.GetDvarAsync<string>("_website");
|
||||||
|
@ -220,7 +220,7 @@ namespace IW4MAdmin.Application.RCon
|
|||||||
var statusHeaderMatch = config.StatusHeader.PatternMatcher.Match(responseString);
|
var statusHeaderMatch = config.StatusHeader.PatternMatcher.Match(responseString);
|
||||||
if (statusHeaderMatch.Success)
|
if (statusHeaderMatch.Success)
|
||||||
{
|
{
|
||||||
splitStatusStrings.Insert(0, responseString);
|
splitStatusStrings.Insert(0, responseString.TrimEnd('\0'));
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
|
@ -17,6 +17,7 @@ namespace LiveRadar
|
|||||||
public string Author => "RaidMax";
|
public string Author => "RaidMax";
|
||||||
|
|
||||||
private readonly IConfigurationHandler<LiveRadarConfiguration> _configurationHandler;
|
private readonly IConfigurationHandler<LiveRadarConfiguration> _configurationHandler;
|
||||||
|
private bool addedPage;
|
||||||
|
|
||||||
public Plugin(IConfigurationHandlerFactory configurationHandlerFactory)
|
public Plugin(IConfigurationHandlerFactory configurationHandlerFactory)
|
||||||
{
|
{
|
||||||
@ -27,11 +28,13 @@ namespace LiveRadar
|
|||||||
{
|
{
|
||||||
// if it's an IW4 game, with custom callbacks, we want to
|
// if it's an IW4 game, with custom callbacks, we want to
|
||||||
// enable the live radar page
|
// enable the live radar page
|
||||||
if (E.Type == GameEvent.EventType.Start &&
|
if (E.Type == GameEvent.EventType.Start &&
|
||||||
S.GameName == Server.Game.IW4 &&
|
S.GameName == Server.Game.IW4 &&
|
||||||
S.CustomCallback)
|
S.CustomCallback &&
|
||||||
|
!addedPage)
|
||||||
{
|
{
|
||||||
E.Owner.Manager.GetPageList().Pages.Add(Utilities.CurrentLocalization.LocalizationIndex["WEBFRONT_RADAR_TITLE"], "/Radar/All");
|
E.Owner.Manager.GetPageList().Pages.Add(Utilities.CurrentLocalization.LocalizationIndex["WEBFRONT_RADAR_TITLE"], "/Radar/All");
|
||||||
|
addedPage = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (E.Type == GameEvent.EventType.Unknown)
|
if (E.Type == GameEvent.EventType.Unknown)
|
||||||
|
@ -95,10 +95,10 @@ namespace SharedLibraryCore.Database
|
|||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case "mysql":
|
case "mysql":
|
||||||
optionsBuilder.UseMySql(_ConnectionString);
|
optionsBuilder.UseMySql(_ConnectionString, _options => _options.EnableRetryOnFailure());
|
||||||
break;
|
break;
|
||||||
case "postgresql":
|
case "postgresql":
|
||||||
optionsBuilder.UseNpgsql(_ConnectionString);
|
optionsBuilder.UseNpgsql(_ConnectionString, _options => _options.EnableRetryOnFailure());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -273,11 +273,11 @@ namespace SharedLibraryCore
|
|||||||
|
|
||||||
if (!processed)
|
if (!processed)
|
||||||
{
|
{
|
||||||
|
Owner?.Logger.WriteError("Waiting for event to complete timed out");
|
||||||
|
Owner?.Logger.WriteDebug($"{Id}, {Type}, {Data}, {Extra}, {FailReason.ToString()}, {Message}, {Origin}, {Target}");
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
throw new Exception();
|
throw new Exception();
|
||||||
#endif
|
#endif
|
||||||
Owner?.Logger.WriteError("Waiting for event to complete timed out");
|
|
||||||
Owner?.Logger.WriteDebug($"{Id}, {Type}, {Data}, {Extra}, {FailReason.ToString()}, {Message}, {Origin}, {Target}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -147,7 +147,7 @@ namespace SharedLibraryCore
|
|||||||
protected async Task Tell(string message, EFClient target)
|
protected async Task Tell(string message, EFClient target)
|
||||||
{
|
{
|
||||||
#if !DEBUG
|
#if !DEBUG
|
||||||
string formattedMessage = string.Format(RconParser.Configuration.CommandPrefixes.Tell, target.ClientNumber, $"{(CustomSayEnabled ? $"{CustomSayName}: " : "")}{message.FixIW4ForwardSlash()}");
|
string formattedMessage = string.Format(RconParser.Configuration.CommandPrefixes.Tell, target.ClientNumber, $"{(CustomSayEnabled && GameName == Game.IW4 ? $"{CustomSayName}: " : "")}{message.FixIW4ForwardSlash()}");
|
||||||
if (target.ClientNumber > -1 && message.Length > 0 && target.Level != EFClient.Permission.Console)
|
if (target.ClientNumber > -1 && message.Length > 0 && target.Level != EFClient.Permission.Console)
|
||||||
await this.ExecuteCommandAsync(formattedMessage);
|
await this.ExecuteCommandAsync(formattedMessage);
|
||||||
#else
|
#else
|
||||||
|
Loading…
Reference in New Issue
Block a user