launcher: pass PhotonCloudRegion to patcher template

DorkNet.ClientMod's config reads PhotonCloudRegion alongside the
AppIds, and the joining client needs the host's region to connect
to the right Photon cloud. Adds {PHOTON_REGION} to the substitution
map and threads region through ClientPatcher.ApplyAsync from both
host (AppState.PhotonRegion) and join (JoinPayload.PhotonRegion)
flows.
This commit is contained in:
Alexa
2026-05-27 01:02:25 +03:00
parent b155ae5dbe
commit a5ae5da344
3 changed files with 10 additions and 5 deletions
+7 -3
View File
@@ -28,7 +28,8 @@ namespace DorkNet.Launcher.Backend;
/// } /// }
/// </code> /// </code>
/// Config template placeholders: <c>{HOST}</c>, <c>{PHOTON_APPID}</c>, /// Config template placeholders: <c>{HOST}</c>, <c>{PHOTON_APPID}</c>,
/// <c>{PHOTON_VOICE_APPID}</c>. Anything else passes through unchanged.</para></summary> /// <c>{PHOTON_VOICE_APPID}</c>, <c>{PHOTON_REGION}</c>. Anything else
/// passes through unchanged.</para></summary>
public sealed class ClientPatcher public sealed class ClientPatcher
{ {
private const string DefaultPluginDest = "MelonLoader/Mods"; private const string DefaultPluginDest = "MelonLoader/Mods";
@@ -39,11 +40,12 @@ public sealed class ClientPatcher
string recRoomDataPath, string recRoomDataPath,
string photonAppId, string photonAppId,
string photonVoiceAppId, string photonVoiceAppId,
string photonRegion,
string apexHost, string apexHost,
CancellationToken ct = default) CancellationToken ct = default)
{ {
return Task.Run(() => ApplyCore(patcherDir, recRoomDataPath, return Task.Run(() => ApplyCore(patcherDir, recRoomDataPath,
photonAppId, photonVoiceAppId, apexHost), ct); photonAppId, photonVoiceAppId, photonRegion, apexHost), ct);
} }
private PatchResult ApplyCore( private PatchResult ApplyCore(
@@ -51,6 +53,7 @@ public sealed class ClientPatcher
string recRoomDataPath, string recRoomDataPath,
string photonAppId, string photonAppId,
string photonVoiceAppId, string photonVoiceAppId,
string photonRegion,
string apexHost) string apexHost)
{ {
var log = new System.Text.StringBuilder(); var log = new System.Text.StringBuilder();
@@ -133,7 +136,8 @@ public sealed class ClientPatcher
.Replace("{HOST}", apexHost ?? "") .Replace("{HOST}", apexHost ?? "")
.Replace("{PHOTON_APPID}", photonAppId ?? "") .Replace("{PHOTON_APPID}", photonAppId ?? "")
.Replace("{PHOTON_VOICE_APPID}", .Replace("{PHOTON_VOICE_APPID}",
string.IsNullOrEmpty(photonVoiceAppId) ? photonAppId ?? "" : photonVoiceAppId); string.IsNullOrEmpty(photonVoiceAppId) ? photonAppId ?? "" : photonVoiceAppId)
.Replace("{PHOTON_REGION}", string.IsNullOrEmpty(photonRegion) ? "us" : photonRegion);
File.WriteAllText(configDest, rendered); File.WriteAllText(configDest, rendered);
log.AppendLine($"[patch] wrote config: {Path.GetFileName(configDest)}"); log.AppendLine($"[patch] wrote config: {Path.GetFileName(configDest)}");
} }
+2 -2
View File
@@ -224,7 +224,7 @@ public partial class MainWindow : Window
HostStatusText.Text = "Patching your Rec Room client…"; HostStatusText.Text = "Patching your Rec Room client…";
var patch = await _patcher.ApplyAsync( var patch = await _patcher.ApplyAsync(
patcherDir, _state.RecRoomPath!, patcherDir, _state.RecRoomPath!,
_state.PhotonAppId, _state.PhotonVoiceAppId, _hostApex); _state.PhotonAppId, _state.PhotonVoiceAppId, _state.PhotonRegion, _hostApex);
if (!patch.Ok) { ShowError("Patcher failed: " + Truncate(patch.Log, 500)); return; } if (!patch.Ok) { ShowError("Patcher failed: " + Truncate(patch.Log, 500)); return; }
var code = JoinCode.Encode(new JoinPayload var code = JoinCode.Encode(new JoinPayload
@@ -324,7 +324,7 @@ public partial class MainWindow : Window
JoinStatusText.Text = "Patching your Rec Room client…"; JoinStatusText.Text = "Patching your Rec Room client…";
var patch = await _patcher.ApplyAsync( var patch = await _patcher.ApplyAsync(
patcherDir, _state.RecRoomPath!, patcherDir, _state.RecRoomPath!,
payload.PhotonAppId, payload.PhotonVoiceAppId, payload.Host); payload.PhotonAppId, payload.PhotonVoiceAppId, payload.PhotonRegion, payload.Host);
if (!patch.Ok) { ShowError("Patcher failed: " + Truncate(patch.Log, 500)); return; } if (!patch.Ok) { ShowError("Patcher failed: " + Truncate(patch.Log, 500)); return; }
JoinStatusText.Text = $"Patched and ready. Connecting to {payload.Host}. " + JoinStatusText.Text = $"Patched and ready. Connecting to {payload.Host}. " +
+1
View File
@@ -95,6 +95,7 @@ Defaults:
| `{HOST}` | Host's tunnel hostname (or join code's `host` field) | | `{HOST}` | Host's tunnel hostname (or join code's `host` field) |
| `{PHOTON_APPID}` | Host's Photon Realtime AppId | | `{PHOTON_APPID}` | Host's Photon Realtime AppId |
| `{PHOTON_VOICE_APPID}` | Host's Photon Voice AppId (falls back to Realtime if empty) | | `{PHOTON_VOICE_APPID}` | Host's Photon Voice AppId (falls back to Realtime if empty) |
| `{PHOTON_REGION}` | Photon Cloud region (us/eu/asia/jp/sa/kr/in/au); defaults to `us` |
Example template: Example template: