using Dalamud.IoC; using Dalamud.Logging; using Dalamud.Plugin; using Dalamud.Plugin.Ipc; using PatMe2Mqtt.PatMeProxyApi; using System; using System.Collections.Generic; using System.Diagnostics.Metrics; using System.Linq; namespace PatMe2Mqtt { public sealed class Plugin : IDalamudPlugin { private readonly List _cmds; private readonly ICallGateSubscriber _ipcPatMeCounter; private readonly ICallGateSubscriber _ipcMqttPublish; public Plugin([RequiredVersion("1.0")] DalamudPluginInterface pluginInterface) { pluginInterface.Create(); Service.Plugin = this; Service.PatMe = new(); _cmds = typeof(Plugin).Assembly.GetTypes() .Where(t => !t.IsAbstract && typeof(Cmd).IsAssignableFrom(t)) .Select(t => (Cmd) Activator.CreateInstance(t)!) .ToList(); foreach (Cmd cmd in _cmds) { cmd.Register(Service.CommandManager); } _ipcPatMeCounter = pluginInterface.GetIpcSubscriber("patMeEmoteCounter"); _ipcMqttPublish = pluginInterface.GetIpcSubscriber("Ffxiv2Mqtt.Publish"); SyncAll(); Service.ClientState.Login += OnLogIn; _ipcPatMeCounter.Subscribe(OnPatMeEmote); } public string Name => "PatMe2Mqtt"; public void Dispose() { Service.ClientState.Login -= OnLogIn; _ipcPatMeCounter.Unsubscribe(OnPatMeEmote); foreach (Cmd cmd in _cmds) { cmd.Dispose(); } Service.Plugin = null!; } public void SyncAll() { try { if (!Service.PatMe.Refresh()) { return; } foreach (var emoteCounter in Service.PatMe.EmoteCounters) { Sync(emoteCounter); } } catch (Exception e) { PluginLog.LogError(e, "PatMe2Mqtt couldn't SyncAll"); } } private void SyncByDescSingular(string descSingular) { try { if (!Service.PatMe.Refresh()) { return; } foreach (var emoteCounter in Service.PatMe.EmoteCounters) { if (emoteCounter.descSingular == descSingular) { Sync(emoteCounter); } } } catch (Exception e) { PluginLog.LogError(e, "PatMe2Mqtt couldn't SyncByDescSingular({0})", descSingular); } } private void Sync(EmoteCounter counter) { var topic = $"patme/{Service.ClientState.LocalContentId}/{counter.descPlural}"; var value = counter.Value.ToString(); try { _ipcMqttPublish.InvokeFunc(topic, value); } catch (Exception e) { PluginLog.LogWarning(e, "PatMe2Mqtt couldn't Sync(\"{0}\", {1})", topic, value); } } private void OnLogIn(object? sender, EventArgs e) { Service.Framework.RunOnTick(SyncAll, delayTicks: 10); } private void OnPatMeEmote(string descSingular, ushort emoteId, string instigatorName, uint instigatorWorld) { SyncByDescSingular(descSingular); } } }