diff --git a/MiraAPI/Events/MiraEventHandle.cs b/MiraAPI/Events/MiraEventHandle.cs new file mode 100644 index 0000000..70514c4 --- /dev/null +++ b/MiraAPI/Events/MiraEventHandle.cs @@ -0,0 +1,22 @@ +using System; + +namespace MiraAPI.Events; + +/// +/// Event handle to use when unregistering an event. +/// +public class MiraEventHandle +{ + /// + /// Gets the type of event. + /// + public Type EventType { get; } + + internal MiraEventWrapper EventWrapper { get; } + + internal MiraEventHandle(Type type, MiraEventWrapper eventWrapper) + { + EventType = type; + EventWrapper = eventWrapper; + } +} diff --git a/MiraAPI/Events/MiraEventManager.cs b/MiraAPI/Events/MiraEventManager.cs index 52df8dd..661a7fe 100644 --- a/MiraAPI/Events/MiraEventManager.cs +++ b/MiraAPI/Events/MiraEventManager.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Reflection; -using Reactor.Utilities; namespace MiraAPI.Events; @@ -62,12 +61,12 @@ public static class MiraEventManager /// The type of event. /// The MethodInfo of the event handler. /// The priority of the event handler. Lower values are called first. - public static void RegisterEventHandler(Type type, MethodInfo methodInfo, int priority = 0) + /// An event handle to use when unregistering the event. + public static MiraEventHandle RegisterEventHandler(Type type, MethodInfo methodInfo, int priority = 0) { if (!type.IsSubclassOf(typeof(MiraEvent))) { - Logger.Error($"Type must be a subclass of MiraEvent: {type.FullName}"); - return; + throw new InvalidOperationException($"Type must be a subclass of MiraEvent: {type.FullName}"); } EventWrappers.TryAdd(type, []); @@ -84,6 +83,7 @@ public static class MiraEventManager } handlers.Insert(index, eventWrapper); + return new MiraEventHandle(type, eventWrapper); } /// @@ -92,7 +92,8 @@ public static class MiraEventManager /// The callback method/handler for the event. /// The priority of the event handler. Lower values are called first. /// Type of event. - public static void RegisterEventHandler(Action handler, int priority = 0) where T : MiraEvent + /// An event handle to use when unregistering the event. + public static MiraEventHandle RegisterEventHandler(Action handler, int priority = 0) where T : MiraEvent { EventWrappers.TryAdd(typeof(T), []); @@ -107,5 +108,30 @@ public static class MiraEventManager } handlers.Insert(index, eventWrapper); + return new MiraEventHandle(typeof(T), eventWrapper); + } + + /// + /// Unregister an event using the event handle. + /// + /// A handle to the event. + /// True if the event was unregistered successfully, false otherwise. + public static bool UnregisterEventHandler(MiraEventHandle eventHandle) + { + if (!EventWrappers.TryGetValue(eventHandle.EventType, out var handlers)) + { + return false; + } + + if (!handlers.Remove(eventHandle.EventWrapper)) + { + return false; + } + + if (handlers.Count == 0) + { + EventWrappers.Remove(eventHandle.EventType); + } + return true; } }