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;
}
}