2025-02-18 00:07:12 -05:00

135 lines
4.9 KiB
C#

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<SharedMember> SharedMembers = [];
internal static List<ulong> 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<ulong>();
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<Dictionary<ulong, string>>(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<Dictionary<ulong, string>>(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<ulong, string> { { characterId, characterName } }));
}
}
}
}