From 6a94882d202ab55b052ccbf8277d06f26b8af45b Mon Sep 17 00:00:00 2001 From: RaidMax Date: Thu, 17 Aug 2017 18:28:08 -0500 Subject: [PATCH] -added !ip command (prints a client's external IP) -fixed up the findall command -moved aliases to the manager -added admins page to view privileged users -fixed refactoring mistake with messages --- Admin/Application.csproj | 3 + Admin/Kayak.cs | 34 +++++++--- Admin/Manager.cs | 45 +++++++++++++ Admin/Server.cs | 53 +++------------ Admin/WebService.cs | 79 ++++++++++++++++++++++- Admin/lib/SharedLibrary.dll | Bin 104960 -> 97792 bytes Admin/version.txt | 7 +- Admin/webfront/admins.html | 71 ++++++++++++++++++++ README.md | 3 +- SharedLibrary/Commands/NativeCommands.cs | 29 ++++++--- SharedLibrary/Database.cs | 8 +-- SharedLibrary/Interfaces/IManager.cs | 2 + SharedLibrary/Player.cs | 3 +- SharedLibrary/RCON.cs | 17 +---- SharedLibrary/Server.cs | 27 +++----- 15 files changed, 276 insertions(+), 105 deletions(-) create mode 100644 Admin/webfront/admins.html diff --git a/Admin/Application.csproj b/Admin/Application.csproj index ece9d59f..6f64bf84 100644 --- a/Admin/Application.csproj +++ b/Admin/Application.csproj @@ -158,6 +158,9 @@ Always + + PreserveNewest + PreserveNewest diff --git a/Admin/Kayak.cs b/Admin/Kayak.cs index 1a62ccbc..12dc5213 100644 --- a/Admin/Kayak.cs +++ b/Admin/Kayak.cs @@ -45,23 +45,41 @@ namespace IW4MAdmin querySet = System.Web.HttpUtility.ParseQueryString(SharedLibrary.Utilities.StripIllegalCharacters(request.QueryString)); querySet.Set("IP", IP); - SharedLibrary.HttpResponse requestedPage = WebService.GetPage(request.Path, querySet, request.Headers); - var headers = new HttpResponseHead() + try { - Status = "200 OK", - Headers = new Dictionary() + SharedLibrary.HttpResponse requestedPage = WebService.GetPage(request.Path, querySet, request.Headers); + + var headers = new HttpResponseHead() + { + Status = "200 OK", + Headers = new Dictionary() { { "Content-Type", requestedPage.contentType }, { "Content-Length", requestedPage.content.Length.ToString() }, { "Access-Control-Allow-Origin", "*" }, } - }; + }; - foreach (var key in requestedPage.additionalHeaders.Keys) - headers.Headers.Add(key, requestedPage.additionalHeaders[key]); + foreach (var key in requestedPage.additionalHeaders.Keys) + headers.Headers.Add(key, requestedPage.additionalHeaders[key]); - response.OnResponse(headers, new BufferedProducer(requestedPage.content)); + response.OnResponse(headers, new BufferedProducer(requestedPage.content)); + } + + catch (Exception e) + { + ApplicationManager.GetInstance().Logger.WriteError($"Webfront error during request: {e.Message}"); + response.OnResponse(new HttpResponseHead() + { + Status = "500 Internal Server Error", + Headers = new Dictionary() + { + { "Content-Type", "text/html" }, + { "Content-Length", "0"}, + } + }, new BufferedProducer("")); + } } } diff --git a/Admin/Manager.cs b/Admin/Manager.cs index 13f40b20..7a90b3b7 100644 --- a/Admin/Manager.cs +++ b/Admin/Manager.cs @@ -161,6 +161,7 @@ namespace IW4MAdmin Commands.Add(new CExecuteRCON("rcon", "send rcon command to server. syntax: !rcon ", "rcon", Player.Permission.Owner, 1, false)); Commands.Add(new CFindAllPlayers("findall", "find a player by their aliase(s). syntax: !findall ", "fa", Player.Permission.Moderator, 1, false)); Commands.Add(new CPlugins("plugins", "view all loaded plugins. syntax: !plugins", "p", Player.Permission.Administrator, 0, false)); + Commands.Add(new CIP("ip", "view your external IP address. syntax: !ip", "getexternalip", Player.Permission.User, 0, false)); foreach (Command C in SharedLibrary.Plugins.PluginImporter.ActiveCommands) Commands.Add(C); @@ -247,5 +248,49 @@ namespace IW4MAdmin return ActiveClients; } + + public IList GetAliasClients(Player Origin) + { + List databaseIDs = new List(); + + foreach (Aliases A in GetAliases(Origin)) + databaseIDs.Add(A.Number); + + return GetClientDatabase().GetPlayers(databaseIDs); + } + + public IList GetAliases(Player Origin) + { + List allAliases = new List(); + + if (Origin == null) + return allAliases; + + Aliases currentIdentityAliases = GetAliasesDatabase().GetPlayerAliases(Origin.DatabaseID); + + if (currentIdentityAliases == null) + return allAliases; + + GetAliases(allAliases, currentIdentityAliases); + if (Origin.Alias != null) + allAliases.Add(Origin.Alias); + return allAliases; + } + + private void GetAliases(List returnAliases, Aliases currentAlias) + { + foreach (String IP in currentAlias.IPS) + { + List Matching = GetAliasesDatabase().GetPlayerAliases(IP); + foreach (Aliases I in Matching) + { + if (!returnAliases.Contains(I) && returnAliases.Find(x => x.Number == I.Number) == null) + { + returnAliases.Add(I); + GetAliases(returnAliases, I); + } + } + } + } } } diff --git a/Admin/Server.cs b/Admin/Server.cs index 5252fabb..d576a746 100644 --- a/Admin/Server.cs +++ b/Admin/Server.cs @@ -15,40 +15,6 @@ namespace IW4MAdmin { public IW4MServer(IManager mgr, ServerConfiguration cfg) : base(mgr, cfg) { } - private void GetAliases(List returnAliases, Aliases currentAlias) - { - foreach(String IP in currentAlias.IPS) - { - List Matching = Manager.GetAliasesDatabase().GetPlayerAliases(IP); - foreach(Aliases I in Matching) - { - if (!returnAliases.Contains(I) && returnAliases.Find(x => x.Number == I.Number) == null) - { - returnAliases.Add(I); - GetAliases(returnAliases, I); - } - } - } - } - - public override List GetAliases(Player Origin) - { - List allAliases = new List(); - - if (Origin == null) - return allAliases; - - Aliases currentIdentityAliases = Manager.GetAliasesDatabase().GetPlayerAliases(Origin.DatabaseID); - - if (currentIdentityAliases == null) - return allAliases; - - GetAliases(allAliases, currentIdentityAliases); - if (Origin.Alias != null) - allAliases.Add(Origin.Alias); - return allAliases; - } - override public async Task AddPlayer(Player P) { if (P.ClientID < 0 || P.ClientID > (Players.Count-1) || P.Ping < 1 || P.Ping == 999) // invalid index @@ -123,7 +89,7 @@ namespace IW4MAdmin return true; } - var newPlayerAliases = GetPlayerAliases(NewPlayer); + var newPlayerAliases = Manager.GetAliasClients(NewPlayer); foreach (Player aP in newPlayerAliases) // lets check their aliases { @@ -153,7 +119,6 @@ namespace IW4MAdmin if (NewPlayer.Level > Player.Permission.Moderator) await NewPlayer.Tell("There are ^5" + Reports.Count + " ^7recent reports!"); - ClientNum++; return true; } @@ -168,7 +133,7 @@ namespace IW4MAdmin //Remove player by CLIENT NUMBER override public async Task RemovePlayer(int cNum) { - if (cNum >= 0 && cNum < Players.Count) + if (cNum >= 0) { Player Leaving = Players[cNum]; Leaving.Connections++; @@ -177,8 +142,6 @@ namespace IW4MAdmin Logger.WriteInfo($"Client {Leaving.Name}::{Leaving.NetworkID} disconnecting..."); await ExecuteEvent(new Event(Event.GType.Disconnect, "", Leaving, null, this)); Players[cNum] = null; - - ClientNum--; } } @@ -315,7 +278,7 @@ namespace IW4MAdmin } } - async Task PollPlayersAsync() + async Task PollPlayersAsync() { var CurrentPlayers = await this.GetStatusAsync(); @@ -327,6 +290,8 @@ namespace IW4MAdmin foreach (var P in CurrentPlayers) await AddPlayer(P); + + return CurrentPlayers.Count; } long l_size = -1; @@ -349,7 +314,7 @@ namespace IW4MAdmin try { - await PollPlayersAsync(); + ClientNum = await PollPlayersAsync(); if (ConnectionErrors > 0) { @@ -389,10 +354,10 @@ namespace IW4MAdmin playerCountStart = DateTime.Now; } - if (LastMessage.TotalSeconds > MessageTime && BroadcastMessages.Count > 0 && Players.Count > 0) + if (LastMessage.TotalSeconds > MessageTime && BroadcastMessages.Count > 0 && ClientNum > 0) { - await Broadcast(Utilities.ProcessMessageToken(Manager.GetMessageTokens(), BroadcastMessages[NextMessage])); - NextMessage = NextMessage == (BroadcastMessages.Count - 1) ? 0 : NextMessage++; + Console.WriteLine(Utilities.ProcessMessageToken(Manager.GetMessageTokens(), BroadcastMessages[NextMessage])); + NextMessage = NextMessage == (BroadcastMessages.Count - 1) ? 0 : NextMessage + 1; start = DateTime.Now; } diff --git a/Admin/WebService.cs b/Admin/WebService.cs index 11ad1d4b..ada77871 100644 --- a/Admin/WebService.cs +++ b/Admin/WebService.cs @@ -29,6 +29,8 @@ namespace IW4MAdmin SharedLibrary.WebService.PageList.Add(new WebConsole()); SharedLibrary.WebService.PageList.Add(new ConsoleJSON()); SharedLibrary.WebService.PageList.Add(new PubbansJSON()); + SharedLibrary.WebService.PageList.Add(new AdminsJSON()); + SharedLibrary.WebService.PageList.Add(new Admins()); Thread scheduleThread = new Thread(() => { ScheduleThreadStart(webScheduler, webService); }) { @@ -521,6 +523,69 @@ namespace IW4MAdmin } } + + class Admins : HTMLPage + { + public override string GetName() + { + return "Admins"; + } + + public override string GetPath() + { + return "/Admins"; + } + + public override string GetContent(System.Collections.Specialized.NameValueCollection querySet, IDictionary headers) + { + StringBuilder S = new StringBuilder(); + S.Append(LoadHeader()); + + IFile admins = new IFile("webfront\\admins.html"); + S.Append(admins.GetText()); + admins.Close(); + + S.Append(LoadFooter()); + + return S.ToString(); + } + } + + class AdminsJSON : IPage + { + public string GetName() + { + return "Admins Json"; + } + + public string GetPath() + { + return "/GetAdmins"; + } + + public HttpResponse GetPage(System.Collections.Specialized.NameValueCollection querySet, IDictionary headers) + { + var Admins = ApplicationManager.GetInstance().GetClientDatabase().GetAdmins().OrderByDescending(a => a.Level); + HttpResponse resp = new HttpResponse() + { + contentType = GetContentType(), + content = Newtonsoft.Json.JsonConvert.SerializeObject(Admins, Newtonsoft.Json.Formatting.Indented), + additionalHeaders = new Dictionary() + }; + return resp; + } + + public string GetContentType() + { + return "application/json"; + } + + public bool Visible() + { + return false; + } + } + class PubbansJSON : IPage { public string GetName() @@ -604,7 +669,7 @@ namespace IW4MAdmin return false; } } - + class GetPlayer : IPage { public string GetContentType() @@ -631,7 +696,8 @@ namespace IW4MAdmin contentType = GetContentType(), additionalHeaders = new Dictionary() }; - bool authed = ApplicationManager.GetInstance().GetClientDatabase().GetAdmins().FindAll(x => x.IP == querySet["IP"]).Count > 0; + bool authed = ApplicationManager.GetInstance().GetClientDatabase().GetAdmins().FindAll(x => x.IP == querySet["IP"] && x.Level > Player.Permission.Trusted).Count > 0 + || querySet["IP"] == "127.0.0.1"; bool recent = false; if (querySet["id"] != null) @@ -675,7 +741,7 @@ namespace IW4MAdmin if (!recent) { - foreach (var a in ApplicationManager.GetInstance().Servers.First().GetAliases(pp)) + foreach (var a in ApplicationManager.GetInstance().GetAliases(pp)) { eachPlayer.playerAliases = a.Names; eachPlayer.playerIPs = a.IPS; @@ -765,4 +831,11 @@ namespace IW4MAdmin { public List Result; } + + [Serializable] + class PrivilegedUsers + { + public Player.Permission Permission { get; set; } + public List Players { get; set; } + } } \ No newline at end of file diff --git a/Admin/lib/SharedLibrary.dll b/Admin/lib/SharedLibrary.dll index 8d35f98251b1e1dc868c2cce4c61181ac48f832a..3421cb94df749199766dd8821b29a4604b4bee4b 100644 GIT binary patch literal 97792 zcmeFad4N>K)i+%CcK7X`o`vb@>7Es4SY~Kvh8=WZ5D-OiM@2<(0r!R2*n^7pG=d9m z;EEfHqH&8`lxSkq7>!DdTX2anMi6(C_!u>6h*5lhzf;wHZ}&_S$n(A5_s@rRRh@IH zPMve=)Tz34m)ZN!%au_9tG&pd?;n0^f4%KmtSL*cJW+%z`|S2utoH zAhKio5*5hWRCJ`Rs?ihrkJyP4;KEfZ1!#UE4!&&z>@)y>+aTMQkpd8O13^du2#ljf zNC5~)pb=64B9KK$0SE}EYe*qwwD2V&6waTBG7C^Ohav>CwWR;Kx#LR9wtvX98B$raux;c!=

0Qs<&HdIvkH^(s^4M~_G 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

)*|v9 zR%Pp(U!MY*gxpR|8<=&!1ac|PAmX@V-Gpn1z{G#F zH&96a5lL!59K!BO{4S9&9|;LB@Wbn(rHhV&>HY)Iy6CFBkL^sZ@%m z0-e9X2&wMdFvp^0k#K4jYR8jrp?P)U&+H(uel;qXUZUlZvPk)Y0q8699eP@HG`lO? z?A*>xE~0HXxgN=|-3%ekO34jC8DUPKFl8EDgErZ6Ey~MI!cfYSCt`9AA#O%in3gxP zWk`lDQlW20cCx>JLlL}zmbE#;)a0i)EzL7(m!iC(%=?yv;rBN9h2)yN#Jw_?BcB>f zvYp^8{0AA;O5_hBABvpw8LlMHoMM-){)t~1VE#L(`yB|hm?O}=ktG@jy!dWg0`ze( zqn&sclmrH&J-nf|G&QjX*C6JdI;zu+SKpkovhR7}IhqRh-7EON+Fp3PkD9RP2gn?* z8{rN8OH=2OmEd~u%f3&AXGdbnyaVaudLsOM%UU30LNhh|Ae!*&gOz!nUwFxTVFUCP zu-r}=0P&@O#WCDA6^mS;!e0@X3)A zay;@KpeJLRvLyDL3vvc~D2Y9rkvnNZI%d@Am_bBdEF&M-RQUKke0)-lWo+b5nvmvG zulW$siw}4SpOCcGu{9{=SO(WM;6q6BfsZh@648s#1jDCH+G;-7KZ{;r(j(TmR{!w1tK#|P`b@M%EqqzP$0&6*Dpz4%Nv zeDFqJjt?$ggijN4CrwE68L0UX(TmR%!w2u6<@gMdax60#xsxWO`3%y0i0H*BYQywCE@xhuX^K@5ftNBcmaxAk8awknl^Fd4|A0m43+0F35rEzZD zcb9T3gJ)d8hmhujb2RcHq8Fd(hR+OXtL52O%CXEo$elDH%?I(1e2D192m3wI>tJcC z`5YwWSmr?FPMVPBgEJuVA)*(bJq(}2rLE?3n3Q9g*~pzVA}&X(E^W0u zr%5@M!NCmp5Yl|G-zFa-dhwZI_@t$+=5v;mV;Sr}z=x3LgMBvn5YdazeumFtX{-6* zh)d?zBIHh*kmiGZ2Kf-ti_iXs&r)ft`J6B1Smr$BPMVPBgDn*K5Ydaz0fx^qX{-5M zBIQ`-V&qPmkmiGZ6ZsI)i_c8M=Spd-`CK98Smtu%PMVPBgS`{^5YdazfrigYX{-5M zFXdR~I^<58kmiHE3HcDwi_bxZ&&|?S^SMdNvCJyuPMVPBgS`p)5TW_t_}~O=V&pEH z6o5D}i;w~kCuI>*c-cHz&~psXn`3ZEd>sK!6V4n91Rf?h23ssVM0q@+n#^%*3?{5C z_tLR<@|;Vh*(i57^_Se9%&$&1^}z8sa!eeHH2GK5u+wDPR5vPU_~X$9L;y#hboJ(_ zsfXBUiZl;7o6nm)D}nd`zB$?3jx(xt|BdQE0H~9hhpY{E^?}A+`3k%KxBvdC4r{+1g-jTK`R8Sj{2UC-XCaVbx`&f=N`S5OpG-vTuhITk5q#ykh{T#x6(yKv&bKHuo)alqYm`2F( zr<;-3=^rBv^0t?g{0c40;7VU3A2!jBw}dlni6;SWW7cyE(ke^?Tr{+AIM_}TTW0q# z+Z=;dmK`%qz~rA`Qe|uWhMID_X|rY~TuKs~K;96|$0q&-WcHe_LY;n|s^N9%_PS?Z z;#(nOj`-EXIo)nY@6hc|WYBG|Jl*aBGH9oNf-HGM5e?ZM8s5#U=MJRQ5SKHeA+gYq znMXr5>03i#CS1H4x>%zjl&XXRc$=i>;+&4`yNHhWfCL@yL)J^j`+74S?(vf`^(eXi$pySVw_0sVnAfY1$ z-OpQ*eR?X}L&u*p>sf=8I^r@=bR-r!GV|!jCVlHD%!G?qM;E ocsg9e)85bo?c< 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%0AIw+RzXZ)0XN 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 +function printPlayer(player, i) +{ + var p = ""; + p += + "

\ + \ +
" + formatHidden(player['playerAliases'], player.authed) + "
\ +
" + formatHidden(player['playerIPs'], player.authed) + "
\ +
" + getColorForLevel(player['playerLevel'], player['playerLevel']) + "
\ +
" + player['playerConnections'] + "
"; + + if (player.showV2Features) + { + p += + " "; + } + + else + { + p+= + "
" + } + + p += + "
" + checkJustNow(player['lastSeen']) + "
\ +
"; + + $("#playersTable").append(p); + +} + +function getAdmins() { + $.getJSON('/GetAdmins', function(result) { + $.each(result, function(i, player) { + printPlayer(player, i); + }); + }).done(function (data) { $(".loader").fadeOut(); }); +} + +$( document ).ready(function() { + getAdmins(); +}); + + + + +
+ + +
+ +
+
Name
+
Aliases
+
IP
+
Level
+
Connections
+
V2
+
Last Seen
+
+
+
+
diff --git a/README.md b/README.md index fbef347f..679cf820 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # IW4MAdmin ### Quick Start Guide -### Version 1.2 +### Version 1.4 _______ ### Setup @@ -46,7 +46,6 @@ ___ |owner |claim ownership of your server | False | 0 | None | |setlevel |set player to specified administration level | True | 2 | Owner | |rcon |send rcon command to server | False | 1 | Owner | -|reserve |give player reserved status to join on full server | True | 1 | Owner | |ban |permanently ban a player from the server | True | 2 | SeniorAdmin | |unban |unban player by database id | True | 1 | SeniorAdmin | |find |find player in the database | False | 1 | SeniorAdmin | diff --git a/SharedLibrary/Commands/NativeCommands.cs b/SharedLibrary/Commands/NativeCommands.cs index 35eaea8e..935eb7f2 100644 --- a/SharedLibrary/Commands/NativeCommands.cs +++ b/SharedLibrary/Commands/NativeCommands.cs @@ -18,7 +18,7 @@ namespace SharedLibrary.Commands } public class COwner : Command - { + { public COwner(String N, String D, String U, Player.Permission P, int args, bool nT) : base(N, D, U, P, args, nT) { } public override async Task ExecuteAsync(Event E) @@ -44,7 +44,7 @@ namespace SharedLibrary.Commands if (E.Origin.Level <= E.Target.Level) await E.Origin.Tell($"You do not have the required privileges to warn {E.Target.Name}"); else - await E.Target.Warn(E.Target.lastOffense, E.Origin); + await E.Target.Warn(E.Target.lastOffense, E.Origin); } } @@ -74,7 +74,7 @@ namespace SharedLibrary.Commands await E.Target.Kick(E.Target.lastOffense, E.Origin); } else - await E.Origin.Tell($"You do not have the required privileges to kick {E.Target.Name}"); + await E.Origin.Tell($"You do not have the required privileges to kick {E.Target.Name}"); } } @@ -216,7 +216,7 @@ namespace SharedLibrary.Commands List CommandList = E.Owner.Manager.GetCommands(); foreach (Command C in CommandList) - { + { if (E.Origin.Level >= C.Permission) { helpResponse.Append(" [^3" + C.Name + "^7] "); @@ -390,7 +390,7 @@ namespace SharedLibrary.Commands } foreach (Player P in db_players) - { + { String mesg = String.Format("[^3{0}^7] [^3@{1}^7] - [{2}^7] - {3} | last seen {4} ago", P.Name, P.DatabaseID, Utilities.ConvertLevelToColor(P.Level), P.IP, P.GetLastConnection()); await E.Origin.Tell(mesg); } @@ -426,7 +426,7 @@ namespace SharedLibrary.Commands String lookingFor = String.Empty; - foreach(String S in P.Names) + foreach (String S in P.Names) { if (S.Contains(E.Data)) lookingFor = S; @@ -434,7 +434,7 @@ namespace SharedLibrary.Commands Player Current = E.Owner.Manager.GetClientDatabase().GetPlayer(P.Number); - if (Current != null) + if (Current != null && Current.Name != lookingFor) { String mesg = String.Format("^1{0} ^7now goes by ^5{1}^7 [^3{2}^7]", lookingFor, Current.Name, Current.DatabaseID); await E.Origin.Tell(mesg); @@ -487,7 +487,7 @@ namespace SharedLibrary.Commands public CReload(String N, String D, String U, Player.Permission P, int args, bool nT) : base(N, D, U, P, args, nT) { } public override async Task ExecuteAsync(Event E) - { + { if (E.Owner.Reload()) await E.Origin.Tell("Sucessfully reloaded configuration files"); else @@ -655,7 +655,7 @@ namespace SharedLibrary.Commands StringBuilder message = new StringBuilder(); var playerAliases = E.Owner.GetAliases(E.Target); - + message.Append("Aliases: "); var names = new List(); @@ -705,5 +705,16 @@ namespace SharedLibrary.Commands } } } + + public class CIP : Command + { + public CIP(String N, String D, String U, Player.Permission P, int args, bool nT) : base(N, D, U, P, args, nT) { } + + public override async Task ExecuteAsync(Event E) + { + await E.Origin.Tell($"Your external IP is ^5{E.Origin.IP}"); + } + } } + \ No newline at end of file diff --git a/SharedLibrary/Database.cs b/SharedLibrary/Database.cs index 7d29d065..40385f49 100644 --- a/SharedLibrary/Database.cs +++ b/SharedLibrary/Database.cs @@ -485,11 +485,11 @@ namespace SharedLibrary public List GetAdmins() { List Admins = new List(); - String Query = String.Format("SELECT * FROM CLIENTS WHERE Level >= '{0}'", (int)Player.Permission.Moderator); + String Query = String.Format("SELECT * FROM CLIENTS WHERE Level >= '{0}' ORDER BY Name", (int)Player.Permission.Trusted); DataTable Result = GetDataTable(Query); foreach (DataRow P in Result.Rows) - Admins.Add(new Player(P["Name"].ToString(), P["npID"].ToString(), (Player.Permission)P["Level"], P["IP"].ToString(), P["UID"].ToString())); + Admins.Add(new Player(P["Name"].ToString(), P["npID"].ToString(), (Player.Permission)P["Level"], P["IP"].ToString(), P["UID"].ToString(), Convert.ToInt32(P["Number"].ToString()))); return Admins; } @@ -634,8 +634,8 @@ namespace SharedLibrary { CommandText = "SELECT * FROM ALIASES WHERE NAMES LIKE @name OR IPS LIKE @ip LIMIT 15" }; - cmd.Parameters.AddWithValue("@name", name); - cmd.Parameters.AddWithValue("@ip", DefaultIP); + cmd.Parameters.AddWithValue("@name", '%' + name + '%'); + cmd.Parameters.AddWithValue("@ip", '%' + DefaultIP + '%'); var Result = GetDataTable(cmd); diff --git a/SharedLibrary/Interfaces/IManager.cs b/SharedLibrary/Interfaces/IManager.cs index 27f8ea4d..99913c33 100644 --- a/SharedLibrary/Interfaces/IManager.cs +++ b/SharedLibrary/Interfaces/IManager.cs @@ -15,5 +15,7 @@ namespace SharedLibrary.Interfaces AliasesDB GetAliasesDatabase(); IList GetMessageTokens(); IList GetActiveClients(); + IList GetAliasClients(Player player); + IList GetAliases(Player player); } } diff --git a/SharedLibrary/Player.cs b/SharedLibrary/Player.cs index c9f51837..9a1e55fc 100644 --- a/SharedLibrary/Player.cs +++ b/SharedLibrary/Player.cs @@ -69,7 +69,7 @@ namespace SharedLibrary LastConnection = DateTime.Now; } - public Player(String n, String id, Player.Permission P, String I, String UID) + public Player(String n, String id, Player.Permission P, String I, String UID, int dbid) { Name = n; NetworkID = id; @@ -77,6 +77,7 @@ namespace SharedLibrary IP = I; ClientID = -1; this.UID = UID; + DatabaseID = dbid; } public Player(string n, string id, int num, Player.Permission l, int cind, String lo, int con, String IP2) diff --git a/SharedLibrary/RCON.cs b/SharedLibrary/RCON.cs index 9da08094..b47e1480 100644 --- a/SharedLibrary/RCON.cs +++ b/SharedLibrary/RCON.cs @@ -22,9 +22,6 @@ namespace SharedLibrary.Network static string[] SendQuery(QueryType Type, Server QueryServer, string Parameters = "") { - if (QueryServer.Throttled) - throw new Exceptions.DvarException("Server is RCON throttled"); - var ServerOOBConnection = new UdpClient(); ServerOOBConnection.Client.SendTimeout = 1000; ServerOOBConnection.Client.ReceiveTimeout = 1000; @@ -97,9 +94,6 @@ namespace SharedLibrary.Network public static async Task> GetDvarAsync(this Server server, string dvarName) { - if (server.Throttled) - throw new Exceptions.DvarException("Server is RCON throttled"); - string[] LineSplit = await Task.FromResult(SendQuery(QueryType.DVAR, server, dvarName)); if (LineSplit.Length != 3) @@ -113,7 +107,7 @@ namespace SharedLibrary.Network if (ValueSplit.Length != 5) { - var e = new Exceptions.DvarException("DVAR does not exist"); + var e = new Exceptions.DvarException($"DVAR \"{dvarName}\" does not exist"); e.Data["dvar_name"] = dvarName; throw e; } @@ -127,25 +121,16 @@ namespace SharedLibrary.Network public static async Task SetDvarAsync(this Server server, string dvarName, object dvarValue) { - if (server.Throttled) - throw new Exceptions.DvarException("Server is RCON throttled"); - await Task.FromResult(SendQuery(QueryType.DVAR, server, $"set {dvarName} {dvarValue}")); } public static async Task ExecuteCommandAsync(this Server server, string commandName) { - if (server.Throttled) - throw new Exceptions.DvarException("Server is RCON throttled"); - return await Task.FromResult(SendQuery(QueryType.COMMAND, server, commandName).Skip(1).ToArray()); } public static async Task> GetStatusAsync(this Server server) { - if (server.Throttled) - throw new Exceptions.DvarException("Server is RCON throttled"); - string[] response = await Task.FromResult(SendQuery(QueryType.DVAR, server, "status")); return Utilities.PlayersFromStatus(response); } diff --git a/SharedLibrary/Server.cs b/SharedLibrary/Server.cs index 6781629e..b7abea14 100644 --- a/SharedLibrary/Server.cs +++ b/SharedLibrary/Server.cs @@ -63,23 +63,6 @@ namespace SharedLibrary return Players.FindAll(x => x != null); } - - /// - /// Get any know aliases ( name or ip based ) from the database - /// - /// Player to scan for aliases - abstract public List GetAliases(Player Origin); - - public List GetPlayerAliases(Player Origin) - { - List databaseIDs = new List(); - - foreach (Aliases A in GetAliases(Origin)) - databaseIDs.Add(A.Number); - - return Manager.GetClientDatabase().GetPlayers(databaseIDs); - } - /// /// Add a player to the server's player list /// @@ -134,6 +117,16 @@ namespace SharedLibrary { return null; } + + /// + /// Legacy method for the alias command + /// + /// + /// + public IList GetAliases(Player P) + { + return Manager.GetAliases(P); + } /// /// Process any server event