using System; using System.Collections.Generic; using System.Linq; using Dalamud.Plugin.Services; using QuestionableCompanion.Models; namespace QuestionableCompanion.Services; public class AlliedSocietyDatabase { private readonly Configuration configuration; private readonly IPluginLog log; public AlliedSocietyDatabase(Configuration configuration, IPluginLog log) { this.configuration = configuration; this.log = log; if (configuration.AlliedSociety.RotationConfig.Priorities.Count == 0) { configuration.AlliedSociety.RotationConfig.InitializeDefaults(); SaveToConfig(); } } public void SaveToConfig() { configuration.Save(); } public void UpdateCharacterProgress(string characterId, byte societyId, int rank, bool isMaxRank) { if (!configuration.AlliedSociety.CharacterProgress.ContainsKey(characterId)) { configuration.AlliedSociety.CharacterProgress[characterId] = new List(); } List progressList = configuration.AlliedSociety.CharacterProgress[characterId]; AlliedSocietyProgress existing = progressList.FirstOrDefault((AlliedSocietyProgress p) => p.SocietyId == societyId); if (existing != null) { existing.CurrentRank = rank; existing.IsMaxRank = isMaxRank; } else { progressList.Add(new AlliedSocietyProgress { CharacterId = characterId, SocietyId = societyId, CurrentRank = rank, IsMaxRank = isMaxRank }); } SaveToConfig(); } public AlliedSocietyProgress? GetProgress(string characterId, byte societyId) { if (configuration.AlliedSociety.CharacterProgress.TryGetValue(characterId, out List list)) { return list.FirstOrDefault((AlliedSocietyProgress p) => p.SocietyId == societyId); } return null; } public AlliedSocietyCharacterStatus GetCharacterStatus(string characterId) { if (!configuration.AlliedSociety.CharacterStatuses.ContainsKey(characterId)) { configuration.AlliedSociety.CharacterStatuses[characterId] = new AlliedSocietyCharacterStatus { CharacterId = characterId, Status = AlliedSocietyRotationStatus.Ready }; SaveToConfig(); } return configuration.AlliedSociety.CharacterStatuses[characterId]; } public void UpdateCharacterStatus(string characterId, AlliedSocietyRotationStatus status) { GetCharacterStatus(characterId).Status = status; SaveToConfig(); } public void SetCharacterComplete(string characterId, DateTime completionDate) { AlliedSocietyCharacterStatus characterStatus = GetCharacterStatus(characterId); characterStatus.Status = AlliedSocietyRotationStatus.Complete; characterStatus.LastCompletionDate = completionDate; characterStatus.ImportedQuestIds.Clear(); SaveToConfig(); } public void CheckAndResetExpired(DateTime nextResetDate) { List charactersToReset = GetCharactersNeedingReset(nextResetDate); foreach (string charId in charactersToReset) { log.Information("[AlliedSociety] Resetting status for character " + charId); AlliedSocietyCharacterStatus characterStatus = GetCharacterStatus(charId); characterStatus.Status = AlliedSocietyRotationStatus.Ready; characterStatus.ImportedQuestIds.Clear(); } if (charactersToReset.Count > 0) { SaveToConfig(); } } public List GetCharactersNeedingReset(DateTime nextResetDate) { List result = new List(); DateTime lastResetDate = nextResetDate.AddDays(-1.0); foreach (KeyValuePair kvp in configuration.AlliedSociety.CharacterStatuses) { AlliedSocietyCharacterStatus status = kvp.Value; if (status.Status == AlliedSocietyRotationStatus.Ready) { continue; } if (status.LastCompletionDate.HasValue) { if (status.LastCompletionDate.Value < lastResetDate) { result.Add(kvp.Key); } } else { result.Add(kvp.Key); } } return result; } public void ClearAllStatuses() { foreach (KeyValuePair kvp in configuration.AlliedSociety.CharacterStatuses) { kvp.Value.Status = AlliedSocietyRotationStatus.Ready; kvp.Value.ImportedQuestIds.Clear(); } SaveToConfig(); } public void AddImportedQuest(string characterId, string questId) { AlliedSocietyCharacterStatus status = GetCharacterStatus(characterId); if (!status.ImportedQuestIds.Contains(questId)) { status.ImportedQuestIds.Add(questId); SaveToConfig(); } } public void ClearImportedQuests(string characterId) { GetCharacterStatus(characterId).ImportedQuestIds.Clear(); SaveToConfig(); } }