using System; using LiteDB; using FemRec2023.Classes; using FemRec2023.Classes.DBs.DBClasses; using static FemRec2023.Classes.DBs.DBClasses.PlayerDBClasses; namespace FemRec2023.Classes.DBs { public class PlayerDB { public static LiteDatabase PlayerDBFile = new LiteDatabase(Path.Combine(Program.dataDir, "DBs", "Players.db")); public static readonly ILiteCollection Players = PlayerDBFile.GetCollection("Players"); public static FullPlayer CreateAccount(Platforms platform, ulong platformId, bool isJunior) { string username = NameGen.GetRandomName(); var newPlayerData = new Player { Username = username, DisplayName = username, CreatedAt = DateTime.UtcNow, LastLoginAt = DateTime.UtcNow, ProfileImage = "DefaultPFP.png", AvailableUsernameChanges = 3, IsJunior = isJunior, Level = 1, XP = 0, PlayerExtra = new PlayerExtra { Settings = new List { new Setting { Key = "Recroom.AccountCreation.HasStarted", Value = "True" }, new Setting { Key = "Recroom.AccountCreation.HasChosenUsername", Value = "True" }, new Setting { Key = "Recroom.AccountCreation.HasCreatedPassword", Value = "True" }, new Setting { Key = "Recroom.AccountCreation.HasFinished", Value = "True" }, new Setting { Key = "TUTORIAL_COMPLETE_MASK", Value = "57" } } } }; var newFullPlayer = new FullPlayer { PlatformIds = new List { new mPlatformID { Platform = platform, PlatformId = platformId } }, Player = newPlayerData, PlayerRoles = new List { PlayerRoles.Developer }, AuthToken = Guid.NewGuid().ToString() }; Players.Insert(newFullPlayer); return newFullPlayer; } public static bool GetLogins(Platforms platform, ulong platformId, out List accounts) { var results = Players.Find(x => x.PlatformIds .Select(p => p.PlatformId) .Any(id => id == platformId)) .Where(p => p.PlatformIds.Any(pid => pid.Platform == platform)) .OrderByDescending(x => x.Player.LastLoginAt) .ToList(); accounts = results.Select(p => new CachedLogins { accountId = p.PlayerId, lastLoginTime = p.Player.LastLoginAt, platform = platform, platformId = platformId.ToString() }).ToList(); return accounts.Count > 0; } private static PlayerDTOBase MapToDTO(FullPlayer player, bool accountMe) { int platformFlags = player.PlatformIds?.Aggregate(0, (acc, pid) => acc | (int)pid.Platform) ?? 0; var p = player.Player ?? new Player(); PlayerDTOBase dto = accountMe ? new PlayerMeDTO() : new PlayerDTO(); dto.accountId = player.PlayerId; dto.username = p.Username; dto.displayName = p.DisplayName; dto.profileImage = p.ProfileImage; dto.isJunior = p.IsJunior; dto.createdAt = p.CreatedAt; dto.platforms = platformFlags; dto.personalPronouns = 0; dto.identityFlags = 0; if (accountMe && dto is PlayerMeDTO meDto) { meDto.availableUsernameChanges = p.AvailableUsernameChanges; meDto.birthday = p.Birthday; meDto.email = p.Email; meDto.phone = null; } return dto; } public static List GetAccountsBulk(List playerIds) { var players = Players.Find(x => playerIds.Contains(x.PlayerId)).ToList(); return players .Select(p => MapToDTO(p, false)) .OrderBy(a => a.accountId) .ToList(); } public static PlayerMeDTO? GetAccountMe(long accountId) { var player = Players.FindById(accountId); if (player == null) return null; return MapToDTO(player, true) as PlayerMeDTO; } public static bool SetAvatar(long accountId, Avatar avatar) { var player = Players.FindById(accountId); if (player == null || player.Player == null) return false; player.Player.PlayerExtra.Avatar = avatar; return Players.Update(player); } public static void SetPlayerSetting(string key, string value, long playerId) { if (string.IsNullOrWhiteSpace(key) || playerId <= 0) return; if (key is "SplitTestAssignedSegments" or "Growth.LastEmailPromptTime") return; var player = Players.FindById(playerId); if (player == null || player.Player == null) return; var settings = player.Player.PlayerExtra.Settings; var existingSetting = settings.FirstOrDefault(s => s.Key == key); if (existingSetting != null) { existingSetting.Value = value; } else { settings.Add(new Setting { Key = key, Value = value }); } Players.Update(player); } public static List GetProgressionBulk(List playerIds) { var players = Players.Find(x => playerIds.Contains(x.PlayerId)).ToList(); return players.Select(p => new PlayerProgressionDTO { PlayerId = p.PlayerId, Level = p.Player?.Level ?? 1, XP = p.Player?.XP ?? 0 }).ToList(); } public static List GetReputationBulk(List playerIds) { var players = Players.Find(x => playerIds.Contains(x.PlayerId)).ToList(); return players.Select(p => { var rep = p.Player?.Reputation ?? new Reputation(); return new Reputation { AccountId = p.PlayerId, IsCheerful = rep.IsCheerful, Noteriety = rep.Noteriety, SelectedCheer = rep.SelectedCheer, CheerCredit = rep.CheerCredit, CheerGeneral = rep.CheerGeneral, CheerHelpful = rep.CheerHelpful, CheerCreative = rep.CheerCreative, CheerGreatHost = rep.CheerGreatHost, CheerSportsman = rep.CheerSportsman, SubscriberCount = rep.SubscriberCount, SubscribedCount = rep.SubscribedCount }; }).ToList(); } public static Heartbeat GetPlayerHeartbeat(long playerId) { var player = Players.FindOne(x => x.PlayerId == playerId); var hb = player?.Player.PlayerExtra.Heartbeat; hb.playerId = playerId; return hb; } public static List GetPlayerHeartbeatsBulk(List playerIds) { var players = Players.Find(x => playerIds.Contains(x.PlayerId)).ToList(); return players .Select(p => { var hb = p.Player?.PlayerExtra?.Heartbeat ?? new Heartbeat(); hb.playerId = p.PlayerId; return hb; }) .ToList(); } public static Heartbeat? UpdatePlayerHeartbeat( long playerId, RoomInstance? roomInstance, bool online = true, Platforms platform = Platforms.All, DeviceClasses deviceClasses = DeviceClasses.Unknown) { var player = Players.FindById(playerId); if (player != null) { player.Player.PlayerExtra ??= new PlayerExtra(); player.Player.PlayerExtra.Heartbeat ??= new Heartbeat(); var hb = player.Player.PlayerExtra.Heartbeat; hb.roomInstance = online ? roomInstance : null; hb.errorCode = 0; hb.isOnline = online; if (hb.roomInstance != null) hb.roomInstance.dataBlob = ""; Players.Update(player); return hb; } else { return null; } } } }