diff --git a/util/src/dtos/DmChannelDTO.ts b/src/util/dtos/DmChannelDTO.ts
index 226b2f9d..226b2f9d 100644
--- a/util/src/dtos/DmChannelDTO.ts
+++ b/src/util/dtos/DmChannelDTO.ts
diff --git a/util/src/dtos/UserDTO.ts b/src/util/dtos/UserDTO.ts
index ee2752a4..ee2752a4 100644
--- a/util/src/dtos/UserDTO.ts
+++ b/src/util/dtos/UserDTO.ts
diff --git a/util/src/dtos/index.ts b/src/util/dtos/index.ts
index 0e8f8459..0e8f8459 100644
--- a/util/src/dtos/index.ts
+++ b/src/util/dtos/index.ts
diff --git a/util/src/entities/Application.ts b/src/util/entities/Application.ts
index 103f8e84..103f8e84 100644
--- a/util/src/entities/Application.ts
+++ b/src/util/entities/Application.ts
diff --git a/util/src/entities/Attachment.ts b/src/util/entities/Attachment.ts
index 7b4b17eb..7b4b17eb 100644
--- a/util/src/entities/Attachment.ts
+++ b/src/util/entities/Attachment.ts
diff --git a/util/src/entities/AuditLog.ts b/src/util/entities/AuditLog.ts
index b003e7ba..b003e7ba 100644
--- a/util/src/entities/AuditLog.ts
+++ b/src/util/entities/AuditLog.ts
diff --git a/util/src/entities/BackupCodes.ts b/src/util/entities/BackupCodes.ts
index 9092c14e..9092c14e 100644
--- a/util/src/entities/BackupCodes.ts
+++ b/src/util/entities/BackupCodes.ts
diff --git a/util/src/entities/Ban.ts b/src/util/entities/Ban.ts
index 9504bd8e..9504bd8e 100644
--- a/util/src/entities/Ban.ts
+++ b/src/util/entities/Ban.ts
diff --git a/util/src/entities/BaseClass.ts b/src/util/entities/BaseClass.ts
index c872e7f1..aecc2465 100644
--- a/util/src/entities/BaseClass.ts
+++ b/src/util/entities/BaseClass.ts
@@ -1,5 +1,5 @@
import "reflect-metadata";
-import { BaseEntity, EntityMetadata, ObjectIdColumn, PrimaryColumn, FindOptionsWhere, Generated, SaveOptions } from "typeorm";
+import { BaseEntity, ObjectIdColumn, PrimaryColumn, SaveOptions } from "typeorm";
import { Snowflake } from "../util/Snowflake";
export class BaseClassWithoutId extends BaseEntity {
diff --git a/util/src/entities/Categories.ts b/src/util/entities/Categories.ts
index 81fbc303..81fbc303 100644
--- a/util/src/entities/Categories.ts
+++ b/src/util/entities/Categories.ts
diff --git a/util/src/entities/Channel.ts b/src/util/entities/Channel.ts
index ade0fb39..a576d7af 100644
--- a/util/src/entities/Channel.ts
+++ b/src/util/entities/Channel.ts
@@ -151,6 +151,13 @@ export class Channel extends BaseClass {
})
webhooks?: Webhook[];
+ @Column({ nullable: true })
+ flags?: number = 0;
+
+ @Column({ nullable: true })
+ default_thread_rate_limit_per_user?: number = 0;
+
+
// TODO: DM channel
static async createChannel(
channel: Partial<Channel>,
diff --git a/util/src/entities/ClientRelease.ts b/src/util/entities/ClientRelease.ts
index c5afd307..c5afd307 100644
--- a/util/src/entities/ClientRelease.ts
+++ b/src/util/entities/ClientRelease.ts
diff --git a/util/src/entities/ConnectedAccount.ts b/src/util/entities/ConnectedAccount.ts
index 09ae30ab..09ae30ab 100644
--- a/util/src/entities/ConnectedAccount.ts
+++ b/src/util/entities/ConnectedAccount.ts
diff --git a/util/src/entities/Emoji.ts b/src/util/entities/Emoji.ts
index a3615b7d..a3615b7d 100644
--- a/util/src/entities/Emoji.ts
+++ b/src/util/entities/Emoji.ts
diff --git a/util/src/entities/Encryption.ts b/src/util/entities/Encryption.ts
index 6b578d15..6b578d15 100644
--- a/util/src/entities/Encryption.ts
+++ b/src/util/entities/Encryption.ts
diff --git a/util/src/entities/Group.ts b/src/util/entities/Group.ts
index b24d38cf..b24d38cf 100644
--- a/util/src/entities/Group.ts
+++ b/src/util/entities/Group.ts
diff --git a/util/src/entities/Guild.ts b/src/util/entities/Guild.ts
index 77a04350..d146e577 100644
--- a/util/src/entities/Guild.ts
+++ b/src/util/entities/Guild.ts
@@ -53,7 +53,7 @@ export class Guild extends BaseClass {
afk_channel?: Channel;
@Column({ nullable: true })
- afk_timeout?: number;
+ afk_timeout?: number = Config.get().defaults.guild.afkTimeout;
// * commented out -> use owner instead
// application id of the guild creator if it is bot-created
@@ -71,7 +71,7 @@ export class Guild extends BaseClass {
banner?: string;
@Column({ nullable: true })
- default_message_notifications?: number;
+ default_message_notifications?: number = Config.get().defaults.guild.defaultMessageNotifications;
@Column({ nullable: true })
description?: string;
@@ -80,7 +80,7 @@ export class Guild extends BaseClass {
discovery_splash?: string;
@Column({ nullable: true })
- explicit_content_filter?: number;
+ explicit_content_filter?: number = Config.get().defaults.guild.explicitContentFilter;
@Column({ type: "simple-array" })
features: string[]; //TODO use enum
@@ -96,19 +96,19 @@ export class Guild extends BaseClass {
large?: boolean;
@Column({ nullable: true })
- max_members?: number; // e.g. default 100.000
+ max_members?: number = Config.get().limits.guild.maxMembers; // e.g. default 100.000
@Column({ nullable: true })
- max_presences?: number;
+ max_presences?: number = Config.get().defaults.guild.maxPresences;
@Column({ nullable: true })
- max_video_channel_users?: number; // ? default: 25, is this max 25 streaming or watching
+ max_video_channel_users?: number = Config.get().defaults.guild.maxVideoChannelUsers; // ? default: 25, is this max 25 streaming or watching
@Column({ nullable: true })
- member_count?: number;
+ member_count?: number = 0;
@Column({ nullable: true })
- presence_count?: number; // users online
+ presence_count?: number = 0; // users online
@OneToMany(() => Member, (member: Member) => member.guild, {
cascade: true,
@@ -278,6 +278,10 @@ export class Guild extends BaseClass {
// only for developer portal
permissions?: number;
+ //new guild settings, 11/08/2022:
+ @Column({ nullable: true })
+ premium_progress_bar_enabled: boolean = false;
+
static async createGuild(body: {
name?: string;
icon?: string | null;
diff --git a/util/src/entities/Invite.ts b/src/util/entities/Invite.ts
index 1e0ebe52..1e0ebe52 100644
--- a/util/src/entities/Invite.ts
+++ b/src/util/entities/Invite.ts
diff --git a/util/src/entities/Member.ts b/src/util/entities/Member.ts
index baac58ed..baac58ed 100644
--- a/util/src/entities/Member.ts
+++ b/src/util/entities/Member.ts
diff --git a/util/src/entities/Message.ts b/src/util/entities/Message.ts
index ba3d4f2d..ba3d4f2d 100644
--- a/util/src/entities/Message.ts
+++ b/src/util/entities/Message.ts
diff --git a/util/src/entities/Migration.ts b/src/util/entities/Migration.ts
index 3f39ae72..3f39ae72 100644
--- a/util/src/entities/Migration.ts
+++ b/src/util/entities/Migration.ts
diff --git a/util/src/entities/Note.ts b/src/util/entities/Note.ts
index 36017c5e..36017c5e 100644
--- a/util/src/entities/Note.ts
+++ b/src/util/entities/Note.ts
diff --git a/util/src/entities/RateLimit.ts b/src/util/entities/RateLimit.ts
index f5916f6b..f5916f6b 100644
--- a/util/src/entities/RateLimit.ts
+++ b/src/util/entities/RateLimit.ts
diff --git a/util/src/entities/ReadState.ts b/src/util/entities/ReadState.ts
index b915573b..b915573b 100644
--- a/util/src/entities/ReadState.ts
+++ b/src/util/entities/ReadState.ts
diff --git a/util/src/entities/Recipient.ts b/src/util/entities/Recipient.ts
index a945f938..a945f938 100644
--- a/util/src/entities/Recipient.ts
+++ b/src/util/entities/Recipient.ts
diff --git a/util/src/entities/Relationship.ts b/src/util/entities/Relationship.ts
index c3592c76..c3592c76 100644
--- a/util/src/entities/Relationship.ts
+++ b/src/util/entities/Relationship.ts
diff --git a/util/src/entities/Role.ts b/src/util/entities/Role.ts
index 4b721b5b..4b721b5b 100644
--- a/util/src/entities/Role.ts
+++ b/src/util/entities/Role.ts
diff --git a/util/src/entities/Session.ts b/src/util/entities/Session.ts
index 969efa89..969efa89 100644
--- a/util/src/entities/Session.ts
+++ b/src/util/entities/Session.ts
diff --git a/util/src/entities/Sticker.ts b/src/util/entities/Sticker.ts
index 37bc6fbe..37bc6fbe 100644
--- a/util/src/entities/Sticker.ts
+++ b/src/util/entities/Sticker.ts
diff --git a/util/src/entities/StickerPack.ts b/src/util/entities/StickerPack.ts
index ec8c69a2..ec8c69a2 100644
--- a/util/src/entities/StickerPack.ts
+++ b/src/util/entities/StickerPack.ts
diff --git a/util/src/entities/Team.ts b/src/util/entities/Team.ts
index 22140b7f..22140b7f 100644
--- a/util/src/entities/Team.ts
+++ b/src/util/entities/Team.ts
diff --git a/util/src/entities/TeamMember.ts b/src/util/entities/TeamMember.ts
index b726e1e8..b726e1e8 100644
--- a/util/src/entities/TeamMember.ts
+++ b/src/util/entities/TeamMember.ts
diff --git a/util/src/entities/Template.ts b/src/util/entities/Template.ts
index 1d952283..1d952283 100644
--- a/util/src/entities/Template.ts
+++ b/src/util/entities/Template.ts
diff --git a/util/src/entities/User.ts b/src/util/entities/User.ts
index a9f00b0d..5432f298 100644
--- a/util/src/entities/User.ts
+++ b/src/util/entities/User.ts
@@ -1,11 +1,11 @@
-import { Column, Entity, FindOneOptions, FindOptionsSelectByString, JoinColumn, OneToMany } from "typeorm";
+import { Column, Entity, FindOneOptions, FindOptionsSelectByString, JoinColumn, OneToMany, OneToOne } from "typeorm";
import { OrmUtils } from "../util/imports/OrmUtils";
import { BaseClass } from "./BaseClass";
import { BitField } from "../util/BitField";
import { Relationship } from "./Relationship";
import { ConnectedAccount } from "./ConnectedAccount";
import { Config, FieldErrors, Snowflake, trimSpecial } from "..";
-import { Member, Session } from ".";
+import { Member, Session, UserSettings } from ".";
export enum PublicUserEnum {
username,
@@ -83,30 +83,30 @@ export class User extends BaseClass {
phone?: string; // phone number of the user
@Column({ select: false })
- desktop: boolean; // if the user has desktop app installed
+ desktop: boolean = false; // if the user has desktop app installed
@Column({ select: false })
- mobile: boolean; // if the user has mobile app installed
+ mobile: boolean = false; // if the user has mobile app installed
@Column()
- premium: boolean; // if user bought individual premium
+ premium: boolean = Config.get().defaults.user.premium; // if user bought individual premium
@Column()
- premium_type: number; // individual premium level
+ premium_type: number = Config.get().defaults.user.premium_type; // individual premium level
@Column()
- bot: boolean; // if user is bot
+ bot: boolean = false; // if user is bot
- @Column()
+ @Column({ nullable: true })
bio: string; // short description of the user (max 190 chars -> should be configurable)
@Column()
- system: boolean; // shouldn't be used, the api sends this field type true, if the generated message comes from a system generated author
+ system: boolean = false; // shouldn't be used, the api sends this field type true, if the generated message comes from a system generated author
@Column({ select: false })
- nsfw_allowed: boolean; // if the user can do age-restricted actions (NSFW channels/guilds/commands)
+ nsfw_allowed: boolean = true; // if the user can do age-restricted actions (NSFW channels/guilds/commands) // TODO: depending on age
- @Column({ select: false })
+ @Column({ select: false, nullable: true })
mfa_enabled: boolean; // if multi factor authentication is enabled
@Column({ select: false, nullable: true })
@@ -116,31 +116,31 @@ export class User extends BaseClass {
totp_last_ticket?: string;
@Column()
- created_at: Date; // registration date
+ created_at: Date = new Date(); // registration date
@Column({ nullable: true })
- premium_since: Date; // premium date
+ premium_since: Date = new Date(); // premium date
@Column({ select: false })
- verified: boolean; // if the user is offically verified
+ verified: boolean = Config.get().defaults.user.verified; // if the user is offically verified
@Column()
- disabled: boolean; // if the account is disabled
+ disabled: boolean = false; // if the account is disabled
@Column()
- deleted: boolean; // if the user was deleted
+ deleted: boolean = false; // if the user was deleted
@Column({ nullable: true, select: false })
email?: string; // email of the user
@Column()
- flags: string; // UserFlags
+ flags: string = "0"; // UserFlags // TODO: generate
@Column()
- public_flags: number;
+ public_flags: number = 0;
@Column({ type: "bigint" })
- rights: string; // Rights
+ rights: string = Config.get().register.defaultRights; // Rights
@OneToMany(() => Session, (session: Session) => session.user)
sessions: Session[];
@@ -166,17 +166,30 @@ export class User extends BaseClass {
};
@Column({ type: "simple-array", select: false })
- fingerprints: string[]; // array of fingerprints -> used to prevent multiple accounts
+ fingerprints: string[] = []; // array of fingerprints -> used to prevent multiple accounts
- @Column({ type: "simple-json", select: false })
+
+ @OneToOne(()=> UserSettings, {
+ cascade: true,
+ orphanedRowAction: "delete",
+ eager: false
+ })
+ @JoinColumn()
settings: UserSettings;
// workaround to prevent fossord-unaware clients from deleting settings not used by them
@Column({ type: "simple-json", select: false })
- extended_settings: string;
+ extended_settings: string = "{}";
@Column({ type: "simple-json" })
- notes: { [key: string]: string }; //key is ID of user
+ notes: { [key: string]: string } = {}; //key is ID of user
+
+ async save(): Promise<any> {
+ if(!this.settings) this.settings = new UserSettings();
+ this.settings.id = this.id;
+ //await this.settings.save();
+ return super.save();
+ }
toPublicUser() {
const user: any = {};
@@ -256,39 +269,19 @@ export class User extends BaseClass {
const language = req?.language === "en" ? "en-US" : req?.language || "en-US";
const user = OrmUtils.mergeDeep(new User(), {
- created_at: new Date(),
+ //required:
username: username,
discriminator,
id: Snowflake.generate(),
- bot: false,
- system: false,
- premium_since: new Date(),
- desktop: false,
- mobile: false,
- premium: true,
- premium_type: 2,
- bio: "",
- mfa_enabled: false,
- totp_secret: "",
- totp_backup_codes: [],
- verified: true,
- disabled: false,
- deleted: false,
email: email,
- rights: Config.get().register.defaultRights, // TODO: grant rights correctly, as 0 actually stands for no rights at all
- nsfw_allowed: true, // TODO: depending on age
- public_flags: "0",
- flags: "0", // TODO: generate
data: {
hash: password,
valid_tokens_since: new Date(),
},
- settings: { ...defaultSettings, locale: language },
- extended_settings: {},
- fingerprints: [],
- notes: {},
+ settings: { ...new UserSettings(), locale: language }
});
+ //await (user.settings as UserSettings).save();
await user.save();
setImmediate(async () => {
@@ -303,85 +296,6 @@ export class User extends BaseClass {
}
}
-export const defaultSettings: UserSettings = {
- afk_timeout: 3600,
- allow_accessibility_detection: true,
- animate_emoji: true,
- animate_stickers: 0,
- contact_sync_enabled: false,
- convert_emoticons: false,
- custom_status: null,
- default_guilds_restricted: false,
- detect_platform_accounts: false,
- developer_mode: true,
- disable_games_tab: true,
- enable_tts_command: false,
- explicit_content_filter: 0,
- friend_source_flags: { all: true },
- gateway_connected: false,
- gif_auto_play: true,
- guild_folders: [],
- guild_positions: [],
- inline_attachment_media: true,
- inline_embed_media: true,
- locale: "en-US",
- message_display_compact: false,
- native_phone_integration_enabled: true,
- render_embeds: true,
- render_reactions: true,
- restricted_guilds: [],
- show_current_game: true,
- status: "online",
- stream_notifications_enabled: false,
- theme: "dark",
- timezone_offset: 0, // TODO: timezone from request
-};
-
-export interface UserSettings {
- afk_timeout: number;
- allow_accessibility_detection: boolean;
- animate_emoji: boolean;
- animate_stickers: number;
- contact_sync_enabled: boolean;
- convert_emoticons: boolean;
- custom_status: {
- emoji_id?: string;
- emoji_name?: string;
- expires_at?: number;
- text?: string;
- } | null;
- default_guilds_restricted: boolean;
- detect_platform_accounts: boolean;
- developer_mode: boolean;
- disable_games_tab: boolean;
- enable_tts_command: boolean;
- explicit_content_filter: number;
- friend_source_flags: { all: boolean };
- gateway_connected: boolean;
- gif_auto_play: boolean;
- // every top guild is displayed as a "folder"
- guild_folders: {
- color: number;
- guild_ids: string[];
- id: number;
- name: string;
- }[];
- guild_positions: string[]; // guild ids ordered by position
- inline_attachment_media: boolean;
- inline_embed_media: boolean;
- locale: string; // en_US
- message_display_compact: boolean;
- native_phone_integration_enabled: boolean;
- render_embeds: boolean;
- render_reactions: boolean;
- restricted_guilds: string[];
- show_current_game: boolean;
- status: "online" | "offline" | "dnd" | "idle" | "invisible";
- stream_notifications_enabled: boolean;
- theme: "dark" | "white"; // dark
- timezone_offset: number; // e.g -60
-}
-
export const CUSTOM_USER_FLAG_OFFSET = BigInt(1) << BigInt(32);
export class UserFlags extends BitField {
diff --git a/util/src/entities/UserGroup.ts b/src/util/entities/UserGroup.ts
index 709b9d0b..709b9d0b 100644
--- a/util/src/entities/UserGroup.ts
+++ b/src/util/entities/UserGroup.ts
diff --git a/util/src/entities/VoiceState.ts b/src/util/entities/VoiceState.ts
index 75748a01..75748a01 100644
--- a/util/src/entities/VoiceState.ts
+++ b/src/util/entities/VoiceState.ts
diff --git a/util/src/entities/Webhook.ts b/src/util/entities/Webhook.ts
index 89538417..89538417 100644
--- a/util/src/entities/Webhook.ts
+++ b/src/util/entities/Webhook.ts
diff --git a/util/src/entities/index.ts b/src/util/entities/index.ts
index c439a4b7..c6f12022 100644
--- a/util/src/entities/index.ts
+++ b/src/util/entities/index.ts
@@ -30,3 +30,4 @@ export * from "./Webhook";
export * from "./ClientRelease";
export * from "./BackupCodes";
export * from "./Note";
+export * from "./UserSettings";
diff --git a/util/src/index.ts b/src/util/index.ts
index 259d1c97..d944dc49 100644
--- a/util/src/index.ts
+++ b/src/util/index.ts
@@ -1,7 +1,9 @@
import "reflect-metadata";
export * from "./util/index";
+export * from "./config/index";
export * from "./interfaces/index";
export * from "./entities/index";
export * from "./dtos/index";
-export * from "./util/MFA";
\ No newline at end of file
+export * from "./util/MFA";
+export * from "./schemas";
\ No newline at end of file
diff --git a/util/src/interfaces/Activity.ts b/src/util/interfaces/Activity.ts
index 43984afd..43984afd 100644
--- a/util/src/interfaces/Activity.ts
+++ b/src/util/interfaces/Activity.ts
diff --git a/util/src/interfaces/Event.ts b/src/util/interfaces/Event.ts
index f3391c4f..be66c62f 100644
--- a/util/src/interfaces/Event.ts
+++ b/src/util/interfaces/Event.ts
@@ -1,4 +1,4 @@
-import { PublicUser, User, UserSettings } from "../entities/User";
+import { PublicUser, User } from "../entities/User";
import { Channel } from "../entities/Channel";
import { Guild } from "../entities/Guild";
import { Member, PublicMember, UserGuildSettings } from "../entities/Member";
@@ -12,7 +12,7 @@ import { Interaction } from "./Interaction";
import { ConnectedAccount } from "../entities/ConnectedAccount";
import { Relationship, RelationshipType } from "../entities/Relationship";
import { Presence } from "./Presence";
-import { Sticker } from "..";
+import { Sticker, UserSettings } from "..";
import { Activity, Status } from ".";
export interface Event {
diff --git a/util/src/interfaces/Interaction.ts b/src/util/interfaces/Interaction.ts
index 5d3aae24..5d3aae24 100644
--- a/util/src/interfaces/Interaction.ts
+++ b/src/util/interfaces/Interaction.ts
diff --git a/util/src/interfaces/Presence.ts b/src/util/interfaces/Presence.ts
index 7663891a..7663891a 100644
--- a/util/src/interfaces/Presence.ts
+++ b/src/util/interfaces/Presence.ts
diff --git a/util/src/interfaces/Status.ts b/src/util/interfaces/Status.ts
index 5d2e1bba..5d2e1bba 100644
--- a/util/src/interfaces/Status.ts
+++ b/src/util/interfaces/Status.ts
diff --git a/util/src/interfaces/index.ts b/src/util/interfaces/index.ts
index ab7fa429..ab7fa429 100644
--- a/util/src/interfaces/index.ts
+++ b/src/util/interfaces/index.ts
diff --git a/util/src/migrations/mariadb/1659901151025-initial.ts b/src/util/migrations/mariadb/1659901151025-initial.ts
index d15e0add..d15e0add 100644
--- a/util/src/migrations/mariadb/1659901151025-initial.ts
+++ b/src/util/migrations/mariadb/1659901151025-initial.ts
diff --git a/util/src/migrations/mariadb/1659921859145-premium_since_as_date.ts b/src/util/migrations/mariadb/1659921859145-premium_since_as_date.ts
index de173cfe..de173cfe 100644
--- a/util/src/migrations/mariadb/1659921859145-premium_since_as_date.ts
+++ b/src/util/migrations/mariadb/1659921859145-premium_since_as_date.ts
diff --git a/util/src/migrations/mariadb/1660130586602-updated-applications.ts b/src/util/migrations/mariadb/1660130586602-updated-applications.ts
index ec574416..ec574416 100644
--- a/util/src/migrations/mariadb/1660130586602-updated-applications.ts
+++ b/src/util/migrations/mariadb/1660130586602-updated-applications.ts
diff --git a/util/src/migrations/mariadb/1660131942703-apps_nullable_team.ts b/src/util/migrations/mariadb/1660131942703-apps_nullable_team.ts
index ac445772..ac445772 100644
--- a/util/src/migrations/mariadb/1660131942703-apps_nullable_team.ts
+++ b/src/util/migrations/mariadb/1660131942703-apps_nullable_team.ts
diff --git a/util/src/migrations/postgres/1659899687168-initial.ts b/src/util/migrations/postgres/1659899687168-initial.ts
index 4ffb897d..4ffb897d 100644
--- a/util/src/migrations/postgres/1659899687168-initial.ts
+++ b/src/util/migrations/postgres/1659899687168-initial.ts
diff --git a/util/src/migrations/postgres/1659921826567-premium_since_as_date.ts b/src/util/migrations/postgres/1659921826567-premium_since_as_date.ts
index ac1e2edb..ac1e2edb 100644
--- a/util/src/migrations/postgres/1659921826567-premium_since_as_date.ts
+++ b/src/util/migrations/postgres/1659921826567-premium_since_as_date.ts
diff --git a/util/src/migrations/postgres/1660130561959-updated-applications.ts b/src/util/migrations/postgres/1660130561959-updated-applications.ts
index 8fab54c7..8fab54c7 100644
--- a/util/src/migrations/postgres/1660130561959-updated-applications.ts
+++ b/src/util/migrations/postgres/1660130561959-updated-applications.ts
diff --git a/util/src/migrations/postgres/1660416055566-InvitersAreDeletable.ts b/src/util/migrations/postgres/1660416055566-InvitersAreDeletable.ts
index e6101318..e6101318 100644
--- a/util/src/migrations/postgres/1660416055566-InvitersAreDeletable.ts
+++ b/src/util/migrations/postgres/1660416055566-InvitersAreDeletable.ts
diff --git a/util/src/migrations/sqlite/1659899662635-initial.ts b/src/util/migrations/sqlite/1659899662635-initial.ts
index f82e7b0d..f82e7b0d 100644
--- a/util/src/migrations/sqlite/1659899662635-initial.ts
+++ b/src/util/migrations/sqlite/1659899662635-initial.ts
diff --git a/util/src/migrations/sqlite/1659921722863-premium_since_as_date.ts b/src/util/migrations/sqlite/1659921722863-premium_since_as_date.ts
index 788be625..788be625 100644
--- a/util/src/migrations/sqlite/1659921722863-premium_since_as_date.ts
+++ b/src/util/migrations/sqlite/1659921722863-premium_since_as_date.ts
diff --git a/util/src/migrations/sqlite/1660130536131-updated-applications.ts b/src/util/migrations/sqlite/1660130536131-updated-applications.ts
index b8cbcc33..b8cbcc33 100644
--- a/util/src/migrations/sqlite/1660130536131-updated-applications.ts
+++ b/src/util/migrations/sqlite/1660130536131-updated-applications.ts
diff --git a/util/src/migrations/sqlite/1660416010862-InvitersAreDeletable.ts b/src/util/migrations/sqlite/1660416010862-InvitersAreDeletable.ts
index 9b29e119..9b29e119 100644
--- a/util/src/migrations/sqlite/1660416010862-InvitersAreDeletable.ts
+++ b/src/util/migrations/sqlite/1660416010862-InvitersAreDeletable.ts
diff --git a/util/src/util/ApiError.ts b/src/util/util/ApiError.ts
index f1a9b4f6..f1a9b4f6 100644
--- a/util/src/util/ApiError.ts
+++ b/src/util/util/ApiError.ts
diff --git a/util/src/util/Array.ts b/src/util/util/Array.ts
index 5a45d1b5..5a45d1b5 100644
--- a/util/src/util/Array.ts
+++ b/src/util/util/Array.ts
diff --git a/util/src/util/AutoUpdate.ts b/src/util/util/AutoUpdate.ts
index 7d020106..7d020106 100644
--- a/util/src/util/AutoUpdate.ts
+++ b/src/util/util/AutoUpdate.ts
diff --git a/util/src/util/BitField.ts b/src/util/util/BitField.ts
index 9bdbf6d7..9bdbf6d7 100644
--- a/util/src/util/BitField.ts
+++ b/src/util/util/BitField.ts
diff --git a/util/src/util/Categories.ts b/src/util/util/Categories.ts
index a3c69da7..a3c69da7 100644
--- a/util/src/util/Categories.ts
+++ b/src/util/util/Categories.ts
diff --git a/util/src/util/Config.ts b/src/util/util/Config.ts
index 97a73858..e0fb2a81 100644
--- a/util/src/util/Config.ts
+++ b/src/util/util/Config.ts
@@ -1,9 +1,10 @@
-import { ConfigValue, ConfigEntity, DefaultConfigOptions } from "../entities/Config";
-import path from "path";
+import { ConfigEntity } from "../entities/Config";
import fs from "fs";
+import { ConfigValue } from "../config";
+import { OrmUtils } from ".";
// TODO: yaml instead of json
-// const overridePath = path.join(process.cwd(), "config.json");
+const overridePath = process.env.CONFIG_PATH ?? "";
let config: ConfigValue;
let pairs: ConfigEntity[];
@@ -14,20 +15,29 @@ let pairs: ConfigEntity[];
export const Config = {
init: async function init() {
if (config) return config;
+ console.log('[Config] Loading configuration...')
pairs = await ConfigEntity.find();
config = pairsToConfig(pairs);
- config = (config || {}).merge(DefaultConfigOptions);
-
- // try {
- // const overrideConfig = JSON.parse(fs.readFileSync(overridePath, { encoding: "utf8" }));
- // config = overrideConfig.merge(config);
- // } catch (error) {
- // fs.writeFileSync(overridePath, JSON.stringify(config, null, 4));
- // }
+ //config = (config || {}).merge(new ConfigValue());
+ config = OrmUtils.mergeDeep(new ConfigValue(), config)
+
+ if(process.env.CONFIG_PATH)
+ try {
+ const overrideConfig = JSON.parse(fs.readFileSync(overridePath, { encoding: "utf8" }));
+ config = overrideConfig.merge(config);
+ } catch (error) {
+ fs.writeFileSync(overridePath, JSON.stringify(config, null, 4));
+ }
+
return this.set(config);
},
get: function get() {
+ if(!config) {
+ if(/--debug|--inspect/.test(process.execArgv.join(' ')))
+ console.log("Oops.. trying to get config without config existing... Returning defaults... (Is the database still initialising?)");
+ return new ConfigValue();
+ }
return config;
},
set: function set(val: Partial<ConfigValue>) {
@@ -50,7 +60,11 @@ function applyConfig(val: ConfigValue) {
pair.value = obj;
return pair.save();
}
- // fs.writeFileSync(overridePath, JSON.stringify(val, null, 4));
+ if(process.env.CONFIG_PATH) {
+ if(/--debug|--inspect/.test(process.execArgv.join(' ')))
+ console.log(`Writing config: ${process.env.CONFIG_PATH}`)
+ fs.writeFileSync(overridePath, JSON.stringify(val, null, 4));
+ }
return apply(val);
}
diff --git a/util/src/util/Constants.ts b/src/util/util/Constants.ts
index a5d3fcd2..a5d3fcd2 100644
--- a/util/src/util/Constants.ts
+++ b/src/util/util/Constants.ts
diff --git a/util/src/util/Database.ts b/src/util/util/Database.ts
index 84ce473d..84ce473d 100644
--- a/util/src/util/Database.ts
+++ b/src/util/util/Database.ts
diff --git a/util/src/util/Email.ts b/src/util/util/Email.ts
index 6885da33..6885da33 100644
--- a/util/src/util/Email.ts
+++ b/src/util/util/Email.ts
diff --git a/util/src/util/Event.ts b/src/util/util/Event.ts
index 90c24347..90c24347 100644
--- a/util/src/util/Event.ts
+++ b/src/util/util/Event.ts
diff --git a/util/src/util/FieldError.ts b/src/util/util/FieldError.ts
index 49968e1a..49968e1a 100644
--- a/util/src/util/FieldError.ts
+++ b/src/util/util/FieldError.ts
diff --git a/util/src/util/Intents.ts b/src/util/util/Intents.ts
index 1e840b76..1e840b76 100644
--- a/util/src/util/Intents.ts
+++ b/src/util/util/Intents.ts
diff --git a/util/src/util/InvisibleCharacters.ts b/src/util/util/InvisibleCharacters.ts
index 2b014e14..2b014e14 100644
--- a/util/src/util/InvisibleCharacters.ts
+++ b/src/util/util/InvisibleCharacters.ts
diff --git a/util/src/util/MFA.ts b/src/util/util/MFA.ts
index 2e47b2fc..2e47b2fc 100644
--- a/util/src/util/MFA.ts
+++ b/src/util/util/MFA.ts
diff --git a/util/src/util/MessageFlags.ts b/src/util/util/MessageFlags.ts
index b59295c4..b59295c4 100644
--- a/util/src/util/MessageFlags.ts
+++ b/src/util/util/MessageFlags.ts
diff --git a/util/src/util/Permissions.ts b/src/util/util/Permissions.ts
index c7400303..c7400303 100644
--- a/util/src/util/Permissions.ts
+++ b/src/util/util/Permissions.ts
diff --git a/util/src/util/RabbitMQ.ts b/src/util/util/RabbitMQ.ts
index 0f5eb6aa..0f5eb6aa 100644
--- a/util/src/util/RabbitMQ.ts
+++ b/src/util/util/RabbitMQ.ts
diff --git a/util/src/util/Regex.ts b/src/util/util/Regex.ts
index 83fc9fe8..83fc9fe8 100644
--- a/util/src/util/Regex.ts
+++ b/src/util/util/Regex.ts
diff --git a/util/src/util/Rights.ts b/src/util/util/Rights.ts
index 1c3906fb..1c3906fb 100644
--- a/util/src/util/Rights.ts
+++ b/src/util/util/Rights.ts
diff --git a/util/src/util/Snowflake.ts b/src/util/util/Snowflake.ts
index 0ef178fe..0ef178fe 100644
--- a/util/src/util/Snowflake.ts
+++ b/src/util/util/Snowflake.ts
diff --git a/util/src/util/String.ts b/src/util/util/String.ts
index 55f11e8d..55f11e8d 100644
--- a/util/src/util/String.ts
+++ b/src/util/util/String.ts
diff --git a/util/src/util/Token.ts b/src/util/util/Token.ts
index 5a3922d1..5a3922d1 100644
--- a/util/src/util/Token.ts
+++ b/src/util/util/Token.ts
diff --git a/util/src/util/TraverseDirectory.ts b/src/util/util/TraverseDirectory.ts
index 3d0d6279..3d0d6279 100644
--- a/util/src/util/TraverseDirectory.ts
+++ b/src/util/util/TraverseDirectory.ts
diff --git a/util/src/util/cdn.ts b/src/util/util/cdn.ts
index 9cfe4896..9cfe4896 100644
--- a/util/src/util/cdn.ts
+++ b/src/util/util/cdn.ts
diff --git a/util/src/util/imports/Checks.ts b/src/util/util/imports/Checks.ts
index 19a84171..19a84171 100644
--- a/util/src/util/imports/Checks.ts
+++ b/src/util/util/imports/Checks.ts
diff --git a/util/src/util/imports/HTTPError.ts b/src/util/util/imports/HTTPError.ts
index 56a7dd55..56a7dd55 100644
--- a/util/src/util/imports/HTTPError.ts
+++ b/src/util/util/imports/HTTPError.ts
diff --git a/util/src/util/imports/OrmUtils.ts b/src/util/util/imports/OrmUtils.ts
index 91d88172..91d88172 100644
--- a/util/src/util/imports/OrmUtils.ts
+++ b/src/util/util/imports/OrmUtils.ts
diff --git a/util/src/util/imports/index.ts b/src/util/util/imports/index.ts
index 18c47a3b..18c47a3b 100644
--- a/util/src/util/imports/index.ts
+++ b/src/util/util/imports/index.ts
diff --git a/util/src/util/index.ts b/src/util/util/index.ts
index 9e6059fa..9e6059fa 100644
--- a/util/src/util/index.ts
+++ b/src/util/util/index.ts
diff --git a/util/src/entities/Config.ts b/util/src/entities/Config.ts
deleted file mode 100644
index 901a5e54..00000000
--- a/util/src/entities/Config.ts
+++ /dev/null
@@ -1,415 +0,0 @@
-import { Column, Entity } from "typeorm";
-import { BaseClassWithoutId, PrimaryIdColumn } from "./BaseClass";
-import crypto from "crypto";
-import { Snowflake } from "../util/Snowflake";
-import { SessionsReplace } from "..";
-import { hostname } from "os";
-
-@Entity("config")
-export class ConfigEntity extends BaseClassWithoutId {
- @PrimaryIdColumn()
- key: string;
-
- @Column({ type: "simple-json", nullable: true })
- value: number | boolean | null | string | undefined;
-}
-
-export interface RateLimitOptions {
- bot?: number;
- count: number;
- window: number;
- onyIp?: boolean;
-}
-
-export interface Region {
- id: string;
- name: string;
- endpoint: string;
- location?: {
- latitude: number;
- longitude: number;
- };
- vip: boolean;
- custom: boolean;
- deprecated: boolean;
-}
-
-export interface KafkaBroker {
- ip: string;
- port: number;
-}
-
-export interface ConfigValue {
- gateway: {
- endpointClient: string | null;
- endpointPrivate: string | null;
- endpointPublic: string | null;
- };
- cdn: {
- endpointClient: string | null;
- endpointPublic: string | null;
- endpointPrivate: string | null;
- };
- api: {
- defaultVersion: string;
- activeVersions: string[];
- useFosscordEnhancements: boolean;
- };
- general: {
- instanceName: string;
- instanceDescription: string | null;
- frontPage: string | null;
- tosPage: string | null;
- correspondenceEmail: string | null;
- correspondenceUserID: string | null;
- image: string | null;
- instanceId: string;
- };
- limits: {
- user: {
- maxGuilds: number;
- maxUsername: number;
- maxFriends: number;
- };
- guild: {
- maxRoles: number;
- maxEmojis: number;
- maxMembers: number;
- maxChannels: number;
- maxChannelsInCategory: number;
- hideOfflineMember: number;
- };
- message: {
- maxCharacters: number;
- maxTTSCharacters: number;
- maxReactions: number;
- maxAttachmentSize: number;
- maxBulkDelete: number;
- maxEmbedDownloadSize: number;
- };
- channel: {
- maxPins: number;
- maxTopic: number;
- maxWebhooks: number;
- };
- rate: {
- disabled: boolean;
- ip: Omit<RateLimitOptions, "bot_count">;
- global: RateLimitOptions;
- error: RateLimitOptions;
- routes: {
- guild: RateLimitOptions;
- webhook: RateLimitOptions;
- channel: RateLimitOptions;
- auth: {
- login: RateLimitOptions;
- register: RateLimitOptions;
- };
- // TODO: rate limit configuration for all routes
- };
- };
- };
- security: {
- autoUpdate: boolean | number;
- requestSignature: string;
- jwtSecret: string;
- forwadedFor: string | null; // header to get the real user ip address
- captcha: {
- enabled: boolean;
- service: "recaptcha" | "hcaptcha" | null; // TODO: hcaptcha, custom
- sitekey: string | null;
- secret: string | null;
- };
- ipdataApiKey: string | null;
- twoFactor: {
- generateBackupCodes: boolean;
- };
- };
- login: {
- requireCaptcha: boolean;
- };
- register: {
- defaultRights: string;
- email: {
- required: boolean;
- allowlist: boolean;
- blocklist: boolean;
- domains: string[];
- };
- dateOfBirth: {
- required: boolean;
- minimum: number; // in years
- };
- disabled: boolean;
- requireCaptcha: boolean;
- requireInvite: boolean;
- guestsRequireInvite: boolean;
- allowNewRegistration: boolean;
- allowMultipleAccounts: boolean;
- blockProxies: boolean;
- password: {
- required: boolean;
- minLength: number;
- minNumbers: number;
- minUpperCase: number;
- minSymbols: number;
- };
- incrementingDiscriminators: boolean; // random otherwise
- };
- regions: {
- default: string;
- useDefaultAsOptimal: boolean;
- available: Region[];
- };
- guild: {
- discovery: {
- showAllGuilds: boolean;
- useRecommendation: boolean; // TODO: Recommendation, privacy concern?
- offset: number;
- limit: number;
- };
- autoJoin: {
- enabled: boolean;
- guilds: string[];
- canLeave: boolean;
- };
- };
- gif: {
- enabled: boolean;
- provider: "tenor"; // more coming soon
- apiKey?: string;
- };
- rabbitmq: {
- host: string | null;
- };
- kafka: {
- brokers: KafkaBroker[] | null;
- };
- templates: {
- enabled: Boolean;
- allowTemplateCreation: Boolean;
- allowDiscordTemplates: Boolean;
- allowRaws: Boolean;
- },
- client: {
- useTestClient: Boolean;
- releases: {
- useLocalRelease: Boolean; //TODO
- upstreamVersion: string;
- }
- },
- metrics: {
- timeout: number;
- },
- sentry: {
- enabled: boolean;
- endpoint: string;
- traceSampleRate: number;
- environment: string;
- }
-}
-
-export const DefaultConfigOptions: ConfigValue = {
- gateway: {
- endpointClient: null,
- endpointPrivate: null,
- endpointPublic: null,
- },
- cdn: {
- endpointClient: null,
- endpointPrivate: null,
- endpointPublic: null,
- },
- api: {
- defaultVersion: "9",
- activeVersions: ["6", "7", "8", "9"],
- useFosscordEnhancements: true,
- },
- general: {
- instanceName: "Fosscord Instance",
- instanceDescription: "This is a Fosscord instance made in pre-release days",
- frontPage: null,
- tosPage: null,
- correspondenceEmail: "noreply@localhost.local",
- correspondenceUserID: null,
- image: null,
- instanceId: Snowflake.generate(),
- },
- limits: {
- user: {
- maxGuilds: 1048576,
- maxUsername: 127,
- maxFriends: 5000,
- },
- guild: {
- maxRoles: 1000,
- maxEmojis: 2000,
- maxMembers: 25000000,
- maxChannels: 65535,
- maxChannelsInCategory: 65535,
- hideOfflineMember: 3,
- },
- message: {
- maxCharacters: 1048576,
- maxTTSCharacters: 160,
- maxReactions: 2048,
- maxAttachmentSize: 1024 * 1024 * 1024,
- maxEmbedDownloadSize: 1024 * 1024 * 5,
- maxBulkDelete: 1000,
- },
- channel: {
- maxPins: 500,
- maxTopic: 1024,
- maxWebhooks: 100,
- },
- rate: {
- disabled: true,
- ip: {
- count: 500,
- window: 5,
- },
- global: {
- count: 250,
- window: 5,
- },
- error: {
- count: 10,
- window: 5,
- },
- routes: {
- guild: {
- count: 5,
- window: 5,
- },
- webhook: {
- count: 10,
- window: 5,
- },
- channel: {
- count: 10,
- window: 5,
- },
- auth: {
- login: {
- count: 5,
- window: 60,
- },
- register: {
- count: 2,
- window: 60 * 60 * 12,
- },
- },
- },
- },
- },
- security: {
- autoUpdate: true,
- requestSignature: crypto.randomBytes(32).toString("base64"),
- jwtSecret: crypto.randomBytes(256).toString("base64"),
- forwadedFor: null,
- // forwadedFor: "X-Forwarded-For" // nginx/reverse proxy
- // forwadedFor: "CF-Connecting-IP" // cloudflare:
- captcha: {
- enabled: false,
- service: null,
- sitekey: null,
- secret: null,
- },
- ipdataApiKey: "eca677b284b3bac29eb72f5e496aa9047f26543605efe99ff2ce35c9",
- twoFactor: {
- generateBackupCodes: true,
- },
- },
- login: {
- requireCaptcha: false,
- },
- register: {
- email: {
- required: false,
- allowlist: false,
- blocklist: true,
- domains: [], // TODO: efficiently save domain blocklist in database
- // domains: fs.readFileSync(__dirname + "/blockedEmailDomains.txt", { encoding: "utf8" }).split("\n"),
- },
- dateOfBirth: {
- required: true,
- minimum: 13,
- },
- disabled: false,
- requireInvite: false,
- guestsRequireInvite: true,
- requireCaptcha: true,
- allowNewRegistration: true,
- allowMultipleAccounts: true,
- blockProxies: true,
- password: {
- required: false,
- minLength: 8,
- minNumbers: 2,
- minUpperCase: 2,
- minSymbols: 0,
- },
- incrementingDiscriminators: false,
- defaultRights: "0"
- },
- regions: {
- default: "fosscord",
- useDefaultAsOptimal: true,
- available: [
- {
- id: "fosscord",
- name: "Fosscord",
- endpoint: "127.0.0.1:3004",
- vip: false,
- custom: false,
- deprecated: false,
- },
- ],
- },
- guild: {
- discovery: {
- showAllGuilds: false,
- useRecommendation: false,
- offset: 0,
- limit: 24,
- },
- autoJoin: {
- enabled: true,
- canLeave: true,
- guilds: [],
- },
- },
- gif: {
- enabled: true,
- provider: "tenor",
- apiKey: "LIVDSRZULELA",
- },
- rabbitmq: {
- host: null,
- },
- kafka: {
- brokers: null,
- },
- templates: {
- enabled: true,
- allowTemplateCreation: true,
- allowDiscordTemplates: true,
- allowRaws: false
- },
- client: {
- useTestClient: true,
- releases: {
- useLocalRelease: true,
- upstreamVersion: "0.0.264"
- }
- },
- metrics: {
- timeout: 30000
- },
- sentry: {
- enabled: false,
- endpoint: "https://05e8e3d005f34b7d97e920ae5870a5e5@sentry.thearcanebrony.net/6",
- traceSampleRate: 1.0,
- environment: hostname()
- }
-};
diff --git a/util/src/migrations/mariadb/1660416072362-InvitersAreDeletable.ts b/util/src/migrations/mariadb/1660416072362-InvitersAreDeletable.ts
deleted file mode 100644
index 8374eafb..00000000
--- a/util/src/migrations/mariadb/1660416072362-InvitersAreDeletable.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { MigrationInterface, QueryRunner } from "typeorm";
-
-export class InvitersAreDeletable1660416072362 implements MigrationInterface {
- name = 'InvitersAreDeletable1660416072362'
-
- public async up(queryRunner: QueryRunner): Promise<void> {
- await queryRunner.query(`
- ALTER TABLE \`invites\` DROP FOREIGN KEY \`FK_15c35422032e0b22b4ada95f48f\`
- `);
- await queryRunner.query(`
- DROP INDEX \`IDX_76ba283779c8441fd5ff819c8c\` ON \`users\`
- `);
- await queryRunner.query(`
- CREATE TABLE \`plugin_config\` (
- \`key\` varchar(255) NOT NULL,
- \`value\` text NULL,
- PRIMARY KEY (\`key\`)
- ) ENGINE = InnoDB
- `);
- await queryRunner.query(`
- ALTER TABLE \`channels\`
- ADD \`flags\` int NULL
- `);
- await queryRunner.query(`
- ALTER TABLE \`channels\`
- ADD \`default_thread_rate_limit_per_user\` int NULL
- `);
- await queryRunner.query(`
- ALTER TABLE \`invites\`
- ADD CONSTRAINT \`FK_15c35422032e0b22b4ada95f48f\` FOREIGN KEY (\`inviter_id\`) REFERENCES \`users\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION
- `);
- }
-
- public async down(queryRunner: QueryRunner): Promise<void> {
- await queryRunner.query(`
- ALTER TABLE \`invites\` DROP FOREIGN KEY \`FK_15c35422032e0b22b4ada95f48f\`
- `);
- await queryRunner.query(`
- ALTER TABLE \`channels\` DROP COLUMN \`default_thread_rate_limit_per_user\`
- `);
- await queryRunner.query(`
- ALTER TABLE \`channels\` DROP COLUMN \`flags\`
- `);
- await queryRunner.query(`
- DROP TABLE \`plugin_config\`
- `);
- await queryRunner.query(`
- CREATE UNIQUE INDEX \`IDX_76ba283779c8441fd5ff819c8c\` ON \`users\` (\`settingsId\`)
- `);
- await queryRunner.query(`
- ALTER TABLE \`invites\`
- ADD CONSTRAINT \`FK_15c35422032e0b22b4ada95f48f\` FOREIGN KEY (\`inviter_id\`) REFERENCES \`users\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION
- `);
- }
-
-}
|