add start of mediator

This commit is contained in:
Stanley Dimant
2023-01-30 17:47:47 +01:00
parent c4aeb98126
commit 3906a7b34f
3 changed files with 60 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
namespace MareSynchronos.Mediator;
public interface IMessage { }

View File

@@ -0,0 +1,51 @@
using MareSynchronos.Utils;
namespace MareSynchronos.Mediator;
public class MareMediator : IDisposable
{
private record MediatorSubscriber(object Subscriber, Action<IMessage> Action);
private readonly Dictionary<Type, HashSet<MediatorSubscriber>> _subscriberDict = new();
public void Subscribe<T>(object subscriber, Action<IMessage> action) where T : IMessage
{
_subscriberDict.TryAdd(typeof(T), new HashSet<MediatorSubscriber>());
if (!_subscriberDict[typeof(T)].Add(new(subscriber, action)))
{
throw new InvalidOperationException("Already subscribed");
}
}
public void Unsubscribe<T>(object subscriber) where T : IMessage
{
if (_subscriberDict.TryGetValue(typeof(T), out var subscribers))
{
subscribers.RemoveWhere(p => p.Subscriber == subscriber);
}
}
public void Publish(IMessage message)
{
if (_subscriberDict.TryGetValue(message.GetType(), out var subscribers))
{
foreach (var subscriber in subscribers)
{
try
{
subscriber.Action.Invoke(message);
}
catch (Exception ex)
{
Logger.Error("Error executing " + subscriber.Action.Method, ex);
}
}
}
}
public void Dispose()
{
_subscriberDict.Clear();
}
}

View File

@@ -16,6 +16,7 @@ using Dalamud.Game.Gui;
using MareSynchronos.Export; using MareSynchronos.Export;
using Dalamud.Data; using Dalamud.Data;
using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration;
using MareSynchronos.Mediator;
namespace MareSynchronos; namespace MareSynchronos;
@@ -46,6 +47,7 @@ public sealed class Plugin : IDalamudPlugin
private readonly ServerConfigurationManager _serverConfigurationManager; private readonly ServerConfigurationManager _serverConfigurationManager;
private readonly GposeUi _gposeUi; private readonly GposeUi _gposeUi;
private readonly ConfigurationService _configurationService; private readonly ConfigurationService _configurationService;
private readonly MareMediator _mediator;
public Plugin(DalamudPluginInterface pluginInterface, CommandManager commandManager, DataManager gameData, public Plugin(DalamudPluginInterface pluginInterface, CommandManager commandManager, DataManager gameData,
@@ -56,6 +58,7 @@ public sealed class Plugin : IDalamudPlugin
_pluginInterface.UiBuilder.DisableGposeUiHide = true; _pluginInterface.UiBuilder.DisableGposeUiHide = true;
_commandManager = commandManager; _commandManager = commandManager;
_configurationService = new(_pluginInterface); _configurationService = new(_pluginInterface);
_mediator = new();
_localization = new Dalamud.Localization("MareSynchronos.Localization.", "", useEmbedded: true); _localization = new Dalamud.Localization("MareSynchronos.Localization.", "", useEmbedded: true);
_localization.SetupWithLangCode("en"); _localization.SetupWithLangCode("en");
@@ -138,6 +141,9 @@ public sealed class Plugin : IDalamudPlugin
_transientResourceManager?.Dispose(); _transientResourceManager?.Dispose();
_dalamudUtil.Dispose(); _dalamudUtil.Dispose();
_configurationService?.Dispose(); _configurationService?.Dispose();
_mediator.Dispose();
Logger.Debug("Shut down"); Logger.Debug("Shut down");
} }