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