✨ GUILD_MEMBER_LIST_UPDATE
This commit is contained in:
parent
11d891f819
commit
910dd9a22b
2282
package-lock.json
generated
2282
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -13,7 +13,7 @@
|
|||||||
"author": "Fosscord",
|
"author": "Fosscord",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fosscord/server-util": "^1.3.3",
|
"@fosscord/server-util": "^1.3.7",
|
||||||
"ajv": "^8.5.0",
|
"ajv": "^8.5.0",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"jsonwebtoken": "^8.5.1",
|
"jsonwebtoken": "^8.5.1",
|
||||||
|
@ -1,13 +1,5 @@
|
|||||||
// @ts-nocheck WIP
|
// @ts-nocheck WIP
|
||||||
import {
|
import { db, getPermission, MemberModel, MongooseCache, PublicUserProjection, RoleModel, toObject } from "@fosscord/server-util";
|
||||||
db,
|
|
||||||
getPermission,
|
|
||||||
MemberModel,
|
|
||||||
MongooseCache,
|
|
||||||
PublicUserProjection,
|
|
||||||
RoleModel,
|
|
||||||
toObject,
|
|
||||||
} from "@fosscord/server-util";
|
|
||||||
import { LazyRequest } from "../schema/LazyRequest";
|
import { LazyRequest } from "../schema/LazyRequest";
|
||||||
import { OPCODES, Payload } from "../util/Constants";
|
import { OPCODES, Payload } from "../util/Constants";
|
||||||
import { Send } from "../util/Send";
|
import { Send } from "../util/Send";
|
||||||
@ -18,86 +10,85 @@ 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
|
// 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) {
|
export async function onLazyRequest(this: WebSocket, { d }: Payload) {
|
||||||
// TODO: check data
|
// TODO: check data
|
||||||
check.call(this, LazyRequest, d);
|
check.call(this, LazyRequest, d);
|
||||||
const { guild_id, typing, channels, activities } = d as LazyRequest;
|
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
|
// MongoDB query to retrieve all hoisted roles and join them with the members and users collection
|
||||||
const roles = toObject(
|
const roles = toObject(
|
||||||
await db
|
await db
|
||||||
.collection("roles")
|
.collection("roles")
|
||||||
.aggregate([
|
.aggregate([
|
||||||
{
|
{
|
||||||
$match: {
|
$match: {
|
||||||
guild_id,
|
guild_id
|
||||||
// hoist: true // TODO: also match @everyone role
|
// id: { $ne: guild_id }
|
||||||
},
|
// hoist: true // TODO: also match @everyone role
|
||||||
},
|
}
|
||||||
{ $sort: { position: 1 } },
|
},
|
||||||
{
|
{ $sort: { position: 1 } },
|
||||||
$lookup: {
|
{
|
||||||
from: "members",
|
$lookup: {
|
||||||
let: { id: "$id" },
|
from: "members",
|
||||||
pipeline: [
|
let: { id: "$id" },
|
||||||
{ $match: { $expr: { $in: ["$$id", "$roles"] } } },
|
pipeline: [
|
||||||
{ $limit: 100 },
|
{ $match: { $expr: { $in: ["$$id", "$roles"] } } },
|
||||||
{
|
{ $limit: 100 },
|
||||||
$lookup: {
|
{
|
||||||
from: "users",
|
$lookup: {
|
||||||
let: { user_id: "$id" },
|
from: "users",
|
||||||
pipeline: [
|
let: { user_id: "$id" },
|
||||||
{ $match: { $expr: { $eq: ["$id", "$$user_id"] } } },
|
pipeline: [{ $match: { $expr: { $eq: ["$id", "$$user_id"] } } }, { $project: PublicUserProjection }],
|
||||||
{ $project: PublicUserProjection },
|
as: "user"
|
||||||
],
|
}
|
||||||
as: "user",
|
},
|
||||||
},
|
{
|
||||||
},
|
$unwind: "$user"
|
||||||
{
|
}
|
||||||
$unwind: "$user",
|
],
|
||||||
},
|
as: "members"
|
||||||
],
|
}
|
||||||
as: "members",
|
}
|
||||||
},
|
])
|
||||||
},
|
.toArray()
|
||||||
])
|
);
|
||||||
.toArray()
|
|
||||||
);
|
|
||||||
|
|
||||||
const groups = roles.map((x) => ({ id: x.id === guild_id ? "online" : x.id, count: x.members.length }));
|
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 member_count = roles.reduce((a, b) => b.members.length + a, 0);
|
||||||
const items = [];
|
const items = [];
|
||||||
|
|
||||||
for (const role of roles) {
|
for (const role of roles) {
|
||||||
items.push({
|
items.push({
|
||||||
group: {
|
group: {
|
||||||
count: role.members.length,
|
count: role.members.length,
|
||||||
id: role.id,
|
id: role.id === guild_id ? "online" : role.name
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
for (const member of role.members) {
|
for (const member of role.members) {
|
||||||
items.push({ member });
|
member.roles.remove(guild_id);
|
||||||
}
|
items.push({ member });
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return Send(this, {
|
return Send(this, {
|
||||||
op: OPCODES.Dispatch,
|
op: OPCODES.Dispatch,
|
||||||
s: this.sequence++,
|
s: this.sequence++,
|
||||||
t: "GUILD_MEMBER_LIST_UPDATE",
|
t: "GUILD_MEMBER_LIST_UPDATE",
|
||||||
d: {
|
d: {
|
||||||
ops: [
|
ops: [
|
||||||
{
|
{
|
||||||
range: [0, 99],
|
range: [0, 99],
|
||||||
op: "SYNC",
|
op: "SYNC",
|
||||||
items: items,
|
items
|
||||||
},
|
}
|
||||||
],
|
],
|
||||||
online_count: member_count, // TODO count online count
|
online_count: member_count, // TODO count online count
|
||||||
member_count,
|
member_count,
|
||||||
id: "everyone",
|
id: "everyone",
|
||||||
guild_id,
|
guild_id,
|
||||||
groups,
|
groups
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user