Bunch of fixes and improvements, everything appears to work now

This commit is contained in:
TheArcaneBrony
2022-08-08 04:27:28 +02:00
parent c70d15b564
commit d52d9c62fc
40 changed files with 490 additions and 81 deletions
+15 -6
View File
@@ -1,11 +1,12 @@
import "reflect-metadata";
import { BaseEntity, EntityMetadata, ObjectIdColumn, PrimaryColumn, FindOptionsWhere } from "typeorm";
import { BaseEntity, EntityMetadata, ObjectIdColumn, PrimaryColumn, FindOptionsWhere, Generated, SaveOptions } from "typeorm";
import { Snowflake } from "../util/Snowflake";
export class BaseClassWithoutId extends BaseEntity {
constructor(props?: any) {
super();
this.assign(props);
if(props != undefined && props != null && Object.keys(props).length > 0)
this.assign(props);
}
assign(props: any = {}) {
@@ -13,8 +14,11 @@ export class BaseClassWithoutId extends BaseEntity {
delete props.opts;
delete props.props;
// will not include relational properties
for (const key in props) {
console.warn("WARNING: BaseClass.assign called! This will probably fail!");
console.warn(this)
Object.assign(this,props);
if(/--debug|--inspect/.test(process.execArgv.join(' '))) debugger;
/*for (const key in props) {
// @ts-ignore
const setter = this[`set${key.capitalize()}`]; // use setter function if it exists
@@ -24,7 +28,7 @@ export class BaseClassWithoutId extends BaseEntity {
// @ts-ignore
this[key] = props[key];
}
}
}*/
}
}
@@ -35,8 +39,13 @@ export class BaseClass extends BaseClassWithoutId {
id: string;
assign(props: any = {}) {
super.assign(props);
super.assign(props);
if (!this.id) this.id = Snowflake.generate();
return this;
}
save(options?: SaveOptions | undefined): Promise<this> {
if (!this.id) this.id = Snowflake.generate();
return super.save(options);
}
}
+6 -5
View File
@@ -222,7 +222,7 @@ export class Channel extends BaseClass {
};
await Promise.all([
new Channel(channel).save(),
Object.assign(new Channel(),channel).save(),
!opts?.skipEventEmit
? emitEvent({
event: "CHANNEL_CREATE",
@@ -263,7 +263,8 @@ export class Channel extends BaseClass {
if (containsAll(re, channelRecipients)) {
if (channel == null) {
channel = ur.channel;
await ur.assign({ closed: false }).save();
ur = Object.assign(ur, { closed: false });
await ur.save();
}
}
}
@@ -272,7 +273,7 @@ export class Channel extends BaseClass {
if (channel == null) {
name = trimSpecial(name);
channel = await new Channel({
channel = await (Object.assign(new Channel(), {
name,
type,
owner_id: type === ChannelType.DM ? undefined : null, // 1:1 DMs are ownerless in fosscord-server
@@ -280,9 +281,9 @@ export class Channel extends BaseClass {
last_message_id: null,
recipients: channelRecipients.map(
(x) =>
new Recipient({ user_id: x, closed: !(type === ChannelType.GROUP_DM || x === creator_user_id) })
Object.assign(new Recipient(), { user_id: x, closed: !(type === ChannelType.GROUP_DM || x === creator_user_id) })
),
}).save();
}) as Channel).save();
}
const channel_dto = await DmChannelDTO.from(channel);
+2
View File
@@ -129,6 +129,7 @@ export interface ConfigValue {
requireCaptcha: boolean;
};
register: {
defaultRights: string;
email: {
required: boolean;
allowlist: boolean;
@@ -349,6 +350,7 @@ export const DefaultConfigOptions: ConfigValue = {
minSymbols: 0,
},
incrementingDiscriminators: false,
defaultRights: "0"
},
regions: {
default: "fosscord",
+6 -4
View File
@@ -285,7 +285,7 @@ export class Guild extends BaseClass {
}) {
const guild_id = Snowflake.generate();
const guild = await new Guild({
const guild: Guild = Object.assign(new Guild(),{
name: body.name || "Fosscord",
icon: await handleFile(`/icons/${guild_id}`, body.icon as string),
region: Config.get().regions.default,
@@ -316,11 +316,12 @@ export class Guild extends BaseClass {
welcome_channels: [],
},
widget_enabled: true, // NB: don't set it as false to prevent artificial restrictions
}).save();
});
await guild.save();
// we have to create the role _after_ the guild because else we would get a "SQLITE_CONSTRAINT: FOREIGN KEY constraint failed" error
// TODO: make the @everyone a pseudorole that is dynamically generated at runtime so we can save storage
await new Role({
let role: Role = Object.assign(new Role(), {
id: guild_id,
guild_id: guild_id,
color: 0,
@@ -333,7 +334,8 @@ export class Guild extends BaseClass {
position: 0,
icon: null,
unicode_emoji: null
}).save();
});
await role.save();
if (!body.channels || !body.channels.length) body.channels = [{ id: "01", type: 0, name: "general" }];
+5 -5
View File
@@ -85,8 +85,8 @@ export class Member extends BaseClassWithoutId {
@Column()
joined_at: Date;
@Column({ type: "bigint", nullable: true })
premium_since?: number;
@Column({ nullable: true })
premium_since?: Date;
@Column()
deaf: boolean;
@@ -161,7 +161,7 @@ export class Member extends BaseClassWithoutId {
}),
Role.findOneOrFail({ where: { id: role_id, guild_id }, select: ["id"] }),
]);
member.roles.push(new Role({ id: role_id }));
member.roles.push(Object.assign(new Role(), { id: role_id }));
await Promise.all([
member.save(),
@@ -264,9 +264,9 @@ export class Member extends BaseClassWithoutId {
//TODO: check for bugs
if(guild.member_count) guild.member_count++;
await Promise.all([
new Member({
Object.assign(new Member(), {
...member,
roles: [new Role({ id: guild_id })],
roles: [Object.assign(new Role(), { id: guild_id })],
// read_state: {},
settings: {
channel_overrides: [],
+4 -2
View File
@@ -255,7 +255,7 @@ export class User extends BaseClass {
// 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 = new User({
const user = Object.assign(new User(), {
created_at: new Date(),
username: username,
discriminator,
@@ -275,7 +275,7 @@ export class User extends BaseClass {
disabled: false,
deleted: false,
email: email,
rights: "0", // TODO: grant rights correctly, as 0 actually stands for no rights at all
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
@@ -289,6 +289,8 @@ export class User extends BaseClass {
notes: {},
});
console.log("new user")
console.log(user);
await user.save();
setImmediate(async () => {
@@ -0,0 +1,26 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class premiumSinceAsDate1659921859145 implements MigrationInterface {
name = 'premiumSinceAsDate1659921859145'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
ALTER TABLE \`members\` DROP COLUMN \`premium_since\`
`);
await queryRunner.query(`
ALTER TABLE \`members\`
ADD \`premium_since\` datetime NULL
`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
ALTER TABLE \`members\` DROP COLUMN \`premium_since\`
`);
await queryRunner.query(`
ALTER TABLE \`members\`
ADD \`premium_since\` bigint NULL
`);
}
}
@@ -0,0 +1,26 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class premiumSinceAsDate1659921826567 implements MigrationInterface {
name = 'premiumSinceAsDate1659921826567'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
ALTER TABLE "members" DROP COLUMN "premium_since"
`);
await queryRunner.query(`
ALTER TABLE "members"
ADD "premium_since" TIMESTAMP
`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
ALTER TABLE "members" DROP COLUMN "premium_since"
`);
await queryRunner.query(`
ALTER TABLE "members"
ADD "premium_since" bigint
`);
}
}
@@ -0,0 +1,252 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class premiumSinceAsDate1659921722863 implements MigrationInterface {
name = 'premiumSinceAsDate1659921722863'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
DROP INDEX "IDX_bb2bf9386ac443afbbbf9f12d3"
`);
await queryRunner.query(`
CREATE TABLE "temporary_members" (
"index" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
"id" varchar NOT NULL,
"guild_id" varchar NOT NULL,
"nick" varchar,
"joined_at" datetime NOT NULL,
"premium_since" bigint,
"deaf" boolean NOT NULL,
"mute" boolean NOT NULL,
"pending" boolean NOT NULL,
"settings" text NOT NULL,
"last_message_id" varchar,
"joined_by" varchar,
CONSTRAINT "FK_16aceddd5b89825b8ed6029ad1c" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT "FK_28b53062261b996d9c99fa12404" FOREIGN KEY ("id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
)
`);
await queryRunner.query(`
INSERT INTO "temporary_members"(
"index",
"id",
"guild_id",
"nick",
"joined_at",
"premium_since",
"deaf",
"mute",
"pending",
"settings",
"last_message_id",
"joined_by"
)
SELECT "index",
"id",
"guild_id",
"nick",
"joined_at",
"premium_since",
"deaf",
"mute",
"pending",
"settings",
"last_message_id",
"joined_by"
FROM "members"
`);
await queryRunner.query(`
DROP TABLE "members"
`);
await queryRunner.query(`
ALTER TABLE "temporary_members"
RENAME TO "members"
`);
await queryRunner.query(`
CREATE UNIQUE INDEX "IDX_bb2bf9386ac443afbbbf9f12d3" ON "members" ("id", "guild_id")
`);
await queryRunner.query(`
DROP INDEX "IDX_bb2bf9386ac443afbbbf9f12d3"
`);
await queryRunner.query(`
CREATE TABLE "temporary_members" (
"index" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
"id" varchar NOT NULL,
"guild_id" varchar NOT NULL,
"nick" varchar,
"joined_at" datetime NOT NULL,
"premium_since" datetime,
"deaf" boolean NOT NULL,
"mute" boolean NOT NULL,
"pending" boolean NOT NULL,
"settings" text NOT NULL,
"last_message_id" varchar,
"joined_by" varchar,
CONSTRAINT "FK_16aceddd5b89825b8ed6029ad1c" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT "FK_28b53062261b996d9c99fa12404" FOREIGN KEY ("id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
)
`);
await queryRunner.query(`
INSERT INTO "temporary_members"(
"index",
"id",
"guild_id",
"nick",
"joined_at",
"premium_since",
"deaf",
"mute",
"pending",
"settings",
"last_message_id",
"joined_by"
)
SELECT "index",
"id",
"guild_id",
"nick",
"joined_at",
"premium_since",
"deaf",
"mute",
"pending",
"settings",
"last_message_id",
"joined_by"
FROM "members"
`);
await queryRunner.query(`
DROP TABLE "members"
`);
await queryRunner.query(`
ALTER TABLE "temporary_members"
RENAME TO "members"
`);
await queryRunner.query(`
CREATE UNIQUE INDEX "IDX_bb2bf9386ac443afbbbf9f12d3" ON "members" ("id", "guild_id")
`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
DROP INDEX "IDX_bb2bf9386ac443afbbbf9f12d3"
`);
await queryRunner.query(`
ALTER TABLE "members"
RENAME TO "temporary_members"
`);
await queryRunner.query(`
CREATE TABLE "members" (
"index" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
"id" varchar NOT NULL,
"guild_id" varchar NOT NULL,
"nick" varchar,
"joined_at" datetime NOT NULL,
"premium_since" bigint,
"deaf" boolean NOT NULL,
"mute" boolean NOT NULL,
"pending" boolean NOT NULL,
"settings" text NOT NULL,
"last_message_id" varchar,
"joined_by" varchar,
CONSTRAINT "FK_16aceddd5b89825b8ed6029ad1c" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT "FK_28b53062261b996d9c99fa12404" FOREIGN KEY ("id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
)
`);
await queryRunner.query(`
INSERT INTO "members"(
"index",
"id",
"guild_id",
"nick",
"joined_at",
"premium_since",
"deaf",
"mute",
"pending",
"settings",
"last_message_id",
"joined_by"
)
SELECT "index",
"id",
"guild_id",
"nick",
"joined_at",
"premium_since",
"deaf",
"mute",
"pending",
"settings",
"last_message_id",
"joined_by"
FROM "temporary_members"
`);
await queryRunner.query(`
DROP TABLE "temporary_members"
`);
await queryRunner.query(`
CREATE UNIQUE INDEX "IDX_bb2bf9386ac443afbbbf9f12d3" ON "members" ("id", "guild_id")
`);
await queryRunner.query(`
DROP INDEX "IDX_bb2bf9386ac443afbbbf9f12d3"
`);
await queryRunner.query(`
ALTER TABLE "members"
RENAME TO "temporary_members"
`);
await queryRunner.query(`
CREATE TABLE "members" (
"index" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
"id" varchar NOT NULL,
"guild_id" varchar NOT NULL,
"nick" varchar,
"joined_at" datetime NOT NULL,
"premium_since" bigint,
"deaf" boolean NOT NULL,
"mute" boolean NOT NULL,
"pending" boolean NOT NULL,
"settings" text NOT NULL,
"last_message_id" varchar,
"joined_by" varchar,
CONSTRAINT "FK_16aceddd5b89825b8ed6029ad1c" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT "FK_28b53062261b996d9c99fa12404" FOREIGN KEY ("id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
)
`);
await queryRunner.query(`
INSERT INTO "members"(
"index",
"id",
"guild_id",
"nick",
"joined_at",
"premium_since",
"deaf",
"mute",
"pending",
"settings",
"last_message_id",
"joined_by"
)
SELECT "index",
"id",
"guild_id",
"nick",
"joined_at",
"premium_since",
"deaf",
"mute",
"pending",
"settings",
"last_message_id",
"joined_by"
FROM "temporary_members"
`);
await queryRunner.query(`
DROP TABLE "temporary_members"
`);
await queryRunner.query(`
CREATE UNIQUE INDEX "IDX_bb2bf9386ac443afbbbf9f12d3" ON "members" ("id", "guild_id")
`);
}
}
+3
View File
@@ -138,6 +138,9 @@ export class BitField {
return bit.map((p) => resolve.call(this, p)).reduce((prev, p) => BigInt(prev) | BigInt(p), BigInt(0));
}
if (typeof bit === "string" && typeof FLAGS[bit] !== "undefined") return FLAGS[bit];
if (bit === "0") return BigInt(0); //special case: 0
if (typeof bit === "string") return BigInt(bit); //last ditch effort...
if(/--debug|--inspect/.test(process.execArgv.join(' '))) debugger; //if you're here, we have an invalid bitfield... if bit is 0, thats fine, I guess...
throw new RangeError("BITFIELD_INVALID: " + bit);
}
}