diff options
author | Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> | 2021-10-05 19:33:23 +0200 |
---|---|---|
committer | Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> | 2021-10-05 19:33:23 +0200 |
commit | 8b56eb5fbc3a2034598cdaae5b1e08198b19e8ac (patch) | |
tree | 776c82db14ab7d2df90972b8ddf066f5e5422ba4 /util | |
parent | :arrow_up: update mnjsf (diff) | |
download | server-8b56eb5fbc3a2034598cdaae5b1e08198b19e8ac.tar.xz |
:sparkles: add User.register() method
Diffstat (limited to 'util')
-rw-r--r-- | util/src/entities/User.ts | 102 |
1 files changed, 93 insertions, 9 deletions
diff --git a/util/src/entities/User.ts b/util/src/entities/User.ts index b6f3723c..a139d362 100644 --- a/util/src/entities/User.ts +++ b/util/src/entities/User.ts @@ -3,6 +3,8 @@ 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 } from "."; export enum PublicUserEnum { username, @@ -74,13 +76,13 @@ export class User extends BaseClass { @Column({ nullable: true }) banner?: string; // hash of the user banner - @Column({ nullable: true }) + @Column({ nullable: true, select: false }) phone?: string; // phone number of the user - @Column() + @Column({ select: false }) desktop: boolean; // if the user has desktop app installed - @Column() + @Column({ select: false }) mobile: boolean; // if the user has mobile app installed @Column() @@ -98,16 +100,16 @@ export class User extends BaseClass { @Column() system: boolean; // shouldn't be used, the api sents this field type true, if the generated message comes from a system generated author - @Column() + @Column({ select: false }) nsfw_allowed: boolean; // if the user is older than 18 (resp. Config) - @Column() + @Column({ select: false }) mfa_enabled: boolean; // if multi factor authentication is enabled @Column() created_at: Date; // registration date - @Column() + @Column({ select: false }) verified: boolean; // if the user is offically verified @Column() @@ -116,7 +118,7 @@ export class User extends BaseClass { @Column() deleted: boolean; // if the user was deleted - @Column({ nullable: true }) + @Column({ nullable: true, select: false }) email?: string; // email of the user @Column() @@ -148,10 +150,10 @@ export class User extends BaseClass { hash?: string; // hash of the password, salt is saved in password (bcrypt) }; - @Column({ type: "simple-array" }) + @Column({ type: "simple-array", select: false }) fingerprints: string[]; // array of fingerprints -> used to prevent multiple accounts - @Column({ type: "simple-json" }) + @Column({ type: "simple-json", select: false }) settings: UserSettings; toPublicUser() { @@ -171,6 +173,88 @@ export class User extends BaseClass { } ); } + + static async register({ + email, + username, + password, + date_of_birth, + req, + }: { + username: string; + password?: string; + email?: string; + date_of_birth?: Date; // "2000-04-03" + req?: any; + }) { + // trim special uf8 control characters -> Backspace, Newline, ... + username = trimSpecial(username); + + // discriminator will be randomly generated + let discriminator = ""; + + let exists; + // randomly generates a discriminator between 1 and 9999 and checks max five times if it already exists + // if it all five times already exists, abort with USERNAME_TOO_MANY_USERS error + // else just continue + // TODO: is there any better way to generate a random discriminator only once, without checking if it already exists in the mongodb database? + for (let tries = 0; tries < 5; tries++) { + discriminator = Math.randomIntBetween(1, 9999).toString().padStart(4, "0"); + exists = await User.findOne({ where: { discriminator, username: username }, select: ["id"] }); + if (!exists) break; + } + + if (exists) { + throw FieldErrors({ + username: { + code: "USERNAME_TOO_MANY_USERS", + message: req.t("auth:register.USERNAME_TOO_MANY_USERS"), + }, + }); + } + + // TODO: save date_of_birth + // appearently discord doesn't save the date of birth and just calculate if nsfw is allowed + // if nsfw_allowed is null/undefined it'll require date_of_birth to set it to true/false + const language = req.language === "en" ? "en-US" : req.language || "en-US"; + + const user = await new User({ + created_at: new Date(), + username: username, + discriminator, + id: Snowflake.generate(), + bot: false, + system: false, + desktop: false, + mobile: false, + premium: true, + premium_type: 2, + bio: "", + mfa_enabled: false, + verified: true, + disabled: false, + deleted: false, + email: email, + rights: "0", + 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 }, + fingerprints: [], + }).save(); + + if (Config.get().guild.autoJoin.enabled) { + for (const guild of Config.get().guild.autoJoin.guilds || []) { + await Member.addToGuild(user.id, guild); + } + } + + return user; + } } export const defaultSettings: UserSettings = { |