move a bunch of stuff into subfolders

This commit is contained in:
Vinzenz Schroeter 2024-04-07 11:19:14 +02:00
parent 8f281d65b2
commit 151cad4cee
13 changed files with 44 additions and 27 deletions

View file

@ -1,6 +1,8 @@
using System.Net.WebSockets;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using TanksServer.Helpers;
using TanksServer.Services;
namespace TanksServer;

View file

@ -1,6 +1,7 @@
using System.Net.WebSockets;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using TanksServer.Helpers;
namespace TanksServer;
@ -55,22 +56,19 @@ internal sealed class ControlsServer(ILogger<ControlsServer> logger, ILoggerFact
protected override Task ReceiveAsync(ArraySegment<byte> buffer)
{
logger.LogDebug("player input {} {}", buffer[0], buffer[1]);
var type = (MessageType)buffer[0];
var control = (InputType)buffer[1];
logger.LogTrace("player input {} {} {}", player.Id, type, control);
bool isEnable;
switch ((MessageType)buffer[0])
var isEnable = type switch
{
case MessageType.Enable:
isEnable = true;
break;
case MessageType.Disable:
isEnable = false;
break;
default:
return CloseAsync(WebSocketCloseStatus.InvalidPayloadData, "invalid state");
}
MessageType.Enable => true,
MessageType.Disable => false,
_ => throw new ArgumentException("invalid message type")
};
switch ((InputType)buffer[1])
switch (control)
{
case InputType.Forward:
player.Controls.Forward = isEnable;
@ -88,7 +86,7 @@ internal sealed class ControlsServer(ILogger<ControlsServer> logger, ILoggerFact
player.Controls.Shoot = isEnable;
break;
default:
return CloseAsync(WebSocketCloseStatus.InvalidPayloadData, "invalid control");
throw new ArgumentException("invalid control type");
}
return Task.CompletedTask;

View file

@ -1,3 +1,5 @@
using TanksServer.Helpers;
namespace TanksServer;
internal sealed class DisplayPixelBuffer(byte[] data)

View file

@ -1,8 +1,11 @@
using System.Net.WebSockets;
using Microsoft.Extensions.Logging;
namespace TanksServer;
namespace TanksServer.Helpers;
/// <summary>
/// Hacky class for easier semantics
/// </summary>
internal abstract class EasyWebSocket
{
private readonly TaskCompletionSource _completionSource = new();

View file

@ -1,6 +1,6 @@
using System.Collections;
namespace TanksServer;
namespace TanksServer.Helpers;
internal sealed class FixedSizeBitFieldView(Memory<byte> data) : IList<bool>
{

View file

@ -4,11 +4,16 @@ using Microsoft.Extensions.Logging;
namespace TanksServer;
internal sealed class PlayerService(ILogger<PlayerService> logger)
internal sealed class PlayerServer(ILogger<PlayerServer> logger)
{
private readonly ConcurrentDictionary<string, Player> _players = new();
public Player GetOrAdd(string name) => _players.GetOrAdd(name, _ => new Player(name));
public Player GetOrAdd(string name)
{
var player = _players.GetOrAdd(name, _ => new Player(name));
logger.LogInformation("player {} (re)joined", player.Id);
return player;
}
public bool TryGet(Guid? playerId, [MaybeNullWhen(false)] out Player foundPlayer)
{

View file

@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using TanksServer.Services;
namespace TanksServer;
@ -17,7 +18,7 @@ internal static class Program
app.UseWebSockets();
var clientScreenServer = app.Services.GetRequiredService<ClientScreenServer>();
var playerService = app.Services.GetRequiredService<PlayerService>();
var playerService = app.Services.GetRequiredService<PlayerServer>();
var controlsServer = app.Services.GetRequiredService<ControlsServer>();
var clientFileProvider = new PhysicalFileProvider(Path.Combine(app.Environment.ContentRootPath, "client"));
@ -84,7 +85,7 @@ internal static class Program
builder.Services.AddHostedService<GameTickService>();
builder.Services.AddSingleton<PlayerService>();
builder.Services.AddSingleton<PlayerServer>();
return builder.Build();
}

View file

@ -1,8 +1,8 @@
using Microsoft.Extensions.Hosting;
namespace TanksServer;
namespace TanksServer.Services;
public class GameTickService(IEnumerable<ITickStep> steps) : IHostedService
internal sealed class GameTickService(IEnumerable<ITickStep> steps) : IHostedService
{
private readonly CancellationTokenSource _cancellation = new();
private readonly List<ITickStep> _steps = steps.ToList();

View file

@ -1,4 +1,4 @@
namespace TanksServer;
namespace TanksServer.Services;
internal class MapDrawer(MapService map):ITickStep
{

View file

@ -1,4 +1,4 @@
namespace TanksServer;
namespace TanksServer.Services;
internal class MapService
{

View file

@ -1,9 +1,9 @@
using System.Net.Sockets;
using Microsoft.Extensions.Options;
namespace TanksServer;
namespace TanksServer.Services;
internal class ServicePointDisplay(IOptions<ServicePointDisplayConfiguration> options)
internal sealed class ServicePointDisplay(IOptions<ServicePointDisplayConfiguration> options)
{
private readonly UdpClient _udpClient = new(options.Value.Hostname, options.Value.Port);
@ -13,7 +13,7 @@ internal class ServicePointDisplay(IOptions<ServicePointDisplayConfiguration> op
}
}
internal class ServicePointDisplayConfiguration
internal sealed class ServicePointDisplayConfiguration
{
public string Hostname { get; set; } = string.Empty;
public int Port { get; set; }

View file

@ -14,5 +14,11 @@
<Link>.dockerignore</Link>
</Content>
</ItemGroup>
<PropertyGroup>
<AnalysisMode>Recommended</AnalysisMode>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<NoWarn>CA1805,CA1848</NoWarn>
</PropertyGroup>
</Project>