abstract engine color codes to use (Color::<Color>) format to make codes more.
see pt6 parser and configs for example usages
This commit is contained in:
parent
66010a2fa2
commit
4a89744ee9
59
Application/Commands/FindPlayerCommand.cs
Normal file
59
Application/Commands/FindPlayerCommand.cs
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Data.Models.Client;
|
||||||
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Commands;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
|
||||||
|
namespace IW4MAdmin.Application.Commands
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Finds player by name
|
||||||
|
/// </summary>
|
||||||
|
public class FindPlayerCommand : Command
|
||||||
|
{
|
||||||
|
public FindPlayerCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config,
|
||||||
|
translationLookup)
|
||||||
|
{
|
||||||
|
Name = "find";
|
||||||
|
Description = _translationLookup["COMMANDS_FIND_DESC"];
|
||||||
|
Alias = "f";
|
||||||
|
Permission = EFClient.Permission.Administrator;
|
||||||
|
RequiresTarget = false;
|
||||||
|
Arguments = new[]
|
||||||
|
{
|
||||||
|
new CommandArgument()
|
||||||
|
{
|
||||||
|
Name = _translationLookup["COMMANDS_ARGS_PLAYER"],
|
||||||
|
Required = true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task ExecuteAsync(GameEvent gameEvent)
|
||||||
|
{
|
||||||
|
if (gameEvent.Data.Length < 3)
|
||||||
|
{
|
||||||
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_FIND_MIN"]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var players = await gameEvent.Owner.Manager.GetClientService().FindClientsByIdentifier(gameEvent.Data);
|
||||||
|
|
||||||
|
if (!players.Any())
|
||||||
|
{
|
||||||
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_FIND_EMPTY"]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var client in players)
|
||||||
|
{
|
||||||
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_FIND_FORMAT_V2"].FormatExt(client.Name,
|
||||||
|
client.ClientId, Utilities.ConvertLevelToColor((EFClient.Permission) client.LevelInt, client.Level),
|
||||||
|
client.IPAddress, (DateTime.UtcNow - client.LastConnection).HumanizeForCurrentCulture()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
50
Application/Commands/ListAdminsCommand.cs
Normal file
50
Application/Commands/ListAdminsCommand.cs
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Data.Models.Client;
|
||||||
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
|
||||||
|
namespace IW4MAdmin.Application.Commands
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Lists all unmasked admins
|
||||||
|
/// </summary>
|
||||||
|
public class ListAdminsCommand : Command
|
||||||
|
{
|
||||||
|
public ListAdminsCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config,
|
||||||
|
translationLookup)
|
||||||
|
{
|
||||||
|
Name = "admins";
|
||||||
|
Description = _translationLookup["COMMANDS_ADMINS_DESC"];
|
||||||
|
Alias = "a";
|
||||||
|
Permission = EFClient.Permission.User;
|
||||||
|
RequiresTarget = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string OnlineAdmins(Server server, ITranslationLookup lookup)
|
||||||
|
{
|
||||||
|
var onlineAdmins = server.GetClientsAsList()
|
||||||
|
.Where(p => p.Level > EFClient.Permission.Flagged)
|
||||||
|
.Where(p => !p.Masked)
|
||||||
|
.Select(p =>
|
||||||
|
$"[(Color::Yellow){Utilities.ConvertLevelToColor(p.Level, p.ClientPermission.Name)}(Color::White)] {p.Name}")
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
return onlineAdmins.Any() ? string.Join(Environment.NewLine, onlineAdmins) : lookup["COMMANDS_ADMINS_NONE"];
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task ExecuteAsync(GameEvent gameEvent)
|
||||||
|
{
|
||||||
|
foreach (var line in OnlineAdmins(gameEvent.Owner, _translationLookup).Split(Environment.NewLine))
|
||||||
|
{
|
||||||
|
var _ = gameEvent.Message.IsBroadcastCommand(_config.BroadcastCommandPrefix)
|
||||||
|
? gameEvent.Owner.Broadcast(line)
|
||||||
|
: gameEvent.Origin.Tell(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
57
Application/Commands/ListAliasesCommand.cs
Normal file
57
Application/Commands/ListAliasesCommand.cs
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Data.Models.Client;
|
||||||
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Commands;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
|
||||||
|
namespace IW4MAdmin.Application.Commands
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Lists alises of specified client
|
||||||
|
/// </summary>
|
||||||
|
public class ListAliasesCommand : Command
|
||||||
|
{
|
||||||
|
public ListAliasesCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config,
|
||||||
|
translationLookup)
|
||||||
|
{
|
||||||
|
Name = "alias";
|
||||||
|
Description = _translationLookup["COMMANDS_ALIAS_DESC"];
|
||||||
|
Alias = "known";
|
||||||
|
Permission = EFClient.Permission.Moderator;
|
||||||
|
RequiresTarget = true;
|
||||||
|
Arguments = new[]
|
||||||
|
{
|
||||||
|
new CommandArgument()
|
||||||
|
{
|
||||||
|
Name = _translationLookup["COMMANDS_ARGS_PLAYER"],
|
||||||
|
Required = true,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task ExecuteAsync(GameEvent gameEvent)
|
||||||
|
{
|
||||||
|
var message = new StringBuilder();
|
||||||
|
var names = new List<string>(gameEvent.Target.AliasLink.Children.Select(a => a.Name));
|
||||||
|
var ips = new List<string>(gameEvent.Target.AliasLink.Children.Select(a => a.IPAddress.ConvertIPtoString())
|
||||||
|
.Distinct());
|
||||||
|
|
||||||
|
gameEvent.Origin.Tell($"[(Color::Accent){gameEvent.Target}(Color::White)]");
|
||||||
|
|
||||||
|
message.Append($"{_translationLookup["COMMANDS_ALIAS_ALIASES"]}: ");
|
||||||
|
message.Append(string.Join(" | ", names));
|
||||||
|
gameEvent.Origin.Tell(message.ToString());
|
||||||
|
|
||||||
|
message.Clear();
|
||||||
|
message.Append($"{_translationLookup["COMMANDS_ALIAS_IPS"]}: ");
|
||||||
|
message.Append(string.Join(" | ", ips));
|
||||||
|
gameEvent.Origin.Tell(message.ToString());
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
37
Application/Commands/ListClientsCommand.cs
Normal file
37
Application/Commands/ListClientsCommand.cs
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Data.Models.Client;
|
||||||
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
|
||||||
|
namespace IW4MAdmin.Application.Commands
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// List online clients
|
||||||
|
/// </summary>
|
||||||
|
public class ListClientsCommand : Command
|
||||||
|
{
|
||||||
|
public ListClientsCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config,
|
||||||
|
translationLookup)
|
||||||
|
{
|
||||||
|
Name = "list";
|
||||||
|
Description = _translationLookup["COMMANDS_LIST_DESC"];
|
||||||
|
Alias = "l";
|
||||||
|
Permission = EFClient.Permission.Moderator;
|
||||||
|
RequiresTarget = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task ExecuteAsync(GameEvent gameEvent)
|
||||||
|
{
|
||||||
|
var clientList = gameEvent.Owner.GetClientsAsList()
|
||||||
|
.Select(client =>
|
||||||
|
$"[(Color::Accent){client.ClientPermission.Name}(Color::White){(string.IsNullOrEmpty(client.Tag) ? "" : $" {client.Tag}")}(Color::White)][(Color::Yellow)#{client.ClientNumber}(Color::White)] {client.Name}")
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
|
gameEvent.Origin.Tell(clientList);
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
41
Application/Commands/ListPluginsCommand.cs
Normal file
41
Application/Commands/ListPluginsCommand.cs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Data.Models.Client;
|
||||||
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
|
||||||
|
namespace IW4MAdmin.Application.Commands
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Lists the loaded plugins
|
||||||
|
/// </summary>
|
||||||
|
public class ListPluginsCommand : Command
|
||||||
|
{
|
||||||
|
private readonly IEnumerable<IPlugin> _plugins;
|
||||||
|
|
||||||
|
public ListPluginsCommand(CommandConfiguration config, ITranslationLookup translationLookup,
|
||||||
|
IEnumerable<IPlugin> plugins) : base(config, translationLookup)
|
||||||
|
{
|
||||||
|
Name = "plugins";
|
||||||
|
Description = _translationLookup["COMMANDS_PLUGINS_DESC"];
|
||||||
|
Alias = "p";
|
||||||
|
Permission = EFClient.Permission.Administrator;
|
||||||
|
RequiresTarget = false;
|
||||||
|
_plugins = plugins;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task ExecuteAsync(GameEvent gameEvent)
|
||||||
|
{
|
||||||
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_PLUGINS_LOADED"]);
|
||||||
|
foreach (var plugin in _plugins.Where(plugin => !plugin.IsParser))
|
||||||
|
{
|
||||||
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_LIST_PLUGINS_FORMAT"]
|
||||||
|
.FormatExt(plugin.Name, plugin.Version, plugin.Author));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
59
Application/Commands/ListReportsCommand.cs
Normal file
59
Application/Commands/ListReportsCommand.cs
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Data.Models.Client;
|
||||||
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Commands;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Helpers;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
|
||||||
|
namespace IW4MAdmin.Application.Commands
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// List all reports on the server
|
||||||
|
/// </summary>
|
||||||
|
public class ListReportsCommand : Command
|
||||||
|
{
|
||||||
|
public ListReportsCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config,
|
||||||
|
translationLookup)
|
||||||
|
{
|
||||||
|
Name = "reports";
|
||||||
|
Description = _translationLookup["COMMANDS_REPORTS_DESC"];
|
||||||
|
Alias = "reps";
|
||||||
|
Permission = EFClient.Permission.Moderator;
|
||||||
|
RequiresTarget = false;
|
||||||
|
Arguments = new[]
|
||||||
|
{
|
||||||
|
new CommandArgument
|
||||||
|
{
|
||||||
|
Name = _translationLookup["COMMANDS_ARGS_CLEAR"],
|
||||||
|
Required = false
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task ExecuteAsync(GameEvent gameEvent)
|
||||||
|
{
|
||||||
|
if (gameEvent.Data != null && gameEvent.Data.ToLower().Contains(_translationLookup["COMMANDS_ARGS_CLEAR"]))
|
||||||
|
{
|
||||||
|
gameEvent.Owner.Reports = new List<Report>();
|
||||||
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_REPORTS_CLEAR_SUCCESS"]);
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gameEvent.Owner.Reports.Count < 1)
|
||||||
|
{
|
||||||
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_REPORTS_NONE"]);
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var report in gameEvent.Owner.Reports)
|
||||||
|
{
|
||||||
|
gameEvent.Origin.Tell(
|
||||||
|
$"(Color::Accent){report.Origin.Name}(Color::White) -> (Color::Red){report.Target.Name}(Color::White): {report.Reason}");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
45
Application/Commands/PrivateMessageCommand.cs
Normal file
45
Application/Commands/PrivateMessageCommand.cs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
using System.Threading.Tasks;
|
||||||
|
using Data.Models.Client;
|
||||||
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Commands;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
|
||||||
|
namespace IW4MAdmin.Application.Commands
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Sends a private message to another player
|
||||||
|
/// </summary>
|
||||||
|
public class PrivateMessageCommand : Command
|
||||||
|
{
|
||||||
|
public PrivateMessageCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
||||||
|
{
|
||||||
|
Name = "privatemessage";
|
||||||
|
Description = _translationLookup["COMMANDS_PM_DESC"];
|
||||||
|
Alias = "pm";
|
||||||
|
Permission = EFClient.Permission.User;
|
||||||
|
RequiresTarget = true;
|
||||||
|
Arguments = new[]
|
||||||
|
{
|
||||||
|
new CommandArgument
|
||||||
|
{
|
||||||
|
Name = _translationLookup["COMMANDS_ARGS_PLAYER"],
|
||||||
|
Required = true
|
||||||
|
},
|
||||||
|
new CommandArgument
|
||||||
|
{
|
||||||
|
Name = _translationLookup["COMMANDS_ARGS_MESSAGE"],
|
||||||
|
Required = true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task ExecuteAsync(GameEvent gameEvent)
|
||||||
|
{
|
||||||
|
gameEvent.Target.Tell(_translationLookup["COMMANDS_PRIVATE_MESSAGE_FORMAT"].FormatExt(gameEvent.Origin.Name, gameEvent.Data));
|
||||||
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_PRIVATE_MESSAGE_RESULT"]
|
||||||
|
.FormatExt(gameEvent.Target.Name, gameEvent.Data));
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
77
Application/Commands/ReportClientCommand.cs
Normal file
77
Application/Commands/ReportClientCommand.cs
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
using System.Threading.Tasks;
|
||||||
|
using Data.Models.Client;
|
||||||
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Commands;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
|
||||||
|
namespace IW4MAdmin.Application.Commands
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Report client for given reason
|
||||||
|
/// </summary>
|
||||||
|
public class ReportClientCommand : Command
|
||||||
|
{
|
||||||
|
public ReportClientCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config,
|
||||||
|
translationLookup)
|
||||||
|
{
|
||||||
|
Name = "report";
|
||||||
|
Description = _translationLookup["COMMANDS_REPORT_DESC"];
|
||||||
|
Alias = "rep";
|
||||||
|
Permission = EFClient.Permission.User;
|
||||||
|
RequiresTarget = true;
|
||||||
|
Arguments = new[]
|
||||||
|
{
|
||||||
|
new CommandArgument
|
||||||
|
{
|
||||||
|
Name = _translationLookup["COMMANDS_ARGS_PLAYER"],
|
||||||
|
Required = true
|
||||||
|
},
|
||||||
|
new CommandArgument
|
||||||
|
{
|
||||||
|
Name = _translationLookup["COMMANDS_ARGS_REASON"],
|
||||||
|
Required = true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task ExecuteAsync(GameEvent commandEvent)
|
||||||
|
{
|
||||||
|
if (commandEvent.Data.ToLower().Contains("camp"))
|
||||||
|
{
|
||||||
|
commandEvent.Origin.Tell(_translationLookup["COMMANDS_REPORT_FAIL_CAMP"]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var success = false;
|
||||||
|
|
||||||
|
switch ((await commandEvent.Target.Report(commandEvent.Data, commandEvent.Origin)
|
||||||
|
.WaitAsync(Utilities.DefaultCommandTimeout, commandEvent.Owner.Manager.CancellationToken)).FailReason)
|
||||||
|
{
|
||||||
|
case GameEvent.EventFailReason.None:
|
||||||
|
commandEvent.Origin.Tell(_translationLookup["COMMANDS_REPORT_SUCCESS"]);
|
||||||
|
success = true;
|
||||||
|
break;
|
||||||
|
case GameEvent.EventFailReason.Exception:
|
||||||
|
commandEvent.Origin.Tell(_translationLookup["COMMANDS_REPORT_FAIL_DUPLICATE"]);
|
||||||
|
break;
|
||||||
|
case GameEvent.EventFailReason.Permission:
|
||||||
|
commandEvent.Origin.Tell(_translationLookup["COMMANDS_REPORT_FAIL"]
|
||||||
|
.FormatExt(commandEvent.Target.Name));
|
||||||
|
break;
|
||||||
|
case GameEvent.EventFailReason.Invalid:
|
||||||
|
commandEvent.Origin.Tell(_translationLookup["COMMANDS_REPORT_FAIL_SELF"]);
|
||||||
|
break;
|
||||||
|
case GameEvent.EventFailReason.Throttle:
|
||||||
|
commandEvent.Origin.Tell(_translationLookup["COMMANDS_REPORT_FAIL_TOOMANY"]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
commandEvent.Owner.ToAdmins(
|
||||||
|
$"(Color::Accent){commandEvent.Origin.Name}(Color::White) -> (Color::Red){commandEvent.Target.Name}(Color::White): {commandEvent.Data}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
46
Application/Commands/SayAllCommand.cs
Normal file
46
Application/Commands/SayAllCommand.cs
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
using System.Threading.Tasks;
|
||||||
|
using Data.Models.Client;
|
||||||
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Commands;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
|
||||||
|
namespace IW4MAdmin.Application.Commands
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Prints out a message to all clients on all servers
|
||||||
|
/// </summary>
|
||||||
|
public class SayAllCommand : Command
|
||||||
|
{
|
||||||
|
public SayAllCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config,
|
||||||
|
translationLookup)
|
||||||
|
{
|
||||||
|
Name = "sayall";
|
||||||
|
Description = _translationLookup["COMMANDS_SAY_ALL_DESC"];
|
||||||
|
Alias = "sa";
|
||||||
|
Permission = EFClient.Permission.Moderator;
|
||||||
|
RequiresTarget = false;
|
||||||
|
Arguments = new[]
|
||||||
|
{
|
||||||
|
new CommandArgument
|
||||||
|
{
|
||||||
|
Name = _translationLookup["COMMANDS_ARGS_MESSAGE"],
|
||||||
|
Required = true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task ExecuteAsync(GameEvent gameEvent)
|
||||||
|
{
|
||||||
|
var message = $"(Color::Accent){gameEvent.Origin.Name}(Color::White) - (Color::Red){gameEvent.Data}";
|
||||||
|
|
||||||
|
foreach (var server in gameEvent.Owner.Manager.GetServers())
|
||||||
|
{
|
||||||
|
server.Broadcast(message, gameEvent.Origin);
|
||||||
|
}
|
||||||
|
|
||||||
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_SAY_SUCCESS"]);
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
42
Application/Commands/SayCommand.cs
Normal file
42
Application/Commands/SayCommand.cs
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
using System.Threading.Tasks;
|
||||||
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Commands;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
using EFClient = Data.Models.Client.EFClient;
|
||||||
|
|
||||||
|
namespace IW4MAdmin.Application.Commands
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Prints out a message to all clients on the server
|
||||||
|
/// </summary>
|
||||||
|
public class SayCommand : Command
|
||||||
|
{
|
||||||
|
public SayCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config,
|
||||||
|
translationLookup)
|
||||||
|
{
|
||||||
|
Name = "say";
|
||||||
|
Description = _translationLookup["COMMANDS_SAY_DESC"];
|
||||||
|
Alias = "s";
|
||||||
|
Permission = EFClient.Permission.Moderator;
|
||||||
|
RequiresTarget = false;
|
||||||
|
Arguments = new[]
|
||||||
|
{
|
||||||
|
new CommandArgument
|
||||||
|
{
|
||||||
|
Name = _translationLookup["COMMANDS_ARGS_MESSAGE"],
|
||||||
|
Required = true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task ExecuteAsync(GameEvent gameEvent)
|
||||||
|
{
|
||||||
|
gameEvent.Owner.Broadcast(
|
||||||
|
_translationLookup["COMMANDS_SAY_FORMAT"].FormatExt(gameEvent.Origin.Name, gameEvent.Data),
|
||||||
|
gameEvent.Origin);
|
||||||
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_SAY_SUCCESS"]);
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
38
Application/Commands/WhoAmICommand.cs
Normal file
38
Application/Commands/WhoAmICommand.cs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
using System.Threading.Tasks;
|
||||||
|
using Data.Models.Client;
|
||||||
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Configuration;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
|
|
||||||
|
namespace IW4MAdmin.Application.Commands
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Prints client information
|
||||||
|
/// </summary>
|
||||||
|
public class WhoAmICommand : Command
|
||||||
|
{
|
||||||
|
public WhoAmICommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config,
|
||||||
|
translationLookup)
|
||||||
|
{
|
||||||
|
Name = "whoami";
|
||||||
|
Description = _translationLookup["COMMANDS_WHO_DESC"];
|
||||||
|
Alias = "who";
|
||||||
|
Permission = EFClient.Permission.User;
|
||||||
|
RequiresTarget = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task ExecuteAsync(GameEvent gameEvent)
|
||||||
|
{
|
||||||
|
var you =
|
||||||
|
"[(Color::Yellow)#{{clientNumber}}(Color::White)] [(Color::Yellow)@{{clientId}}(Color::White)] [{{networkId}}] [{{ip}}] [(Color::Cyan){{level}}(Color::White){{tag}}(Color::White)] {{name}}"
|
||||||
|
.FormatExt(gameEvent.Origin.ClientNumber,
|
||||||
|
gameEvent.Origin.ClientId, gameEvent.Origin.GuidString,
|
||||||
|
gameEvent.Origin.IPAddressString, gameEvent.Origin.ClientPermission.Name,
|
||||||
|
string.IsNullOrEmpty(gameEvent.Origin.Tag) ? "" : $" {gameEvent.Origin.Tag}",
|
||||||
|
gameEvent.Origin.Name);
|
||||||
|
gameEvent.Origin.Tell(you);
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"AutoMessagePeriod": 60,
|
"AutoMessagePeriod": 60,
|
||||||
"AutoMessages": [
|
"AutoMessages": [
|
||||||
"This server uses ^5IW4M Admin v{{VERSION}} ^7get it at ^5raidmax.org/IW4MAdmin",
|
"This server uses (Color::Accent)IW4M Admin v{{VERSION}} (Color::White)get it at (Color::Accent)raidmax.org/IW4MAdmin",
|
||||||
"^5IW4M Admin ^7sees ^5YOU!",
|
"(Color::Accent)IW4M Admin (Color::White)sees (Color::Accent)YOU!",
|
||||||
"{{TOPSTATS}}",
|
"{{TOPSTATS}}",
|
||||||
"This server has seen a total of ^5{{TOTALPLAYERS}} ^7players!",
|
"This server has seen a total of (Color::Accent){{TOTALPLAYERS}} (Color::White)players!",
|
||||||
"Cheaters are ^1unwelcome ^7 on this server",
|
"Cheaters are (Color::Red)unwelcome (Color::White)on this server",
|
||||||
"Did you know 8/10 people agree with unverified statistics?"
|
"Did you know 8/10 people agree with unverified statistics?"
|
||||||
],
|
],
|
||||||
"GlobalRules": [
|
"GlobalRules": [
|
||||||
|
@ -23,7 +23,9 @@ using Serilog.Context;
|
|||||||
using static SharedLibraryCore.Database.Models.EFClient;
|
using static SharedLibraryCore.Database.Models.EFClient;
|
||||||
using Data.Models;
|
using Data.Models;
|
||||||
using Data.Models.Server;
|
using Data.Models.Server;
|
||||||
|
using IW4MAdmin.Application.Commands;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using SharedLibraryCore.Formatting;
|
||||||
using static Data.Models.Client.EFClient;
|
using static Data.Models.Client.EFClient;
|
||||||
|
|
||||||
namespace IW4MAdmin
|
namespace IW4MAdmin
|
||||||
@ -433,7 +435,7 @@ namespace IW4MAdmin
|
|||||||
|
|
||||||
if (E.Origin.Level > Permission.Moderator)
|
if (E.Origin.Level > Permission.Moderator)
|
||||||
{
|
{
|
||||||
E.Origin.Tell(string.Format(loc["SERVER_REPORT_COUNT"], E.Owner.Reports.Count));
|
E.Origin.Tell(loc["SERVER_REPORT_COUNT_V2"].FormatExt(E.Owner.Reports.Count));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1109,6 +1111,15 @@ namespace IW4MAdmin
|
|||||||
Version = RconParser.Version;
|
Version = RconParser.Version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!RconParser.Configuration.ColorCodeMapping.ContainsKey(ColorCodes.Accent.ToString()))
|
||||||
|
{
|
||||||
|
var accentKey = Manager.GetApplicationSettings().Configuration().IngameAccentColorKey;
|
||||||
|
RconParser.Configuration.ColorCodeMapping.Add(ColorCodes.Accent.ToString(),
|
||||||
|
RconParser.Configuration.ColorCodeMapping.TryGetValue(accentKey, out var colorCode)
|
||||||
|
? colorCode
|
||||||
|
: "");
|
||||||
|
}
|
||||||
|
|
||||||
var svRunning = await this.GetMappedDvarValueOrDefaultAsync<string>("sv_running");
|
var svRunning = await this.GetMappedDvarValueOrDefaultAsync<string>("sv_running");
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(svRunning.Value) && svRunning.Value != "1")
|
if (!string.IsNullOrEmpty(svRunning.Value) && svRunning.Value != "1")
|
||||||
@ -1344,7 +1355,7 @@ namespace IW4MAdmin
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var message = loc["COMMANDS_WARNING_FORMAT"]
|
var message = loc["COMMANDS_WARNING_FORMAT_V2"]
|
||||||
.FormatExt(activeClient.Warnings, activeClient.Name, reason);
|
.FormatExt(activeClient.Warnings, activeClient.Name, reason);
|
||||||
activeClient.CurrentServer.Broadcast(message);
|
activeClient.CurrentServer.Broadcast(message);
|
||||||
}
|
}
|
||||||
@ -1472,7 +1483,7 @@ namespace IW4MAdmin
|
|||||||
Manager.GetMessageTokens().Add(new MessageToken("TOTALPLAYERS", (Server s) => Task.Run(async () => (await Manager.GetClientService().GetTotalClientsAsync()).ToString())));
|
Manager.GetMessageTokens().Add(new MessageToken("TOTALPLAYERS", (Server s) => Task.Run(async () => (await Manager.GetClientService().GetTotalClientsAsync()).ToString())));
|
||||||
Manager.GetMessageTokens().Add(new MessageToken("VERSION", (Server s) => Task.FromResult(Application.Program.Version.ToString())));
|
Manager.GetMessageTokens().Add(new MessageToken("VERSION", (Server s) => Task.FromResult(Application.Program.Version.ToString())));
|
||||||
Manager.GetMessageTokens().Add(new MessageToken("NEXTMAP", (Server s) => SharedLibraryCore.Commands.NextMapCommand.GetNextMap(s, _translationLookup)));
|
Manager.GetMessageTokens().Add(new MessageToken("NEXTMAP", (Server s) => SharedLibraryCore.Commands.NextMapCommand.GetNextMap(s, _translationLookup)));
|
||||||
Manager.GetMessageTokens().Add(new MessageToken("ADMINS", (Server s) => Task.FromResult(SharedLibraryCore.Commands.ListAdminsCommand.OnlineAdmins(s, _translationLookup))));
|
Manager.GetMessageTokens().Add(new MessageToken("ADMINS", (Server s) => Task.FromResult(ListAdminsCommand.OnlineAdmins(s, _translationLookup))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ using SharedLibraryCore.Interfaces;
|
|||||||
using SharedLibraryCore.RCon;
|
using SharedLibraryCore.RCon;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
using SharedLibraryCore.Formatting;
|
||||||
|
|
||||||
namespace IW4MAdmin.Application.RConParsers
|
namespace IW4MAdmin.Application.RConParsers
|
||||||
{
|
{
|
||||||
@ -31,6 +32,22 @@ namespace IW4MAdmin.Application.RConParsers
|
|||||||
public int? DefaultRConPort { get; set; }
|
public int? DefaultRConPort { get; set; }
|
||||||
public string DefaultInstallationDirectoryHint { get; set; }
|
public string DefaultInstallationDirectoryHint { get; set; }
|
||||||
|
|
||||||
|
public ColorCodeMapping ColorCodeMapping { get; set; } = new ColorCodeMapping
|
||||||
|
{
|
||||||
|
// this is the default mapping (IW4), but can be overridden as needed in the parsers
|
||||||
|
{ColorCodes.Black.ToString(), "^0"},
|
||||||
|
{ColorCodes.Red.ToString(), "^1"},
|
||||||
|
{ColorCodes.Green.ToString(), "^2"},
|
||||||
|
{ColorCodes.Yellow.ToString(), "^3"},
|
||||||
|
{ColorCodes.Blue.ToString(), "^4"},
|
||||||
|
{ColorCodes.Cyan.ToString(), "^5"},
|
||||||
|
{ColorCodes.Pink.ToString(), "^6"},
|
||||||
|
{ColorCodes.White.ToString(), "^7"},
|
||||||
|
{ColorCodes.Map.ToString(), "^8"},
|
||||||
|
{ColorCodes.Grey.ToString(), "^9"},
|
||||||
|
{ColorCodes.Wildcard.ToString(), ":^"},
|
||||||
|
};
|
||||||
|
|
||||||
public DynamicRConParserConfiguration(IParserRegexFactory parserRegexFactory)
|
public DynamicRConParserConfiguration(IParserRegexFactory parserRegexFactory)
|
||||||
{
|
{
|
||||||
Status = parserRegexFactory.CreateParserRegex();
|
Status = parserRegexFactory.CreateParserRegex();
|
||||||
|
@ -3,7 +3,7 @@ var eventParser;
|
|||||||
|
|
||||||
var plugin = {
|
var plugin = {
|
||||||
author: 'RaidMax, Xerxes',
|
author: 'RaidMax, Xerxes',
|
||||||
version: 1.1,
|
version: 1.2,
|
||||||
name: 'Plutonium T6 Parser',
|
name: 'Plutonium T6 Parser',
|
||||||
isParser: true,
|
isParser: true,
|
||||||
|
|
||||||
@ -39,6 +39,21 @@ var plugin = {
|
|||||||
rconParser.Configuration.Status.AddMapping(104, 5);
|
rconParser.Configuration.Status.AddMapping(104, 5);
|
||||||
rconParser.Configuration.Status.AddMapping(105, 6);
|
rconParser.Configuration.Status.AddMapping(105, 6);
|
||||||
|
|
||||||
|
// this is mostly default but just an example on how to map
|
||||||
|
rconParser.Configuration.ColorCodeMapping.Clear();
|
||||||
|
rconParser.Configuration.ColorCodeMapping.Add('Black', '^0');
|
||||||
|
rconParser.Configuration.ColorCodeMapping.Add('Red', '^1');
|
||||||
|
rconParser.Configuration.ColorCodeMapping.Add('Green', '^2');
|
||||||
|
rconParser.Configuration.ColorCodeMapping.Add('Yellow', '^3');
|
||||||
|
rconParser.Configuration.ColorCodeMapping.Add('Blue', '^4');
|
||||||
|
rconParser.Configuration.ColorCodeMapping.Add('Cyan', '^5');
|
||||||
|
rconParser.Configuration.ColorCodeMapping.Add('Pink', '^6');
|
||||||
|
rconParser.Configuration.ColorCodeMapping.Add('White', '^7');
|
||||||
|
rconParser.Configuration.ColorCodeMapping.Add('Map', '^8');
|
||||||
|
rconParser.Configuration.ColorCodeMapping.Add('Grey', '^9');
|
||||||
|
rconParser.Configuration.ColorCodeMapping.Add('LightBlue', '^;');
|
||||||
|
rconParser.Configuration.ColorCodeMapping.Add('LightYellow', '^:');
|
||||||
|
|
||||||
eventParser.Configuration.GameDirectory = '';
|
eventParser.Configuration.GameDirectory = '';
|
||||||
eventParser.Configuration.GuidNumberStyle = 7; // Integer
|
eventParser.Configuration.GuidNumberStyle = 7; // Integer
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ using Microsoft.EntityFrameworkCore;
|
|||||||
using SharedLibraryCore;
|
using SharedLibraryCore;
|
||||||
using SharedLibraryCore.Interfaces;
|
using SharedLibraryCore.Interfaces;
|
||||||
using Stats.Client.Abstractions;
|
using Stats.Client.Abstractions;
|
||||||
|
using Stats.Config;
|
||||||
using Stats.Helpers;
|
using Stats.Helpers;
|
||||||
|
|
||||||
namespace Stats.Client
|
namespace Stats.Client
|
||||||
|
@ -9,8 +9,8 @@ using Data.Models.Client.Stats;
|
|||||||
using SharedLibraryCore.Database.Models;
|
using SharedLibraryCore.Database.Models;
|
||||||
using SharedLibraryCore.Configuration;
|
using SharedLibraryCore.Configuration;
|
||||||
using SharedLibraryCore.Interfaces;
|
using SharedLibraryCore.Interfaces;
|
||||||
using IW4MAdmin.Plugins.Stats.Config;
|
|
||||||
using IW4MAdmin.Plugins.Stats.Helpers;
|
using IW4MAdmin.Plugins.Stats.Helpers;
|
||||||
|
using Stats.Config;
|
||||||
|
|
||||||
namespace IW4MAdmin.Plugins.Stats.Commands
|
namespace IW4MAdmin.Plugins.Stats.Commands
|
||||||
{
|
{
|
||||||
@ -76,7 +76,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
|
|
||||||
var iqList = await iqStats.ToListAsync();
|
var iqList = await iqStats.ToListAsync();
|
||||||
|
|
||||||
return iqList.Select((stats, index) => translationLookup["PLUGINS_STATS_COMMANDS_MOSTKILLS_FORMAT"]
|
return iqList.Select((stats, index) => translationLookup["PLUGINS_STATS_COMMANDS_MOSTKILLS_FORMAT_V2"]
|
||||||
.FormatExt(index + 1, stats.Name, stats.Kills))
|
.FormatExt(index + 1, stats.Name, stats.Kills))
|
||||||
.Prepend(Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_MOSTKILLS_HEADER"]);
|
.Prepend(Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_MOSTKILLS_HEADER"]);
|
||||||
}
|
}
|
||||||
|
@ -20,9 +20,9 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
{
|
{
|
||||||
var serverId = StatManager.GetIdForServer(s);
|
var serverId = StatManager.GetIdForServer(s);
|
||||||
|
|
||||||
var mostPlayed = new List<string>()
|
var mostPlayed = new List<string>
|
||||||
{
|
{
|
||||||
$"^5--{translationLookup["PLUGINS_STATS_COMMANDS_MOSTPLAYED_TEXT"]}--"
|
$"(Color::Accent)--{translationLookup["PLUGINS_STATS_COMMANDS_MOSTPLAYED_TEXT"]}--"
|
||||||
};
|
};
|
||||||
|
|
||||||
await using var context = contextFactory.CreateContext(false);
|
await using var context = contextFactory.CreateContext(false);
|
||||||
@ -48,7 +48,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
var iqList = await iqStats.ToListAsync();
|
var iqList = await iqStats.ToListAsync();
|
||||||
|
|
||||||
mostPlayed.AddRange(iqList.Select((stats, index) =>
|
mostPlayed.AddRange(iqList.Select((stats, index) =>
|
||||||
$"#{index + 1} " + translationLookup["COMMANDS_MOST_PLAYED_FORMAT"].FormatExt(stats.Name, stats.Kills,
|
$"#{index + 1} " + translationLookup["COMMANDS_MOST_PLAYED_FORMAT_V2"].FormatExt(stats.Name, stats.Kills,
|
||||||
(DateTime.UtcNow - DateTime.UtcNow.AddSeconds(-stats.TimePlayed))
|
(DateTime.UtcNow - DateTime.UtcNow.AddSeconds(-stats.TimePlayed))
|
||||||
.HumanizeForCurrentCulture())));
|
.HumanizeForCurrentCulture())));
|
||||||
|
|
||||||
|
@ -1,31 +1,28 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using System.Linq;
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using SharedLibraryCore;
|
using SharedLibraryCore;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Data.Abstractions;
|
|
||||||
using Data.Models.Client.Stats;
|
|
||||||
using SharedLibraryCore.Database.Models;
|
|
||||||
using IW4MAdmin.Plugins.Stats.Helpers;
|
using IW4MAdmin.Plugins.Stats.Helpers;
|
||||||
using SharedLibraryCore.Configuration;
|
using SharedLibraryCore.Configuration;
|
||||||
using SharedLibraryCore.Interfaces;
|
using SharedLibraryCore.Interfaces;
|
||||||
|
using EFClient = Data.Models.Client.EFClient;
|
||||||
|
|
||||||
namespace IW4MAdmin.Plugins.Stats.Commands
|
namespace IW4MAdmin.Plugins.Stats.Commands
|
||||||
{
|
{
|
||||||
class TopStats : Command
|
public class TopStats : Command
|
||||||
{
|
{
|
||||||
public static async Task<List<string>> GetTopStats(Server s, ITranslationLookup translationLookup)
|
public static async Task<List<string>> GetTopStats(Server s, ITranslationLookup translationLookup)
|
||||||
{
|
{
|
||||||
long serverId = StatManager.GetIdForServer(s);
|
var serverId = StatManager.GetIdForServer(s);
|
||||||
var topStatsText = new List<string>()
|
var topStatsText = new List<string>()
|
||||||
{
|
{
|
||||||
$"^5--{translationLookup["PLUGINS_STATS_COMMANDS_TOP_TEXT"]}--"
|
$"(Color::Accent)--{translationLookup["PLUGINS_STATS_COMMANDS_TOP_TEXT"]}--"
|
||||||
};
|
};
|
||||||
|
|
||||||
var stats = await Plugin.Manager.GetTopStats(0, 5, serverId);
|
var stats = await Plugin.Manager.GetTopStats(0, 5, serverId);
|
||||||
var statsList = stats.Select((stats, index) => $"#{index + 1} ^3{stats.Name}^7 - ^5{stats.KDR} ^7{translationLookup["PLUGINS_STATS_TEXT_KDR"]} | ^5{stats.Performance} ^7{translationLookup["PLUGINS_STATS_COMMANDS_PERFORMANCE"]}");
|
var statsList = stats.Select((stats, index) =>
|
||||||
|
translationLookup["COMMANDS_TOPSTATS_RESULT"]
|
||||||
|
.FormatExt(index + 1, stats.Name, stats.KDR, stats.Performance));
|
||||||
|
|
||||||
topStatsText.AddRange(statsList);
|
topStatsText.AddRange(statsList);
|
||||||
|
|
||||||
@ -41,11 +38,10 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
return topStatsText;
|
return topStatsText;
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly CommandConfiguration _config;
|
private new readonly CommandConfiguration _config;
|
||||||
private readonly IDatabaseContextFactory _contextFactory;
|
|
||||||
|
|
||||||
public TopStats(CommandConfiguration config, ITranslationLookup translationLookup,
|
public TopStats(CommandConfiguration config, ITranslationLookup translationLookup) : base(config,
|
||||||
IDatabaseContextFactory contextFactory) : base(config, translationLookup)
|
translationLookup)
|
||||||
{
|
{
|
||||||
Name = "topstats";
|
Name = "topstats";
|
||||||
Description = translationLookup["PLUGINS_STATS_COMMANDS_TOP_DESC"];
|
Description = translationLookup["PLUGINS_STATS_COMMANDS_TOP_DESC"];
|
||||||
@ -54,7 +50,6 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
RequiresTarget = false;
|
RequiresTarget = false;
|
||||||
|
|
||||||
_config = config;
|
_config = config;
|
||||||
_contextFactory = contextFactory;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task ExecuteAsync(GameEvent E)
|
public override async Task ExecuteAsync(GameEvent E)
|
||||||
|
@ -24,9 +24,9 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
Alias = "xlrstats";
|
Alias = "xlrstats";
|
||||||
Permission = EFClient.Permission.User;
|
Permission = EFClient.Permission.User;
|
||||||
RequiresTarget = false;
|
RequiresTarget = false;
|
||||||
Arguments = new CommandArgument[]
|
Arguments = new []
|
||||||
{
|
{
|
||||||
new CommandArgument()
|
new CommandArgument
|
||||||
{
|
{
|
||||||
Name = "player",
|
Name = "player",
|
||||||
Required = false
|
Required = false
|
||||||
@ -73,14 +73,15 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
if (pStats == null)
|
if (pStats == null)
|
||||||
{
|
{
|
||||||
await using var context = _contextFactory.CreateContext(false);
|
await using var context = _contextFactory.CreateContext(false);
|
||||||
pStats = (await context.Set<EFClientStatistics>()
|
pStats = await context.Set<EFClientStatistics>()
|
||||||
.FirstOrDefaultAsync(c => c.ServerId == serverId && c.ClientId == E.Target.ClientId));
|
.FirstOrDefaultAsync(c => c.ServerId == serverId && c.ClientId == E.Target.ClientId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// if it's still null then they've not gotten a kill or death yet
|
// if it's still null then they've not gotten a kill or death yet
|
||||||
statLine = pStats == null
|
statLine = pStats == null
|
||||||
? _translationLookup["PLUGINS_STATS_COMMANDS_NOTAVAILABLE"]
|
? _translationLookup["PLUGINS_STATS_COMMANDS_NOTAVAILABLE"]
|
||||||
: $"^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}";
|
: _translationLookup["COMMANDS_VIEW_STATS_RESULT"].FormatExt(pStats.Kills, pStats.Deaths,
|
||||||
|
pStats.KDR, pStats.Performance, performanceRankingString);
|
||||||
}
|
}
|
||||||
|
|
||||||
// getting self stats
|
// getting self stats
|
||||||
@ -108,7 +109,8 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
// if it's still null then they've not gotten a kill or death yet
|
// if it's still null then they've not gotten a kill or death yet
|
||||||
statLine = pStats == null
|
statLine = pStats == null
|
||||||
? _translationLookup["PLUGINS_STATS_COMMANDS_NOTAVAILABLE"]
|
? _translationLookup["PLUGINS_STATS_COMMANDS_NOTAVAILABLE"]
|
||||||
: $"^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}";
|
: _translationLookup["COMMANDS_VIEW_STATS_RESULT"].FormatExt(pStats.Kills, pStats.Deaths,
|
||||||
|
pStats.KDR, pStats.Performance, performanceRankingString);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (E.Message.IsBroadcastCommand(_config.BroadcastCommandPrefix))
|
if (E.Message.IsBroadcastCommand(_config.BroadcastCommandPrefix))
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
using SharedLibraryCore;
|
using System;
|
||||||
using SharedLibraryCore.Interfaces;
|
|
||||||
using Stats.Config;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using IW4MAdmin.Plugins.Stats.Config;
|
||||||
|
using SharedLibraryCore;
|
||||||
|
using SharedLibraryCore.Interfaces;
|
||||||
using static IW4MAdmin.Plugins.Stats.Cheat.Detection;
|
using static IW4MAdmin.Plugins.Stats.Cheat.Detection;
|
||||||
|
|
||||||
namespace IW4MAdmin.Plugins.Stats.Config
|
namespace Stats.Config
|
||||||
{
|
{
|
||||||
public class StatsConfiguration : IBaseConfiguration
|
public class StatsConfiguration : IBaseConfiguration
|
||||||
{
|
{
|
||||||
@ -74,28 +74,28 @@ namespace IW4MAdmin.Plugins.Stats.Config
|
|||||||
public IBaseConfiguration Generate()
|
public IBaseConfiguration Generate()
|
||||||
{
|
{
|
||||||
AnticheatConfiguration.Enable =
|
AnticheatConfiguration.Enable =
|
||||||
Utilities.PromptBool(Utilities.CurrentLocalization.LocalizationIndex["PLUGIN_STATS_SETUP_ENABLEAC"]);
|
Utilities.CurrentLocalization.LocalizationIndex["PLUGIN_STATS_SETUP_ENABLEAC"].PromptBool();
|
||||||
KillstreakMessages = new List<StreakMessageConfiguration>()
|
KillstreakMessages = new List<StreakMessageConfiguration>
|
||||||
{
|
{
|
||||||
new StreakMessageConfiguration()
|
new StreakMessageConfiguration
|
||||||
{
|
{
|
||||||
Count = -1,
|
Count = -1,
|
||||||
Message = "Try not to kill yourself anymore"
|
Message = Utilities.CurrentLocalization.LocalizationIndex["STATS_STREAK_MESSAGE_SUICIDE"]
|
||||||
},
|
},
|
||||||
new StreakMessageConfiguration()
|
new StreakMessageConfiguration
|
||||||
{
|
{
|
||||||
Count = 5,
|
Count = 5,
|
||||||
Message = "Great job! You're on a ^55 killstreak!"
|
Message = Utilities.CurrentLocalization.LocalizationIndex["STATS_STREAK_MESSAGE_5"]
|
||||||
},
|
},
|
||||||
new StreakMessageConfiguration()
|
new StreakMessageConfiguration
|
||||||
{
|
{
|
||||||
Count = 10,
|
Count = 10,
|
||||||
Message = "Amazing! ^510 kills ^7without dying!"
|
Message = Utilities.CurrentLocalization.LocalizationIndex["STATS_STREAK_MESSAGE_10"]
|
||||||
},
|
},
|
||||||
new StreakMessageConfiguration()
|
new StreakMessageConfiguration
|
||||||
{
|
{
|
||||||
Count = 25,
|
Count = 25,
|
||||||
Message = "You better call in that nuke, ^525 killstreak^7!"
|
Message = Utilities.CurrentLocalization.LocalizationIndex["STATS_STREAK_MESSAGE_25"]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -104,12 +104,12 @@ namespace IW4MAdmin.Plugins.Stats.Config
|
|||||||
new StreakMessageConfiguration()
|
new StreakMessageConfiguration()
|
||||||
{
|
{
|
||||||
Count = 5,
|
Count = 5,
|
||||||
Message = "Pick it up soldier, you've died ^55 times ^7in a row..."
|
Message = Utilities.CurrentLocalization.LocalizationIndex["STATS_DEATH_STREAK_MESSAGE_5"]
|
||||||
},
|
},
|
||||||
new StreakMessageConfiguration()
|
new StreakMessageConfiguration()
|
||||||
{
|
{
|
||||||
Count = 10,
|
Count = 10,
|
||||||
Message = "Seriously? ^510 deaths ^7without getting a kill?"
|
Message = Utilities.CurrentLocalization.LocalizationIndex["STATS_DEATH_STREAK_MESSAGE_10"]
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ using Data.Models.Server;
|
|||||||
using Humanizer.Localisation;
|
using Humanizer.Localisation;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Stats.Client.Abstractions;
|
using Stats.Client.Abstractions;
|
||||||
|
using Stats.Config;
|
||||||
using Stats.Helpers;
|
using Stats.Helpers;
|
||||||
using static IW4MAdmin.Plugins.Stats.Cheat.Detection;
|
using static IW4MAdmin.Plugins.Stats.Cheat.Detection;
|
||||||
using EFClient = SharedLibraryCore.Database.Models.EFClient;
|
using EFClient = SharedLibraryCore.Database.Models.EFClient;
|
||||||
|
@ -20,6 +20,7 @@ using Microsoft.Extensions.Logging;
|
|||||||
using SharedLibraryCore.Commands;
|
using SharedLibraryCore.Commands;
|
||||||
using IW4MAdmin.Plugins.Stats.Client.Abstractions;
|
using IW4MAdmin.Plugins.Stats.Client.Abstractions;
|
||||||
using Stats.Client.Abstractions;
|
using Stats.Client.Abstractions;
|
||||||
|
using Stats.Config;
|
||||||
using EFClient = SharedLibraryCore.Database.Models.EFClient;
|
using EFClient = SharedLibraryCore.Database.Models.EFClient;
|
||||||
|
|
||||||
namespace IW4MAdmin.Plugins.Stats
|
namespace IW4MAdmin.Plugins.Stats
|
||||||
@ -88,7 +89,7 @@ namespace IW4MAdmin.Plugins.Stats
|
|||||||
break;
|
break;
|
||||||
case GameEvent.EventType.Command:
|
case GameEvent.EventType.Command:
|
||||||
var shouldPersist = !string.IsNullOrEmpty(E.Data) &&
|
var shouldPersist = !string.IsNullOrEmpty(E.Data) &&
|
||||||
E.Extra is SayCommand;
|
E.Extra?.GetType().Name == "SayCommand";
|
||||||
if (shouldPersist)
|
if (shouldPersist)
|
||||||
{
|
{
|
||||||
await Manager.AddMessageAsync(E.Origin.ClientId, StatManager.GetIdForServer(S), false, E.Data);
|
await Manager.AddMessageAsync(E.Origin.ClientId, StatManager.GetIdForServer(S), false, E.Data);
|
||||||
|
@ -45,16 +45,16 @@ namespace IW4MAdmin.Plugins.Welcome
|
|||||||
|
|
||||||
public Task OnTickAsync(Server S) => Task.CompletedTask;
|
public Task OnTickAsync(Server S) => Task.CompletedTask;
|
||||||
|
|
||||||
public async Task OnEventAsync(GameEvent E, Server S)
|
public async Task OnEventAsync(GameEvent gameEvent, Server server)
|
||||||
{
|
{
|
||||||
if (E.Type == GameEvent.EventType.Join)
|
if (gameEvent.Type == GameEvent.EventType.Join)
|
||||||
{
|
{
|
||||||
var newPlayer = E.Origin;
|
var newPlayer = gameEvent.Origin;
|
||||||
if ((newPlayer.Level >= Permission.Trusted && !E.Origin.Masked) ||
|
if (newPlayer.Level >= Permission.Trusted && !gameEvent.Origin.Masked||
|
||||||
(!string.IsNullOrEmpty(newPlayer.GetAdditionalProperty<string>("ClientTag")) &&
|
!string.IsNullOrEmpty(newPlayer.GetAdditionalProperty<string>("ClientTag")) &&
|
||||||
newPlayer.Level != Permission.Flagged && newPlayer.Level != Permission.Banned &&
|
newPlayer.Level != Permission.Flagged && newPlayer.Level != Permission.Banned &&
|
||||||
!newPlayer.Masked))
|
!newPlayer.Masked)
|
||||||
E.Owner.Broadcast(
|
gameEvent.Owner.Broadcast(
|
||||||
await ProcessAnnouncement(_configHandler.Configuration().PrivilegedAnnouncementMessage,
|
await ProcessAnnouncement(_configHandler.Configuration().PrivilegedAnnouncementMessage,
|
||||||
newPlayer));
|
newPlayer));
|
||||||
|
|
||||||
@ -73,10 +73,11 @@ namespace IW4MAdmin.Plugins.Welcome
|
|||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
E.Owner.ToAdmins($"^1NOTICE: ^7Flagged player ^5{newPlayer.Name} ^7({penaltyReason}) has joined!");
|
gameEvent.Owner.ToAdmins(Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_WELCOME_FLAG_MESSAGE"]
|
||||||
|
.FormatExt(newPlayer.Name, penaltyReason));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
E.Owner.Broadcast(await ProcessAnnouncement(_configHandler.Configuration().UserAnnouncementMessage,
|
gameEvent.Owner.Broadcast(await ProcessAnnouncement(_configHandler.Configuration().UserAnnouncementMessage,
|
||||||
newPlayer));
|
newPlayer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -85,7 +86,7 @@ namespace IW4MAdmin.Plugins.Welcome
|
|||||||
{
|
{
|
||||||
msg = msg.Replace("{{ClientName}}", joining.Name);
|
msg = msg.Replace("{{ClientName}}", joining.Name);
|
||||||
msg = msg.Replace("{{ClientLevel}}",
|
msg = msg.Replace("{{ClientLevel}}",
|
||||||
$"{Utilities.ConvertLevelToColor(joining.Level, joining.ClientPermission.Name)}{(string.IsNullOrEmpty(joining.GetAdditionalProperty<string>("ClientTag")) ? "" : $" ^7({joining.GetAdditionalProperty<string>("ClientTag")}^7)")}");
|
$"{Utilities.ConvertLevelToColor(joining.Level, joining.ClientPermission.Name)}{(string.IsNullOrEmpty(joining.GetAdditionalProperty<string>("ClientTag")) ? "" : $" (Color::White)({joining.GetAdditionalProperty<string>("ClientTag")}(Color::White))")}");
|
||||||
// this prevents it from trying to evaluate it every message
|
// this prevents it from trying to evaluate it every message
|
||||||
if (msg.Contains("{{ClientLocation}}"))
|
if (msg.Contains("{{ClientLocation}}"))
|
||||||
{
|
{
|
||||||
|
@ -11,9 +11,9 @@ namespace IW4MAdmin.Plugins.Welcome
|
|||||||
|
|
||||||
public IBaseConfiguration Generate()
|
public IBaseConfiguration Generate()
|
||||||
{
|
{
|
||||||
UserAnnouncementMessage = Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_WELCOME_USERANNOUNCE"];
|
UserAnnouncementMessage = Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_WELCOME_USERANNOUNCE_V2"];
|
||||||
UserWelcomeMessage = Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_WELCOME_USERWELCOME"];
|
UserWelcomeMessage = Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_WELCOME_USERWELCOME_V2"];
|
||||||
PrivilegedAnnouncementMessage = Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_WELCOME_PRIVANNOUNCE"];
|
PrivilegedAnnouncementMessage = Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_WELCOME_PRIVANNOUNCE_V2"];
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ namespace SharedLibraryCore.Commands
|
|||||||
E.Origin.Tell(loc["COMMAND_TARGET_MULTI"]);
|
E.Origin.Tell(loc["COMMAND_TARGET_MULTI"]);
|
||||||
foreach (var p in matchingPlayers)
|
foreach (var p in matchingPlayers)
|
||||||
{
|
{
|
||||||
E.Origin.Tell($"[^3{p.ClientNumber}^7] {p.Name}");
|
E.Origin.Tell($"[(Color::Yellow){p.ClientNumber}(Color::White)] {p.Name}");
|
||||||
}
|
}
|
||||||
throw new CommandException($"{E.Origin} had multiple players found for {C.Name}");
|
throw new CommandException($"{E.Origin} had multiple players found for {C.Name}");
|
||||||
}
|
}
|
||||||
|
@ -219,72 +219,6 @@ namespace SharedLibraryCore.Commands
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Prints out a message to all clients on the server
|
|
||||||
/// </summary>
|
|
||||||
public class SayCommand : Command
|
|
||||||
{
|
|
||||||
public SayCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
|
||||||
{
|
|
||||||
Name = "say";
|
|
||||||
Description = _translationLookup["COMMANDS_SAY_DESC"];
|
|
||||||
Alias = "s";
|
|
||||||
Permission = Permission.Moderator;
|
|
||||||
RequiresTarget = false;
|
|
||||||
Arguments = new[]
|
|
||||||
{
|
|
||||||
new CommandArgument()
|
|
||||||
{
|
|
||||||
Name = _translationLookup["COMMANDS_ARGS_MESSAGE"],
|
|
||||||
Required = true
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Task ExecuteAsync(GameEvent E)
|
|
||||||
{
|
|
||||||
E.Owner.Broadcast($"{(E.Owner.GameName == Server.Game.IW4 ? "^:" : "")}{E.Origin.Name} - ^6{E.Data}^7", E.Origin);
|
|
||||||
E.Origin.Tell(_translationLookup["COMMANDS_SAY_SUCCESS"]);
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Prints out a message to all clients on all servers
|
|
||||||
/// </summary>
|
|
||||||
public class SayAllCommand : Command
|
|
||||||
{
|
|
||||||
public SayAllCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
|
||||||
{
|
|
||||||
Name = "sayall";
|
|
||||||
Description = _translationLookup["COMMANDS_SAY_ALL_DESC"];
|
|
||||||
Alias = "sa";
|
|
||||||
Permission = Permission.Moderator;
|
|
||||||
RequiresTarget = false;
|
|
||||||
Arguments = new[]
|
|
||||||
{
|
|
||||||
new CommandArgument()
|
|
||||||
{
|
|
||||||
Name = _translationLookup["COMMANDS_ARGS_MESSAGE"],
|
|
||||||
Required = true
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Task ExecuteAsync(GameEvent E)
|
|
||||||
{
|
|
||||||
string message = _translationLookup["COMMANDS_SAY_ALL_MESSAGE_FORMAT"].FormatExt(E.Origin.Name, E.Data);
|
|
||||||
|
|
||||||
foreach (var server in E.Owner.Manager.GetServers())
|
|
||||||
{
|
|
||||||
server.Broadcast(message, E.Origin);
|
|
||||||
}
|
|
||||||
|
|
||||||
E.Origin.Tell(_translationLookup["COMMANDS_SAY_SUCCESS"]);
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Temporarily bans a client
|
/// Temporarily bans a client
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -452,57 +386,6 @@ namespace SharedLibraryCore.Commands
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Prints client information
|
|
||||||
/// </summary>
|
|
||||||
public class WhoAmICommand : Command
|
|
||||||
{
|
|
||||||
public WhoAmICommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
|
||||||
{
|
|
||||||
Name = "whoami";
|
|
||||||
Description = _translationLookup["COMMANDS_WHO_DESC"];
|
|
||||||
Alias = "who";
|
|
||||||
Permission = Permission.User;
|
|
||||||
RequiresTarget = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Task ExecuteAsync(GameEvent gameEvent)
|
|
||||||
{
|
|
||||||
var you = _translationLookup["COMMANDS_WHOAMI_FORMAT"].FormatExt(gameEvent.Origin.ClientNumber, gameEvent.Origin.ClientId, gameEvent.Origin.GuidString,
|
|
||||||
gameEvent.Origin.IPAddressString, gameEvent.Origin.ClientPermission.Name, string.IsNullOrEmpty(gameEvent.Origin.Tag) ? "" : $" {gameEvent.Origin.Tag}^7", gameEvent.Origin.Name);
|
|
||||||
gameEvent.Origin.Tell(you);
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// List online clients
|
|
||||||
/// </summary>
|
|
||||||
public class ListClientsCommand : Command
|
|
||||||
{
|
|
||||||
public ListClientsCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
|
||||||
{
|
|
||||||
Name = "list";
|
|
||||||
Description = _translationLookup["COMMANDS_LIST_DESC"];
|
|
||||||
Alias = "l";
|
|
||||||
Permission = Permission.Moderator;
|
|
||||||
RequiresTarget = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Task ExecuteAsync(GameEvent gameEvent)
|
|
||||||
{
|
|
||||||
var clientList = gameEvent.Owner.GetClientsAsList()
|
|
||||||
.Select(client => _translationLookup["COMMANDS_LIST_FORMAT"]
|
|
||||||
.FormatExt(client.ClientPermission.Name, string.IsNullOrEmpty(client.Tag) ? "" : $" {client.Tag}^7", client.ClientNumber, client.Name))
|
|
||||||
.ToArray();
|
|
||||||
|
|
||||||
gameEvent.Origin.Tell(clientList);
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fast restarts the map
|
/// Fast restarts the map
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -522,7 +405,7 @@ namespace SharedLibraryCore.Commands
|
|||||||
await E.Owner.ExecuteCommandAsync("fast_restart");
|
await E.Owner.ExecuteCommandAsync("fast_restart");
|
||||||
|
|
||||||
var _ = !E.Origin.Masked ?
|
var _ = !E.Origin.Masked ?
|
||||||
E.Owner.Broadcast($"^5{E.Origin.Name} ^7{_translationLookup["COMMANDS_FASTRESTART_UNMASKED"]}") :
|
E.Owner.Broadcast($"(Color::Accent){E.Origin.Name} (Color::White){_translationLookup["COMMANDS_FASTRESTART_UNMASKED"]}") :
|
||||||
E.Owner.Broadcast(_translationLookup["COMMANDS_FASTRESTART_MASKED"]);
|
E.Owner.Broadcast(_translationLookup["COMMANDS_FASTRESTART_MASKED"]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -544,7 +427,7 @@ namespace SharedLibraryCore.Commands
|
|||||||
public override async Task ExecuteAsync(GameEvent E)
|
public override async Task ExecuteAsync(GameEvent E)
|
||||||
{
|
{
|
||||||
_ = !E.Origin.Masked ?
|
_ = !E.Origin.Masked ?
|
||||||
E.Owner.Broadcast($"{_translationLookup["COMMANDS_MAPROTATE"]} [^5{E.Origin.Name}^7]", E.Origin) :
|
E.Owner.Broadcast($"{_translationLookup["COMMANDS_MAPROTATE"]} [(Color::Accent){E.Origin.Name}(Color::White)]", E.Origin) :
|
||||||
E.Owner.Broadcast(_translationLookup["COMMANDS_MAPROTATE"], E.Origin);
|
E.Owner.Broadcast(_translationLookup["COMMANDS_MAPROTATE"], E.Origin);
|
||||||
|
|
||||||
await Task.Delay(E.Owner.Manager.GetApplicationSettings().Configuration().MapChangeDelaySeconds * 1000);
|
await Task.Delay(E.Owner.Manager.GetApplicationSettings().Configuration().MapChangeDelaySeconds * 1000);
|
||||||
@ -618,13 +501,13 @@ namespace SharedLibraryCore.Commands
|
|||||||
else if (gameEvent.Origin.Level < Permission.Owner && !steppedPrivileges)
|
else if (gameEvent.Origin.Level < Permission.Owner && !steppedPrivileges)
|
||||||
{
|
{
|
||||||
// only the owner is allowed to set levels
|
// only the owner is allowed to set levels
|
||||||
gameEvent.Origin.Tell($"{_translationLookup["COMMANDS_SETLEVEL_STEPPEDDISABLED"]} ^5{gameEvent.Target.Name}");
|
gameEvent.Origin.Tell($"{_translationLookup["COMMANDS_SETLEVEL_STEPPEDDISABLED"]} (Color::White){gameEvent.Target.Name}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (gameEvent.Target.Level == Permission.Flagged)
|
else if (gameEvent.Target.Level == Permission.Flagged)
|
||||||
{
|
{
|
||||||
gameEvent.Origin.Tell(_translationLookup["COMMANDS_SETLEVEL_FLAGGED"].FormatExt(gameEvent.Target.Name));
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_SETLEVEL_FLAGGED"].FormatExt(gameEvent.Target.Name + "(Color::White)"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -633,8 +516,8 @@ namespace SharedLibraryCore.Commands
|
|||||||
{
|
{
|
||||||
// can't promote a client to higher than your current perms
|
// can't promote a client to higher than your current perms
|
||||||
// or your peer
|
// or your peer
|
||||||
gameEvent.Origin.Tell(string.Format(_translationLookup["COMMANDS_SETLEVEL_LEVELTOOHIGH"], gameEvent.Target.Name, (gameEvent.Origin.Level - 1).ToLocalizedLevelName()));
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_SETLEVEL_LEVELTOOHIGH_V2"]
|
||||||
return;
|
.FormatExt(gameEvent.Target.Name, (gameEvent.Origin.Level - 1).ToLocalizedLevelName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// valid
|
// valid
|
||||||
@ -654,7 +537,7 @@ namespace SharedLibraryCore.Commands
|
|||||||
if (result.FailReason == GameEvent.EventFailReason.Invalid)
|
if (result.FailReason == GameEvent.EventFailReason.Invalid)
|
||||||
{
|
{
|
||||||
gameEvent.Origin.Tell(_translationLookup["COMMANDS_SETLEVEL_INVALID"]
|
gameEvent.Origin.Tell(_translationLookup["COMMANDS_SETLEVEL_INVALID"]
|
||||||
.FormatExt(gameEvent.Target.Name, newPerm.ToString()));
|
.FormatExt(gameEvent.Target.Name + "(Color::White)", newPerm.ToString()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -733,42 +616,6 @@ namespace SharedLibraryCore.Commands
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Lists all unmasked admins
|
|
||||||
/// </summary>
|
|
||||||
public class ListAdminsCommand : Command
|
|
||||||
{
|
|
||||||
public ListAdminsCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
|
||||||
{
|
|
||||||
Name = "admins";
|
|
||||||
Description = _translationLookup["COMMANDS_ADMINS_DESC"];
|
|
||||||
Alias = "a";
|
|
||||||
Permission = Permission.User;
|
|
||||||
RequiresTarget = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string OnlineAdmins(Server S, ITranslationLookup lookup)
|
|
||||||
{
|
|
||||||
var onlineAdmins = S.GetClientsAsList()
|
|
||||||
.Where(p => p.Level > Permission.Flagged)
|
|
||||||
.Where(p => !p.Masked)
|
|
||||||
.Select(p => $"[^3{Utilities.ConvertLevelToColor(p.Level, p.ClientPermission.Name)}^7] {p.Name}");
|
|
||||||
|
|
||||||
return onlineAdmins.Count() > 0 ?
|
|
||||||
string.Join(Environment.NewLine, onlineAdmins) :
|
|
||||||
lookup["COMMANDS_ADMINS_NONE"];
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Task ExecuteAsync(GameEvent E)
|
|
||||||
{
|
|
||||||
foreach (string line in OnlineAdmins(E.Owner, _translationLookup).Split(Environment.NewLine))
|
|
||||||
{
|
|
||||||
var _ = E.Message.IsBroadcastCommand(_config.BroadcastCommandPrefix) ? E.Owner.Broadcast(line) : E.Origin.Tell(line);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attempts to load the specified map
|
/// Attempts to load the specified map
|
||||||
@ -809,50 +656,6 @@ namespace SharedLibraryCore.Commands
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Finds player by name
|
|
||||||
/// </summary>
|
|
||||||
public class FindPlayerCommand : Command
|
|
||||||
{
|
|
||||||
public FindPlayerCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
|
||||||
{
|
|
||||||
Name = "find";
|
|
||||||
Description = _translationLookup["COMMANDS_FIND_DESC"];
|
|
||||||
Alias = "f";
|
|
||||||
Permission = Permission.Administrator;
|
|
||||||
RequiresTarget = false;
|
|
||||||
Arguments = new[]
|
|
||||||
{
|
|
||||||
new CommandArgument()
|
|
||||||
{
|
|
||||||
Name = _translationLookup["COMMANDS_ARGS_PLAYER"],
|
|
||||||
Required = true
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public override async Task ExecuteAsync(GameEvent E)
|
|
||||||
{
|
|
||||||
if (E.Data.Length < 3)
|
|
||||||
{
|
|
||||||
E.Origin.Tell(_translationLookup["COMMANDS_FIND_MIN"]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var db_players = (await (E.Owner.Manager.GetClientService() as ClientService).FindClientsByIdentifier(E.Data));
|
|
||||||
|
|
||||||
if (db_players.Count == 0)
|
|
||||||
{
|
|
||||||
E.Origin.Tell(_translationLookup["COMMANDS_FIND_EMPTY"]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var client in db_players)
|
|
||||||
{
|
|
||||||
E.Origin.Tell(_translationLookup["COMMANDS_FIND_FORMAT"].FormatExt(client.Name, client.ClientId, Utilities.ConvertLevelToColor((Permission)client.LevelInt, client.Level), client.IPAddress, client.LastConnectionText));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Lists server and global rules
|
/// Lists server and global rules
|
||||||
@ -902,40 +705,7 @@ namespace SharedLibraryCore.Commands
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sends a private message to another player
|
|
||||||
/// </summary>
|
|
||||||
public class PrivateMessageCommand : Command
|
|
||||||
{
|
|
||||||
public PrivateMessageCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
|
||||||
{
|
|
||||||
Name = "privatemessage";
|
|
||||||
Description = _translationLookup["COMMANDS_PM_DESC"];
|
|
||||||
Alias = "pm";
|
|
||||||
Permission = Permission.User;
|
|
||||||
RequiresTarget = true;
|
|
||||||
Arguments = new[]
|
|
||||||
{
|
|
||||||
new CommandArgument()
|
|
||||||
{
|
|
||||||
Name = _translationLookup["COMMANDS_ARGS_PLAYER"],
|
|
||||||
Required = true
|
|
||||||
},
|
|
||||||
new CommandArgument()
|
|
||||||
{
|
|
||||||
Name = _translationLookup["COMMANDS_ARGS_MESSAGE"],
|
|
||||||
Required = true
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Task ExecuteAsync(GameEvent E)
|
|
||||||
{
|
|
||||||
E.Target.Tell($"^1{E.Origin.Name} ^3[PM]^7 - {E.Data}");
|
|
||||||
E.Origin.Tell($"To ^3{E.Target.Name} ^7-> {E.Data}");
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Flag given client for specified reason
|
/// Flag given client for specified reason
|
||||||
@ -1031,116 +801,6 @@ namespace SharedLibraryCore.Commands
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Report client for given reason
|
|
||||||
/// </summary>
|
|
||||||
public class ReportClientCommand : Command
|
|
||||||
{
|
|
||||||
public ReportClientCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
|
||||||
{
|
|
||||||
Name = "report";
|
|
||||||
Description = _translationLookup["COMMANDS_REPORT_DESC"];
|
|
||||||
Alias = "rep";
|
|
||||||
Permission = Permission.User;
|
|
||||||
RequiresTarget = true;
|
|
||||||
Arguments = new[]
|
|
||||||
{
|
|
||||||
new CommandArgument()
|
|
||||||
{
|
|
||||||
Name = _translationLookup["COMMANDS_ARGS_PLAYER"],
|
|
||||||
Required = true
|
|
||||||
},
|
|
||||||
new CommandArgument()
|
|
||||||
{
|
|
||||||
Name = _translationLookup["COMMANDS_ARGS_REASON"],
|
|
||||||
Required = true
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public override async Task ExecuteAsync(GameEvent commandEvent)
|
|
||||||
{
|
|
||||||
if (commandEvent.Data.ToLower().Contains("camp"))
|
|
||||||
{
|
|
||||||
commandEvent.Origin.Tell(_translationLookup["COMMANDS_REPORT_FAIL_CAMP"]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool success = false;
|
|
||||||
|
|
||||||
switch ((await commandEvent.Target.Report(commandEvent.Data, commandEvent.Origin).WaitAsync(Utilities.DefaultCommandTimeout, commandEvent.Owner.Manager.CancellationToken)).FailReason)
|
|
||||||
{
|
|
||||||
case GameEvent.EventFailReason.None:
|
|
||||||
commandEvent.Origin.Tell(_translationLookup["COMMANDS_REPORT_SUCCESS"]);
|
|
||||||
success = true;
|
|
||||||
break;
|
|
||||||
case GameEvent.EventFailReason.Exception:
|
|
||||||
commandEvent.Origin.Tell(_translationLookup["COMMANDS_REPORT_FAIL_DUPLICATE"]);
|
|
||||||
break;
|
|
||||||
case GameEvent.EventFailReason.Permission:
|
|
||||||
commandEvent.Origin.Tell(_translationLookup["COMMANDS_REPORT_FAIL"].FormatExt(commandEvent.Target.Name));
|
|
||||||
break;
|
|
||||||
case GameEvent.EventFailReason.Invalid:
|
|
||||||
commandEvent.Origin.Tell(_translationLookup["COMMANDS_REPORT_FAIL_SELF"]);
|
|
||||||
break;
|
|
||||||
case GameEvent.EventFailReason.Throttle:
|
|
||||||
commandEvent.Origin.Tell(_translationLookup["COMMANDS_REPORT_FAIL_TOOMANY"]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (success)
|
|
||||||
{
|
|
||||||
commandEvent.Owner.ToAdmins(String.Format("^5{0}^7->^1{1}^7: {2}", commandEvent.Origin.Name, commandEvent.Target.Name, commandEvent.Data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// List all reports on the server
|
|
||||||
/// </summary>
|
|
||||||
public class ListReportsCommand : Command
|
|
||||||
{
|
|
||||||
public ListReportsCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
|
||||||
{
|
|
||||||
Name = "reports";
|
|
||||||
Description = _translationLookup["COMMANDS_REPORTS_DESC"];
|
|
||||||
Alias = "reps";
|
|
||||||
Permission = Permission.Moderator;
|
|
||||||
RequiresTarget = false;
|
|
||||||
Arguments = new[]
|
|
||||||
{
|
|
||||||
new CommandArgument()
|
|
||||||
{
|
|
||||||
Name = _translationLookup["COMMANDS_ARGS_CLEAR"],
|
|
||||||
Required = false
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Task ExecuteAsync(GameEvent E)
|
|
||||||
{
|
|
||||||
if (E.Data != null && E.Data.ToLower().Contains(_translationLookup["COMMANDS_ARGS_CLEAR"]))
|
|
||||||
{
|
|
||||||
E.Owner.Reports = new List<Report>();
|
|
||||||
E.Origin.Tell(_translationLookup["COMMANDS_REPORTS_CLEAR_SUCCESS"]);
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (E.Owner.Reports.Count < 1)
|
|
||||||
{
|
|
||||||
E.Origin.Tell(_translationLookup["COMMANDS_REPORTS_NONE"]);
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (Report R in E.Owner.Reports)
|
|
||||||
{
|
|
||||||
E.Origin.Tell(String.Format("^5{0}^7->^1{1}^7: {2}", R.Origin.Name, R.Target.Name, R.Reason));
|
|
||||||
}
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Masks client from announcements and online admin list
|
/// Masks client from announcements and online admin list
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -1218,49 +878,6 @@ namespace SharedLibraryCore.Commands
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Lists alises of specified client
|
|
||||||
/// </summary>
|
|
||||||
public class ListAliasesCommand : Command
|
|
||||||
{
|
|
||||||
public ListAliasesCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup)
|
|
||||||
{
|
|
||||||
Name = "alias";
|
|
||||||
Description = _translationLookup["COMMANDS_ALIAS_DESC"];
|
|
||||||
Alias = "known";
|
|
||||||
Permission = EFClient.Permission.Moderator;
|
|
||||||
RequiresTarget = true;
|
|
||||||
Arguments = new[]
|
|
||||||
{
|
|
||||||
new CommandArgument()
|
|
||||||
{
|
|
||||||
Name = _translationLookup["COMMANDS_ARGS_PLAYER"],
|
|
||||||
Required = true,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Task ExecuteAsync(GameEvent E)
|
|
||||||
{
|
|
||||||
StringBuilder message = new StringBuilder();
|
|
||||||
var names = new List<string>(E.Target.AliasLink.Children.Select(a => a.Name));
|
|
||||||
var IPs = new List<string>(E.Target.AliasLink.Children.Select(a => a.IPAddress.ConvertIPtoString()).Distinct());
|
|
||||||
|
|
||||||
E.Origin.Tell($"[^3{E.Target}^7]");
|
|
||||||
|
|
||||||
message.Append($"{_translationLookup["COMMANDS_ALIAS_ALIASES"]}: ");
|
|
||||||
message.Append(String.Join(" | ", names));
|
|
||||||
E.Origin.Tell(message.ToString());
|
|
||||||
|
|
||||||
message.Clear();
|
|
||||||
message.Append($"{_translationLookup["COMMANDS_ALIAS_IPS"]}: ");
|
|
||||||
message.Append(String.Join(" | ", IPs));
|
|
||||||
E.Origin.Tell(message.ToString());
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Executes RCon command
|
/// Executes RCon command
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -1298,33 +915,6 @@ namespace SharedLibraryCore.Commands
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Lists the loaded plugins
|
|
||||||
/// </summary>
|
|
||||||
/*public class ListPluginsCommand : Command
|
|
||||||
{
|
|
||||||
private readonly IPluginImporter _pluginImporter;
|
|
||||||
public ListPluginsCommand(CommandConfiguration config, ITranslationLookup translationLookup, IPluginImporter pluginImporter) : base(config, translationLookup)
|
|
||||||
{
|
|
||||||
Name = "plugins";
|
|
||||||
Description = _translationLookup["COMMANDS_PLUGINS_DESC"];
|
|
||||||
Alias = "p";
|
|
||||||
Permission = Permission.Administrator;
|
|
||||||
RequiresTarget = false;
|
|
||||||
_pluginImporter = pluginImporter;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Task ExecuteAsync(GameEvent E)
|
|
||||||
{
|
|
||||||
E.Origin.Tell(_translationLookup["COMMANDS_PLUGINS_LOADED"]);
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Lists external IP
|
/// Lists external IP
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -1484,11 +1074,11 @@ namespace SharedLibraryCore.Commands
|
|||||||
|
|
||||||
if (E.Target == null)
|
if (E.Target == null)
|
||||||
{
|
{
|
||||||
E.Origin.Tell(_translationLookup["COMMANDS_PING_SELF"].FormatExt(E.Origin.Ping));
|
E.Origin.Tell(_translationLookup["COMMANDS_PING_SELF_V2"].FormatExt(E.Origin.Ping));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
E.Origin.Tell(_translationLookup["COMMANDS_PING_TARGET"].FormatExt(E.Target.Name, E.Target.Ping));
|
E.Origin.Tell(_translationLookup["COMMANDS_PING_TARGET_V2"].FormatExt(E.Target.Name, E.Target.Ping));
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
@ -108,7 +108,7 @@ namespace SharedLibraryCore.Configuration
|
|||||||
public string ConnectionString { get; set; }
|
public string ConnectionString { get; set; }
|
||||||
|
|
||||||
[LocalizedDisplayName("WEBFRONT_CONFIGURATION_RCON_POLLRATE")]
|
[LocalizedDisplayName("WEBFRONT_CONFIGURATION_RCON_POLLRATE")]
|
||||||
public int RConPollRate { get; set; } = 5000;
|
public int RConPollRate { get; set; } = 8000;
|
||||||
|
|
||||||
[LocalizedDisplayName("WEBFRONT_CONFIGURATION_MAX_TB")]
|
[LocalizedDisplayName("WEBFRONT_CONFIGURATION_MAX_TB")]
|
||||||
public TimeSpan MaximumTempBanTime { get; set; } = new TimeSpan(24 * 30, 0, 0);
|
public TimeSpan MaximumTempBanTime { get; set; } = new TimeSpan(24 * 30, 0, 0);
|
||||||
@ -116,6 +116,9 @@ namespace SharedLibraryCore.Configuration
|
|||||||
[LocalizedDisplayName("WEBFRONT_CONFIGURATION_ENABLE_COLOR_CODES")]
|
[LocalizedDisplayName("WEBFRONT_CONFIGURATION_ENABLE_COLOR_CODES")]
|
||||||
public bool EnableColorCodes { get; set; }
|
public bool EnableColorCodes { get; set; }
|
||||||
|
|
||||||
|
[ConfigurationIgnore]
|
||||||
|
public string IngameAccentColorKey { get; set; } = "Cyan";
|
||||||
|
|
||||||
[LocalizedDisplayName("WEBFRONT_CONFIGURATION_AUTOMESSAGE_PERIOD")]
|
[LocalizedDisplayName("WEBFRONT_CONFIGURATION_AUTOMESSAGE_PERIOD")]
|
||||||
public int AutoMessagePeriod { get; set; }
|
public int AutoMessagePeriod { get; set; }
|
||||||
|
|
||||||
|
26
SharedLibraryCore/Formatting/ColorCodes.cs
Normal file
26
SharedLibraryCore/Formatting/ColorCodes.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace SharedLibraryCore.Formatting
|
||||||
|
{
|
||||||
|
public enum ColorCodes
|
||||||
|
{
|
||||||
|
Black,
|
||||||
|
Red,
|
||||||
|
Green,
|
||||||
|
Yellow,
|
||||||
|
Blue,
|
||||||
|
Cyan,
|
||||||
|
Purple,
|
||||||
|
Pink,
|
||||||
|
White,
|
||||||
|
Map,
|
||||||
|
Grey,
|
||||||
|
Wildcard,
|
||||||
|
Accent
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ColorCodeMapping : Dictionary<string, string>
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace SharedLibraryCore.Helpers
|
namespace SharedLibraryCore.Helpers
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System.Threading.Tasks;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace SharedLibraryCore.Interfaces
|
namespace SharedLibraryCore.Interfaces
|
||||||
{
|
{
|
||||||
@ -10,9 +9,9 @@ namespace SharedLibraryCore.Interfaces
|
|||||||
Task OnEventAsync(GameEvent E, Server S);
|
Task OnEventAsync(GameEvent E, Server S);
|
||||||
Task OnTickAsync(Server S);
|
Task OnTickAsync(Server S);
|
||||||
|
|
||||||
//for logging purposes
|
string Name { get; }
|
||||||
String Name { get; }
|
|
||||||
float Version { get; }
|
float Version { get; }
|
||||||
String Author { get; }
|
string Author { get; }
|
||||||
|
bool IsParser => false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
using SharedLibraryCore.RCon;
|
using SharedLibraryCore.RCon;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
using SharedLibraryCore.Formatting;
|
||||||
|
using SharedLibraryCore.Localization;
|
||||||
|
|
||||||
namespace SharedLibraryCore.Interfaces
|
namespace SharedLibraryCore.Interfaces
|
||||||
{
|
{
|
||||||
@ -97,5 +99,7 @@ namespace SharedLibraryCore.Interfaces
|
|||||||
/// Default Indicator of where the game is installed (ex file path or registry entry)
|
/// Default Indicator of where the game is installed (ex file path or registry entry)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
string DefaultInstallationDirectoryHint { get; }
|
string DefaultInstallationDirectoryHint { get; }
|
||||||
|
|
||||||
|
ColorCodeMapping ColorCodeMapping { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,8 @@ namespace SharedLibraryCore.Database.Models
|
|||||||
.FirstOrDefault(ev => ev.Type == GameEvent.EventType.Command && (ev.Origin?.ClientId == ClientId || ev.ImpersonationOrigin?.ClientId == ClientId))?.CorrelationId ?? Guid.NewGuid()
|
.FirstOrDefault(ev => ev.Type == GameEvent.EventType.Command && (ev.Origin?.ClientId == ClientId || ev.ImpersonationOrigin?.ClientId == ClientId))?.CorrelationId ?? Guid.NewGuid()
|
||||||
};
|
};
|
||||||
|
|
||||||
e.Output.Add(message.StripColors());
|
e.Output.Add(message.FormatMessageForEngine(CurrentServer?.RconParser.Configuration.ColorCodeMapping)
|
||||||
|
.StripColors());
|
||||||
|
|
||||||
CurrentServer?.Manager.AddEvent(e);
|
CurrentServer?.Manager.AddEvent(e);
|
||||||
return e;
|
return e;
|
||||||
|
@ -132,10 +132,12 @@ namespace SharedLibraryCore
|
|||||||
/// <param name="message">Message to be sent to all players</param>
|
/// <param name="message">Message to be sent to all players</param>
|
||||||
public GameEvent Broadcast(string message, EFClient sender = null)
|
public GameEvent Broadcast(string message, EFClient sender = null)
|
||||||
{
|
{
|
||||||
string formattedMessage = string.Format(RconParser.Configuration.CommandPrefixes.Say ?? "", $"{(CustomSayEnabled && GameName == Game.IW4 ? $"{CustomSayName}: " : "")}{message.FixIW4ForwardSlash()}");
|
var formattedMessage = string.Format(RconParser.Configuration.CommandPrefixes.Say ?? "",
|
||||||
ServerLogger.LogDebug("All->" + message.StripColors());
|
$"{(CustomSayEnabled && GameName == Game.IW4 ? $"{CustomSayName}: " : "")}{message.FormatMessageForEngine(RconParser.Configuration.ColorCodeMapping)}");
|
||||||
|
ServerLogger.LogDebug("All-> {Message}",
|
||||||
|
message.FormatMessageForEngine(RconParser.Configuration.ColorCodeMapping).StripColors());
|
||||||
|
|
||||||
var e = new GameEvent()
|
var e = new GameEvent
|
||||||
{
|
{
|
||||||
Type = GameEvent.EventType.Broadcast,
|
Type = GameEvent.EventType.Broadcast,
|
||||||
Data = formattedMessage,
|
Data = formattedMessage,
|
||||||
@ -165,6 +167,8 @@ namespace SharedLibraryCore
|
|||||||
/// <param name="targetClient">EFClient to send message to</param>
|
/// <param name="targetClient">EFClient to send message to</param>
|
||||||
protected async Task Tell(string message, EFClient targetClient)
|
protected async Task Tell(string message, EFClient targetClient)
|
||||||
{
|
{
|
||||||
|
var engineMessage = message.FormatMessageForEngine(RconParser.Configuration.ColorCodeMapping);
|
||||||
|
|
||||||
if (!Utilities.IsDevelopment)
|
if (!Utilities.IsDevelopment)
|
||||||
{
|
{
|
||||||
var temporalClientId = targetClient.GetAdditionalProperty<string>("ConnectionClientId");
|
var temporalClientId = targetClient.GetAdditionalProperty<string>("ConnectionClientId");
|
||||||
@ -173,24 +177,25 @@ namespace SharedLibraryCore
|
|||||||
|
|
||||||
var formattedMessage = string.Format(RconParser.Configuration.CommandPrefixes.Tell,
|
var formattedMessage = string.Format(RconParser.Configuration.CommandPrefixes.Tell,
|
||||||
clientNumber,
|
clientNumber,
|
||||||
$"{(CustomSayEnabled && GameName == Game.IW4 ? $"{CustomSayName}: " : "")}{message.FixIW4ForwardSlash()}");
|
$"{(CustomSayEnabled && GameName == Game.IW4 ? $"{CustomSayName}: " : "")}{engineMessage}");
|
||||||
if (targetClient.ClientNumber > -1 && message.Length > 0 && targetClient.Level != EFClient.Permission.Console)
|
if (targetClient.ClientNumber > -1 && message.Length > 0 && targetClient.Level != EFClient.Permission.Console)
|
||||||
await this.ExecuteCommandAsync(formattedMessage);
|
await this.ExecuteCommandAsync(formattedMessage);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ServerLogger.LogDebug("Tell[{clientNumber}]->{message}", targetClient.ClientNumber, message.StripColors());
|
ServerLogger.LogDebug("Tell[{ClientNumber}]->{Message}", targetClient.ClientNumber,
|
||||||
|
message.FormatMessageForEngine(RconParser.Configuration.ColorCodeMapping).StripColors());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (targetClient.Level == EFClient.Permission.Console)
|
if (targetClient.Level == EFClient.Permission.Console)
|
||||||
{
|
{
|
||||||
Console.ForegroundColor = ConsoleColor.Green;
|
Console.ForegroundColor = ConsoleColor.Green;
|
||||||
using (LogContext.PushProperty("Server", ToString()))
|
using (LogContext.PushProperty("Server", ToString()))
|
||||||
{
|
{
|
||||||
ServerLogger.LogInformation("Command output received: {message}", message);
|
ServerLogger.LogInformation("Command output received: {Message}",
|
||||||
|
engineMessage.StripColors());
|
||||||
}
|
}
|
||||||
Console.WriteLine(message.StripColors());
|
Console.WriteLine(engineMessage.StripColors());
|
||||||
Console.ForegroundColor = ConsoleColor.Gray;
|
Console.ForegroundColor = ConsoleColor.Gray;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -716,12 +716,15 @@ namespace SharedLibraryCore.Services
|
|||||||
|
|
||||||
// we want to project our results
|
// we want to project our results
|
||||||
var iqClientProjection = iqClients.OrderByDescending(_client => _client.LastConnection)
|
var iqClientProjection = iqClients.OrderByDescending(_client => _client.LastConnection)
|
||||||
.Select(_client => new PlayerInfo()
|
.Select(_client => new PlayerInfo
|
||||||
{
|
{
|
||||||
Name = _client.CurrentAlias.Name,
|
Name = _client.CurrentAlias.Name,
|
||||||
LevelInt = (int)_client.Level,
|
LevelInt = (int) _client.Level,
|
||||||
LastConnection = _client.LastConnection,
|
LastConnection = _client.LastConnection,
|
||||||
ClientId = _client.ClientId,
|
ClientId = _client.ClientId,
|
||||||
|
IPAddress = _client.CurrentAlias.IPAddress.HasValue
|
||||||
|
? _client.CurrentAlias.IPAddress.Value.ToString()
|
||||||
|
: ""
|
||||||
});
|
});
|
||||||
|
|
||||||
var clients = await iqClientProjection.ToListAsync();
|
var clients = await iqClientProjection.ToListAsync();
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
using Microsoft.AspNetCore.Razor.TagHelpers;
|
using System.Linq;
|
||||||
using System.Linq;
|
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
using Microsoft.AspNetCore.Razor.TagHelpers;
|
||||||
|
|
||||||
namespace SharedLibraryCore
|
namespace SharedLibraryCore.TagHelpers
|
||||||
{
|
{
|
||||||
[HtmlTargetElement("color-code")]
|
[HtmlTargetElement("color-code")]
|
||||||
public class ColorCode : TagHelper
|
public class ColorCode : TagHelper
|
||||||
|
@ -21,6 +21,7 @@ using static SharedLibraryCore.Server;
|
|||||||
using ILogger = Microsoft.Extensions.Logging.ILogger;
|
using ILogger = Microsoft.Extensions.Logging.ILogger;
|
||||||
using static Data.Models.Client.EFClient;
|
using static Data.Models.Client.EFClient;
|
||||||
using Data.Models;
|
using Data.Models;
|
||||||
|
using SharedLibraryCore.Formatting;
|
||||||
using static Data.Models.EFPenalty;
|
using static Data.Models.EFPenalty;
|
||||||
|
|
||||||
namespace SharedLibraryCore
|
namespace SharedLibraryCore
|
||||||
@ -178,6 +179,24 @@ namespace SharedLibraryCore
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string FixIW4ForwardSlash(this string str) => str.Replace("//", "/ /");
|
public static string FixIW4ForwardSlash(this string str) => str.Replace("//", "/ /");
|
||||||
|
|
||||||
|
public static string FormatMessageForEngine(this string str, ColorCodeMapping mapping)
|
||||||
|
{
|
||||||
|
if (mapping == null || string.IsNullOrEmpty(str))
|
||||||
|
{
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
var output = str;
|
||||||
|
var colorCodeMatches = Regex.Matches(output, @"\(Color::(.{1,16})\)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||||
|
foreach (var match in colorCodeMatches.Where(m => m.Success))
|
||||||
|
{
|
||||||
|
var key = match.Groups[1].ToString();
|
||||||
|
output = output.Replace(match.Value, mapping.TryGetValue(key, out var code) ? code : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
return output.FixIW4ForwardSlash() + mapping[ColorCodes.White.ToString()];
|
||||||
|
}
|
||||||
|
|
||||||
private static readonly IList<string> _zmGameTypes = new[] { "zclassic", "zstandard", "zcleansed", "zgrief" };
|
private static readonly IList<string> _zmGameTypes = new[] { "zclassic", "zstandard", "zcleansed", "zgrief" };
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// indicates if the given server is running a zombie game mode
|
/// indicates if the given server is running a zombie game mode
|
||||||
@ -189,36 +208,25 @@ namespace SharedLibraryCore
|
|||||||
public static bool IsCodGame(this Server server) => server.RconParser?.RConEngine == "COD";
|
public static bool IsCodGame(this Server server) => server.RconParser?.RConEngine == "COD";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get the IW Engine color code corresponding to an admin level
|
/// Get the color key corresponding to a given user level
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="level">Specified player level</param>
|
/// <param name="level">Specified player level</param>
|
||||||
|
/// <param name="localizedLevel"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static String ConvertLevelToColor(EFClient.Permission level, string localizedLevel)
|
public static string ConvertLevelToColor(Permission level, string localizedLevel)
|
||||||
{
|
{
|
||||||
char colorCode = '6';
|
// todo: make configurable
|
||||||
// todo: maybe make this game independant?
|
var colorCode = level switch
|
||||||
switch (level)
|
|
||||||
{
|
{
|
||||||
case EFClient.Permission.Banned:
|
Permission.Banned => "Red",
|
||||||
colorCode = '1';
|
Permission.Flagged => "Map",
|
||||||
break;
|
Permission.Owner => "Accent",
|
||||||
case EFClient.Permission.Flagged:
|
Permission.User => "Yellow",
|
||||||
colorCode = '9';
|
Permission.Trusted => "Green",
|
||||||
break;
|
_ => "Pink"
|
||||||
case EFClient.Permission.Owner:
|
};
|
||||||
colorCode = '5';
|
|
||||||
break;
|
|
||||||
case EFClient.Permission.User:
|
|
||||||
colorCode = '2';
|
|
||||||
break;
|
|
||||||
case EFClient.Permission.Trusted:
|
|
||||||
colorCode = '3';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $"^{colorCode}{localizedLevel ?? level.ToString()}";
|
return $"(Color::{colorCode}){localizedLevel ?? level.ToString()}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string ToLocalizedLevelName(this Permission permission)
|
public static string ToLocalizedLevelName(this Permission permission)
|
||||||
|
@ -46,7 +46,8 @@ namespace WebfrontCore.Controllers
|
|||||||
case nameof(UnbanCommand):
|
case nameof(UnbanCommand):
|
||||||
_unbanCommandName = cmd.Name;
|
_unbanCommandName = cmd.Name;
|
||||||
break;
|
break;
|
||||||
case nameof(SayCommand):
|
// todo: this should be flag driven
|
||||||
|
case "SayCommand":
|
||||||
_sayCommandName = cmd.Name;
|
_sayCommandName = cmd.Name;
|
||||||
break;
|
break;
|
||||||
case nameof(KickCommand):
|
case nameof(KickCommand):
|
||||||
|
@ -11,6 +11,7 @@ using System.Linq;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Data.Models;
|
using Data.Models;
|
||||||
using IW4MAdmin.Plugins.Stats.Config;
|
using IW4MAdmin.Plugins.Stats.Config;
|
||||||
|
using Stats.Config;
|
||||||
using WebfrontCore.ViewComponents;
|
using WebfrontCore.ViewComponents;
|
||||||
|
|
||||||
namespace WebfrontCore.Controllers
|
namespace WebfrontCore.Controllers
|
||||||
|
@ -16,6 +16,7 @@ using Microsoft.Extensions.Logging;
|
|||||||
using ILogger = Microsoft.Extensions.Logging.ILogger;
|
using ILogger = Microsoft.Extensions.Logging.ILogger;
|
||||||
using Data.Abstractions;
|
using Data.Abstractions;
|
||||||
using IW4MAdmin.Plugins.Stats.Config;
|
using IW4MAdmin.Plugins.Stats.Config;
|
||||||
|
using Stats.Config;
|
||||||
|
|
||||||
namespace IW4MAdmin.Plugins.Web.StatsWeb.Controllers
|
namespace IW4MAdmin.Plugins.Web.StatsWeb.Controllers
|
||||||
{
|
{
|
||||||
|
@ -26,6 +26,7 @@ using Data.Abstractions;
|
|||||||
using Data.Helpers;
|
using Data.Helpers;
|
||||||
using IW4MAdmin.Plugins.Stats.Config;
|
using IW4MAdmin.Plugins.Stats.Config;
|
||||||
using Stats.Client.Abstractions;
|
using Stats.Client.Abstractions;
|
||||||
|
using Stats.Config;
|
||||||
using WebfrontCore.Controllers.API.Validation;
|
using WebfrontCore.Controllers.API.Validation;
|
||||||
using WebfrontCore.Middleware;
|
using WebfrontCore.Middleware;
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ using IW4MAdmin.Plugins.Stats.Config;
|
|||||||
using IW4MAdmin.Plugins.Stats.Helpers;
|
using IW4MAdmin.Plugins.Stats.Helpers;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using SharedLibraryCore.Interfaces;
|
using SharedLibraryCore.Interfaces;
|
||||||
|
using Stats.Config;
|
||||||
|
|
||||||
namespace WebfrontCore.ViewComponents
|
namespace WebfrontCore.ViewComponents
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user