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.
11 KiB
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 DecemberAssembly-CSharp/RecNetDTO 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:
NameServerResponsefields:RecNetStatus,Auth,API,WWW,Notifications,Images,CDN,Commerce,Matchmaking,Storage,Chat,Leaderboard,Accounts,Link,RoomComments,Clubs,Rooms.- request queue item
IPJHBGCCNGH: storesHTTPMethods, service enum, relative URI, retry flag, request configuration callback, and a promise forHOOILIHKMEG. - 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:
AuthAPICommerceMatchmakingNotificationsImagesCDNStorageChatLeaderboardAccountsLinkRoomCommentsClubsRooms
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=2in March literals.https://rec.net/password/recoverin March literals..rec.nethost suffix in March literals.account/bulk,account/bulk?, andaccount/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/bulkapi/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/bulkrooms/baserooms/createdby/merooms/ownedby/merooms/moderatedby/merooms/cheeredby/merooms/favoritedby/merooms/visitedby/merooms/createdby/{0}rooms/rro_idsrooms/{0}/subrooms/{1}/datahistoryrooms/{0}/rolesrooms/{0}/roles/{1}rooms/recommendationsrooms/searchrooms/hotfeaturedrooms/currentrooms/{0}/clonerooms/{0}/namerooms/{0}/descriptionrooms/{0}/imagerooms/{0}/tagsapi/rooms/v1/roomRolePermissionsapi/rooms/v4/saveDataapi/rooms/v2/reportapi/rooms/v1/verifyRoleapi/rooms/v1/filtersrooms/{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/savein Decemberapi/inventions/v3/addversionin Decemberapi/inventions/v1/fulllineageowner?/invention/{0}link route
March literals show similar routes, but older save/publish strings include:
api/inventions/v3/saveapi/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:
NewInventionRequestDTOAddVersionInventionRequestDTONewRoomKeyRequestDTOUpdateRoomKeyRequestDTOInventionBatchRequestCheerRequestUpdatePriceRequestReportRequest
See docs/recroom-2020-client-dto-inventory.md for the field list.
Room Keys
api/roomkeys/v1/createapi/roomkeys/v1/updateapi/roomkeys/v1/mine
Relevant DTOs:
NewRoomKeyRequestDTOUpdateRoomKeyRequestDTO
Player Events
api/playerevents/v1/deleteResponseapi/playerevents/v1/bulkInviteapi/playerevents/v1/allapi/playerevents/v1/reportapi/playerevents/v1/searchlive?api/playerevents/v1/search?api/playerevents/v1/tagfilters
Relevant DTOs:
GetEventsForClubsRequestBulkInviteRequestDeleteResponseRequestPlayerEventDTOPage
Messages And Notifications
api/messages/v3/deleteapi/messages/v1/IOSSaveDeviceTokenapi/messages/v1/IOSClearDeviceTokenapi/messages/v1/IOSResetNotificationPreferencesBadgeCountapi/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/bulkmembers/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/pendingapi/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/getapi/activities/charades/v1/words
User Reporting
https://userreporting.cloud.unity3d.comhttps://userreporting.cloud.unity3d.com/api/userreporting/projects/{0}/ping{0}/api/userreportingapi/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, andGetLeaderboardRequestDTO: 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=2https://rec.nethttps://rec.net/password/recover.rec.netapi/inventions/v3/saveapi/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/saveapi/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:
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