* Added missing config (route) data * Fetch room class, database hash * Basic room querying * Built-in room generation during first runtime * Matchmaking response base and notes for myself, later today * Instance fixes * Challenge and quick play routes (unused for now) * Rooms route (untested) * Matchmaking goto route * Avatar route addition * Settings/set route
84 lines
2.6 KiB
TypeScript
84 lines
2.6 KiB
TypeScript
/* Galvanic Corrosion - Rec Room custom server for communities.
|
|
<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
|
|
it under the terms of the GNU Affero General Public License as published
|
|
by the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Affero General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
|
|
|
import { Profile } from "../profiles.ts";
|
|
import Instances from "./instances.ts";
|
|
import { MatchmakingErrorCode, RoomInstance } from "./types.ts";
|
|
|
|
const loginLocks: Map<number, string> = new Map();
|
|
|
|
interface MatchmakingOptions {
|
|
roomName: string,
|
|
subRoomName?: string,
|
|
private?: boolean,
|
|
instanceId?: string,
|
|
profile: Profile
|
|
}
|
|
|
|
interface MatchmakingResponse {
|
|
errorCode: MatchmakingErrorCode,
|
|
roomInstance?: RoomInstance
|
|
}
|
|
|
|
class MatchmakingBase {
|
|
|
|
createLoginLock(prof: Profile, lock: string) {
|
|
if (loginLocks.has(prof.getId())) return;
|
|
else loginLocks.set(prof.getId(), lock);
|
|
}
|
|
|
|
lockMatches(prof: Profile, lock: string) {
|
|
const checkLock = loginLocks.get(prof.getId());
|
|
if (checkLock) return checkLock == lock;
|
|
else return null;
|
|
}
|
|
|
|
deleteLoginLock(prof: Profile) {
|
|
loginLocks.delete(prof.getId());
|
|
}
|
|
|
|
matchmake(options: MatchmakingOptions) {
|
|
|
|
if (options.instanceId) {
|
|
|
|
// get instance
|
|
// if instance exists, check private
|
|
|
|
}
|
|
/*
|
|
if roomname is dormroom, create the profile's dormroom if it does not exist
|
|
set the target room to the profile's dormroom id
|
|
|
|
get all public instances for roomname
|
|
filter out private and full instances
|
|
if a subroomname was specified, filter out subrooms that are not that subroom
|
|
|
|
pick an instance of the given instances at random
|
|
if none exist, create one
|
|
use only matchmakeable subrooms
|
|
if none are matchmakeable, go to "Home"
|
|
if "Home" does not exist, go to the first index
|
|
|
|
go to that instance
|
|
*/
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const Matchmaking = new MatchmakingBase();
|
|
export default Matchmaking; |