Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions Boot.Codes.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
</PropertyGroup>

<ItemGroup>
<!--ProjectReference Include="../Impostor/src/Impostor.Api/Impostor.Api.csproj" /-->
<PackageReference Include="Impostor.Api" Version="1.9.1" />
<!--TODO switch back to mainline if Impostor 1.9.2 is released -->
<ProjectReference Include="../Impostor/src/Impostor.Api/Impostor.Api.csproj" />
<!--PackageReference Include="Impostor.Api" Version="1.9.1" /-->
<PackageReference Include="System.Resources.Extensions" Version="8.0.0" />
</ItemGroup>

Expand Down
5 changes: 4 additions & 1 deletion BootCodesPlugin.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System.Threading.Tasks;
using Boot.Codes.Handlers;
using Impostor.Api.Events.Managers;
using Impostor.Api.Plugins;
using Microsoft.Extensions.Logging;

Expand All @@ -11,10 +13,11 @@ public class BootCodesPlugin : PluginBase

private readonly IGameCodeManager _manager;

public BootCodesPlugin(ILogger<BootCodesPlugin> logger, IGameCodeManager manager)
public BootCodesPlugin(ILogger<BootCodesPlugin> logger, IGameCodeManager manager, IEventManager eventManager, GameEventListener eventListener)
{
this._logger = logger;
this._manager = manager;
eventManager.RegisterListener(eventListener);
}

public override ValueTask EnableAsync()
Expand Down
2 changes: 2 additions & 0 deletions BootCodesPluginStartup.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Impostor.Api.Plugins;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Boot.Codes.Handlers;

namespace Boot.Codes
{
Expand All @@ -11,6 +12,7 @@ public void ConfigureHost(IHostBuilder host) { }
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IGameCodeManager, GameCodeManager>();
services.AddSingleton<GameEventListener>();
}
}
}
8 changes: 3 additions & 5 deletions GameCodeManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ public GameCodeManager(ILogger<GameCodeManager> logger, IGameCodeFactory codeFac

this._codes = validCodes;
this._inUse = new HashSet<GameCode>();

eventManager.RegisterListener(new GameEventListener(this));
}

private IEnumerable<GameCode> Read()
Expand Down Expand Up @@ -129,9 +127,9 @@ public void Release(GameCode code)
{
lock (_sync)
{
if (!_inUse.Contains(code)) return; // generated by the factory
_inUse.Remove(code);
_codes.Add(code);
if (_inUse.Remove(code)) {
_codes.Add(code);
}
}
}
}
Expand Down
37 changes: 32 additions & 5 deletions Handlers/GameEventListener.cs
Original file line number Diff line number Diff line change
@@ -1,22 +1,49 @@
using System.Collections.Generic;
using Impostor.Api.Events;
using Impostor.Api.Games;
using Microsoft.Extensions.Logging;

namespace Boot.Codes.Handlers
{
public class GameEventListener : IEventListener
{
private readonly IGameCodeManager _gameCodeManager;
private readonly ILogger<GameEventListener> _logger;
private readonly Dictionary<int, GameCode> _assignmentMap = new();

public GameEventListener(IGameCodeManager gameCodeManager)
public GameEventListener(IGameCodeManager gameCodeManager, ILogger<GameEventListener> logger)
{
this._gameCodeManager = gameCodeManager;
_gameCodeManager = gameCodeManager;
_logger = logger;
}

// NOTE: if you want to override the results of Boot.Codes, register an event at a lower priority

[EventListener(EventPriority.Highest)]
public void OnGameCreated(IGameCreationEvent e) => e.GameCode = _gameCodeManager.Get();
public void OnGameCreation(IGameCreationEvent e)
{
var code = _gameCodeManager.Get();
e.GameCode = code;
if (e.Client != null)
{
_assignmentMap[e.Client.Id] = code;
}
}

[EventListener(EventPriority.Highest)]
[EventListener]
public void OnGameCreated(IGameCreatedEvent e)
{
if (e.Host != null)
{
var hostId = e.Host.Id;
if (_assignmentMap.Remove(hostId, out var expectedCode) && expectedCode != e.Game.Code)
{
_logger.LogInformation("Boot.Codes provided code was overridden in game {Code}", e.Game.Code);
_gameCodeManager.Release(expectedCode);
}
}
}

[EventListener]
public void OnGameDestroyed(IGameDestroyedEvent e) => _gameCodeManager.Release(e.Game.Code);
}
}