All checks were successful
Galvanic Corrosion Cross-Compile / build (push) Successful in 1m57s
* Steam authentication * Profile events * Objective fixes for some rooms (reccenter, goldentrophy, etc) * Profile meta (displayname) somewhat works * Player socket subscriptions
125 lines
3.6 KiB
TypeScript
125 lines
3.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 { Redis } from "ioredis";
|
|
import * as Config from "./config.ts";
|
|
import Logging from "@proxnet/undead-logging";
|
|
import chalk from "npm:chalk@^5.3.0";
|
|
|
|
const log = new Logging("Redis");
|
|
|
|
const config = Config.getConfig();
|
|
if (typeof config == "undefined") {
|
|
log.e(`Cannot start: Redis configuration failed`);
|
|
Deno.exit(1);
|
|
}
|
|
|
|
let shuttingDown = false;
|
|
Deno.addSignalListener("SIGINT", () => {
|
|
if (shuttingDown) return;
|
|
shuttingDown = true;
|
|
log.n("Disconnecting from Redis");
|
|
Database.quit();
|
|
});
|
|
|
|
export const Database = new Redis({
|
|
port: config.redis.port,
|
|
host: config.redis.host,
|
|
username: config.redis.username == "" ? undefined : config.redis.username,
|
|
password: config.redis.password == "" ? undefined : config.redis.password,
|
|
db: config.redis.db,
|
|
lazyConnect: true,
|
|
});
|
|
Database.on("connect", async () => {
|
|
log.i(`Connected to Redis`);
|
|
|
|
if (Deno.args.includes("--db-flush")) {
|
|
await Database.flushall(() => {
|
|
log.w(`${chalk.inverse("The database was flushed.")}`);
|
|
});
|
|
}
|
|
});
|
|
Database.on("connecting", () => {
|
|
log.n("Connecting to Redis..");
|
|
});
|
|
Database.on("error", (err) => {
|
|
log.e(`Redis error: ${err.stack}`);
|
|
});
|
|
|
|
export function buildKey(...args: string[]) {
|
|
return args.join(":");
|
|
}
|
|
export const KeyGroups = {
|
|
Config: {
|
|
Root: "config",
|
|
Dynamic: "dynamic",
|
|
Game: "game",
|
|
},
|
|
Content: {
|
|
Root: "content",
|
|
Files: "file-meta",
|
|
},
|
|
Profile_Usernames: "profile-usernames",
|
|
PlatformAssociations: "platforms",
|
|
AddressBans: "address-bans",
|
|
Profiles: {
|
|
Root: "profiles",
|
|
Username: "username",
|
|
ProfileImage: "profileImage",
|
|
Junior: "isJunior",
|
|
Platforms: "platforms",
|
|
DisplayName: "displayName",
|
|
Settings: "settings",
|
|
DeviceClass: "deviceClass",
|
|
Xp: "xp",
|
|
Bio: "bio",
|
|
Rooms: "rooms",
|
|
Relationships: {
|
|
Root: "relationships",
|
|
IncomingFriendRequests: "incomingFriendRequests",
|
|
OutgoingFriendRequests: "outgoingFriendRequests",
|
|
Friends: "friends",
|
|
Ignoring: "ignore",
|
|
Muted: "muted",
|
|
Favorites: "favorites"
|
|
},
|
|
Avatar: {
|
|
Root: "avatar",
|
|
Outfit: "outfit",
|
|
Hair: "hair",
|
|
Skin: "skin",
|
|
Face: "face"
|
|
}
|
|
},
|
|
Room_Names: "room-names",
|
|
Rooms: {
|
|
Root: "room",
|
|
PlayerDorms: "player-dormids"
|
|
},
|
|
Operators: "operators",
|
|
Users: {
|
|
Root: "users",
|
|
Profiles: "profiles",
|
|
Pubkey: "pubkey",
|
|
Nonces: "nonces",
|
|
AssociatedPlatforms: "associatedPlatforms",
|
|
AssociatedDeviceIds: "associatedDeviceIds",
|
|
AssociatedIps: "associatedIps",
|
|
},
|
|
};
|
|
export * as Redis from "./db.ts";
|