using FFXIVClientStructs.FFXIV.Client.UI; using Newtonsoft.Json; using QuestShare.Common.API; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace QuestShare.Services { internal class ShareService { internal static uint ActiveQuestId { get; set; } = 0; internal static byte ActiveQuestStep { get; set; } = 0; internal static List SharedMembers = []; internal static List PartyMembers = []; internal static bool IsGrouped { get; set; } = false; internal static bool IsHost { get; set; } = false; internal static bool IsRegistered { get; set; } = false; internal static bool IsMsqTracking { get; set; } = false; internal static string ShareCode { get; private set; } = ""; internal static string HostedShareCode { get; private set; } = ""; internal static string Token { get; set; } = ""; public static void Initialize() { Addons.AddonPartyList.OnMemberCountChanged += OnPartyChanged; ClientState.Login += OnLogin; ClientState.Logout += OnLogout; } public static void Dispose() { OnLogout(0,0); Addons.AddonPartyList.OnMemberCountChanged -= OnPartyChanged; ClientState.Login -= OnLogin; ClientState.Logout -= OnLogout; } public static void OnLogin() { ShareCode = Plugin.Configuration.Instance.LastShareCode; Token = Plugin.Configuration.Instance.Token; } public static void OnLogout(int code, int state) { Plugin.Configuration.Instance.Token = Token; Plugin.Configuration.Instance.LastShareCode = ShareCode; Plugin.Configuration.Save(); SharedMembers = []; PartyMembers = []; IsGrouped = false; IsHost = false; IsRegistered = false; ShareCode = ""; HostedShareCode = ""; Token = ""; ActiveQuestId = 0; ActiveQuestStep = 0; } public static void SetShareCode(string shareCode) { ShareCode = shareCode; } public static void SetHostedShareCode(string shareCode) { HostedShareCode = shareCode; } public static void SetActiveQuest(uint questId, byte questStep) { Log.Debug($"Setting active quest to {questId} - {questStep}"); ActiveQuestId = questId; ActiveQuestStep = questStep; } private static void OnPartyChanged(object? sender, EventArgs e) { var members = new List(); foreach (var member in PartyList) { members.Add((ulong)member.ContentId); } PartyMembers = members; SocketClientService.DispatchUpdate(true); } public class SharedMember { public required ulong CharacterId { get; set; } public string CharacterName => ResolveCharacterName(CharacterId); public bool IsHost { get; set; } = false; public bool IsMe { get; set; } = false; } public static string ResolveCharacterName(ulong characterId) { var member = SharedMembers.FirstOrDefault(m => m.CharacterId == characterId); if (member != null && member.CharacterName == "") { if (File.Exists(Path.Join(Plugin.PluginDataPath, "CharacterNames.json"))) { var characterNames = JsonConvert.DeserializeObject>(File.ReadAllText(Path.Join(Plugin.PluginDataPath, "CharacterNames.json"))); if (characterNames != null && characterNames.ContainsKey(member.CharacterId)) { return characterNames[member.CharacterId]; } } return member.CharacterName; } return ""; } public static void SaveCharacterName(ulong characterId, string characterName) { if (File.Exists(Path.Join(Plugin.PluginDataPath, "CharacterNames.json"))) { var characterNames = JsonConvert.DeserializeObject>(File.ReadAllText(Path.Join(Plugin.PluginDataPath, "CharacterNames.json"))); characterNames ??= []; characterNames[characterId] = characterName; File.WriteAllText(Path.Join(Plugin.PluginDataPath, "CharacterNames.json"), JsonConvert.SerializeObject(characterNames)); } else { File.WriteAllText(Path.Join(Plugin.PluginDataPath, "CharacterNames.json"), JsonConvert.SerializeObject(new Dictionary { { characterId, characterName } })); } } } }