From d42a329097002225d300af9bbbf602ea3748151d Mon Sep 17 00:00:00 2001 From: RaidMax Date: Sat, 22 Aug 2015 01:04:30 -0500 Subject: [PATCH] more plugin tweaks, added console interface! --- Admin/IW4M ADMIN.csproj | 5 +- Admin/Main.cs | 13 + Admin/Manager.cs | 13 +- Admin/Plugins.cs | 14 +- Admin/Server.cs | 250 +++++++++--------- Admin/lib/SharedLibary.dll | Bin 37888 -> 38400 bytes Admin/plugins/SamplePlugin.dll | Bin 7680 -> 7680 bytes Admin/plugins/Webfront Plugin.dll | Bin 24576 -> 0 bytes Admin/plugins/WebfrontPlugin.dll | Bin 0 -> 25600 bytes Admin/webfront/graph.html | 1 + Admin/webfront/header.html | 4 +- Release Build/lib/SharedLibary.dll | Bin 37888 -> 38400 bytes Release Build/plugins/SamplePlugin.dll | Bin 7680 -> 7680 bytes SamplePlugin/Main.cs | 13 +- SharedLibary/Event.cs | 18 +- .../Miscellaneous.cs | 6 +- SharedLibary/Player.cs | 1 + SharedLibary/Plugin.cs | 8 +- SharedLibary/Server.cs | 9 + SharedLibary/SharedLibrary.csproj | 1 + SharedLibary/Utilities.cs | 10 +- Webfront Plugin/Framework.cs | 21 +- Webfront Plugin/Main.cs | 12 +- Webfront Plugin/Webfront Plugin.csproj | 2 +- 24 files changed, 235 insertions(+), 166 deletions(-) delete mode 100644 Admin/plugins/Webfront Plugin.dll create mode 100644 Admin/plugins/WebfrontPlugin.dll rename Admin/Helpers.cs => SharedLibary/Miscellaneous.cs (72%) diff --git a/Admin/IW4M ADMIN.csproj b/Admin/IW4M ADMIN.csproj index 71362e7a0..1c25279d7 100644 --- a/Admin/IW4M ADMIN.csproj +++ b/Admin/IW4M ADMIN.csproj @@ -107,7 +107,6 @@ - @@ -141,7 +140,7 @@ PreserveNewest - + PreserveNewest @@ -157,7 +156,7 @@ Always - Always + PreserveNewest Always diff --git a/Admin/Main.cs b/Admin/Main.cs index 3d38694d0..0a24a7505 100644 --- a/Admin/Main.cs +++ b/Admin/Main.cs @@ -44,6 +44,19 @@ namespace IW4MAdmin if (serverManager.getServers() != null) Program.getManager().mainLog.Write("IW4M Now Initialized!", Log.Level.Production); + String userInput; + Server serverToExecuteOn = serverManager.getServers()[0]; + Player Origin = new Player("IW4MAdmin Console", "", -1, Player.Permission.Console, -1, "", 0, ""); + + do + { + userInput = Console.ReadLine(); + Event E = new Event(Event.GType.Say, userInput, Origin, null, serverToExecuteOn); + Origin.lastEvent = E; + serverToExecuteOn.processEvent(E); + Console.Write('>'); + + } while (userInput != null && serverManager.isRunning()); serverMGRThread.Join(); serverManager.mainLog.Write("Shutting down IW4MAdmin...", Log.Level.Debug); diff --git a/Admin/Manager.cs b/Admin/Manager.cs index 289276849..a365753aa 100644 --- a/Admin/Manager.cs +++ b/Admin/Manager.cs @@ -60,16 +60,20 @@ namespace IW4MAdmin if (S == null) continue; - if (!isIW4MStillRunning(S.pID())) + if (!isIW4MStillRunning(S.pID()) || !S.isRunning) { Thread Defunct = ThreadList[S.pID()]; + + if (!S.isRunning) + Utilities.shutdownInterface(S.pID()); + S.isRunning = false; if (Defunct != null) { Defunct.Join(); ThreadList[S.pID()] = null; } - mainLog.Write("Server with PID #" + S.pID() + " no longer appears to be running.", Log.Level.Debug); + mainLog.Write("Server with PID #" + S.pID() + " can no longer be monitored.", Log.Level.Debug); activePIDs.Remove(S.pID()); defunctServers.Add(S); } @@ -98,6 +102,11 @@ namespace IW4MAdmin ThreadList[T.Key].Join(); } + public bool isRunning() + { + return activePIDs.Count != 0; + } + public List getServers() { return Servers; diff --git a/Admin/Plugins.cs b/Admin/Plugins.cs index 9b73557a7..43a7803b2 100644 --- a/Admin/Plugins.cs +++ b/Admin/Plugins.cs @@ -40,6 +40,7 @@ namespace IW4MAdmin assemblies.Add(assembly); } + int totalLoaded = 0; foreach (Assembly Plugin in assemblies) { if (Plugin != null) @@ -47,13 +48,14 @@ namespace IW4MAdmin Type[] types = Plugin.GetTypes(); foreach(Type assemblyType in types) { - if(assemblyType.IsClass && assemblyType.BaseType.Name == "Notify") + if(assemblyType.IsClass && assemblyType.BaseType.Name == "Plugin") { Object notifyObject = Activator.CreateInstance(assemblyType); Plugin newNotify = (Plugin)notifyObject; potentialNotifies.Add(newNotify); newNotify.onLoad(); - Program.getManager().mainLog.Write("Loaded event plugin \"" + assemblyType.Name + "\"", Log.Level.All); + Program.getManager().mainLog.Write("Loaded plugin \"" + newNotify.Name + "\"" + " [" + newNotify.Version + "]", Log.Level.Debug); + totalLoaded++; } else if (assemblyType.IsClass && assemblyType.BaseType.Name == "Command") @@ -61,14 +63,14 @@ namespace IW4MAdmin Object commandObject = Activator.CreateInstance(assemblyType); Command newCommand = (Command)commandObject; potentialCommands.Add(newCommand); - Program.getManager().mainLog.Write("Loaded command plugin \"" + newCommand.Name + "\"", Log.Level.All); + Program.getManager().mainLog.Write("Registered command \"" + newCommand.Name + "\"", Log.Level.Debug); + totalLoaded++; } - - else - Program.getManager().mainLog.Write("Ignoring invalid plugin \"" + assemblyType.Name + "\"", Log.Level.All); } } } + + Program.getManager().mainLog.Write("Loaded " + totalLoaded + " plugins.", Log.Level.Production); return true; } } diff --git a/Admin/Server.cs b/Admin/Server.cs index 7b35cb76a..bcf9424d0 100644 --- a/Admin/Server.cs +++ b/Admin/Server.cs @@ -14,7 +14,6 @@ namespace IW4MAdmin { public IW4MServer(string address, int port, string password, int H, int PID) : base(address, port, password, H, PID) { - playerHistory = new Queue(); commandQueue = new Queue(); } @@ -429,8 +428,22 @@ namespace IW4MAdmin { Event curEvent = events.Peek(); processEvent(curEvent); - foreach (Notify E in PluginImporter.potentialNotifies) - E.onEvent(curEvent); + foreach (Plugin P in PluginImporter.potentialNotifies) + { + try + { + P.onEvent(curEvent); + } + + catch (Exception Except) + { + Log.Write(String.Format("The plugin \"{0}\" (v{1}) generated an error. ( see log )", P.Name, P.Version), Log.Level.Production); + Log.Write(String.Format("Error Message: {0}", Except.Message), Log.Level.Debug); + Log.Write(String.Format("Error Trace: {0}", Except.StackTrace), Log.Level.Debug); + continue; + } + + } events.Dequeue(); } if (commandQueue.Count > 0) @@ -465,6 +478,7 @@ namespace IW4MAdmin #if DEBUG == false Broadcast("IW4M Admin is now ^2ONLINE"); + int numExceptions = 0; #endif while (isRunning) @@ -480,7 +494,7 @@ namespace IW4MAdmin { while (playerHistory.Count > 144 ) // 12 times a minute for 12 hours playerHistory.Dequeue(); - playerHistory.Enqueue(new pHistory(lastCount, clientnum)); + playerHistory.Enqueue(new PlayerHistory(lastCount, clientnum)); playerCountStart = DateTime.Now; } @@ -493,21 +507,9 @@ namespace IW4MAdmin else nextMessage++; start = DateTime.Now; - //if (timesFailed <= 3) - // HB.Send(); - - String checkVer = new Connection("http://raidmax.org/IW4M/Admin/version.php").Read(); - double checkVerNum; - double.TryParse(checkVer, out checkVerNum); - if (checkVerNum != Program.Version && checkVerNum != 0 && !checkedForOutdate) - { - messages.Add("^5IW4M Admin ^7is outdated. Please ^5update ^7to version " + checkVerNum); - checkedForOutdate = true; - } - } - if ((DateTime.Now - lastPoll).Milliseconds > 750) + if ((DateTime.Now - lastPoll).Milliseconds > 300) { int numberRead = 0; int activeClients = 0; @@ -583,8 +585,18 @@ namespace IW4MAdmin #if DEBUG == false catch (Exception E) { - Log.Write("Something unexpected occured. Hopefully we can ignore it :)", Log.Level.All); - continue; + numExceptions++; + Log.Write("Unexpected error on \"" + hostname + "\"", Log.Level.Debug); + Log.Write("Error Message: " + E.Message, Log.Level.Debug); + Log.Write("Error Trace: " + E.StackTrace, Log.Level.Debug); + if (numExceptions < 30) + continue; + else + { + Log.Write("Maximum number of unhandled exceptions reached for \"" + hostname + "\"", Log.Level.Production); + events.Enqueue(new Event(Event.GType.Stop, "Monitoring stopping because of max exceptions reached", null, null, this)); + isRunning = false; + } } #endif @@ -596,20 +608,20 @@ namespace IW4MAdmin override public bool intializeBasics() { - try - { - // inject our dll - if (!Utilities.initalizeInterface(PID)) - { - Log.Write("Could not load IW4MAdmin interface!", Log.Level.Debug); - return false; - } + try + { + // inject our dll + if (!Utilities.initalizeInterface(PID)) + { + Log.Write("Could not load IW4MAdmin interface!", Log.Level.Debug); + return false; + } // basic info dvars - hostname = SharedLibrary.Utilities.stripColors(getDvar("sv_hostname").current); - mapname = getDvar("mapname").current; - IW_Ver = getDvar("shortversion").current; - maxClients = -1; + hostname = SharedLibrary.Utilities.stripColors(getDvar("sv_hostname").current); + mapname = getDvar("mapname").current; + IW_Ver = getDvar("shortversion").current; + maxClients = -1; Int32.TryParse(getDvar("party_maxplayers").current, out maxClients); if (maxClients == -1) @@ -618,46 +630,47 @@ namespace IW4MAdmin return false; } - Gametype = getDvar("g_gametype").current; + Gametype = getDvar("g_gametype").current; // important log variables - Basepath = getDvar("fs_basepath").current; - Mod = getDvar("fs_game").current; - logPath = getDvar("g_log").current; - int oneLog = -1; + Basepath = getDvar("fs_basepath").current; + Mod = getDvar("fs_game").current; + logPath = getDvar("g_log").current; + int oneLog = -1; Int32.TryParse(getDvar("iw4m_onelog").current, out oneLog); - if (oneLog == -1) - { - Log.Write("Could not get iw4m_onelog value", Log.Level.Debug); - return false; - } + if (oneLog == -1) + { + Log.Write("Could not get iw4m_onelog value", Log.Level.Debug); + return false; + } // our settings - setDvar("sv_kickBanTime", "3600"); // 1 hour - setDvar("g_logSync", "1"); // yas + setDvar("sv_kickBanTime", "3600"); // 1 hour + setDvar("g_logSync", "1"); // yas - if (Mod == String.Empty || oneLog == 1) - logPath = Basepath + '\\' + "m2demo" + '\\' + logPath; - else - logPath = Basepath + '\\' + Mod + '\\' + logPath; + if (Mod == String.Empty || oneLog == 1) + logPath = Basepath + '\\' + "m2demo" + '\\' + logPath; + else + logPath = Basepath + '\\' + Mod + '\\' + logPath; - if (!File.Exists(logPath)) - { - Log.Write("Gamelog `" + logPath + "` does not exist!", Log.Level.All); - return false; - } + if (!File.Exists(logPath)) + { + Log.Write("Gamelog `" + logPath + "` does not exist!", Log.Level.All); + return false; + } - logFile = new IFile(logPath); - Log.Write("Log file is " + logPath, Log.Level.Debug); - Log.Write("Now monitoring " + getName(), Log.Level.Production); - events.Enqueue(new Event(Event.GType.Start, "Server started", null, null, this)); - Bans = clientDB.getBans(); - return true; + logFile = new IFile(logPath); + Log.Write("Log file is " + logPath, Log.Level.Debug); + Log.Write("Now monitoring " + getName(), Log.Level.Production); + events.Enqueue(new Event(Event.GType.Start, "Server started", null, null, this)); + Bans = clientDB.getBans(); + return true; } + catch (Exception E) { - Log.Write("Error during initialization - " + E.Message +"--" + E.StackTrace, Log.Level.All); + Log.Write("Error during initialization - " + E.Message + "--" + E.StackTrace, Log.Level.All); return false; } } @@ -696,18 +709,6 @@ namespace IW4MAdmin if (E.Origin != E.Target) { - /*E.Origin.stats.Kills += 1; - E.Origin.stats.updateKDR(); - - E.Target.stats.Deaths += 1; - E.Target.stats.updateKDR(); - - //Skills.updateNewSkill(E.Origin, E.Target); - statDB.updatePlayer(E.Origin); - statDB.updatePlayer(E.Target); - - totalKills++;*/ - Log.Write(E.Origin.Name + " killed " + E.Target.Name + " with a " + E.Data, Log.Level.Debug); events.Enqueue(new Event(Event.GType.Death, E.Data, E.Target, null, this)); } @@ -720,7 +721,6 @@ namespace IW4MAdmin if (E.Type == Event.GType.Say) { - if (E.Data.Length < 2) // ITS A LIE! return false; @@ -738,12 +738,53 @@ namespace IW4MAdmin return false; } - if (E.Data.Substring(0, 1) != "!") // Not a command so who gives an F? + if (E.Data.Substring(0, 1) == "!" || E.Origin.Level == Player.Permission.Console) + { + Command C = E.isValidCMD(commands); + + if (C != null) + { + C = processCommand(E, C); + if (C != null) + { + if (C.needsTarget && E.Target == null) + { + Log.Write("Requested event requiring target does not have a target!", Log.Level.Debug); + return false; + } + + try + { + C.Execute(E); + } + + catch (Exception Except) + { + Log.Write(String.Format("A command request \"{0}\" generated an error.", C.Name, Log.Level.Debug)); + Log.Write(String.Format("Error Message: {0}", Except.Message), Log.Level.Debug); + Log.Write(String.Format("Error Trace: {0}", Except.StackTrace), Log.Level.Debug); + return false; + } + return true; + } + + else + { + Log.Write("Player didn't properly enter command - " + E.Origin.Name, Log.Level.Debug); + return true; + } + } + + else + E.Origin.Tell("You entered an invalid command!"); + } + + else // Not a command so who gives an F? { E.Data = SharedLibrary.Utilities.stripColors(SharedLibrary.Utilities.cleanChars(E.Data)); if (E.Data.Length > 50) E.Data = E.Data.Substring(0, 50) + "..."; - while (chatHistory.Count > Math.Ceiling((double)clientnum/2)) + while (chatHistory.Count > Math.Ceiling((double)clientnum / 2)) chatHistory.RemoveAt(0); chatHistory.Add(new Chat(E.Origin, E.Data, DateTime.Now)); @@ -751,32 +792,6 @@ namespace IW4MAdmin return true; } - Command C = E.isValidCMD(commands); - - if (C != null) - { - C = processCommand(E, C); - if (C != null) - { - if (C.needsTarget && E.Target == null) - { - Log.Write("Requested event requiring target does not have a target!", Log.Level.Debug); - return false; - } - C.Execute(E); - return true; - } - - else - { - Log.Write("Player didn't properly enter command - " + E.Origin.Name, Log.Level.Debug); - return true; - } - } - - else - E.Origin.Tell("You entered an invalid command!"); - return true; } @@ -784,35 +799,13 @@ namespace IW4MAdmin { Log.Write("New map loaded - " + clientnum + " active players", Log.Level.Debug); - Dictionary infoResponseDict = new Dictionary(); - String[] infoResponse = E.Data.Split('\\'); - - for (int i = 0; i < infoResponse.Length; i++) - { - if (i % 2 == 0 || infoResponse[i] == String.Empty) - continue; - infoResponseDict.Add(infoResponse[i], infoResponse[i + 1]); - } - - String newMapName = null; - infoResponseDict.TryGetValue("mapname", out newMapName); - - if (newMapName != null) - { - try - { - Map newMap = maps.Find(m => m.Name.Equals(newMapName)); - mapname = newMap.Alias; - } - - catch (Exception) - { - Log.Write(mapname + " doesn't appear to be in the maps.cfg", Log.Level.Debug); - } - } + String newMapName = getDvar("mapname").current; + Map newMap = maps.Find(m => m.Name.Equals(newMapName)); + if (newMap != null) + mapname = newMap.Alias; else - Log.Write("Could not get new mapname from InitGame line!", Log.Level.Debug); + mapname = newMapName; return true; } @@ -941,8 +934,6 @@ namespace IW4MAdmin commands.Add(new Find("find", "find player in database. syntax: !find ", "f", Player.Permission.SeniorAdmin, 1, false)); commands.Add(new Rules("rules", "list server rules. syntax: !rules", "r", Player.Permission.User, 0, false)); commands.Add(new PrivateMessage("privatemessage", "send message to other player. syntax: !pm ", "pm", Player.Permission.User, 2, true)); - //commands.Add(new _Stats("stats", "view your stats or another player's. syntax: !stats", "xlrstats", Player.Permission.User, 0, true)); - //commands.Add(new TopStats("topstats", "view the top 4 players on this server. syntax: !topstats", "xlrtopstats", Player.Permission.User, 0, false)); commands.Add(new Reload("reload", "reload configurations. syntax: !reload", "reload", Player.Permission.Owner, 0, false)); commands.Add(new Balance("balance", "balance teams. syntax !balance", "bal", Player.Permission.Moderator, 0, false)); commands.Add(new GoTo("goto", "teleport to selected player. syntax !goto", "go", Player.Permission.SeniorAdmin, 1, true)); @@ -962,7 +953,6 @@ namespace IW4MAdmin } //Objects - public Queue playerHistory; private Queue commandQueue; //Info diff --git a/Admin/lib/SharedLibary.dll b/Admin/lib/SharedLibary.dll index e2fd68cffc2f1d8f0b3f043b500da62c72fccfbb..ce631ff946feb019822853f668e18c1cd5de112e 100644 GIT binary patch delta 14239 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 delta 13607 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 delta 1591 zcmZ9MdrX^E7{;G-zSC0L!dhUZ;!+?fv}Mb=DMSRoAK{8K#>`gH<^1y zxtz>19~bdJl(VhhU3?^LI340!>i}U2-xjk?)(MySgq$P&MyGI_{YC-xv{4gbNqa?O zY#A6Fa!`krWo(dPKj5s`D2;Hy5`cNxD3B{K-KsRvB{66WY+z!bgs{gRpy8V-V8c~o zaIFzvYfN2l$k-eWd$^SK%GeIMRW{6Uv;p4OOU$JkhJ#$nf~rVZEeFatJ6ujUVphlh z$5z919M*ZO-+%E?mbFdp&dHI3%L=WQQ*6m2@D3I8t<{~alVg(Zb^FU_Ir_#LKW_Hf zib||rOmgXJrtqIbS>0jmqBP&Ib#0qvmrxwI#xajGL+!({-v0eV><;aEop@F)Dh56R(Ro^0?+%&EGUVyaY}} zG@CSgG@p|r(uoDlCGC8wDUD0A9X_tbiDu&l!-)sULQH69-guh+i<+;t>ETVy4>>6x z%X-o^<7d8BtNbb(QPn{{qB*CzNILO}vI?Eo{6$$y$+V4_^BG$z9mo_OG@=|{-s~*$ z97VVMZ5p^f5BHeH+{xbq=|rlF{U9 zR4i&)rzn)pm5JMsfp^mpt282$34s=#xWG=$wBDt4N1BO$1Bu;Q?;$0+NCWqgihez; zWi@EFXztS7t9id>ujT>GQO(E5HcV@s)O=p^6|xgY$!;W;IPm<)C?a^)=)-v&F$PeL zMI($AosHm2V}jXlnDuHWK!y>(iZO>P5Ne*GxN zXZR0It1l1`@2IcgO^6ff0)pgEh=|kbGI>`0ifZwlQX+th$|>r_VdRS-77)i~)MB65 zjN1_>C-4=StDQoOP=_>c)NI#uVFUdgTKC~3^%y=QyK#uD9>OUR)uqQZAI6h-86V*) zkDsTHKUh*yTahAPGmkl2MTcp)9<|>yFx diff --git a/Admin/plugins/Webfront Plugin.dll b/Admin/plugins/Webfront Plugin.dll deleted file mode 100644 index 448aa95fb889b9d07f4d430b5096e7f2ffe777cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 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 diff --git a/Admin/plugins/WebfrontPlugin.dll b/Admin/plugins/WebfrontPlugin.dll new file mode 100644 index 0000000000000000000000000000000000000000..38d4afa92b4d402e1b527e55a2fefd61ec0cf610 GIT binary patch literal 25600 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 +{{GRAPH}} diff --git a/Admin/webfront/header.html b/Admin/webfront/header.html index 81dac35b7..71dc83cda 100644 --- a/Admin/webfront/header.html +++ b/Admin/webfront/header.html @@ -414,8 +414,10 @@