diff --git a/experiments/adminpanel/GameClient.cs b/experiments/adminpanel/GameClient.cs index ad7cc92..b41de27 100644 --- a/experiments/adminpanel/GameClient.cs +++ b/experiments/adminpanel/GameClient.cs @@ -1,27 +1,28 @@ using System.Net.WebSockets; using JJ2ClientLib.JJ2; -public static class GameClient { - public static JJ2Client client = new JJ2Client(); - public static WebSocketHandler wsHandler = new WebSocketHandler("http://127.0.0.1:1/"); - - public static void joinGame(string addr, ushort port, WebSocketHandler wsHandler) { - client.Console_Message_Recveived_Event += onConsoleMessageReceive; - client.Message_Received_Event += onMessageReceive; - client.Player_Joined_Event += onPlayerJoin; - client.Player_Left_Event += onPlayerLeft; - - client.Level_Initialized_Event += onLevelInitialize; - client.Connected_Event += onConnect; - client.Disconnected_Event += onDisconnect; - client.Failed_To_Connect_Event += onConnectFail; +public class GameClient { + public JJ2Client client = new JJ2Client(); + public WebSocketHandler wsHandler; + + public GameClient(WebSocketHandler wsHandler) { + client.Console_Message_Recveived_Event += OnConsoleMessageReceive; + client.Message_Received_Event += OnMessageReceive; + client.Player_Joined_Event += OnPlayerJoin; + client.Player_Left_Event += OnPlayerLeft; + client.Level_Initialized_Event += OnLevelInitialize; + client.Connected_Event += OnConnect; + client.Disconnected_Event += OnDisconnect; + client.Failed_To_Connect_Event += OnConnectFail; + + this.wsHandler = wsHandler; + } + public void JoinGame(string addr, ushort port) { client.JoinServer(addr, null, "Admin", port); - - GameClient.wsHandler = wsHandler; } - public static List getPlayers() { + public List GetPlayers() { List players = new List(); byte numOfPlayers = 0; @@ -57,13 +58,19 @@ public static List getPlayers() { // jj2 connection events - public static void onConsoleMessageReceive(string msg, byte msgType, object user) + public void OnConsoleMessageReceive(string msg, byte msgType, object user) { - addTimeToString(ref msg); - logMessage(msg); + AddTimeToString(ref msg); + LogMessage(msg); } - public static void onMessageReceive(string msg, string playerName, byte team, byte playerID, byte playerSocketIndex, object user) + public void OnMessageReceive( + string msg, + string playerName, + byte team, + byte playerID, + byte playerSocketIndex, + object user) { if (team > 0) { @@ -71,52 +78,51 @@ public static void onMessageReceive(string msg, string playerName, byte team, by } string line = string.Format("{0}: {1}", playerName, msg); - addTimeToString(ref line); + AddTimeToString(ref line); - logMessage(line); + LogMessage(line); } - public static void onPlayerJoin(string playerName, byte playerID, byte socketIndex, byte character, byte team, object user) + public void OnPlayerJoin( + string playerName, + byte playerID, + byte socketIndex, + byte character, + byte team, + object user) { string line = string.Format("{0} has joined the game", playerName); - addTimeToString(ref line); + AddTimeToString(ref line); - logMessage(line); + LogMessage(line); } - public static void onPlayerLeft(string playerName, JJ2_Disconnect_Message disconnectMessage, byte playerID, byte socketIndex, object user) + public void OnPlayerLeft(string playerName, + JJ2_Disconnect_Message disconnectMessage, + byte playerID, + byte socketIndex, + object user) { string line = string.Format("{0} has left the game", playerName); - addTimeToString(ref line); - - logMessage(line); - } - - public static void onLevelInitialize(string levelName, string yourName, byte yourID, byte yourSocketIndex, object user) { - logMessage(string.Format("* * * Level begin [{0}] at [{1}]", levelName, DateTime.Now.ToString())); - } + AddTimeToString(ref line); - public static void onConnect(string serverIPAddrees, string serverAddress, ushort serverPort, object user) { - logMessage(string.Format("* * * Connected to [{0}:{1}]", serverAddress, serverPort.ToString())); + LogMessage(line); } - public static void onDisconnect(JJ2_Disconnect_Message disconnectMessage, string serverIPAddrees, string serverAddress, ushort serverPort, object user) { - logMessage(string.Format("* * * Disconnected from [{0}:{1}] at [{2}] with reason [{3}]", serverAddress, serverPort.ToString(), DateTime.Now.ToString(), disconnectMessage.ToString())); - } - - public static void onConnectFail(string serverAddress, ushort serverPort, object user) { - logMessage(string.Format("* * * Unable to connect to [{0}:{1}] ", serverAddress, serverPort.ToString())); - } + public void OnLevelInitialize(string levelName, string yourName, byte yourID, byte yourSocketIndex, object user) => LogMessage(string.Format("* * * Level begin [{0}] at [{1}]", levelName, DateTime.Now.ToString())); + public void OnConnect(string serverIPAddrees, string serverAddress, ushort serverPort, object user) => LogMessage(string.Format("* * * Connected to [{0}:{1}]", serverAddress, serverPort.ToString())); + public void OnDisconnect(JJ2_Disconnect_Message disconnectMessage, string serverIPAddrees, string serverAddress, ushort serverPort, object user) => LogMessage(string.Format("* * * Disconnected from [{0}:{1}] at [{2}] with reason [{3}]", serverAddress, serverPort.ToString(), DateTime.Now.ToString(), disconnectMessage.ToString())); + public void OnConnectFail(string serverAddress, ushort serverPort, object user) => LogMessage(string.Format("* * * Unable to connect to [{0}:{1}] ", serverAddress, serverPort.ToString())); // util - public static void logMessage(string msg) { + public void LogMessage(string msg) { Console.WriteLine(msg); wsHandler.Broadcast(async (client) => { await client.SendAsync(WebSocketHandler.StringToArraySegment("message: " + msg), WebSocketMessageType.Text, true, CancellationToken.None); }).Wait(); } - public static void addTimeToString(ref string s) + public static void AddTimeToString(ref string s) { DateTime d = DateTime.Now; s = string.Format("[{0}:{1}:{2}] {3}", d.Hour.ToString("00"), d.Minute.ToString("00"), d.Second.ToString("00"), s); diff --git a/experiments/adminpanel/Program.cs b/experiments/adminpanel/Program.cs index 6e96514..0b2f513 100644 --- a/experiments/adminpanel/Program.cs +++ b/experiments/adminpanel/Program.cs @@ -31,19 +31,25 @@ static string ServeFile(HttpContext context, string filePath, string contentType } -app.MapGet("/", (HttpContext context) => -{ - string s = ServeFile(context, "wwwroot/index.html", "text/html"); +// too lazy to make a file server +app.MapGet("/", (HttpContext context) => { + return ServeFile(context, "wwwroot/index.html", "text/html"); +}); - return s; +app.MapGet("/script.js", (HttpContext context) => { + return ServeFile(context, "wwwroot/script.js", "text/javascript"); }); WebSocketHandler ws = new("http://127.0.0.1:1337/"); +GameClient gameClient = new(ws); + +ws.SetGameClient(gameClient); + Thread serverThread = new Thread(() => { ws.Start().Wait(); }); serverThread.Start(); -GameClient.joinGame("127.0.0.1", 10052, ws); +gameClient.JoinGame("127.0.0.1", 10052); app.Run(); diff --git a/experiments/adminpanel/WebSocketHandler.cs b/experiments/adminpanel/WebSocketHandler.cs index 4a6c8a4..380cdb9 100644 --- a/experiments/adminpanel/WebSocketHandler.cs +++ b/experiments/adminpanel/WebSocketHandler.cs @@ -8,8 +8,9 @@ public class WebSocketHandler { - private readonly HttpListener _httpListener; - private readonly ConcurrentDictionary _clients = new ConcurrentDictionary(); + public HttpListener _httpListener; + public ConcurrentDictionary _clients = new ConcurrentDictionary(); + public GameClient? gameClient; public WebSocketHandler(string url) { @@ -47,11 +48,20 @@ public static string ByteArrayToString(byte[] byteArray) return string.Empty; } + public void SetGameClient(GameClient client) { + gameClient = client; + } + public async Task Start() { _httpListener.Start(); Console.WriteLine("WebSocket server is running..."); + if(gameClient == null) { + Console.WriteLine("[ERROR] WebSocketHandler.gameClient is null! Make sure to use SetGameClient!"); + return; + } + while (true) { HttpListenerContext context = await _httpListener.GetContextAsync(); @@ -73,6 +83,7 @@ public async Task Broadcast(BroadcastDelegate delg) private async Task HandleWebSocketAsync(HttpListenerContext context) { + if(gameClient == null) return; if (context.Request.IsWebSocketRequest) { HttpListenerWebSocketContext webSocketContext = await context.AcceptWebSocketAsync(null); @@ -113,7 +124,7 @@ private async Task HandleWebSocketAsync(HttpListenerContext context) if (type == "message") { if(content.StartsWith("/server ")) { if(content == "/server players") { - var players = GameClient.getPlayers(); + var players = gameClient.GetPlayers(); var finalString = "!"; foreach(var player in players) { @@ -124,7 +135,7 @@ await Broadcast(async (client) => { await client.SendAsync(StringToArraySegment("message:" + finalString), WebSocketMessageType.Text, true, CancellationToken.None); }); } - } else GameClient.client.SendMessage(content); + } else gameClient.client.SendMessage(content); } // await Broadcast(async (client) => await client.SendAsync(StringToArraySegment("message:User: " + content), WebSocketMessageType.Text, true, CancellationToken.None)); } diff --git a/experiments/adminpanel/wwwroot/index.html b/experiments/adminpanel/wwwroot/index.html index 3031e22..956363c 100644 --- a/experiments/adminpanel/wwwroot/index.html +++ b/experiments/adminpanel/wwwroot/index.html @@ -13,6 +13,10 @@ #messages { list-style-type: none; margin: 0; padding: 0; } #messages > li { padding: 0.5rem 1rem; } #messages > li:nth-child(odd) { background: #efefef; } + + #player-list li img { + margin-bottom: -25px; + } @@ -20,57 +24,14 @@
- + + + + \ No newline at end of file diff --git a/experiments/adminpanel/wwwroot/script.js b/experiments/adminpanel/wwwroot/script.js new file mode 100644 index 0000000..3aea4ca --- /dev/null +++ b/experiments/adminpanel/wwwroot/script.js @@ -0,0 +1,62 @@ + +const socket = new WebSocket("ws://127.0.0.1:1337/"); // WebSocket server URL + +socket.onopen = () => { + console.log("WebSocket connection established!"); +}; + +socket.onmessage = (event) => { + const message = event.data; + + const type = message.slice(0, message.indexOf(':')).trim(); + const content = message.slice(message.indexOf(':') + 1).trim(); + + console.log(`Type: ${type}`); + console.log(`Content: ${content}`); + + if(type == "message") { + var item = document.createElement("li"); + item.textContent = content; + messages.appendChild(item); + window.scrollTo(0, document.body.scrollHeight); + } +}; + +socket.onclose = () => { + console.log("WebSocket connection closed!"); +}; + +var form = document.getElementById("form"); +var input = document.getElementById("input"); + +function getCurrentFormattedTime() { + const d = new Date(); + const formattedTime = `[${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}:${d.getSeconds().toString().padStart(2, '0')}]`; + return formattedTime; +} + +function addNewPlayer(furA, furB, furC, furD, char, name) { + let li = document.createElement("li"); + let img = document.createElement("img"); + img.src = `https://jazzjackrabbit.net/fur/fur.php?a=${furA}&b=${furB}&c=${furC}&d=${furD}&char=${char}&frame=3`; + li.appendChild(img); + li.appendChild(document.createTextNode(name)); + document.getElementById("player-list").appendChild(li); +} + +addNewPlayer(32, 48, 64, 0, "spaz", "PI"); + +form.addEventListener("submit", function(e) { + e.preventDefault(); + + if (input.value) { + // prediction + var item = document.createElement("li"); + item.textContent = `${getCurrentFormattedTime()} Admin: ${input.value}`; + messages.appendChild(item); + window.scrollTo(0, document.body.scrollHeight); + + socket.send("message:" + input.value); + input.value = ""; + } +}); \ No newline at end of file