From 198cd7911b5c8405f6b3f95a6e92814baf82a511 Mon Sep 17 00:00:00 2001 From: AeonLucid Date: Sat, 24 Oct 2020 07:00:36 +0200 Subject: [PATCH] HandleRpc async for sending events --- .../Events/Game/Net/PlayerChatEvent.cs | 21 +++++++++++++++++++ .../Innersloth/Net/InnerNetObject.cs | 5 +++-- .../Components/InnerCustomNetworkTransform.cs | 5 ++++- .../Objects/Components/InnerPlayerPhysics.cs | 7 +++++-- .../Objects/Components/InnerVoteBanSystem.cs | 7 +++++-- .../Innersloth/Net/Objects/InnerGameData.cs | 5 ++++- .../Net/Objects/InnerLobbyBehaviour.cs | 6 ++++-- .../Innersloth/Net/Objects/InnerMeetingHud.cs | 5 ++++- .../Net/Objects/InnerPlayerControl.cs | 11 ++++++++-- .../Innersloth/Net/Objects/InnerShipStatus.cs | 5 ++++- .../Handlers/PlayerEventListener.cs | 6 ++++++ src/Impostor.Server/Events/EventManager.cs | 9 +++++++- .../Register/RegisteredEventListener.cs | 1 + 13 files changed, 78 insertions(+), 15 deletions(-) create mode 100644 src/Impostor.Api/Events/Game/Net/PlayerChatEvent.cs diff --git a/src/Impostor.Api/Events/Game/Net/PlayerChatEvent.cs b/src/Impostor.Api/Events/Game/Net/PlayerChatEvent.cs new file mode 100644 index 0000000..bbf0256 --- /dev/null +++ b/src/Impostor.Api/Events/Game/Net/PlayerChatEvent.cs @@ -0,0 +1,21 @@ +using Impostor.Api.Games; +using Impostor.Api.Innersloth.Net.Objects; + +namespace Impostor.Api.Events.Net +{ + public class PlayerChatEvent : IGameEvent + { + public PlayerChatEvent(IGame game, InnerPlayerControl playerControl, string message) + { + Game = game; + PlayerControl = playerControl; + Message = message; + } + + public IGame Game { get; } + + public InnerPlayerControl PlayerControl { get; } + + public string Message { get; } + } +} \ No newline at end of file diff --git a/src/Impostor.Api/Innersloth/Net/InnerNetObject.cs b/src/Impostor.Api/Innersloth/Net/InnerNetObject.cs index da1b516..dc877a2 100644 --- a/src/Impostor.Api/Innersloth/Net/InnerNetObject.cs +++ b/src/Impostor.Api/Innersloth/Net/InnerNetObject.cs @@ -1,4 +1,5 @@ -using Impostor.Api.Net; +using System.Threading.Tasks; +using Impostor.Api.Net; using Impostor.Api.Net.Messages; namespace Impostor.Api.Innersloth.Net @@ -13,7 +14,7 @@ namespace Impostor.Api.Innersloth.Net public SpawnFlags SpawnFlags { get; internal set; } - public abstract void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader); + public abstract ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader); public abstract bool Serialize(IMessageWriter writer, bool initialState); diff --git a/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerCustomNetworkTransform.cs b/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerCustomNetworkTransform.cs index 314b18b..ae5f6fe 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerCustomNetworkTransform.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerCustomNetworkTransform.cs @@ -1,5 +1,6 @@ using System; using System.Numerics; +using System.Threading.Tasks; using Impostor.Api.Net; using Impostor.Api.Net.Messages; using Microsoft.Extensions.Logging; @@ -45,7 +46,7 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components return new Vector2(XRange.Lerp(v1), YRange.Lerp(v2)); } - public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) + public override ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) { if (call == RpcCalls.SnapTo) { @@ -55,6 +56,8 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components { _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerCustomNetworkTransform), call); } + + return default; } public override bool Serialize(IMessageWriter writer, bool initialState) diff --git a/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerPlayerPhysics.cs b/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerPlayerPhysics.cs index cae4dc3..5b1e883 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerPlayerPhysics.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerPlayerPhysics.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Impostor.Api.Net; using Impostor.Api.Net.Messages; using Microsoft.Extensions.Logging; @@ -14,12 +15,12 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components _logger = logger; } - public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) + public override ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) { if (call != RpcCalls.EnterVent && call != RpcCalls.ExitVent) { _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerPlayerPhysics), call); - return; + return default; } if (!sender.IsOwner(this)) @@ -41,6 +42,8 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components var ventEnter = call == RpcCalls.EnterVent; // TODO: Do stuff. + + return default; } public override bool Serialize(IMessageWriter writer, bool initialState) diff --git a/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerVoteBanSystem.cs b/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerVoteBanSystem.cs index 36f9a68..4b20af9 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerVoteBanSystem.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerVoteBanSystem.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Impostor.Api.Net; using Impostor.Api.Net.Messages; using Microsoft.Extensions.Logging; @@ -17,12 +18,12 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components _votes = new Dictionary(); } - public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) + public override ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) { if (call != RpcCalls.AddVote) { _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerVoteBanSystem), call); - return; + return default; } var clientId = reader.ReadInt32(); @@ -39,6 +40,8 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components var targetClientId = reader.ReadInt32(); // TODO: Use. + + return default; } public override bool Serialize(IMessageWriter writer, bool initialState) diff --git a/src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.cs b/src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.cs index 7fa1597..0ecd4df 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Threading.Tasks; using Impostor.Api.Games; using Impostor.Api.Innersloth.Net.Objects.Components; using Impostor.Api.Net; @@ -40,7 +41,7 @@ namespace Impostor.Api.Innersloth.Net.Objects return _allPlayers.TryGetValue(id, out var player) ? player : null; } - public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) + public override ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) { switch (call) { @@ -105,6 +106,8 @@ namespace Impostor.Api.Innersloth.Net.Objects break; } } + + return default; } public override bool Serialize(IMessageWriter writer, bool initialState) diff --git a/src/Impostor.Api/Innersloth/Net/Objects/InnerLobbyBehaviour.cs b/src/Impostor.Api/Innersloth/Net/Objects/InnerLobbyBehaviour.cs index b76a883..eac946e 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/InnerLobbyBehaviour.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/InnerLobbyBehaviour.cs @@ -1,4 +1,5 @@ -using Impostor.Api.Games; +using System.Threading.Tasks; +using Impostor.Api.Games; using Impostor.Api.Net; using Impostor.Api.Net.Messages; @@ -15,7 +16,8 @@ namespace Impostor.Api.Innersloth.Net.Objects Components.Add(this); } - public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) + public override ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, + IMessageReader reader) { throw new System.NotImplementedException(); } diff --git a/src/Impostor.Api/Innersloth/Net/Objects/InnerMeetingHud.cs b/src/Impostor.Api/Innersloth/Net/Objects/InnerMeetingHud.cs index b1dfd01..51d918d 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/InnerMeetingHud.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/InnerMeetingHud.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Impostor.Api.Games; using Impostor.Api.Net; using Impostor.Api.Net.Messages; @@ -38,7 +39,7 @@ namespace Impostor.Api.Innersloth.Net.Objects .ToArray(); } - public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) + public override ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) { switch (call) { @@ -105,6 +106,8 @@ namespace Impostor.Api.Innersloth.Net.Objects break; } } + + return default; } public override bool Serialize(IMessageWriter writer, bool initialState) diff --git a/src/Impostor.Api/Innersloth/Net/Objects/InnerPlayerControl.cs b/src/Impostor.Api/Innersloth/Net/Objects/InnerPlayerControl.cs index 80bed6d..6650ce7 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/InnerPlayerControl.cs @@ -1,4 +1,7 @@ using System; +using System.Threading.Tasks; +using Impostor.Api.Events.Managers; +using Impostor.Api.Events.Net; using Impostor.Api.Games; using Impostor.Api.Innersloth.Data; using Impostor.Api.Innersloth.Net.Objects.Components; @@ -12,11 +15,13 @@ namespace Impostor.Api.Innersloth.Net.Objects public class InnerPlayerControl : InnerNetObject { private readonly ILogger _logger; + private readonly IEventManager _eventManager; private readonly IGame _game; - public InnerPlayerControl(ILogger logger, IServiceProvider serviceProvider, IGame game) + public InnerPlayerControl(ILogger logger, IServiceProvider serviceProvider, IEventManager eventManager, IGame game) { _logger = logger; + _eventManager = eventManager; _game = game; Components.Add(this); @@ -32,7 +37,7 @@ namespace Impostor.Api.Innersloth.Net.Objects public InnerGameData.PlayerInfo PlayerInfo { get; internal set; } - public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) + public override async ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) { switch (call) { @@ -269,6 +274,8 @@ namespace Impostor.Api.Innersloth.Net.Objects } var chat = reader.ReadString(); + + await _eventManager.CallAsync(new PlayerChatEvent(_game, this, chat)); break; } diff --git a/src/Impostor.Api/Innersloth/Net/Objects/InnerShipStatus.cs b/src/Impostor.Api/Innersloth/Net/Objects/InnerShipStatus.cs index 2c2d39b..a33bd65 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/InnerShipStatus.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/InnerShipStatus.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Impostor.Api.Games; using Impostor.Api.Innersloth.Net.Objects.Systems; using Impostor.Api.Innersloth.Net.Objects.Systems.ShipStatus; @@ -42,7 +43,7 @@ namespace Impostor.Api.Innersloth.Net.Objects Components.Add(this); } - public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) + public override ValueTask HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader) { switch (call) { @@ -90,6 +91,8 @@ namespace Impostor.Api.Innersloth.Net.Objects break; } } + + return default; } public override bool Serialize(IMessageWriter writer, bool initialState) diff --git a/src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs b/src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs index 333dbf9..590ad71 100644 --- a/src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs +++ b/src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs @@ -17,5 +17,11 @@ namespace Impostor.Plugins.Example.Handlers { Console.WriteLine(e.PlayerControl.PlayerInfo.PlayerName + " destroyed"); } + + [EventListener] + public void OnPlayerChat(PlayerChatEvent e) + { + Console.WriteLine(e.PlayerControl.PlayerInfo.PlayerName + " said " + e.Message); + } } } \ No newline at end of file diff --git a/src/Impostor.Server/Events/EventManager.cs b/src/Impostor.Server/Events/EventManager.cs index 504fcd0..e5139d4 100644 --- a/src/Impostor.Server/Events/EventManager.cs +++ b/src/Impostor.Server/Events/EventManager.cs @@ -8,16 +8,19 @@ using Impostor.Api.Events; using Impostor.Api.Events.Managers; using Impostor.Server.Events.Register; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; namespace Impostor.Server.Events { internal class EventManager : IEventManager { private readonly ConcurrentDictionary _temporaryEventListeners; + private readonly ILogger _logger; private readonly IServiceProvider _serviceProvider; - public EventManager(IServiceProvider serviceProvider) + public EventManager(ILogger logger, IServiceProvider serviceProvider) { + _logger = logger; _serviceProvider = serviceProvider; _temporaryEventListeners = new ConcurrentDictionary(); } @@ -76,6 +79,10 @@ namespace Impostor.Server.Events await eventListener.InvokeAsync(handler, @event, scope.ServiceProvider); } } + catch (Exception e) + { + _logger.LogError(e, "Invocation of event {0} threw an exception.", @event.GetType().Name); + } finally { scope.Dispose(); diff --git a/src/Impostor.Server/Events/Register/RegisteredEventListener.cs b/src/Impostor.Server/Events/Register/RegisteredEventListener.cs index 0c49a07..100e0f1 100644 --- a/src/Impostor.Server/Events/Register/RegisteredEventListener.cs +++ b/src/Impostor.Server/Events/Register/RegisteredEventListener.cs @@ -77,6 +77,7 @@ namespace Impostor.Server.Events.Register } var returnTarget = Expression.Label(typeof(ValueTask)); + Expression invoke = Expression.Call(Expression.Convert(instance, _eventListenerType), method, arguments); if (method.ReturnType == typeof(void)) -- 2.39.5