152 lines
4.4 KiB
C#
152 lines
4.4 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using Data.Models.Client;
|
|
using SharedLibraryCore.Commands;
|
|
using SharedLibraryCore.Configuration;
|
|
using SharedLibraryCore.Interfaces;
|
|
using static SharedLibraryCore.Server;
|
|
using ILogger = Microsoft.Extensions.Logging.ILogger;
|
|
|
|
namespace SharedLibraryCore
|
|
{
|
|
/// <summary>
|
|
/// Abstract class for command
|
|
/// </summary>
|
|
public abstract class Command : IManagerCommand
|
|
{
|
|
protected readonly CommandConfiguration _config;
|
|
protected readonly ITranslationLookup _translationLookup;
|
|
private string alias;
|
|
protected ILogger logger;
|
|
private string name;
|
|
private EFClient.Permission permission;
|
|
private Game[] supportedGames;
|
|
|
|
public Command(CommandConfiguration config, ITranslationLookup layout)
|
|
{
|
|
_config = config;
|
|
_translationLookup = layout;
|
|
SupportedGames = new Game[0];
|
|
}
|
|
|
|
/// <summary>
|
|
/// Helper property to determine the number of required args
|
|
/// </summary>
|
|
public int RequiredArgumentCount => Arguments.Count(c => c.Required);
|
|
|
|
|
|
/// <summary>
|
|
/// Argument list for the command
|
|
/// </summary>
|
|
public CommandArgument[] Arguments { get; protected set; } = new CommandArgument[0];
|
|
|
|
/// <summary>
|
|
/// Executes the command
|
|
/// </summary>
|
|
/// <param name="gameEvent"></param>
|
|
/// <returns></returns>
|
|
public abstract Task ExecuteAsync(GameEvent gameEvent);
|
|
|
|
/// <summary>
|
|
/// Specifies the name and string that triggers the command
|
|
/// </summary>
|
|
public string Name
|
|
{
|
|
get => name;
|
|
protected set
|
|
{
|
|
try
|
|
{
|
|
name = _config?.Commands[GetType().Name].Name ?? value;
|
|
}
|
|
|
|
catch (KeyNotFoundException)
|
|
{
|
|
name = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Specifies the command description
|
|
/// </summary>
|
|
public string Description { get; protected set; }
|
|
|
|
/// <summary>
|
|
/// Helper property to provide the syntax of the command
|
|
/// </summary>
|
|
public string Syntax =>
|
|
$"{_translationLookup["COMMAND_HELP_SYNTAX"]} {_config.CommandPrefix ?? "!"}{Alias} {string.Join(" ", Arguments.Select(a => $"<{(a.Required ? "" : _translationLookup["COMMAND_HELP_OPTIONAL"] + " ")}{a.Name}>"))}";
|
|
|
|
/// <summary>
|
|
/// Alternate name for this command to be executed by
|
|
/// </summary>
|
|
public string Alias
|
|
{
|
|
get => alias;
|
|
protected set
|
|
{
|
|
try
|
|
{
|
|
alias = _config?.Commands[GetType().Name].Alias ?? value;
|
|
}
|
|
|
|
catch (KeyNotFoundException)
|
|
{
|
|
alias = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Indicates if the command requires a target to execute on
|
|
/// </summary>
|
|
public bool RequiresTarget { get; protected set; }
|
|
|
|
/// <summary>
|
|
/// Minimum permission level to execute command
|
|
/// </summary>
|
|
public EFClient.Permission Permission
|
|
{
|
|
get => permission;
|
|
protected set
|
|
{
|
|
try
|
|
{
|
|
permission = _config?.Commands[GetType().Name].MinimumPermission ?? value;
|
|
}
|
|
|
|
catch (KeyNotFoundException)
|
|
{
|
|
permission = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
public Game[] SupportedGames
|
|
{
|
|
get => supportedGames;
|
|
protected set
|
|
{
|
|
try
|
|
{
|
|
var savedGames = _config?.Commands[GetType().Name].SupportedGames;
|
|
supportedGames = savedGames?.Length != 0 ? savedGames : value;
|
|
}
|
|
|
|
catch (KeyNotFoundException)
|
|
{
|
|
supportedGames = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// indicates if this command allows impersonation (run as)
|
|
/// </summary>
|
|
public bool AllowImpersonation { get; set; }
|
|
|
|
public bool IsBroadcast { get; set; }
|
|
}
|
|
} |