This repository has been archived on 2026-03-19. You can view files and clone it, but cannot push or open issues or pull requests.
Files
galvanic-corrosion/src/data/live/base.ts
zombieb 27b3754330 Rooms and matchmaking
* 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
2025-04-02 00:27:10 -04:00

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;