From 910dd9a22b7cb60fe83d023333c365c661e608e7 Mon Sep 17 00:00:00 2001 From: honeytequila Date: Thu, 27 May 2021 09:28:19 -0300 Subject: [PATCH 1/2] =?UTF-8?q?=E2=9C=A8=20GUILD=5FMEMBER=5FLIST=5FUPDATE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | Bin 133722 -> 60437 bytes package.json | 2 +- src/opcodes/LazyRequest.ts | 163 ++++++++++++++++++------------------- 3 files changed, 78 insertions(+), 87 deletions(-) diff --git a/package-lock.json b/package-lock.json index 32c7f62c2a758549bd07408d114f91f18dd07926..c18abf3248f6669b86b48a8da0e006d29adf29dd 100644 GIT binary patch delta 753 zcmYL_PfXKr9L4iRA`CTx1Wg2#En-LtwB2B|D&nBsx~;5ZTRYf+WdGWAgN|vq8Ph%Q zW-?j>Ia%mM#2~cU_xi!Qf)4%wj%IH`Cvut4XRUX)X4twEk@A7^SdD8oREqazqD7DC zQEO~HUduJ=^`&xAYBn?Gf?Q5FL*7!JS1Ji3oHJ$CS6%goG0sz7TAeo1GE11{0>O|< zPMMr^bvPV%j}_S;F|2JPM~{FnmT`uYGz=XRjy7&qIlili2w2`h0!Th;KH z`Gz7Sl}wZqlY%fV$ZRZY2+3f4Sg=Iw2Oq=CnUyWO-inM3Y&DUvMkFK;4@bN(65ziAaH!m59bh6j9^~MM+N>1?s=< zvliN%1Iqff`T8{J866*WqqQfH0t($Z0P^2+bbAZVppT#75?b7XMfCgSF}>LV4s~sV z6TN={7p#q)Hv8sNaJJaxXV3@s#&g&kvUYpU+aJEcRExd45BnXhCj-{nB+*$_ARrNSk r)mK8MP*St*c&LPt7)^4Er;+IqtE>E delta 17281 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 ({ id: x.id === guild_id ? "online" : x.id, count: x.members.length })); - const member_count = roles.reduce((a, b) => b.members.length + a, 0); - const items = []; + const groups = roles.map((x) => ({ id: x.id === guild_id ? "online" : x.id, count: x.members.length })); + const member_count = roles.reduce((a, b) => b.members.length + a, 0); + const items = []; - for (const role of roles) { - items.push({ - group: { - count: role.members.length, - id: role.id, - }, - }); - for (const member of role.members) { - items.push({ member }); - } - } + for (const role of roles) { + items.push({ + group: { + count: role.members.length, + id: role.id === guild_id ? "online" : role.name + } + }); + for (const member of role.members) { + member.roles.remove(guild_id); + items.push({ member }); + } + } - return Send(this, { - op: OPCODES.Dispatch, - s: this.sequence++, - t: "GUILD_MEMBER_LIST_UPDATE", - d: { - ops: [ - { - range: [0, 99], - op: "SYNC", - items: items, - }, - ], - online_count: member_count, // TODO count online count - member_count, - id: "everyone", - guild_id, - groups, - }, - }); + return Send(this, { + op: OPCODES.Dispatch, + s: this.sequence++, + t: "GUILD_MEMBER_LIST_UPDATE", + d: { + ops: [ + { + range: [0, 99], + op: "SYNC", + items + } + ], + online_count: member_count, // TODO count online count + member_count, + id: "everyone", + guild_id, + groups + } + }); } From b5bbc35905db8df37ec15e137967ac2a1203ee52 Mon Sep 17 00:00:00 2001 From: notsapinho <52896767+9qz@users.noreply.github.com> Date: Thu, 27 May 2021 09:56:28 -0300 Subject: [PATCH 2/2] Update LazyRequest.ts --- src/opcodes/LazyRequest.ts | 144 ++++++++++++++++++++----------------- 1 file changed, 77 insertions(+), 67 deletions(-) diff --git a/src/opcodes/LazyRequest.ts b/src/opcodes/LazyRequest.ts index bf7e7f8e..8a7bb8c4 100644 --- a/src/opcodes/LazyRequest.ts +++ b/src/opcodes/LazyRequest.ts @@ -1,5 +1,13 @@ // @ts-nocheck WIP -import { db, getPermission, MemberModel, MongooseCache, PublicUserProjection, RoleModel, toObject } from "@fosscord/server-util"; +import { + db, + getPermission, + MemberModel, + MongooseCache, + PublicUserProjection, + RoleModel, + toObject, +} from "@fosscord/server-util"; import { LazyRequest } from "../schema/LazyRequest"; import { OPCODES, Payload } from "../util/Constants"; import { Send } from "../util/Send"; @@ -10,56 +18,58 @@ import { check } from "./instanceOf"; // TODO: config: if want to list all members (even those who are offline) sorted by role, or just those who are online export async function onLazyRequest(this: WebSocket, { d }: Payload) { - // TODO: check data - check.call(this, LazyRequest, d); - const { guild_id, typing, channels, activities } = d as LazyRequest; + // TODO: check data + check.call(this, LazyRequest, d); + const { guild_id, typing, channels, activities } = d as LazyRequest; - const permissions = await getPermission(this.user_id, guild_id); + const permissions = await getPermission(this.user_id, guild_id); - // MongoDB query to retrieve all hoisted roles and join them with the members and users collection - const roles = toObject( - await db - .collection("roles") - .aggregate([ - { - $match: { - guild_id - // id: { $ne: guild_id } - // hoist: true // TODO: also match @everyone role - } - }, - { $sort: { position: 1 } }, - { - $lookup: { - from: "members", - let: { id: "$id" }, - pipeline: [ - { $match: { $expr: { $in: ["$$id", "$roles"] } } }, - { $limit: 100 }, - { - $lookup: { - from: "users", - let: { user_id: "$id" }, - pipeline: [{ $match: { $expr: { $eq: ["$id", "$$user_id"] } } }, { $project: PublicUserProjection }], - as: "user" - } - }, - { - $unwind: "$user" - } - ], - as: "members" - } - } - ]) - .toArray() - ); + // MongoDB query to retrieve all hoisted roles and join them with the members and users collection + const roles = toObject( + await db + .collection("roles") + .aggregate([ + { + $match: { + guild_id, + // hoist: true // TODO: also match @everyone role + }, + }, + { $sort: { position: 1 } }, + { + $lookup: { + from: "members", + let: { id: "$id" }, + pipeline: [ + { $match: { $expr: { $in: ["$$id", "$roles"] } } }, + { $limit: 100 }, + { + $lookup: { + from: "users", + let: { user_id: "$id" }, + pipeline: [ + { $match: { $expr: { $eq: ["$id", "$$user_id"] } } }, + { $project: PublicUserProjection }, + ], + as: "user", + }, + }, + { + $unwind: "$user", + }, + ], + as: "members", + }, + }, + ]) + .toArray() + ); - const groups = roles.map((x) => ({ id: x.id === guild_id ? "online" : x.id, count: x.members.length })); - const member_count = roles.reduce((a, b) => b.members.length + a, 0); - const items = []; + const groups = roles.map((x) => ({ id: x.id === guild_id ? "online" : x.id, count: x.members.length })); + const member_count = roles.reduce((a, b) => b.members.length + a, 0); + const items = []; - for (const role of roles) { + for (const role of roles) { items.push({ group: { count: role.members.length, @@ -70,25 +80,25 @@ export async function onLazyRequest(this: WebSocket, { d }: Payload) { member.roles.remove(guild_id); items.push({ member }); } - } + } - return Send(this, { - op: OPCODES.Dispatch, - s: this.sequence++, - t: "GUILD_MEMBER_LIST_UPDATE", - d: { - ops: [ - { - range: [0, 99], - op: "SYNC", - items - } - ], - online_count: member_count, // TODO count online count - member_count, - id: "everyone", - guild_id, - groups - } - }); + return Send(this, { + op: OPCODES.Dispatch, + s: this.sequence++, + t: "GUILD_MEMBER_LIST_UPDATE", + d: { + ops: [ + { + range: [0, 99], + op: "SYNC", + items, + }, + ], + online_count: member_count, // TODO count online count + member_count, + id: "everyone", + guild_id, + groups, + }, + }); }