qstbak/QuestionableCompanion/QuestionableCompanion.Services/AlliedSocietyDatabase.cs
2025-12-04 04:39:08 +10:00

162 lines
4.5 KiB
C#

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<AlliedSocietyProgress>();
}
List<AlliedSocietyProgress> 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<AlliedSocietyProgress> 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<string> 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<string> GetCharactersNeedingReset(DateTime nextResetDate)
{
List<string> result = new List<string>();
DateTime lastResetDate = nextResetDate.AddDays(-1.0);
foreach (KeyValuePair<string, AlliedSocietyCharacterStatus> 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<string, AlliedSocietyCharacterStatus> 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();
}
}