mirror of
https://github.com/spacebarchat/server.git
synced 2024-11-11 05:02:37 +01:00
Update LazyRequest.ts
This commit is contained in:
parent
910dd9a22b
commit
b5bbc35905
@ -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,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user