Enable/Disable fast restart plugin via config
Deleted legacy connection & heartbeat classes Hopefully fixed issues relating to certain web requests throwing recoverable error Modified Serializer class slightly
This commit is contained in:
parent
3ca73a5a7a
commit
bd99add434
@ -1,56 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
|
||||
namespace IW4MAdmin
|
||||
{
|
||||
class Connection
|
||||
{
|
||||
public Connection(String Loc)
|
||||
{
|
||||
Location = Loc;
|
||||
ConnectionHandle = WebRequest.Create(Location);
|
||||
ConnectionHandle.Proxy = null;
|
||||
ConnectionHandle.Timeout = 1000;
|
||||
}
|
||||
|
||||
public String Read()
|
||||
{
|
||||
try
|
||||
{
|
||||
WebResponse Resp = ConnectionHandle.GetResponse();
|
||||
StreamReader data_in = new StreamReader(Resp.GetResponseStream());
|
||||
String result = data_in.ReadToEnd();
|
||||
|
||||
data_in.Close();
|
||||
Resp.Close();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
catch (System.Net.WebException)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void Request(String data)
|
||||
{
|
||||
try
|
||||
{
|
||||
WebResponse Resp = WebRequest.Create(data).GetResponse();
|
||||
Resp.Close();
|
||||
}
|
||||
|
||||
catch (System.Net.WebException)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private String Location;
|
||||
private WebRequest ConnectionHandle;
|
||||
}
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using SharedLibrary;
|
||||
|
||||
namespace IW4MAdmin
|
||||
{
|
||||
class Heartbeat
|
||||
{
|
||||
public Heartbeat(Server I)
|
||||
{
|
||||
Handle = new Connection("http://raidmax.org/IW4M/Admin");
|
||||
}
|
||||
|
||||
public void Send(Server S)
|
||||
{
|
||||
String URI = String.Format("http://raidmax.org/IW4M/Admin/heartbeat.php?port={0}&name={1}&map={2}&players={3}&version={4}&gametype={5}&servercount={6}", S.getPort(), S.getName(), S.CurrentMap.Name, S.getPlayers().Count, IW4MAdmin.Program.Version.ToString(), S.Gametype, Manager.GetInstance().Servers);
|
||||
// blind fire
|
||||
Handle.Request(URI);
|
||||
}
|
||||
|
||||
private Connection Handle;
|
||||
}
|
||||
}
|
@ -124,8 +124,6 @@
|
||||
<ItemGroup>
|
||||
<Compile Include="Commands.cs" />
|
||||
<Compile Include="Config.cs" />
|
||||
<Compile Include="Connection.cs" />
|
||||
<Compile Include="Heartbeat.cs" />
|
||||
<Compile Include="Kayak.cs" />
|
||||
<Compile Include="Logger.cs" />
|
||||
<Compile Include="Main.cs" />
|
||||
@ -334,6 +332,8 @@ copy /Y "$(TargetDir)$(TargetName).exe" "$(SolutionDir)BUILD"
|
||||
copy /Y "$(TargetDir)IW4MAdmin.exe.config" "$(SolutionDir)BUILD"
|
||||
copy /Y "$(ProjectDir)lib\Kayak.dll" "$(SolutionDir)BUILD\lib"
|
||||
|
||||
xcopy /Y /I /E "$(ProjectDir)webfront\*" "$(SolutionDir)BUILD\Webfront"
|
||||
|
||||
|
||||
if $(ConfigurationName) == Release powershell.exe -file "$(SolutionDir)DEPLOY\publish_nightly.ps1" 1.3
|
||||
if $(ConfigurationName) == Release-Stable powershell.exe -file "$(SolutionDir)DEPLOY\publish_stable.ps1" 1.3</PostBuildEvent>
|
||||
|
@ -18,7 +18,7 @@ namespace IW4MAdmin
|
||||
|
||||
if (e.InnerException != null)
|
||||
{
|
||||
Manager.GetInstance().Logger.WriteDebug($"Inner Execption: {e.InnerException.Message}");
|
||||
Manager.GetInstance().Logger.WriteDebug($"Inner Exception: {e.InnerException.Message}");
|
||||
Manager.GetInstance().Logger.WriteDebug($"Inner Stack Trace: {e.InnerException.StackTrace}");
|
||||
}
|
||||
|
||||
@ -34,14 +34,13 @@ namespace IW4MAdmin
|
||||
{
|
||||
public void OnRequest(HttpRequestHead request, IDataProducer requestBody, IHttpResponseDelegate response, string IP)
|
||||
{
|
||||
// Program.getManager().mainLog.Write("HTTP request received", SharedLibrary.Log.Level.Debug);
|
||||
NameValueCollection querySet = new NameValueCollection();
|
||||
|
||||
if (request.QueryString != null)
|
||||
querySet = System.Web.HttpUtility.ParseQueryString(SharedLibrary.Utilities.removeNastyChars(request.QueryString));
|
||||
|
||||
querySet.Set("IP", IP);
|
||||
SharedLibrary.HttpResponse requestedPage = WebService.getPage(request.Path, querySet, request.Headers);
|
||||
SharedLibrary.HttpResponse requestedPage = WebService.GetPage(request.Path, querySet, request.Headers);
|
||||
|
||||
var headers = new HttpResponseHead()
|
||||
{
|
||||
@ -102,7 +101,7 @@ namespace IW4MAdmin
|
||||
|
||||
public void OnError(Exception error)
|
||||
{
|
||||
errorCallback(error);
|
||||
errorCallback?.Invoke(error);
|
||||
}
|
||||
|
||||
public void OnEnd()
|
||||
|
@ -102,7 +102,7 @@ namespace IW4MAdmin
|
||||
|
||||
}
|
||||
|
||||
webServiceTask = WebService.getScheduler();
|
||||
webServiceTask = WebService.GetScheduler();
|
||||
|
||||
WebThread = new Thread(webServiceTask.Start)
|
||||
{
|
||||
|
@ -1,12 +1,12 @@
|
||||
using System;
|
||||
using Kayak;
|
||||
using Kayak.Http;
|
||||
using SharedLibrary;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Kayak;
|
||||
using Kayak.Http;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using SharedLibrary;
|
||||
|
||||
namespace IW4MAdmin
|
||||
{
|
||||
@ -14,7 +14,7 @@ namespace IW4MAdmin
|
||||
{
|
||||
public static IServer webService;
|
||||
|
||||
public static IScheduler getScheduler()
|
||||
public static IScheduler GetScheduler()
|
||||
{
|
||||
var webScheduler = Kayak.KayakScheduler.Factory.Create(new Scheduler());
|
||||
webService = KayakServer.Factory.CreateHttp(new Request(), webScheduler);
|
||||
@ -30,14 +30,14 @@ namespace IW4MAdmin
|
||||
SharedLibrary.WebService.pageList.Add(new ConsoleJSON());
|
||||
SharedLibrary.WebService.pageList.Add(new PubbansJSON());
|
||||
|
||||
Thread scheduleThread = new Thread(() => { scheduleThreadStart(webScheduler, webService); });
|
||||
Thread scheduleThread = new Thread(() => { ScheduleThreadStart(webScheduler, webService); });
|
||||
scheduleThread.Name = "Web Service Thread";
|
||||
scheduleThread.Start();
|
||||
|
||||
return webScheduler;
|
||||
}
|
||||
|
||||
private static void scheduleThreadStart(IScheduler S, IServer ss)
|
||||
private static void ScheduleThreadStart(IScheduler S, IServer ss)
|
||||
{
|
||||
try
|
||||
{
|
||||
@ -65,8 +65,14 @@ namespace IW4MAdmin
|
||||
}
|
||||
}
|
||||
|
||||
public static HttpResponse getPage(string path, System.Collections.Specialized.NameValueCollection queryset, IDictionary<string, string> headers)
|
||||
public static HttpResponse GetPage(string path, System.Collections.Specialized.NameValueCollection queryset, IDictionary<string, string> headers)
|
||||
{
|
||||
if (SharedLibrary.WebService.pageList == null || SharedLibrary.WebService.pageList.Count == 0)
|
||||
return new HttpResponse() { content = "Error: page list not initialized!", contentType = "text/plaintext" };
|
||||
|
||||
if (path == null)
|
||||
return new HttpResponse() { content = "Error: no path specified", contentType = "text/plaintext" };
|
||||
|
||||
IPage requestedPage = SharedLibrary.WebService.pageList.Find(x => x.getPath().ToLower() == path.ToLower());
|
||||
|
||||
if (requestedPage != null)
|
||||
|
Binary file not shown.
@ -3,6 +3,7 @@ using SharedLibrary;
|
||||
using SharedLibrary.Interfaces;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
#if DEBUG
|
||||
namespace Auto_Restart_Plugin
|
||||
{
|
||||
public class Main : IPlugin
|
||||
@ -70,3 +71,4 @@ namespace Auto_Restart_Plugin
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -10,12 +10,42 @@ using SharedLibrary.Network;
|
||||
|
||||
namespace Plugin
|
||||
{
|
||||
public class FastRestartConfig : Serialize<FastRestartConfig>
|
||||
{
|
||||
public bool Enabled;
|
||||
}
|
||||
|
||||
public class CEnableFastRestart : Command
|
||||
{
|
||||
public CEnableFastRestart() : base("frenable", "enable fast restarting at the end of a map. syntax: !fre", "fre", Player.Permission.SeniorAdmin, 0, false) { }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
{
|
||||
FastRestartPlugin.Config = new FastRestartConfig() { Enabled = true };
|
||||
Serialize<FastRestartConfig>.Write($"config/fastrestartconfig_{E.Owner}.cfg", FastRestartPlugin.Config);
|
||||
await E.Origin.Tell("Fast restarting is now enabled for this server");
|
||||
}
|
||||
}
|
||||
|
||||
public class CDisableFastRestart : Command
|
||||
{
|
||||
public CDisableFastRestart() : base("fredisable", "disable fast restarting at the end of a map. syntax: !frd", "frd", Player.Permission.SeniorAdmin, 0, false) { }
|
||||
|
||||
public override async Task ExecuteAsync(Event E)
|
||||
{
|
||||
FastRestartPlugin.Config = new FastRestartConfig() { Enabled = false };
|
||||
Serialize<FastRestartConfig>.Write($"config/fastrestartconfig_{E.Owner}.cfg", FastRestartPlugin.Config);
|
||||
await E.Origin.Tell("Fast restarting is now disabled for this server");
|
||||
}
|
||||
}
|
||||
|
||||
public class FastRestartPlugin : IPlugin
|
||||
{
|
||||
bool MatchEnded;
|
||||
DateTime MatchEndTime;
|
||||
public static FastRestartConfig Config;
|
||||
|
||||
public string Name { get { return "Fast Restart"; } }
|
||||
public string Name { get { return "Fast Restarter"; } }
|
||||
|
||||
public float Version { get { return 1.0f; } }
|
||||
|
||||
@ -28,27 +58,39 @@ namespace Plugin
|
||||
try
|
||||
{
|
||||
await S.GetDvarAsync<int>("scr_intermission_time");
|
||||
Config = Serialize<FastRestartConfig>.Read($"config/fastrestartconfig_{E.Owner}.cfg");
|
||||
}
|
||||
|
||||
catch (SharedLibrary.Exceptions.DvarException)
|
||||
{
|
||||
await S.ExecuteCommandAsync("set scr_intermission_time 20");
|
||||
}
|
||||
|
||||
catch (SharedLibrary.Exceptions.SerializeException)
|
||||
{
|
||||
Config = new FastRestartConfig() { Enabled = false };
|
||||
Serialize<FastRestartConfig>.Write($"config/fastrestartconfig_{E.Owner}.cfg", Config);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async Task OnLoadAsync()
|
||||
public Task OnLoadAsync()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public async Task OnTickAsync(Server S)
|
||||
{
|
||||
if (!Config.Enabled)
|
||||
return;
|
||||
|
||||
MatchEnded = (await S.GetDvarAsync<int>("scr_gameended")).Value == 1;
|
||||
|
||||
if (MatchEnded && MatchEndTime == DateTime.MinValue)
|
||||
MatchEndTime = DateTime.Now;
|
||||
|
||||
if (MatchEnded && (DateTime.Now - MatchEndTime).TotalSeconds > (await S.GetDvarAsync<int>("scr_intermission_time")).Value - 5)
|
||||
// I'm pretty sure the timelength from game ended to scoreboard popup is 2000ms
|
||||
if (MatchEnded && (DateTime.Now - MatchEndTime).TotalSeconds >= ((await S.GetDvarAsync<int>("scr_intermission_time")).Value - 2))
|
||||
{
|
||||
await S.ExecuteCommandAsync("fast_restart");
|
||||
MatchEndTime = DateTime.MinValue;
|
||||
|
13
SharedLibrary/Exceptions/SerializationException.cs
Normal file
13
SharedLibrary/Exceptions/SerializationException.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SharedLibrary.Exceptions
|
||||
{
|
||||
public class SerializeException : Exception
|
||||
{
|
||||
public SerializeException(string msg) : base(msg) { }
|
||||
}
|
||||
}
|
@ -11,11 +11,6 @@ namespace SharedLibrary.Interfaces
|
||||
void Write();
|
||||
}
|
||||
|
||||
public class SerializeException : Exception
|
||||
{
|
||||
public SerializeException(string msg) : base(msg) { }
|
||||
}
|
||||
|
||||
public class Serialize<T> : ISerializable<T>
|
||||
{
|
||||
public static T Read(string filename)
|
||||
@ -28,7 +23,7 @@ namespace SharedLibrary.Interfaces
|
||||
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new SerializeException($"Could not desialize file {filename}: {e.Message}");
|
||||
throw new Exceptions.SerializeException($"Could not desialize file {filename}: {e.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
@ -42,10 +37,24 @@ namespace SharedLibrary.Interfaces
|
||||
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new SerializeException($"Could not serialize file {Filename()}: {e.Message}");
|
||||
throw new Exceptions.SerializeException($"Could not serialize file {Filename()}: {e.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
public virtual string Filename() { return this.ToString(); }
|
||||
public static void Write(string filename, T data)
|
||||
{
|
||||
try
|
||||
{
|
||||
string configText = Newtonsoft.Json.JsonConvert.SerializeObject(data);
|
||||
File.WriteAllText(filename, configText);
|
||||
}
|
||||
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new Exceptions.SerializeException($"Could not serialize file {filename}: {e.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
public virtual string Filename() { return ToString(); }
|
||||
}
|
||||
}
|
||||
|
@ -421,6 +421,11 @@ namespace SharedLibrary
|
||||
ruleFile.Close();
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{IP}_{Port}";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load up the built in commands
|
||||
/// </summary>
|
||||
|
@ -71,6 +71,7 @@
|
||||
<Compile Include="Exceptions\CommandException.cs" />
|
||||
<Compile Include="Exceptions\DvarException.cs" />
|
||||
<Compile Include="Exceptions\NetworkException.cs" />
|
||||
<Compile Include="Exceptions\SerializationException.cs" />
|
||||
<Compile Include="Exceptions\ServerException.cs" />
|
||||
<Compile Include="Interfaces\ILogger.cs" />
|
||||
<Compile Include="Interfaces\IManager.cs" />
|
||||
|
@ -6,6 +6,7 @@ using SharedLibrary.Network;
|
||||
using SharedLibrary.Interfaces;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
#if DEBUG
|
||||
namespace Votemap_Plugin
|
||||
{
|
||||
/// <summary>
|
||||
@ -305,3 +306,4 @@ namespace Votemap_Plugin
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user