From b0c8aee85515870776d10b30768c6dc5fe03408c Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Tue, 17 Oct 2023 10:12:59 +0200 Subject: [PATCH] Replace ECommons with LLib, replace Logout with pre-Logout check to persist data --- .gitmodules | 6 ++--- ECommons | 1 - Influx.sln | 10 +++---- Influx/AllaganTools/AllaganToolsIpc.cs | 15 ++++++----- Influx/GameStrings.cs | 20 ++++++++++++++ Influx/Influx.csproj | 2 +- Influx/Influx/InfluxStatisticsClient.cs | 7 +++-- Influx/InfluxPlugin.cs | 16 +++++------- Influx/LocalStatistics/LocalStats.cs | 1 + .../LocalStatistics/LocalStatsCalculator.cs | 26 ++++++++++++++++--- .../SubmarineTracker/SubmarineTrackerIpc.cs | 11 ++++++-- Influx/packages.lock.json | 2 +- LLib | 1 + 13 files changed, 84 insertions(+), 34 deletions(-) delete mode 160000 ECommons create mode 100644 Influx/GameStrings.cs create mode 160000 LLib diff --git a/.gitmodules b/.gitmodules index e8e1845..4ac68e0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "ECommons"] - path = ECommons - url = https://github.com/NightmareXIV/ECommons.git +[submodule "LLib"] + path = LLib + url = https://git.carvel.li/liza/LLib.git diff --git a/ECommons b/ECommons deleted file mode 160000 index 1ad0dec..0000000 --- a/ECommons +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1ad0decf6d6a169dc0d5779b1c40a5ca733a51d0 diff --git a/Influx.sln b/Influx.sln index 9168653..33ff0ff 100644 --- a/Influx.sln +++ b/Influx.sln @@ -2,7 +2,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Influx", "Influx\Influx.csproj", "{588F6FDE-C6DF-42D9-BD7A-941BE2EB7E44}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ECommons", "ECommons\ECommons\ECommons.csproj", "{D93B90D0-2071-475B-AADD-54D43BCF6A94}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LLib", "LLib\LLib.csproj", "{C11552A8-9C8C-4084-A669-AAFE55E24DCC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -14,9 +14,9 @@ Global {588F6FDE-C6DF-42D9-BD7A-941BE2EB7E44}.Debug|Any CPU.Build.0 = Debug|Any CPU {588F6FDE-C6DF-42D9-BD7A-941BE2EB7E44}.Release|Any CPU.ActiveCfg = Release|Any CPU {588F6FDE-C6DF-42D9-BD7A-941BE2EB7E44}.Release|Any CPU.Build.0 = Release|Any CPU - {D93B90D0-2071-475B-AADD-54D43BCF6A94}.Debug|Any CPU.ActiveCfg = Debug|x64 - {D93B90D0-2071-475B-AADD-54D43BCF6A94}.Debug|Any CPU.Build.0 = Debug|x64 - {D93B90D0-2071-475B-AADD-54D43BCF6A94}.Release|Any CPU.ActiveCfg = Release|x64 - {D93B90D0-2071-475B-AADD-54D43BCF6A94}.Release|Any CPU.Build.0 = Release|x64 + {C11552A8-9C8C-4084-A669-AAFE55E24DCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C11552A8-9C8C-4084-A669-AAFE55E24DCC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C11552A8-9C8C-4084-A669-AAFE55E24DCC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C11552A8-9C8C-4084-A669-AAFE55E24DCC}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/Influx/AllaganTools/AllaganToolsIpc.cs b/Influx/AllaganTools/AllaganToolsIpc.cs index afe36a7..72dcfa9 100644 --- a/Influx/AllaganTools/AllaganToolsIpc.cs +++ b/Influx/AllaganTools/AllaganToolsIpc.cs @@ -5,14 +5,15 @@ using Dalamud.Plugin; using Dalamud.Plugin.Ipc; using Dalamud.Plugin.Ipc.Exceptions; using Dalamud.Plugin.Services; -using ECommons.Reflection; -using ECommons.Schedulers; +using LLib; namespace Influx.AllaganTools; internal sealed class AllaganToolsIpc : IDisposable { private readonly IChatGui _chatGui; + private readonly DalamudReflector _dalamudReflector; + private readonly IFramework _framework; private readonly IPluginLog _pluginLog; private readonly ICallGateSubscriber? _initalized; private readonly ICallGateSubscriber? _isInitialized; @@ -20,9 +21,11 @@ internal sealed class AllaganToolsIpc : IDisposable public ICharacterMonitor Characters { get; private set; } = new UnavailableCharacterMonitor(); public IInventoryMonitor Inventories { get; private set; } = new UnavailableInventoryMonitor(); - public AllaganToolsIpc(DalamudPluginInterface pluginInterface, IChatGui chatGui, IPluginLog pluginLog) + public AllaganToolsIpc(DalamudPluginInterface pluginInterface, IChatGui chatGui, DalamudReflector dalamudReflector, IFramework framework, IPluginLog pluginLog) { _chatGui = chatGui; + _dalamudReflector = dalamudReflector; + _framework = framework; _pluginLog = pluginLog; _initalized = pluginInterface.GetIpcSubscriber("AllaganTools.Initialized"); @@ -44,11 +47,11 @@ internal sealed class AllaganToolsIpc : IDisposable private void ConfigureIpc(bool initialized) { _pluginLog.Information("Configuring Allagan tools IPC"); - _ = new TickScheduler(() => + _framework.RunOnTick(() => { try { - if (DalamudReflector.TryGetDalamudPlugin("Allagan Tools", out var it, false, true)) + if (_dalamudReflector.TryGetDalamudPlugin("Allagan Tools", out var it, false, true)) { var pluginService = it.GetType().Assembly.GetType("InventoryTools.PluginService")!; @@ -66,7 +69,7 @@ internal sealed class AllaganToolsIpc : IDisposable _pluginLog.Error(e, "Could not initialize IPC"); _chatGui.PrintError(e.ToString()); } - }, 100); + }, TimeSpan.FromMilliseconds(100)); } public Dictionary CountCurrencies() diff --git a/Influx/GameStrings.cs b/Influx/GameStrings.cs new file mode 100644 index 0000000..203bda8 --- /dev/null +++ b/Influx/GameStrings.cs @@ -0,0 +1,20 @@ +using System; +using Dalamud.Plugin.Services; +using LLib; +using Addon = Lumina.Excel.GeneratedSheets.Addon; + +namespace Influx; + +internal sealed class GameStrings +{ + public GameStrings(IDataManager dataManager, IPluginLog pluginLog) + { + LogoutToTitleScreen = dataManager.GetString(115, s => s.Text, pluginLog) + ?? throw new Exception($"Unable to resolve {nameof(LogoutToTitleScreen)}"); + LogoutAndExitGame = dataManager.GetString(116, s => s.Text, pluginLog) + ?? throw new Exception($"Unable to resolve {nameof(LogoutAndExitGame)}"); + } + + public string LogoutToTitleScreen { get; } + public string LogoutAndExitGame { get; } +} diff --git a/Influx/Influx.csproj b/Influx/Influx.csproj index e7d118e..87400ba 100644 --- a/Influx/Influx.csproj +++ b/Influx/Influx.csproj @@ -54,7 +54,7 @@ - + diff --git a/Influx/Influx/InfluxStatisticsClient.cs b/Influx/Influx/InfluxStatisticsClient.cs index 2131b8f..e1e4d90 100644 --- a/Influx/Influx/InfluxStatisticsClient.cs +++ b/Influx/Influx/InfluxStatisticsClient.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading.Tasks; using Dalamud.Plugin.Services; using Influx.AllaganTools; +using Influx.LocalStatistics; using InfluxDB.Client; using InfluxDB.Client.Api.Domain; using InfluxDB.Client.Writes; @@ -63,18 +64,20 @@ internal sealed class InfluxStatisticsClient : IDisposable { if (character.CharacterType == CharacterType.Character) { + update.LocalStats.TryGetValue(character, out LocalStats? localStats); + values.Add(PointData.Measurement("currency") .Tag("id", character.CharacterId.ToString()) .Tag("player_name", character.Name) .Tag("type", character.CharacterType.ToString()) .Tag("fc_id", character.FreeCompanyId > 0 ? character.FreeCompanyId.ToString() : null) - .Field("gil", currencies.Gil) + .Field("gil", localStats?.Gil ?? currencies.Gil) .Field("ventures", currencies.Ventures) .Field("ceruleum_tanks", currencies.CeruleumTanks) .Field("repair_kits", currencies.RepairKits) .Timestamp(date, WritePrecision.S)); - if (update.LocalStats.TryGetValue(character, out var localStats)) + if (localStats != null) { values.Add(PointData.Measurement("grandcompany") .Tag("id", character.CharacterId.ToString()) diff --git a/Influx/InfluxPlugin.cs b/Influx/InfluxPlugin.cs index bcac7e7..f1a3229 100644 --- a/Influx/InfluxPlugin.cs +++ b/Influx/InfluxPlugin.cs @@ -6,12 +6,12 @@ using Dalamud.Game.Command; using Dalamud.Interface.Windowing; using Dalamud.Plugin; using Dalamud.Plugin.Services; -using ECommons; using Influx.AllaganTools; using Influx.Influx; using Influx.LocalStatistics; using Influx.SubmarineTracker; using Influx.Windows; +using LLib; namespace Influx; @@ -33,18 +33,18 @@ public class InfluxPlugin : IDalamudPlugin private readonly Timer _timer; public InfluxPlugin(DalamudPluginInterface pluginInterface, IClientState clientState, IPluginLog pluginLog, - ICommandManager commandManager, IChatGui chatGui, IDataManager dataManager) + ICommandManager commandManager, IChatGui chatGui, IDataManager dataManager, IFramework framework, + IAddonLifecycle addonLifecycle) { - ECommonsMain.Init(pluginInterface, this, Module.DalamudReflector); - _pluginInterface = pluginInterface; _configuration = LoadConfig(); _clientState = clientState; _commandManager = commandManager; _pluginLog = pluginLog; - _allaganToolsIpc = new AllaganToolsIpc(pluginInterface, chatGui, _pluginLog); - _submarineTrackerIpc = new SubmarineTrackerIpc(); - _localStatsCalculator = new LocalStatsCalculator(pluginInterface, clientState, pluginLog, dataManager); + DalamudReflector dalamudReflector = new DalamudReflector(pluginInterface, framework, pluginLog); + _allaganToolsIpc = new AllaganToolsIpc(pluginInterface, chatGui, dalamudReflector, framework, _pluginLog); + _submarineTrackerIpc = new SubmarineTrackerIpc(dalamudReflector); + _localStatsCalculator = new LocalStatsCalculator(pluginInterface, clientState, addonLifecycle, pluginLog, dataManager); _influxStatisticsClient = new InfluxStatisticsClient(chatGui, _configuration, dataManager, clientState); _windowSystem = new WindowSystem(typeof(InfluxPlugin).FullName); @@ -130,7 +130,5 @@ public class InfluxPlugin : IDalamudPlugin _influxStatisticsClient.Dispose(); _localStatsCalculator.Dispose(); _allaganToolsIpc.Dispose(); - - ECommonsMain.Dispose(); } } diff --git a/Influx/LocalStatistics/LocalStats.cs b/Influx/LocalStatistics/LocalStats.cs index 44ac6c2..1d459ec 100644 --- a/Influx/LocalStatistics/LocalStats.cs +++ b/Influx/LocalStatistics/LocalStats.cs @@ -14,4 +14,5 @@ public record LocalStats public int MsqCount { get; set; } = -1; public string? MsqName { get; set; } public uint MsqGenre { get; set; } + public int? Gil { get; set; } } diff --git a/Influx/LocalStatistics/LocalStatsCalculator.cs b/Influx/LocalStatistics/LocalStatsCalculator.cs index 3933885..a9caae6 100644 --- a/Influx/LocalStatistics/LocalStatsCalculator.cs +++ b/Influx/LocalStatistics/LocalStatsCalculator.cs @@ -3,13 +3,16 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; +using Dalamud.Game.Addon.Lifecycle; +using Dalamud.Game.Addon.Lifecycle.AddonArgTypes; +using Dalamud.Memory; using Dalamud.Plugin; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game.UI; +using FFXIVClientStructs.FFXIV.Client.UI; using Lumina.Excel.GeneratedSheets; using Newtonsoft.Json; -using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany; namespace Influx.LocalStatistics; @@ -27,7 +30,9 @@ internal sealed class LocalStatsCalculator : IDisposable private readonly DalamudPluginInterface _pluginInterface; private readonly IClientState _clientState; + private readonly IAddonLifecycle _addonLifecycle; private readonly IPluginLog _pluginLog; + private readonly GameStrings _gameStrings; private readonly Dictionary _cache = new(); private IReadOnlyList? _gridaniaStart; @@ -39,16 +44,19 @@ internal sealed class LocalStatsCalculator : IDisposable public LocalStatsCalculator( DalamudPluginInterface pluginInterface, IClientState clientState, + IAddonLifecycle addonLifecycle, IPluginLog pluginLog, IDataManager dataManager) { _pluginInterface = pluginInterface; _clientState = clientState; + _addonLifecycle = addonLifecycle; _pluginLog = pluginLog; + _gameStrings = new GameStrings(dataManager, pluginLog); _clientState.Login += UpdateStatistics; - _clientState.Logout += UpdateStatistics; _clientState.TerritoryChanged += UpdateStatistics; + _addonLifecycle.RegisterListener(AddonEvent.PreFinalize, "SelectYesno", UpdateStatistics); Task.Run(() => { @@ -140,13 +148,21 @@ internal sealed class LocalStatsCalculator : IDisposable public void Dispose() { + _addonLifecycle.UnregisterListener(AddonEvent.PreFinalize, "SelectYesno", UpdateStatistics); _clientState.Login -= UpdateStatistics; - _clientState.Logout -= UpdateStatistics; _clientState.TerritoryChanged -= UpdateStatistics; } private void UpdateStatistics(ushort territoryType) => UpdateStatistics(); + private unsafe void UpdateStatistics(AddonEvent type, AddonArgs args) + { + AddonSelectYesno* addonSelectYesNo = (AddonSelectYesno*)args.Addon; + string text = MemoryHelper.ReadSeString(&addonSelectYesNo->PromptText->NodeText).ToString().Replace("\n", "").Replace("\r", ""); + if (text == _gameStrings.LogoutToTitleScreen || text == _gameStrings.LogoutAndExitGame) + UpdateStatistics(); + } + private unsafe void UpdateStatistics() { var localContentId = _clientState.LocalContentId; @@ -156,6 +172,7 @@ internal sealed class LocalStatsCalculator : IDisposable return; } + _pluginLog.Information($"Updating character {_clientState.LocalContentId}"); try { PlayerState* playerState = PlayerState.Instance(); @@ -171,6 +188,7 @@ internal sealed class LocalStatsCalculator : IDisposable MaxLevel = playerState->MaxLevel, ClassJobLevels = ExtractClassJobLevels(playerState), StartingTown = playerState->StartTown, + Gil = InventoryManager.Instance()->GetInventoryItemCount(1), }; if (_msqQuests != null) @@ -205,7 +223,7 @@ internal sealed class LocalStatsCalculator : IDisposable localStats.MsqGenre = 0; } - _pluginLog.Information($"ls → {localStats.MsqCount}, {localStats.MsqName}"); + _pluginLog.Information($"Current MSQ Progress: {localStats.MsqCount}, {localStats.MsqName}"); if (_cache.TryGetValue(localContentId, out var existingStats)) { diff --git a/Influx/SubmarineTracker/SubmarineTrackerIpc.cs b/Influx/SubmarineTracker/SubmarineTrackerIpc.cs index c5dce06..1de62c3 100644 --- a/Influx/SubmarineTracker/SubmarineTrackerIpc.cs +++ b/Influx/SubmarineTracker/SubmarineTrackerIpc.cs @@ -1,16 +1,23 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -using ECommons.Reflection; using Influx.AllaganTools; +using LLib; namespace Influx.SubmarineTracker; internal sealed class SubmarineTrackerIpc { + private readonly DalamudReflector _dalamudReflector; + + public SubmarineTrackerIpc(DalamudReflector dalamudReflector) + { + _dalamudReflector = dalamudReflector; + } + public Dictionary> GetSubmarineStats(List characters) { - if (DalamudReflector.TryGetDalamudPlugin("Submarine Tracker", out var it, false, true)) + if (_dalamudReflector.TryGetDalamudPlugin("Submarine Tracker", out var it, false, true)) { var submarineData = it.GetType().Assembly.GetType("SubmarineTracker.Data.Submarines"); var knownSubmarineData = submarineData!.GetField("KnownSubmarines")!; diff --git a/Influx/packages.lock.json b/Influx/packages.lock.json index a9863c7..58ad93d 100644 --- a/Influx/packages.lock.json +++ b/Influx/packages.lock.json @@ -191,7 +191,7 @@ "System.Drawing.Common": "6.0.0" } }, - "ecommons": { + "llib": { "type": "Project" } } diff --git a/LLib b/LLib new file mode 160000 index 0000000..2f6ef35 --- /dev/null +++ b/LLib @@ -0,0 +1 @@ +Subproject commit 2f6ef354c401a9f1bb9b807327acad7e98662a2e