From bb78a514cc969089ed824fd2f5a066bf045cfb11 Mon Sep 17 00:00:00 2001 From: bignutty <3515180-bignutty@users.noreply.gitlab.com> Date: Wed, 17 Jul 2024 21:36:21 +0200 Subject: [PATCH] - adds lc.banner - adds server/global toggle for lc.u - update special button icons to use icon() system - fix hypesquad badge in lc.u - Google -> Google Search --- commands/interaction/slash/utils/weather.js | 2 +- commands/message/info/avatar.js | 7 ++- commands/message/info/banner.js | 67 +++++++++++++++++++++ commands/message/info/user.js | 33 +++++++++- commands/message/search/bing.js | 2 +- commands/message/search/google.js | 4 +- commands/message/utils/weather.js | 2 +- labscore/constants.js | 8 ++- labscore/paginator/structures/Paginator.js | 5 +- labscore/utils/users.js | 28 ++++----- 10 files changed, 131 insertions(+), 27 deletions(-) create mode 100644 commands/message/info/banner.js diff --git a/commands/interaction/slash/utils/weather.js b/commands/interaction/slash/utils/weather.js index ec94324..cd63dd5 100644 --- a/commands/interaction/slash/utils/weather.js +++ b/commands/interaction/slash/utils/weather.js @@ -134,7 +134,7 @@ module.exports = { pages, buttons: [{ customId: "next", - emoji: "<:ico_button_thermometer:1262512806633144382>", + emoji: icon("button_thermometer"), label: `Toggle ${unitNames[units[0]]}/${unitNames[units[1]]}`, style: 2 }] diff --git a/commands/message/info/avatar.js b/commands/message/info/avatar.js index f3d74fb..12f9353 100644 --- a/commands/message/info/avatar.js +++ b/commands/message/info/avatar.js @@ -1,6 +1,7 @@ const { paginator } = require('#client'); const { createEmbed, page } = require("#utils/embed"); +const { icon } = require('#utils/markdown'); const { editOrReply } = require("#utils/message"); const { getUser } = require("#utils/users"); @@ -45,9 +46,9 @@ module.exports = { pages, buttons: [{ customId: "next", - emoji: "<:images:1063477061156605982>", - label: "Toggle Server/Profile", - style: 1 + emoji: icon("button_user_profile_swap"), + label: "Toggle Server/Global Avatar", + style: 2 }] }); } else { diff --git a/commands/message/info/banner.js b/commands/message/info/banner.js new file mode 100644 index 0000000..d2a8fd0 --- /dev/null +++ b/commands/message/info/banner.js @@ -0,0 +1,67 @@ +const { paginator } = require('#client'); + +const { createEmbed, page } = require("#utils/embed"); +const { icon } = require('#utils/markdown'); +const { editOrReply } = require("#utils/message"); +const { getUser } = require("#utils/users"); + +// TODO: Turn this into a general purpose permissions constant +const { Permissions } = require("detritus-client/lib/constants"); + +module.exports = { + name: 'banner', + label: 'user', + aliases: ['b'], + metadata: { + description: 'Displays someones profile banner. Accepts IDs, Mentions, or Usernames.', + description_short: 'Get discord user avatars', + examples: ['avatar labsCore'], + category: 'info', + usage: 'avatar []', + slashCommmand: 'banner' + }, + permissionsClient: [Permissions.EMBED_LINKS, Permissions.SEND_MESSAGES, Permissions.USE_EXTERNAL_EMOJIS, Permissions.READ_MESSAGE_HISTORY], + run: async (context, args) => { + context.triggerTyping(); + if(!args.user) args.user = context.userId; + let u = await getUser(context, args.user) + if(!u || !u.user) return editOrReply(context, createEmbed("warning", context, "No users found.")) + + if(!u.user.banner && !u.member?.banner) return editOrReply(context, createEmbed("warning", context, "User has no banners.")) + + let pages = [] + + if(!u.member?.banner && u.member) u.member = await context.guild.fetchMember(u.user.id) + + if(u.member?.banner) { + pages.push(page(createEmbed("default", context, { + image: { + url: `https://cdn.discordapp.com/guilds/${context.guild.id}/users/${u.member.id}/banners/${u.member.banner}.png` + "?size=4096" + } + }))) + + pages.push(page(createEmbed("default", context, { + image: { + url: u.user.bannerUrl + '?size=4096' + } + }))) + + await paginator.createPaginator({ + context, + pages, + buttons: [{ + customId: "next", + emoji: icon("button_user_profile_swap"), + label: "Toggle Server/Global Banner", + style: 2 + }] + }); + } else { + return editOrReply(context, createEmbed("default", context, { + image: { + url: u.user.bannerUrl + '?size=4096' + } + })) + } + }, +}; \ No newline at end of file diff --git a/commands/message/info/user.js b/commands/message/info/user.js index 2209cb4..a660b73 100644 --- a/commands/message/info/user.js +++ b/commands/message/info/user.js @@ -1,6 +1,7 @@ +const { paginator } = require("#client"); const { BADGE_ICONS } = require("#constants"); -const { createEmbed } = require("#utils/embed"); +const { createEmbed, page } = require("#utils/embed"); const { icon, highlight, timestamp, smallIconPill, smallPill } = require("#utils/markdown"); const { editOrReply } = require("#utils/message"); const { getUser, renderBadges } = require("#utils/users"); @@ -45,6 +46,8 @@ module.exports = { if(u.discriminator && u.discriminator !== "0") usernameDisplay += `#${u.discriminator}` usernameDisplay = `**@${usernameDisplay}**${botTag} ${highlight(`(${u.id})`)}` + + if(u.globalName !== null) usernameDisplay += `\n${smallIconPill("user_card", "Display Name")} ${smallPill(u.globalName)}` if(m && m.nick !== null) usernameDisplay += `\n${smallIconPill("user_card", "Nickname")} ${smallPill(m.nick)}` let userCard = createEmbed("default", context, { @@ -85,7 +88,33 @@ module.exports = { inline: true }) } - return editOrReply(context, userCard) + + + if(!u.member?.banner && u.member) u.member = await context.guild.fetchMember(u.user.id) + + // No special handling + if(m == undefined || m.avatar === null && m.banner === null) return editOrReply(context, userCard) + + let pages = []; + + let memberCard = structuredClone(userCard); + if(m?.avatar !== null) memberCard.thumbnail.url = m.avatarUrl + "?size=4096"; + if(m?.banner !== null) memberCard.image.url = `https://cdn.discordapp.com/guilds/${context.guild.id}/users/${m.id}/banners/${m.banner}.png` + "?size=4096"; + + // Show the server-specific card first if available + pages.push(page(memberCard)) + pages.push(page(userCard)) + + await paginator.createPaginator({ + context, + pages, + buttons: [{ + customId: "next", + emoji: icon("button_user_profile_swap"), + label: "Toggle Server/Global Profile", + style: 2 + }] + }); }catch(e){ console.log(e) } diff --git a/commands/message/search/bing.js b/commands/message/search/bing.js index 2ca08d9..fe8898d 100644 --- a/commands/message/search/bing.js +++ b/commands/message/search/bing.js @@ -99,7 +99,7 @@ function createSearchResultPage(context, entry){ module.exports = { name: 'bing', label: 'query', - aliases: ['b', 'search2'], + aliases: ['search2'], metadata: { description: 'Returns search results from Microsoft Bing.', description_short: 'Search on Bing', diff --git a/commands/message/search/google.js b/commands/message/search/google.js index 5e6665d..1e7578c 100644 --- a/commands/message/search/google.js +++ b/commands/message/search/google.js @@ -12,12 +12,12 @@ const { Permissions } = require("detritus-client/lib/constants"); function renderFooter(context, doodle){ if(doodle.label) return { iconUrl: doodle.super_g, - text: `${doodle.label} • Google` + text: `${doodle.label} • Google Search` } return { iconUrl: STATICS.google, - text: `Google • ${context.application.name}` + text: `Google Search • ${context.application.name}` } } diff --git a/commands/message/utils/weather.js b/commands/message/utils/weather.js index 8882568..f23f0a2 100644 --- a/commands/message/utils/weather.js +++ b/commands/message/utils/weather.js @@ -108,7 +108,7 @@ module.exports = { pages, buttons: [{ customId: "next", - emoji: "<:ico_button_thermometer:1262512806633144382>", + emoji: icon("button_thermometer"), label: `Toggle ${unitNames[units[0]]}/${unitNames[units[1]]}`, style: 2 }] diff --git a/labscore/constants.js b/labscore/constants.js index 0aef400..7a97e21 100644 --- a/labscore/constants.js +++ b/labscore/constants.js @@ -58,7 +58,13 @@ module.exports.ICONS = Object.freeze({ "brand": "<:ico_brand:1237843729880977459>", "flask_mini": "<:ico_flask_mini:1260342544600928286>", - "subtext_lightbulb": "<:ico_subt_lightbulb:1262470784224591934>", + "subtext_lightbulb": "<:ico_subt_lightbulb:1263199767140237342>", + + "button_thermometer": "<:ico_button_thermometer:1262512806633144382>", + "button_user_profile_swap": "<:ico_button_user_profile_swap:1263198564528685188>", + + "button_chevron_left": "<:button_chevron_left:1263214273640009749>", + "button_chevron_right": "<:button_chevron_right:1263214275829436507>", "home": "<:ico_home:1165257185488551976>", "image": "<:ico_image:1165257188235825274>", diff --git a/labscore/paginator/structures/Paginator.js b/labscore/paginator/structures/Paginator.js index f14e800..8550923 100644 --- a/labscore/paginator/structures/Paginator.js +++ b/labscore/paginator/structures/Paginator.js @@ -1,3 +1,4 @@ +const { icon } = require("#utils/markdown"); const InteractionPaginator = require("./InteractionPaginator"); const assert = require("assert"); @@ -10,8 +11,8 @@ const allowedEvents = new Set([ ]); const ButtonEmoji = Object.freeze({ - NEXT: '<:right:977871577758707782>', - PREVIOUS: '<:left:977871577532211200>', + NEXT: icon("button_chevron_right"), + PREVIOUS: icon("button_chevron_left"), STOP: '<:ico_trash:929498022386221096>', SEARCH: '<:search:1063080546365866056>', UNKNOWN: '<:ico_question:949420315677691934>' diff --git a/labscore/utils/users.js b/labscore/utils/users.js index b2b9578..5f3cbe4 100644 --- a/labscore/utils/users.js +++ b/labscore/utils/users.js @@ -60,7 +60,7 @@ const BADGE_TYPES = Object.freeze({ "hypesquad": { description: "HypeSquad Events", link: "https://discord.com/hypesquad", - icon: BADGE_ICONS.hypesquad + icon: BADGE_ICONS.hypesquad_events }, "hypesquad_house_1": { description: "HypeSquad Bravery", @@ -105,23 +105,23 @@ const BADGE_TYPES = Object.freeze({ }) const BADGES = Object.freeze({ - [UserFlags.STAFF]: 'staff', - [UserFlags.PARTNER]: 'partner', - [UserFlags.DISCORD_CERTIFIED_MODERATOR]: 'certified_moderator', - [UserFlags.HYPESQUAD]: 'hypesquad', - [UserFlags.HYPESQUAD_ONLINE_HOUSE_1]: 'hypesquad_house_1', - [UserFlags.HYPESQUAD_ONLINE_HOUSE_2]: 'hypesquad_house_2', - [UserFlags.HYPESQUAD_ONLINE_HOUSE_3]: 'hypesquad_house_3', - [UserFlags.BUG_HUNTER_LEVEL_1]: 'bug_hunter_level_1', - [UserFlags.BUG_HUNTER_LEVEL_2]: 'bug_hunter_level_2', - [1<<22]: 'active_developer', - [UserFlags.VERIFIED_DEVELOPER]: 'verified_developer', - [UserFlags.PREMIUM_EARLY_SUPPORTER]: 'early_supporter', + "staff": UserFlags.STAFF, + "partner": UserFlags.PARTNER, + "certified_moderator": UserFlags.DISCORD_CERTIFIED_MODERATOR, + "hypesquad": UserFlags.HYPESQUAD, + "hypesquad_house_1": UserFlags.HYPESQUAD_ONLINE_HOUSE_1, + "hypesquad_house_2": UserFlags.HYPESQUAD_ONLINE_HOUSE_2, + "hypesquad_house_3": UserFlags.HYPESQUAD_ONLINE_HOUSE_3, + "bug_hunter_level_1": UserFlags.BUG_HUNTER_LEVEL_1, + "bug_hunter_level_2": UserFlags.BUG_HUNTER_LEVEL_2, + "active_developer": UserFlags.ACTIVE_DEVELOPER, + "verified_developer": UserFlags.VERIFIED_DEVELOPER, + "early_supporter": UserFlags.PREMIUM_EARLY_SUPPORTER }) function renderBadges(user){ let badges = []; - for(const flag of Object.keys(BADGES)) if(user.hasFlag(parseInt(flag))) badges.push(BADGE_TYPES[BADGES[flag]].icon) + for(const flag of Object.keys(BADGES)) if(user.hasFlag(BADGES[flag])) badges.push(BADGE_TYPES[flag].icon) return badges; }