Compare commits

..

7 Commits

Author SHA1 Message Date
Alexa 911206a115 fix(cli): declare RuntimeIdentifiers so no-restore publish works
CI restores without a RID then publishes per-RID with no-restore, which failed NETSDK1047 because the assets file had no RID targets. Declaring RuntimeIdentifiers makes the RID-less restore cover all of them.
2026-06-16 01:02:55 +03:00
Alexa cfd5724859 fix(cli): exit 0 on --help, handle parse errors cleanly
--help printed usage but returned exit code 1, failing the CI smoke test. Treat --help / -h / no-args as a successful usage print (exit 0), and catch parser ArgumentExceptions so a missing value or bad --mode exits 1 with a message instead of an unhandled crash.
2026-06-16 00:55:41 +03:00
Alexa 75d187acf8 Merge pull request #12 from DorkSquadRR/docs-vr-mobile-support
Docs refresh: README intro, VR/mobile support, antivirus FAQ
2026-06-16 00:37:02 +03:00
Alexa e1fc786ac1 docs: add .backups to .gitignore 2026-06-16 00:35:46 +03:00
Alexa 8f7fc09266 docs(faq): explain why no antivirus exceptions are needed
Add an FAQ entry contrasting DorkNet with closed-source private-server
tools that ask users to disable antivirus: DorkNet is fully open source
and nothing is obfuscated, so there's nothing hidden for a scanner to flag
and no reason to weaken protection to run it.
2026-06-16 00:31:00 +03:00
Alexa e3fb9477b1 docs: add intro, mark VR/mobile supported, drop Junior mention
Add a short plain-language intro at the top of the README explaining what
DorkNet is. Mark VR and Mobile as supported in the feature table, and
remove the Junior accounts row.
2026-06-16 00:27:24 +03:00
Alexa d1b75aba57 Merge pull request #7 from DorkSquadRR/docs-main-refresh
Refresh main docs
2026-06-16 00:03:10 +03:00
5 changed files with 75 additions and 38 deletions
+1 -2
View File
@@ -23,7 +23,7 @@ appsettings.Development.json
.env .env
.env.local .env.local
.env.*.local .env.*.local
.backups
# Runtime data # Runtime data
data/*.db data/*.db
data/*.db-shm data/*.db-shm
@@ -68,4 +68,3 @@ Thumbs.db
# Test outputs # Test outputs
TestResults/ TestResults/
*.coverage *.coverage
+8 -2
View File
@@ -1,5 +1,11 @@
# DorkNet # DorkNet
DorkNet lets you run your own private server for old versions of Rec Room.
It brings back the 2020-era game — logging in, hanging out in your dorm,
matchmaking, chatting with friends, building rooms — all on a server you
host yourself. You supply your own legally-owned copy of Rec Room, and
DorkNet handles the rest: the server, the client patcher, and the setup
tools to get you playing again.
> ⚠️ **Not affiliated with Rec Room Inc. or Against Gravity.** > ⚠️ **Not affiliated with Rec Room Inc. or Against Gravity.**
> See [DISCLAIMER.md](DISCLAIMER.md). DorkNet ships no Rec Room game assets > See [DISCLAIMER.md](DISCLAIMER.md). DorkNet ships no Rec Room game assets
@@ -102,8 +108,8 @@ branch's `BRANCHES.md` row for the exact deltas.
| Store catalog + gifting | ✅ | | Store catalog + gifting | ✅ |
| Game invites | ✅ | | Game invites | ✅ |
| Image upload (polaroids, room thumbnails) | ✅ | | Image upload (polaroids, room thumbnails) | ✅ |
| VR (Quest/Index/etc.) | ⚠️ Photon-dependent; works in dev, untested at scale | | VR (Quest/Index/etc.) | ✅ |
| Mobile / Junior accounts | ⚠️ Partial — Junior chat-restrictions disabled by default in Easy mode | | Mobile | ✅ |
| Voice chat | ❌ Routes through Photon Voice; needs separate Photon Voice AppId | | Voice chat | ❌ Routes through Photon Voice; needs separate Photon Voice AppId |
| Cross-server federation | ❌ Out of scope | | Cross-server federation | ❌ Out of scope |
@@ -6,6 +6,10 @@
alongside Windows. The shared Backend classes are written to alongside Windows. The shared Backend classes are written to
OperatingSystem.IsWindows()-gate any Windows-only paths. --> OperatingSystem.IsWindows()-gate any Windows-only paths. -->
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net9.0</TargetFramework>
<!-- Declared so a RID-less restore produces assets for every target the
CI matrix / release pipeline later publishes with no-restore. Without
this, RID-specific publish fails with NETSDK1047. -->
<RuntimeIdentifiers>win-x64;linux-x64;linux-arm64;osx-x64;osx-arm64</RuntimeIdentifiers>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>DorkNet.ServerCli</RootNamespace> <RootNamespace>DorkNet.ServerCli</RootNamespace>
+43 -34
View File
@@ -14,8 +14,15 @@ public static class Program
{ {
public static async Task<int> Main(string[] args) public static async Task<int> Main(string[] args)
{ {
// --help / -h (and a bare invocation) print usage and exit cleanly.
if (args.Length == 0 || args.Contains("--help") || args.Contains("-h"))
{
PrintHelp();
return 0;
}
var parsed = ParseArgs(args); var parsed = ParseArgs(args);
if (parsed is null) return 1; // ParseArgs already wrote --help or an error. if (parsed is null) return 1; // ParseArgs already wrote the error.
// Validate required values up front so the user sees the // Validate required values up front so the user sees the
// failure before any download / process spin-up. // failure before any download / process spin-up.
@@ -216,50 +223,52 @@ public static class Program
private static ParsedArgs? ParseArgs(string[] args) private static ParsedArgs? ParseArgs(string[] args)
{ {
if (args.Length == 0 || args.Contains("--help") || args.Contains("-h"))
{
PrintHelp();
return null;
}
string photon = "", voice = "", region = "us"; string photon = "", voice = "", region = "us";
string mode = "localtunnel", apex = "", name = "DorkNet Server"; string mode = "localtunnel", apex = "", name = "DorkNet Server";
string versionKey = "march_2020_03_10"; string versionKey = "march_2020_03_10";
string? serverDir = null; string? serverDir = null;
for (int i = 0; i < args.Length; i++) try
{ {
string Next() for (int i = 0; i < args.Length; i++)
{ {
if (i + 1 >= args.Length) string Next()
throw new ArgumentException($"missing value for {args[i]}"); {
return args[++i]; if (i + 1 >= args.Length)
throw new ArgumentException($"missing value for {args[i]}");
return args[++i];
}
switch (args[i])
{
case "--photon-id": photon = Next(); break;
case "--voice-id": voice = Next(); break;
case "--region": region = Next(); break;
case "--mode": mode = Next(); break;
case "--apex": apex = Next(); break;
case "--name": name = Next(); break;
case "--version": versionKey = Next(); break;
case "--server-dir": serverDir = Next(); break;
default:
Console.Error.WriteLine($"error: unknown arg '{args[i]}' (try --help)");
return null;
}
} }
switch (args[i])
HostingMode parsedMode = mode.ToLowerInvariant() switch
{ {
case "--photon-id": photon = Next(); break; "localtunnel" or "lt" or "internet" or "tunnel" => HostingMode.SingleOriginTunnel,
case "--voice-id": voice = Next(); break; "wildcard" or "remote" or "tunnelto" => HostingMode.RemoteWildcard,
case "--region": region = Next(); break; "lan" or "local" or "wifi" => HostingMode.LocalNetwork,
case "--mode": mode = Next(); break; _ => throw new ArgumentException($"unknown --mode '{mode}' (try localtunnel, wildcard, lan)"),
case "--apex": apex = Next(); break; };
case "--name": name = Next(); break;
case "--version": versionKey = Next(); break; return new ParsedArgs(photon, voice, region, parsedMode, apex, name, versionKey, serverDir);
case "--server-dir": serverDir = Next(); break;
default:
Console.Error.WriteLine($"error: unknown arg '{args[i]}' (try --help)");
return null;
}
} }
catch (ArgumentException ex)
HostingMode parsedMode = mode.ToLowerInvariant() switch
{ {
"localtunnel" or "lt" or "internet" or "tunnel" => HostingMode.SingleOriginTunnel, Console.Error.WriteLine($"error: {ex.Message} (try --help)");
"wildcard" or "remote" or "tunnelto" => HostingMode.RemoteWildcard, return null;
"lan" or "local" or "wifi" => HostingMode.LocalNetwork, }
_ => throw new ArgumentException($"unknown --mode '{mode}' (try localtunnel, wildcard, lan)"),
};
return new ParsedArgs(photon, voice, region, parsedMode, apex, name, versionKey, serverDir);
} }
private static void PrintHelp() private static void PrintHelp()
+19
View File
@@ -10,6 +10,25 @@ modified game files anywhere.
DorkNet's authors don't ship Rec Room IP and don't help users obtain it. DorkNet's authors don't ship Rec Room IP and don't help users obtain it.
See [DISCLAIMER.md](../DISCLAIMER.md) for the full position. See [DISCLAIMER.md](../DISCLAIMER.md) for the full position.
### Do I need to disable my antivirus?
No, and you shouldn't have to. A lot of closed-source private-server tools
ask you to turn your antivirus off or add exclusions before running them.
That's usually because they ship obfuscated or packed binaries — code
that's been deliberately scrambled so you can't see what it does, which
also happens to trip antivirus heuristics. You're being asked to lower
your guard for something you can't inspect.
DorkNet is the opposite. Everything is open source and nothing is
obfuscated — the server, the launcher, and the patcher are all right here
in the repo for anyone to read, and you can build them yourself instead of
trusting our prebuilt releases. There's nothing hidden for a scanner to
choke on, so there's no reason to weaken your protection to run it.
If a release binary ever does get flagged, that's a false positive on an
unsigned indie executable, not malware — and you always have the option to
build from source and verify it yourself.
### Will Rec Room Inc. shut this down? ### Will Rec Room Inc. shut this down?
Possibly. Fan-server projects exist in a grey zone. AGPL doesn't shield Possibly. Fan-server projects exist in a grey zone. AGPL doesn't shield