mirror of
https://github.com/DorkSquadRR/DorkNet.git
synced 2026-10-25 23:18:44 -07:00
Import december-2020-12-18 from private repo (scrubbed 2026-05-27)
Targets Rec Room 2020.12.18 client.
Re-import after adding:
- DorkNet.ClientMod/dorknet-clientmod.json.template — config schema
the launcher's manifest-driven patcher renders into UserData/.
- tools/build-patcher-zip.ps1 — produces the dorknet-clientpatch-{key}.zip
Release asset the launcher fetches.
- .github/workflows/release.yml — auto-publishes both Release assets
on v1-december-* tag push.
Scrubbed via maintainer-side scrub-for-public.ps1: same drop rules as
the prior import, plus build-patcher-zip.ps1 added to the tools/
allow-list so it survives the scrub.
This commit is contained in:
@@ -0,0 +1,345 @@
|
||||
# Rec Room 2020 Client RecNet API Sweep
|
||||
|
||||
This is a first-pass audit of the decompiled March and December 2020 client
|
||||
material, focused on RecNet URLs, API route fragments, request wrappers, and
|
||||
response DTO shapes.
|
||||
|
||||
## Sources
|
||||
|
||||
- December C# declarations:
|
||||
`dist/RecRoom-2020.12.18-dump/DiffableCs`
|
||||
- December native/ISIL body dump:
|
||||
`dist/RecRoom-2020.12.18-isil/IsilDump`
|
||||
- March archive:
|
||||
`C:/Users/you/Documents/Recnet-archive/decompiled`
|
||||
|
||||
The December readable C# dump preserves class names, fields, enum members, and
|
||||
method signatures, but most method bodies are empty. For actual URL strings and
|
||||
call context, the ISIL dump is the useful source. The March archive exposes a
|
||||
large `Il2CppDump/stringliteral.json`; that is best for literal comparison, but
|
||||
it does not always preserve call-site context.
|
||||
|
||||
Generated companion files:
|
||||
|
||||
- `docs/recroom-2020-client-endpoint-inventory.csv`: raw endpoint/string
|
||||
inventory with build, type, method, file, line, and literal string.
|
||||
- `docs/recroom-2020-client-dto-inventory.md`: public field/property inventory
|
||||
for the December `Assembly-CSharp/RecNet` DTO namespace.
|
||||
|
||||
## Central RecNet Stack
|
||||
|
||||
The central December network wrapper is the obfuscated global class
|
||||
`BPHGKAEDBPE`.
|
||||
|
||||
Important declarations found in
|
||||
`dist/RecRoom-2020.12.18-dump/DiffableCs/Assembly-CSharp/BPHGKAEDBPE.cs`:
|
||||
|
||||
- `NameServerResponse` fields: `RecNetStatus`, `Auth`, `API`, `WWW`,
|
||||
`Notifications`, `Images`, `CDN`, `Commerce`, `Matchmaking`, `Storage`,
|
||||
`Chat`, `Leaderboard`, `Accounts`, `Link`, `RoomComments`, `Clubs`, `Rooms`.
|
||||
- request queue item `IPJHBGCCNGH`: stores `HTTPMethods`, service enum,
|
||||
relative URI, retry flag, request configuration callback, and a promise for
|
||||
`HOOILIHKMEG`.
|
||||
- public wrapper methods cover GET/POST-style calls with JSON strings, typed
|
||||
request objects, URL encoded forms, multipart forms, and arbitrary request
|
||||
configuration callbacks.
|
||||
|
||||
The service enum is `LDCMJEDOFCO`:
|
||||
|
||||
- `Auth`
|
||||
- `API`
|
||||
- `Commerce`
|
||||
- `Matchmaking`
|
||||
- `Notifications`
|
||||
- `Images`
|
||||
- `CDN`
|
||||
- `Storage`
|
||||
- `Chat`
|
||||
- `Leaderboard`
|
||||
- `Accounts`
|
||||
- `Link`
|
||||
- `RoomComments`
|
||||
- `Clubs`
|
||||
- `Rooms`
|
||||
|
||||
The March literal table includes the bootstrap URL
|
||||
`https://ns.rec.net/?v=2`. The December ISIL confirms the same name-server
|
||||
shape through `BPHGKAEDBPE.NameServerResponse`.
|
||||
|
||||
## Confirmed Route Families
|
||||
|
||||
These route families were found in the December ISIL dump. Many are assembled
|
||||
from multiple adjacent string literals, for example a base like
|
||||
`api/inventions/` plus a format string like
|
||||
`{0}v1/details?inventionId={1}`.
|
||||
|
||||
### Account, Login, And Bootstrap
|
||||
|
||||
- `https://ns.rec.net/?v=2` in March literals.
|
||||
- `https://rec.net/password/recover` in March literals.
|
||||
- `.rec.net` host suffix in March literals.
|
||||
- `account/bulk`, `account/bulk?`, and `account/bulk/` in December ISIL.
|
||||
- RecNet connectivity test string:
|
||||
`http://www.google.com/generate_204`.
|
||||
|
||||
### Player State
|
||||
|
||||
- `api/players/v2/objectives`
|
||||
- `/api/players/v1/progression/{0}`
|
||||
- `/api/players/v1/progression/bulk`
|
||||
- `/api/playerReputation/v1/{0}`
|
||||
- `/api/playerReputation/v1/bulk`
|
||||
- `api/avatar/v1/lockeditems?`
|
||||
|
||||
The response/request DTO coverage here is outside the small `RecNet` folder in
|
||||
many cases, so the raw CSV should be used with `rg` follow-up on the owning
|
||||
obfuscated class names.
|
||||
|
||||
### Rooms
|
||||
|
||||
- `rooms/{0}`
|
||||
- `rooms/bulk`
|
||||
- `rooms/base`
|
||||
- `rooms/createdby/me`
|
||||
- `rooms/ownedby/me`
|
||||
- `rooms/moderatedby/me`
|
||||
- `rooms/cheeredby/me`
|
||||
- `rooms/favoritedby/me`
|
||||
- `rooms/visitedby/me`
|
||||
- `rooms/createdby/{0}`
|
||||
- `rooms/rro_ids`
|
||||
- `rooms/{0}/subrooms/{1}/datahistory`
|
||||
- `rooms/{0}/roles`
|
||||
- `rooms/{0}/roles/{1}`
|
||||
- `rooms/recommendations`
|
||||
- `rooms/search`
|
||||
- `rooms/hot`
|
||||
- `featuredrooms/current`
|
||||
- `rooms/{0}/clone`
|
||||
- `rooms/{0}/name`
|
||||
- `rooms/{0}/description`
|
||||
- `rooms/{0}/image`
|
||||
- `rooms/{0}/tags`
|
||||
- `api/rooms/v1/roomRolePermissions`
|
||||
- `api/rooms/v4/saveData`
|
||||
- `api/rooms/v2/report`
|
||||
- `api/rooms/v1/verifyRole`
|
||||
- `api/rooms/v1/filters`
|
||||
- `rooms/{0}/subrooms/{1}/data`
|
||||
|
||||
The DorkNet server already implements many of these surfaces under
|
||||
`Controllers/API/Rooms/V2`, `Controllers/Rooms`, `Controllers/Storage`, and
|
||||
`Controllers/Cdn`.
|
||||
|
||||
### Matchmaking
|
||||
|
||||
December `RecNet/Matchmaking` ISIL contains:
|
||||
|
||||
- `goto/room/`
|
||||
- `room/{0}/instances`
|
||||
|
||||
The client expects matchmaking and goto responses to contain room instance
|
||||
identity, room/sub-room ids, Photon room ids, privacy/full/in-progress state,
|
||||
and location-like fields. This matches the DorkNet notes about
|
||||
`GoToController`, `MatchController`, `GameSessionService`, and
|
||||
`PrivateInstanceService`.
|
||||
|
||||
### Inventions
|
||||
|
||||
The invention API is one of the clearest route clusters.
|
||||
|
||||
Base:
|
||||
|
||||
- `api/inventions/`
|
||||
|
||||
Fragments:
|
||||
|
||||
- `{0}v1?inventionId={1}`
|
||||
- `{0}v1/update?inventionId={1}&name={2}`
|
||||
- `{0}v1/update?inventionId={1}&description={2}`
|
||||
- `{0}v1/update?inventionId={1}&imgName={2}`
|
||||
- `{0}v1/update?inventionId={1}&permission={2}`
|
||||
- `{0}v1/details?inventionId={1}`
|
||||
- `{0}v1/versions?inventionId={1}`
|
||||
- `{0}v1/delete?inventionId={1}`
|
||||
- `{0}v3/publish?inventionId={1}&permissionLevel={2}`
|
||||
- `{0}v1/unpublish?inventionId={1}`
|
||||
- `{0}v1/download?inventionId={1}`
|
||||
- `{0}v1/version?inventionId={1}&version={2}`
|
||||
- `api/inventions/v4/save` in December
|
||||
- `api/inventions/v3/addversion` in December
|
||||
- `api/inventions/v1/fulllineageowner?`
|
||||
- `/invention/{0}` link route
|
||||
|
||||
March literals show similar routes, but older save/publish strings include:
|
||||
|
||||
- `api/inventions/v3/save`
|
||||
- `api/inventions/v3/addversion`
|
||||
- `{0}v2/publish?inventionId={1}&permissionLevel={2}`
|
||||
|
||||
That suggests December moved at least the save path from `v3` to `v4` and the
|
||||
publish path from `v2` to `v3`.
|
||||
|
||||
Relevant December DTOs:
|
||||
|
||||
- `NewInventionRequestDTO`
|
||||
- `AddVersionInventionRequestDTO`
|
||||
- `NewRoomKeyRequestDTO`
|
||||
- `UpdateRoomKeyRequestDTO`
|
||||
- `InventionBatchRequest`
|
||||
- `CheerRequest`
|
||||
- `UpdatePriceRequest`
|
||||
- `ReportRequest`
|
||||
|
||||
See `docs/recroom-2020-client-dto-inventory.md` for the field list.
|
||||
|
||||
### Room Keys
|
||||
|
||||
- `api/roomkeys/v1/create`
|
||||
- `api/roomkeys/v1/update`
|
||||
- `api/roomkeys/v1/mine`
|
||||
|
||||
Relevant DTOs:
|
||||
|
||||
- `NewRoomKeyRequestDTO`
|
||||
- `UpdateRoomKeyRequestDTO`
|
||||
|
||||
### Player Events
|
||||
|
||||
- `api/playerevents/v1/deleteResponse`
|
||||
- `api/playerevents/v1/bulkInvite`
|
||||
- `api/playerevents/v1/all`
|
||||
- `api/playerevents/v1/report`
|
||||
- `api/playerevents/v1/searchlive?`
|
||||
- `api/playerevents/v1/search?`
|
||||
- `api/playerevents/v1/tagfilters`
|
||||
|
||||
Relevant DTOs:
|
||||
|
||||
- `GetEventsForClubsRequest`
|
||||
- `BulkInviteRequest`
|
||||
- `DeleteResponseRequest`
|
||||
- `PlayerEventDTOPage`
|
||||
|
||||
### Messages And Notifications
|
||||
|
||||
- `api/messages/v3/delete`
|
||||
- `api/messages/v1/IOSSaveDeviceToken`
|
||||
- `api/messages/v1/IOSClearDeviceToken`
|
||||
- `api/messages/v1/IOSResetNotificationPreferencesBadgeCount`
|
||||
- `api/messages/v1/IOSModifyNotificationPreferences`
|
||||
|
||||
Relevant DTO:
|
||||
|
||||
- `DeleteMessagesRequestDTO`
|
||||
|
||||
The `NameServerResponse` includes `Notifications` and `Chat` service bases, so
|
||||
SignalR and chat routes are likely partly constructed outside the RecNet DTO
|
||||
namespace.
|
||||
|
||||
### Clubs
|
||||
|
||||
- `members/bulk`
|
||||
- `members/bulk?`
|
||||
- `api/clubreporting/v1/report`
|
||||
|
||||
The `NameServerResponse` includes `Clubs`, and the DorkNet server has club/event
|
||||
adjacent models. A second pass should focus on `JDJGIBLMFKK` and related
|
||||
club/member UI/data classes.
|
||||
|
||||
### Store, Economy, Rewards
|
||||
|
||||
- `api/gamerewards/v1/pending`
|
||||
- `api/gamerewards/v1/select`
|
||||
- `/consume`
|
||||
|
||||
The purchase error strings include token support email text, and invention
|
||||
purchase flows are wired through the invention/store UI.
|
||||
|
||||
### Config And Announcements
|
||||
|
||||
- `api/config/`
|
||||
- `api/config/v1/freegiftbutton`
|
||||
- `/config/{0}`
|
||||
- `api/announcement/v1/get`
|
||||
- `api/activities/charades/v1/words`
|
||||
|
||||
### User Reporting
|
||||
|
||||
- `https://userreporting.cloud.unity3d.com`
|
||||
- `https://userreporting.cloud.unity3d.com/api/userreporting/projects/{0}/ping`
|
||||
- `{0}/api/userreporting`
|
||||
- `api/PlayerReporting/v1/voteToKickReasons`
|
||||
|
||||
This is partly Unity user reporting, partly RecNet player reporting.
|
||||
|
||||
## Request And Response Shape Notes
|
||||
|
||||
The December `RecNet` C# namespace gives the best directly-readable request DTOs.
|
||||
Examples:
|
||||
|
||||
- `AddVersionInventionRequestDTO`: `inventionId`, costs, `creationRoomId`,
|
||||
`inventionDataFilename`, `referencedInventions`.
|
||||
- `NewInventionRequestDTO`: name/description, costs, room id, data/image names,
|
||||
and referenced inventions.
|
||||
- `UpdatePriceRequest`: price-style request object for paid inventions.
|
||||
- `GetRankRequestDTO`, `GetRanksRequestDTO`, `GetNearbyScoresRequestDTO`, and
|
||||
`GetLeaderboardRequestDTO`: leaderboard/ranking inputs.
|
||||
- `BulkInviteRequest`, `DeleteResponseRequest`, `GetEventsForClubsRequest`:
|
||||
player-event request inputs.
|
||||
- `DeleteMessagesRequestDTO`: message deletion body.
|
||||
- `ReportRequest`: generic report payload.
|
||||
|
||||
`Matchmaking.cs` and room model classes contain response model declarations, but
|
||||
the most important server-facing shape is already known from DorkNet behavior:
|
||||
room instances must include room instance id, room id, sub-room id, location,
|
||||
Photon region and room id, capacity/full/private/in-progress flags, and enough
|
||||
room data URL information to make the client download binary room blobs.
|
||||
|
||||
## March Vs December
|
||||
|
||||
Observed March literals include:
|
||||
|
||||
- `https://ns.rec.net/?v=2`
|
||||
- `https://rec.net`
|
||||
- `https://rec.net/password/recover`
|
||||
- `.rec.net`
|
||||
- `api/inventions/v3/save`
|
||||
- `api/inventions/v3/addversion`
|
||||
- `{0}v2/publish?inventionId={1}&permissionLevel={2}`
|
||||
- `api/rooms/v4/saveData`
|
||||
- the same player progression and reputation routes as December.
|
||||
|
||||
Observed December ISIL includes:
|
||||
|
||||
- `api/inventions/v4/save`
|
||||
- `api/inventions/v3/addversion`
|
||||
- `{0}v3/publish?inventionId={1}&permissionLevel={2}`
|
||||
- the larger rooms route cluster listed above.
|
||||
|
||||
The safest server strategy is to support both March and December variants for
|
||||
invention save/publish, and to keep room save/data endpoints tolerant of both
|
||||
legacy room API and `api/rooms/v4/saveData`.
|
||||
|
||||
## Important Caveats
|
||||
|
||||
This is not yet a literal function-by-function human annotation of every call
|
||||
site. The reason is practical: the December C# decompile has declarations but
|
||||
empty bodies, while the ISIL dump has bodies but obfuscated names and low-level
|
||||
instructions. The generated CSV gives the call-site line numbers needed for that
|
||||
next pass.
|
||||
|
||||
For any route that matters to gameplay, verify all three things before changing
|
||||
DorkNet behavior:
|
||||
|
||||
- the service base selected by `LDCMJEDOFCO`;
|
||||
- the route string assembled around the literal fragments;
|
||||
- the DTO or response class used by the promise continuation.
|
||||
|
||||
Best next search commands:
|
||||
|
||||
```powershell
|
||||
rg -n "api/inventions|rooms/|goto/room|playerevents|roomkeys|messages" dist/RecRoom-2020.12.18-isil/IsilDump/Assembly-CSharp
|
||||
rg -n "class .*Request|class .*Response|public .*;" dist/RecRoom-2020.12.18-dump/DiffableCs/Assembly-CSharp/RecNet
|
||||
rg -n "https://ns.rec.net|api/inventions|api/rooms|playerevents|roomkeys" C:/Users/you/Documents/Recnet-archive/decompiled/Il2CppDump/stringliteral.json
|
||||
```
|
||||
Reference in New Issue
Block a user