mirror of
https://github.com/All-Of-Us-Mods/MiraAPI.git
synced 2026-10-20 01:46:15 +00:00
add unregistration of events
This commit is contained in:
1 parent
e7f9a3bb60
commit
6cb7f9f145
2 files changed
+53
-5
No files matched your search
@@ -0,0 +1,22 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace MiraAPI.Events;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Event handle to use when unregistering an event.
|
||||||
|
/// </summary>
|
||||||
|
public class MiraEventHandle
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the type of event.
|
||||||
|
/// </summary>
|
||||||
|
public Type EventType { get; }
|
||||||
|
|
||||||
|
internal MiraEventWrapper EventWrapper { get; }
|
||||||
|
|
||||||
|
internal MiraEventHandle(Type type, MiraEventWrapper eventWrapper)
|
||||||
|
{
|
||||||
|
EventType = type;
|
||||||
|
EventWrapper = eventWrapper;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Reactor.Utilities;
|
|
||||||
|
|
||||||
namespace MiraAPI.Events;
|
namespace MiraAPI.Events;
|
||||||
|
|
||||||
@@ -62,12 +61,12 @@ public static class MiraEventManager
|
|||||||
/// <param name="type">The type of event.</param>
|
/// <param name="type">The type of event.</param>
|
||||||
/// <param name="methodInfo">The MethodInfo of the event handler.</param>
|
/// <param name="methodInfo">The MethodInfo of the event handler.</param>
|
||||||
/// <param name="priority">The priority of the event handler. Lower values are called first.</param>
|
/// <param name="priority">The priority of the event handler. Lower values are called first.</param>
|
||||||
public static void RegisterEventHandler(Type type, MethodInfo methodInfo, int priority = 0)
|
/// <returns>An event handle to use when unregistering the event.</returns>
|
||||||
|
public static MiraEventHandle RegisterEventHandler(Type type, MethodInfo methodInfo, int priority = 0)
|
||||||
{
|
{
|
||||||
if (!type.IsSubclassOf(typeof(MiraEvent)))
|
if (!type.IsSubclassOf(typeof(MiraEvent)))
|
||||||
{
|
{
|
||||||
Logger<MiraApiPlugin>.Error($"Type must be a subclass of MiraEvent: {type.FullName}");
|
throw new InvalidOperationException($"Type must be a subclass of MiraEvent: {type.FullName}");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EventWrappers.TryAdd(type, []);
|
EventWrappers.TryAdd(type, []);
|
||||||
@@ -84,6 +83,7 @@ public static class MiraEventManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
handlers.Insert(index, eventWrapper);
|
handlers.Insert(index, eventWrapper);
|
||||||
|
return new MiraEventHandle(type, eventWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -92,7 +92,8 @@ public static class MiraEventManager
|
|||||||
/// <param name="handler">The callback method/handler for the event.</param>
|
/// <param name="handler">The callback method/handler for the event.</param>
|
||||||
/// <param name="priority">The priority of the event handler. Lower values are called first.</param>
|
/// <param name="priority">The priority of the event handler. Lower values are called first.</param>
|
||||||
/// <typeparam name="T">Type of event.</typeparam>
|
/// <typeparam name="T">Type of event.</typeparam>
|
||||||
public static void RegisterEventHandler<T>(Action<T> handler, int priority = 0) where T : MiraEvent
|
/// <returns>An event handle to use when unregistering the event.</returns>
|
||||||
|
public static MiraEventHandle RegisterEventHandler<T>(Action<T> handler, int priority = 0) where T : MiraEvent
|
||||||
{
|
{
|
||||||
EventWrappers.TryAdd(typeof(T), []);
|
EventWrappers.TryAdd(typeof(T), []);
|
||||||
|
|
||||||
@@ -107,5 +108,30 @@ public static class MiraEventManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
handlers.Insert(index, eventWrapper);
|
handlers.Insert(index, eventWrapper);
|
||||||
|
return new MiraEventHandle(typeof(T), eventWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unregister an event using the event handle.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="eventHandle">A handle to the event.</param>
|
||||||
|
/// <returns>True if the event was unregistered successfully, false otherwise.</returns>
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user