TableturfBattleApp/TableturfBattleServer/TableturfWebSocketBehaviour.cs
Andrio Celos d4e8d86571 Rework sync procedure and add a loading indicator
The server will now send a sync message when the client connects via WebSocket. This removes the need to send another GET request to sync game data.
2022-10-25 12:08:18 +11:00

36 lines
1.4 KiB
C#

using System.Web;
using Newtonsoft.Json;
using WebSocketSharp.Server;
namespace TableturfBattleServer;
internal class TableturfWebSocketBehaviour : WebSocketBehavior {
public Guid GameID { get; set; }
public Guid ClientToken { get; set; }
protected override void OnOpen() {
var args = this.Context.RequestUri.Query[1..].Split('&').Select(s => s.Split('=', 2)).Where(a => a.Length == 2)
.ToDictionary(a => HttpUtility.UrlDecode(a[0]), a => HttpUtility.UrlDecode(a[1]));
if (args.TryGetValue("gameID", out var gameIDString) && Guid.TryParse(gameIDString, out var gameID))
this.GameID = gameID;
if (args.TryGetValue("clientToken", out var clientTokenString) && Guid.TryParse(clientTokenString, out var clientToken))
this.ClientToken = clientToken;
// Send an initial state payload.
if (Program.games.TryGetValue(this.GameID, out var game)) {
DTO.PlayerData? playerData = null;
for (int i = 0; i < game.Players.Count; i++) {
var player = game.Players[i];
if (player.Token == this.ClientToken) {
playerData = new(i, player);
break;
}
}
this.Send(JsonConvert.SerializeObject(new DTO.WebSocketPayloadWithPlayerData<Game?>("sync", game, playerData)));
} else
this.Send(JsonConvert.SerializeObject(new DTO.WebSocketPayloadWithPlayerData<Game?>("sync", null, null)));
}
internal void SendInternal(string data) => this.Send(data);
}