using Microsoft.EntityFrameworkCore; using QuestShare.Common; using QuestShare.Server.Models; namespace QuestShare.Server.Managers { public class SessionManager { public static async Task GetSession(Client client) { using var context = new QuestShareContext(); return await context.Sessions.Where(s => s.Owner.ClientId == client.ClientId).FirstOrDefaultAsync(); } public static async Task GetSession(string ShareCode) { using var context = new QuestShareContext(); var session = await context.Sessions.Where(s => s.ShareCode == ShareCode).FirstOrDefaultAsync(); return session; } public static async Task GenerateSession(string connectionId, Client client) { using var context = new QuestShareContext(); var token = ClientManager.GenerateToken(); var c = await context.Clients.Where(c => c.ClientId == client.ClientId).FirstOrDefaultAsync(); var s = context.Sessions.Add(new Session { ShareCode = token[..8].ToUpperInvariant(), ReservedConnectionId = connectionId, Owner = c!, }); await context.SaveChangesAsync(); return token[..8].ToUpperInvariant(); } public static async Task CreateSession(Client owner, string connectionId, Objects.OwnedSession session) { using var context = new QuestShareContext(); var s = await context.Sessions.Where(s => s.ShareCode == session.Session.ShareCode && s.ReservedConnectionId == connectionId).FirstOrDefaultAsync(); if (s == null) { Log.Error($"[SessionManager] Failed to create session for {session.Session.OwnerCharacterId} with share code {session.Session.ShareCode}"); return null; } s.OwnerCharacterId = session.Session.OwnerCharacterId; s.IsActive = session.IsActive; s.AllowJoins = session.AllowJoins; s.SkipPartyCheck = session.SkipPartyCheck; await context.SaveChangesAsync(); return s; } public static async Task RemoveSession(string shareCode) { using var context = new QuestShareContext(); var session = await context.Sessions.Where(s => s.ShareCode == shareCode).FirstOrDefaultAsync(); if (session != null) { context.Sessions.Remove(session); await context.SaveChangesAsync(); } } public static async Task SetPartyMembers(string shareCode, List partyMembers) { using var context = new QuestShareContext(); var s = await context.Sessions.Where(s => s.ShareCode == shareCode).FirstOrDefaultAsync(); if (s != null) { s.PartyMembers = partyMembers; await context.SaveChangesAsync(); } } public static async Task AddMemberToSession(Session session, string member) { using var context = new QuestShareContext(); var s = await context.Sessions.Where(s => s.SessionId == session.SessionId).FirstOrDefaultAsync(); if (s != null) { s.AddMember(member); await context.SaveChangesAsync(); } } public static async Task RemoveMemberFromSession(Session session, Client client) { using var context = new QuestShareContext(); await context.SessionMembers.Where(s => s.Session.SessionId == session.SessionId && s.Client.ClientId == client.ClientId).ExecuteDeleteAsync(); } public static async Task> GetMembersInSession(Session session) { using var context = new QuestShareContext(); var s = await context.SessionMembers.Where(s => s.Session.SessionId == session.SessionId).Include("Sessions").Include("Clients").ToListAsync(); return s; } public static async Task UpdateActiveQuest(string shareCode, int questId, byte questStep) { using var context = new QuestShareContext(); var session = await context.Sessions.Where(s => s.ShareCode == shareCode).FirstOrDefaultAsync(); if (session == null) { // log error Console.Error.WriteLine($"Failed to update quests for session {shareCode}"); return; } session.SharedQuestStep = questStep; session.SharedQuestId = questId; var records = await context.SaveChangesAsync(); Log.Debug($"[UPDATE] Updated {records} quests for session {shareCode}"); } } }