diff --git a/src/Impostor.Api/Events/Game/IGameCreatedEvent.cs b/src/Impostor.Api/Events/Game/IGameCreatedEvent.cs index 48c8d7cc..089ee9c8 100644 --- a/src/Impostor.Api/Events/Game/IGameCreatedEvent.cs +++ b/src/Impostor.Api/Events/Game/IGameCreatedEvent.cs @@ -1,11 +1,24 @@ using Impostor.Api.Games; +using Impostor.Api.Net; namespace Impostor.Api.Events { /// /// Called whenever a new is created. /// + /// + /// Note that the game just has been created, so no players have joined + /// it yet. If you want to know the future host of this game, use the + /// property. + /// public interface IGameCreatedEvent : IGameEvent { + /// + /// Gets the client that requested creation of the game. + /// + /// + /// Will be null if game creation was requested by a plugin. + /// + IClient? Host { get; } } } diff --git a/src/Impostor.Server/Events/Game/GameCreatedEvent.cs b/src/Impostor.Server/Events/Game/GameCreatedEvent.cs index 57e7a20e..d3691608 100644 --- a/src/Impostor.Server/Events/Game/GameCreatedEvent.cs +++ b/src/Impostor.Server/Events/Game/GameCreatedEvent.cs @@ -1,15 +1,19 @@ using Impostor.Api.Events; using Impostor.Api.Games; +using Impostor.Api.Net; namespace Impostor.Server.Events { public class GameCreatedEvent : IGameCreatedEvent { - public GameCreatedEvent(IGame game) + public GameCreatedEvent(IGame game, IClient? host) { Game = game; + Host = host; } public IGame Game { get; } + + public IClient? Host { get; } } } diff --git a/src/Impostor.Server/Net/Manager/GameManager.cs b/src/Impostor.Server/Net/Manager/GameManager.cs index c8371d55..4e985214 100644 --- a/src/Impostor.Server/Net/Manager/GameManager.cs +++ b/src/Impostor.Server/Net/Manager/GameManager.cs @@ -93,11 +93,11 @@ namespace Impostor.Server.Net.Manager return null; } - var (success, game) = await TryCreateAsync(options, filterOptions, @event.GameCode); + var (success, game) = await TryCreateAsync(options, filterOptions, owner, @event.GameCode); for (var i = 0; i < 10 && !success; i++) { - (success, game) = await TryCreateAsync(options, filterOptions); + (success, game) = await TryCreateAsync(options, filterOptions, owner); } if (!success || game == null) @@ -113,7 +113,7 @@ namespace Impostor.Server.Net.Manager return CreateAsync(null, options, filterOptions); } - private async ValueTask<(bool Success, Game? Game)> TryCreateAsync(IGameOptions options, GameFilterOptions filterOptions, GameCode? desiredGameCode = null) + private async ValueTask<(bool Success, Game? Game)> TryCreateAsync(IGameOptions options, GameFilterOptions filterOptions, IClient? owner, GameCode? desiredGameCode = null) { var gameCode = desiredGameCode ?? _gameCodeFactory.Create(); var game = ActivatorUtilities.CreateInstance(_serviceProvider, _publicIp, gameCode, options, filterOptions); @@ -125,7 +125,7 @@ namespace Impostor.Server.Net.Manager _logger.LogDebug("Created game with code {0}.", game.Code); - await _eventManager.CallAsync(new GameCreatedEvent(game)); + await _eventManager.CallAsync(new GameCreatedEvent(game, owner)); return (true, game); }