diff --git a/util/src/entities/Member.ts b/src/util/entities/Member.ts
index fe2d5590..42a014d4 100644
--- a/util/src/entities/Member.ts
+++ b/src/util/entities/Member.ts
@@ -1,30 +1,14 @@
-import { PublicUser, User } from "./User";
-import { BaseClass } from "./BaseClass";
-import {
- Column,
- Entity,
- Index,
- JoinColumn,
- JoinTable,
- ManyToMany,
- ManyToOne,
- PrimaryGeneratedColumn,
- RelationId,
-} from "typeorm";
-import { Guild } from "./Guild";
-import { Config, emitEvent } from "../util";
-import {
- GuildCreateEvent,
- GuildDeleteEvent,
- GuildMemberAddEvent,
- GuildMemberRemoveEvent,
- GuildMemberUpdateEvent,
-} from "../interfaces";
-import { HTTPError } from "lambert-server";
-import { Role } from "./Role";
-import { BaseClassWithoutId } from "./BaseClass";
+import { Column, Entity, Index, JoinColumn, JoinTable, ManyToMany, ManyToOne, PrimaryGeneratedColumn, RelationId } from "typeorm";
import { Ban, PublicGuildRelations } from ".";
+import { GuildCreateEvent, GuildDeleteEvent, GuildMemberAddEvent, GuildMemberRemoveEvent, GuildMemberUpdateEvent } from "../interfaces";
+import { Config, emitEvent } from "../util";
import { DiscordApiErrors } from "../util/Constants";
+import { HTTPError } from "../util/imports/HTTPError";
+import { OrmUtils } from "../util/imports/OrmUtils";
+import { BaseClassWithoutId } from "./BaseClass";
+import { Guild } from "./Guild";
+import { Role } from "./Role";
+import { PublicUser, User } from "./User";
export const MemberPrivateProjection: (keyof Member)[] = [
"id",
@@ -39,7 +23,7 @@ export const MemberPrivateProjection: (keyof Member)[] = [
"premium_since",
"roles",
"settings",
- "user",
+ "user"
];
@Entity("members")
@@ -54,7 +38,7 @@ export class Member extends BaseClassWithoutId {
@JoinColumn({ name: "id" })
@ManyToOne(() => User, {
- onDelete: "CASCADE",
+ onDelete: "CASCADE"
})
user: User;
@@ -64,20 +48,20 @@ export class Member extends BaseClassWithoutId {
@JoinColumn({ name: "guild_id" })
@ManyToOne(() => Guild, {
- onDelete: "CASCADE",
+ onDelete: "CASCADE"
})
guild: Guild;
@Column({ nullable: true })
nick?: string;
-
+
@JoinTable({
name: "member_roles",
joinColumn: { name: "index", referencedColumnName: "index" },
inverseJoinColumn: {
name: "role_id",
- referencedColumnName: "id",
- },
+ referencedColumnName: "id"
+ }
})
@ManyToMany(() => Role, { cascade: true })
roles: Role[];
@@ -85,8 +69,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;
@@ -102,14 +86,14 @@ export class Member extends BaseClassWithoutId {
@Column({ nullable: true })
last_message_id?: string;
-
+
/**
@JoinColumn({ name: "id" })
@ManyToOne(() => User, {
onDelete: "DO NOTHING",
// do not auto-kick force-joined members just because their joiners left the server
}) **/
- @Column({ nullable: true})
+ @Column({ nullable: true })
joined_by?: string;
// TODO: add this when we have proper read receipts
@@ -117,35 +101,37 @@ export class Member extends BaseClassWithoutId {
// read_state: ReadState;
static async IsInGuildOrFail(user_id: string, guild_id: string) {
- if (await Member.count({ id: user_id, guild: { id: guild_id } })) return true;
+ if (await Member.count({ where: { id: user_id, guild: { id: guild_id } } })) return true;
throw new HTTPError("You are not member of this guild", 403);
}
static async removeFromGuild(user_id: string, guild_id: string) {
- const guild = await Guild.findOneOrFail({ select: ["owner_id"], where: { id: guild_id } });
+ const guild = await Guild.findOneOrFail({ select: ["owner_id", "member_count"], where: { id: guild_id } });
if (guild.owner_id === user_id) throw new Error("The owner cannot be removed of the guild");
const member = await Member.findOneOrFail({ where: { id: user_id, guild_id }, relations: ["user"] });
// use promise all to execute all promises at the same time -> save time
+ //TODO: check for bugs
+ if (guild.member_count) guild.member_count--;
return Promise.all([
Member.delete({
id: user_id,
- guild_id,
+ guild_id
}),
- Guild.decrement({ id: guild_id }, "member_count", -1),
+ //Guild.decrement({ id: guild_id }, "member_count", -1),
emitEvent({
event: "GUILD_DELETE",
data: {
- id: guild_id,
+ id: guild_id
},
- user_id: user_id,
+ user_id: user_id
} as GuildDeleteEvent),
emitEvent({
event: "GUILD_MEMBER_REMOVE",
data: { guild_id, user: member.user },
- guild_id,
- } as GuildMemberRemoveEvent),
+ guild_id
+ } as GuildMemberRemoveEvent)
]);
}
@@ -155,11 +141,11 @@ export class Member extends BaseClassWithoutId {
Member.findOneOrFail({
where: { id: user_id, guild_id },
relations: ["user", "roles"], // we don't want to load the role objects just the ids
- select: ["index", "roles.id"],
+ select: ["index"]
}),
- Role.findOneOrFail({ where: { id: role_id, guild_id }, select: ["id"] }),
+ Role.findOneOrFail({ where: { id: role_id, guild_id }, select: ["id"] })
]);
- member.roles.push(new Role({ id: role_id }));
+ member.roles.push(OrmUtils.mergeDeep(new Role(), { id: role_id }));
await Promise.all([
member.save(),
@@ -168,10 +154,10 @@ export class Member extends BaseClassWithoutId {
data: {
guild_id,
user: member.user,
- roles: member.roles.map((x) => x.id),
+ roles: member.roles.map((x) => x.id)
},
- guild_id,
- } as GuildMemberUpdateEvent),
+ guild_id
+ } as GuildMemberUpdateEvent)
]);
}
@@ -181,9 +167,9 @@ export class Member extends BaseClassWithoutId {
Member.findOneOrFail({
where: { id: user_id, guild_id },
relations: ["user", "roles"], // we don't want to load the role objects just the ids
- select: ["roles.id", "index"],
+ select: ["index"]
}),
- await Role.findOneOrFail({ id: role_id, guild_id }),
+ await Role.findOneOrFail({ where: { id: role_id, guild_id } })
]);
member.roles = member.roles.filter((x) => x.id == role_id);
@@ -194,10 +180,10 @@ export class Member extends BaseClassWithoutId {
data: {
guild_id,
user: member.user,
- roles: member.roles.map((x) => x.id),
+ roles: member.roles.map((x) => x.id)
},
- guild_id,
- } as GuildMemberUpdateEvent),
+ guild_id
+ } as GuildMemberUpdateEvent)
]);
}
@@ -205,9 +191,9 @@ export class Member extends BaseClassWithoutId {
const member = await Member.findOneOrFail({
where: {
id: user_id,
- guild_id,
+ guild_id
},
- relations: ["user"],
+ relations: ["user"]
});
member.nick = nickname;
@@ -219,10 +205,10 @@ export class Member extends BaseClassWithoutId {
data: {
guild_id,
user: member.user,
- nick: nickname,
+ nick: nickname
},
- guild_id,
- } as GuildMemberUpdateEvent),
+ guild_id
+ } as GuildMemberUpdateEvent)
]);
}
@@ -233,19 +219,19 @@ export class Member extends BaseClassWithoutId {
throw DiscordApiErrors.USER_BANNED;
}
const { maxGuilds } = Config.get().limits.user;
- const guild_count = await Member.count({ id: user_id });
+ const guild_count = await Member.count({ where: { id: user_id } });
if (guild_count >= maxGuilds) {
throw new HTTPError(`You are at the ${maxGuilds} server limit.`, 403);
}
const guild = await Guild.findOneOrFail({
where: {
- id: guild_id,
+ id: guild_id
},
- relations: PublicGuildRelations,
+ relations: PublicGuildRelations
});
- if (await Member.count({ id: user.id, guild: { id: guild_id } }))
+ if (await Member.count({ where: { id: user.id, guild: { id: guild_id } } }))
throw new HTTPError("You are already a member of this guild", 400);
const member = {
@@ -254,16 +240,17 @@ export class Member extends BaseClassWithoutId {
nick: undefined,
roles: [guild_id], // @everyone role
joined_at: new Date(),
- premium_since: (new Date()).getTime(),
+ premium_since: null,
deaf: false,
mute: false,
- pending: false,
+ pending: false
};
-
+ //TODO: check for bugs
+ if (guild.member_count) guild.member_count++;
await Promise.all([
- new Member({
+ OrmUtils.mergeDeep(new Member(), {
...member,
- roles: [new Role({ id: guild_id })],
+ roles: [OrmUtils.mergeDeep(new Role(), { id: guild_id })],
// read_state: {},
settings: {
channel_overrides: [],
@@ -272,19 +259,19 @@ export class Member extends BaseClassWithoutId {
muted: false,
suppress_everyone: false,
suppress_roles: false,
- version: 0,
- },
+ version: 0
+ }
// Member.save is needed because else the roles relations wouldn't be updated
}).save(),
- Guild.increment({ id: guild_id }, "member_count", 1),
+ //Guild.increment({ id: guild_id }, "member_count", 1),
emitEvent({
event: "GUILD_MEMBER_ADD",
data: {
...member,
user,
- guild_id,
+ guild_id
},
- guild_id,
+ guild_id
} as GuildMemberAddEvent),
emitEvent({
event: "GUILD_CREATE",
@@ -297,10 +284,10 @@ export class Member extends BaseClassWithoutId {
joined_at: member.joined_at,
presences: [],
stage_instances: [],
- threads: [],
+ threads: []
},
- user_id,
- } as GuildCreateEvent),
+ user_id
+ } as GuildCreateEvent)
]);
}
}
@@ -326,16 +313,7 @@ export interface MuteConfig {
selected_time_window: number;
}
-export type PublicMemberKeys =
- | "id"
- | "guild_id"
- | "nick"
- | "roles"
- | "joined_at"
- | "pending"
- | "deaf"
- | "mute"
- | "premium_since";
+export type PublicMemberKeys = "id" | "guild_id" | "nick" | "roles" | "joined_at" | "pending" | "deaf" | "mute" | "premium_since";
export const PublicMemberProjection: PublicMemberKeys[] = [
"id",
@@ -346,7 +324,7 @@ export const PublicMemberProjection: PublicMemberKeys[] = [
"pending",
"deaf",
"mute",
- "premium_since",
+ "premium_since"
];
// @ts-ignore
|