diff --git a/APIServer.cs b/APIServer.cs new file mode 100644 index 0000000..18bd416 --- /dev/null +++ b/APIServer.cs @@ -0,0 +1,221 @@ +using System; +using System.IO; +using System.Net; +using System.Text; +using System.Threading; +using api; +using api2018; + +namespace server +{ + + internal class APIServer + { + + public APIServer() + { + try + { + Console.WriteLine("APIServer.cs has started."); + new Thread(new ThreadStart(this.StartListen)).Start(); + } + catch (Exception ex) + { + Console.WriteLine("An Exception Occurred while Listening :" + ex.ToString()); + } + } + + + private void StartListen() + { + try + { + this.listener.Prefixes.Add("http://localhost:" + start.Program.version + "/"); + if (start.Program.version == "2016") + { + for (; ; ) + { + this.listener.Start(); + Console.WriteLine("APIServer.cs is listening."); + HttpListenerContext context = this.listener.GetContext(); + HttpListenerRequest request = context.Request; + HttpListenerResponse response = context.Response; + string rawUrl = request.RawUrl; + string Url = ""; + if (rawUrl.StartsWith("/api/")) + { + Url = rawUrl.Remove(0, 5); + } + string text; + string s = ""; + using (StreamReader streamReader = new StreamReader(request.InputStream, request.ContentEncoding)) + { + text = streamReader.ReadToEnd(); + } + if (!(Url == "")) + { + Console.WriteLine("API Requested: " + Url); + } + else + { + Console.WriteLine("API Requested: " + rawUrl); + } + Console.WriteLine("API Data: " + text); + if (Url.StartsWith("versioncheck")) + { + s = VersionCheckResponse; + } + if (Url == ("config/v2")) + { + s = Config2.GetDebugConfig(); + } + Console.WriteLine("API Response: " + s); + byte[] bytes = Encoding.UTF8.GetBytes(s); + response.ContentLength64 = (long)bytes.Length; + Stream outputStream = response.OutputStream; + outputStream.Write(bytes, 0, bytes.Length); + Thread.Sleep(400); + outputStream.Close(); + this.listener.Stop(); + } + } + else if (start.Program.version == "2017") + { + for (; ; ) + { + this.listener.Start(); + Console.WriteLine("APIServer.cs is listening."); + HttpListenerContext context = this.listener.GetContext(); + HttpListenerRequest request = context.Request; + HttpListenerResponse response = context.Response; + string rawUrl = request.RawUrl; + string Url = ""; + if (rawUrl.StartsWith("/api/")) + { + Url = rawUrl.Remove(0, 5); + } + string text; + string s = ""; + using (StreamReader streamReader = new StreamReader(request.InputStream, request.ContentEncoding)) + { + text = streamReader.ReadToEnd(); + } + if (!(Url == "")) + { + Console.WriteLine("API Requested: " + Url); + } + else + { + Console.WriteLine("API Requested: " + rawUrl); + } + Console.WriteLine("API Data: " + text); + if (Url.StartsWith("versioncheck")) + { + s = VersionCheckResponse; + } + if (Url == ("config/v2")) + { + s = Config2.GetDebugConfig(); + } + Console.WriteLine("API Response: " + s); + byte[] bytes = Encoding.UTF8.GetBytes(s); + response.ContentLength64 = (long)bytes.Length; + Stream outputStream = response.OutputStream; + outputStream.Write(bytes, 0, bytes.Length); + Thread.Sleep(400); + outputStream.Close(); + this.listener.Stop(); + } + } + else if (start.Program.version == "2018") + { + for (; ; ) + { + this.listener.Start(); + Console.WriteLine("APIServer.cs is listening."); + HttpListenerContext context = this.listener.GetContext(); + HttpListenerRequest request = context.Request; + HttpListenerResponse response = context.Response; + string rawUrl = request.RawUrl; + string Url = ""; + if (rawUrl.StartsWith("/api/")) + { + Url = rawUrl.Remove(0, 5); + } + if (!(Url == "")) + { + Console.WriteLine("API Requested: " + Url); + } + else + { + Console.WriteLine("API Requested: " + rawUrl); + } + string text; + string s = ""; + using (StreamReader streamReader = new StreamReader(request.InputStream, request.ContentEncoding)) + { + text = streamReader.ReadToEnd(); + } + Console.WriteLine("API Data: " + text); + if (Url.StartsWith("versioncheck")) + { + s = VersionCheckResponse; + } + if (Url == ("config/v2")) + { + s = Config2.GetDebugConfig(); + } + if (Url == "platformlogin/v1/getcachedlogins") + { + s = getcachedlogins.GetDebugLogin(ulong.Parse(text.Remove(0, 32)), ulong.Parse(text.Remove(0, 22))); + CachedPlayerID = ulong.Parse(text.Remove(0, 32)); + CachedPlatformID = ulong.Parse(text.Remove(0, 22)); + } + if (Url == "platformlogin/v1/logincached") + { + s = logincached.loginCache(CachedPlayerID, CachedPlatformID); + } + if (Url == "relationships/v1/bulkignoreplatformusers") + { + s = BlankResponse; + } + if (Url == "config/v1/amplitude") + { + s = Amplitude.amplitude(); + } + if (Url == "images/v2/named") + { + s = BlankResponse; + } + if (Url == "PlayerReporting/v1/moderationBlockDetails") + { + s = ModerationBlockDetails; + } + Console.WriteLine("API Response: " + s); + byte[] bytes = Encoding.UTF8.GetBytes(s); + response.ContentLength64 = (long)bytes.Length; + Stream outputStream = response.OutputStream; + outputStream.Write(bytes, 0, bytes.Length); + Thread.Sleep(400); + outputStream.Close(); + this.listener.Stop(); + } + } + } + catch (Exception ex4) + { + Console.WriteLine(ex4); + File.WriteAllText("crashdump.txt", Convert.ToString(ex4)); + } + } + + public static ulong CachedPlayerID = 1; + public static ulong CachedPlatformID = 10000; + public static string VersionCheckResponse = "{\"ValidVersion\":true}"; + public static string BlankResponse = "[]"; + public static string ModerationBlockDetails = "{\"ReportCategory\":0,\"Duration\":0,\"GameSessionId\":0,\"Message\":\"\"}"; + public static string ImagesV2Named = "[{\"FriendlyImageName\":\"DormRoomBucket\",\"ImageName\":\"OpenRec\",\"StartTime\":\"2021-12-27T21:27:38.1880175-08:00\",\"EndTime\":\"2043-12-27T21:27:38.1880399-08:00\"}"; + + private HttpListener listener = new HttpListener(); + } +} diff --git a/Amplitude.cs b/Amplitude.cs new file mode 100644 index 0000000..f139aa5 --- /dev/null +++ b/Amplitude.cs @@ -0,0 +1,23 @@ +using System; +using Newtonsoft.Json; + +namespace api +{ + // Token: 0x0200005A RID: 90 + internal class Amplitude + { + // Token: 0x0600029D RID: 669 RVA: 0x0000342D File Offset: 0x0000162D + public static string amplitude() + { + return JsonConvert.SerializeObject(new Amplitude + { + AmplitudeKey = "e1693a1003671058b6abc356c8ba8d59" + }); + } + + // Token: 0x170000FF RID: 255 + // (get) Token: 0x0600029F RID: 671 RVA: 0x00003444 File Offset: 0x00001644 + // (set) Token: 0x060002A0 RID: 672 RVA: 0x0000344C File Offset: 0x0000164C + public string AmplitudeKey { get; set; } + } +} diff --git a/Avatar.cs b/Avatar.cs new file mode 100644 index 0000000..229970d --- /dev/null +++ b/Avatar.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace api +{ + class Avatar + { + public string OutfitSelections { get; set; } + public string HairColor { get; set; } + public string SkinColor { get; set; } + public string FaceFeatures { get; set; } + } +} diff --git a/Config.cs b/Config.cs new file mode 100644 index 0000000..f91e418 --- /dev/null +++ b/Config.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Net; + +namespace api +{ + class Config + { + + public static void setup() + { + Console.WriteLine("Setting up..."); + Directory.CreateDirectory("SaveData\\Profile\\"); + if (!(File.Exists("SaveData\\avatar.txt"))) + { + File.Create("SaveData\\avatar.txt"); + } + if (!(File.Exists("SaveData\\Profile\\username.txt"))) + { + File.WriteAllText("SaveData\\Profile\\username.txt", "DefaultUsername"); + } + if (!(File.Exists("SaveData\\profileimage.png"))) + { + File.WriteAllBytes("SaveData\\profileimage.png", new WebClient().DownloadData("https://github.com/OpenRecRoom/OpenRec/raw/main/profileimage.png")); + } + Console.WriteLine("Done!"); + Console.Clear(); + } + + public static Objective[][] dailyObjectives = new Objective[][] + { + new Objective[] + { + new Objective + { + type = 20, + score = 1 + }, + new Objective + { + type = 21, + score = 1 + }, + new Objective + { + type = 22, + score = 1 + } + }, + new Objective[] + { + new Objective + { + type = 20, + score = 1 + }, + new Objective + { + type = 21, + score = 1 + }, + new Objective + { + type = 22, + score = 1 + } + }, + new Objective[] + { + new Objective + { + type = 20, + score = 1 + }, + new Objective + { + type = 21, + score = 1 + }, + new Objective + { + type = 22, + score = 1 + } + }, + new Objective[] + { + new Objective + { + type = 20, + score = 1 + }, + new Objective + { + type = 21, + score = 1 + }, + new Objective + { + type = 22, + score = 1 + } + }, + new Objective[] + { + new Objective + { + type = 20, + score = 1 + }, + new Objective + { + type = 21, + score = 1 + }, + new Objective + { + type = 22, + score = 1 + } + }, + new Objective[] + { + new Objective + { + type = 20, + score = 1 + }, + new Objective + { + type = 21, + score = 1 + }, + new Objective + { + type = 22, + score = 1 + } + }, + new Objective[] + { + new Objective + { + type = 20, + score = 1 + }, + new Objective + { + type = 21, + score = 1 + }, + new Objective + { + type = 22, + score = 1 + } + } + }; + + } +} diff --git a/Config2.cs b/Config2.cs new file mode 100644 index 0000000..54b9414 --- /dev/null +++ b/Config2.cs @@ -0,0 +1,192 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using Newtonsoft.Json; +using api; + +namespace api +{ + // Token: 0x02000013 RID: 19 + internal class Config2 + { + // Token: 0x17000011 RID: 17 + // (get) Token: 0x06000050 RID: 80 RVA: 0x00002215 File Offset: 0x00000415 + // (set) Token: 0x06000051 RID: 81 RVA: 0x0000221D File Offset: 0x0000041D + public string MessageOfTheDay { get; set; } + + // Token: 0x17000012 RID: 18 + // (get) Token: 0x06000052 RID: 82 RVA: 0x00002226 File Offset: 0x00000426 + // (set) Token: 0x06000053 RID: 83 RVA: 0x0000222E File Offset: 0x0000042E + public string CdnBaseUri { get; set; } + + // Token: 0x17000013 RID: 19 + // (get) Token: 0x06000054 RID: 84 RVA: 0x00002237 File Offset: 0x00000437 + // (set) Token: 0x06000055 RID: 85 RVA: 0x0000223F File Offset: 0x0000043F + public List LevelProgressionMaps { get; set; } + + // Token: 0x17000014 RID: 20 + // (get) Token: 0x06000056 RID: 86 RVA: 0x00002248 File Offset: 0x00000448 + // (set) Token: 0x06000057 RID: 87 RVA: 0x00002250 File Offset: 0x00000450 + public MatchmakingConfigParams MatchmakingParams { get; set; } + + // Token: 0x17000015 RID: 21 + // (get) Token: 0x06000058 RID: 88 RVA: 0x00002259 File Offset: 0x00000459 + // (set) Token: 0x06000059 RID: 89 RVA: 0x00002261 File Offset: 0x00000461 + public Objective[][] DailyObjectives { get; set; } + + // Token: 0x17000016 RID: 22 + // (get) Token: 0x0600005A RID: 90 RVA: 0x0000226A File Offset: 0x0000046A + // (set) Token: 0x0600005B RID: 91 RVA: 0x00002272 File Offset: 0x00000472 + public List ConfigTable { get; set; } + + // Token: 0x17000017 RID: 23 + // (get) Token: 0x0600005C RID: 92 RVA: 0x0000227B File Offset: 0x0000047B + // (set) Token: 0x0600005D RID: 93 RVA: 0x00002283 File Offset: 0x00000483 + public photonConfig PhotonConfig { get; set; } + + // Token: 0x0600005E RID: 94 RVA: 0x00005450 File Offset: 0x00003650 + public static string GetDebugConfig() + { + + return JsonConvert.SerializeObject(new Config2 + { + MessageOfTheDay = "Default MOTD", + CdnBaseUri = "http://img.rec.net/", + LevelProgressionMaps = new List + { + new LevelProgressionEntry + { + Level = 0, + RequiredXp = 1 + }, + new LevelProgressionEntry + { + Level = 1, + RequiredXp = 2 + }, + new LevelProgressionEntry + { + Level = 2, + RequiredXp = 3 + }, + new LevelProgressionEntry + { + Level = 3, + RequiredXp = 4 + }, + new LevelProgressionEntry + { + Level = 4, + RequiredXp = 5 + }, + new LevelProgressionEntry + { + Level = 5, + RequiredXp = 6 + }, + new LevelProgressionEntry + { + Level = 6, + RequiredXp = 7 + }, + new LevelProgressionEntry + { + Level = 7, + RequiredXp = 8 + }, + new LevelProgressionEntry + { + Level = 8, + RequiredXp = 9 + }, + new LevelProgressionEntry + { + Level = 9, + RequiredXp = 10 + }, + new LevelProgressionEntry + { + Level = 10, + RequiredXp = 11 + }, + new LevelProgressionEntry + { + Level = 11, + RequiredXp = 12 + }, + new LevelProgressionEntry + { + Level = 12, + RequiredXp = 13 + }, + new LevelProgressionEntry + { + Level = 13, + RequiredXp = 14 + }, + new LevelProgressionEntry + { + Level = 14, + RequiredXp = 15 + }, + new LevelProgressionEntry + { + Level = 15, + RequiredXp = 16 + }, + new LevelProgressionEntry + { + Level = 16, + RequiredXp = 17 + }, + new LevelProgressionEntry + { + Level = 17, + RequiredXp = 18 + }, + new LevelProgressionEntry + { + Level = 18, + RequiredXp = 19 + }, + new LevelProgressionEntry + { + Level = 19, + RequiredXp = 20 + }, + new LevelProgressionEntry + { + Level = 20, + RequiredXp = 21 + } + }, + MatchmakingParams = new MatchmakingConfigParams + { + PreferEmptyRoomsFrequency = 0f, + PreferFullRoomsFrequency = 1f + }, + DailyObjectives = Config.dailyObjectives, + ConfigTable = new List + { + new ConfigTableEntry + { + Key = "Gift.DropChance", + Value = 0.5f.ToString() + }, + new ConfigTableEntry + { + Key = "Gift.XP", + Value = 0.5f.ToString() + } + }, + PhotonConfig = new photonConfig + { + CloudRegion = "us", + CrcCheckEnabled = false, + EnableServerTracingAfterDisconnect = false + } + }); + } + } +} diff --git a/ConfigTableEntry.cs b/ConfigTableEntry.cs new file mode 100644 index 0000000..78f6f81 --- /dev/null +++ b/ConfigTableEntry.cs @@ -0,0 +1,18 @@ +using System; + +namespace api +{ + // Token: 0x02000019 RID: 25 + internal class ConfigTableEntry + { + // Token: 0x17000022 RID: 34 + // (get) Token: 0x0600007A RID: 122 RVA: 0x00002336 File Offset: 0x00000536 + // (set) Token: 0x0600007B RID: 123 RVA: 0x0000233E File Offset: 0x0000053E + public string Key { get; set; } + + // Token: 0x17000023 RID: 35 + // (get) Token: 0x0600007C RID: 124 RVA: 0x00002347 File Offset: 0x00000547 + // (set) Token: 0x0600007D RID: 125 RVA: 0x0000234F File Offset: 0x0000054F + public string Value { get; set; } + } +} \ No newline at end of file diff --git a/GetCachedLogin.cs b/GetCachedLogin.cs new file mode 100644 index 0000000..5d662d4 --- /dev/null +++ b/GetCachedLogin.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using api2018; +using System.IO; + +namespace api2018 +{ + // Token: 0x02000076 RID: 118 + public class getcachedlogins + { + // Token: 0x0600033C RID: 828 RVA: 0x00008F30 File Offset: 0x00007130 + public static string GetDebugLogin(ulong userid, ulong platformid) + { + string name = File.ReadAllText("SaveData\\Profile\\username.txt"); + return JsonConvert.SerializeObject(new List + { + new getcachedlogins + { + Id = userid, + Username = name, + DisplayName = name, + XP = 9999, + Level = 10, + RegistrationStatus = 2, + Developer = false, + CanReceiveInvites = false, + ProfileImageName = name, + JuniorProfile = false, + ForceJuniorImages = false, + PendingJunior = false, + HasBirthday = true, + AvoidJuniors = true, + PlayerReputation = new mPlayerReputation + { + Noteriety = 0, + CheerCredit = 20, + CheerGeneral = 10, + CheerHelpful = 10, + CheerGreatHost = 10, + CheerSportsman = 10, + CheerCreative = 10, + SubscriberCount = 0, + SubscribedCount = 0, + SelectedCheer = 0 + }, + PlatformIds = new List + { + new mPlatformID + { + Platform = 0, + PlatformId = platformid + } + } + } + }); + } + + // Token: 0x17000135 RID: 309 + // (get) Token: 0x0600033D RID: 829 RVA: 0x0000395C File Offset: 0x00001B5C + // (set) Token: 0x0600033E RID: 830 RVA: 0x00003964 File Offset: 0x00001B64 + public ulong Id { get; set; } + + // Token: 0x17000136 RID: 310 + // (get) Token: 0x0600033F RID: 831 RVA: 0x0000396D File Offset: 0x00001B6D + // (set) Token: 0x06000340 RID: 832 RVA: 0x00003975 File Offset: 0x00001B75 + public string Username { get; set; } + + // Token: 0x17000137 RID: 311 + // (get) Token: 0x06000341 RID: 833 RVA: 0x0000397E File Offset: 0x00001B7E + // (set) Token: 0x06000342 RID: 834 RVA: 0x00003986 File Offset: 0x00001B86 + public string DisplayName { get; set; } + + // Token: 0x17000138 RID: 312 + // (get) Token: 0x06000343 RID: 835 RVA: 0x0000398F File Offset: 0x00001B8F + // (set) Token: 0x06000344 RID: 836 RVA: 0x00003997 File Offset: 0x00001B97 + public int XP { get; set; } + + // Token: 0x17000139 RID: 313 + // (get) Token: 0x06000345 RID: 837 RVA: 0x000039A0 File Offset: 0x00001BA0 + // (set) Token: 0x06000346 RID: 838 RVA: 0x000039A8 File Offset: 0x00001BA8 + public int Level { get; set; } + + // Token: 0x1700013A RID: 314 + // (get) Token: 0x06000347 RID: 839 RVA: 0x000039B1 File Offset: 0x00001BB1 + // (set) Token: 0x06000348 RID: 840 RVA: 0x000039B9 File Offset: 0x00001BB9 + public int RegistrationStatus { get; set; } + + // Token: 0x1700013B RID: 315 + // (get) Token: 0x06000349 RID: 841 RVA: 0x000039C2 File Offset: 0x00001BC2 + // (set) Token: 0x0600034A RID: 842 RVA: 0x000039CA File Offset: 0x00001BCA + public bool Developer { get; set; } + + // Token: 0x1700013C RID: 316 + // (get) Token: 0x0600034B RID: 843 RVA: 0x000039D3 File Offset: 0x00001BD3 + // (set) Token: 0x0600034C RID: 844 RVA: 0x000039DB File Offset: 0x00001BDB + public bool CanReceiveInvites { get; set; } + + // Token: 0x1700013D RID: 317 + // (get) Token: 0x0600034D RID: 845 RVA: 0x000039E4 File Offset: 0x00001BE4 + // (set) Token: 0x0600034E RID: 846 RVA: 0x000039EC File Offset: 0x00001BEC + public string ProfileImageName { get; set; } + + // Token: 0x1700013E RID: 318 + // (get) Token: 0x0600034F RID: 847 RVA: 0x000039F5 File Offset: 0x00001BF5 + // (set) Token: 0x06000350 RID: 848 RVA: 0x000039FD File Offset: 0x00001BFD + public bool JuniorProfile { get; set; } + + // Token: 0x1700013F RID: 319 + // (get) Token: 0x06000351 RID: 849 RVA: 0x00003A06 File Offset: 0x00001C06 + // (set) Token: 0x06000352 RID: 850 RVA: 0x00003A0E File Offset: 0x00001C0E + public bool ForceJuniorImages { get; set; } + + // Token: 0x17000140 RID: 320 + // (get) Token: 0x06000353 RID: 851 RVA: 0x00003A17 File Offset: 0x00001C17 + // (set) Token: 0x06000354 RID: 852 RVA: 0x00003A1F File Offset: 0x00001C1F + public bool PendingJunior { get; set; } + + // Token: 0x17000141 RID: 321 + // (get) Token: 0x06000355 RID: 853 RVA: 0x00003A28 File Offset: 0x00001C28 + // (set) Token: 0x06000356 RID: 854 RVA: 0x00003A30 File Offset: 0x00001C30 + public bool HasBirthday { get; set; } + + // Token: 0x17000142 RID: 322 + // (get) Token: 0x06000357 RID: 855 RVA: 0x00003A39 File Offset: 0x00001C39 + // (set) Token: 0x06000358 RID: 856 RVA: 0x00003A41 File Offset: 0x00001C41 + public bool AvoidJuniors { get; set; } + + // Token: 0x17000143 RID: 323 + // (get) Token: 0x06000359 RID: 857 RVA: 0x00003A4A File Offset: 0x00001C4A + // (set) Token: 0x0600035A RID: 858 RVA: 0x00003A52 File Offset: 0x00001C52 + public mPlayerReputation PlayerReputation { get; set; } + + // Token: 0x17000144 RID: 324 + // (get) Token: 0x0600035B RID: 859 RVA: 0x00003A5B File Offset: 0x00001C5B + // (set) Token: 0x0600035C RID: 860 RVA: 0x00003A63 File Offset: 0x00001C63 + public List PlatformIds { get; set; } + } +} diff --git a/ImageServer.cs b/ImageServer.cs new file mode 100644 index 0000000..05edbf0 --- /dev/null +++ b/ImageServer.cs @@ -0,0 +1,67 @@ +using System; +using System.IO; +using System.Net; +using System.Text; +using System.Threading; +using api; + +namespace server +{ + // Token: 0x02000050 RID: 80 + internal class ImageServer + { + // Token: 0x06000227 RID: 551 RVA: 0x00006D1C File Offset: 0x00004F1C + public ImageServer() + { + try + { + Console.WriteLine("ImageServer.cs has started."); + new Thread(new ThreadStart(this.StartListen)).Start(); + } + catch (Exception ex) + { + Console.WriteLine("An Exception Occurred while Listening :" + ex.ToString()); + } + } + + // Token: 0x06000228 RID: 552 RVA: 0x00006D84 File Offset: 0x00004F84 + private void StartListen() + { + this.listener.Prefixes.Add("http://localhost:20182/"); + for (; ; ) + { + this.listener.Start(); + Console.WriteLine("ImageServer.cs is listening."); + HttpListenerContext context = this.listener.GetContext(); + HttpListenerRequest request = context.Request; + HttpListenerResponse response = context.Response; + string rawUrl = request.RawUrl; + string text; + byte[] i = File.ReadAllBytes("SaveData\\profileimage.png"); + using (StreamReader streamReader = new StreamReader(request.InputStream, request.ContentEncoding)) + { + text = streamReader.ReadToEnd(); + } + Console.WriteLine("Image Requested: " + rawUrl); + Console.WriteLine("Image Data: " + text); + Console.WriteLine("Image Response: "); + byte[] bytes = i; + response.ContentLength64 = (long)bytes.Length; + Stream outputStream = response.OutputStream; + outputStream.Write(bytes, 0, bytes.Length); + Thread.Sleep(400); + outputStream.Close(); + this.listener.Stop(); + } + } + + + public static string VersionCheckResponse = "{\"ValidVersion\":true}"; + + public static string BlankResponse = ""; + + + // Token: 0x04000192 RID: 402 + private HttpListener listener = new HttpListener(); + } +} diff --git a/LevelProgressionEntry.cs b/LevelProgressionEntry.cs new file mode 100644 index 0000000..0312252 --- /dev/null +++ b/LevelProgressionEntry.cs @@ -0,0 +1,18 @@ +using System; + +namespace api +{ + // Token: 0x02000017 RID: 23 + public class LevelProgressionEntry + { + // Token: 0x1700001E RID: 30 + // (get) Token: 0x06000070 RID: 112 RVA: 0x000022F2 File Offset: 0x000004F2 + // (set) Token: 0x06000071 RID: 113 RVA: 0x000022FA File Offset: 0x000004FA + public int Level { get; set; } + + // Token: 0x1700001F RID: 31 + // (get) Token: 0x06000072 RID: 114 RVA: 0x00002303 File Offset: 0x00000503 + // (set) Token: 0x06000073 RID: 115 RVA: 0x0000230B File Offset: 0x0000050B + public int RequiredXp { get; set; } + } +} diff --git a/LoginCached.cs b/LoginCached.cs new file mode 100644 index 0000000..63a988d --- /dev/null +++ b/LoginCached.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using System.IO; + +namespace api2018 +{ + // Token: 0x02000078 RID: 120 + public class logincached + { + // Token: 0x17000145 RID: 325 + // (get) Token: 0x0600035E RID: 862 RVA: 0x00003A6C File Offset: 0x00001C6C + // (set) Token: 0x0600035F RID: 863 RVA: 0x00003A74 File Offset: 0x00001C74 + public string Error { get; set; } + + // Token: 0x17000146 RID: 326 + // (get) Token: 0x06000360 RID: 864 RVA: 0x00003A7D File Offset: 0x00001C7D + // (set) Token: 0x06000361 RID: 865 RVA: 0x00003A85 File Offset: 0x00001C85 + public getcachedlogins Player { get; set; } + + // Token: 0x17000147 RID: 327 + // (get) Token: 0x06000362 RID: 866 RVA: 0x00003A8E File Offset: 0x00001C8E + // (set) Token: 0x06000363 RID: 867 RVA: 0x00003A96 File Offset: 0x00001C96 + public string Token { get; set; } + + // Token: 0x17000148 RID: 328 + // (get) Token: 0x06000364 RID: 868 RVA: 0x00003A9F File Offset: 0x00001C9F + // (set) Token: 0x06000365 RID: 869 RVA: 0x00003AA7 File Offset: 0x00001CA7 + public bool FirstLoginOfTheDay { get; set; } + + // Token: 0x17000149 RID: 329 + // (get) Token: 0x06000366 RID: 870 RVA: 0x00003AB0 File Offset: 0x00001CB0 + // (set) Token: 0x06000367 RID: 871 RVA: 0x00003AB8 File Offset: 0x00001CB8 + public ulong AnalyticsSessionId { get; set; } + + // Token: 0x1700014A RID: 330 + // (get) Token: 0x06000368 RID: 872 RVA: 0x00003AC1 File Offset: 0x00001CC1 + // (set) Token: 0x06000369 RID: 873 RVA: 0x00003AC9 File Offset: 0x00001CC9 + public bool CanUseScreenMode { get; set; } + + // Token: 0x0600036A RID: 874 RVA: 0x00009044 File Offset: 0x00007244 + public static string loginCache(ulong userid, ulong platformid) + { + string name = File.ReadAllText("SaveData\\Profile\\username.txt"); + return JsonConvert.SerializeObject(new logincached + { + Error = "", + Player = new getcachedlogins + { + Id = userid, + Username = name, + DisplayName = name, + XP = 9999, + Level = 10, + RegistrationStatus = 2, + Developer = false, + CanReceiveInvites = false, + ProfileImageName = name, + JuniorProfile = false, + ForceJuniorImages = false, + PendingJunior = false, + HasBirthday = true, + AvoidJuniors = true, + PlayerReputation = new mPlayerReputation + { + Noteriety = 0, + CheerCredit = 20, + CheerGeneral = 10, + CheerHelpful = 10, + CheerGreatHost = 10, + CheerSportsman = 10, + CheerCreative = 10, + SubscriberCount = 0, + SubscribedCount = 0, + SelectedCheer = 0 + }, + PlatformIds = new List + { + new mPlatformID + { + Platform = 0, + PlatformId = platformid + } + } + }, + Token = "NoKeyProvided", + FirstLoginOfTheDay = true, + AnalyticsSessionId = 392394UL, + CanUseScreenMode = true + }); + } + } +} diff --git a/MatchmakingConfigParams.cs b/MatchmakingConfigParams.cs new file mode 100644 index 0000000..0368f2e --- /dev/null +++ b/MatchmakingConfigParams.cs @@ -0,0 +1,18 @@ +using System; + +namespace api +{ + // Token: 0x02000015 RID: 21 + internal class MatchmakingConfigParams + { + // Token: 0x17000019 RID: 25 + // (get) Token: 0x06000064 RID: 100 RVA: 0x0000229D File Offset: 0x0000049D + // (set) Token: 0x06000065 RID: 101 RVA: 0x000022A5 File Offset: 0x000004A5 + public float PreferFullRoomsFrequency { get; set; } + + // Token: 0x1700001A RID: 26 + // (get) Token: 0x06000066 RID: 102 RVA: 0x000022AE File Offset: 0x000004AE + // (set) Token: 0x06000067 RID: 103 RVA: 0x000022B6 File Offset: 0x000004B6 + public float PreferEmptyRoomsFrequency { get; set; } + } +} diff --git a/NameServer.cs b/NameServer.cs new file mode 100644 index 0000000..52cfa9c --- /dev/null +++ b/NameServer.cs @@ -0,0 +1,59 @@ +using System; +using System.IO; +using System.Net; +using System.Text; +using System.Threading; + +namespace server +{ + // Token: 0x02000050 RID: 80 + internal class NameServer + { + // Token: 0x06000227 RID: 551 RVA: 0x00006D1C File Offset: 0x00004F1C + public NameServer() + { + try + { + Console.WriteLine("NameServer.cs has started."); + new Thread(new ThreadStart(this.StartListen)).Start(); + } + catch (Exception ex) + { + Console.WriteLine("An Exception Occurred while Listening :" + ex.ToString()); + } + } + + // Token: 0x06000228 RID: 552 RVA: 0x00006D84 File Offset: 0x00004F84 + private void StartListen() + { + this.listener.Prefixes.Add("http://localhost:20181/"); + for (; ; ) + { + this.listener.Start(); + Console.WriteLine("NameServer.cs is listening."); + HttpListenerContext context = this.listener.GetContext(); + HttpListenerRequest request = context.Request; + HttpListenerResponse response = context.Response; + string rawUrl = request.RawUrl; + string s = ""; + s = "{\"API\":\"http://localhost:2018\",\"Notifications\":\"http://localhost:20161\",\"Images\":\"http://localhost:20182\"}"; + Console.WriteLine("API Response: " + s); + byte[] bytes = Encoding.UTF8.GetBytes(s); + response.ContentLength64 = (long)bytes.Length; + Stream outputStream = response.OutputStream; + outputStream.Write(bytes, 0, bytes.Length); + Thread.Sleep(400); + outputStream.Close(); + this.listener.Stop(); + } + } + + public static string VersionCheckResponse = "{\"ValidVersion\":true}"; + + public static string BlankResponse = ""; + + + // Token: 0x04000192 RID: 402 + private HttpListener listener = new HttpListener(); + } +} diff --git a/Notification.cs b/Notification.cs new file mode 100644 index 0000000..e8146e5 --- /dev/null +++ b/Notification.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace ws +{ + // Token: 0x02000029 RID: 41 + public class Notification + { + // Token: 0x06000104 RID: 260 RVA: 0x00004EF4 File Offset: 0x000030F4 + public static string ProcessRequest(string jsonData) + { + string result; + { + result = jsonData; + } + return result; + } + + // Token: 0x0200002A RID: 42 + public enum ResponseResult + { + // Token: 0x04000091 RID: 145 + RelationshipChanged = 1, + // Token: 0x04000092 RID: 146 + MessageReceived, + // Token: 0x04000093 RID: 147 + MessageDeleted, + // Token: 0x04000094 RID: 148 + PresenceHeartbeatResponse, + // Token: 0x04000095 RID: 149 + SubscriptionListUpdated = 9, + // Token: 0x04000096 RID: 150 + SubscriptionUpdateProfile = 11, + // Token: 0x04000097 RID: 151 + SubscriptionUpdatePresence, + // Token: 0x04000098 RID: 152 + SubscriptionUpdateGameSession, + // Token: 0x04000099 RID: 153 + SubscriptionUpdateRoom, + // Token: 0x0400009A RID: 154 + ModerationQuitGame = 20, + // Token: 0x0400009B RID: 155 + ModerationUpdateRequired, + // Token: 0x0400009C RID: 156 + ModerationKick, + // Token: 0x0400009D RID: 157 + ModerationKickAttemptFailed, + // Token: 0x0400009E RID: 158 + GiftPackageReceived = 30, + // Token: 0x0400009F RID: 159 + ProfileJuniorStatusUpdate = 40, + // Token: 0x040000A0 RID: 160 + RelationshipsInvalid = 50, + // Token: 0x040000A1 RID: 161 + StorefrontBalanceAdd = 60 + } + + // Token: 0x0200002B RID: 43 + public class Reponse + { + // Token: 0x1700005C RID: 92 + // (get) Token: 0x06000106 RID: 262 RVA: 0x000027DA File Offset: 0x000009DA + // (set) Token: 0x06000107 RID: 263 RVA: 0x000027E2 File Offset: 0x000009E2 + public int Id { get; set; } + + // Token: 0x1700005D RID: 93 + // (get) Token: 0x06000108 RID: 264 RVA: 0x000027EB File Offset: 0x000009EB + // (set) Token: 0x06000109 RID: 265 RVA: 0x000027F3 File Offset: 0x000009F3 + public object Msg { get; set; } + + // Token: 0x0600010A RID: 266 RVA: 0x00004FC0 File Offset: 0x000031C0 + public static Notification.Reponse createResponse(int id, object msg) + { + return new Notification.Reponse + { + Id = id, + Msg = msg + }; + } + } + } +} diff --git a/Objective.cs b/Objective.cs new file mode 100644 index 0000000..6343745 --- /dev/null +++ b/Objective.cs @@ -0,0 +1,19 @@ +using System; + +namespace api + +{ + // Token: 0x02000018 RID: 24 + public class Objective + { + // Token: 0x17000020 RID: 32 + // (get) Token: 0x06000075 RID: 117 RVA: 0x00002314 File Offset: 0x00000514 + // (set) Token: 0x06000076 RID: 118 RVA: 0x0000231C File Offset: 0x0000051C + public int type { get; set; } + + // Token: 0x17000021 RID: 33 + // (get) Token: 0x06000077 RID: 119 RVA: 0x00002325 File Offset: 0x00000525 + // (set) Token: 0x06000078 RID: 120 RVA: 0x0000232D File Offset: 0x0000052D + public int score { get; set; } + } +} \ No newline at end of file diff --git a/OpenRec_.csproj b/OpenRec_.csproj new file mode 100644 index 0000000..8446c6a --- /dev/null +++ b/OpenRec_.csproj @@ -0,0 +1,18 @@ + + + + Exe + netcoreapp3.1 + + + + + + + + + ..\..\..\r16server\making new server\websocket-sharp.dll + + + + diff --git a/OpenRec_.sln b/OpenRec_.sln new file mode 100644 index 0000000..3034407 --- /dev/null +++ b/OpenRec_.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31321.278 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenRec_", "OpenRec_.csproj", "{C3C433FC-52FB-4472-81F7-B271A2CDABFE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C3C433FC-52FB-4472-81F7-B271A2CDABFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C3C433FC-52FB-4472-81F7-B271A2CDABFE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C3C433FC-52FB-4472-81F7-B271A2CDABFE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C3C433FC-52FB-4472-81F7-B271A2CDABFE}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3C2E49E2-E5D3-47A6-8F3A-5A1DF6A19A06} + EndGlobalSection +EndGlobal diff --git a/PlatformID.cs b/PlatformID.cs new file mode 100644 index 0000000..1fbe1a4 --- /dev/null +++ b/PlatformID.cs @@ -0,0 +1,18 @@ +using System; + +namespace api2018 +{ + // Token: 0x02000037 RID: 55 + public class mPlatformID + { + // Token: 0x17000097 RID: 151 + // (get) Token: 0x0600018E RID: 398 RVA: 0x00002B9F File Offset: 0x00000D9F + // (set) Token: 0x0600018F RID: 399 RVA: 0x00002BA7 File Offset: 0x00000DA7 + public int Platform { get; set; } + + // Token: 0x17000098 RID: 152 + // (get) Token: 0x06000190 RID: 400 RVA: 0x00002BB0 File Offset: 0x00000DB0 + // (set) Token: 0x06000191 RID: 401 RVA: 0x00002BB8 File Offset: 0x00000DB8 + public ulong PlatformId { get; set; } + } +} diff --git a/PlayerReputation.cs b/PlayerReputation.cs new file mode 100644 index 0000000..805d3a4 --- /dev/null +++ b/PlayerReputation.cs @@ -0,0 +1,58 @@ +using System; + +namespace api2018 +{ + // Token: 0x02000036 RID: 54 + public class mPlayerReputation + { + // Token: 0x1700008D RID: 141 + // (get) Token: 0x06000179 RID: 377 RVA: 0x00002AF5 File Offset: 0x00000CF5 + // (set) Token: 0x0600017A RID: 378 RVA: 0x00002AFD File Offset: 0x00000CFD + public int Noteriety { get; set; } + + // Token: 0x1700008E RID: 142 + // (get) Token: 0x0600017B RID: 379 RVA: 0x00002B06 File Offset: 0x00000D06 + // (set) Token: 0x0600017C RID: 380 RVA: 0x00002B0E File Offset: 0x00000D0E + public int CheerGeneral { get; set; } + + // Token: 0x1700008F RID: 143 + // (get) Token: 0x0600017D RID: 381 RVA: 0x00002B17 File Offset: 0x00000D17 + // (set) Token: 0x0600017E RID: 382 RVA: 0x00002B1F File Offset: 0x00000D1F + public int CheerHelpful { get; set; } + + // Token: 0x17000090 RID: 144 + // (get) Token: 0x0600017F RID: 383 RVA: 0x00002B28 File Offset: 0x00000D28 + // (set) Token: 0x06000180 RID: 384 RVA: 0x00002B30 File Offset: 0x00000D30 + public int CheerGreatHost { get; set; } + + // Token: 0x17000091 RID: 145 + // (get) Token: 0x06000181 RID: 385 RVA: 0x00002B39 File Offset: 0x00000D39 + // (set) Token: 0x06000182 RID: 386 RVA: 0x00002B41 File Offset: 0x00000D41 + public int CheerSportsman { get; set; } + + // Token: 0x17000092 RID: 146 + // (get) Token: 0x06000183 RID: 387 RVA: 0x00002B4A File Offset: 0x00000D4A + // (set) Token: 0x06000184 RID: 388 RVA: 0x00002B52 File Offset: 0x00000D52 + public int CheerCreative { get; set; } + + // Token: 0x17000093 RID: 147 + // (get) Token: 0x06000185 RID: 389 RVA: 0x00002B5B File Offset: 0x00000D5B + // (set) Token: 0x06000186 RID: 390 RVA: 0x00002B63 File Offset: 0x00000D63 + public int CheerCredit { get; set; } + + // Token: 0x17000094 RID: 148 + // (get) Token: 0x06000187 RID: 391 RVA: 0x00002B6C File Offset: 0x00000D6C + // (set) Token: 0x06000188 RID: 392 RVA: 0x00002B74 File Offset: 0x00000D74 + public int SubscriberCount { get; set; } + + // Token: 0x17000095 RID: 149 + // (get) Token: 0x06000189 RID: 393 RVA: 0x00002B7D File Offset: 0x00000D7D + // (set) Token: 0x0600018A RID: 394 RVA: 0x00002B85 File Offset: 0x00000D85 + public int SubscribedCount { get; set; } + + // Token: 0x17000096 RID: 150 + // (get) Token: 0x0600018B RID: 395 RVA: 0x00002B8E File Offset: 0x00000D8E + // (set) Token: 0x0600018C RID: 396 RVA: 0x00002B96 File Offset: 0x00000D96 + public int SelectedCheer { get; set; } + } +} diff --git a/Profiles.cs b/Profiles.cs new file mode 100644 index 0000000..c7784d8 --- /dev/null +++ b/Profiles.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace api2016 + +{ + class Profiles + { + + public ulong Id { get; set; } + public string Username { get; set; } + public string DisplayName { get; set; } + public int XP { get; set; } + public int Level { get; set; } + public int Reputation { get; set; } + public bool Verified { get; set; } + + public bool Developer { get; set; } + + + public bool HasEmail { get; set; } + + + public bool CanReceiveInvites { get; set; } + + + public string ProfileImageName { get; set; } + + + public bool JuniorProfile { get; set; } + + + public bool ForceJuniorImages { get; set; } + + + public bool PendingJunior { get; set; } + + public bool HasBirthday { get; set; } + } +} diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..d58b51a --- /dev/null +++ b/Program.cs @@ -0,0 +1,87 @@ +using System; +using server; +using System.IO; +using ws; +using api; + +namespace start +{ + class Program + { + static void Main(string[] args) + { + Config.setup(); + goto Start; + + Start: + Console.WriteLine("OpenRec - Open source RecNet server software."); + Console.WriteLine("1) Modify Settings" + Environment.NewLine + "2) Modify Profile" + Environment.NewLine + "3) Start Server"); + string readline = Console.ReadLine(); + + if (readline == "1") + { + Console.WriteLine("Not yet added in..."); + goto Start; + } + if (readline == "2") + { + goto Start; + Console.Clear(); + Console.WriteLine("1) Change Username" + Environment.NewLine + "2) Go Back"); + string readline3 = Console.ReadLine(); + if (readline3 == "1") + { + Console.Clear(); + Console.WriteLine("Current Username: " + File.ReadAllText("SaveData\\Profile\\username.txt)")); + Console.WriteLine("New Username: "); + string newusername = Console.ReadLine(); + File.WriteAllText("SaveData\\Profile\\username.txt)", newusername); + Console.Clear(); + goto Start; + + } + if (readline3 == "2") + { + Console.Clear(); + goto Start; + + } + } + if (readline == "3") + { + + Console.WriteLine("Please select the version of RecRoom the server should host: (2016, 2017, 2018)"); + string readline2 = Console.ReadLine(); + if (readline2 == "2016") + { + version = "2016"; + Console.Clear(); + Console.WriteLine("Version Selected: " + start.Program.version); + new APIServer(); + new WebSocket(); + } + if (readline2 == "2017") + { + version = "2017"; + Console.Clear(); + Console.WriteLine("Version Selected: " + start.Program.version); + new APIServer(); + new WebSocket(); + } + if (readline2 == "2018") + { + version = "2018"; + Console.Clear(); + Console.WriteLine("Version Selected: " + start.Program.version); + new NameServer(); + new ImageServer(); + new APIServer(); + new WebSocket(); + } + } + } + + public static string version = ""; + } + +} diff --git a/WebSocket.cs b/WebSocket.cs new file mode 100644 index 0000000..6d79805 --- /dev/null +++ b/WebSocket.cs @@ -0,0 +1,32 @@ +using System; +using WebSocketSharp; +using WebSocketSharp.Server; + +namespace ws +{ + // Token: 0x02000008 RID: 8 + internal class WebSocket + { + // Token: 0x06000012 RID: 18 RVA: 0x0000418C File Offset: 0x0000238C + public WebSocket() + { + WebSocketServer webSocketServer = new WebSocketServer(string.Format("ws://localhost:20161")); + webSocketServer.AddWebSocketService("/api/notification/v2"); + webSocketServer.AddWebSocketService("/hub/v1"); + webSocketServer.Start(); + Console.WriteLine("WebSocket.cs has started."); + Console.WriteLine("WebSocket.cs is listening."); + } + + // Token: 0x02000009 RID: 9 + public class NotificationV2 : WebSocketBehavior + { + // Token: 0x06000013 RID: 19 RVA: 0x0000209D File Offset: 0x0000029D + protected override void OnMessage(MessageEventArgs e) + { + Console.WriteLine("WebSocket.cs called for. Not yet implemented."); + base.Send(Notification.ProcessRequest(e.Data)); + } + } + } +} \ No newline at end of file diff --git a/photonConfig.cs b/photonConfig.cs new file mode 100644 index 0000000..47f36d6 --- /dev/null +++ b/photonConfig.cs @@ -0,0 +1,23 @@ +using System; + +namespace api +{ + // Token: 0x02000016 RID: 22 + public class photonConfig + { + // Token: 0x1700001B RID: 27 + // (get) Token: 0x06000069 RID: 105 RVA: 0x000022BF File Offset: 0x000004BF + // (set) Token: 0x0600006A RID: 106 RVA: 0x000022C7 File Offset: 0x000004C7 + public string CloudRegion { get; set; } + + // Token: 0x1700001C RID: 28 + // (get) Token: 0x0600006B RID: 107 RVA: 0x000022D0 File Offset: 0x000004D0 + // (set) Token: 0x0600006C RID: 108 RVA: 0x000022D8 File Offset: 0x000004D8 + public bool CrcCheckEnabled { get; set; } + + // Token: 0x1700001D RID: 29 + // (get) Token: 0x0600006D RID: 109 RVA: 0x000022E1 File Offset: 0x000004E1 + // (set) Token: 0x0600006E RID: 110 RVA: 0x000022E9 File Offset: 0x000004E9 + public bool EnableServerTracingAfterDisconnect { get; set; } + } +} \ No newline at end of file