Finish implementation of configuable command permissions
This commit is contained in:
parent
11ae91281f
commit
318a23ae5b
@ -9,7 +9,6 @@ using SharedLibraryCore.Configuration.Validation;
|
|||||||
using SharedLibraryCore.Database;
|
using SharedLibraryCore.Database;
|
||||||
using SharedLibraryCore.Database.Models;
|
using SharedLibraryCore.Database.Models;
|
||||||
using SharedLibraryCore.Dtos;
|
using SharedLibraryCore.Dtos;
|
||||||
using SharedLibraryCore.Events;
|
|
||||||
using SharedLibraryCore.Exceptions;
|
using SharedLibraryCore.Exceptions;
|
||||||
using SharedLibraryCore.Helpers;
|
using SharedLibraryCore.Helpers;
|
||||||
using SharedLibraryCore.Interfaces;
|
using SharedLibraryCore.Interfaces;
|
||||||
@ -49,7 +48,7 @@ namespace IW4MAdmin.Application
|
|||||||
private readonly ClientService ClientSvc;
|
private readonly ClientService ClientSvc;
|
||||||
readonly AliasService AliasSvc;
|
readonly AliasService AliasSvc;
|
||||||
readonly PenaltyService PenaltySvc;
|
readonly PenaltyService PenaltySvc;
|
||||||
public BaseConfigurationHandler<ApplicationConfiguration> ConfigHandler;
|
public IConfigurationHandler<ApplicationConfiguration> ConfigHandler;
|
||||||
GameEventHandler Handler;
|
GameEventHandler Handler;
|
||||||
readonly IPageList PageList;
|
readonly IPageList PageList;
|
||||||
private readonly Dictionary<long, ILogger> _loggers = new Dictionary<long, ILogger>();
|
private readonly Dictionary<long, ILogger> _loggers = new Dictionary<long, ILogger>();
|
||||||
@ -58,9 +57,12 @@ namespace IW4MAdmin.Application
|
|||||||
private readonly CancellationTokenSource _tokenSource;
|
private readonly CancellationTokenSource _tokenSource;
|
||||||
private readonly Dictionary<string, Task<IList>> _operationLookup = new Dictionary<string, Task<IList>>();
|
private readonly Dictionary<string, Task<IList>> _operationLookup = new Dictionary<string, Task<IList>>();
|
||||||
private readonly ITranslationLookup _translationLookup;
|
private readonly ITranslationLookup _translationLookup;
|
||||||
private readonly CommandConfiguration _commandConfiguration;
|
private readonly IConfigurationHandler<CommandConfiguration> _commandConfiguration;
|
||||||
|
private readonly IPluginImporter _pluginImporter;
|
||||||
|
|
||||||
public ApplicationManager(ILogger logger, IMiddlewareActionHandler actionHandler, IEnumerable<IManagerCommand> commands, ITranslationLookup translationLookup, CommandConfiguration commandConfiguration)
|
public ApplicationManager(ILogger logger, IMiddlewareActionHandler actionHandler, IEnumerable<IManagerCommand> commands,
|
||||||
|
ITranslationLookup translationLookup, IConfigurationHandler<CommandConfiguration> commandConfiguration,
|
||||||
|
IConfigurationHandler<ApplicationConfiguration> appConfigHandler, IPluginImporter pluginImporter)
|
||||||
{
|
{
|
||||||
MiddlewareActionHandler = actionHandler;
|
MiddlewareActionHandler = actionHandler;
|
||||||
_servers = new ConcurrentBag<Server>();
|
_servers = new ConcurrentBag<Server>();
|
||||||
@ -68,7 +70,7 @@ namespace IW4MAdmin.Application
|
|||||||
ClientSvc = new ClientService();
|
ClientSvc = new ClientService();
|
||||||
AliasSvc = new AliasService();
|
AliasSvc = new AliasService();
|
||||||
PenaltySvc = new PenaltyService();
|
PenaltySvc = new PenaltyService();
|
||||||
ConfigHandler = new BaseConfigurationHandler<ApplicationConfiguration>("IW4MAdminSettings");
|
ConfigHandler = appConfigHandler;
|
||||||
StartTime = DateTime.UtcNow;
|
StartTime = DateTime.UtcNow;
|
||||||
PageList = new PageList();
|
PageList = new PageList();
|
||||||
AdditionalEventParsers = new List<IEventParser>();
|
AdditionalEventParsers = new List<IEventParser>();
|
||||||
@ -80,6 +82,7 @@ namespace IW4MAdmin.Application
|
|||||||
_commands = commands.ToList();
|
_commands = commands.ToList();
|
||||||
_translationLookup = translationLookup;
|
_translationLookup = translationLookup;
|
||||||
_commandConfiguration = commandConfiguration;
|
_commandConfiguration = commandConfiguration;
|
||||||
|
_pluginImporter = pluginImporter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task ExecuteEvent(GameEvent newEvent)
|
public async Task ExecuteEvent(GameEvent newEvent)
|
||||||
@ -157,9 +160,9 @@ namespace IW4MAdmin.Application
|
|||||||
return Servers;
|
return Servers;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IList<Command> GetCommands()
|
public IList<IManagerCommand> GetCommands()
|
||||||
{
|
{
|
||||||
return new List<Command>();
|
return _commands;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateServerStates()
|
public async Task UpdateServerStates()
|
||||||
@ -246,18 +249,21 @@ namespace IW4MAdmin.Application
|
|||||||
ExternalIPAddress = await Utilities.GetExternalIP();
|
ExternalIPAddress = await Utilities.GetExternalIP();
|
||||||
|
|
||||||
#region PLUGINS
|
#region PLUGINS
|
||||||
SharedLibraryCore.Plugins.PluginImporter.Load(this);
|
foreach (var plugin in _pluginImporter.ActivePlugins)
|
||||||
|
|
||||||
foreach (var Plugin in SharedLibraryCore.Plugins.PluginImporter.ActivePlugins)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await Plugin.OnLoadAsync(this);
|
if (plugin is ScriptPlugin scriptPlugin)
|
||||||
|
{
|
||||||
|
await scriptPlugin.Initialize(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
await plugin.OnLoadAsync(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.WriteError($"{Utilities.CurrentLocalization.LocalizationIndex["SERVER_ERROR_PLUGIN"]} {Plugin.Name}");
|
Logger.WriteError($"{_translationLookup["SERVER_ERROR_PLUGIN"]} {plugin.Name}");
|
||||||
Logger.WriteDebug(ex.GetExceptionInfo());
|
Logger.WriteDebug(ex.GetExceptionInfo());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -298,7 +304,7 @@ namespace IW4MAdmin.Application
|
|||||||
}
|
}
|
||||||
|
|
||||||
newConfig.Servers = newConfig.Servers.Append((ServerConfiguration)serverConfig.Generate()).ToArray();
|
newConfig.Servers = newConfig.Servers.Append((ServerConfiguration)serverConfig.Generate()).ToArray();
|
||||||
} while (Utilities.PromptBool(Utilities.CurrentLocalization.LocalizationIndex["SETUP_SERVER_SAVE"]));
|
} while (Utilities.PromptBool(_translationLookup["SETUP_SERVER_SAVE"]));
|
||||||
|
|
||||||
config = newConfig;
|
config = newConfig;
|
||||||
await ConfigHandler.Save();
|
await ConfigHandler.Save();
|
||||||
@ -324,9 +330,10 @@ namespace IW4MAdmin.Application
|
|||||||
|
|
||||||
if (!validationResult.IsValid)
|
if (!validationResult.IsValid)
|
||||||
{
|
{
|
||||||
throw new ConfigurationException(Utilities.CurrentLocalization.LocalizationIndex["MANAGER_CONFIGURATION_ERROR"])
|
throw new ConfigurationException("MANAGER_CONFIGURATION_ERROR")
|
||||||
{
|
{
|
||||||
Errors = validationResult.Errors.Select(_error => _error.ErrorMessage).ToArray()
|
Errors = validationResult.Errors.Select(_error => _error.ErrorMessage).ToArray(),
|
||||||
|
ConfigurationFileName = ConfigHandler.FileName
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -376,31 +383,34 @@ namespace IW4MAdmin.Application
|
|||||||
_commands.RemoveAll(_cmd => _cmd.GetType() == typeof(OwnerCommand));
|
_commands.RemoveAll(_cmd => _cmd.GetType() == typeof(OwnerCommand));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (Command C in SharedLibraryCore.Plugins.PluginImporter.ActiveCommands)
|
List<IManagerCommand> commandsToAddToConfig = new List<IManagerCommand>();
|
||||||
|
var cmdConfig = _commandConfiguration.Configuration();
|
||||||
|
|
||||||
|
if (cmdConfig == null)
|
||||||
{
|
{
|
||||||
_commands.Add(C);
|
cmdConfig = new CommandConfiguration();
|
||||||
|
commandsToAddToConfig.AddRange(_commands);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_commandConfiguration == null)
|
else
|
||||||
{
|
{
|
||||||
// todo: this is here for now. it's not the most elegant but currently there's no way to know all the plugin comamnds during DI
|
var unsavedCommands = _commands.Where(_cmd => !cmdConfig.Commands.Keys.Contains(_cmd.GetType().Name));
|
||||||
var handler = new BaseConfigurationHandler<CommandConfiguration>("CommandConfiguration");
|
commandsToAddToConfig.AddRange(unsavedCommands);
|
||||||
var cmdConfig = new CommandConfiguration();
|
}
|
||||||
|
|
||||||
foreach (var cmd in _commands)
|
foreach (var cmd in commandsToAddToConfig)
|
||||||
|
{
|
||||||
|
cmdConfig.Commands.Add(cmd.GetType().Name,
|
||||||
|
new CommandProperties()
|
||||||
{
|
{
|
||||||
cmdConfig.Commands.Add(cmd.GetType().Name,
|
Name = cmd.Name,
|
||||||
new CommandProperties()
|
Alias = cmd.Alias,
|
||||||
{
|
MinimumPermission = cmd.Permission
|
||||||
Name = cmd.Name,
|
});
|
||||||
Alias = cmd.Alias,
|
|
||||||
MinimumPermission = cmd.Permission
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
handler.Set(cmdConfig);
|
|
||||||
await handler.Save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_commandConfiguration.Set(cmdConfig);
|
||||||
|
await _commandConfiguration.Save();
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region META
|
#region META
|
||||||
@ -541,7 +551,7 @@ namespace IW4MAdmin.Application
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var ServerInstance = new IW4MServer(this, Conf, _translationLookup);
|
var ServerInstance = new IW4MServer(this, Conf, _translationLookup, _pluginImporter);
|
||||||
await ServerInstance.Initialize();
|
await ServerInstance.Initialize();
|
||||||
|
|
||||||
_servers.Add(ServerInstance);
|
_servers.Add(ServerInstance);
|
||||||
@ -735,7 +745,7 @@ namespace IW4MAdmin.Application
|
|||||||
|
|
||||||
public IList<Assembly> GetPluginAssemblies()
|
public IList<Assembly> GetPluginAssemblies()
|
||||||
{
|
{
|
||||||
return SharedLibraryCore.Plugins.PluginImporter.PluginAssemblies.Union(SharedLibraryCore.Plugins.PluginImporter.Assemblies).ToList();
|
return _pluginImporter.PluginAssemblies.Union(_pluginImporter.Assemblies).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IPageList GetPageList()
|
public IPageList GetPageList()
|
||||||
|
@ -27,12 +27,14 @@ namespace IW4MAdmin
|
|||||||
private GameLogEventDetection LogEvent;
|
private GameLogEventDetection LogEvent;
|
||||||
private readonly ITranslationLookup _translationLookup;
|
private readonly ITranslationLookup _translationLookup;
|
||||||
private const int REPORT_FLAG_COUNT = 4;
|
private const int REPORT_FLAG_COUNT = 4;
|
||||||
|
private readonly IPluginImporter _pluginImporter;
|
||||||
|
|
||||||
public int Id { get; private set; }
|
public int Id { get; private set; }
|
||||||
|
|
||||||
public IW4MServer(IManager mgr, ServerConfiguration cfg, ITranslationLookup lookup) : base(mgr, cfg)
|
public IW4MServer(IManager mgr, ServerConfiguration cfg, ITranslationLookup lookup, IPluginImporter pluginImporter) : base(mgr, cfg)
|
||||||
{
|
{
|
||||||
_translationLookup = lookup;
|
_translationLookup = lookup;
|
||||||
|
_pluginImporter = pluginImporter;
|
||||||
}
|
}
|
||||||
|
|
||||||
override public async Task<EFClient> OnClientConnected(EFClient clientFromLog)
|
override public async Task<EFClient> OnClientConnected(EFClient clientFromLog)
|
||||||
@ -150,7 +152,7 @@ namespace IW4MAdmin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var plugin in SharedLibraryCore.Plugins.PluginImporter.ActivePlugins)
|
foreach (var plugin in _pluginImporter.ActivePlugins)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -668,7 +670,7 @@ namespace IW4MAdmin
|
|||||||
await e.WaitAsync(Utilities.DefaultCommandTimeout, new CancellationTokenRegistration().Token);
|
await e.WaitAsync(Utilities.DefaultCommandTimeout, new CancellationTokenRegistration().Token);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var plugin in SharedLibraryCore.Plugins.PluginImporter.ActivePlugins)
|
foreach (var plugin in _pluginImporter.ActivePlugins)
|
||||||
{
|
{
|
||||||
await plugin.OnUnloadAsync();
|
await plugin.OnUnloadAsync();
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using IW4MAdmin.Application.Migration;
|
using IW4MAdmin.Application.Helpers;
|
||||||
|
using IW4MAdmin.Application.Migration;
|
||||||
using IW4MAdmin.Application.Misc;
|
using IW4MAdmin.Application.Misc;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using SharedLibraryCore;
|
using SharedLibraryCore;
|
||||||
@ -20,6 +21,7 @@ namespace IW4MAdmin.Application
|
|||||||
public static ApplicationManager ServerManager;
|
public static ApplicationManager ServerManager;
|
||||||
private static Task ApplicationTask;
|
private static Task ApplicationTask;
|
||||||
private static readonly BuildNumber _fallbackVersion = BuildNumber.Parse("99.99.99.99");
|
private static readonly BuildNumber _fallbackVersion = BuildNumber.Parse("99.99.99.99");
|
||||||
|
private static ServiceProvider serviceProvider;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// entrypoint of the application
|
/// entrypoint of the application
|
||||||
@ -62,31 +64,49 @@ namespace IW4MAdmin.Application
|
|||||||
private static async Task LaunchAsync()
|
private static async Task LaunchAsync()
|
||||||
{
|
{
|
||||||
restart:
|
restart:
|
||||||
|
ITranslationLookup translationLookup = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var services = ConfigureServices();
|
var services = ConfigureServices();
|
||||||
|
|
||||||
using (var builder = services.BuildServiceProvider())
|
using (var builder = services.BuildServiceProvider())
|
||||||
{
|
{
|
||||||
ServerManager = (ApplicationManager)builder.GetRequiredService<IManager>();
|
translationLookup = builder.GetRequiredService<ITranslationLookup>();
|
||||||
|
var importer = builder.GetRequiredService<IPluginImporter>();
|
||||||
|
importer.Load();
|
||||||
|
|
||||||
|
foreach (var type in importer.CommandTypes)
|
||||||
|
{
|
||||||
|
services.AddTransient(typeof(IManagerCommand), type);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var commandDefinition in typeof(SharedLibraryCore.Commands.QuitCommand).Assembly.GetTypes()
|
||||||
|
.Where(_command => _command.BaseType == typeof(Command)))
|
||||||
|
{
|
||||||
|
services.AddTransient(typeof(IManagerCommand), commandDefinition);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
serviceProvider = services.BuildServiceProvider();
|
||||||
|
var pluginImporter = serviceProvider.GetRequiredService<IPluginImporter>();
|
||||||
|
pluginImporter.Load();
|
||||||
|
|
||||||
|
ServerManager = (ApplicationManager)serviceProvider.GetRequiredService<IManager>();
|
||||||
|
|
||||||
// do any needed housekeeping file/folder migrations
|
// do any needed housekeeping file/folder migrations
|
||||||
ConfigurationMigration.MoveConfigFolder10518(null);
|
ConfigurationMigration.MoveConfigFolder10518(null);
|
||||||
ConfigurationMigration.CheckDirectories();
|
ConfigurationMigration.CheckDirectories();
|
||||||
|
|
||||||
ServerManager.Logger.WriteInfo(Utilities.CurrentLocalization.LocalizationIndex["MANAGER_VERSION"].FormatExt(Version));
|
ServerManager.Logger.WriteInfo(Utilities.CurrentLocalization.LocalizationIndex["MANAGER_VERSION"].FormatExt(Version));
|
||||||
|
|
||||||
|
await CheckVersion(translationLookup);
|
||||||
await CheckVersion();
|
|
||||||
await ServerManager.Init();
|
await ServerManager.Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
var loc = Utilities.CurrentLocalization.LocalizationIndex;
|
string failMessage = translationLookup == null ? "Failed to initalize IW4MAdmin" : translationLookup["MANAGER_INIT_FAIL"];
|
||||||
string failMessage = loc == null ? "Failed to initalize IW4MAdmin" : loc["MANAGER_INIT_FAIL"];
|
string exitMessage = translationLookup == null ? "Press any key to exit..." : translationLookup["MANAGER_EXIT"];
|
||||||
string exitMessage = loc == null ? "Press any key to exit..." : loc["MANAGER_EXIT"];
|
|
||||||
|
|
||||||
Console.WriteLine(failMessage);
|
Console.WriteLine(failMessage);
|
||||||
|
|
||||||
@ -95,16 +115,21 @@ namespace IW4MAdmin.Application
|
|||||||
e = e.InnerException;
|
e = e.InnerException;
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.WriteLine(e.Message);
|
if (e is ConfigurationException configException)
|
||||||
|
|
||||||
if (e is ConfigurationException cfgE)
|
|
||||||
{
|
{
|
||||||
foreach (string error in cfgE.Errors)
|
Console.WriteLine(translationLookup[configException.Message].FormatExt(configException.ConfigurationFileName));
|
||||||
|
|
||||||
|
foreach (string error in configException.Errors)
|
||||||
{
|
{
|
||||||
Console.WriteLine(error);
|
Console.WriteLine(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine(e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
Console.WriteLine(exitMessage);
|
Console.WriteLine(exitMessage);
|
||||||
Console.ReadKey();
|
Console.ReadKey();
|
||||||
return;
|
return;
|
||||||
@ -122,6 +147,8 @@ namespace IW4MAdmin.Application
|
|||||||
{
|
{
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
serviceProvider.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -131,7 +158,7 @@ namespace IW4MAdmin.Application
|
|||||||
private static async Task RunApplicationTasksAsync()
|
private static async Task RunApplicationTasksAsync()
|
||||||
{
|
{
|
||||||
var webfrontTask = ServerManager.GetApplicationSettings().Configuration().EnableWebFront ?
|
var webfrontTask = ServerManager.GetApplicationSettings().Configuration().EnableWebFront ?
|
||||||
WebfrontCore.Program.Init(ServerManager, ServerManager.CancellationToken) :
|
WebfrontCore.Program.Init(ServerManager, serviceProvider, ServerManager.CancellationToken) :
|
||||||
Task.CompletedTask;
|
Task.CompletedTask;
|
||||||
|
|
||||||
// we want to run this one on a manual thread instead of letting the thread pool handle it,
|
// we want to run this one on a manual thread instead of letting the thread pool handle it,
|
||||||
@ -155,10 +182,10 @@ namespace IW4MAdmin.Application
|
|||||||
/// notifies user if an update is available
|
/// notifies user if an update is available
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private static async Task CheckVersion()
|
private static async Task CheckVersion(ITranslationLookup translationLookup)
|
||||||
{
|
{
|
||||||
var api = API.Master.Endpoint.Get();
|
var api = API.Master.Endpoint.Get();
|
||||||
var loc = Utilities.CurrentLocalization.LocalizationIndex;
|
var loc = translationLookup;
|
||||||
|
|
||||||
var version = new API.Master.VersionInfo()
|
var version = new API.Master.VersionInfo()
|
||||||
{
|
{
|
||||||
@ -258,22 +285,20 @@ namespace IW4MAdmin.Application
|
|||||||
{
|
{
|
||||||
var serviceProvider = new ServiceCollection();
|
var serviceProvider = new ServiceCollection();
|
||||||
serviceProvider.AddSingleton<IManager, ApplicationManager>()
|
serviceProvider.AddSingleton<IManager, ApplicationManager>()
|
||||||
.AddSingleton(_serviceProvider => new BaseConfigurationHandler<ApplicationConfiguration>("IW4MAdminSettings").Configuration())
|
.AddSingleton(new BaseConfigurationHandler<ApplicationConfiguration>("IW4MAdminSettings") as IConfigurationHandler<ApplicationConfiguration>)
|
||||||
.AddSingleton(_serviceProvider => new BaseConfigurationHandler<CommandConfiguration>("CommandConfiguration").Configuration())
|
.AddSingleton(new BaseConfigurationHandler<CommandConfiguration>("CommandConfiguration") as IConfigurationHandler<CommandConfiguration>)
|
||||||
|
.AddSingleton(_serviceProvider => _serviceProvider.GetRequiredService<IConfigurationHandler<ApplicationConfiguration>>().Configuration())
|
||||||
|
.AddSingleton(_serviceProvider => _serviceProvider.GetRequiredService<IConfigurationHandler<CommandConfiguration>>().Configuration())
|
||||||
.AddSingleton<ILogger>(_serviceProvider => new Logger("IW4MAdmin-Manager"))
|
.AddSingleton<ILogger>(_serviceProvider => new Logger("IW4MAdmin-Manager"))
|
||||||
|
.AddSingleton<IPluginImporter, PluginImporter>()
|
||||||
.AddSingleton<IMiddlewareActionHandler, MiddlewareActionHandler>()
|
.AddSingleton<IMiddlewareActionHandler, MiddlewareActionHandler>()
|
||||||
.AddSingleton(_serviceProvider =>
|
.AddSingleton(_serviceProvider =>
|
||||||
{
|
{
|
||||||
var config = _serviceProvider.GetRequiredService<ApplicationConfiguration>();
|
var config = _serviceProvider.GetRequiredService<IConfigurationHandler<ApplicationConfiguration>>().Configuration();
|
||||||
return Localization.Configure.Initialize(config?.UseLocalTranslations ?? false, config?.EnableCustomLocale ?? false ? (config.CustomLocale ?? "en-US") : "en-US");
|
return Localization.Configure.Initialize(useLocalTranslation: config?.UseLocalTranslations ?? false,
|
||||||
|
customLocale: config?.EnableCustomLocale ?? false ? (config.CustomLocale ?? "en-US") : "en-US");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
foreach (var commandDefinition in typeof(SharedLibraryCore.Commands.QuitCommand).Assembly.GetTypes().Where(_command => _command.BaseType == typeof(Command)))
|
|
||||||
{
|
|
||||||
serviceProvider.AddTransient(typeof(IManagerCommand), commandDefinition);
|
|
||||||
}
|
|
||||||
|
|
||||||
return serviceProvider;
|
return serviceProvider;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,17 +4,30 @@ using System.Collections.Generic;
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using SharedLibraryCore.Interfaces;
|
using SharedLibraryCore.Interfaces;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using SharedLibraryCore;
|
||||||
|
|
||||||
namespace SharedLibraryCore.Plugins
|
namespace IW4MAdmin.Application.Helpers
|
||||||
{
|
{
|
||||||
public class PluginImporter
|
public class PluginImporter : IPluginImporter
|
||||||
{
|
{
|
||||||
public static List<Command> ActiveCommands = new List<Command>();
|
public IList<Type> CommandTypes { get; private set; } = new List<Type>();
|
||||||
public static List<IPlugin> ActivePlugins = new List<IPlugin>();
|
public IList<IPlugin> ActivePlugins { get; private set; } = new List<IPlugin>();
|
||||||
public static List<Assembly> PluginAssemblies = new List<Assembly>();
|
public IList<Assembly> PluginAssemblies { get; private set; } = new List<Assembly>();
|
||||||
public static List<Assembly> Assemblies = new List<Assembly>();
|
public IList<Assembly> Assemblies { get; private set; } = new List<Assembly>();
|
||||||
|
|
||||||
public static bool Load(IManager Manager)
|
private readonly ILogger _logger;
|
||||||
|
private readonly ITranslationLookup _translationLookup;
|
||||||
|
|
||||||
|
public PluginImporter(ILogger logger, ITranslationLookup translationLookup)
|
||||||
|
{
|
||||||
|
_logger = logger;
|
||||||
|
_translationLookup = translationLookup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads all the assembly and javascript plugins
|
||||||
|
/// </summary>
|
||||||
|
public void Load()
|
||||||
{
|
{
|
||||||
string pluginDir = $"{Utilities.OperatingDirectory}Plugins{Path.DirectorySeparatorChar}";
|
string pluginDir = $"{Utilities.OperatingDirectory}Plugins{Path.DirectorySeparatorChar}";
|
||||||
string[] dllFileNames = null;
|
string[] dllFileNames = null;
|
||||||
@ -35,16 +48,15 @@ namespace SharedLibraryCore.Plugins
|
|||||||
if (dllFileNames.Length == 0 &&
|
if (dllFileNames.Length == 0 &&
|
||||||
scriptFileNames.Length == 0)
|
scriptFileNames.Length == 0)
|
||||||
{
|
{
|
||||||
Manager.GetLogger(0).WriteDebug(Utilities.CurrentLocalization.LocalizationIndex["PLUGIN_IMPORTER_NOTFOUND"]);
|
_logger.WriteDebug(_translationLookup["PLUGIN_IMPORTER_NOTFOUND"]);
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// load up the script plugins
|
// load up the script plugins
|
||||||
foreach (string fileName in scriptFileNames)
|
foreach (string fileName in scriptFileNames)
|
||||||
{
|
{
|
||||||
var plugin = new ScriptPlugin(fileName);
|
var plugin = new ScriptPlugin(fileName);
|
||||||
plugin.Initialize(Manager).Wait();
|
_logger.WriteDebug($"Loaded script plugin \"{ plugin.Name }\" [{plugin.Version}]");
|
||||||
Manager.GetLogger(0).WriteDebug($"Loaded script plugin \"{ plugin.Name }\" [{plugin.Version}]");
|
|
||||||
ActivePlugins.Add(plugin);
|
ActivePlugins.Add(plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,12 +75,10 @@ namespace SharedLibraryCore.Plugins
|
|||||||
Type[] types = Plugin.GetTypes();
|
Type[] types = Plugin.GetTypes();
|
||||||
foreach (Type assemblyType in types)
|
foreach (Type assemblyType in types)
|
||||||
{
|
{
|
||||||
if (assemblyType.IsClass && assemblyType.BaseType.Name == "Command")
|
if (assemblyType.IsClass && assemblyType.BaseType == typeof(Command))
|
||||||
{
|
{
|
||||||
Object commandObject = Activator.CreateInstance(assemblyType);
|
CommandTypes.Add(assemblyType);
|
||||||
Command newCommand = (Command)commandObject;
|
_logger.WriteDebug($"{_translationLookup["PLUGIN_IMPORTER_REGISTERCMD"]} \"{assemblyType.Name}\"");
|
||||||
ActiveCommands.Add(newCommand);
|
|
||||||
Manager.GetLogger(0).WriteDebug($"{Utilities.CurrentLocalization.LocalizationIndex["PLUGIN_IMPORTER_REGISTERCMD"]} \"{newCommand.Name}\"");
|
|
||||||
LoadedCommands++;
|
LoadedCommands++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -78,26 +88,26 @@ namespace SharedLibraryCore.Plugins
|
|||||||
if (assemblyType.GetInterface("IPlugin", false) == null)
|
if (assemblyType.GetInterface("IPlugin", false) == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Object notifyObject = Activator.CreateInstance(assemblyType);
|
var notifyObject = Activator.CreateInstance(assemblyType);
|
||||||
IPlugin newNotify = (IPlugin)notifyObject;
|
IPlugin newNotify = (IPlugin)notifyObject;
|
||||||
if (ActivePlugins.Find(x => x.Name == newNotify.Name) == null)
|
if (ActivePlugins.FirstOrDefault(x => x.Name == newNotify.Name) == null)
|
||||||
{
|
{
|
||||||
ActivePlugins.Add(newNotify);
|
ActivePlugins.Add(newNotify);
|
||||||
PluginAssemblies.Add(Plugin);
|
PluginAssemblies.Add(Plugin);
|
||||||
Manager.GetLogger(0).WriteDebug($"Loaded plugin \"{ newNotify.Name }\" [{newNotify.Version}]");
|
_logger.WriteDebug($"Loaded plugin \"{newNotify.Name}\" [{newNotify.Version}]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Manager.GetLogger(0).WriteWarning(Utilities.CurrentLocalization.LocalizationIndex["PLUGIN_IMPORTER_ERROR"].FormatExt(Plugin.Location));
|
_logger.WriteWarning(_translationLookup["PLUGIN_IMPORTER_ERROR"].FormatExt(Plugin.Location));
|
||||||
Manager.GetLogger(0).WriteDebug(e.GetExceptionInfo());
|
_logger.WriteDebug(e.GetExceptionInfo());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Manager.GetLogger(0).WriteInfo($"Loaded {ActivePlugins.Count} plugins and registered {LoadedCommands} commands.");
|
|
||||||
return true;
|
_logger.WriteInfo($"Loaded {ActivePlugins.Count} plugins and registered {LoadedCommands} plugin commands.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.SyndicationFeed.ReaderWriter" Version="1.0.2" />
|
<PackageReference Include="Microsoft.SyndicationFeed.ReaderWriter" Version="1.0.2" />
|
||||||
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.5" PrivateAssets="All" />
|
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.6" PrivateAssets="All" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
using SharedLibraryCore;
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Commands;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
using SharedLibraryCore.Database.Models;
|
using SharedLibraryCore.Database.Models;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace IW4ScriptCommands.Commands
|
namespace IW4ScriptCommands.Commands
|
||||||
@ -9,15 +12,22 @@ namespace IW4ScriptCommands.Commands
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class KillPlayerCommand : Command
|
public class KillPlayerCommand : Command
|
||||||
{
|
{
|
||||||
public KillPlayerCommand() : base("killplayer", "kill a player", "kp", EFClient.Permission.Administrator, true, new[]
|
public KillPlayerCommand(CommandConfiguration config, ITranslationLookup lookup) : base(config, lookup)
|
||||||
{
|
{
|
||||||
new CommandArgument()
|
Name = "killplayer";
|
||||||
|
Description = "kill a player";
|
||||||
|
Alias = "kp";
|
||||||
|
Permission = EFClient.Permission.Administrator;
|
||||||
|
RequiresTarget = true;
|
||||||
|
Arguments = new[]
|
||||||
{
|
{
|
||||||
Name = "player",
|
new CommandArgument()
|
||||||
Required = true
|
{
|
||||||
}
|
Name = "player",
|
||||||
})
|
Required = true
|
||||||
{ }
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public override async Task ExecuteAsync(GameEvent E)
|
public override async Task ExecuteAsync(GameEvent E)
|
||||||
{
|
{
|
||||||
|
@ -23,7 +23,7 @@ namespace WebfrontCore.Controllers.API
|
|||||||
public IActionResult ClientInfo(string networkId)
|
public IActionResult ClientInfo(string networkId)
|
||||||
{
|
{
|
||||||
var clientInfo = Manager.GetActiveClients()
|
var clientInfo = Manager.GetActiveClients()
|
||||||
.FirstOrDefault(c => c.NetworkId == networkId.ConvertGuidToLong());
|
.FirstOrDefault(c => c.NetworkId == networkId.ConvertGuidToLong(System.Globalization.NumberStyles.HexNumber));
|
||||||
|
|
||||||
if (clientInfo != null)
|
if (clientInfo != null)
|
||||||
{
|
{
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.4" PrivateAssets="All" />
|
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.6" PrivateAssets="All" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.5" PrivateAssets="All" />
|
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.6" PrivateAssets="All" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -1,39 +0,0 @@
|
|||||||
using SharedLibraryCore;
|
|
||||||
using SharedLibraryCore.Database.Models;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IW4MAdmin.Plugins.Login.Commands
|
|
||||||
{
|
|
||||||
public class CLogin : Command
|
|
||||||
{
|
|
||||||
public CLogin() : base("login", Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_LOGIN_COMMANDS_LOGIN_DESC"], "li", EFClient.Permission.Trusted, false, new CommandArgument[]
|
|
||||||
{
|
|
||||||
new CommandArgument()
|
|
||||||
{
|
|
||||||
Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PASSWORD"],
|
|
||||||
Required = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
{ }
|
|
||||||
|
|
||||||
public override async Task ExecuteAsync(GameEvent E)
|
|
||||||
{
|
|
||||||
bool success = E.Owner.Manager.TokenAuthenticator.AuthorizeToken(E.Origin.NetworkId, E.Data);
|
|
||||||
|
|
||||||
if (!success)
|
|
||||||
{
|
|
||||||
string[] hashedPassword = await Task.FromResult(SharedLibraryCore.Helpers.Hashing.Hash(E.Data, E.Origin.PasswordSalt));
|
|
||||||
success = hashedPassword[0] == E.Origin.Password;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (success)
|
|
||||||
{
|
|
||||||
Plugin.AuthorizedClients[E.Origin.ClientId] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
_ = success ?
|
|
||||||
E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_LOGIN_COMMANDS_LOGIN_SUCCESS"]) :
|
|
||||||
E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_LOGIN_COMMANDS_LOGIN_FAIL"]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
49
Plugins/Login/Commands/LoginCommand.cs
Normal file
49
Plugins/Login/Commands/LoginCommand.cs
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Commands;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Database.Models;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace IW4MAdmin.Plugins.Login.Commands
|
||||||
|
{
|
||||||
|
public class LoginCommand : Command
|
||||||
|
{
|
||||||
|
public LoginCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
||||||
|
{
|
||||||
|
Name = "login";
|
||||||
|
Description = _translationLookup["PLUGINS_LOGIN_COMMANDS_LOGIN_DESC"];
|
||||||
|
Alias = "li";
|
||||||
|
Permission = EFClient.Permission.Trusted;
|
||||||
|
RequiresTarget = false;
|
||||||
|
Arguments = new CommandArgument[]
|
||||||
|
{
|
||||||
|
new CommandArgument()
|
||||||
|
{
|
||||||
|
Name = Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_ARGS_PASSWORD"],
|
||||||
|
Required = true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task ExecuteAsync(GameEvent E)
|
||||||
|
{
|
||||||
|
bool success = E.Owner.Manager.TokenAuthenticator.AuthorizeToken(E.Origin.NetworkId, E.Data);
|
||||||
|
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
string[] hashedPassword = await Task.FromResult(SharedLibraryCore.Helpers.Hashing.Hash(E.Data, E.Origin.PasswordSalt));
|
||||||
|
success = hashedPassword[0] == E.Origin.Password;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
Plugin.AuthorizedClients[E.Origin.ClientId] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
_ = success ?
|
||||||
|
E.Origin.Tell(_translationLookup["PLUGINS_LOGIN_COMMANDS_LOGIN_SUCCESS"]) :
|
||||||
|
E.Origin.Tell(_translationLookup["PLUGINS_LOGIN_COMMANDS_LOGIN_FAIL"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -23,7 +23,7 @@
|
|||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.5" PrivateAssets="All" />
|
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.6" PrivateAssets="All" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using IW4MAdmin.Plugins.Login.Commands;
|
||||||
using SharedLibraryCore;
|
using SharedLibraryCore;
|
||||||
using SharedLibraryCore.Commands;
|
using SharedLibraryCore.Commands;
|
||||||
using SharedLibraryCore.Configuration;
|
using SharedLibraryCore.Configuration;
|
||||||
@ -43,11 +44,11 @@ namespace IW4MAdmin.Plugins.Login
|
|||||||
E.Origin.Level == EFClient.Permission.Console)
|
E.Origin.Level == EFClient.Permission.Console)
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
|
||||||
if (((Command)E.Extra).Name == new CSetPassword().Name &&
|
if (E.Extra.GetType() == typeof(SetPasswordCommand) &&
|
||||||
E.Origin?.Password == null)
|
E.Origin?.Password == null)
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
|
||||||
if (((Command)E.Extra).Name == new Commands.CLogin().Name)
|
if (E.Extra.GetType() == typeof(LoginCommand))
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
|
||||||
if (E.Extra.GetType() == typeof(RequestTokenCommand))
|
if (E.Extra.GetType() == typeof(RequestTokenCommand))
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.5" PrivateAssets="All" />
|
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.6" PrivateAssets="All" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
||||||
|
@ -9,12 +9,14 @@ using SharedLibraryCore.Database;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using SharedLibraryCore.Database.Models;
|
using SharedLibraryCore.Database.Models;
|
||||||
using IW4MAdmin.Plugins.Stats.Helpers;
|
using IW4MAdmin.Plugins.Stats.Helpers;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
|
||||||
namespace IW4MAdmin.Plugins.Stats.Commands
|
namespace IW4MAdmin.Plugins.Stats.Commands
|
||||||
{
|
{
|
||||||
class MostPlayed : Command
|
class MostPlayedCommand : Command
|
||||||
{
|
{
|
||||||
public static async Task<List<string>> GetMostPlayed(Server s)
|
public static async Task<List<string>> GetMostPlayed(Server s, ITranslationLookup translationLookup)
|
||||||
{
|
{
|
||||||
long serverId = StatManager.GetIdForServer(s);
|
long serverId = StatManager.GetIdForServer(s);
|
||||||
|
|
||||||
@ -50,18 +52,25 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
var iqList = await iqStats.ToListAsync();
|
var iqList = await iqStats.ToListAsync();
|
||||||
|
|
||||||
mostPlayed.AddRange(iqList.Select(stats =>
|
mostPlayed.AddRange(iqList.Select(stats =>
|
||||||
$"^3{stats.Name}^7 - ^5{stats.Kills} ^7{Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_TEXT_KILLS"]} | ^5{Utilities.GetTimePassed(DateTime.UtcNow.AddSeconds(-stats.TotalConnectionTime), false)} ^7{Utilities.CurrentLocalization.LocalizationIndex["WEBFRONT_PROFILE_PLAYER"].ToLower()}"));
|
$"^3{stats.Name}^7 - ^5{stats.Kills} ^7{translationLookup["PLUGINS_STATS_TEXT_KILLS"]} | ^5{Utilities.GetTimePassed(DateTime.UtcNow.AddSeconds(-stats.TotalConnectionTime), false)} ^7{translationLookup["WEBFRONT_PROFILE_PLAYER"].ToLower()}"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return mostPlayed;
|
return mostPlayed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MostPlayed() : base("mostplayed", Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_MOSTPLAYED_DESC"], "mp", EFClient.Permission.User, false) { }
|
public MostPlayedCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
||||||
|
{
|
||||||
|
Name = "mostplayed";
|
||||||
|
Description = translationLookup["PLUGINS_STATS_COMMANDS_MOSTPLAYED_DESC"];
|
||||||
|
Alias = "mp";
|
||||||
|
Permission = EFClient.Permission.User;
|
||||||
|
RequiresTarget = false;
|
||||||
|
}
|
||||||
|
|
||||||
public override async Task ExecuteAsync(GameEvent E)
|
public override async Task ExecuteAsync(GameEvent E)
|
||||||
{
|
{
|
||||||
var topStats = await GetMostPlayed(E.Owner);
|
var topStats = await GetMostPlayed(E.Owner, _translationLookup);
|
||||||
if (!E.Message.IsBroadcastCommand())
|
if (!E.Message.IsBroadcastCommand())
|
||||||
{
|
{
|
||||||
foreach (var stat in topStats)
|
foreach (var stat in topStats)
|
@ -1,8 +1,10 @@
|
|||||||
using IW4MAdmin.Plugins.Stats.Models;
|
using IW4MAdmin.Plugins.Stats.Models;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using SharedLibraryCore;
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
using SharedLibraryCore.Database;
|
using SharedLibraryCore.Database;
|
||||||
using SharedLibraryCore.Database.Models;
|
using SharedLibraryCore.Database.Models;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
@ -10,7 +12,14 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
{
|
{
|
||||||
public class ResetStats : Command
|
public class ResetStats : Command
|
||||||
{
|
{
|
||||||
public ResetStats() : base("resetstats", Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_RESET_DESC"], "rs", EFClient.Permission.User, false) { }
|
public ResetStats(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
||||||
|
{
|
||||||
|
Name = "resetstats";
|
||||||
|
Description = translationLookup["PLUGINS_STATS_COMMANDS_RESET_DESC"];
|
||||||
|
Alias = "rs";
|
||||||
|
Permission = EFClient.Permission.User;
|
||||||
|
RequiresTarget = false;
|
||||||
|
}
|
||||||
|
|
||||||
public override async Task ExecuteAsync(GameEvent E)
|
public override async Task ExecuteAsync(GameEvent E)
|
||||||
{
|
{
|
||||||
@ -41,12 +50,12 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
// fixme: this doesn't work properly when another context exists
|
// fixme: this doesn't work properly when another context exists
|
||||||
await ctx.SaveChangesAsync();
|
await ctx.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_RESET_SUCCESS"]);
|
E.Origin.Tell(_translationLookup["PLUGINS_STATS_COMMANDS_RESET_SUCCESS"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_RESET_FAIL"]);
|
E.Origin.Tell(_translationLookup["PLUGINS_STATS_COMMANDS_RESET_FAIL"]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,17 +9,19 @@ using SharedLibraryCore.Database;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using SharedLibraryCore.Database.Models;
|
using SharedLibraryCore.Database.Models;
|
||||||
using IW4MAdmin.Plugins.Stats.Helpers;
|
using IW4MAdmin.Plugins.Stats.Helpers;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
|
||||||
namespace IW4MAdmin.Plugins.Stats.Commands
|
namespace IW4MAdmin.Plugins.Stats.Commands
|
||||||
{
|
{
|
||||||
class TopStats : Command
|
class TopStats : Command
|
||||||
{
|
{
|
||||||
public static async Task<List<string>> GetTopStats(Server s)
|
public static async Task<List<string>> GetTopStats(Server s, ITranslationLookup translationLookup)
|
||||||
{
|
{
|
||||||
long serverId = StatManager.GetIdForServer(s);
|
long serverId = StatManager.GetIdForServer(s);
|
||||||
List<string> topStatsText = new List<string>()
|
var topStatsText = new List<string>()
|
||||||
{
|
{
|
||||||
$"^5--{Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_TOP_TEXT"]}--"
|
$"^5--{translationLookup["PLUGINS_STATS_COMMANDS_TOP_TEXT"]}--"
|
||||||
};
|
};
|
||||||
|
|
||||||
using (var db = new DatabaseContext(true))
|
using (var db = new DatabaseContext(true))
|
||||||
@ -46,7 +48,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
.Take(5);
|
.Take(5);
|
||||||
|
|
||||||
var statsList = (await iqStats.ToListAsync())
|
var statsList = (await iqStats.ToListAsync())
|
||||||
.Select(stats => $"^3{stats.Name}^7 - ^5{stats.KDR} ^7{Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_TEXT_KDR"]} | ^5{stats.Performance} ^7{Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_PERFORMANCE"]}");
|
.Select(stats => $"^3{stats.Name}^7 - ^5{stats.KDR} ^7{translationLookup["PLUGINS_STATS_TEXT_KDR"]} | ^5{stats.Performance} ^7{translationLookup["PLUGINS_STATS_COMMANDS_PERFORMANCE"]}");
|
||||||
|
|
||||||
topStatsText.AddRange(statsList);
|
topStatsText.AddRange(statsList);
|
||||||
}
|
}
|
||||||
@ -56,18 +58,25 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
{
|
{
|
||||||
topStatsText = new List<string>()
|
topStatsText = new List<string>()
|
||||||
{
|
{
|
||||||
Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_TEXT_NOQUALIFY"]
|
translationLookup["PLUGINS_STATS_TEXT_NOQUALIFY"]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return topStatsText;
|
return topStatsText;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TopStats() : base("topstats", Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_TOP_DESC"], "ts", EFClient.Permission.User, false) { }
|
public TopStats(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
||||||
|
{
|
||||||
|
Name = "topstats";
|
||||||
|
Description = translationLookup["PLUGINS_STATS_COMMANDS_TOP_DESC"];
|
||||||
|
Alias = "ts";
|
||||||
|
Permission = EFClient.Permission.User;
|
||||||
|
RequiresTarget = false;
|
||||||
|
}
|
||||||
|
|
||||||
public override async Task ExecuteAsync(GameEvent E)
|
public override async Task ExecuteAsync(GameEvent E)
|
||||||
{
|
{
|
||||||
var topStats = await GetTopStats(E.Owner);
|
var topStats = await GetTopStats(E.Owner, _translationLookup);
|
||||||
if (!E.Message.IsBroadcastCommand())
|
if (!E.Message.IsBroadcastCommand())
|
||||||
{
|
{
|
||||||
foreach (var stat in topStats)
|
foreach (var stat in topStats)
|
||||||
|
@ -1,35 +1,40 @@
|
|||||||
using SharedLibraryCore;
|
using SharedLibraryCore;
|
||||||
using SharedLibraryCore.Services;
|
|
||||||
using IW4MAdmin.Plugins.Stats.Models;
|
using IW4MAdmin.Plugins.Stats.Models;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using SharedLibraryCore.Database;
|
using SharedLibraryCore.Database;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using IW4MAdmin.Plugins.Stats.Helpers;
|
using IW4MAdmin.Plugins.Stats.Helpers;
|
||||||
using SharedLibraryCore.Database.Models;
|
using SharedLibraryCore.Database.Models;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
using SharedLibraryCore.Commands;
|
||||||
|
|
||||||
namespace IW4MAdmin.Plugins.Stats.Commands
|
namespace IW4MAdmin.Plugins.Stats.Commands
|
||||||
{
|
{
|
||||||
public class CViewStats : Command
|
public class ViewStatsCommand : Command
|
||||||
{
|
{
|
||||||
public CViewStats() : base("stats", Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_VIEW_DESC"], "xlrstats", EFClient.Permission.User, false, new CommandArgument[]
|
public ViewStatsCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
||||||
|
{
|
||||||
|
|
||||||
|
Name = "stats";
|
||||||
|
Description = translationLookup["PLUGINS_STATS_COMMANDS_VIEW_DESC"];
|
||||||
|
Alias = "xlrstats";
|
||||||
|
Permission = EFClient.Permission.User;
|
||||||
|
RequiresTarget = false;
|
||||||
|
Arguments = new CommandArgument[]
|
||||||
{
|
{
|
||||||
new CommandArgument()
|
new CommandArgument()
|
||||||
{
|
{
|
||||||
Name = "player",
|
Name = "player",
|
||||||
Required = false
|
Required = false
|
||||||
}
|
}
|
||||||
})
|
};
|
||||||
{ }
|
}
|
||||||
|
|
||||||
public override async Task ExecuteAsync(GameEvent E)
|
public override async Task ExecuteAsync(GameEvent E)
|
||||||
{
|
{
|
||||||
var loc = Utilities.CurrentLocalization.LocalizationIndex;
|
string statLine;
|
||||||
|
|
||||||
String statLine;
|
|
||||||
EFClientStatistics pStats;
|
EFClientStatistics pStats;
|
||||||
|
|
||||||
if (E.Data.Length > 0 && E.Target == null)
|
if (E.Data.Length > 0 && E.Target == null)
|
||||||
@ -38,7 +43,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
|
|
||||||
if (E.Target == null)
|
if (E.Target == null)
|
||||||
{
|
{
|
||||||
E.Origin.Tell(loc["PLUGINS_STATS_COMMANDS_VIEW_FAIL"]);
|
E.Origin.Tell(_translationLookup["PLUGINS_STATS_COMMANDS_VIEW_FAIL"]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,7 +53,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
if (E.Target != null)
|
if (E.Target != null)
|
||||||
{
|
{
|
||||||
int performanceRanking = await StatManager.GetClientOverallRanking(E.Target.ClientId);
|
int performanceRanking = await StatManager.GetClientOverallRanking(E.Target.ClientId);
|
||||||
string performanceRankingString = performanceRanking == 0 ? loc["WEBFRONT_STATS_INDEX_UNRANKED"] : $"{loc["WEBFRONT_STATS_INDEX_RANKED"]} #{performanceRanking}";
|
string performanceRankingString = performanceRanking == 0 ? _translationLookup["WEBFRONT_STATS_INDEX_UNRANKED"] : $"{_translationLookup["WEBFRONT_STATS_INDEX_RANKED"]} #{performanceRanking}";
|
||||||
|
|
||||||
if (E.Owner.GetClientsAsList().Any(_client => _client.Equals(E.Target)))
|
if (E.Owner.GetClientsAsList().Any(_client => _client.Equals(E.Target)))
|
||||||
{
|
{
|
||||||
@ -62,13 +67,13 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
pStats = (await ctx.Set<EFClientStatistics>().FirstAsync(c => c.ServerId == serverId && c.ClientId == E.Target.ClientId));
|
pStats = (await ctx.Set<EFClientStatistics>().FirstAsync(c => c.ServerId == serverId && c.ClientId == E.Target.ClientId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
statLine = $"^5{pStats.Kills} ^7{loc["PLUGINS_STATS_TEXT_KILLS"]} | ^5{pStats.Deaths} ^7{loc["PLUGINS_STATS_TEXT_DEATHS"]} | ^5{pStats.KDR} ^7KDR | ^5{pStats.Performance} ^7{loc["PLUGINS_STATS_COMMANDS_PERFORMANCE"].ToUpper()} | {performanceRankingString}";
|
statLine = $"^5{pStats.Kills} ^7{_translationLookup["PLUGINS_STATS_TEXT_KILLS"]} | ^5{pStats.Deaths} ^7{_translationLookup["PLUGINS_STATS_TEXT_DEATHS"]} | ^5{pStats.KDR} ^7KDR | ^5{pStats.Performance} ^7{_translationLookup["PLUGINS_STATS_COMMANDS_PERFORMANCE"].ToUpper()} | {performanceRankingString}";
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int performanceRanking = await StatManager.GetClientOverallRanking(E.Origin.ClientId);
|
int performanceRanking = await StatManager.GetClientOverallRanking(E.Origin.ClientId);
|
||||||
string performanceRankingString = performanceRanking == 0 ? loc["WEBFRONT_STATS_INDEX_UNRANKED"] : $"{loc["WEBFRONT_STATS_INDEX_RANKED"]} #{performanceRanking}";
|
string performanceRankingString = performanceRanking == 0 ? _translationLookup["WEBFRONT_STATS_INDEX_UNRANKED"] : $"{_translationLookup["WEBFRONT_STATS_INDEX_RANKED"]} #{performanceRanking}";
|
||||||
|
|
||||||
if (E.Owner.GetClientsAsList().Any(_client => _client.Equals(E.Origin)))
|
if (E.Owner.GetClientsAsList().Any(_client => _client.Equals(E.Origin)))
|
||||||
{
|
{
|
||||||
@ -82,13 +87,13 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
pStats = (await ctx.Set<EFClientStatistics>().FirstAsync(c => c.ServerId == serverId && c.ClientId == E.Origin.ClientId));
|
pStats = (await ctx.Set<EFClientStatistics>().FirstAsync(c => c.ServerId == serverId && c.ClientId == E.Origin.ClientId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
statLine = $"^5{pStats.Kills} ^7{loc["PLUGINS_STATS_TEXT_KILLS"]} | ^5{pStats.Deaths} ^7{loc["PLUGINS_STATS_TEXT_DEATHS"]} | ^5{pStats.KDR} ^7KDR | ^5{pStats.Performance} ^7{loc["PLUGINS_STATS_COMMANDS_PERFORMANCE"].ToUpper()} | {performanceRankingString}";
|
statLine = $"^5{pStats.Kills} ^7{_translationLookup["PLUGINS_STATS_TEXT_KILLS"]} | ^5{pStats.Deaths} ^7{_translationLookup["PLUGINS_STATS_TEXT_DEATHS"]} | ^5{pStats.KDR} ^7KDR | ^5{pStats.Performance} ^7{_translationLookup["PLUGINS_STATS_COMMANDS_PERFORMANCE"].ToUpper()} | {performanceRankingString}";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (E.Message.IsBroadcastCommand())
|
if (E.Message.IsBroadcastCommand())
|
||||||
{
|
{
|
||||||
string name = E.Target == null ? E.Origin.Name : E.Target.Name;
|
string name = E.Target == null ? E.Origin.Name : E.Target.Name;
|
||||||
E.Owner.Broadcast(loc["PLUGINS_STATS_COMMANDS_VIEW_SUCCESS"].FormatExt(name));
|
E.Owner.Broadcast(_translationLookup["PLUGINS_STATS_COMMANDS_VIEW_SUCCESS"].FormatExt(name));
|
||||||
E.Owner.Broadcast(statLine);
|
E.Owner.Broadcast(statLine);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,7 +101,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
{
|
{
|
||||||
if (E.Target != null)
|
if (E.Target != null)
|
||||||
{
|
{
|
||||||
E.Origin.Tell(loc["PLUGINS_STATS_COMMANDS_VIEW_SUCCESS"].FormatExt(E.Target.Name));
|
E.Origin.Tell(_translationLookup["PLUGINS_STATS_COMMANDS_VIEW_SUCCESS"].FormatExt(E.Target.Name));
|
||||||
}
|
}
|
||||||
|
|
||||||
E.Origin.Tell(statLine);
|
E.Origin.Tell(statLine);
|
||||||
|
@ -477,12 +477,14 @@ namespace IW4MAdmin.Plugins.Stats
|
|||||||
|
|
||||||
async Task<string> topStats(Server s)
|
async Task<string> topStats(Server s)
|
||||||
{
|
{
|
||||||
return string.Join(Environment.NewLine, await Commands.TopStats.GetTopStats(s));
|
// todo: this needs to needs to be updated when we DI the lookup
|
||||||
|
return string.Join(Environment.NewLine, await Commands.TopStats.GetTopStats(s, Utilities.CurrentLocalization.LocalizationIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
async Task<string> mostPlayed(Server s)
|
async Task<string> mostPlayed(Server s)
|
||||||
{
|
{
|
||||||
return string.Join(Environment.NewLine, await Commands.MostPlayed.GetMostPlayed(s));
|
// todo: this needs to needs to be updated when we DI the lookup
|
||||||
|
return string.Join(Environment.NewLine, await Commands.MostPlayedCommand.GetMostPlayed(s, Utilities.CurrentLocalization.LocalizationIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
manager.GetMessageTokens().Add(new MessageToken("TOTALKILLS", totalKills));
|
manager.GetMessageTokens().Add(new MessageToken("TOTALKILLS", totalKills));
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.5" PrivateAssets="All" />
|
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.6" PrivateAssets="All" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
||||||
|
@ -53,7 +53,7 @@ namespace Tests
|
|||||||
|
|
||||||
foreach (var command in Manager.GetCommands().OrderByDescending(c => c.Permission).ThenBy(c => c.Name))
|
foreach (var command in Manager.GetCommands().OrderByDescending(c => c.Permission).ThenBy(c => c.Name))
|
||||||
{
|
{
|
||||||
sb.AppendLine($"|{command.Name}|{command.Alias}|{command.Description}|{command.RequiresTarget}|{command.Syntax.Substring(8).EscapeMarkdown()}|{command.Permission}|");
|
sb.AppendLine($"|{command.Name}|{command.Alias}|{command.Description}|{((Command)command).RequiresTarget}|{((Command)command).Syntax.Substring(8).EscapeMarkdown()}|{command.Permission}|");
|
||||||
}
|
}
|
||||||
|
|
||||||
Assert.True(false, sb.ToString());
|
Assert.True(false, sb.ToString());
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<RunPostBuildEvent>Always</RunPostBuildEvent>
|
<RunPostBuildEvent>Always</RunPostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.5" PrivateAssets="All" />
|
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.6" PrivateAssets="All" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.5" PrivateAssets="All" />
|
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2.2.6" PrivateAssets="All" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
||||||
|
@ -1317,19 +1317,21 @@ namespace SharedLibraryCore.Commands
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ListPluginsCommand : Command
|
public class ListPluginsCommand : Command
|
||||||
{
|
{
|
||||||
public ListPluginsCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
private readonly IPluginImporter _pluginImporter;
|
||||||
|
public ListPluginsCommand(CommandConfiguration config, ITranslationLookup translationLookup, IPluginImporter pluginImporter) : base(config, translationLookup)
|
||||||
{
|
{
|
||||||
Name = "plugins";
|
Name = "plugins";
|
||||||
Description = _translationLookup["COMMANDS_PLUGINS_DESC"];
|
Description = _translationLookup["COMMANDS_PLUGINS_DESC"];
|
||||||
Alias = "p";
|
Alias = "p";
|
||||||
Permission = Permission.Administrator;
|
Permission = Permission.Administrator;
|
||||||
RequiresTarget = false;
|
RequiresTarget = false;
|
||||||
|
_pluginImporter = pluginImporter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Task ExecuteAsync(GameEvent E)
|
public override Task ExecuteAsync(GameEvent E)
|
||||||
{
|
{
|
||||||
E.Origin.Tell(_translationLookup["COMMANDS_PLUGINS_LOADED"]);
|
E.Origin.Tell(_translationLookup["COMMANDS_PLUGINS_LOADED"]);
|
||||||
foreach (var P in Plugins.PluginImporter.ActivePlugins)
|
foreach (var P in _pluginImporter.ActivePlugins)
|
||||||
{
|
{
|
||||||
E.Origin.Tell(string.Format("^3{0} ^7[v^3{1}^7] by ^5{2}^7", P.Name, P.Version, P.Author));
|
E.Origin.Tell(string.Format("^3{0} ^7[v^3{1}^7] by ^5{2}^7", P.Name, P.Version, P.Author));
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ namespace SharedLibraryCore.Exceptions
|
|||||||
public class ConfigurationException : Exception
|
public class ConfigurationException : Exception
|
||||||
{
|
{
|
||||||
public string[] Errors { get; set; }
|
public string[] Errors { get; set; }
|
||||||
|
public string ConfigurationFileName { get; set; }
|
||||||
|
|
||||||
public ConfigurationException(string message) : base(message) { }
|
public ConfigurationException(string message) : base(message) { }
|
||||||
}
|
}
|
||||||
|
@ -9,20 +9,21 @@ namespace SharedLibraryCore.Configuration
|
|||||||
{
|
{
|
||||||
public class BaseConfigurationHandler<T> : IConfigurationHandler<T> where T : IBaseConfiguration
|
public class BaseConfigurationHandler<T> : IConfigurationHandler<T> where T : IBaseConfiguration
|
||||||
{
|
{
|
||||||
readonly string _configurationPath;
|
|
||||||
T _configuration;
|
T _configuration;
|
||||||
|
|
||||||
public BaseConfigurationHandler(string fn)
|
public BaseConfigurationHandler(string fn)
|
||||||
{
|
{
|
||||||
_configurationPath = Path.Join(Utilities.OperatingDirectory, "Configuration", $"{fn}.json");
|
FileName = Path.Join(Utilities.OperatingDirectory, "Configuration", $"{fn}.json");
|
||||||
Build();
|
Build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string FileName { get; }
|
||||||
|
|
||||||
public void Build()
|
public void Build()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var configContent = File.ReadAllText(_configurationPath);
|
var configContent = File.ReadAllText(FileName);
|
||||||
_configuration = JsonConvert.DeserializeObject<T>(configContent);
|
_configuration = JsonConvert.DeserializeObject<T>(configContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,15 +36,22 @@ namespace SharedLibraryCore.Configuration
|
|||||||
{
|
{
|
||||||
throw new ConfigurationException("MANAGER_CONFIGURATION_ERROR")
|
throw new ConfigurationException("MANAGER_CONFIGURATION_ERROR")
|
||||||
{
|
{
|
||||||
Errors = new[] { e.Message }
|
Errors = new[] { e.Message },
|
||||||
|
ConfigurationFileName = FileName
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task Save()
|
public Task Save()
|
||||||
{
|
{
|
||||||
var appConfigJSON = JsonConvert.SerializeObject(_configuration, Formatting.Indented);
|
var settings = new JsonSerializerSettings()
|
||||||
return File.WriteAllTextAsync(_configurationPath, appConfigJSON);
|
{
|
||||||
|
Formatting = Formatting.Indented
|
||||||
|
};
|
||||||
|
settings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
|
||||||
|
|
||||||
|
var appConfigJSON = JsonConvert.SerializeObject(_configuration, settings);
|
||||||
|
return File.WriteAllTextAsync(FileName, appConfigJSON);
|
||||||
}
|
}
|
||||||
|
|
||||||
public T Configuration()
|
public T Configuration()
|
||||||
|
@ -12,5 +12,6 @@ namespace SharedLibraryCore.Interfaces
|
|||||||
void Build();
|
void Build();
|
||||||
T Configuration();
|
T Configuration();
|
||||||
void Set(T config);
|
void Set(T config);
|
||||||
|
string FileName { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ namespace SharedLibraryCore.Interfaces
|
|||||||
void Restart();
|
void Restart();
|
||||||
ILogger GetLogger(long serverId);
|
ILogger GetLogger(long serverId);
|
||||||
IList<Server> GetServers();
|
IList<Server> GetServers();
|
||||||
IList<Command> GetCommands();
|
IList<IManagerCommand> GetCommands();
|
||||||
IList<Helpers.MessageToken> GetMessageTokens();
|
IList<Helpers.MessageToken> GetMessageTokens();
|
||||||
IList<EFClient> GetActiveClients();
|
IList<EFClient> GetActiveClients();
|
||||||
IConfigurationHandler<ApplicationConfiguration> GetApplicationSettings();
|
IConfigurationHandler<ApplicationConfiguration> GetApplicationSettings();
|
||||||
|
@ -34,5 +34,15 @@ namespace SharedLibraryCore.Interfaces
|
|||||||
/// Minimum permission required to execute the command
|
/// Minimum permission required to execute the command
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Permission Permission { get; }
|
Permission Permission { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Syntax for using the command
|
||||||
|
/// </summary>
|
||||||
|
string Syntax { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates if target is required
|
||||||
|
/// </summary>
|
||||||
|
bool RequiresTarget { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
37
SharedLibraryCore/Interfaces/IPluginImporter.cs
Normal file
37
SharedLibraryCore/Interfaces/IPluginImporter.cs
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace SharedLibraryCore.Interfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Defines the capabilities of the plugin importer
|
||||||
|
/// </summary>
|
||||||
|
public interface IPluginImporter
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Command types that are defined in plugin assemblies
|
||||||
|
/// </summary>
|
||||||
|
IList<Type> CommandTypes { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The loaded plugins from plugin assemblies
|
||||||
|
/// </summary>
|
||||||
|
IList<IPlugin> ActivePlugins { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Assemblies that contain plugins
|
||||||
|
/// </summary>
|
||||||
|
IList<Assembly> PluginAssemblies { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// All assemblies in the plugin folder
|
||||||
|
/// </summary>
|
||||||
|
IList<Assembly> Assemblies { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads in plugin assemblies and script plugins
|
||||||
|
/// </summary>
|
||||||
|
void Load();
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +1,10 @@
|
|||||||
using SharedLibraryCore.Localization;
|
using Newtonsoft.Json.Converters;
|
||||||
|
using SharedLibraryCore.Localization;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
@ -10,7 +10,7 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace SharedLibraryCore
|
namespace SharedLibraryCore
|
||||||
{
|
{
|
||||||
class ScriptPlugin : IPlugin
|
public class ScriptPlugin : IPlugin
|
||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<ApplicationIcon />
|
<ApplicationIcon />
|
||||||
<StartupObject />
|
<StartupObject />
|
||||||
<PackageId>RaidMax.IW4MAdmin.SharedLibraryCore</PackageId>
|
<PackageId>RaidMax.IW4MAdmin.SharedLibraryCore</PackageId>
|
||||||
<Version>2.2.5</Version>
|
<Version>2.2.6</Version>
|
||||||
<Authors>RaidMax</Authors>
|
<Authors>RaidMax</Authors>
|
||||||
<Company>Forever None</Company>
|
<Company>Forever None</Company>
|
||||||
<Configurations>Debug;Release;Prerelease</Configurations>
|
<Configurations>Debug;Release;Prerelease</Configurations>
|
||||||
@ -20,8 +20,8 @@
|
|||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||||
<Description>Shared Library for IW4MAdmin</Description>
|
<Description>Shared Library for IW4MAdmin</Description>
|
||||||
<AssemblyVersion>2.2.5.0</AssemblyVersion>
|
<AssemblyVersion>2.2.6.0</AssemblyVersion>
|
||||||
<FileVersion>2.2.5.0</FileVersion>
|
<FileVersion>2.2.6.0</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Prerelease|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Prerelease|AnyCPU'">
|
||||||
|
@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Mvc;
|
|||||||
using SharedLibraryCore;
|
using SharedLibraryCore;
|
||||||
using SharedLibraryCore.Dtos;
|
using SharedLibraryCore.Dtos;
|
||||||
using SharedLibraryCore.Interfaces;
|
using SharedLibraryCore.Interfaces;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
@ -10,9 +11,11 @@ namespace WebfrontCore.Controllers
|
|||||||
{
|
{
|
||||||
public class HomeController : BaseController
|
public class HomeController : BaseController
|
||||||
{
|
{
|
||||||
public HomeController(IManager manager) : base(manager)
|
private readonly IPluginImporter _pluginImporter;
|
||||||
{
|
|
||||||
|
|
||||||
|
public HomeController(IManager manager, IPluginImporter importer) : base(manager)
|
||||||
|
{
|
||||||
|
_pluginImporter = importer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IActionResult> Index()
|
public async Task<IActionResult> Index()
|
||||||
@ -65,7 +68,7 @@ namespace WebfrontCore.Controllers
|
|||||||
var pluginType = _cmd.GetType().Assembly.GetTypes().FirstOrDefault(_type => _type.Assembly != excludedAssembly && typeof(IPlugin).IsAssignableFrom(_type));
|
var pluginType = _cmd.GetType().Assembly.GetTypes().FirstOrDefault(_type => _type.Assembly != excludedAssembly && typeof(IPlugin).IsAssignableFrom(_type));
|
||||||
return pluginType == null ?
|
return pluginType == null ?
|
||||||
Utilities.CurrentLocalization.LocalizationIndex["WEBFRONT_HELP_COMMAND_NATIVE"] :
|
Utilities.CurrentLocalization.LocalizationIndex["WEBFRONT_HELP_COMMAND_NATIVE"] :
|
||||||
SharedLibraryCore.Plugins.PluginImporter.ActivePlugins.First(_plugin => _plugin.GetType() == pluginType).Name; // for now we're just returning the name of the plugin, maybe later we'll include more info
|
_pluginImporter.ActivePlugins.First(_plugin => _plugin.GetType() == pluginType).Name; // for now we're just returning the name of the plugin, maybe later we'll include more info
|
||||||
})
|
})
|
||||||
.Select(_grp => (_grp.Key, _grp.AsEnumerable()));
|
.Select(_grp => (_grp.Key, _grp.AsEnumerable()));
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using System.IO;
|
using System;
|
||||||
|
using System.IO;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
@ -11,15 +12,17 @@ namespace WebfrontCore
|
|||||||
public class Program
|
public class Program
|
||||||
{
|
{
|
||||||
public static IManager Manager;
|
public static IManager Manager;
|
||||||
|
public static IServiceProvider ApplicationServiceProvider;
|
||||||
|
|
||||||
static void Main()
|
static void Main()
|
||||||
{
|
{
|
||||||
throw new System.Exception("Webfront core cannot be run as a standalone application");
|
throw new Exception("Webfront core cannot be run as a standalone application");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Task Init(IManager mgr, CancellationToken cancellationToken)
|
public static Task Init(IManager mgr, IServiceProvider existingServiceProvider, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Manager = mgr;
|
Manager = mgr;
|
||||||
|
ApplicationServiceProvider = existingServiceProvider;
|
||||||
var config = Manager.GetApplicationSettings().Configuration();
|
var config = Manager.GetApplicationSettings().Configuration();
|
||||||
Manager.MiddlewareActionHandler.Register(null, new CustomCssAccentMiddlewareAction("#007ACC", "#fd7e14", config.WebfrontPrimaryColor, config.WebfrontSecondaryColor), "custom_css_accent");
|
Manager.MiddlewareActionHandler.Register(null, new CustomCssAccentMiddlewareAction("#007ACC", "#fd7e14", config.WebfrontPrimaryColor, config.WebfrontSecondaryColor), "custom_css_accent");
|
||||||
return BuildWebHost().RunAsync(cancellationToken);
|
return BuildWebHost().RunAsync(cancellationToken);
|
||||||
|
@ -17,16 +17,6 @@ namespace WebfrontCore
|
|||||||
{
|
{
|
||||||
public class Startup
|
public class Startup
|
||||||
{
|
{
|
||||||
public static IConfigurationRoot Configuration { get; private set; }
|
|
||||||
|
|
||||||
public Startup(IWebHostEnvironment env)
|
|
||||||
{
|
|
||||||
var builder = new ConfigurationBuilder()
|
|
||||||
.AddEnvironmentVariables();
|
|
||||||
|
|
||||||
Configuration = builder.Build();
|
|
||||||
}
|
|
||||||
|
|
||||||
// This method gets called by the runtime. Use this method to add services to the container.
|
// This method gets called by the runtime. Use this method to add services to the container.
|
||||||
public void ConfigureServices(IServiceCollection services)
|
public void ConfigureServices(IServiceCollection services)
|
||||||
{
|
{
|
||||||
@ -93,6 +83,7 @@ namespace WebfrontCore
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
services.AddSingleton(Program.Manager);
|
services.AddSingleton(Program.Manager);
|
||||||
|
services.AddSingleton(Program.ApplicationServiceProvider.GetService(typeof(IPluginImporter)) as IPluginImporter);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
@model IEnumerable<(string, IEnumerable<Command>)>
|
@model IEnumerable<(string, IEnumerable<SharedLibraryCore.Interfaces.IManagerCommand>)>
|
||||||
@{
|
@{
|
||||||
var loc = SharedLibraryCore.Utilities.CurrentLocalization.LocalizationIndex;
|
var loc = SharedLibraryCore.Utilities.CurrentLocalization.LocalizationIndex;
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
Version 2.4:
|
Version 2.3:
|
||||||
-added "live radar" feature
|
-added "live radar" feature
|
||||||
-added chat message to server on server list view
|
-added chat message to server on server list view
|
||||||
-added recently connected players dropdown option on webfront
|
-added recently connected players dropdown option on webfront
|
||||||
-added "dashboard" to home view with quick stats
|
-added "dashboard" to home view with quick stats
|
||||||
-added ability to customize accent color and branding on webfront
|
-added ability to customize accent color and branding on webfront
|
||||||
-added flag button to client profile
|
-added flag button to client profile
|
||||||
-hid flagged status of users on webfront unless logged in
|
-added ability to specify permission levels per command
|
||||||
-added snap anticheat metric
|
-added snap anticheat metric
|
||||||
|
|
||||||
Version 2.3:
|
|
||||||
-added configuration option to ignore bots
|
-added configuration option to ignore bots
|
||||||
-updated anticheat slightly
|
-updated anticheat slightly
|
||||||
|
-hides flagged status of users on webfront unless logged in
|
||||||
|
-updated projects to .NET Core 3.1
|
||||||
-lots more
|
-lots more
|
||||||
|
|
||||||
Version 2.2:
|
Version 2.2:
|
||||||
|
Loading…
Reference in New Issue
Block a user