mirror of
https://github.com/Dingo-Shenanigans/ReSkate.git
synced 2026-10-18 11:05:15 +02:00
Server browser - Official servers (the backend's "official_servers") sort first and are drawn in ReSkate blue - Servers Steam friends are skating in sort next, drawn in green with the friends' names; searching a friend's name finds their server - A player in a session they joined can join another server straight from the list; hosts still end their session first, and a Steam friend's join offer never replaces a session - Joining a dedicated server from the list records it as the player's public session, so friends see it and the row shows HERE - Blocked servers (the backend's "blocked_servers") are hidden and cannot be joined, by code either - When the backend sets "server_tokens_required", dedicated servers that signed in without a login token are hidden, except on the player's own network - A search that gets no internet list from Steam keeps the last list for two minutes, and waits six seconds before treating it as empty Roles - New Staff tag from the backend's "staff" list: green name, badge and item animation, ranked after Dev - Staff can pick a rainbow for their items on the Special page; it is sent as a solid colour older builds can show, so the protocol is unchanged Dedicated server - steam_token: sign in with a Steam game server login token and keep the same Steam ID every start; empty signs in anonymously as before - A listed server without a token says so at startup, and when the token rule starts or stops hiding it - Linux servers update themselves from the release's "server_linux" tarball, with the machine's curl and tar, pinned by SHA-256, and carry on in the same process Launcher - Only create the MiniDumpWriteDump API-set shim under Wine/Proton
60 lines
4.1 KiB
C++
60 lines
4.1 KiB
C++
#include "Extension/Multiplayer/Steam/steam_friend_join.h"
|
|
#include <iostream>
|
|
#include <stdexcept>
|
|
using namespace dingosdk;
|
|
using namespace dingosdk::multiplayer;
|
|
void check(bool value, const char* message) { if (!value) throw std::runtime_error(message); }
|
|
int main() {
|
|
try {
|
|
check(steam_join_target("+reskate_lobby 9001") == 9001, "ReSkate lobby target parses");
|
|
for (const auto* value : {"", "+connect_lobby 9001", "+reskate_lobby ", "+reskate_lobby 0",
|
|
"+reskate_lobby -1", "+reskate_lobby 9001 extra", "+reskate_lobby 9001\n",
|
|
"+reskate_lobby 18446744073709551616", "9001"})
|
|
check(!steam_join_target(value), "Unrelated or malformed Steam requests must be ignored");
|
|
MultiplayerModel model;
|
|
model.active = model.hosting = model.public_host = model.lobby_listed = model.local_ready = true;
|
|
model.public_lobby = 9001; model.invite = "private-session-secret";
|
|
const auto open = model;
|
|
check(steam_join_presence(model) == "+reskate_lobby 9001", "Public host advertises a lobby ID without its session code");
|
|
model.password_required = true;
|
|
check(steam_join_presence(model).empty(), "Password-protected sessions have no one-click join");
|
|
model = open; model.public_host = false;
|
|
check(steam_join_presence(model).empty(), "Private hosts are never advertised");
|
|
model = open; model.public_lobby = 0;
|
|
check(steam_join_presence(model).empty(), "Direct private codes cannot leak into presence");
|
|
model = open; model.players = model.capacity;
|
|
check(steam_join_presence(model).empty(), "Full sessions stop advertising");
|
|
model = open; model.local_ready = false;
|
|
check(steam_join_presence(model).empty(), "Loading sessions stop advertising");
|
|
model = open; model.lobby_listed = false;
|
|
check(steam_join_presence(model).empty(), "Closed listings stop advertising");
|
|
model = open; model.active = false;
|
|
check(steam_join_presence(model).empty(), "Ended sessions stop advertising");
|
|
model = open; model.hosting = model.public_host = model.lobby_listed = false; model.connected = true;
|
|
check(steam_join_presence(model) == "+reskate_lobby 9001", "Connected guests can advertise their verified public lobby");
|
|
model.connected = false;
|
|
check(steam_join_presence(model).empty(), "Guests cannot advertise before admission");
|
|
// Where a player skates, for friends' server lists: any public session, joinable or not.
|
|
check(steam_session_target("9001") == 9001, "A session id parses");
|
|
for (const auto* value : {"", "0", "-1", "9001 ", "+reskate_lobby 9001", "18446744073709551616", "lobby"})
|
|
check(!steam_session_target(value), "Malformed session values must be ignored");
|
|
model = open;
|
|
check(steam_session_presence(model) == "9001", "A public host tells friends its listing");
|
|
model.password_required = true; model.players = model.capacity; model.local_ready = false;
|
|
check(steam_session_presence(model) == "9001", "A full, protected or loading public session is still told");
|
|
model = open; model.public_host = false;
|
|
check(steam_session_presence(model).empty(), "A private host is never told");
|
|
model = open; model.public_lobby = 0;
|
|
check(steam_session_presence(model).empty(), "A session joined by a private code is never told");
|
|
model = open; model.lobby_listed = false;
|
|
check(steam_session_presence(model).empty(), "A closed listing is not told");
|
|
model = open; model.active = false;
|
|
check(steam_session_presence(model).empty(), "An ended session is not told");
|
|
model = open; model.hosting = model.public_host = model.lobby_listed = false;
|
|
check(steam_session_presence(model).empty(), "A guest is not told before admission");
|
|
model.connected = true;
|
|
check(steam_session_presence(model) == "9001", "A connected guest tells friends the server they are on");
|
|
std::cout << "Steam friend join checks passed.\n";
|
|
} catch (const std::exception& error) { std::cerr << error.what() << '\n'; return 1; }
|
|
}
|