]> git.deb.at Git - rhonda/impostor.git/commitdiff
HandleRpc async for sending events
authorAeonLucid <aeonlucid@outlook.com>
Sat, 24 Oct 2020 05:00:36 +0000 (07:00 +0200)
committerAeonLucid <aeonlucid@outlook.com>
Sat, 24 Oct 2020 05:00:36 +0000 (07:00 +0200)
13 files changed:
src/Impostor.Api/Events/Game/Net/PlayerChatEvent.cs [new file with mode: 0644]
src/Impostor.Api/Innersloth/Net/InnerNetObject.cs
src/Impostor.Api/Innersloth/Net/Objects/Components/InnerCustomNetworkTransform.cs
src/Impostor.Api/Innersloth/Net/Objects/Components/InnerPlayerPhysics.cs
src/Impostor.Api/Innersloth/Net/Objects/Components/InnerVoteBanSystem.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerLobbyBehaviour.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerMeetingHud.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerPlayerControl.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerShipStatus.cs
src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs
src/Impostor.Server/Events/EventManager.cs
src/Impostor.Server/Events/Register/RegisteredEventListener.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 (file)
index 0000000..bbf0256
--- /dev/null
@@ -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
index da1b516359b6a312c3765446e59697b51d6d0297..dc877a2c258e01fc0e920711864ec3c5039b7b9e 100644 (file)
@@ -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);
 
index 314b18b001640a5b603a17ced95a6ec12f69b4a2..ae5f6fe65134e8f390b91da0a94eaa9a7bf2f069 100644 (file)
@@ -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)
index cae4dc3b92da4429193651ff7eade18c03b585a7..5b1e88367c02112d4f4ff5e93dc417a368a119a9 100644 (file)
@@ -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)
index 36f9a68d73b6392233669b979471534ad3dc18f4..4b20af9a4f879cc7300da1b91f9e88f37b0ed238 100644 (file)
@@ -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<int, int[]>();
         }
 
-        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)
index 7fa159774dbe98fd3210a6a5577de901a57a57ba..0ecd4dfacae4627e9166e1616de47caf29a15324 100644 (file)
@@ -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)
index b76a88354dc1cf816ca95ee7e1c925ab97b37b6c..eac946ea4af8c02755932b90fc0176756960a26f 100644 (file)
@@ -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();
         }
index b1dfd01ab807f84e4ed96c167ff44143038b3692..51d918d30863422e5ca4970b3fb14da88102a333 100644 (file)
@@ -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)
index 80bed6d53f2ef1810ab85c0c50530cc217a80167..6650ce7a68798a6d0cc7e70bfba8318c81fb8d46 100644 (file)
@@ -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<InnerPlayerControl> _logger;
+        private readonly IEventManager _eventManager;
         private readonly IGame _game;
 
-        public InnerPlayerControl(ILogger<InnerPlayerControl> logger, IServiceProvider serviceProvider, IGame game)
+        public InnerPlayerControl(ILogger<InnerPlayerControl> 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;
                 }
 
index 2c2d39b2813f4cbcc714df846b99f2d9d9044100..a33bd65edbeb0a7a0e70fc334e07097bc3c83482 100644 (file)
@@ -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)
index 333dbf972f791620a2be90752d3b9aa4db3838a6..590ad711603140527cd3883ff4147b6d5a2249a9 100644 (file)
@@ -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
index 504fcd0ce13a9f1872116e492de8d8411db7d890..e5139d42fe7d2973d8e07f36862f9b94c64fa663 100644 (file)
@@ -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<Type, TemporaryEventRegister> _temporaryEventListeners;
+        private readonly ILogger<EventManager> _logger;
         private readonly IServiceProvider _serviceProvider;
 
-        public EventManager(IServiceProvider serviceProvider)
+        public EventManager(ILogger<EventManager> logger, IServiceProvider serviceProvider)
         {
+            _logger = logger;
             _serviceProvider = serviceProvider;
             _temporaryEventListeners = new ConcurrentDictionary<Type, TemporaryEventRegister>();
         }
@@ -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();
index 0c49a07c6972ae87e620955c3d7ae1c1084c6dc8..100e0f1c2f1213a6a937133714baf0e8e332d181 100644 (file)
@@ -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))