summary refs log tree commit diff
path: root/src/database/entities/UserSettings.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/database/entities/UserSettings.ts')
-rw-r--r--src/database/entities/UserSettings.ts142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/database/entities/UserSettings.ts b/src/database/entities/UserSettings.ts
new file mode 100644

index 00000000..7ccb8e1e --- /dev/null +++ b/src/database/entities/UserSettings.ts
@@ -0,0 +1,142 @@ +/* + Spacebar: A FOSS re-implementation and extension of the Discord.com backend. + Copyright (C) 2023 Spacebar and Spacebar Contributors + + 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 { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; +import { BaseClassWithoutId } from "./BaseClass"; +import { CustomStatus, FriendSourceFlags, GuildFolder } from "@spacebar/schemas"; + +@Entity({ + name: "user_settings", +}) +export class UserSettings extends BaseClassWithoutId { + @PrimaryGeneratedColumn() + index: string; + + @Column({ nullable: true }) + afk_timeout: number = 3600; + + @Column({ nullable: true }) + allow_accessibility_detection: boolean = true; + + @Column({ nullable: true }) + animate_emoji: boolean = true; + + @Column({ nullable: true }) + animate_stickers: number = 0; + + @Column({ nullable: true }) + contact_sync_enabled: boolean = false; + + @Column({ nullable: true }) + convert_emoticons: boolean = false; + + @Column({ nullable: true, type: "jsonb" }) + custom_status: CustomStatus | null = null; + + @Column({ nullable: true }) + default_guilds_restricted: boolean = false; + + @Column({ nullable: true }) + detect_platform_accounts: boolean = false; + + @Column({ nullable: true }) + developer_mode: boolean = true; + + @Column({ nullable: true }) + disable_games_tab: boolean = true; + + @Column({ nullable: true }) + enable_tts_command: boolean = false; + + @Column({ nullable: true }) + explicit_content_filter: number = 0; + + @Column({ nullable: true }) + friend_discovery_flags: number = 0; + + @Column({ nullable: true, type: "jsonb" }) + friend_source_flags: FriendSourceFlags = { all: true }; + + @Column({ nullable: true }) + gateway_connected: boolean = false; + + @Column({ nullable: true }) + gif_auto_play: boolean = false; + + @Column({ nullable: true, type: "jsonb" }) + guild_folders: GuildFolder[] = []; // every top guild is displayed as a "folder" + + @Column({ nullable: true, type: "jsonb" }) + guild_positions: string[] = []; // guild ids ordered by position + + @Column({ nullable: true }) + inline_attachment_media: boolean = true; + + @Column({ nullable: true }) + inline_embed_media: boolean = true; + + @Column({ nullable: true }) + locale: string = "en-US"; // en_US + + @Column({ nullable: true }) + message_display_compact: boolean = false; + + @Column({ nullable: true }) + native_phone_integration_enabled: boolean = true; + + @Column({ nullable: true }) + render_embeds: boolean = true; + + @Column({ nullable: true }) + render_reactions: boolean = true; + + @Column({ nullable: true, type: "jsonb" }) + restricted_guilds: string[] = []; + + @Column({ nullable: true }) + show_current_game: boolean = true; + + @Column({ nullable: true }) + status: "online" | "offline" | "dnd" | "idle" | "invisible" = "online"; + + @Column({ nullable: true }) + stream_notifications_enabled: boolean = false; + + @Column({ nullable: true }) + theme: "dark" | "light" = "dark"; // dark + + @Column({ nullable: true }) + timezone_offset: number = 0; // e.g -60 + + @Column({ nullable: true }) + view_nsfw_guilds: boolean = true; + + public static async getOrDefault(userId: string) { + // raw sql query + const userSettingsIndex = (await this.getRepository().query('SELECT "settingsIndex" FROM users WHERE id = $1', [userId]))[0]?.settingsIndex as string | null; + + console.log(`[INFO/UserSettings] Fetched settings index for user ${userId}:`, userSettingsIndex); + + if (!userSettingsIndex) return new UserSettings(); + + const settings = await UserSettings.findOne({ where: { index: userSettingsIndex } }); + if (!settings) return new UserSettings(); + + return settings; + } +}