From 6c08af5aa92d8ab91d6332937cb6fd0bc2708a21 Mon Sep 17 00:00:00 2001 From: Cynthia Foxwell Date: Fri, 20 Oct 2023 13:30:57 -0600 Subject: [PATCH] utility.guildinfo: implement preview, discovery and widget --- src/modules/utility.js | 428 +++++++++++++++++++++++++++++++++++------ 1 file changed, 364 insertions(+), 64 deletions(-) diff --git a/src/modules/utility.js b/src/modules/utility.js index 0e12af1..ebe131f 100644 --- a/src/modules/utility.js +++ b/src/modules/utility.js @@ -473,7 +473,7 @@ avatar.callback = async function (msg, line, [user], {server, guild}) { } else { const guild = msg.channel.guild || hf.bot.guilds.get(msg.guildID); const url = `${ICON_BASE}${guild.id}/${guild.icon}.${ - guild.icon.startsWith("a_") ? "gif?size=1024&_=.gif" : "png?size=1024" + guild.icon.startsWith("a_") ? "gif?size=4096&_=.gif" : "png?size=4096" }`; return { embeds: [ @@ -523,8 +523,8 @@ avatar.callback = async function (msg, line, [user], {server, guild}) { normalAvatar + "." + (normalAvatar.startsWith("a_") - ? "gif?size=1024&_=.gif" - : "png?size=1024"); + ? "gif?size=4096&_=.gif" + : "png?size=4096"); const guildUrl = guildAvatar && "https://cdn.discordapp.com/guilds/" + @@ -535,8 +535,8 @@ avatar.callback = async function (msg, line, [user], {server, guild}) { guildAvatar + "." + (guildAvatar.startsWith("a_") - ? "gif?size=1024&_=.gif" - : "png?size=1024"); + ? "gif?size=4096&_=.gif" + : "png?size=4096"); baseEmbed.description = `[Normal avatar](${normalUrl})` + @@ -568,8 +568,8 @@ avatar.callback = async function (msg, line, [user], {server, guild}) { normalAvatar + "." + (normalAvatar.startsWith("a_") - ? "gif?size=1024&_=.gif" - : "png?size=1024"); + ? "gif?size=4096&_=.gif" + : "png?size=4096"); const guildUrl = guildAvatar && "https://cdn.discordapp.com/guilds/" + @@ -580,8 +580,8 @@ avatar.callback = async function (msg, line, [user], {server, guild}) { guildAvatar + "." + (guildAvatar.startsWith("a_") - ? "gif?size=1024&_=.gif" - : "png?size=1024"); + ? "gif?size=4096&_=.gif" + : "png?size=4096"); baseEmbed.description = `[Normal avatar](${normalUrl})` + @@ -651,7 +651,7 @@ banner.callback = async function (msg, line, [user], {server, guild}) { if (!userObj.banner) return "This user does not have a banner."; const url = `${BANNER_BASE}${userObj.id}/${userObj.banner}.${ - userObj.banner.startsWith("a_") ? "gif?size=1024&_=.gif" : "png?size=1024" + userObj.banner.startsWith("a_") ? "gif?size=4096&_=.gif" : "png?size=4096" }`; return { embeds: [ @@ -807,8 +807,8 @@ lookupinvite.callback = async function (msg, line) { invite.guild.icon && `${ICON_BASE}${invite.guild.id}/${invite.guild.icon}.${ invite.guild.icon.startsWith("a_") - ? "gif?size=1024&_=.gif" - : "png?size=1024" + ? "gif?size=4096&_=.gif" + : "png?size=4096" }`, }; @@ -822,15 +822,15 @@ lookupinvite.callback = async function (msg, line) { invite.guild.icon ? `[Icon](${ICON_BASE}${invite.guild.id}/${invite.guild.icon}.${ invite.guild.icon.startsWith("a_") - ? "gif?size=1024" - : "png?size=1024" + ? "gif?size=4096" + : "png?size=4096" })` : "" }${ invite.guild.splash ? `${invite.guild.icon ? " | " : ""}[Splash](${SPLASH_BASE}${ invite.guild.id - }/${invite.guild.splash}.png?size=2048)` + }/${invite.guild.splash}.png?size=4096)` : "" }${ invite.guild.banner @@ -840,8 +840,8 @@ lookupinvite.callback = async function (msg, line) { invite.guild.banner }.${ invite.guild.banner.startsWith("a_") - ? "gif?size=1024" - : "png?size=1024" + ? "gif?size=4096" + : "png?size=4096" })` : "" }`, @@ -888,8 +888,8 @@ lookupinvite.callback = async function (msg, line) { const groupIcon = invite.channel.icon ? `${CHANNEL_ICON_BASE}${invite.channel.id}/${invite.channel.icon}.${ invite.channel.icon.startsWith("a_") - ? "gif?size=1024&_=.gif" - : "png?size=1024" + ? "gif?size=4096&_=.gif" + : "png?size=4096" }` : "https://discord.com" + DEFAULT_GROUP_DM_AVATARS[ @@ -914,8 +914,8 @@ lookupinvite.callback = async function (msg, line) { invite.inviter?.avatar && `${AVATAR_BASE}${invite.inviter.id}/${invite.inviter.avatar}.${ invite.inviter.avatar.startsWith("a_") - ? "gif?size=1024&_=.gif" - : "png?size=1024" + ? "gif?size=4096&_=.gif" + : "png?size=4096" }`; if (avatarURL) { @@ -1479,7 +1479,7 @@ appinfo.callback = async function (msg, line) { if (app.icon) { embed.thumbnail = { - url: `${APP_ICON_BASE}${app.id}/${app.icon}.png?size=1024`, + url: `${APP_ICON_BASE}${app.id}/${app.icon}.png?size=4096`, }; } @@ -1871,6 +1871,26 @@ guildinfo.callback = async function (msg, line) { : "Only Mentions", inline: true, }, + guild.rulesChannelID && { + name: "Rules", + value: `<#${guild.rulesChannelID}>`, + inline: true, + }, + guild.systemChannelID && { + name: "System Messages", + value: `<#${guild.systemChannelID}>`, + inline: true, + }, + guild.publicUpdatesChannelID && { + name: "Community Updates", + value: `<#${guild.publicUpdatesChannelID}>`, + inline: true, + }, + guild.safetyAlertsChannelID && { + name: "Safety Alerts", + value: `<#${guild.safetyAlertsChannelID}>`, + inline: true, + }, { name: `Channels (${guild.channels.size})`, value: @@ -1922,49 +1942,12 @@ guildinfo.callback = async function (msg, line) { embed.thumbnail = { url: `${ICON_BASE}${guild.id}/${guild.icon}.${ guild.icon.startsWith("a_") - ? "gif?size=1024&_=.gif" - : "png?size=1024" + ? "gif?size=4096&_=.gif" + : "png?size=4096" }`, }; } - if (guild.systemChannelID) { - embed.fields.push({ - name: "System Messages", - value: `#${guild.channels.get(guild.systemChannelID).name} (\`${ - guild.systemChannelID - }\`)`, - inline: true, - }); - } - if (guild.rulesChannelID) { - embed.fields.push({ - name: "Rules", - value: `#${guild.channels.get(guild.rulesChannelID).name} (\`${ - guild.rulesChannelID - }\`)`, - inline: true, - }); - } - if (guild.publicUpdatesChannelID) { - embed.fields.push({ - name: "Community Updates", - value: `#${ - guild.channels.get(guild.publicUpdatesChannelID).name - } (\`${guild.publicUpdatesChannelID}\`)`, - inline: true, - }); - } - if (guild.safetyAlertsChannelID) { - embed.fields.push({ - name: "Safety Alerts", - value: `#${guild.channels.get(guild.safetyAlertsChannelID).name} (\`${ - guild.safetyAlertsChannelID - }\`)`, - inline: true, - }); - } - const members = Array.from(guild.members.values()); const online = members.filter( (member) => member.status != null && member.status != "offline" @@ -2038,13 +2021,330 @@ guildinfo.callback = async function (msg, line) { return {embed}; } case "preview": { - return "TODO: guild from preview"; + const embed = { + title: guild.name, + description: guild.description ?? "*No description.*", + fields: [ + { + name: "Created", + value: ``, + inline: true, + }, + { + name: `Emotes (${guild.emojis.length})`, + value: `${ + guild.emojis.filter((e) => e.animated).length + } animated, ${ + guild.emojis.filter((e) => e.managed).length + } managed\n${ + guild.emojis.filter((e) => !e.available).length + } unavailable`, + inline: true, + }, + { + name: `Stickers (${guild.stickers.length})`, + value: `${ + guild.stickers.filter((s) => s.format_type == 1).length + } PNG, ${ + guild.stickers.filter((s) => s.format_type == 2).length + } APNG, ${ + guild.stickers.filter((s) => s.format_type == 4).length + } GIF, ${ + guild.stickers.filter((s) => s.format_type == 3).length + } Lottie\n${ + guild.stickers.filter((s) => !s.available).length + } unavailable`, + inline: true, + }, + ], + footer: { + text: "Fetched from guild preview", + }, + }; + + if (guild.icon) { + embed.thumbnail = { + url: `${ICON_BASE}${guild.id}/${guild.icon}.${ + guild.icon.startsWith("a_") + ? "gif?size=4096&_=.gif" + : "png?size=4096" + }`, + }; + } + + embed.fields.push({ + name: "Member Count", + value: `<:online:1152111668856361010>${guild.approximate_presence_count} online\t\t<:offline:1152111682886316042>${guild.approximate_member_count} members`, + inline: false, + }); + + const features = guild.features.sort().map( + (feature) => + (GUILD_FEATURES[feature]?.icon ?? "\u2753") + + " " + + (GUILD_FEATURES[feature]?.name ?? + feature + .split("_") + .map((x) => x[0] + x.substring(1).toLowerCase()) + .join(" ")) + ); + + embed.fields.push({ + name: `Features (${features.length})`, + value: + features.length > 0 + ? features.slice(0, Math.ceil(features.length / 2)).join("\n") + : "None", + inline: true, + }); + if (features.length > 1) + embed.fields.push({ + name: "\u200b", + value: features + .slice(Math.ceil(features.length / 2), features.length) + .join("\n"), + inline: true, + }); + + const images = []; + if (guild.icon) { + images.push(`[Icon](${embed.thumbnail.url})`); + } + if (guild.splash) { + images.push( + `[Invite Splash](${SPLASH_BASE}${guild.id}/${guild.splash}.png?size=4096)` + ); + } + if (guild.discovery_splash) { + images.push( + `[Discovery Splash](${DISCOVERY_SPLASH_BASE}${guild.id}/${guild.discoverySplash}.png?size=4096)` + ); + } + + if (images.length > 0) { + embed.fields.push({ + name: "\u200b", + value: images.join(" | "), + inline: false, + }); + } + + return {embed}; } case "discovery": { - return "TODO: guild from discovery"; + if (!guild.store_page) { + return "Got discovery data but no store page."; + } + + const guildObj = guild.store_page.guild; + + let invite; + if ( + guildObj.invite?.code || + guild.store_page.role_subscription.purchase_page_invite?.code + ) { + const code = + guildObj.invite?.code ?? + guild.store_page.role_subscription.purchase_page_invite?.code; + invite = await hf.bot.requestHandler.request( + "GET", + `/invites/${code}?with_counts=true&with_expiration=true` + ); + } + + const embed = { + title: guildObj.name, + description: invite?.guild?.description ?? "*No description.*", + fields: [ + { + name: "Created", + value: ``, + inline: true, + }, + ], + footer: { + text: "Fetched from discovery" + (invite ? " + invite" : ""), + }, + }; + + if (guildObj.icon_hash) { + embed.thumbnail = { + url: `${ICON_BASE}${guildObj.id}/${guildObj.icon_hash}.${ + guildObj.icon_hash.startsWith("a_") + ? "gif?size=4096&_=.gif" + : "png?size=4096" + }`, + }; + } + + const invites = []; + if (guildObj.invite?.code) invites.push(guildObj.invite.code); + if (guild.store_page.role_subscription.purchase_page_invite?.code) + invites.push( + guild.store_page.role_subscription.purchase_page_invite.code + ); + + if (invites.length > 0) { + embed.fields.push({ + name: "Invites", + value: invites.map((code) => "https://discord.gg/" + code).join("\n"), + inline: true, + }); + } + + embed.fields.push({ + name: "Member Count", + value: `<:online:1152111668856361010>${guildObj.approximate_presence_count} online\t\t<:offline:1152111682886316042>${guildObj.approximate_member_count} members`, + inline: false, + }); + + if (invite?.guild?.features) { + const features = invite.guild.features.sort().map( + (feature) => + (GUILD_FEATURES[feature]?.icon ?? "\u2753") + + " " + + (GUILD_FEATURES[feature]?.name ?? + feature + .split("_") + .map((x) => x[0] + x.substring(1).toLowerCase()) + .join(" ")) + ); + + embed.fields.push({ + name: `Features (${features.length})`, + value: + features.length > 0 + ? features.slice(0, Math.ceil(features.length / 2)).join("\n") + : "None", + inline: true, + }); + if (features.length > 1) + embed.fields.push({ + name: "\u200b", + value: features + .slice(Math.ceil(features.length / 2), features.length) + .join("\n"), + inline: true, + }); + } + + const images = []; + if (guildObj.icon_hash) { + images.push(`[Icon](${embed.thumbnail.url})`); + } + if (invite?.guild?.splash) { + images.push( + `[Invite Splash](${SPLASH_BASE}${guild.id}/${guild.splash}.png?size=4096)` + ); + } + if (invite?.guild?.banner) { + images.push( + `[Banner](${BANNER_BASE}${guild.id}/${guild.banner}.png?size=4096)` + ); + } + + if (images.length > 0) { + embed.fields.push({ + name: "\u200b", + value: images.join(" | "), + inline: false, + }); + } + + return {embed}; } case "widget": { - return "TODO: guild from widget"; + let invite; + if (guild.instant_invite) { + invite = await hf.bot.requestHandler.request( + "GET", + `/invites/${guild.instant_invite}?with_counts=true&with_expiration=true` + ); + } + + const embed = { + title: guild.name, + description: invite?.guild?.description ?? "*No description.*", + fields: [ + { + name: "Created", + value: ``, + inline: true, + }, + ], + footer: { + text: "Fetched from widget" + (invite ? " + invite" : ""), + }, + }; + + if (invite) { + embed.fields.push({ + name: "Member Count", + value: `<:online:1152111668856361010>${invite.approximate_presence_count} online\t\t<:offline:1152111682886316042>${invite.approximate_member_count} members`, + inline: false, + }); + + const features = invite.guild.features.sort().map( + (feature) => + (GUILD_FEATURES[feature]?.icon ?? "\u2753") + + " " + + (GUILD_FEATURES[feature]?.name ?? + feature + .split("_") + .map((x) => x[0] + x.substring(1).toLowerCase()) + .join(" ")) + ); + + embed.fields.push({ + name: `Features (${features.length})`, + value: + features.length > 0 + ? features.slice(0, Math.ceil(features.length / 2)).join("\n") + : "None", + inline: true, + }); + if (features.length > 1) + embed.fields.push({ + name: "\u200b", + value: features + .slice(Math.ceil(features.length / 2), features.length) + .join("\n"), + inline: true, + }); + + const images = []; + if (invite.guild.icon) { + images.push(`[Icon](${embed.thumbnail.url})`); + } + if (invite.guild.splash) { + images.push( + `[Invite Splash](${SPLASH_BASE}${guild.id}/${guild.splash}.png?size=4096)` + ); + } + if (invite.guild.banner) { + images.push( + `[Banner](${BANNER_BASE}${guild.id}/${guild.banner}.png?size=4096)` + ); + } + + if (images.length > 0) { + embed.fields.push({ + name: "\u200b", + value: images.join(" | "), + inline: false, + }); + } + } else { + embed.fields.push({ + name: "Member Count", + value: `<:online:1152111668856361010>${guild.presence_count} online`, + inline: false, + }); + } + + return embed; } default: return "Guild not found.";