servicepoint-tanks/tanks-backend/TanksServer/Interactivity/PlayerInfoConnection.cs

61 lines
1.9 KiB
C#
Raw Normal View History

2024-04-22 19:03:07 +02:00
using System.Net.WebSockets;
2024-04-22 20:13:31 +02:00
using System.Text;
2024-04-22 19:03:07 +02:00
using System.Text.Json;
2024-04-22 19:44:28 +02:00
using TanksServer.GameLogic;
2024-04-22 19:03:07 +02:00
namespace TanksServer.Interactivity;
internal sealed class PlayerInfoConnection(
Player player,
ILogger logger,
2024-04-22 19:44:28 +02:00
WebSocket rawSocket,
MapEntityManager entityManager
2024-04-28 15:34:32 +02:00
) : WebsocketServerConnection(logger, new ByteChannelWebSocket(rawSocket, logger, 0))
2024-04-22 19:03:07 +02:00
{
private readonly AppSerializerContext _context = new(new JsonSerializerOptions(JsonSerializerDefaults.Web));
2024-04-29 12:49:24 +02:00
private bool _wantsInfoOnTick = true;
2024-04-22 19:03:07 +02:00
private byte[] _lastMessage = [];
2024-04-28 15:34:32 +02:00
protected override ValueTask HandleMessageLockedAsync(Memory<byte> buffer)
2024-04-22 19:03:07 +02:00
{
var response = GetMessageToSend();
if (response == null)
{
Logger.LogTrace("cannot respond directly, increasing wanted frames");
2024-04-28 15:34:32 +02:00
_wantsInfoOnTick = true;
2024-04-22 19:03:07 +02:00
return ValueTask.CompletedTask;
}
Logger.LogTrace("responding directly");
return Socket.SendTextAsync(response);
}
2024-04-28 15:34:32 +02:00
public ValueTask OnGameTickAsync() => LockedAsync(() =>
2024-04-22 19:03:07 +02:00
{
2024-04-28 15:34:32 +02:00
if (!_wantsInfoOnTick)
return ValueTask.CompletedTask;
2024-04-22 19:03:07 +02:00
var response = GetMessageToSend();
if (response == null)
2024-04-28 15:34:32 +02:00
return ValueTask.CompletedTask;
2024-04-22 19:03:07 +02:00
Logger.LogTrace("responding indirectly");
2024-04-28 15:34:32 +02:00
return Socket.SendTextAsync(response);
});
2024-04-22 19:03:07 +02:00
private byte[]? GetMessageToSend()
{
2024-04-22 19:44:28 +02:00
var tank = entityManager.GetCurrentTankOfPlayer(player);
TankInfo? tankInfo = tank != null
? new TankInfo(tank.Orientation, tank.Magazine.ToDisplayString(), tank.Position.ToPixelPosition(), tank.Moving)
2024-04-22 19:44:28 +02:00
: null;
var info = new PlayerInfo(player.Name, player.Scores, player.Controls.ToDisplayString(), tankInfo);
2024-04-22 19:03:07 +02:00
var response = JsonSerializer.SerializeToUtf8Bytes(info, _context.PlayerInfo);
if (response.SequenceEqual(_lastMessage))
return null;
return _lastMessage = response;
}
}