Still figuring out initial matchmaking hang (FROSTBITE). Lots of other changes.

- Added missing room images
- Removed internal rooms and disallow cloning some rooms
- License fixes
- Switched target to 20200306
- Socket header fixes
- Sockets are closed upon shutdown
    * Sockets persist after being destroyed, fix
- Config changes for 20200306
- Settings initialized
- Name generation words cannot be longer than 9 characters
- Dorm generation changes and fixes
- Added some settings keys
- Matchmaking additions
    * Instances are not yet updated to be or not to be in-progress
- Instance fixes and logging
- Image operation fixes
- DisplayName route start
- Challenge route start
- Default Amplitude key (i can see althe Amplitude requests are ignored
- Rate limiting ease
- GameConfigs properly queried and sent
- Many 'bulk' endpoints were added in or around 20200306
- Objective routes started
- DormRoom redirection in v2/name
- Client doesn't care if it gets 200 when setting prefs
- Balance/storefronts started
- Matchmaking goto/room timer and fixes
- Selfhosted Photon addition on the client sends matchmaking /photonregionpings, ignore since Photon is only one server in one region
This commit is contained in:
2025-04-13 01:06:23 -04:00
parent 1cfd0426dd
commit 3b6d905180
89 changed files with 990 additions and 421 deletions

View File

@@ -1,5 +1,5 @@
/* Galvanic Corrosion - Rec Room custom server for communities.
<https://gitea.proxnet.dev/zombieb-galvanic-corrosion>
<https://gitea.proxnet.dev/zombieb/galvanic-corrosion>
Copyright (C) 2025 @zombieb (Discord / proxnet Gitea)
This program is free software: you can redistribute it and/or modify
@@ -131,11 +131,11 @@ export function genericResponse(
};
}
type RecNetResponse = {
Success: boolean;
Message: string;
success: boolean;
error?: string;
};
export function RecNetResponse(success: boolean, message: string) {
const msg: RecNetResponse = { Success: success, Message: message };
export function RecNetResponse(success: boolean, message?: string) {
const msg: RecNetResponse = { success: success, error: message };
return (_rq: express.Request, rs: express.Response) => {
rs.json(msg);
};
@@ -190,7 +190,7 @@ export class RateLimiter {
* @param interval In seconds: rate at which hit counts will be cleared
* @param limit Number of hits (inclusive) before requests are blocked
*/
constructor(interval: number, limit: number) {
constructor(interval: number = 20, limit: number = 2) {
this.#hitLimit = limit;
this.#intervalId = setInterval(() => {
@@ -224,6 +224,11 @@ export class RateLimiter {
nxt: express.NextFunction,
) => {
const address = getSrcIpDefault(rq);
if (address == '127.0.0.1' || address == '::1') {
nxt();
return;
}
this.#addressIncrement(address);
const hits = this.#getAddressHits(address);
@@ -339,7 +344,7 @@ export function AuthenticationType(type: AuthType) {
}
export function LoginLock(rq: express.Request<NoBody, NoBody, { LoginLock: string }>, rs: express.Response, nxt: express.NextFunction) {
log.d(`LoginLock for ${rs.locals.profile.getId()}: ${rq.body.LoginLock}`);
//log.d(`LoginLock for ${rs.locals.profile.getId()}: ${rq.body.LoginLock}`);
const matches = Matchmaking.lockMatches(rs.locals.profile, rq.body.LoginLock);
if (matches == null) {
rs.json(genericResponseFormat(true, "Login Lock failure"));