2024-04-06 16:38:26 +02:00
|
|
|
using System.IO;
|
2024-04-06 13:46:34 +02:00
|
|
|
using Microsoft.AspNetCore.Builder;
|
2024-04-06 20:32:54 +02:00
|
|
|
using Microsoft.AspNetCore.Http;
|
2024-04-07 00:33:54 +02:00
|
|
|
using Microsoft.AspNetCore.Mvc;
|
2024-04-06 13:46:34 +02:00
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
2024-04-06 16:38:26 +02:00
|
|
|
using Microsoft.Extensions.FileProviders;
|
2024-04-07 13:02:49 +02:00
|
|
|
using TanksServer.Helpers;
|
2024-04-07 11:19:14 +02:00
|
|
|
using TanksServer.Services;
|
2024-04-06 13:46:34 +02:00
|
|
|
|
|
|
|
namespace TanksServer;
|
|
|
|
|
|
|
|
internal static class Program
|
|
|
|
{
|
|
|
|
public static async Task Main(string[] args)
|
|
|
|
{
|
|
|
|
var app = Configure(args);
|
|
|
|
|
2024-04-07 00:33:54 +02:00
|
|
|
app.UseCors();
|
|
|
|
app.UseWebSockets();
|
|
|
|
|
2024-04-06 16:38:26 +02:00
|
|
|
var clientScreenServer = app.Services.GetRequiredService<ClientScreenServer>();
|
2024-04-07 11:19:14 +02:00
|
|
|
var playerService = app.Services.GetRequiredService<PlayerServer>();
|
2024-04-07 01:27:11 +02:00
|
|
|
var controlsServer = app.Services.GetRequiredService<ControlsServer>();
|
2024-04-06 13:46:34 +02:00
|
|
|
|
2024-04-06 16:38:26 +02:00
|
|
|
var clientFileProvider = new PhysicalFileProvider(Path.Combine(app.Environment.ContentRootPath, "client"));
|
|
|
|
app.UseDefaultFiles(new DefaultFilesOptions { FileProvider = clientFileProvider });
|
|
|
|
app.UseStaticFiles(new StaticFileOptions { FileProvider = clientFileProvider });
|
2024-04-06 13:46:34 +02:00
|
|
|
|
2024-04-07 00:33:54 +02:00
|
|
|
app.MapGet("/player", playerService.GetOrAdd);
|
2024-04-07 13:02:49 +02:00
|
|
|
|
2024-04-06 13:46:34 +02:00
|
|
|
app.Map("/screen", async context =>
|
|
|
|
{
|
|
|
|
if (!context.WebSockets.IsWebSocketRequest)
|
2024-04-06 20:32:54 +02:00
|
|
|
{
|
|
|
|
context.Response.StatusCode = StatusCodes.Status400BadRequest;
|
2024-04-06 13:46:34 +02:00
|
|
|
return;
|
2024-04-06 20:32:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
using var ws = await context.WebSockets.AcceptWebSocketAsync();
|
|
|
|
await clientScreenServer.HandleClient(ws);
|
2024-04-06 13:46:34 +02:00
|
|
|
});
|
|
|
|
|
2024-04-07 01:27:11 +02:00
|
|
|
app.Map("/controls", async (HttpContext context, [FromQuery] Guid playerId) =>
|
2024-04-07 00:33:54 +02:00
|
|
|
{
|
|
|
|
if (!context.WebSockets.IsWebSocketRequest)
|
2024-04-07 01:27:11 +02:00
|
|
|
return Results.BadRequest();
|
2024-04-07 00:33:54 +02:00
|
|
|
|
2024-04-07 01:27:11 +02:00
|
|
|
if (!playerService.TryGet(playerId, out var player))
|
|
|
|
return Results.NotFound();
|
2024-04-07 13:02:49 +02:00
|
|
|
|
2024-04-07 00:33:54 +02:00
|
|
|
using var ws = await context.WebSockets.AcceptWebSocketAsync();
|
2024-04-07 01:27:11 +02:00
|
|
|
await controlsServer.HandleClient(ws, player);
|
|
|
|
return Results.Empty;
|
2024-04-07 00:33:54 +02:00
|
|
|
});
|
|
|
|
|
2024-04-06 13:46:34 +02:00
|
|
|
await app.RunAsync();
|
|
|
|
}
|
|
|
|
|
|
|
|
private static WebApplication Configure(string[] args)
|
|
|
|
{
|
|
|
|
var builder = WebApplication.CreateSlimBuilder(args);
|
|
|
|
|
2024-04-07 00:33:54 +02:00
|
|
|
builder.Services.AddCors(options => options
|
|
|
|
.AddDefaultPolicy(policy => policy
|
|
|
|
.AllowAnyHeader()
|
|
|
|
.AllowAnyMethod()
|
|
|
|
.AllowAnyOrigin())
|
|
|
|
);
|
|
|
|
|
|
|
|
builder.Services.ConfigureHttpJsonOptions(options =>
|
|
|
|
{
|
|
|
|
options.SerializerOptions.TypeInfoResolverChain.Insert(0, new AppSerializerContext());
|
|
|
|
});
|
|
|
|
|
2024-04-06 13:46:34 +02:00
|
|
|
builder.Services.AddSingleton<ServicePointDisplay>();
|
|
|
|
builder.Services.AddSingleton<MapService>();
|
2024-04-07 13:02:49 +02:00
|
|
|
builder.Services.AddSingleton<TankManager>();
|
|
|
|
|
|
|
|
builder.Services.AddHostedService<GameTickService>();
|
2024-04-07 00:33:54 +02:00
|
|
|
|
2024-04-07 13:02:49 +02:00
|
|
|
builder.Services.AddSingleton<SpawnQueue>();
|
|
|
|
builder.Services.AddSingleton<ITickStep>(sp => sp.GetRequiredService<SpawnQueue>());
|
|
|
|
|
|
|
|
builder.Services.AddSingleton<PixelDrawer>();
|
|
|
|
builder.Services.AddSingleton<ITickStep, PixelDrawer>(sp => sp.GetRequiredService<PixelDrawer>());
|
2024-04-07 00:33:54 +02:00
|
|
|
|
2024-04-06 16:38:26 +02:00
|
|
|
builder.Services.AddSingleton<ClientScreenServer>();
|
2024-04-07 13:02:49 +02:00
|
|
|
builder.Services.AddHostedService(sp => sp.GetRequiredService<ClientScreenServer>());
|
2024-04-06 21:15:26 +02:00
|
|
|
builder.Services.AddSingleton<ITickStep, ClientScreenServer>(sp => sp.GetRequiredService<ClientScreenServer>());
|
2024-04-06 13:46:34 +02:00
|
|
|
|
2024-04-07 01:27:11 +02:00
|
|
|
builder.Services.AddSingleton<ControlsServer>();
|
2024-04-07 13:02:49 +02:00
|
|
|
builder.Services.AddHostedService(sp => sp.GetRequiredService<ControlsServer>());
|
|
|
|
|
2024-04-07 11:19:14 +02:00
|
|
|
builder.Services.AddSingleton<PlayerServer>();
|
2024-04-07 00:33:54 +02:00
|
|
|
|
2024-04-06 13:46:34 +02:00
|
|
|
return builder.Build();
|
|
|
|
}
|
|
|
|
}
|