using Microsoft.EntityFrameworkCore; using RadicadeServer.DB; using RadicadeServer.RecNet.Accounts.Local; using RadicadeServer.RecNet.Accounts; using RadicadeServer.RecNet.Auth.Cached; using RadicadeServer.RecNet.Auth; using RadicadeServer.RecNet; using RadicadeServer.RecNet.Config; using RadicadeServer.RecNet.Enums; using RadicadeServer.RecNet.Leveling; using RadicadeServer.RecNet.Moderation; using RadicadeServer.RecNet.Rooms; using RadicadeServer.Extensions; using System; using RadicadeServer.RecNet.Enums.Players; using RadicadeServer.RecNet.Enums.Rooms; using RadicadeServer.RecNet.Progression; namespace RadicadeServer.Utils { public static class FirstTimeUtils { public const string AutoMicMutingConfig = "{\"MicSpamVolumeThreshold\":1.125,\"MicVolumeSampleInterval\":0.25,\"MicVolumeSampleRollingWindowLength\":7,\"MicSpamSamplePercentageForWarning\":0.8,\"MicSpamSamplePercentageForWarningToEnd\":0.2,\"MicSpamSamplePercentageForForceMute\":0.8,\"MicSpamSamplePercentageForForceMuteToEnd\":0.2,\"MicSpamWarningStateVolumeMultiplier\":0.25}"; public const string StorefrontConfig = "{\"MinPlayerLevelForGifting\":1,\"LatestStoreBadgeDateTime\":\"2025-11-13T17:27:21.5641043Z\"}"; public const string LevelProgressionMap = "[{\"Level\":0,\"RequiredXp\":0,\"GiftDropId\":null},{\"Level\":1,\"RequiredXp\":10,\"GiftDropId\":3288},{\"Level\":2,\"RequiredXp\":10,\"GiftDropId\":3293},{\"Level\":3,\"RequiredXp\":10,\"GiftDropId\":3288},{\"Level\":4,\"RequiredXp\":20,\"GiftDropId\":3293},{\"Level\":5,\"RequiredXp\":20,\"GiftDropId\":3288},{\"Level\":6,\"RequiredXp\":20,\"GiftDropId\":3293},{\"Level\":7,\"RequiredXp\":20,\"GiftDropId\":3288},{\"Level\":8,\"RequiredXp\":20,\"GiftDropId\":3293},{\"Level\":9,\"RequiredXp\":20,\"GiftDropId\":3288},{\"Level\":10,\"RequiredXp\":20,\"GiftDropId\":3293},{\"Level\":11,\"RequiredXp\":45,\"GiftDropId\":3293},{\"Level\":12,\"RequiredXp\":45,\"GiftDropId\":3293},{\"Level\":13,\"RequiredXp\":45,\"GiftDropId\":3293},{\"Level\":14,\"RequiredXp\":45,\"GiftDropId\":3293},{\"Level\":15,\"RequiredXp\":45,\"GiftDropId\":3293},{\"Level\":16,\"RequiredXp\":45,\"GiftDropId\":3293},{\"Level\":17,\"RequiredXp\":45,\"GiftDropId\":3293},{\"Level\":18,\"RequiredXp\":45,\"GiftDropId\":3293},{\"Level\":19,\"RequiredXp\":45,\"GiftDropId\":3293},{\"Level\":20,\"RequiredXp\":45,\"GiftDropId\":3293},{\"Level\":21,\"RequiredXp\":115,\"GiftDropId\":3293},{\"Level\":22,\"RequiredXp\":115,\"GiftDropId\":3292},{\"Level\":23,\"RequiredXp\":115,\"GiftDropId\":3293},{\"Level\":24,\"RequiredXp\":115,\"GiftDropId\":3292},{\"Level\":25,\"RequiredXp\":115,\"GiftDropId\":3293},{\"Level\":26,\"RequiredXp\":115,\"GiftDropId\":3292},{\"Level\":27,\"RequiredXp\":115,\"GiftDropId\":3293},{\"Level\":28,\"RequiredXp\":115,\"GiftDropId\":3292},{\"Level\":29,\"RequiredXp\":115,\"GiftDropId\":3293},{\"Level\":30,\"RequiredXp\":115,\"GiftDropId\":3292},{\"Level\":31,\"RequiredXp\":360,\"GiftDropId\":3291},{\"Level\":32,\"RequiredXp\":360,\"GiftDropId\":3292},{\"Level\":33,\"RequiredXp\":360,\"GiftDropId\":3292},{\"Level\":34,\"RequiredXp\":360,\"GiftDropId\":3292},{\"Level\":35,\"RequiredXp\":360,\"GiftDropId\":3291},{\"Level\":36,\"RequiredXp\":360,\"GiftDropId\":3292},{\"Level\":37,\"RequiredXp\":360,\"GiftDropId\":3292},{\"Level\":38,\"RequiredXp\":360,\"GiftDropId\":3292},{\"Level\":39,\"RequiredXp\":360,\"GiftDropId\":3292},{\"Level\":40,\"RequiredXp\":360,\"GiftDropId\":3291},{\"Level\":41,\"RequiredXp\":1080,\"GiftDropId\":3291},{\"Level\":42,\"RequiredXp\":1080,\"GiftDropId\":3291},{\"Level\":43,\"RequiredXp\":1080,\"GiftDropId\":3291},{\"Level\":44,\"RequiredXp\":1080,\"GiftDropId\":3291},{\"Level\":45,\"RequiredXp\":1080,\"GiftDropId\":3291},{\"Level\":46,\"RequiredXp\":1080,\"GiftDropId\":3291},{\"Level\":47,\"RequiredXp\":1080,\"GiftDropId\":3291},{\"Level\":48,\"RequiredXp\":1080,\"GiftDropId\":3291},{\"Level\":49,\"RequiredXp\":1080,\"GiftDropId\":3291},{\"Level\":50,\"RequiredXp\":1080,\"GiftDropId\":3290},{\"Level\":51,\"RequiredXp\":270,\"GiftDropId\":33363},{\"Level\":52,\"RequiredXp\":270,\"GiftDropId\":3292},{\"Level\":53,\"RequiredXp\":297,\"GiftDropId\":33462},{\"Level\":54,\"RequiredXp\":297,\"GiftDropId\":3291},{\"Level\":55,\"RequiredXp\":297,\"GiftDropId\":18152},{\"Level\":56,\"RequiredXp\":356,\"GiftDropId\":3292},{\"Level\":57,\"RequiredXp\":356,\"GiftDropId\":33466},{\"Level\":58,\"RequiredXp\":356,\"GiftDropId\":3291},{\"Level\":59,\"RequiredXp\":356,\"GiftDropId\":3314},{\"Level\":60,\"RequiredXp\":356,\"GiftDropId\":3290},{\"Level\":61,\"RequiredXp\":428,\"GiftDropId\":3292},{\"Level\":62,\"RequiredXp\":428,\"GiftDropId\":33338},{\"Level\":63,\"RequiredXp\":428,\"GiftDropId\":3292},{\"Level\":64,\"RequiredXp\":428,\"GiftDropId\":33463},{\"Level\":65,\"RequiredXp\":428,\"GiftDropId\":4463},{\"Level\":66,\"RequiredXp\":428,\"GiftDropId\":3291},{\"Level\":67,\"RequiredXp\":428,\"GiftDropId\":3880},{\"Level\":68,\"RequiredXp\":428,\"GiftDropId\":3292},{\"Level\":69,\"RequiredXp\":428,\"GiftDropId\":33464},{\"Level\":70,\"RequiredXp\":428,\"GiftDropId\":33329},{\"Level\":71,\"RequiredXp\":556,\"GiftDropId\":3292},{\"Level\":72,\"RequiredXp\":556,\"GiftDropId\":3025},{\"Level\":73,\"RequiredXp\":556,\"GiftDropId\":3291},{\"Level\":74,\"RequiredXp\":556,\"GiftDropId\":33305},{\"Level\":75,\"RequiredXp\":556,\"GiftDropId\":33467},{\"Level\":76,\"RequiredXp\":556,\"GiftDropId\":3292},{\"Level\":77,\"RequiredXp\":556,\"GiftDropId\":33465},{\"Level\":78,\"RequiredXp\":556,\"GiftDropId\":3291},{\"Level\":79,\"RequiredXp\":556,\"GiftDropId\":33202},{\"Level\":80,\"RequiredXp\":556,\"GiftDropId\":33051},{\"Level\":81,\"RequiredXp\":778,\"GiftDropId\":3291},{\"Level\":82,\"RequiredXp\":778,\"GiftDropId\":33335},{\"Level\":83,\"RequiredXp\":778,\"GiftDropId\":3292},{\"Level\":84,\"RequiredXp\":778,\"GiftDropId\":33281},{\"Level\":85,\"RequiredXp\":778,\"GiftDropId\":33203},{\"Level\":86,\"RequiredXp\":778,\"GiftDropId\":3291},{\"Level\":87,\"RequiredXp\":778,\"GiftDropId\":33468}]"; public const string DailyObjectives = "[[{\"type\":1030,\"score\":1,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null},{\"type\":1033,\"score\":10,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null},{\"type\":2000,\"score\":1,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null}],[{\"type\":601,\"score\":2,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null},{\"type\":32,\"score\":1,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null},{\"type\":6,\"score\":1,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null}],[{\"type\":301,\"score\":2,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null},{\"type\":302,\"score\":2,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null},{\"type\":6,\"score\":1,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null}],[{\"type\":701,\"score\":2,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null},{\"type\":702,\"score\":20,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null},{\"type\":32,\"score\":1,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null}],[{\"type\":1010,\"score\":1,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null},{\"type\":1013,\"score\":10,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null},{\"type\":6,\"score\":1,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null}],[{\"type\":500,\"score\":2,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null},{\"type\":502,\"score\":20,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null},{\"type\":2000,\"score\":1,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null}],[{\"type\":1020,\"score\":1,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null},{\"type\":1023,\"score\":10,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null},{\"type\":32,\"score\":1,\"xp\":200,\"descriptionOverride\":null,\"tooltipOverride\":null}]]"; public const string NamedImages = "[{\"FriendlyImageName\":\"DormRoomBucket\",\"ImageName\":\"n/67gesMhbOkCd3-qO1cKkIg\",\"StartTime\":\"2018-09-27T18:00:00Z\",\"EndTime\":\"2222-02-22T22:22:00Z\"},{\"FriendlyImageName\":\"ControlSchemeTutorial_Creator\",\"ImageName\":\"n/877acd69ecf44493a21021fadb5f77e4\",\"StartTime\":\"2023-05-23T00:12:00Z\",\"EndTime\":\"2030-05-23T00:12:00Z\"},{\"FriendlyImageName\":\"UI_Menu_Token_Image_10\",\"ImageName\":\"n/54094cbd9d0b455fb949266d1679a834\",\"StartTime\":\"2025-06-02T07:00:00Z\",\"EndTime\":\"2099-06-02T07:00:00Z\"},{\"FriendlyImageName\":\"UI_Menu_Token_Image_25\",\"ImageName\":\"n/4e4e496810ae4bbcb61564c34df450b6\",\"StartTime\":\"2025-06-02T07:00:00Z\",\"EndTime\":\"2099-06-02T07:00:00Z\"},{\"FriendlyImageName\":\"UI_Menu_Token_Image_50\",\"ImageName\":\"n/ca1c08334a7a422b941ef2987b636edf\",\"StartTime\":\"2025-06-02T07:00:00Z\",\"EndTime\":\"2099-06-02T07:00:00Z\"},{\"FriendlyImageName\":\"UI_Menu_Token_Image_100\",\"ImageName\":\"n/979ea0d3d9e9487cb7ca56c37c7ece6b\",\"StartTime\":\"2025-06-02T07:00:00Z\",\"EndTime\":\"2099-06-02T07:00:00Z\"},{\"FriendlyImageName\":\"MintFloatieBetterThumbnail\",\"ImageName\":\"n/23998eb5a1714dcc94a97b9b6ea82d50\",\"StartTime\":\"2025-07-02T23:24:00Z\",\"EndTime\":\"2026-07-02T23:24:00Z\"},{\"FriendlyImageName\":\"IceCreamHatBetterThumbnail\",\"ImageName\":\"n/aec858dad86b42238338da60a5071dc2\",\"StartTime\":\"2025-07-02T23:25:00Z\",\"EndTime\":\"2026-07-02T23:25:00Z\"},{\"FriendlyImageName\":\"IceCreamShirtBetterThumbnail\",\"ImageName\":\"n/55a94ecff89543b0bef248bc1b232906\",\"StartTime\":\"2025-07-02T23:25:00Z\",\"EndTime\":\"2026-07-02T23:25:00Z\"},{\"FriendlyImageName\":\"IceCreamPantsBetterThumbnail\",\"ImageName\":\"n/3cd34681c224408e9f1a8d29ed3efd66\",\"StartTime\":\"2025-07-02T23:26:00Z\",\"EndTime\":\"2026-07-02T23:26:00Z\"},{\"FriendlyImageName\":\"IceCreamGlovesBetterThumbnail\",\"ImageName\":\"n/a68d8ae9938045ee895028f0be46e141\",\"StartTime\":\"2025-07-02T23:26:00Z\",\"EndTime\":\"2026-07-02T23:26:00Z\"}]"; public static readonly string LoadingScreen = LoadingScreenImages.Tips.ToJson(); public const string GiftDropStoreItems = "[{\"PurchasableItemId\":2597201,\"Type\":0,\"IsFeatured\":true,\"Prices\":[{\"CurrencyType\":2,\"Price\":100}],\"GiftDrops\":[{\"GiftDropId\":0,\"ItemSetId\":0,\"ItemSetFriendlyName\":\"rawdata\",\"FriendlyName\":\"rawdata\",\"Tooltip\":\"rawdata\",\"IsQuery\":false,\"Unique\":false,\"SubscribersOnly\":false,\"ConsumableItemDesc\":\"\",\"AvatarItemDesc\":\"274cb9b2-2f59-47ea-9a8d-a5b656d148c6,,,\",\"AvatarItemType\":0,\"EquipmentPrefabName\":\"\",\"EquipmentModificationGuid\":\"\",\"CurrencyType\":0,\"Currency\":0,\"Xp\":0,\"Platform\":0,\"PlatformsToSpawnOn\":0,\"Context\":0,\"Rarity\":0}]}]"; public const string CommunityBoard = "{\"FeaturedPlayer\":{\"Id\":1,\"TitleOverride\":\"Community Star\",\"UrlOverride\":\"\"},\"FeaturedRoomGroup\":{\"FeaturedRoomGroupId\":1,\"Name\":\"Top Picks\",\"Rooms\":[{\"RoomId\":2,\"RoomName\":\"Rec Center\",\"ImageName\":\"\"},{\"RoomId\":4,\"RoomName\":\"Golden Trophy\",\"ImageName\":\"\"}]},\"CurrentAnnouncement\":{\"Message\":\"Welcome to Radicade!\",\"MoreInfoUrl\":\"\"},\"InstagramImages\":null,\"Videos\":null}"; public const string CurrentFeatured = "{\"FeaturedRoomGroupId\":0,\"Name\":\"RecRoomOriginals\",\"Rooms\":[{\"RoomId\":2,\"RoomName\":\"RecCenter\",\"ImageName\":\"RecCenter\"}]}"; private static Dictionary Images = new(); private static void ParseImagesFile() { if (!File.Exists(DBConfig.DefaultImagesFile)) { return; } string readFile = File.ReadAllText(DBConfig.DefaultImagesFile); string[] keys = readFile.Split('\n', StringSplitOptions.RemoveEmptyEntries); foreach (var key in keys) { if (key.StartsWith("#")) continue; if (string.IsNullOrEmpty(key)) continue; string[] values = key.Split('=', 2, StringSplitOptions.TrimEntries); if (values.Length != 2) continue; Images[values[0]] = values[1]; } } public async static Task DownloadImages() { if (Images.Count == 0) ParseImagesFile(); HttpClient httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(30) }; foreach (var image in Images.Keys) { string filePath = Path.Join(DBConfig.CDNImages, image); string url = Images[image]; if (File.Exists(filePath)) continue; using var response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead); if (!response.IsSuccessStatusCode) { continue; } await using var stream = await response.Content.ReadAsStreamAsync(); await using var fileStream = File.Create(filePath); await stream.CopyToAsync(fileStream); } httpClient.Dispose(); } public async static Task AddCoach(this RecDBContext ctx) { Profile profile = new Profile(); profile.platforms = 1; profile.username = "Coach"; profile.profileImage = "default"; profile.displayName = profile.username; profile.isJunior = false; profile.createdAt = DateTime.Now; await ctx.Profiles.AddAsync(profile); await ctx.SaveChangesAsync(); PlayerAvatar playerAvatar = new PlayerAvatar(); playerAvatar.Avatar = DBConfig.DefaultAvatar; playerAvatar.Outfits = "[]"; playerAvatar.AccountId = profile.accountId; Reputation reputation = new Reputation(); reputation.AccountId = profile.accountId; PlayerSettings settings = new PlayerSettings(); settings.AccountId = profile.accountId; settings.Settings = DBConfig.DefaultSettings2023; ProgressionData progression = new ProgressionData(); progression.PlayerId = profile.accountId; progression.XP = 0; progression.Level = 99; progression.Progress = new ProgressionJson().ToJson(); RealPresence presence = new RealPresence(); presence.playerId = profile.accountId; presence.deviceClass = DeviceClass.Unknown; presence.statusVisibility = StatusVisibility.Public; presence.vRMovementMode = VRMovementModes.TELEPORT; presence.roomInstance = null; presence.LoginLock = null; Currency currency = new Currency(); currency.AccountId = profile.accountId; PlayerUnlocks unlocks = new PlayerUnlocks(); unlocks.AccountId = profile.accountId; CachedLogin cachedLogin = new CachedLogin(); cachedLogin.accountId = profile.accountId; cachedLogin.platform = Platforms.All; cachedLogin.platformId = "0"; cachedLogin.lastLoginTime = DateTime.Now; PlayerData playerData = new PlayerData(); playerData.AccountId = profile.accountId; playerData.Phone = ""; playerData.Birthday = DateTime.MinValue; playerData.Parent = null; playerData.AppVersion = DBConfig.GameVersion; playerData.DeviceClass = DeviceClass.Unknown; playerData.NameChanges = 99; playerData.Email = ""; playerData.Hashword = ""; playerData.JuniorState = JuniorState.BasedOnBirthday; playerData.Visibility = StatusVisibility.Public; await ctx.CachedLogins.AddAsync(cachedLogin); await ctx.Avatars.AddAsync(playerAvatar); await ctx.Reputations.AddAsync(reputation); await ctx.PlayerSettings.AddAsync(settings); await ctx.Presences.AddAsync(presence); await ctx.Currency.AddAsync(currency); await ctx.Unlocks.AddAsync(unlocks); await ctx.Players.AddAsync(playerData); await ctx.Progression.AddAsync(progression); await ctx.SaveChangesAsync(); } public async static Task AddServerConfig(this RecDBContext ctx) { await ctx.ServerConfig.AddAsync(new ServerConfigVal("AccountCreate.RequireSteamTicket", "false")); await ctx.ServerConfig.AddAsync(new ServerConfigVal("WhitelistOnly", "false")); await ctx.ServerConfig.AddAsync(new ServerConfigVal("SteamWhitelist", "")); await ctx.ServerConfig.AddAsync(new ServerConfigVal("Announcement", "[]")); await ctx.ServerConfig.AddAsync(new ServerConfigVal("NamedImages", NamedImages)); await ctx.ServerConfig.AddAsync(new ServerConfigVal("LoadingScreenTipData", LoadingScreen)); await ctx.ServerConfig.AddAsync(new ServerConfigVal("CommunityBoard", CommunityBoard)); await ctx.ServerConfig.AddAsync(new ServerConfigVal("CurrentFeaturedRooms", CurrentFeatured)); await ctx.ServerConfig.AddAsync(new ServerConfigVal("Filters", "rro")); await ctx.ServerConfig.AddAsync(new ServerConfigVal("CharadesWords", "Dog;Cat;Bird;Fish;Monkey;Elephant;Dinosaur;Robot;Superhero;Pirate;Cowboy;Astronaut;Chef;Doctor;Police Officer;Firefighter;Teacher;Baby;Zombie;Ghost;Brushing Teeth;Taking a Shower;Eating Spaghetti;Making a Sandwich;Riding a Bike;Swimming;Running;Sleeping;Dancing;Singing;Fishing;Cooking;Driving a Car;Flying a Plane;Basketball;Soccer;Guitar;Taking a Selfie;Opening a Present;Walking a Dog;Chicken;LEGO;Banana Peel;Bees;Fly;Elevator;Phone;Jar;Spider;Dinosaur;Invisible Enemy;Wind;Mosquito;Falling;Reflection;Sneaking;Glass Door;Carrying Boxes;Revolving Door;Floor Is Lava;Magician;Detective;Ninja;Vampire;Werewolf;King;Queen;Knight;Scientist;Construction Worker;Photographer;Rock Star;News Reporter;Secret Agent;Treasure Hunter;Time Traveler;Supervillain;Circus Performer;Archaeologist;Lifeguard;Raccoon;Penguin;Pizza;Grandma;Alien;Wi-Fi;Police Officer;Superhero;Job;Horse;Fish;Ghost;Vampire;Monkey;Astronaut;Wizard;Shark;Tiny Door")); await ctx.ServerConfig.AddAsync(new ServerConfigVal("CharadesAprilFoolsWords", "Prank;Joke;Fool;Trick;Clown;Jester;Comedian;Confetti;Balloon;Pie;Banana;Chicken;Spider;Bug;Snake;Mustache;Disguise;Mask;Costume;Surprise;Laughter;Sneak;Hide;Scare;Troll;Mischief;Chaos;Fake;Lie;Trap;Decoy;Magic;Wizard;Detective;Thief;Rubber Chicken;Whoopee Cushion;Whistle;Air Horn;Party;Celebration;Secret;Shock;Confusion;Scream;Giggle;Smile;Prankster;Foolish;Trickster;Gotcha;April Fools")); await ctx.ServerConfig.AddAsync(new ServerConfigVal("Icebreakers", "Favorite Game;First Game;Favorite Room;Funniest Gaming Moment;Dream Game Feature;Favorite Platform;Favorite Game Genre;Worst Game;Favorite Soundtrack;Favorite Video Game World;Favorite Food;Weirdest Food;Favorite Animal;Weirdest Dream;Dream Skill;Useless Talent;Favorite Meal;Favorite Movie;Favorite TV Show;Favorite Song;Favorite Holiday;Morning Person;Night Owl;Dream Vacation;Dream Job;Favorite Season;Favorite Hobby;Favorite Sport;Favorite Color;Favorite Memory;Flying;Invisibility;Unlimited Money;Free Time;Underwater;Space;Internet;Video Games;Rewind;Pause;Future;Past;Luck;Intelligence;Theme Park;Video Game;Tiny Version;Giant Version;Loading Screen;Username;NPC;Avatar;Food Name;Superpower;Aliens;Pet;Dumbest Argument;Dream House;Dream Car;Favorite Character;Favorite YouTuber;Favorite Musician;Favorite Book;Favorite App;Favorite Website;Favorite Holiday;Favorite Game Character;Favorite Snack;Favorite Drink;Favorite Place;Favorite School Subject;Favorite Sport;Favorite Meme;Favorite Emoji;Favorite Childhood Game;Dream Pet;Dream Superpower;Dream Adventure;Best Friend;Biggest Fear;Hidden Talent;Bucket List;Perfect Day;Favorite Weather;Favorite Time of Day;Favorite Season;Favorite Number;Favorite Letter;Favorite Fruit;Favorite Candy;Favorite Restaurant;Favorite Pizza Topping;Favorite Ice Cream;Favorite Cereal;Favorite Breakfast;Favorite Fast Food;Favorite Dessert;Favorite Vegetable;Favorite Cartoon;Favorite Superhero;Favorite Villain;Favorite Movie Character;Favorite Game Developer")); await ctx.ServerConfig.AddAsync(new ServerConfigVal("HighRanks", "1")); } public async static Task AddConfig(this RecDBContext ctx) { MainConfig mainConfig = new MainConfig(); mainConfig.ShareBaseUrl = DBConfig.NameServer.WWW + "{0}"; mainConfig.CdnBaseUri = DBConfig.NameServer.CDN; mainConfig.LevelProgressionMaps = LevelProgressionMap; mainConfig.AutoMicMutingConfig = AutoMicMutingConfig; mainConfig.StorefrontConfig = StorefrontConfig; mainConfig.DailyObjectives = DailyObjectives; mainConfig.ServerMaintenance = "{\"StartsInMinutes\":0}"; mainConfig.RoomKeyConfig = "{\"MaxKeysPerRoom\":500}"; mainConfig.RoomCurrencyConfig = "{}"; mainConfig.GiftDropStoreItems = GiftDropStoreItems; mainConfig.FUCKYOUMICROSOFT = Guid.NewGuid().ToString(); await ctx.Config.AddAsync(mainConfig); } public async static Task AddDefaultRooms(this RecDBContext ctx) { await AddDormRoom(ctx); await DefaultRooms.EnsureAsync(ctx); } public async static Task AddDormRoom(this RecDBContext ctx) { SubRoom dormSubRoom = new SubRoom(); dormSubRoom.DataBlob = ""; dormSubRoom.IsSandbox = true; dormSubRoom.MaxPlayers = 20; dormSubRoom.Accessibility = RecNet.Enums.Accessibility.Private; dormSubRoom.Name = "Home"; dormSubRoom.UnitySceneId = "76d98498-60a1-430c-ab76-b54a29b7a163"; dormSubRoom.DataBlob = ""; RoomStats roomStats = new RoomStats(); RoomData dormRoom = new RoomData(); dormRoom.Name = "DormRoom"; dormRoom.ImageName = DormRoomImageName; dormRoom.Description = "Your private room."; dormRoom.CreatorAccountId = 1; dormRoom.IsRRO = true; dormRoom.IsDorm = true; dormRoom.Accessibility = RecNet.Enums.Accessibility.Private; dormRoom.CreatedAt = DateTime.Now; dormRoom.State = RoomState.Active; dormRoom.CloningAllowed = true; dormRoom.Tags = StringTools.CreateTagString(new List { new ItemTag { Type = TagType.General, Tag = "dormroom" } }); await ctx.Rooms.AddAsync(dormRoom); await ctx.SaveChangesAsync(); dormSubRoom.RoomId = dormRoom.RoomId; roomStats.RoomId = dormRoom.RoomId; await ctx.SubRooms.AddAsync(dormSubRoom); await ctx.RoomStats.AddAsync(roomStats); await ctx.SaveChangesAsync(); } public const string DormRoomImageName = "Dorm"; public async static Task NormalizeDormRoomImagesAsync(this RecDBContext ctx) { var unsetNames = new[] { "", "default.png", DBConfig.DefaultRoomImage }; var dorms = await ctx.Rooms.Where(room => room.IsDorm).ToListAsync(); var missing = dorms .Where(room => unsetNames.Any(unset => string.Equals(unset, room.ImageName?.Trim() ?? string.Empty, StringComparison.OrdinalIgnoreCase))) .ToList(); if (missing.Count == 0) return; foreach (var dorm in missing) dorm.ImageName = DormRoomImageName; await ctx.SaveChangesAsync(); } public async static Task AddGameConfigs(this RecDBContext ctx) { await ctx.GameConfig.AddAsync(new ConfigVal("Screens.ForceVerification", "1")); await ctx.GameConfig.AddAsync(new ConfigVal("SafePlaySFXAudioSourceSounds", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("Backtrace.config", "0|0.05|0|20|50|1|0|0|1000")); await ctx.GameConfig.AddAsync(new ConfigVal("Backtrace.enabledLikelihood", "1.0|1.0|1.0|1.0|1.0|1.0|1.0|1.0")); await ctx.GameConfig.AddAsync(new ConfigVal("RRUI.UseRRUIHomeScreen", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("RRUI.UseNewProfile", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("UseRRUIEventsScreen", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("ClickOnName.MaxRaycastDistance", "5")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.ScreenSharing.CompressionQualityMultiplier", "1.0")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.ScreenSharing.RefreshHzMultiplier", "30.0")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.ScreenSharing.ResolutionMultiplier", "1.0")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.ScreenSharing.EnableZipCompression", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.ScreenSharing.MaxFragmentBytes", "15360")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.UseDeveloperMode", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.Circuits.MaxChipResources", "3000")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.Persistence.MaxCloudVariables", "100")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.EnableRRUIConfigMenu", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.ForbiddenSavedSpawnableTools", "")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.RoomSavingEnabled", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.InventionSavingEnabled", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.MaxChipsVisible", "5000")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.MaxChipsUnculled", "200")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.IgnoreInkCost", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.Persistence.Enabled", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.Persistence.AutosaveIntervalSeconds", "300")); await ctx.GameConfig.AddAsync(new ConfigVal("UGC.EnableInventionsInBetaRooms", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("Rendering.DisableSrpBatcher", "")); await ctx.GameConfig.AddAsync(new ConfigVal("splitTestSoftOverrides", "")); await ctx.GameConfig.AddAsync(new ConfigVal("RoomDetails.PhotoRollEnabled", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("runningNetworkTimeout", "30")); await ctx.GameConfig.AddAsync(new ConfigVal("loadingNetworkTimeout", "180")); await ctx.GameConfig.AddAsync(new ConfigVal("SynchronizedField.RemoveDefaultEntries", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("Rewards.SelectionTimeout", "1800")); await ctx.GameConfig.AddAsync(new ConfigVal("Rewards.UseRewardSelection", "true")); await ctx.GameConfig.AddAsync(new ConfigVal("Door.Creative.Query", "^CreativeCampus | ^RecRoomGallery")); await ctx.GameConfig.AddAsync(new ConfigVal("Door.Creative.Title", "Creative Campus")); await ctx.GameConfig.AddAsync(new ConfigVal("Door.Featured.Query", "#featured")); await ctx.GameConfig.AddAsync(new ConfigVal("Door.Featured.Title", "Featured")); await ctx.GameConfig.AddAsync(new ConfigVal("Door.Quests.Query", "#quest #rro")); await ctx.GameConfig.AddAsync(new ConfigVal("Door.Quests.Title", "QUESTS")); await ctx.GameConfig.AddAsync(new ConfigVal("Door.Shooters.Query", "#import")); await ctx.GameConfig.AddAsync(new ConfigVal("Door.Shooters.Title", "Import Rooms!")); await ctx.GameConfig.AddAsync(new ConfigVal("Door.Sports.Query", "#sport #rro | #pvp #rro")); await ctx.GameConfig.AddAsync(new ConfigVal("Door.Sports.Title", "SPORTS & PVP")); await ctx.GameConfig.AddAsync(new ConfigVal("Door.StuntRunner.Query", "#stuntrunner #community")); await ctx.GameConfig.AddAsync(new ConfigVal("Door.StuntRunner.Title", "COMMUNITY")); } } }