From ea4201c6f71d0b27cfd29418ce631438e00b3652 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 3 Sep 2021 12:53:25 +0200 Subject: [PATCH 1/3] :bug: fix client connection crash on guild create --- util/src/entities/Member.ts | 21 +++++++++++++++++---- util/src/interfaces/Event.ts | 11 +++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/util/src/entities/Member.ts b/util/src/entities/Member.ts index ae60f4e2..db4e827b 100644 --- a/util/src/entities/Member.ts +++ b/util/src/entities/Member.ts @@ -208,7 +208,7 @@ export class Member extends BaseClassWithoutId { where: { id: guild_id, }, - relations: ["channels", "emojis", "members", "roles", "stickers"], + relations: ["channels", "emojis", "members", "roles", "stickers", "voice_states"], }); if (await Member.count({ id: user.id, guild: { id: guild_id } })) @@ -225,8 +225,6 @@ export class Member extends BaseClassWithoutId { mute: false, pending: false, }; - // @ts-ignore - guild.joined_at = member.joined_at.toISOString(); await Promise.all([ Member.insert({ @@ -255,7 +253,22 @@ export class Member extends BaseClassWithoutId { } as GuildMemberAddEvent), emitEvent({ event: "GUILD_CREATE", - data: { ...guild, members: [...guild.members, { ...member, user }] }, + data: { + ...guild, + members: [...guild.members, { ...member, user }], + member_count: (guild.member_count || 0) + 1, + guild_hashes: { + channels: { omitted: false, hash: "nkMQJ5nl5Cg" }, + metadata: { omitted: false, hash: "+5ybMfcb8iw" }, + roles: { omitted: false, hash: "Idhc6P9ktfM" }, + version: 1, + }, + guild_scheduled_events: [], + joined_at: member.joined_at, + presences: [], + stage_instances: [], + threads: [], + }, user_id, } as GuildCreateEvent), ]); diff --git a/util/src/interfaces/Event.ts b/util/src/interfaces/Event.ts index 7ea1bd49..acaa822e 100644 --- a/util/src/interfaces/Event.ts +++ b/util/src/interfaces/Event.ts @@ -125,6 +125,17 @@ export interface GuildCreateEvent extends Event { event: "GUILD_CREATE"; data: Guild & { joined_at: Date; + // TODO: add them to guild + guild_scheduled_events: never[]; + guild_hashes: { + channels: { omitted: boolean; hash: string }; + metadata: { omitted: boolean; hash: string }; + roles: { omitted: boolean; hash: string }; + version: number; + }; + presences: never[]; + stage_instances: never[]; + threads: never[]; }; } From f83f4416b876291df7d8756bea9ccf75d1b74add Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 3 Sep 2021 13:10:24 +0200 Subject: [PATCH 2/3] :bug: fix member has no roles in guild create --- util/src/entities/Member.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/util/src/entities/Member.ts b/util/src/entities/Member.ts index db4e827b..76febb50 100644 --- a/util/src/entities/Member.ts +++ b/util/src/entities/Member.ts @@ -54,13 +54,14 @@ export class Member extends BaseClassWithoutId { @JoinTable({ name: "member_roles", - joinColumn: { name: "id", referencedColumnName: "index" }, + + joinColumn: { name: "index", referencedColumnName: "index" }, inverseJoinColumn: { name: "role_id", referencedColumnName: "id", }, }) - @ManyToMany(() => Role) + @ManyToMany(() => Role, { cascade: true }) roles: Role[]; @Column() @@ -227,7 +228,7 @@ export class Member extends BaseClassWithoutId { }; await Promise.all([ - Member.insert({ + new Member({ ...member, roles: [new Role({ id: guild_id })], // read_state: {}, @@ -240,7 +241,8 @@ export class Member extends BaseClassWithoutId { suppress_roles: false, version: 0, }, - }), + // Member.save is needed because else the roles relations wouldn't be updated + }).save(), Guild.increment({ id: guild_id }, "member_count", 1), emitEvent({ event: "GUILD_MEMBER_ADD", From a446837679c2b29ba751efb8c3e5d00ef0b13f00 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 3 Sep 2021 13:23:20 +0200 Subject: [PATCH 3/3] :bug: fix member roles + list --- api/scripts/droptables.sql | 2 +- .../routes/guilds/#guild_id/members/#member_id/index.ts | 8 ++------ api/src/routes/guilds/index.ts | 8 ++++---- gateway/src/opcodes/LazyRequest.ts | 4 ++-- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/api/scripts/droptables.sql b/api/scripts/droptables.sql index 2a9fd3ad..cabb9f31 100644 --- a/api/scripts/droptables.sql +++ b/api/scripts/droptables.sql @@ -2,7 +2,6 @@ DROP TABLE applications; DROP TABLE attachments; DROP TABLE audit_logs; DROP TABLE bans; -DROP TABLE channels; DROP TABLE connected_accounts; DROP TABLE emojis; DROP TABLE invites; @@ -24,6 +23,7 @@ DROP TABLE teams; DROP TABLE templates; DROP TABLE voice_states; DROP TABLE webhooks; +DROP TABLE channels; DROP TABLE members; DROP TABLE guilds; -- DROP TABLE users; diff --git a/api/src/routes/guilds/#guild_id/members/#member_id/index.ts b/api/src/routes/guilds/#guild_id/members/#member_id/index.ts index aef1c6dc..66c508a2 100644 --- a/api/src/routes/guilds/#guild_id/members/#member_id/index.ts +++ b/api/src/routes/guilds/#guild_id/members/#member_id/index.ts @@ -30,18 +30,14 @@ router.patch("/", check(MemberChangeSchema), async (req: Request, res: Response) const { guild_id, member_id } = req.params; const body = req.body as MemberChangeSchema; + const member = await Member.findOneOrFail({ where: { id: member_id, guild_id }, relations: ["roles", "user"] }); const permission = await getPermission(req.user_id, guild_id); if (body.roles) { permission.hasThrow("MANAGE_ROLES"); - - const roles = await Role.find({ id: In(body.roles) }); - if (body.roles.length !== roles.length) throw new HTTPError("Roles not found", 404); + member.roles = body.roles.map((x) => new Role({ id: x })); // foreign key constraint will fail if role doesn't exist } - const member = await Member.findOneOrFail({ id: member_id, guild_id }); - member.assign(req.body); - Promise.all([ member.save(), emitEvent({ diff --git a/api/src/routes/guilds/index.ts b/api/src/routes/guilds/index.ts index 51dcf96a..b4f6b3d2 100644 --- a/api/src/routes/guilds/index.ts +++ b/api/src/routes/guilds/index.ts @@ -20,7 +20,7 @@ router.post("/", check(GuildCreateSchema), async (req: Request, res: Response) = const guild_id = Snowflake.generate(); - const guild = await new Guild({ + await Guild.insert({ name: body.name, region: Config.get().regions.default, owner_id: req.user_id, @@ -47,10 +47,10 @@ router.post("/", check(GuildCreateSchema), async (req: Request, res: Response) = welcome_channels: [] }, widget_enabled: false - }).save(); + }); // we have to create the role _after_ the guild because else we would get a "SQLITE_CONSTRAINT: FOREIGN KEY constraint failed" error - const role = await new Role({ + await Role.insert({ id: guild_id, guild_id: guild_id, color: 0, @@ -60,7 +60,7 @@ router.post("/", check(GuildCreateSchema), async (req: Request, res: Response) = name: "@everyone", permissions: String("2251804225"), position: 0 - }).save(); + }); if (!body.channels || !body.channels.length) body.channels = [{ id: "01", type: 0, name: "general" }]; diff --git a/gateway/src/opcodes/LazyRequest.ts b/gateway/src/opcodes/LazyRequest.ts index e035e6bb..b7ee9a96 100644 --- a/gateway/src/opcodes/LazyRequest.ts +++ b/gateway/src/opcodes/LazyRequest.ts @@ -33,7 +33,7 @@ export async function onLazyRequest(this: WebSocket, { d }: Payload) { const roles = await Role.find({ where: { guild_id: guild_id }, order: { - position: "ASC", + position: "DESC", }, }); @@ -47,7 +47,7 @@ export async function onLazyRequest(this: WebSocket, { d }: Payload) { ); const group = { count: role_members.length, - id: role.id === guild_id ? "online" : role.name, + id: role.id === guild_id ? "online" : role.id, }; items.push({ group });