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