/* Galvanic Corrosion - Rec Room custom server for communities. 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 . */ import { Profile } from "../profiles.ts"; import Instances from "./instances.ts"; import { MatchmakingErrorCode, RoomInstance } from "./types.ts"; const loginLocks: Map = 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;