From bb0dec2a9ff4467896356298dac6fa34fa314b9d Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Tue, 22 Jun 2021 18:41:21 +0200 Subject: [PATCH] :art: clean up code widget.json.ts: just return instead of long if statement + add ?. operators for error handling widget.png.ts make path universal widget.ts: remove unnecessary guild db query as getPermission already checks it Widget.ts make parameters required --- package-lock.json | Bin 650497 -> 655022 bytes src/routes/guilds/#guild_id/widget.json.ts | 74 ++++++++++----------- src/routes/guilds/#guild_id/widget.png.ts | 5 +- src/routes/guilds/#guild_id/widget.ts | 5 +- src/schema/Widget.ts | 4 +- 5 files changed, 44 insertions(+), 44 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4c7bbb7d0629f023839e9f307c1be3aaca5259ed..ade53630a83644ec3be1434b1946793d2dd534fa 100644 GIT binary patch delta 2450 zcmdUxTZ|J`7{@c)J1YpRTvk|jS%D=E-RVqkQ;^{Hes8Dk^pG?WN!#(Q%8#SWSs}TuDbh6Y(sFkz|^V-86*2MdmLrNQ{!sJ)%Yn*z_axB+12+0)vTE*8?LB+=r$~ z*oWX)*ePLN$r4_WQfxTskGW!zJi%kJP~OJktR>L(Gu0FWBi%qY)=bd}BGQY~9#hJr_) z74)jTWH21G#X8PX3=Po>aH<_l!EL-ud2DQk;xJ3N>yCQMUQg7-_n5L^qg}QFQa48f z?gCSfNI{O^crqgfT=q_|jq^_LQasAhw?v99ro{{`u+5w1F>ql!G`aK7-q#*btT58U z0P*D5QxFOUpFz81>V>iHwRNK`Z@F>eAY`7tJ9#Cgy952f8++27tjHx(a5CJqCrlI#(Hc83XBOjE3{N|sAGU(1PF;%usDb$8NB$+RU(=lonRvRLD+ zVUEamQbgFZ0H9Z)-NS*_flogeqfTX2>%qnIkU{<_t$KG3?0!%6mX&9+7j;X}^FWV^K3Yv!yuyFbFl`54Jn zTJ<>X!-A2L)Wkv|PrYT$3dJ^?Ma*QyOC^Ld8IOjV<#sdA_LrkG;H6ItKZS<(o|1Fy4wZUAHZAsm#(V8MjS%6jp|U*H@X2A-c;`)DObWq$KgV%n4}AY zOCUm2Jk$)vLhd?J;T#@!I9M}BJC-g=EJ|Xb*5)$^CDfZv8$zQDELN5I=}&~ zdPHXm&-BQl${qJ8*EL93lnIJL>Pc{9gJv3hdmh?x>~u>lpKfXJU+GK zPJzSMwc}uQLZyMs;Ko<_E%NG@`m@h&R@VO`!%e_w3-GXsG?csZ{*kmnKDOV`Tm1vJ Ci$Vba delta 141 zcmV;80CNAX{U?FiC$QWBv-ANj0h3Qz9)ny1w_F1OIy|>MK>>ksw>Px`fy%c@fdY5h zw>(_~xF@&Wg#&bnw{j2!Z)}%rf&>t^F!=-r0hgeE0v3mEe+0K~e+4-AxA%7jE@ii6 v-Uh0xw { .select("id user nick deaf mute") .cursor() .eachAsync(doc => { - const status = doc.user?.presence.status || "offline"; - if (status != "offline") { - let item = {} + const status = doc.user?.presence?.status || "offline"; + if (status == "offline")return + let item = {} + + item = { + ...item, + id: null, // this is updated during the sort outside of the query + username: doc.nick || doc.user?.username, + discriminator: "0000", // intended (https://github.com/discord/discord-api-docs/issues/1287) + avatar: null, // intended, avatar_url below will return a unique guild + user url to the avatar + status: status + } + + const activity = doc.user?.presence?.activities?.[0]; + if (activity) { item = { ...item, - id: null, // this is updated during the sort outside of the query - username: doc.nick || doc.user?.username, - discriminator: "0000", // intended (https://github.com/discord/discord-api-docs/issues/1287) - avatar: null, // intended, avatar_url below will return a unique guild + user url to the avatar - status: status + game: { name: activity.name } } - - const activity = doc.user?.presence.activities[0]; - if (activity) { - item = { - ...item, - game: { name: activity.name } - } - } - - // TODO: If the member is in a voice channel, return extra widget details - // Extra fields returned include deaf, mute, self_deaf, self_mute, supress, and channel_id (voice channel connected to) - // Get this from VoiceState - - - // TODO: Implement a widget-avatar endpoint on the CDN, and implement logic here to request it - // Get unique avatar url for guild user, cdn to serve the actual avatar image on this url - /* - const avatar = doc.user?.avatar; - if (avatar) { - const CDN_HOST = Config.get().cdn.endpoint || "http://localhost:3003"; - const avatar_url = "/widget-avatars/" + ; - item = { - ...item, - avatar_url: avatar_url - } - } - */ - - members.push(item); } + + // TODO: If the member is in a voice channel, return extra widget details + // Extra fields returned include deaf, mute, self_deaf, self_mute, supress, and channel_id (voice channel connected to) + // Get this from VoiceState + + + // TODO: Implement a widget-avatar endpoint on the CDN, and implement logic here to request it + // Get unique avatar url for guild user, cdn to serve the actual avatar image on this url + /* + const avatar = doc.user?.avatar; + if (avatar) { + const CDN_HOST = Config.get().cdn.endpoint || "http://localhost:3003"; + const avatar_url = "/widget-avatars/" + ; + item = { + ...item, + avatar_url: avatar_url + } + } + */ + + members.push(item); }); // Sort members, and update ids (Unable to do under the mongoose query due to https://mongoosejs.com/docs/faq.html#populate_sort_order) diff --git a/src/routes/guilds/#guild_id/widget.png.ts b/src/routes/guilds/#guild_id/widget.png.ts index 986cb05a..3ddccf20 100644 --- a/src/routes/guilds/#guild_id/widget.png.ts +++ b/src/routes/guilds/#guild_id/widget.png.ts @@ -3,9 +3,12 @@ import { GuildModel } from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; import { Image } from "canvas"; import fs from "fs"; +import path from "path" const router: Router = Router(); +// TODO: use svg templates instead of node-canvas for improved performance and to change it easily + // https://discord.com/developers/docs/resources/guild#get-guild-widget-image // TODO: Cache the response router.get("/", async (req: Request, res: Response) => { @@ -32,7 +35,7 @@ router.get("/", async (req: Request, res: Response) => { const sizeOf = require("image-size"); // TODO: Widget style templates need Fosscord branding - const source = __dirname + "../../../../../cache/widget/" + style + ".png"; + const source = path.join(__dirname, "..", "..", "..", "..", "cache","widget", `${style}.png`) if (!fs.existsSync(source)) { throw new HTTPError("Widget template does not exist.", 400); } diff --git a/src/routes/guilds/#guild_id/widget.ts b/src/routes/guilds/#guild_id/widget.ts index d8468da2..7682bc87 100644 --- a/src/routes/guilds/#guild_id/widget.ts +++ b/src/routes/guilds/#guild_id/widget.ts @@ -27,10 +27,7 @@ router.patch("/", check(WidgetModifySchema), async (req: Request, res: Response) const perms = await getPermission(req.user_id, guild_id); perms.hasThrow("MANAGE_GUILD"); - const guild = await GuildModel.findOne({ id: guild_id }).exec(); - if (!guild) throw new HTTPError("Guild not found", 404); - - await GuildModel.updateOne({ id: guild_id }, { widget_enabled: body['enabled'], widget_channel_id: body['channel_id'] }).exec(); + await GuildModel.updateOne({ id: guild_id }, { widget_enabled: body.enabled, widget_channel_id: body.channel_id }).exec(); // Widget invite for the widget_channel_id gets created as part of the /guilds/{guild.id}/widget.json request return res.json(body); diff --git a/src/schema/Widget.ts b/src/schema/Widget.ts index 6a15a139..d37a38de 100644 --- a/src/schema/Widget.ts +++ b/src/schema/Widget.ts @@ -1,7 +1,7 @@ // https://discord.com/developers/docs/resources/guild#guild-widget-object export const WidgetModifySchema = { - $enabled: Boolean, // whether the widget is enabled - $channel_id: String // the widget channel id + enabled: Boolean, // whether the widget is enabled + channel_id: String // the widget channel id }; export interface WidgetModifySchema {