Compare commits

...

4 Commits

Author SHA1 Message Date
Kei-Luna
548c77850e Merge pull request #34 from frearb/fix_server_time
fix server time
2026-05-13 09:31:33 +09:00
Kei-Luna
d8c356a01f Update PatchDownloadService.cs 2026-05-13 09:06:57 +09:00
Kei-Luna
26991c9706 PatchDownload 2026-05-13 09:00:13 +09:00
frearb
4ee11618be fix server time 2026-05-12 00:06:23 +08:00
4 changed files with 51 additions and 6 deletions

View File

@@ -0,0 +1,46 @@
using System.Net.Http.Headers;
namespace MikuSB.Util;
public static class PatchDownloadService
{
private static readonly Logger Logger = new("PatchDownloader");
private const string PatchRelativePath = @"Patch\MikuSB-Patch.dll";
private const string PatchDownloadUrl = "https://github.com/Kei-Luna/MikuSB-Patch/releases/download/MikuSB-Patch/MikuSB-Patch.dll";
private const int DownloadTimeoutSeconds = 60;
public static void EnsurePatchPresent()
{
var patchPath = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, PatchRelativePath));
if (File.Exists(patchPath))
return;
Directory.CreateDirectory(Path.GetDirectoryName(patchPath)!);
Logger.Warn($"Patch DLL not found. Downloading to {patchPath}.");
using var client = CreateHttpClient();
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(DownloadTimeoutSeconds));
using var response = client.GetAsync(PatchDownloadUrl, HttpCompletionOption.ResponseHeadersRead, cts.Token)
.GetAwaiter().GetResult();
response.EnsureSuccessStatusCode();
using var source = response.Content.ReadAsStreamAsync(cts.Token).GetAwaiter().GetResult();
using var destination = File.Create(patchPath);
source.CopyTo(destination);
Logger.Info("Patch DLL download completed.");
}
private static HttpClient CreateHttpClient()
{
var client = new HttpClient
{
Timeout = Timeout.InfiniteTimeSpan
};
client.DefaultRequestHeaders.UserAgent.Add(
new ProductInfoHeaderValue("MikuSB-PatchDownloader", BuildVersion.Current));
return client;
}
}

View File

@@ -1,16 +1,14 @@
using MikuSB.Util.Extensions;
namespace MikuSB.GameServer.Server.CallGS.Handlers.Misc;
// Client requests server time to calculate timezone offset.
// nTime1/nTime2 are DST transition reference timestamps; returning the same value means no offset.
// In the client, ZoneTime.lua hardcodes sTime1/sTime2; if nTime1/nTime2 are false, the client ignores this update.
// Otherwise, offset = nTimeX - ParseTimeNative(sTimeX).
[CallGSApi("ZoneTime_ReqTime")]
public class ZoneTime_ReqTime : ICallGSHandler
{
public async Task Handle(Connection connection, string param, ushort seqNo)
{
var now = Extensions.GetUnixSec();
var arg = $"{{\"nTime1\":{now},\"nTime2\":{now}}}";
var arg = $"{{\"nTime1\":false,\"nTime2\":false}}";
await CallGSRouter.SendScript(connection, "ZoneTime_ChangeTime", arg);
}
}

View File

@@ -11,6 +11,7 @@ public static class GameLaunchService
public static int Launch(params string[] extraGameArguments)
{
ConfigManager.LoadConfig();
PatchDownloadService.EnsurePatchPresent();
var options = LaunchOptions.FromConfig(extraGameArguments);
return Launch(options);
}

View File

@@ -1 +1 @@
v=2.4
v=2.5