From 14523cf8976fedbe000d629aeb668e55b2170cdc Mon Sep 17 00:00:00 2001 From: Paul Munteanu Date: Sun, 23 May 2021 05:33:48 +0300 Subject: [PATCH 01/11] Fix compilation with strictNullChecks: true --- src/events/Message.ts | 1 + src/listener/listener.ts | 6 +++--- src/util/Send.ts | 2 +- tsconfig.json | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/events/Message.ts b/src/events/Message.ts index 2c3305cb..51c5a294 100644 --- a/src/events/Message.ts +++ b/src/events/Message.ts @@ -21,6 +21,7 @@ export async function Message(this: WebSocket, buffer: Data) { if (this.encoding === "etf" && buffer instanceof Buffer) data = erlpack.unpack(buffer); else if (this.encoding === "json" && typeof buffer === "string") data = JSON.parse(buffer); + else return; check.call(this, PayloadSchema, data); diff --git a/src/listener/listener.ts b/src/listener/listener.ts index 8183f70c..b8ee84fd 100644 --- a/src/listener/listener.ts +++ b/src/listener/listener.ts @@ -19,7 +19,7 @@ export interface DispatchOpts { function getPipeline(this: WebSocket, guilds: string[], channels: string[] = []) { if (this.shard_count) { - guilds = guilds.filter((x) => (BigInt(x) >> 22n) % this.shard_count === this.shard_id); + guilds = guilds.filter((x) => (BigInt(x) >> 22n) % this.shard_count! === this.shard_id); } return [ @@ -37,7 +37,7 @@ function getPipeline(this: WebSocket, guilds: string[], channels: string[] = []) export async function setupListener(this: WebSocket) { const user = await UserModel.findOne({ id: this.user_id }).lean().exec(); - var guilds = user.guilds; + var guilds = user!.guilds; const eventStream = new MongooseCache(db.collection("events"), getPipeline.call(this, guilds), { onlyEvents: true, @@ -60,7 +60,7 @@ export async function dispatch(this: WebSocket, document: Event, { eventStream, guilds.push(document.data.id); eventStream.changeStream(getPipeline.call(this, guilds)); } else if (document.event === "GUILD_DELETE") { - guilds.remove(document.guild_id); + guilds.remove(document.guild_id!); eventStream.changeStream(getPipeline.call(this, guilds)); } else if (document.event === "CHANNEL_DELETE") channel_id = null; if (document.guild_id && !this.intents.has("GUILDS")) return; diff --git a/src/util/Send.ts b/src/util/Send.ts index 09e947a5..be25ac4f 100644 --- a/src/util/Send.ts +++ b/src/util/Send.ts @@ -11,7 +11,7 @@ export async function Send(socket: WebSocket, data: Payload) { if (socket.encoding === "etf") buffer = erlpack.pack(data); // TODO: encode circular object else if (socket.encoding === "json") buffer = JSON.stringify(data); - + else return; // TODO: compression if (socket.deflate) { socket.deflate.write(buffer); diff --git a/tsconfig.json b/tsconfig.json index 279cbbf1..fd2c21ea 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -29,7 +29,7 @@ /* Strict Type-Checking Options */ "strict": false /* Enable all strict type-checking options. */, "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, - // "strictNullChecks": true, /* Enable strict null checks. */ + "strictNullChecks": true, /* Enable strict null checks. */ // "strictFunctionTypes": true, /* Enable strict checking of function types. */ // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ "strictPropertyInitialization": false /* Enable strict checking of property initialization in classes. */, From c93a47d9a0b573e8c100ba9f811dbcdc6c7ad292 Mon Sep 17 00:00:00 2001 From: Diego Magdaleno Date: Sat, 22 May 2021 22:23:46 -0500 Subject: [PATCH 02/11] Meta: Enable strictNullChecks --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 279cbbf1..fd2c21ea 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -29,7 +29,7 @@ /* Strict Type-Checking Options */ "strict": false /* Enable all strict type-checking options. */, "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, - // "strictNullChecks": true, /* Enable strict null checks. */ + "strictNullChecks": true, /* Enable strict null checks. */ // "strictFunctionTypes": true, /* Enable strict checking of function types. */ // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ "strictPropertyInitialization": false /* Enable strict checking of property initialization in classes. */, From 7d795903ef9264d4febb89c62bf4abb269ab8851 Mon Sep 17 00:00:00 2001 From: Diego Magdaleno Date: Sat, 22 May 2021 22:30:36 -0500 Subject: [PATCH 03/11] Config: Implement new configuration options --- package-lock.json | Bin 128223 -> 133722 bytes package.json | 3 ++- src/Server.ts | 2 -- src/opcodes/Identify.ts | 4 +++- src/util/Config.ts | 45 ++++++++++++++++++++++++++-------------- 5 files changed, 35 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index c9428dd1565d12f027c35e0771ecdc43f586fee6..5243808f5aa9f30a0c75ea53a178358290d8c60e 100644 GIT binary patch delta 3465 zcmd6qTWs6b8OOoQj$?OOn!rwxHi=!u!P>AgZ5-E|C#5<`A z&=ti{Y%jx#o&bCrumF2l-?n<4`q;TI#U6@n9WWrkum;=1Hgp(*wJ%#AN=tEr1i`QY z@iILed^#kh|M&mS`F=cq_{+l0>!;rM=lNLZxuwP66B1M}^!!@rrPxMf1O4g0A}632 zz`nu;H!Nwes3d5r$!VJ;mFlJmz1!g;X4*m-bxf#E~*lcfy9H z8&i2(8|VghbVbsum6rmMp7 z3~s1)L@)|)qf{C2l`#ejFkA2n*=W)gxej%h(yML3cEX}08DYtEh2B&hv4PzcuG+d5 zwp+5)7s8Guc#>sH)4Q-BJ@hC&D|lM5q;T8P`(fL$6s>b7QFH@8y2-VausSnfGcW)T zEiHl*{U-tSyA|-JzW$hG=uOFz#$81N*y6?gr^M3Pf2wOR_IPm8v z3~vGKgH`axsX4|;N5>97=CV0yO<0Otjp{*IRB2Po=tuX`8h@nod?YrKn02CSr&yT1-YZOGBm;?+ps&2HI-lt|@4d zOwq03aS&J5!CN;k?f)rp?y=MNl-IvqfL0*F$3hT(<-W=X^6r}n6aL3J=nB&&Op4U0 z5vk&FIUylgl1-A>px7@Yl1T>Xq$*mW9Op9;*&bA)iDE%T$!sf<<;!ETmC3>IuxF%_ zxlT$@9M(pO_#PeG1h+>|?tfPL?mBq$^(VmEZ;7)rg990}AdCaEe1#P)GnFA)&DMB0 zOy_C6!nG=@BN|v9>5UAmU)Io}FxF^02KU{B+@V^Q*0c?M7~vxA$^gx3C9T;`jXf=0 zN;_sMolonr!PKJKZ+rrU4woNWF2#^4 zsS%vY$+?Dx^@?(LSBNL~Dhy3=YF%bG6LEyrDqd{pbxg-J;vAW)Z1!ntSQ}z=Pv3OR zv1B$;yVA2)6Vj?^2-aC=7hN{pTwz zN87Y2wqZ5W@4+KvD^ti;8%=8$i5WQG5zu_q5zW0Ek8@H)m-E#WX$z@*zF74P5-!&g zhQ)f4CvuHZQ&aJl7ptU2^zPak9Q^gn(%miZ$2-s^aBv=jAJ7N_aSxacQPY%!@6BM$`Fi2?T z`kp5-2$JI2jGf9v=|U0l(z7D}`G%z9EF zaTWmT<*RJeDlnrFK~UJJMaB#YOU3&|XTV`7xf|Wfwd=h)#*2Ea-oq3Ht4Uc!l4LZS zZC9lt-Y#*4tuboHq*lQu+g8#o<~>bJObPP%QI+mAM+}&S%M;-wd4&I%V-hob@erSB+kB3i()y^J3 kKf3nFkTh+cm+xm%@K%3#&U$5LEco>=mnWZp0{wB}3-p+He*gdg delta 387 zcmcaLh2#E9_6ffj%{B`#nleonE@af7ep-f6W4cl$qs-(9!YpAPZi)IX5!xnEsg|i0 zS^6a*`d+DKi6us%u9fMI9wrsV9+8Qa`oaE5Zh_v;hW`25?xu;Jk!6Y52HEA6RsM!X zIq8;$nFel7L7}c5rM_jE<$kFaj*|-&<)^pEGA^E8D93nek_qo*d3N^Ae^^`jHm8ei z(cHYlk)L(*3wJ^8%`749Dw`KqRx@t4sHykceD(Az{>{vH8BMlp2r-s$(a*)x6< mZ)G%fWGtNQs3JP~_30hkSD#>H); await this.setupSchema(); console.log("[DB] connected"); - await Config.init(); console.log(`[Gateway] online on 0.0.0.0:${port}`); } } diff --git a/src/opcodes/Identify.ts b/src/opcodes/Identify.ts index f31eebfe..be805eda 100644 --- a/src/opcodes/Identify.ts +++ b/src/opcodes/Identify.ts @@ -17,6 +17,7 @@ import { IdentifySchema } from "../schema/Identify"; import { Send } from "../util/Send"; import experiments from "./experiments.json"; import { check } from "./instanceOf"; +import { DefaultOptions, gatewayConfig } from "../util/Config"; // TODO: bot sharding // TODO: check priviliged intents @@ -29,7 +30,8 @@ export async function onIdentify(this: WebSocket, data: Payload) { const identify: IdentifySchema = data.d; try { - var decoded = await checkToken(identify.token); // will throw an error if invalid + const { jwtSecret } = (gatewayConfig.getAll() as DefaultOptions).security; + var decoded = await checkToken(identify.token, jwtSecret); // will throw an error if invalid } catch (error) { console.error("invalid token", error); return this.close(CLOSECODES.Authentication_failed); diff --git a/src/util/Config.ts b/src/util/Config.ts index eee20e1d..138e1c2f 100644 --- a/src/util/Config.ts +++ b/src/util/Config.ts @@ -1,21 +1,36 @@ import { Config } from "@fosscord/server-util"; - -export default { - init() { - return Config.init({ gateway: DefaultOptions }); - }, - get() { - return Config.getAll().gateway; - }, - set(val: any) { - return Config.setAll({ gateway: val }); - }, - getAll: Config.getAll, - setAll: Config.setAll, -}; +import { getConfigPathForFile } from "@fosscord/server-util/dist/util/Config"; +import Ajv, { JSONSchemaType } from "ajv"; export interface DefaultOptions { endpoint?: string; + security: { + jwtSecret: string; + } } -export const DefaultOptions: DefaultOptions = {}; +const schema: JSONSchemaType = { + type: "object", + properties: { + endpoint: { + type: "string", + nullable: true + }, + security: { + type: "object", + properties: { + jwtSecret: { + type: "string" + } + }, + required: ["jwtSecret"] + }, + }, + required: ["security"] +} + +const ajv = new Ajv(); +const validator = ajv.compile(schema); + +const configPath = getConfigPathForFile("fosscord", "gateway", ".json"); +export const gatewayConfig = new Config({path: configPath, schemaValidator: validator, schema: schema}) \ No newline at end of file From 84b6c16c3b336ce31e5d231d5cbd5b32d97bd92e Mon Sep 17 00:00:00 2001 From: Paul Munteanu Date: Sun, 23 May 2021 16:06:23 +0300 Subject: [PATCH 04/11] Undo mistake in Dockerfile --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index ade7c416..b2329233 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,12 @@ FROM node:lts-alpine WORKDIR /usr/src/fosscord-gateway -COPY . . +COPY package.json . RUN apk --no-cache --virtual build-dependencies add \ python \ make \ g++ RUN npm install RUN apk del build-dependencies +COPY . . EXPOSE 3002 CMD ["npm", "start"] \ No newline at end of file From cae7ed6657412b0b93b17d442b7dfe0ac3dcf457 Mon Sep 17 00:00:00 2001 From: Diego Magdaleno Date: Sun, 23 May 2021 12:32:54 -0500 Subject: [PATCH 05/11] Update: update server-util to latest --- package-lock.json | Bin 133722 -> 133722 bytes package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 5243808f5aa9f30a0c75ea53a178358290d8c60e..7315fbd619b5bbe2173ba3c75f4da9f93a27ee22 100644 GIT binary patch delta 761 zcmcaLh2z!~jtM`Qjr9zs%gZq;Y?fx!V4D2V$#D8<8Ai3qLSL1_+?_%VBYYeKy(@Ey z%+11*Otalxvm-t8vJ46Xva9r6Eb|@1f&)B*eLcgIB2)9tf;`h4gTnGs)6Lvcic-U! zwZpy5L;aEq+>5lm+`J0PeA9wc{T(M4D#~wfk!9S@ILU-}vOGKc=0B_j(-|!$U+mYP z&bypZ6v$l2E+1CxlI2zAX>J^zcvd(hH z$sO|~8I30wEE3;5Z}}a@$-6nlr%zbIcyh8di|pk6T-=-IE|ij-{@^yF{&cxrj2hFI z$TKR01%(+!6&U$O8YQMidYigyJLv}(6kFtkoBDY;R=Ju6I_D(01sIxUX$OSo255&^ z22|vDML7BU`{V~Zrlgm5W+k$ro&EMs0PM%ahaBQ8Q1CN}-MBBMfRcur=KZ)RzjVQ4^7YL=;2sa8g)^;p75E#mPF$ z9Vd6plLY#(V3GLddCTuGPTtKaK7GOx#*>q^<;6C4FVvBozTSXQf4bZ*MvdughKw?k zCkV5IdPJ2bg{7Ezrg;=6YyRRnD zEe57L_Ats!H&A6{-`*|DnAeIL_F*&$`||0Eu8h*t&o5?-h6MfOdCS?idoE#ICWD%}0Vw~p>0M%~-v;Y7A diff --git a/package.json b/package.json index 89e96cb4..f45b0008 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "author": "Fosscord", "license": "ISC", "dependencies": { - "@fosscord/server-util": "^1.2.8", + "@fosscord/server-util": "^1.3.0", "ajv": "^8.5.0", "dotenv": "^8.2.0", "jsonwebtoken": "^8.5.1", From a2a22c9afa9231c86133ba043b8111520765763d Mon Sep 17 00:00:00 2001 From: Diego Magdaleno Date: Sun, 23 May 2021 13:46:26 -0500 Subject: [PATCH 06/11] Fix: No more typecasting required --- package-lock.json | Bin 133722 -> 133722 bytes package.json | 2 +- src/opcodes/Identify.ts | 4 ++-- src/util/Config.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7315fbd619b5bbe2173ba3c75f4da9f93a27ee22..b7bb7da6e9c211ee9090a21b5fe7a5876250bd0f 100644 GIT binary patch delta 261 zcmcaLh2z!~jtRdQ4X4Y?F)D19X4GPud`Mk?`e_+Pjmbjw3ZZ_vMP3#j$x*rf9+jS< zF24DJ+M#(_`Ki9Xnfe~VNq$BJ`mVkuh6Sm4AuhpAW#P##7LmcGxki3DS*0EZffd2I z8KsU!l|Jdgt_5L+l__Ojx&EG$3ltT$x5zSXXPjihJ6WEcz4;I8_CKtQ3&cF)D19X4GPu{Mku=`e_+PjmaWk6~f$|LJcE)90R>8bBfH( z!jeq0-CeUIJ@c{*3InpM^j$3T9m9eHJcE5b!;>OY^UZ=h(;S1s@>0{y+)|2C!=1Im zz0E`Yk_+66w7uNC3d(%bf>Zq+Cl@NpZ*P%h+|D@3gm({path: configPath, schemaValidator: validator, schema: schema}) \ No newline at end of file From e287d3e5bd3960fbf8f08d81779ea7ff303f0664 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Mon, 24 May 2021 20:46:07 +0200 Subject: [PATCH 07/11] :sparkles: use new config --- src/opcodes/Identify.ts | 4 ++-- src/util/Config.ts | 23 ++++++++++++++--------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/opcodes/Identify.ts b/src/opcodes/Identify.ts index 0781afde..0ddc58d1 100644 --- a/src/opcodes/Identify.ts +++ b/src/opcodes/Identify.ts @@ -11,13 +11,13 @@ import { UserModel, toObject, EVENTEnum, + Config, } from "@fosscord/server-util"; import { setupListener } from "../listener/listener"; import { IdentifySchema } from "../schema/Identify"; import { Send } from "../util/Send"; import experiments from "./experiments.json"; import { check } from "./instanceOf"; -import * as Config from "../util/Config"; // TODO: bot sharding // TODO: check priviliged intents @@ -30,7 +30,7 @@ export async function onIdentify(this: WebSocket, data: Payload) { const identify: IdentifySchema = data.d; try { - const { jwtSecret } = Config.gatewayConfig.getAll().security; + const { jwtSecret } = Config.get().security; var decoded = await checkToken(identify.token, jwtSecret); // will throw an error if invalid } catch (error) { console.error("invalid token", error); diff --git a/src/util/Config.ts b/src/util/Config.ts index 8489888c..9ceb8cd5 100644 --- a/src/util/Config.ts +++ b/src/util/Config.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { Config } from "@fosscord/server-util"; import { getConfigPathForFile } from "@fosscord/server-util/dist/util/Config"; import Ajv, { JSONSchemaType } from "ajv"; @@ -6,7 +7,7 @@ export interface DefaultOptions { endpoint?: string; security: { jwtSecret: string; - } + }; } const schema: JSONSchemaType = { @@ -14,23 +15,27 @@ const schema: JSONSchemaType = { properties: { endpoint: { type: "string", - nullable: true + nullable: true, }, security: { type: "object", properties: { jwtSecret: { - type: "string" - } + type: "string", + }, }, - required: ["jwtSecret"] + required: ["jwtSecret"], }, }, - required: ["security"] -} + required: ["security"], +}; const ajv = new Ajv(); const validator = ajv.compile(schema); -const configPath = getConfigPathForFile("fosscord", "gateway", ".json"); -export const gatewayConfig = new Config({path: configPath, schemaValidator: validator, schema: schema}) \ No newline at end of file +const configPath = getConfigPathForFile("fosscord", "gateway", ".json"); +export const gatewayConfig = new Config({ + path: configPath, + schemaValidator: validator, + schema: schema, +}); From 094ec2449e70eda03434b724914900b5f8735d04 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Mon, 24 May 2021 20:48:37 +0200 Subject: [PATCH 08/11] npm i @fosscord/server-util@1.3.2 --- package-lock.json | Bin 133722 -> 133722 bytes package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index b7bb7da6e9c211ee9090a21b5fe7a5876250bd0f..6608281dedb190128f70b6a674bdc825817cced0 100644 GIT binary patch delta 279 zcmcaLh2z!~jtRdQji$@XF)D19X4GPu{+XFcfBI<|Mvci#;R<2?#YMT{E@2*39;qqr zzA1^t=Dr3-SpmN0l~n=S+P=m`IaRK~eqN3yrD=wi0eJ;xX6}W>hGl`4ImP;cUd6f2 z<~~)~mQ~4BuHnWJ0haFC{sslcj*|-&<+r!UGI}sFT1-DH$Cx+Cgmlj}Z||06bOgF(JJ2n?uK}>%S)Tv^ delta 276 zcmcaLh2z!~jtRdQ4X4Y?F)D19X4GPud`Mk?`e_+Pjmbjw3ZZ_vMP3#j$x*rf9+jS< zF24DJ+M#(_`Ki9Xnfe~VNq$BJ`mVkuh6Sm4AuhpAW#P##7LmcGxki3DS*0EZffd2I z8KsU!l|Jdgt_5L+l__Ojx&EG$3ltT$x5zSjFfy7=KP$(WH_3!|vOGI`^B>mje^?n8 kh@rS4j3#a Date: Tue, 25 May 2021 01:11:16 +0200 Subject: [PATCH 09/11] npm i @fosscord/server-util@1.3.3 --- .env.example | 4 ++++ package-lock.json | Bin 133722 -> 133722 bytes package.json | 2 +- src/Server.ts | 3 ++- 4 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..0224de64 --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +MONGO_URL=mongodb://localhost/fosscord +PORT=3002 +PRODUCTION=TRUE +THREADS=# automatically use all available cores, only available if production = true \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6608281dedb190128f70b6a674bdc825817cced0..32c7f62c2a758549bd07408d114f91f18dd07926 100644 GIT binary patch delta 246 zcmcaLh2z!~jtRdQji<}YF)D19X4GPuesedY{`Au_j2e@jBoso^GF<}$EseANeIkNG z0-gNB%>tZELo&>wJUk5Zt9%0t^TJa@vQqMLi;RuZ%_A(F!o9L{U3??L)4WTAi~{^h z{fZ1y{k+^wvJ7*QGCT`Y(_9Ken*~|63$ieFOQ2d7Mia{%rz^TLN>4XXWn|ypEz5ZR F4FLUyP;USL delta 246 zcmcaLh2z!~jtRdQji$@XF)D19X4GPu{+XFcfBI<|Mvci#;R>Pt#YMT{E@2*39;qqr zzA1^t=Dr3-SpmN0l~n=S+P=m`IaRK~eqN3yrD=wi0eJ;xX6}W>hGl`4ImP;cUd6f2 z<~~)~mQ~4BuHnWJ0haFC{sslc&4Mi31z8xoB~UF3qlsmX(-mDArKcOHGO};)mSsHu F1^{n#PV@i( diff --git a/package.json b/package.json index 97792782..2d061bad 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "author": "Fosscord", "license": "ISC", "dependencies": { - "@fosscord/server-util": "^1.3.2", + "@fosscord/server-util": "^1.3.3", "ajv": "^8.5.0", "dotenv": "^8.2.0", "jsonwebtoken": "^8.5.1", diff --git a/src/Server.ts b/src/Server.ts index 46130b29..2f72cc00 100644 --- a/src/Server.ts +++ b/src/Server.ts @@ -1,7 +1,7 @@ import "missing-native-js-functions"; import dotenv from "dotenv"; dotenv.config(); -import { db } from "@fosscord/server-util"; +import { Config, db } from "@fosscord/server-util"; import { Server as WebSocketServer } from "ws"; import { Connection } from "./events/Connection"; @@ -36,6 +36,7 @@ export class Server { // @ts-ignore await (db as Promise); await this.setupSchema(); + await Config.init(); console.log("[DB] connected"); console.log(`[Gateway] online on 0.0.0.0:${port}`); } From 910dd9a22b7cb60fe83d023333c365c661e608e7 Mon Sep 17 00:00:00 2001 From: honeytequila Date: Thu, 27 May 2021 09:28:19 -0300 Subject: [PATCH 10/11] =?UTF-8?q?=E2=9C=A8=20GUILD=5FMEMBER=5FLIST=5FUPDAT?= =?UTF-8?q?E?= 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 zcmeG@d3aRSz29IUBrFm_W|FWZ8N(ttb7#qhl0Y`HkbQxGfZUn6Gjo$WOYWV?BvhKJ z?GrR2;U_M2p=d>|8#q#VN>M{Y?w082P9BXI10$EnqUa5!wJT+(d zR7NWPY@^v|HCkc*gxqP2w~vgJ7%fH<_$DmK}rwNAFWwRNer zr@5i4y`#0Fc}-DEMPY}#XkBfs*|)i|#q3?fbaXqs9^Ptk6?c_Xtf}wuR5f<3ajpus zSz4NcO}vR|s;?>NHgh(2T`%LT>g_BqEhVJF*A5SB_GzX`P6FkZ{249@YYA2!pOh(` zePCUZX6#wGdE#dyv%4mlq~F3zlfI11UMZV-Qj-GyBSc0V0OjX1;Hhcv$-dk^{qvEVU4RwXf9Z#0 zcJGX$N|Cu3uZ#7L$Q2eSL~hIrWu>_$WnQ4WVPCNhzMgTI!2C_x^@AczXVB|ly)FcW z$fzg_7^aI2xP!JR^96Yh54r;Zzi=f*iIYaV&qE1*pI7kl0>$`!NCKJ7J*-!WD{1e5 zhelEeyRO$lXy)7GJPQ}j1R;H4h59{96k+o&D0gV#Q2Hqus&AR~3T)aisZ;@lNZ3q9 zlM;B?l<}+-Za7;zMaJvl`MN0@yw`Gty%cX@V+lzh&!B_5tY+An`4B-;dDfy!B@AZc zVE<)WSiZ~*Pi5Uq)--2V&yuYPGB%bc9Jnw0r1bc(Wwt0=y-#T2_BkImspH>dR6aXT z+ZhAX@29;23qQM03%R*T@W|Xhk<;y&SCJ+?9a;`~?`Yw7fh0IqNP#Km0kZO=ob2VQ zhfzKW?7mNjch?j`xt5wC_`H;XvZ4PBSaTM_k(oJzJypT#&77mnV&-b?Y)fl-U65-K z%nj?f$}UI4X11%YsL@7sRP}_q+%}5pY;LP>YUy&>+XPExu(_btRAq1M@jE-L)Iht? zVhwtI>$)pkNExc09m%WFJa?%gyPf3b!cRWPfTgD?Sef@DDec0?^CoC!NU=E(AjtfB zcnW-~57((40%;9J9NLk==Ipcp!|O8O>@TeFTz(2@^4E`pC^_?AA%w1&Z&BB735e#F z`Jx^8$pQQIEIt$^A+$g{8Mx=rYi*yBJfcj5b1DoC0M zMGR)8gF1WxgP-?7@4^h&S0t*Wp<->sIZ}Wey}!r}7kE(#_)7vZ^C)og@$O)Rvqlxo z)L1_r9xZ;iYz(f$T!bC7vQkAw4%bydL=D7A~ zV29&V98W@8S+VSG*b%|E3U0krJ0%`Kz^c*c5tSEuUSGmT4f#)_HAO}3xaMdbR4p66-)5nKs-oX$L ze$xXLbQ;=5Q9R-kG71vX?v zT&JU4kc;!#41StNZY9t&XGI*xH^~u?b?6cZ6%+zCwGvV(Ks zrhGFbuNTOiJj zzwyNcl02&Jbu`a$&K|nrj4ef5s6?%TV_Ph zo+gA@&SclC%5Cg9<9j0rv^VIn!Jb1}7-W8*fci#d14SZibY8T}UG6$46BL2wd87#U zB3pC73N`L^GF`OCJx!B3DqFBIX(2qFO@XF+H^x@@sqV`)U8?9Rh~{j)evcR$m~oXt z(G}_r(Zp;0Pmh=%KFI~7XM=LjTZCeZy-TIH>On?@@sKcg(EGCNtChZglCQofzZ9^kdN2LqaTyK1`Qh#=Rotuj#~#)L z*L|Ra(;+i_KDdn&0Y=h7qL+%6kkC7U+z^&&Q4|Z5v<`-7aM*|>?)lNti>Cx|*Zq~q zA9uZO9H0$d|1SdVjvI1xV_+C(!DRG!{)T@^(|B1wnG=5F$H^M0i|FZr+@~=wC&BK; z6fFF&doe%Tr6})lu)H5*k|gCk4z;A*DB`2}nm7goZk?#tl)$M=jWGL0E&2;p2H?t@ zH^PLl4vyZqc^RfR$*89270hXbv?5|+Q^`80-m0atGT|%TG>3%&#hY7+R{+mDL5M4{Vko9 zo}S`@mHy_n?VhGkzk5wZb+2o4E3UMVjLymAnZR#bg-Sh#w}mGb8-UkqQS$zL%k1?%kJYi#vWk%n5cD?W%#6vNM+RH%Rz|up=JicK0USRCU(QToze@rkaz6)QyJ^g~54hDnE-npYb1zJkj0RfN6 z-4F>V9FYK08(ZsX<<_nWnb{g!Uwu8(ZEpzTRx7JqYTV3U`tZc4oThd(H zKTyp!wwWyEKD*Uo>*%9Bu8QtTAtY247If9Mh1@RdKn1;~x4wIXVn=VR$c*%kToV-* zd|lM!VS?#ZSumJAu}soh@&BTS*(gOHSM>7LNQ?=OA~0OWOM)#!$uKzwR}@m=;Lx;@ z($RZE>u1S%RQ#|OY35rGtCuwkaEL7}gLry_3<{-@*W0^8tliWN|9FlPH8G3@(hFf2 z12G(nP9>IC=$V=Dk)8tU&biS1q*wuS?G$x)Ou0qc8AFaF1E*MTSrQK`an7Wc0UZOo z5waY*?eO%GtPQ%Mmqv*x9qin7IzuwdxO@SY4q&e^18%tegnF7$&E3Js7Mr7pBOkcq z_~m05c)T)3EtQoPVQNVY{O&t-;k9?Bit%#ruG^->G$n#D*N7N~BfVyYwvvnhN zY@h{!b&>4d?2r|lcYDUc2Y&DF{lv@JeNSROlVV^6&)@SHfwtw|Y?)tl$G!hlPf95I zi*Vt8yRKF9{81PT%QHYA0){NB|oJk+SoOQ zmm>2+;&o*n`6DmPYlHKA|^*$24UXbz2hK4C-**vq10cLi2KobSq4{UJ&2cZ z2g;^rtnk)DK|+a*4{OJRhr(MPo+fMHf}0-slx(r}7gqJWERqI=&;luOf6zOCDy5MY zniti(niON}USh+KJ$kTOML(C7s&sPjwAaPJb+hNf-p5|K`05W&hYU7!&Ah!jxa08? z1cALz*b|C671as+;R!ME{Lqv1cu*YD_8lRoJGaj~F7W2<|BAp{^3?0aaeREl0;nwJ zpluw3YE9@*kJOD(a~a~cddzuR>~_jOkfqL|v5ih+9gvg`%x~2I9AL<8Qh#~XxL~L0 zmtROT^*oAx=>Tduh2e+McF**X?PeUzYEOWp)k@p)hywK{)XbL;qBcPJkiiT)>hinX zjnqJ4G2^XSQ(Mkh`=};+sIj4lwo-l0>h=bP5^5SPj=H)fuIgq}g@09BXV02-z7Q1{ z;CxNJ^#e^sJzedbwQXRav7~`3tfGYamXc`1vl#b!aDB+lLJEyUIw%K?B2aQ`l_(OjLPPr!ydaehav@kVk{ zDRQ95@!|&=l(7+6>H@H#P{@eapd}u!eqxwWtn$dN_f$4n-3QM-IOmNdQYoIx1l}c^LVH4~b72C%zM4 z`FR~2dj3TsElaAt@Zwj}B)z~o#pZyjI_nht1Boda+g>++(AQg4+|pRTB-mWky?SYN zYb9rD;M+px=8(X)2<*z%w!-o@tI5r@Eh(ttin}W+Y*h{3roJ^S-D5EYHm~E_tIf5= zZ538idlzNyrq-_QD8{;R3`DUm)QF422r=aeMaMsvrWFMIQiwFg;POZC4)z(v1J(?~0CsJkr?MBQQUWQxxOe%IcpYC;iTC<+hqP>`@+ z<6yAMip#0Eec#tY!O~N>F+U&nJv9mP&&@DM(lfDNF}#$)N3`P@y~;D>q6d4XZ|KySUOn)FjMJhxe{wo2qN=4j0$ty45IZTb^8Z$~9rf)op8N)!RX3mj@cpTi zAotA|#(_)!@@Awt;gYwq)B|`G9To7g*c)V>s4WUH04`PczjfCNRn}7BEXaPFbR;a3 zARJjE#?XU$`{dY;uNFZ2&XJ497o2_P?}V#9dNKgR(X8sD z@9;(+3`Q3j#GyEA11Q=O{45Fqd|nQhO-29@8b;=%-;D|0;9yW!s2#nW{8r^JdATD} ziGrE0ry~c}AM^gPtkhyGj+Z7F$r9ZBKi|YY)NHKlAZ3{FJ@1(`@x&^MvdGg#j@yTt+ERMv6LKhoBx-j}SSDcFc zPK?s{QEr@`oz&3=Be?d1dlI^oa=sz&!?Q#=q@T-^_J0QhEEf?z$epYsrE1*wzU`b_ zYOCS1bB`v}qN~#27=1bVtB(%Fb7-Sai=*m?A_D}Q@wI38`afAj_u}P`S4mq*`e?C4 zgU$V5Jp~*7ylNa!x&O}xrb`@!5J_KM`7`VJ0jUp!5*{)ohaIkLFkh(vW1n5Y0;}iOMoAfgX*qVoH>##j<5mPE=Ak~fyuUet+lU*3r5(QW>(wmBvDQLnO!vSN=bMVgZfTeJXPIyO_YB|N?6%<{Os9nU7Gqu!2VQ28Jg?NR7- zejhywaO4=q#Rge#!ctV6&qHIB#SC+9%s_u_59h7^eroQp<7QX3Jmp110~Oni=5X3j z`2^^gi1F37eU1hWB;!B5x4yb4Wu!L$?J{W{-$y15WAa;O(ZZI4ofA? ({ 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 11/11] 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, + }, + }); }