ZeroLauncher/Manager/WebApiManager.cs

118 lines
5.1 KiB
C#
Raw Permalink Normal View History

2024-03-07 21:04:59 +08:00
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Text;
namespace Zerolauncher.Manager
{
2024-07-13 15:32:39 +08:00
internal static class WebApiManager
2024-03-07 21:04:59 +08:00
{
2024-07-13 15:32:39 +08:00
static readonly HttpListener Listener = new HttpListener();
static readonly CancellationTokenSource Cts = new CancellationTokenSource();
2024-03-07 21:04:59 +08:00
public static async Task StartListener()
{
2024-07-13 15:32:39 +08:00
Listener.Prefixes.Add("http://127.0.0.1:7233/");
Listener.Start();
2024-03-07 21:04:59 +08:00
Trace.WriteLine("Listening...");
2024-07-13 15:32:39 +08:00
while (!Cts.Token.IsCancellationRequested)
2024-03-07 21:04:59 +08:00
{
2024-07-13 15:32:39 +08:00
var context = await Listener.GetContextAsync();
var request = context.Request;
var response = context.Response;
2024-03-07 21:04:59 +08:00
var raw = request.RawUrl;
2024-07-13 15:32:39 +08:00
ResponseBody? rb = null;
2024-03-07 21:04:59 +08:00
if (raw != null && raw.Contains("?"))
{
var lines = raw.Split("?");
var args = request.QueryString;
var nick = args["name"];
if (nick != null)
{
var acc = TeamManager.Nick2Acc(nick);
if (acc != null)
{
switch (lines[0])
{
case "/CloseGame":
2024-07-13 15:32:39 +08:00
{
rb = EngineManager.ExitGame(acc) ? new ResponseBody(1, 0, $"Account [{nick}] successful to close.") : new ResponseBody($"Account [{nick}] is unluacher.");
}
2024-03-07 21:04:59 +08:00
break;
case "/ToNormalSize":
2024-07-13 15:32:39 +08:00
{
rb = EngineManager.TurnGameSizeNormal(acc) switch
2024-03-07 21:04:59 +08:00
{
2024-07-13 15:32:39 +08:00
2 => new ResponseBody(1, 0, $"Account [{nick}] now is normal size."),
1 => new ResponseBody(0, 0, $"Account [{nick}] is loading, please wait."),
0 => new ResponseBody($"Account [{nick}] is unluacher."),
_ => rb
};
}
2024-03-07 21:04:59 +08:00
break;
case "/ToMiniSize":
2024-07-13 15:32:39 +08:00
{
rb = EngineManager.TurnGameSizeMini(acc) switch
2024-03-07 21:04:59 +08:00
{
2024-07-13 15:32:39 +08:00
2 => new ResponseBody(1, 0, $"Account [{nick}] now is mini size."),
1 => new ResponseBody(0, 0, $"Account [{nick}] is loading, please wait."),
0 => new ResponseBody($"Account [{nick}] is unluacher."),
_ => rb
};
}
2024-03-07 21:04:59 +08:00
break;
case "/LoginGame":
{
2024-03-19 12:09:31 +08:00
if (EngineManager.CreateGame(acc))
2024-03-07 21:04:59 +08:00
{
2024-07-13 15:32:39 +08:00
rb = new ResponseBody(0, 0, $"Account [{nick}] successful to start.");
2024-03-07 21:04:59 +08:00
}
else
{
2024-07-13 15:32:39 +08:00
var hwnd = EngineManager.CheckGameState(acc);
rb = hwnd <= 0 ? new ResponseBody(0, 0, $"Account [{nick}] is loading, please wait.") : new ResponseBody(1, hwnd, $"Account [{nick}] now is running.");
2024-03-07 21:04:59 +08:00
}
}
break;
default:
2024-07-13 15:32:39 +08:00
rb = new ResponseBody($"commad [{lines[0]}] undefind.");
2024-03-07 21:04:59 +08:00
break;
}
}
else
{
2024-07-13 15:32:39 +08:00
rb = new ResponseBody($"Account [{nick}] undefind.");
2024-03-07 21:04:59 +08:00
}
}
else
{
2024-07-13 15:32:39 +08:00
rb = new ResponseBody("args is missing.");
2024-03-07 21:04:59 +08:00
}
}
2024-07-13 15:32:39 +08:00
rb ??= new ResponseBody();
var buffer = Encoding.UTF8.GetBytes(rb.Encode());
2024-03-07 21:04:59 +08:00
response.ContentLength64 = buffer.Length;
2024-07-13 15:32:39 +08:00
var output = response.OutputStream;
2024-03-07 21:04:59 +08:00
await output.WriteAsync(buffer, 0, buffer.Length);
output.Close();
}
2024-07-13 15:32:39 +08:00
Listener.Stop();
2024-03-07 21:04:59 +08:00
}
2024-07-13 15:32:39 +08:00
public static void StopListener() { Cts.Cancel(); }
2024-03-07 21:04:59 +08:00
}
2024-07-13 15:32:39 +08:00
class ResponseBody(int status = -1, int hwnd = 0, string message = "Hello, World!")
2024-03-07 21:04:59 +08:00
{
2024-07-13 15:32:39 +08:00
public ResponseBody(string message) : this(-1, 0, message)
2024-03-07 21:04:59 +08:00
{
}
public string Encode()
{
return $"{{\"state\": {status}, \"hwnd\": {hwnd}, \"message\": \"{message}\"}}";
}
}
}