1
0
mirror of https://github.com/RaidMax/IW4M-Admin.git synced 2025-06-18 11:08:22 -05:00

more integration tweaks

add configurable flood protect interval for rcon
This commit is contained in:
RaidMax
2022-02-08 12:03:55 -06:00
parent 8989b5b987
commit cf2245a874
13 changed files with 388 additions and 288 deletions

View File

@ -1,44 +0,0 @@
using SharedLibraryCore;
using SharedLibraryCore.Commands;
using SharedLibraryCore.Configuration;
using SharedLibraryCore.Database.Models;
using SharedLibraryCore.Interfaces;
using System.Threading.Tasks;
namespace IW4ScriptCommands.Commands
{
/// <summary>
/// Example script command
/// </summary>
public class KillPlayerCommand : Command
{
public KillPlayerCommand(CommandConfiguration config, ITranslationLookup lookup) : base(config, lookup)
{
Name = "killplayer";
Description = "kill a player";
Alias = "kp";
Permission = EFClient.Permission.Administrator;
RequiresTarget = true;
Arguments = new[]
{
new CommandArgument()
{
Name = "player",
Required = true
}
};
}
public override async Task ExecuteAsync(GameEvent E)
{
var cmd = new ScriptCommand()
{
CommandName = "killplayer",
ClientNumber = E.Target.ClientNumber,
CommandArguments = new[] { E.Origin.ClientNumber.ToString() }
};
await cmd.Execute(E.Owner);
}
}
}

View File

@ -1,44 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using SharedLibraryCore;
using SharedLibraryCore.Interfaces;
using System.Linq;
using System.Text;
namespace WebfrontCore.Controllers.API
{
[Route("api/gsc/[action]")]
public class GscApiController : BaseController
{
public GscApiController(IManager manager) : base(manager)
{
}
/// <summary>
/// grabs basic info about the client from IW4MAdmin
/// </summary>
/// <param name="networkId"></param>
/// <returns></returns>
[HttpGet("{networkId}")]
public IActionResult ClientInfo(string networkId)
{
long decimalNetworkId = networkId.ConvertGuidToLong(System.Globalization.NumberStyles.HexNumber);
var clientInfo = Manager.GetActiveClients()
.FirstOrDefault(c => c.NetworkId == decimalNetworkId);
if (clientInfo != null)
{
var sb = new StringBuilder();
sb.AppendLine($"admin={clientInfo.IsPrivileged()}");
sb.AppendLine($"level={(int)clientInfo.Level}");
sb.AppendLine($"levelstring={clientInfo.Level.ToLocalizedLevelName()}");
sb.AppendLine($"connections={clientInfo.Connections}");
sb.AppendLine($"authenticated={clientInfo.GetAdditionalProperty<bool>("IsLoggedIn") == true}");
return Content(sb.ToString());
}
return Content("");
}
}
}

View File

@ -1,20 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ApplicationIcon />
<StartupObject />
<Configurations>Debug;Release;Prerelease</Configurations>
<LangVersion>Latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="RaidMax.IW4MAdmin.SharedLibraryCore" Version="2022.1.28.1" PrivateAssets="All" />
</ItemGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="dotnet publish $(ProjectPath) -c $(ConfigurationName) -o $(ProjectDir)..\..\Build\Plugins --no-build --no-restore --no-dependencies" />
</Target>
</Project>

View File

@ -1,46 +0,0 @@
using SharedLibraryCore;
using SharedLibraryCore.Interfaces;
using System.Threading.Tasks;
namespace IW4ScriptCommands
{
public class Plugin : IPlugin
{
public string Name => "IW4 Script Commands";
public float Version => 1.0f;
public string Author => "RaidMax";
public async Task OnEventAsync(GameEvent E, Server S)
{
if (E.Type == GameEvent.EventType.Start)
{
await S.SetDvarAsync("sv_iw4madmin_serverid", S.EndPoint);
}
if (E.Type == GameEvent.EventType.Warn)
{
var cmd = new ScriptCommand()
{
ClientNumber = E.Target.ClientNumber,
CommandName = "alert",
CommandArguments = new[]
{
"Warning",
"ui_mp_nukebomb_timer",
E.Data
}
};
// notifies the player ingame of the warning
await cmd.Execute(S);
}
}
public Task OnLoadAsync(IManager manager) => Task.CompletedTask;
public Task OnTickAsync(Server S) => Task.CompletedTask;
public Task OnUnloadAsync() => Task.CompletedTask;
}
}

View File

