Alexa 80cc4ce0bd Eager Photon AppId override via OnUpdate poll
The harmony hook on PhotonNetwork.ConnectUsingSettings registers in
March's IL2CPP build but never actually fires — the watch's connect
path goes through a different (mangled) entry point. Log confirms
[patch-ok] PhotonNetwork.ConnectUsingSettings but no
[photon-appid] override line, ever.

Fix moves the override out of the prefix-only path:

- New PhotonPatches.TryApplyOverride(reason) does the
  PhotonServerSettings.AppID / VoiceAppID / region mutation and
  flips an OverrideApplied flag once it succeeds. Idempotent.
- OnUpdate polls TryApplyOverride every 6th frame (~10 Hz) until
  it succeeds, then stops. The "type not found yet" log is
  throttled to once on first miss + every 300th miss after, so
  the file doesn't drown if PhotonServerSettings stays unloaded.
- Mod.ResolveType made internal (was private) so PhotonPatches
  + SavePatches can use the broader assembly-scan fallback —
  the local FindGameType copies were too narrow and missed
  IL2CPP-mangled type names. Both FindGameType helpers collapse
  to one-line delegates to Mod.ResolveType.
- Prefix on ConnectUsingSettings kept as a belt-and-braces hook
  (passes reason="prefix"); harmless if it fires, fine if it
  doesn't.
2026-05-28 13:46:39 +03:00

DorkNet — march-2020-03-10

This is the March 2020.03.10 branch of DorkNet — a self-hostable reimplementation of the Rec Room backend tuned to the wire protocol of the Rec Room 2020.03.10 client build (also serves 2020.03.06).

⚠️ Not affiliated with Rec Room Inc. or Against Gravity. See DISCLAIMER. DorkNet ships no Rec Room game assets or modified binaries — you supply your own legally-acquired Rec Room install.

If you're not sure which DorkNet branch you want, start at the main branch's chart. The launcher on main also auto-detects your install.


What this branch targets

Client build Rec Room 2020.03.10 (also 2020.03.06)
Schema Multi-step EF migrations (~34 phases)
Diverges from december-2020-12-18 by ~170 files

Subsystems NOT present on this branch (these landed in December):

  • Clubs surface
  • Playlists (curated + user-created)
  • Group DMs / chat threads
  • Weekly challenges
  • Room keys (purchasable room access)
  • Per-room co-owner / moderator / host roles
  • Late-2020 store catalog additions

If you need any of those, you're on the wrong branch — see december-2020-12-18.


Quickstart

1. Install .NET 9 SDK and (optionally) dotnet-ef:

dotnet tool install --global dotnet-ef

2. Clone this branch:

git clone --branch march-2020-03-10 https://github.com/DorkSquadRR/DorkNet
cd DorkNet

3. Configure secrets. Drop in DorkNet.Server/appsettings.Local.json (gitignored) or export environment variables:

Config key Env var Required Notes
Jwt:Secret Jwt__Secret yes ≥64 random chars
Photon:AppId Photon__AppId yes Photon Realtime AppId (free at dashboard.photonengine.com)
Photon:VoiceAppId Photon__VoiceAppId no only if voice chat
Photon:CloudRegion Photon__CloudRegion no defaults to us
Database:Provider Database__Provider no sqlite (default) or postgres
ConnectionStrings:Default ConnectionStrings__Default postgres-only full Npgsql connection string
ConnectionStrings:Redis ConnectionStrings__Redis no enables SignalR backplane
Domain:Apex DORKNET_DOMAIN no defaults to localhost; set for production

4. Boot:

dotnet run --project DorkNet.Server

First boot creates bin/Debug/net9.0/data/dorknet.db, applies all EF migrations under DorkNet.Server/Migrations/, seeds canonical rooms + store catalog, and starts listening. You should see Application started. in the log; curl http://localhost:8080/healthz returns 200.

For Docker / VPS, see docs/deploy.md.


Patching your client

.\tools\install-plugin.ps1 `
  -RecRoomPath "C:\Path\To\Recroom_Release_Data" `
  -PhotonAppId "<your-photon-realtime-app-id>" `
  -PhotonVoiceAppId "<your-photon-voice-app-id>"

This installs the BepInEx 6 plugin into the client's BepInEx/plugins/ and writes its config under BepInEx/config/. The plugin rewrites all *.rec.net URIs to your configured DorkNet apex, swaps the Photon AppIds, and bypasses TLS verification on the client's HTTPS calls so self-signed certs work.

If BepInEx isn't installable on the user's machine, the legacy tools/install-legacy-client.ps1 does the same patches via direct byte-edits of resources.assets + GameAssembly.dll. Slower setup, no Harmony runtime needed.


Code map

Folder Purpose
DorkNet.Server/ ASP.NET Core backend (controllers, services, data, hubs, middleware)
DorkNet.Server/Migrations/ EF Core schema migrations applied at boot
DorkNet.Models/ DTOs shared between server and client mod
DorkNet.ClientPatch/ BepInEx IL2CPP plugin (production patcher)
DorkNet.ClientMod/ MelonLoader port (alternative patcher)
tools/ Installers + Cloudflare tunnel templates

Compared to december-2020-12-18, this branch's server is closer to the original 2020-Q1 wire shape — fewer endpoints, simpler entities, and the multi-step migrations haven't been consolidated.


Contributing

See main's CONTRIBUTING guide for the project-wide rules.

Branch-specific:

  • Schema changes on this branch don't flow to december-2020-12-18 automatically. If a fix applies to both, cherry-pick it across.
  • Don't rebase across branches — they're independent forks.
  • New EF migrations: dotnet ef migrations add <Name> --project DorkNet.Server. Migrate() runs on boot; don't run database update manually.

License

AGPL-3.0. Hosted forks must publish their source.

S
Description
No description provided
Readme AGPL-3.0 24 MiB
Languages
C# 82.7%
TypeScript 11.2%
PowerShell 1.4%
Python 1.3%
JavaScript 1.2%
Other 2.1%