using Microsoft.EntityFrameworkCore; using SVSim.Database.Enums; using SVSim.Database.Models; using SVSim.Database.Repositories.Card; using SVSim.Database.Repositories.Globals; namespace SVSim.Database.Repositories.Viewer; public class ViewerRepository : IViewerRepository { protected readonly SVSimDbContext _dbContext; private const int MaxFriends = 20; public ViewerRepository(SVSimDbContext dbContext) { _dbContext = dbContext; } public async Task GetViewerBySocialConnection(SocialAccountType accountType, ulong socialId) { return (await _dbContext.Set() .AsNoTracking() .Include(sac => sac.Viewer) .FirstOrDefaultAsync(sac => sac.AccountType == accountType && sac.AccountId == socialId)) ?.Viewer; } public async Task GetViewerWithSocials(long id) { return await _dbContext.Set().AsNoTracking().Include(viewer => viewer.SocialAccountConnections) .FirstOrDefaultAsync(viewer => viewer.Id == id); } public async Task GetViewerByShortUdid(long shortUdid) { return await _dbContext.Set().AsNoTracking().Include(viewer => viewer.MissionData) .Include(viewer => viewer.Info).FirstOrDefaultAsync(viewer => viewer.ShortUdid == shortUdid); } public async Task RegisterViewer(string displayName, SocialAccountType socialType, ulong socialAccountIdentifier, ulong? shortUdid = null) { Models.Viewer viewer = new Models.Viewer { DisplayName = displayName }; GameConfiguration gameConfig = await new GlobalsRepository(_dbContext).GetGameConfiguration("default"); viewer.SocialAccountConnections.Add(new SocialAccountConnection { AccountId = socialAccountIdentifier, AccountType = socialType }); viewer.Info.MaxFriends = gameConfig.MaxFriends; viewer.Info.CountryCode = "KOR"; viewer.Info.BirthDate = DateTime.UtcNow; viewer.Currency.Crystals = gameConfig.DefaultCrystals; viewer.Currency.Rupees = gameConfig.DefaultRupees; viewer.Currency.RedEther = gameConfig.DefaultEther; viewer.MissionData.TutorialState = 100; // finishes tutorial for now List classes = await _dbContext.Set().ToListAsync(); viewer.Classes = classes.Select(ce => new ViewerClassData { Class = ce, Exp = 0, Level = 0, LeaderSkin = ce.DefaultLeaderSkin }).ToList(); viewer.Sleeves.Add(gameConfig.DefaultSleeve); viewer.Degrees.Add(gameConfig.DefaultDegree); viewer.Emblems.Add(gameConfig.DefaultEmblem); viewer.MyPageBackgrounds.Add(gameConfig.DefaultMyPageBackground); viewer.LeaderSkins.AddRange(viewer.Classes.Select(vcd => vcd.LeaderSkin)); _dbContext.Set().Add(viewer); await _dbContext.SaveChangesAsync(); return viewer; } }