2021-11-28 11:04:37 -05:00
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using Data.Models.Client;
|
|
|
|
|
using IW4MAdmin.Application.Extensions;
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
using SharedLibraryCore;
|
|
|
|
|
using SharedLibraryCore.Commands;
|
|
|
|
|
using SharedLibraryCore.Configuration;
|
|
|
|
|
using SharedLibraryCore.Interfaces;
|
|
|
|
|
using ILogger = Microsoft.Extensions.Logging.ILogger;
|
|
|
|
|
|
|
|
|
|
namespace IW4MAdmin.Application.Commands
|
|
|
|
|
{
|
|
|
|
|
public class MapAndGameTypeCommand : Command
|
|
|
|
|
{
|
|
|
|
|
private const string ArgumentRegexPattern = "(?:\"([^\"]+)\"|([^\\s]+)) (?:\"([^\"]+)\"|([^\\s]+))";
|
|
|
|
|
private readonly ILogger _logger;
|
|
|
|
|
private readonly DefaultSettings _defaultSettings;
|
|
|
|
|
|
|
|
|
|
public MapAndGameTypeCommand(ILogger<MapAndGameTypeCommand> logger, CommandConfiguration config,
|
|
|
|
|
DefaultSettings defaultSettings, ITranslationLookup layout) : base(config, layout)
|
|
|
|
|
{
|
|
|
|
|
Name = "mapandgametype";
|
|
|
|
|
Description = _translationLookup["COMMANDS_MAG_DESCRIPTION"];
|
|
|
|
|
Alias = "mag";
|
|
|
|
|
Permission = EFClient.Permission.Administrator;
|
|
|
|
|
RequiresTarget = false;
|
|
|
|
|
Arguments = new[]
|
|
|
|
|
{
|
|
|
|
|
new CommandArgument
|
|
|
|
|
{
|
|
|
|
|
Name = _translationLookup["COMMADS_MAG_ARG_1"],
|
|
|
|
|
Required = true
|
|
|
|
|
},
|
|
|
|
|
new CommandArgument
|
|
|
|
|
{
|
|
|
|
|
Name = _translationLookup["COMMADS_MAG_ARG_2"],
|
|
|
|
|
Required = true
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
_logger = logger;
|
|
|
|
|
_defaultSettings = defaultSettings;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override async Task ExecuteAsync(GameEvent gameEvent)
|
|
|
|
|
{
|
|
|
|
|
var match = Regex.Match(gameEvent.Data.Trim(), ArgumentRegexPattern,
|
|
|
|
|
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
|
|
|
|
|
|
|
|
|
if (!match.Success)
|
|
|
|
|
{
|
|
|
|
|
gameEvent.Origin.Tell(Syntax);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-22 09:38:02 -05:00
|
|
|
|
var map = match.Groups[1].Length > 0 ? match.Groups[1].ToString() : match.Groups[2].ToString();
|
|
|
|
|
var gametype = match.Groups[3].Length > 0 ? match.Groups[3].ToString() : match.Groups[4].ToString();
|
2021-11-28 11:04:37 -05:00
|
|
|
|
|
|
|
|
|
var matchingMaps = gameEvent.Owner.FindMap(map);
|
|
|
|
|
var matchingGametypes = _defaultSettings.FindGametype(gametype, gameEvent.Owner.GameName);
|
|
|
|
|
|
|
|
|
|
if (matchingMaps.Count > 1)
|
|
|
|
|
{
|
|
|
|
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_MAG_MULTIPLE_MAPS"]);
|
|
|
|
|
|
|
|
|
|
foreach (var matchingMap in matchingMaps)
|
|
|
|
|
{
|
|
|
|
|
gameEvent.Origin.Tell(
|
|
|
|
|
$"[(Color::Yellow){matchingMap.Alias}(Color::White)] [(Color::Yellow){matchingMap.Name}(Color::White)]");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (matchingGametypes.Count > 1)
|
|
|
|
|
{
|
|
|
|
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_MAG_MULTIPLE_GAMETYPES"]);
|
|
|
|
|
|
|
|
|
|
foreach (var matchingGametype in matchingGametypes)
|
|
|
|
|
{
|
|
|
|
|
gameEvent.Origin.Tell(
|
|
|
|
|
$"[(Color::Yellow){matchingGametype.Alias}(Color::White)] [(Color::Yellow){matchingGametype.Name}(Color::White)]");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
map = matchingMaps.FirstOrDefault()?.Name ?? map;
|
|
|
|
|
gametype = matchingGametypes.FirstOrDefault()?.Name ?? gametype;
|
|
|
|
|
var hasMatchingGametype = matchingGametypes.Any();
|
|
|
|
|
|
|
|
|
|
_logger.LogDebug("Changing map to {Map} and gametype {Gametype}", map, gametype);
|
|
|
|
|
|
2022-02-28 21:44:30 -05:00
|
|
|
|
await gameEvent.Owner.SetDvarAsync("g_gametype", gametype, gameEvent.Owner.Manager.CancellationToken);
|
2021-11-28 11:04:37 -05:00
|
|
|
|
gameEvent.Owner.Broadcast(_translationLookup["COMMANDS_MAP_SUCCESS"].FormatExt(map));
|
|
|
|
|
await Task.Delay(gameEvent.Owner.Manager.GetApplicationSettings().Configuration().MapChangeDelaySeconds);
|
|
|
|
|
|
|
|
|
|
switch (gameEvent.Owner.GameName)
|
|
|
|
|
{
|
|
|
|
|
case Server.Game.IW5:
|
|
|
|
|
await gameEvent.Owner.ExecuteCommandAsync(
|
2021-11-28 22:05:08 -05:00
|
|
|
|
$"load_dsr {(hasMatchingGametype ? gametype.ToUpper() + "_default" : gametype)}");
|
|
|
|
|
await gameEvent.Owner.ExecuteCommandAsync($"map {map}");
|
2021-11-28 11:04:37 -05:00
|
|
|
|
break;
|
|
|
|
|
case Server.Game.T6:
|
2021-11-28 22:05:08 -05:00
|
|
|
|
await gameEvent.Owner.ExecuteCommandAsync($"exec {gametype}.cfg");
|
|
|
|
|
await gameEvent.Owner.ExecuteCommandAsync($"map {map}");
|
2021-11-28 11:04:37 -05:00
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
await gameEvent.Owner.ExecuteCommandAsync($"map {map}");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|