@ -1,36 +0,0 @@
using SharedLibraryCore;
using System.Linq;
using System.Threading.Tasks;
namespace IW4ScriptCommands
{
/// <summary>
/// Contains basic properties for command information read by gsc
/// </summary>
class ScriptCommand
{
/// <summary>
/// Name of the command to execute
/// </summary>
public string CommandName { get; set; }
/// <summary>
/// Target client number
/// </summary>
public int ClientNumber { get; set; }
/// <summary>
/// Arguments for the script function itself
/// </summary>
public string[] CommandArguments { get; set; } = new string[0];
public override string ToString() => string.Join(";", new[] { CommandName, ClientNumber.ToString() }.Concat(CommandArguments).Select(_arg => _arg.Replace(";", "")));
/// <summary>
/// Executes the command
/// </summary>
/// <param name="server">server to execute the command on</param>
/// <returns></returns>
public async Task Execute(Server server) => await server.SetDvarAsync("sv_iw4madmin_command", ToString());
}
}

View File

@ -26,7 +26,7 @@ let plugin = {
switch (eventType) {
case 'start':
const enabled = initialize(server);
if (!enabled) {
return;
}
@ -189,7 +189,11 @@ let commands = [{
targetRequired: true,
// optional
arguments: [{
name: 'alert message',
name: 'player',
required: true
},
{
name: 'message',
required: true
}],
supportedGames: ['IW4'],
@ -203,9 +207,11 @@ let commands = [{
}];
const sendScriptCommand = (server, command, target, data) => {
if (plugin.enabled) {
sendEvent(server, false, 'ExecuteCommandRequested', command, target, data);
const state = servers[server.EndPoint];
if (state === undefined || !state.enabled) {
return;
}
sendEvent(server, false, 'ExecuteCommandRequested', command, target, data);
}
const sendEvent = (server, responseExpected, event, subtype, client, data) => {
@ -272,7 +278,7 @@ const initialize = (server) => {
logger.WriteError(`Could not get integration status of ${server.EndPoint} - ${error}`);
}
logger.WriteDebug(`GSC Integration enabledGSC Integration enabled = ${enabled}`);
logger.WriteInfo(`GSC Integration enabled = ${enabled}`);
if (!enabled) {
servers[server.EndPoint] = {
@ -320,13 +326,13 @@ const pollForEvents = server => {
const event = parseEvent(input)
logger.WriteInfo(`Processing input... ${event.eventType}`);
logger.WriteDebug(`Processing input... ${event.eventType} ${event.subType} ${event.data} ${event.clientNumber}`);
if (event.eventType === 'ClientDataRequested') {
const client = server.GetClientByNumber(event.clientNumber);
if (client != null) {
logger.WriteInfo(`Found client ${client.Name}`);
logger.WriteDebug(`Found client ${client.Name}`);
let data = [];
@ -342,9 +348,9 @@ const pollForEvents = server => {
}
sendEvent(server, false, 'ClientDataReceived', event.subType, client, data);
} else {
logger.WriteWarning(`Could not find client slot ${event.clientNumber} when processing ${event.eventType}`);
}
logger.WriteWarning(`Could not find client slot ${event.clientNumber} when processing ${event.eventType}`);
}
try {

View File

@ -3,7 +3,7 @@ var eventParser;
var plugin = {
author: 'RaidMax',
version: 0.5,
version: 0.6,
name: 'IW4x Parser',
isParser: true,
@ -20,10 +20,11 @@ var plugin = {
rconParser.Configuration.CommandPrefixes.Ban = 'clientkick {0} "{1}"';
rconParser.Configuration.CommandPrefixes.TempBan = 'tempbanclient {0} "{1}"';
rconParser.Configuration.DefaultRConPort = 28960;
rconParser.Configuration.DefaultInstallationDirectoryHint = 'HKEY_CURRENT_USER\\Software\\Classes\\iw4x\\shell\\open\\command';
rconParser.Configuration.DefaultRConPort = 28960;
rconParser.Configuration.DefaultInstallationDirectoryHint = 'HKEY_CURRENT_USER\\Software\\Classes\\iw4x\\shell\\open\\command';
rconParser.Configuration.FloodProtectInterval = 50;
eventParser.Configuration.GameDirectory = 'userraw';
eventParser.Configuration.GameDirectory = 'userraw';
rconParser.Version = 'IW4x (v0.6.0)';
rconParser.GameName = 2; // IW4x
@ -37,4 +38,4 @@ var plugin = {
onTickAsync: function (server) {
}
};
};