/* 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 { 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";