mirror of
https://github.com/RaidMax/IW4M-Admin.git
synced 2025-06-10 15:20:48 -05:00
abstracting rcon parsing and event parsing
changed Event to GameEvent finally fixed the stats NaN check ip for bans consolidated console, profile, and logout into dropdown make sure game is iw4 before using :^ in say fix pm not showing from name if in web console show time left of temban on profile
This commit is contained in:
@ -25,7 +25,7 @@ namespace SharedLibraryCore
|
||||
}
|
||||
|
||||
//Execute the command
|
||||
abstract public Task ExecuteAsync(Event E);
|
||||
abstract public Task ExecuteAsync(GameEvent E);
|
||||
|
||||
public String Name { get; private set; }
|
||||
public String Description { get; private set; }
|
||||
|
@ -18,7 +18,7 @@ namespace SharedLibraryCore.Commands
|
||||
base("quit", "quit IW4MAdmin", "q", Player.Permission.Owner, false)
|
||||
{ }
|
||||
|
||||
public override Task ExecuteAsync(Event E)
|
||||
public override Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
return Task.Run(() => { E.Owner.Manager.Stop(); });
|
||||
}
|
||||
@ -30,7 +30,7 @@ namespace SharedLibraryCore.Commands
|
||||
base("owner", "claim ownership of the server", "o", Player.Permission.User, false)
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
if ((await (E.Owner.Manager.GetClientService() as Services.ClientService).GetOwners()).Count == 0)
|
||||
{
|
||||
@ -61,7 +61,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
if (E.Origin.Level <= E.Target.Level)
|
||||
await E.Origin.Tell($"You do not have the required privileges to warn {E.Target.Name}");
|
||||
@ -83,7 +83,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
E.Target.Warnings = 0;
|
||||
String Message = String.Format("All warning cleared for {0}", E.Target.Name);
|
||||
@ -109,11 +109,11 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
if (E.Origin.Level > E.Target.Level)
|
||||
{
|
||||
await E.Owner.ExecuteEvent(new Event(Event.GType.Kick, E.Data, E.Origin, E.Target, E.Owner));
|
||||
await E.Owner.ExecuteEvent(new GameEvent(GameEvent.EventType.Kick, E.Data, E.Origin, E.Target, E.Owner));
|
||||
await E.Target.Kick(E.Data, E.Origin);
|
||||
await E.Origin.Tell($"^5{E.Target} ^7has been kicked");
|
||||
}
|
||||
@ -135,9 +135,9 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
await E.Owner.Broadcast($"^:{E.Origin.Name} - ^6{E.Data}^7");
|
||||
await E.Owner.Broadcast($"{(E.Owner.GameName == Server.Game.IW4 ? "^:" : "")}{E.Origin.Name} - ^6{E.Data}^7");
|
||||
}
|
||||
}
|
||||
|
||||
@ -164,7 +164,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
String Message = Utilities.RemoveWords(E.Data, 1).Trim();
|
||||
var length = E.Data.Split(' ')[0].ToLower().ParseTimespan();
|
||||
@ -199,7 +199,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
if (E.Origin.Level > E.Target.Level)
|
||||
{
|
||||
@ -229,10 +229,10 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
var penalties = await E.Owner.Manager.GetPenaltyService().GetActivePenaltiesAsync(E.Target.AliasLinkId);
|
||||
if (penalties.Where(p => p.Type == Penalty.PenaltyType.Ban).FirstOrDefault() != null)
|
||||
if (penalties.Where(p => p.Type == Penalty.PenaltyType.Ban || p.Type == Penalty.PenaltyType.TempBan).FirstOrDefault() != null)
|
||||
{
|
||||
await E.Owner.Unban(E.Data, E.Target, E.Origin);
|
||||
await E.Origin.Tell($"Successfully unbanned {E.Target}");
|
||||
@ -250,7 +250,7 @@ namespace SharedLibraryCore.Commands
|
||||
base("whoami", "give information about yourself.", "who", Player.Permission.User, false)
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
String You = String.Format("{0} [^3#{1}^7] {2} [^3@{3}^7] [{4}^7] IP: {5}", E.Origin.Name, E.Origin.ClientNumber, E.Origin.NetworkId, E.Origin.ClientId, Utilities.ConvertLevelToColor(E.Origin.Level), E.Origin.IPAddressString);
|
||||
await E.Origin.Tell(You);
|
||||
@ -263,7 +263,7 @@ namespace SharedLibraryCore.Commands
|
||||
base("list", "list active clients", "l", Player.Permission.Moderator, false)
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
StringBuilder playerList = new StringBuilder();
|
||||
int count = 0;
|
||||
@ -305,7 +305,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
String cmd = E.Data.Trim();
|
||||
|
||||
@ -361,7 +361,7 @@ namespace SharedLibraryCore.Commands
|
||||
base("fastrestart", "fast restart current map", "fr", Player.Permission.Moderator, false)
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
await E.Owner.ExecuteCommandAsync("fast_restart");
|
||||
|
||||
@ -378,7 +378,7 @@ namespace SharedLibraryCore.Commands
|
||||
base("maprotate", "cycle to the next map in rotation", "mr", Player.Permission.Administrator, false)
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
if (!E.Origin.Masked)
|
||||
await E.Owner.Broadcast($"Map rotating in ^55 ^7seconds [^5{E.Origin.Name}^7]");
|
||||
@ -407,7 +407,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
if (E.Target == E.Origin)
|
||||
{
|
||||
@ -481,7 +481,7 @@ namespace SharedLibraryCore.Commands
|
||||
base("usage", "get current application memory usage", "us", Player.Permission.Moderator, false)
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
await E.Origin.Tell("IW4M Admin is using " + Math.Round(((System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64 / 2048f) / 1200f), 1) + "MB");
|
||||
}
|
||||
@ -493,7 +493,7 @@ namespace SharedLibraryCore.Commands
|
||||
base("uptime", "get current application running time", "up", Player.Permission.Moderator, false)
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
TimeSpan uptime = DateTime.Now - System.Diagnostics.Process.GetCurrentProcess().StartTime;
|
||||
await E.Origin.Tell(String.Format("IW4M Admin has been up for {0} days, {1} hours, and {2} minutes", uptime.Days, uptime.Hours, uptime.Minutes));
|
||||
@ -506,7 +506,7 @@ namespace SharedLibraryCore.Commands
|
||||
base("admins", "list currently connected admins", "a", Player.Permission.User, false)
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
int numOnline = 0;
|
||||
for (int i = 0; i < E.Owner.Players.Count; i++)
|
||||
@ -540,7 +540,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
string newMap = E.Data.Trim().ToLower();
|
||||
foreach (Map m in E.Owner.Maps)
|
||||
@ -573,7 +573,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
IList<EFClient> db_players = (await (E.Owner.Manager.GetClientService() as ClientService)
|
||||
.GetClientByName(E.Data))
|
||||
@ -603,7 +603,7 @@ namespace SharedLibraryCore.Commands
|
||||
base("rules", "list server rules", "r", Player.Permission.User, false)
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
if (E.Owner.Manager.GetApplicationSettings().Configuration().GlobalRules?.Count < 1 &&
|
||||
E.Owner.ServerConfig.Rules?.Count < 1)
|
||||
@ -650,7 +650,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
await E.Target.Tell($"^1{E.Origin.Name} ^3[PM]^7 - {E.Data}");
|
||||
await E.Origin.Tell($"To ^3{E.Target.Name} ^7-> {E.Data}");
|
||||
@ -675,7 +675,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
// todo: move unflag to seperate command
|
||||
if (E.Target.Level >= E.Origin.Level)
|
||||
@ -708,7 +708,7 @@ namespace SharedLibraryCore.Commands
|
||||
};
|
||||
|
||||
await E.Owner.Manager.GetPenaltyService().Create(newPenalty);
|
||||
await E.Owner.ExecuteEvent(new Event(Event.GType.Flag, E.Data, E.Origin, E.Target, E.Owner));
|
||||
await E.Owner.ExecuteEvent(new GameEvent(GameEvent.EventType.Flag, E.Data, E.Origin, E.Target, E.Owner));
|
||||
await E.Origin.Tell($"You have flagged ^5{E.Target.Name}");
|
||||
}
|
||||
|
||||
@ -733,7 +733,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
if (E.Data.ToLower().Contains("camp"))
|
||||
{
|
||||
@ -762,7 +762,7 @@ namespace SharedLibraryCore.Commands
|
||||
E.Owner.Reports.Add(new Report(E.Target, E.Origin, E.Data));
|
||||
|
||||
await E.Origin.Tell($"Thank you for your report, an administrator has been notified");
|
||||
await E.Owner.ExecuteEvent(new Event(Event.GType.Report, E.Data, E.Origin, E.Target, E.Owner));
|
||||
await E.Owner.ExecuteEvent(new GameEvent(GameEvent.EventType.Report, E.Data, E.Origin, E.Target, E.Owner));
|
||||
await E.Owner.ToAdmins(String.Format("^5{0}^7->^1{1}^7: {2}", E.Origin.Name, E.Target.Name, E.Data));
|
||||
}
|
||||
}
|
||||
@ -780,7 +780,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
if (E.Data != null && E.Data.ToLower().Contains("clear"))
|
||||
{
|
||||
@ -806,7 +806,7 @@ namespace SharedLibraryCore.Commands
|
||||
base("mask", "hide your presence as an administrator", "hide", Player.Permission.Moderator, false)
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
if (E.Origin.Masked)
|
||||
{
|
||||
@ -836,7 +836,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
var B = await E.Owner.Manager.GetPenaltyService().GetClientPenaltiesAsync(E.Target.ClientId);
|
||||
|
||||
@ -865,7 +865,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
StringBuilder message = new StringBuilder();
|
||||
var names = new List<string>(E.Target.AliasLink.Children.Select(a => a.Name));
|
||||
@ -897,7 +897,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
var Response = await E.Owner.ExecuteCommandAsync(E.Data.Trim());
|
||||
foreach (string S in Response)
|
||||
@ -913,7 +913,7 @@ namespace SharedLibraryCore.Commands
|
||||
base("plugins", "view all loaded plugins", "p", Player.Permission.Administrator, false)
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
await E.Origin.Tell("^5Loaded Plugins:");
|
||||
foreach (var P in Plugins.PluginImporter.ActivePlugins)
|
||||
@ -929,7 +929,7 @@ namespace SharedLibraryCore.Commands
|
||||
base("getexternalip", "view your external IP address", "ip", Player.Permission.User, false)
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
await E.Origin.Tell($"Your external IP is ^5{E.Origin.IPAddressString}");
|
||||
}
|
||||
@ -947,7 +947,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
int inactiveDays = 30;
|
||||
|
||||
@ -997,7 +997,7 @@ namespace SharedLibraryCore.Commands
|
||||
})
|
||||
{ }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
if (E.Data.Length < 5)
|
||||
{
|
||||
@ -1024,7 +1024,7 @@ namespace SharedLibraryCore.Commands
|
||||
{
|
||||
}
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
var gameserverProcesses = System.Diagnostics.Process.GetProcessesByName("iw4x");
|
||||
var currentProcess = gameserverProcesses.FirstOrDefault(g => g.MainWindowTitle.Contains(E.Owner.Hostname));
|
||||
|
@ -7,9 +7,9 @@ using SharedLibraryCore.Objects;
|
||||
|
||||
namespace SharedLibraryCore
|
||||
{
|
||||
public class Event
|
||||
public class GameEvent
|
||||
{
|
||||
public enum GType
|
||||
public enum EventType
|
||||
{
|
||||
//FROM SERVER
|
||||
Start,
|
||||
@ -38,7 +38,7 @@ namespace SharedLibraryCore
|
||||
Death,
|
||||
}
|
||||
|
||||
public Event(GType t, string d, Player O, Player T, Server S)
|
||||
public GameEvent(EventType t, string d, Player O, Player T, Server S)
|
||||
{
|
||||
Type = t;
|
||||
Data = d?.Trim();
|
||||
@ -47,59 +47,10 @@ namespace SharedLibraryCore
|
||||
Owner = S;
|
||||
}
|
||||
|
||||
public static Event ParseEventString(String[] line, Server SV)
|
||||
{
|
||||
#if DEBUG == false
|
||||
try
|
||||
#endif
|
||||
{
|
||||
string removeTime = Regex.Replace(line[0], @"[0-9]+:[0-9]+\ ", "");
|
||||
|
||||
if (removeTime[0] == 'K')
|
||||
{
|
||||
StringBuilder Data = new StringBuilder();
|
||||
if (line.Length > 9)
|
||||
{
|
||||
for (int i = 9; i < line.Length; i++)
|
||||
Data.Append(line[i] + ";");
|
||||
}
|
||||
|
||||
if (!SV.CustomCallback)
|
||||
return new Event(GType.Script, Data.ToString(), SV.ParseClientFromString(line, 6), SV.ParseClientFromString(line, 2), SV);
|
||||
}
|
||||
|
||||
if (line[0].Substring(line[0].Length - 3).Trim() == "say")
|
||||
{
|
||||
Regex rgx = new Regex("[^a-zA-Z0-9 -! -_]");
|
||||
string message = rgx.Replace(line[4], "");
|
||||
return new Event(GType.Say, message.StripColors(), SV.ParseClientFromString(line, 2), null, SV) { Message = message };
|
||||
}
|
||||
|
||||
if (removeTime.Contains("ScriptKill"))
|
||||
{
|
||||
return new Event(GType.Script, String.Join(";", line), SV.Players.First(p => p != null && p.NetworkId == line[1].ConvertLong()), SV.Players.First(p => p != null && p.NetworkId == line[2].ConvertLong()), SV);
|
||||
}
|
||||
|
||||
if (removeTime.Contains("ExitLevel"))
|
||||
return new Event(GType.MapEnd, line[0], new Player() { ClientId = 1 }, null, SV);
|
||||
|
||||
if (removeTime.Contains("InitGame"))
|
||||
return new Event(GType.MapChange, line[0], new Player() { ClientId = 1 }, null, SV);
|
||||
public GameEvent() { }
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
#if DEBUG == false
|
||||
catch (Exception E)
|
||||
{
|
||||
SV.Manager.GetLogger().WriteError("Error requesting event " + E.Message);
|
||||
return null;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
public GType Type;
|
||||
public EventType Type;
|
||||
public string Data; // Data is usually the message sent by player
|
||||
public string Message;
|
||||
public Player Origin;
|
||||
|
@ -5,7 +5,7 @@ namespace SharedLibraryCore.Interfaces
|
||||
{
|
||||
public interface IEventApi
|
||||
{
|
||||
void OnServerEvent(object sender, Event E);
|
||||
void OnServerEvent(object sender, GameEvent E);
|
||||
Queue<EventInfo> GetEvents();
|
||||
}
|
||||
}
|
||||
|
11
SharedLibraryCore/Interfaces/IEventParser.cs
Normal file
11
SharedLibraryCore/Interfaces/IEventParser.cs
Normal file
@ -0,0 +1,11 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace SharedLibraryCore.Interfaces
|
||||
{
|
||||
public interface IEventParser
|
||||
{
|
||||
GameEvent GetEvent(Server server, string logLine);
|
||||
}
|
||||
}
|
@ -7,7 +7,7 @@ namespace SharedLibraryCore.Interfaces
|
||||
{
|
||||
Task OnLoadAsync(IManager manager);
|
||||
Task OnUnloadAsync();
|
||||
Task OnEventAsync(Event E, Server S);
|
||||
Task OnEventAsync(GameEvent E, Server S);
|
||||
Task OnTickAsync(Server S);
|
||||
|
||||
//for logging purposes
|
||||
|
@ -1,16 +1,16 @@
|
||||
using SharedLibraryCore.Objects;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using SharedLibraryCore.Objects;
|
||||
using SharedLibraryCore.RCon;
|
||||
|
||||
namespace SharedLibraryCore.Interfaces
|
||||
{
|
||||
public interface IRConParser
|
||||
{
|
||||
Task<Dvar<T>> GetDvarAsync<T>(RCon.Connection connection, string dvarName);
|
||||
Task<bool> SetDvarAsync(RCon.Connection connection, string dvarName, object dvarValue);
|
||||
Task<string[]> ExecuteCommandAsync(RCon.Connection connection, string command);
|
||||
Task<List<Player>> GetStatusAsync(RCon.Connection connection);
|
||||
Task<Dvar<T>> GetDvarAsync<T>(Connection connection, string dvarName);
|
||||
Task<bool> SetDvarAsync(Connection connection, string dvarName, object dvarValue);
|
||||
Task<string[]> ExecuteCommandAsync(Connection connection, string command);
|
||||
Task<List<Player>> GetStatusAsync(Connection connection);
|
||||
CommandPrefix GetCommandPrefixes();
|
||||
}
|
||||
}
|
||||
|
17
SharedLibraryCore/RCon/CommandPrefix.cs
Normal file
17
SharedLibraryCore/RCon/CommandPrefix.cs
Normal file
@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace SharedLibraryCore.RCon
|
||||
{
|
||||
public class CommandPrefix
|
||||
{
|
||||
public string Tell { get; set; }
|
||||
public string Say { get; set; }
|
||||
public string Set { get; set; }
|
||||
public string Kick { get; set; }
|
||||
public string Ban { get; set; }
|
||||
public string Unban { get; set; }
|
||||
public string TempBan { get; set; }
|
||||
}
|
||||
}
|
@ -79,13 +79,6 @@ namespace SharedLibraryCore
|
||||
/// <returns>true if removal succeded, false otherwise</returns>
|
||||
abstract public Task RemovePlayer(int cNum);
|
||||
|
||||
/// <summary>
|
||||
/// Get the player from the server's list by line from game long
|
||||
/// </summary>
|
||||
/// <param name="L">Game log line containing event</param>
|
||||
/// <param name="cIDPos">Position in the line where the cliet ID is written</param>
|
||||
/// <returns>Matching player if found</returns>
|
||||
abstract public Player ParseClientFromString(String[] L, int cIDPos);
|
||||
|
||||
/// <summary>
|
||||
/// Get a player by name
|
||||
@ -113,7 +106,7 @@ namespace SharedLibraryCore
|
||||
/// <param name="E">Event parameter</param>
|
||||
/// <param name="C">Command requested from the event</param>
|
||||
/// <returns></returns>
|
||||
abstract public Task<Command> ValidateCommand(Event E);
|
||||
abstract public Task<Command> ValidateCommand(GameEvent E);
|
||||
|
||||
virtual public Task<bool> ProcessUpdatesAsync(CancellationToken cts)
|
||||
{
|
||||
@ -125,8 +118,8 @@ namespace SharedLibraryCore
|
||||
/// </summary>
|
||||
/// <param name="E">Event</param>
|
||||
/// <returns>True on sucess</returns>
|
||||
abstract protected Task ProcessEvent(Event E);
|
||||
abstract public Task ExecuteEvent(Event E);
|
||||
abstract protected Task ProcessEvent(GameEvent E);
|
||||
abstract public Task ExecuteEvent(GameEvent E);
|
||||
|
||||
/// <summary>
|
||||
/// Send a message to all players
|
||||
@ -134,10 +127,9 @@ namespace SharedLibraryCore
|
||||
/// <param name="Message">Message to be sent to all players</param>
|
||||
public async Task Broadcast(String Message)
|
||||
{
|
||||
|
||||
string sayCommand = (GameName == Game.IW4) ? "sayraw" : "say";
|
||||
#if !DEBUG
|
||||
await this.ExecuteCommandAsync($"{sayCommand} {(CustomSayEnabled ? CustomSayName : "")} {Message}");
|
||||
string formattedMessage = String.Format(RconParser.GetCommandPrefixes().Say, Message);
|
||||
await this.ExecuteCommandAsync(formattedMessage);
|
||||
#else
|
||||
Logger.WriteVerbose(Message.StripColors());
|
||||
await Utilities.CompletedTask;
|
||||
@ -151,11 +143,11 @@ namespace SharedLibraryCore
|
||||
/// <param name="Target">Player to send message to</param>
|
||||
public async Task Tell(String Message, Player Target)
|
||||
{
|
||||
string tellCommand = (GameName == Game.IW4) ? "tellraw" : "tell";
|
||||
|
||||
#if !DEBUG
|
||||
string formattedMessage = String.Format(RconParser.GetCommandPrefixes().Tell, Target.ClientNumber, Message);
|
||||
if (Target.ClientNumber > -1 && Message.Length > 0 && Target.Level != Player.Permission.Console)
|
||||
await this.ExecuteCommandAsync($"{tellCommand} {Target.ClientNumber} {(CustomSayEnabled ? CustomSayName : "")} {Message}^7");
|
||||
await this.ExecuteCommandAsync(formattedMessage);
|
||||
#else
|
||||
Logger.WriteVerbose($"{Target.ClientNumber}->{Message.StripColors()}");
|
||||
await Utilities.CompletedTask;
|
||||
@ -286,8 +278,8 @@ namespace SharedLibraryCore
|
||||
}
|
||||
|
||||
// Objects
|
||||
public Interfaces.IManager Manager { get; protected set; }
|
||||
public Interfaces.ILogger Logger { get; private set; }
|
||||
public IManager Manager { get; protected set; }
|
||||
public ILogger Logger { get; private set; }
|
||||
public ServerConfiguration ServerConfig { get; private set; }
|
||||
public List<Map> Maps { get; protected set; }
|
||||
public List<Report> Reports { get; set; }
|
||||
@ -315,6 +307,7 @@ namespace SharedLibraryCore
|
||||
public string WorkingDirectory { get; protected set; }
|
||||
public RCon.Connection RemoteConnection { get; protected set; }
|
||||
public IRConParser RconParser { get; protected set; }
|
||||
public IEventParser EventParser { get; set; }
|
||||
|
||||
// Internal
|
||||
protected string IP;
|
||||
|
@ -139,6 +139,7 @@ namespace SharedLibraryCore.Services
|
||||
|
||||
if (victim)
|
||||
{
|
||||
var now = DateTime.UtcNow;
|
||||
var iqPenalties = from penalty in context.Penalties.AsNoTracking()
|
||||
where penalty.OffenderId == clientId
|
||||
join victimClient in context.Clients.AsNoTracking()
|
||||
@ -160,13 +161,22 @@ namespace SharedLibraryCore.Services
|
||||
PunisherName = punisherAlias.Name,
|
||||
PunisherId = penalty.PunisherId,
|
||||
Offense = penalty.Offense,
|
||||
Type = penalty.Type.ToString()
|
||||
Type = penalty.Type.ToString(),
|
||||
TimeRemaining = now > penalty.Expires ? "" : penalty.Expires.ToString()
|
||||
},
|
||||
When = penalty.When,
|
||||
Sensitive = penalty.Type == Objects.Penalty.PenaltyType.Flag
|
||||
};
|
||||
// fixme: is this good and fast?
|
||||
return await iqPenalties.ToListAsync();
|
||||
var list = await iqPenalties.ToListAsync();
|
||||
list.ForEach(p =>
|
||||
{
|
||||
var pi = ((PenaltyInfo)p.Value);
|
||||
if (pi.TimeRemaining.Length > 0)
|
||||
pi.TimeRemaining = (DateTime.Parse(((PenaltyInfo)p.Value).TimeRemaining) - now).TimeSpanText();
|
||||
}
|
||||
);
|
||||
return list;
|
||||
}
|
||||
|
||||
else
|
||||
@ -204,17 +214,26 @@ namespace SharedLibraryCore.Services
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<List<EFPenalty>> GetActivePenaltiesAsync(int aliasId)
|
||||
public async Task<List<EFPenalty>> GetActivePenaltiesAsync(int aliasId, int ip = 0)
|
||||
{
|
||||
using (var context = new DatabaseContext())
|
||||
{
|
||||
var iqPenalties = from link in context.AliasLinks
|
||||
where link.AliasLinkId == aliasId
|
||||
join penalty in context.Penalties
|
||||
on link.AliasLinkId equals penalty.LinkId
|
||||
where penalty.Active
|
||||
select penalty;
|
||||
return await iqPenalties.ToListAsync();
|
||||
var iqPenalties = await (from link in context.AliasLinks
|
||||
where link.AliasLinkId == aliasId
|
||||
join penalty in context.Penalties
|
||||
on link.AliasLinkId equals penalty.LinkId
|
||||
where penalty.Active
|
||||
select penalty).ToListAsync();
|
||||
if (ip != 0)
|
||||
{
|
||||
iqPenalties.AddRange(await (from alias in context.Aliases
|
||||
where alias.IPAddress == ip
|
||||
join penalty in context.Penalties
|
||||
on alias.LinkId equals penalty.LinkId
|
||||
where penalty.Active
|
||||
select penalty).ToListAsync());
|
||||
}
|
||||
return iqPenalties;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -355,6 +355,17 @@ namespace SharedLibraryCore
|
||||
return response;
|
||||
}
|
||||
|
||||
public static int ClientIdFromString(String[] lineSplit, int cIDPos)
|
||||
{
|
||||
int pID = -2; // apparently falling = -1 cID so i can't use it now
|
||||
int.TryParse(lineSplit[cIDPos].Trim(), out pID);
|
||||
|
||||
if (pID == -1) // special case similar to mod_suicide
|
||||
int.TryParse(lineSplit[2], out pID);
|
||||
|
||||
return pID;
|
||||
}
|
||||
|
||||
public static async Task<Dvar<T>> GetDvarAsync<T>(this Server server, string dvarName) => await server.RconParser.GetDvarAsync<T>(server.RemoteConnection, dvarName);
|
||||
|
||||
public static async Task SetDvarAsync(this Server server, string dvarName, object dvarValue) => await server.RconParser.SetDvarAsync(server.RemoteConnection, dvarName, dvarValue);
|
||||
|
Reference in New Issue
Block a user