diff --git a/GameDownloader/GameDownloader.csproj b/GameDownloader/GameDownloader.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/GameDownloader/GameDownloader.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/GameDownloader/Program.cs b/GameDownloader/Program.cs new file mode 100644 index 0000000..5f508ab --- /dev/null +++ b/GameDownloader/Program.cs @@ -0,0 +1,50 @@ +using System.Security.Cryptography; + +namespace GameDownloader +{ + public class Program + { + public static void Main(string[] args) + { + var key = "f8c65f692a6a021a688507a6e441786a"; + + + var bytes = File.ReadAllBytes(@"C:\Users\Misha\Desktop\nikke-server\nksrv\bin\Debug\net8.0\win-x64\cache\PC\prod\rid.48-r.02587\manifestv2\48_5937488248518493556_0.manifest"); + + + var x = Aes.Create(); + x.KeySize = 128; + x.Key = StrToByteArray(key); + x.Mode = CipherMode.CFB; + x.Padding = PaddingMode.None; + x.IV = new byte[16]; + var abc = x.CreateDecryptor(); + + var str = new CryptoStream(new MemoryStream(bytes), abc, CryptoStreamMode.Read); + + var decr = new MemoryStream(); + + str.CopyTo(decr); + + var res = decr.ToArray(); + + File.WriteAllBytes("test", res); + + + //var b2 = x.DecryptEcb(bytes, PaddingMode.None); + } + public static byte[] StrToByteArray(string str) + { + str = str.ToUpper(); + Dictionary hexindex = new Dictionary(); + for (int i = 0; i <= 255; i++) + hexindex.Add(i.ToString("X2"), (byte)i); + + List hexres = new List(); + for (int i = 0; i < str.Length; i += 2) + hexres.Add(hexindex[str.Substring(i, 2)]); + + return hexres.ToArray(); + } + } +} \ No newline at end of file diff --git a/ServerSelector/ServerSwitcher.cs b/ServerSelector/ServerSwitcher.cs index f3d124d..c9b00f7 100644 --- a/ServerSelector/ServerSwitcher.cs +++ b/ServerSelector/ServerSwitcher.cs @@ -92,6 +92,8 @@ namespace ServerSelector {ip} na-community.playerinfinite.com {ip} common-web.intlgame.com {ip} li-sg.intlgame.com +255.255.221.21 na.fleetlogd.com +{ip} www.jupiterlauncher.com {ip} data-aws-na.intlgame.com 255.255.221.21 sentry.io"; diff --git a/nksrv.sln b/nksrv.sln index 089bf40..071636a 100644 --- a/nksrv.sln +++ b/nksrv.sln @@ -15,6 +15,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServerSelector.Desktop", "S EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Client", "Client", "{4BB2E77F-84A6-4644-9FB3-38E2A7DCDEC0}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GameDownloader", "GameDownloader\GameDownloader.csproj", "{E3512D9F-CB94-4C80-B673-0EB83CA21D12}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -151,6 +153,30 @@ Global {01D0A73A-A881-439D-9318-54DB5B00D6F5}.ReleaseDLL|x64.Build.0 = Release|Any CPU {01D0A73A-A881-439D-9318-54DB5B00D6F5}.ReleaseDLL|x86.ActiveCfg = Release|Any CPU {01D0A73A-A881-439D-9318-54DB5B00D6F5}.ReleaseDLL|x86.Build.0 = Release|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.Debug|x64.ActiveCfg = Debug|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.Debug|x64.Build.0 = Debug|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.Debug|x86.ActiveCfg = Debug|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.Debug|x86.Build.0 = Debug|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.DebugDLL|Any CPU.ActiveCfg = Debug|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.DebugDLL|Any CPU.Build.0 = Debug|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.DebugDLL|x64.ActiveCfg = Debug|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.DebugDLL|x64.Build.0 = Debug|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.DebugDLL|x86.ActiveCfg = Debug|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.DebugDLL|x86.Build.0 = Debug|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.Release|Any CPU.Build.0 = Release|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.Release|x64.ActiveCfg = Release|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.Release|x64.Build.0 = Release|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.Release|x86.ActiveCfg = Release|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.Release|x86.Build.0 = Release|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.ReleaseDLL|Any CPU.ActiveCfg = Release|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.ReleaseDLL|Any CPU.Build.0 = Release|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.ReleaseDLL|x64.ActiveCfg = Release|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.ReleaseDLL|x64.Build.0 = Release|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.ReleaseDLL|x86.ActiveCfg = Release|Any CPU + {E3512D9F-CB94-4C80-B673-0EB83CA21D12}.ReleaseDLL|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -158,6 +184,7 @@ Global GlobalSection(NestedProjects) = preSolution {EC613C24-8A35-42E8-92C1-9A8431F74F58} = {4BB2E77F-84A6-4644-9FB3-38E2A7DCDEC0} {01D0A73A-A881-439D-9318-54DB5B00D6F5} = {4BB2E77F-84A6-4644-9FB3-38E2A7DCDEC0} + {E3512D9F-CB94-4C80-B673-0EB83CA21D12} = {4BB2E77F-84A6-4644-9FB3-38E2A7DCDEC0} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {F779F2DC-B207-4091-83B8-0EA250461DCE} diff --git a/nksrv/IntlServer/IntlHandler.cs b/nksrv/IntlServer/IntlHandler.cs index a6a0363..f5b98ae 100644 --- a/nksrv/IntlServer/IntlHandler.cs +++ b/nksrv/IntlServer/IntlHandler.cs @@ -23,7 +23,11 @@ namespace nksrv.IntlServer {"/gnconfig/acquire_config", new IntlReturnJsonHandler(AquireConfigResp) }, {"/auth/auto_login", new AutoLoginEndpoint() }, {"/reward/send", new IntlReturnJsonHandler(SetProtocolResp) }, // /v2/reward/send - {"/notice/get_notice_content", new GetNoticeContent() } // /v2/notice/get_notice_content + {"/notice/get_notice_content", new GetNoticeContent() }, // /v2/notice/get_notice_content + {"/fleet.repo.game.RepoSVC/GetVersion", new JuniperLauncherGetRepoVersion() }, // /api/v1/fleet.repo.game.RepoSVC/GetVersion + {"/fleet.repo.game.RepoMgr/GetGameLauncher", new JuniperLauncherGetGameLauncher() }, // /api/v1/fleet.repo.game.RepoMgr/ + {"/fleet.repo.game.RepoSVC/GetRegion", new JuniperLauncherGetRegion() }, // /api/v1/fleet.repo.game.RepoMgr/ // GetGameLauncher + {"/fleet.auth.game.AuthSvr/Login", new JupiterAuthLogin() } // /api/v1/fleet.auth.game.AuthSvr/Login }; public const string GetConfResp = "{\"conf_version\":\"102\",\"msg\":\"\",\"ret\":1,\"seq\":\"((SEGID))\"}"; public const string MinorcerResp = "{\"adult_age\":15,\"adult_age_map\":{},\"adult_check_status\":1,\"adult_check_status_expiration\":\"0\",\"adult_status_map\":{},\"certificate_type\":3,\"email\":\"\",\"eu_user_agree_status\":0,\"game_grade\":0,\"game_grade_map\":{},\"is_dma\":true,\"is_eea\":false,\"is_need_li_cert\":false,\"msg\":\"success\",\"need_parent_control\":0,\"need_realname_auth\":0,\"parent_certificate_status\":0,\"parent_certificate_status_expiration\":\"0\",\"parent_control_map\":{},\"qr_code_ret\":0,\"realname_auth_status\":0,\"region\":\"300\",\"ret\":0,\"seq\":\"((SEGID))\",\"ts\":\"1719156511\"}"; @@ -47,6 +51,7 @@ namespace nksrv.IntlServer } else { + handler.Reset(); await handler.HandleAsync(context); } } diff --git a/nksrv/IntlServer/IntlMsgHandler.cs b/nksrv/IntlServer/IntlMsgHandler.cs index b97b5c3..64429ea 100644 --- a/nksrv/IntlServer/IntlMsgHandler.cs +++ b/nksrv/IntlServer/IntlMsgHandler.cs @@ -14,6 +14,15 @@ namespace nksrv.IntlServer protected string Seq = ""; protected AccessToken? UsedToken; public abstract bool RequiresAuth { get; } + + public void Reset() + { + UsedToken = null; + Seq = ""; + User = null; + Content = ""; + ctx = null; + } public async Task HandleAsync(IHttpContext ctx) { this.ctx = ctx; @@ -72,14 +81,22 @@ namespace nksrv.IntlServer await HandleAsync(); } protected abstract Task HandleAsync(); - protected async Task WriteJsonStringAsync(string data) + protected async Task WriteJsonStringAsync(string data, bool juniper = false) { if (ctx != null) { var bt = Encoding.UTF8.GetBytes(data); - ctx.Response.ContentEncoding = null; - ctx.Response.ContentType = "application/json"; - ctx.Response.ContentLength64 = bt.Length; + if (juniper) + { + ctx.Response.ContentEncoding = Encoding.UTF8; + ctx.Response.ContentType = "application/json"; + } + else + { + ctx.Response.ContentEncoding = null; + ctx.Response.ContentType = "application/json"; + ctx.Response.ContentLength64 = bt.Length; + } await ctx.Response.OutputStream.WriteAsync(bt, ctx.CancellationToken); await ctx.Response.OutputStream.FlushAsync(); } diff --git a/nksrv/IntlServer/JuniperLauncherGetRegion.cs b/nksrv/IntlServer/JuniperLauncherGetRegion.cs new file mode 100644 index 0000000..6e5718b --- /dev/null +++ b/nksrv/IntlServer/JuniperLauncherGetRegion.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.IntlServer +{ + internal class JuniperLauncherGetRegion : IntlMsgHandler + { + public override bool RequiresAuth => false; + + protected override async Task HandleAsync() + { + await WriteJsonStringAsync(@"{ + ""result"": { + ""error_code"": 0, + ""error_message"": ""success"" + }, + ""region_info"": [ + { + ""game_id"": ""16601"", + ""region_id"": ""10001"", + ""region_name_en_us"": ""Global"", + ""region_name_i18n"": """", + ""region_description_en_us"": ""Nikke Global Version"", + ""region_description_i18n"": """", + ""bind_branches"": """", + ""meta_data"": """", + ""sequence"": 0, + ""status"": 2, + ""branch_info"": [ + { + ""game_id"": ""16601"", + ""branch_id"": ""1"", + ""branch_name"": ""Official_release"", + ""branch_type"": 0, + ""description"": ""正式发布环境 release包"" + } + ] + } + ] +}", true); + } + } +} diff --git a/nksrv/IntlServer/JuniperLauncherGetRepoVersion.cs b/nksrv/IntlServer/JuniperLauncherGetRepoVersion.cs new file mode 100644 index 0000000..49b3560 --- /dev/null +++ b/nksrv/IntlServer/JuniperLauncherGetRepoVersion.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.IntlServer +{ + internal class JuniperLauncherGetRepoVersion : IntlMsgHandler + { + public override bool RequiresAuth => false; + + protected override async Task HandleAsync() + { + await WriteJsonStringAsync(File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "gameversion.json")), true); + } + } +} diff --git a/nksrv/IntlServer/JupiterAuthLogin.cs b/nksrv/IntlServer/JupiterAuthLogin.cs new file mode 100644 index 0000000..69bdcbe --- /dev/null +++ b/nksrv/IntlServer/JupiterAuthLogin.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.IntlServer +{ + internal class JupiterAuthLogin : IntlMsgHandler + { + public override bool RequiresAuth => false; + + protected override async Task HandleAsync() + { + await WriteJsonStringAsync(@"{ + ""result"": { + ""error_code"": 0, + ""error_message"": ""COMM_SUCC"" + }, + ""game_launcher_info"": [ + { + ""id"": 27, + ""execute_file"": ""NIKKE\\Game\\NIKKE.exe"", + ""param"": """", + ""description"": ""Nikke main process"", + ""os"": ""any"", + ""branch_id"": 0, + ""status"": 1, + ""param_type"": 1 + } + ] +}", true); + } + } +} diff --git a/nksrv/IntlServer/JupterGetGameLauncher.cs b/nksrv/IntlServer/JupterGetGameLauncher.cs new file mode 100644 index 0000000..d0ddffd --- /dev/null +++ b/nksrv/IntlServer/JupterGetGameLauncher.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.IntlServer +{ + internal class JuniperLauncherGetGameLauncher : IntlMsgHandler + { + public override bool RequiresAuth => false; + + protected override async Task HandleAsync() + { + await WriteJsonStringAsync(@"{ + ""result"": { + ""error_code"": 0, + ""error_message"": ""COMM_SUCC"" + }, + ""game_launcher_info"": [ + { + ""id"": 27, + ""execute_file"": ""NIKKE\\Game\\NIKKE.exe"", + ""param"": """", + ""description"": ""Nikke main process"", + ""os"": ""any"", + ""branch_id"": 0, + ""status"": 1, + ""param_type"": 1 + } + ] +}", true); + } + } +} diff --git a/nksrv/LobbyServer/Msgs/System/CheckClientVersion.cs b/nksrv/LobbyServer/Msgs/System/CheckClientVersion.cs index d682c4e..b5c07db 100644 --- a/nksrv/LobbyServer/Msgs/System/CheckClientVersion.cs +++ b/nksrv/LobbyServer/Msgs/System/CheckClientVersion.cs @@ -10,7 +10,15 @@ namespace nksrv.LobbyServer.Msgs.System { var req = await ReadData(); var response = new CheckVersionResponse(); - response.VersionStatus = 0; + + if (GameConfig.Root.GameMaxVer != req.Version) + { + response.VersionStatus = 1; + } + else + { + response.VersionStatus = 0; + } await WriteDataAsync(response); } diff --git a/nksrv/Program.cs b/nksrv/Program.cs index 4959ec5..89b96bb 100644 --- a/nksrv/Program.cs +++ b/nksrv/Program.cs @@ -249,6 +249,7 @@ namespace nksrv .WithModule(new ActionModule("/media/", HttpVerbs.Any, HandleAsset)) .WithModule(new ActionModule("/PC/", HttpVerbs.Any, HandleAsset)) .WithModule(new ActionModule("/$batch", HttpVerbs.Any, HandleBatchRequests)) + .WithModule(new ActionModule("/api/v1/", HttpVerbs.Any, IntlHandler.Handle)) .WithStaticFolder("/nikke_launcher", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "www", "launcher"), true) .WithStaticFolder("/admin/assets/", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "www", "admin", "assets"), true) .WithModule(new ActionModule("/admin", HttpVerbs.Any, HandleAdminRequest)) @@ -433,12 +434,13 @@ namespace nksrv { if (ctx.RequestedPath.Contains("/route_config.json")) { - await ctx.SendStringAsync(@"{ + + var response = @"{ ""Config"": [ { ""VersionRange"": { - ""From"": ""122.8.19"", - ""To"": ""122.8.20"", + ""From"": ""{GameMinVer}"", + ""To"": ""{GameMaxVer}"", ""PackageName"": ""com.proximabeta.nikke"" }, ""Route"": [ @@ -481,8 +483,8 @@ namespace nksrv }, { ""VersionRange"": { - ""From"": ""121.8.19"", - ""To"": ""122.8.20"", + ""From"": ""{GameMinVer}"", + ""To"": ""{GameMaxVer}"", ""PackageName"": ""com.gamamobi.nikke"" }, ""Route"": [ @@ -496,7 +498,10 @@ namespace nksrv ] } ] -}", "application/json", Encoding.Default); +}"; + response = response.Replace("{GameMinVer}", GameConfig.Root.GameMinVer); + response = response.Replace("{GameMaxVer}", GameConfig.Root.GameMaxVer); + await ctx.SendStringAsync(response, "application/json", Encoding.Default); } else { diff --git a/nksrv/Utils/GameConfig.cs b/nksrv/Utils/GameConfig.cs index 2dbfefa..b8b3a04 100644 --- a/nksrv/Utils/GameConfig.cs +++ b/nksrv/Utils/GameConfig.cs @@ -7,6 +7,8 @@ namespace nksrv.Utils { public StaticData StaticData { get; set; } = new(); public string ResourceBaseURL { get; set; } = ""; + public string GameMinVer { get; set; } = ""; + public string GameMaxVer { get; set; } = ""; } public class StaticData diff --git a/nksrv/gameconfig.json b/nksrv/gameconfig.json index 4749252..c588632 100644 --- a/nksrv/gameconfig.json +++ b/nksrv/gameconfig.json @@ -9,5 +9,9 @@ }, // Extracted from POST https://global-lobby.nikke-kr.com/v1/resourcehosts2 - "ResourceBaseURL": "https://cloud.nikke-kr.com/prdenv/122-b0255105e0/{Platform}" + "ResourceBaseURL": "https://cloud.nikke-kr.com/prdenv/122-b0255105e0/{Platform}", + + // Extracted from route config + "GameMinVer": "122.8.19", + "GameMaxVer": "122.8.20" } \ No newline at end of file diff --git a/nksrv/gameversion.json b/nksrv/gameversion.json new file mode 100644 index 0000000..960e59f --- /dev/null +++ b/nksrv/gameversion.json @@ -0,0 +1,49 @@ +{ + "result": { + "error_code": 0, + "error_message": "success" + }, + "version_info": { + "game_id": "16601", + "branch_id": "1", + "version_id": "0.0.0.37", + "version_name": "NIKKE.PC_Official_GL_122.8.20", + "version_status": 7, + "service_status": 0, + "build_id": "2810", + "cos_repo_files": "[{\"cdn_root\":\"https://cloud.nikke-kr.com/PC/prod/rid.48-r.02587\",\"chunk_encrypt_flag\":0,\"manifest_files\":[{\"chunks\":[{\"chunk_index\":0,\"chunk_md5\":\"7bcb43a7de15fae58cb5b626ff828910\",\"chunk_size\":109944,\"chunk_uncompress_md5\":\"7bcb43a7de15fae58cb5b626ff828910\",\"chunk_uncompress_size\":109944}],\"file_url\":\"/manifestv2/48_5937488248518493556_0.manifest\",\"manifest_md5\":\"7bcb43a7de15fae58cb5b626ff828910\",\"manifest_size\":109944}],\"manifest_flag\":13,\"manifest_id\":5937488248518493000,\"manifest_version\":2,\"patch_size\":96182631,\"repository_desc\":{\"zh_CN\":\"game repo\"},\"repository_id\":48,\"repository_name\":{\"en_US\":\"Game\",\"zh_CN\":\"Game\"},\"repository_size\":305372746,\"repository_type\":\"Game\",\"repository_uncompress_size\":787528757}]", + "cos_access_info": "[{\"repository_id\":48,\"repository_type\":\"Game\",\"repository_name\":\"Game\",\"repository_name_en\":\"Game\",\"description\":\"game repo\",\"cos_list\":[{\"public_cdn_domain\":\"https://cloud.nikke-kr.com\"}],\"encrytion_key\":\"158f36bf7e611c945320c399294c4a6d\",\"encrytion_algorithm_id\":6,\"manifest_encrytion_key\":\"0f448b096bb4dc5b339debdce77c4572\",\"manifest_encrytion_algorithm_id\":6,\"game_id\":16601,\"manifest_id\":5937488248518494316}]", + "key_file_info": "[{\"crc\":668752354,\"path\":\"NIKKE\\\\game\\\\nikke.exe\"}]", + "install_script": "{\"script_content\":{\"executable\":[]}}", + "installer_size": "305372746", + "installed_size": "787528757", + "publish_time_in_unix": "1720021809", + "is_first_version_in_branch": "1", + "version_description": "[{\"lang_code\":\"en\",\"text\":\"\"},{\"lang_code\":\"ja\",\"text\":\"\"},{\"lang_code\":\"ko\",\"text\":\"\"}]", + "update_type": 0 + }, + "pre_version_info": null, + "launcher_version_info": { + "game_id": "16701", + "branch_id": "1", + "version_id": "0.0.6.379", + "version_name": "nikke_launcher_0.0.6.379", + "version_status": 7, + "service_status": 0, + "build_id": "2813", + "cos_repo_files": "[{\"cdn_root\":\"https://cloud.nikke-kr.com/PC/prod/rid.50-r.971a3\",\"chunk_encrypt_flag\":0,\"manifest_files\":[{\"chunks\":[{\"chunk_index\":0,\"chunk_md5\":\"c470c01b495b3f24f671ecbb00504c2b\",\"chunk_size\":51800,\"chunk_uncompress_md5\":\"c470c01b495b3f24f671ecbb00504c2b\",\"chunk_uncompress_size\":51800}],\"file_url\":\"/manifestv2/50_5937488248518493869_0.manifest\",\"manifest_md5\":\"c470c01b495b3f24f671ecbb00504c2b\",\"manifest_size\":51800}],\"manifest_flag\":13,\"manifest_id\":5937488248518494000,\"manifest_version\":2,\"patch_size\":16110968,\"repository_desc\":{\"zh_CN\":\"game repo\"},\"repository_id\":50,\"repository_name\":{\"en_US\":\"Game\",\"zh_CN\":\"Game\"},\"repository_size\":150773851,\"repository_type\":\"Game\",\"repository_uncompress_size\":391274755}]", + "cos_access_info": "[{\"repository_id\":50,\"repository_type\":\"Game\",\"repository_name\":\"Game\",\"repository_name_en\":\"Game\",\"description\":\"game repo\",\"cos_list\":[{\"public_cdn_domain\":\"https://cloud.nikke-kr.com\"}],\"encrytion_key\":\"ab00cbd5b9e6f7c4759c12d489b34b61\",\"encrytion_algorithm_id\":10,\"manifest_encrytion_key\":\"f8c65f692a6a021a688507a6e441786a\",\"manifest_encrytion_algorithm_id\":6,\"game_id\":16701,\"manifest_id\":5937488248518494306}]", + "key_file_info": "[{\"crc\":2930257430,\"path\":\"nikke_launcher.exe\"}]", + "install_script": "{\"script_content\":{\"executable\":[]}}", + "installer_size": "150773851", + "installed_size": "391274755", + "publish_time_in_unix": "1720020044", + "is_first_version_in_branch": "1", + "version_description": "[{\"lang_code\":\"en\",\"text\":\"\"},{\"lang_code\":\"ja\",\"text\":\"\"},{\"lang_code\":\"id\",\"text\":\"\"},{\"lang_code\":\"th\",\"text\":\"\"},{\"lang_code\":\"pt\",\"text\":\"\"},{\"lang_code\":\"es\",\"text\":\"\"},{\"lang_code\":\"de\",\"text\":\"\"},{\"lang_code\":\"fr\",\"text\":\"\"},{\"lang_code\":\"zh-Hans\",\"text\":\"\"},{\"lang_code\":\"zh-Hant\",\"text\":\"\"}]", + "update_type": 2 + }, + "ip_2_location": { + "ip": "1.1.1.1", + "country_code": "GR" + } +} \ No newline at end of file diff --git a/nksrv/nksrv.csproj b/nksrv/nksrv.csproj index f2c8ffe..264aff6 100644 --- a/nksrv/nksrv.csproj +++ b/nksrv/nksrv.csproj @@ -38,6 +38,9 @@ Always + + Always + Always