using ASodium; using Newtonsoft.Json; using nksrv.LobbyServer; using nksrv.StaticInfo; using Swan.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static Google.Rpc.Context.AttributeContext.Types; namespace nksrv.Utils { public class AccessToken { public string Token = ""; public long ExpirationTime; public ulong UserID; } public class FieldInfo { public List CompletedStages = []; public List CompletedObjects = []; } public class Character { // TODO public int Csn = 0; public int Tid = 0; public int CostumeId = 0; public int Level = 1; public int UltimateLevel = 1; public int Skill1Lvl = 1; public int Skill2Lvl = 1; public int Grade = 0; } public class MainQuestData { public int TableId = 0; public bool IsReceieved = false; } public class UserPointData { public int UserLevel = 1; public int ExperiencePoint = 0; } public class ItemData { public int ItemType; public long Csn; public int Count; public int Level; public int Exp; public int Position; public int Corp; public long Isn; } public class EventData { public List CompletedScenarios = new(); } public class User { // User info public string Username = ""; public string Password = ""; public string PlayerName = ""; public ulong ID; public long RegisterTime; public int LastNormalStageCleared; public int LastHardStageCleared; public string Nickname = "SomePlayer"; public int ProfileIconId = 39900; public bool ProfileIconIsPrism = false; // Game data public List CompletedScenarios = []; public Dictionary FieldInfo = []; public Dictionary MapJson = []; public Dictionary Currency = new() { { CurrencyType.ContentStamina, 2 }, { CurrencyType.CharPremiumTicket, 999999 } }; public List Items = new(); public List Characters = []; public NetWholeUserTeamData RepresentationTeamData = new(); public Dictionary ClearedTutorialData = []; public NetWallpaperData[] WallpaperList = []; public Dictionary UserTeams = new Dictionary(); public Dictionary MainQuestData = new() { {1, false } }; public int InfraCoreExp = 0; public int InfraCoreLvl = 1; public UserPointData userPointData = new(); public DateTime LastLogin = DateTime.UtcNow; public DateTime BattleTime = DateTime.UtcNow; public NetOutpostBattleLevel OutpostBattleLevel = new() { Level = 1 }; public int GachaTutorialPlayCount = 0; // Event data public Dictionary EventInfo = new(); public void SetQuest(int tid, bool recieved) { if (MainQuestData.ContainsKey(tid)) { MainQuestData[tid] = recieved; return; } else { MainQuestData.Add(tid, recieved); } } public int GenerateUniqueItemId() { var num = Rng.RandomId(); while (Items.Any(x => x.Isn == num)) { num = Rng.RandomId(); } return num; } } public class CoreInfo { public int DbVersion = 0; public List Users = []; public List LauncherAccessTokens = []; public Dictionary GameClientTokens = []; } internal class JsonDb { public static CoreInfo Instance { get; internal set; } public static byte[] ServerPrivateKey = Convert.FromBase64String("FSUY8Ohd942n5LWAfxn6slK3YGwc8OqmyJoJup9nNos="); public static byte[] ServerPublicKey = Convert.FromBase64String("04hFDd1e/BOEF2h4b0MdkX2h6W5REeqyW+0r9+eSeh0="); // Note: change this in sodium static JsonDb() { if (!File.Exists(AppDomain.CurrentDomain.BaseDirectory + "/db.json")) { Logger.Warn("users: warning: configuration not found, writing default data"); Instance = new CoreInfo(); Save(); } Logger.Info("Loaded db"); var j = JsonConvert.DeserializeObject(File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "/db.json")); if (j != null) { Instance = j; if (Instance.DbVersion == 0) { Instance.DbVersion = 1; // In older versions, field info key used chapter number, but now difficultly is appened. Console.WriteLine("Starting database update..."); foreach (var user in Instance.Users) { foreach (var f in user.FieldInfo.ToList()) { var isNumeric = int.TryParse(f.Key, out int n); if (isNumeric) { var val = f.Value; user.FieldInfo.Remove(f.Key); user.FieldInfo.Add(n + "_Normal", val); } } } Console.WriteLine("Database update completed"); } Save(); } else { throw new Exception("Failed to read configuration json file"); } } public static User? GetUser(ulong id) { return Instance.Users.Where(x => x.ID == id).FirstOrDefault(); } public static void Save() { if (Instance != null) { File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + "/db.json", JsonConvert.SerializeObject(Instance, Formatting.Indented)); } } } }