diff --git a/package-lock.json b/package-lock.json index 4132717f9..83182515d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "modbot", - "version": "3.4.4", + "version": "3.4.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "modbot", - "version": "3.4.4", + "version": "3.4.5", "license": "MIT", "dependencies": { "@google-cloud/logging": "^10.4.0", @@ -194,14 +194,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@fastify/busboy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", - "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", - "engines": { - "node": ">=14" - } - }, "node_modules/@google-cloud/common": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-4.0.3.tgz", @@ -739,6 +731,17 @@ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, "node_modules/cacheable-lookup": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", @@ -2932,6 +2935,14 @@ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -3097,11 +3108,11 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/undici": { - "version": "5.26.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.3.tgz", - "integrity": "sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==", + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", + "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", "dependencies": { - "@fastify/busboy": "^2.0.0" + "busboy": "^1.6.0" }, "engines": { "node": ">=14.0" diff --git a/package.json b/package.json index 927e1256d..bad1718bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "modbot", - "version": "3.4.4", + "version": "3.4.5", "description": "Discord Bot for the Aternos Discord server", "main": "index.js", "type": "module", diff --git a/src/commands/settings/SettingsOverviewCommand.js b/src/commands/settings/SettingsOverviewCommand.js index 2d80ec432..013e883be 100644 --- a/src/commands/settings/SettingsOverviewCommand.js +++ b/src/commands/settings/SettingsOverviewCommand.js @@ -1,7 +1,8 @@ import SubCommand from '../SubCommand.js'; import GuildSettings from '../../settings/GuildSettings.js'; import {ActionRowBuilder, ButtonBuilder, ButtonStyle} from 'discord.js'; -import config from '../../bot/Config.js'; +import {componentEmojiIfExists} from '../../util/format.js'; +import icons from '../../util/icons.js'; export default class SettingsOverviewCommand extends SubCommand { @@ -35,7 +36,7 @@ export default class SettingsOverviewCommand extends SubCommand { .setLabel('Refresh') .setStyle(ButtonStyle.Secondary) .setCustomId('settings:overview') - .setEmoji(config.data.emoji.refresh ?? {}) + .setEmoji(componentEmojiIfExists('refresh', icons.refresh)) ) ] }; diff --git a/src/commands/user/UserInfoCommand.js b/src/commands/user/UserInfoCommand.js index 4bae79801..0601ce719 100644 --- a/src/commands/user/UserInfoCommand.js +++ b/src/commands/user/UserInfoCommand.js @@ -1,5 +1,5 @@ import Command from '../Command.js'; -import {ActionRowBuilder, ButtonBuilder, ButtonStyle, PermissionFlagsBits, PermissionsBitField, time, TimestampStyles} from 'discord.js'; +import {ActionRowBuilder, ButtonStyle, PermissionFlagsBits, PermissionsBitField, time, TimestampStyles} from 'discord.js'; import GuildWrapper from '../../discord/GuildWrapper.js'; import MemberWrapper from '../../discord/MemberWrapper.js'; import UserWrapper from '../../discord/UserWrapper.js'; @@ -7,6 +7,7 @@ import colors from '../../util/colors.js'; import UserEmbed from '../../embeds/UserEmbed.js'; import ErrorEmbed from '../../embeds/ErrorEmbed.js'; import {componentEmojiIfExists, inlineEmojiIfExists} from '../../util/format.js'; +import BetterButtonBuilder from '../../embeds/BetterButtonBuilder.js'; export default class UserInfoCommand extends Command { @@ -74,39 +75,39 @@ export default class UserInfoCommand extends Command { /** @type {ActionRowBuilder} */ const actionRow = new ActionRowBuilder() .addComponents( - /** @type {*} */ new ButtonBuilder() + /** @type {*} */ new BetterButtonBuilder() .setLabel('Strike') .setCustomId(`strike:${user.id}`) .setStyle(ButtonStyle.Danger) - .setEmoji(componentEmojiIfExists('strike')), + .setEmojiIfPresent(componentEmojiIfExists('strike')), ); const informationRow = new ActionRowBuilder() .addComponents( - /** @type {*} */ new ButtonBuilder() + /** @type {*} */ new BetterButtonBuilder() .setLabel('Refresh') .setCustomId(`user:refresh:${user.id}`) .setStyle(ButtonStyle.Secondary) - .setEmoji(componentEmojiIfExists('refresh')), - /** @type {*} */ new ButtonBuilder() + .setEmojiIfPresent(componentEmojiIfExists('refresh')), + /** @type {*} */ new BetterButtonBuilder() .setLabel('Avatar') .setCustomId(`avatar:${user.id}`) .setStyle(ButtonStyle.Secondary) - .setEmoji(componentEmojiIfExists('avatar')), - /** @type {*} */ new ButtonBuilder() + .setEmojiIfPresent(componentEmojiIfExists('avatar')), + /** @type {*} */ new BetterButtonBuilder() .setLabel('Moderations') .setCustomId(`moderation:list:${user.id}`) .setStyle(ButtonStyle.Secondary) - .setEmoji(componentEmojiIfExists('moderations')), + .setEmojiIfPresent(componentEmojiIfExists('moderations')), ); if (member) { embed.addPair(inlineEmojiIfExists('userJoined') + 'Joined', time(member.joinedAt, TimestampStyles.LongDate)); actionRow.addComponents( - /** @type {*} */ new ButtonBuilder() + /** @type {*} */ new BetterButtonBuilder() .setLabel('Kick') .setCustomId(`kick:${user.id}`) .setStyle(ButtonStyle.Danger) - .setEmoji(componentEmojiIfExists('kick')) + .setEmojiIfPresent(componentEmojiIfExists('kick')) ); } @@ -116,11 +117,11 @@ export default class UserInfoCommand extends Command { .addPair(inlineEmojiIfExists('strike') + ' Strike count', strikeCount); if (strikeCount) { actionRow.addComponents( - /** @type {*} */ new ButtonBuilder() + /** @type {*} */ new BetterButtonBuilder() .setLabel('Pardon') .setCustomId(`pardon:${user.id}`) .setStyle(ButtonStyle.Success) - .setEmoji(componentEmojiIfExists('pardon')) + .setEmojiIfPresent(componentEmojiIfExists('pardon')) ); } } @@ -133,21 +134,21 @@ export default class UserInfoCommand extends Command { embed.addPair(inlineEmojiIfExists('mute') + 'Muted until', time(Math.floor(mute.end / 1_000))); } actionRow.addComponents( - /** @type {*} */ new ButtonBuilder() + /** @type {*} */ new BetterButtonBuilder() .setLabel('Unmute') .setCustomId(`unmute:${user.id}`) .setStyle(ButtonStyle.Success) - .setEmoji(componentEmojiIfExists('mute')) + .setEmojiIfPresent(componentEmojiIfExists('mute')) ); embed.setColor(colors.ORANGE); } else { actionRow.addComponents( - /** @type {*} */ new ButtonBuilder() + /** @type {*} */ new BetterButtonBuilder() .setLabel('Mute') .setCustomId(`mute:${user.id}`) .setStyle(ButtonStyle.Danger) - .setEmoji(componentEmojiIfExists('mute')) + .setEmojiIfPresent(componentEmojiIfExists('mute')) ); } } @@ -160,21 +161,21 @@ export default class UserInfoCommand extends Command { embed.addPair(inlineEmojiIfExists('ban') + 'Banned until', time(Math.floor(ban.end / 1_000))); } actionRow.addComponents( - /** @type {*} */ new ButtonBuilder() + /** @type {*} */ new BetterButtonBuilder() .setLabel('Unban') .setCustomId(`unban:${user.id}`) .setStyle(ButtonStyle.Success) - .setEmoji(componentEmojiIfExists('ban')) + .setEmojiIfPresent(componentEmojiIfExists('ban')) ); embed.setColor(colors.RED); } else { actionRow.addComponents( - /** @type {*} */ new ButtonBuilder() + /** @type {*} */ new BetterButtonBuilder() .setLabel('Ban') .setCustomId(`ban:${user.id}`) .setStyle(ButtonStyle.Danger) - .setEmoji(componentEmojiIfExists('ban')) + .setEmojiIfPresent(componentEmojiIfExists('ban')) ); } } diff --git a/src/embeds/BetterButtonBuilder.js b/src/embeds/BetterButtonBuilder.js new file mode 100644 index 000000000..078eaf618 --- /dev/null +++ b/src/embeds/BetterButtonBuilder.js @@ -0,0 +1,18 @@ +import {ButtonBuilder} from 'discord.js'; + +export default class BetterButtonBuilder extends ButtonBuilder { + /** + * Set the emoji for this button. + * If the emoji parameter is null, don't change the emoji. + * + * @param {?import('discord.js').ComponentEmojiResolvable} emoji + * @return {ButtonBuilder|BetterButtonBuilder} + */ + setEmojiIfPresent(emoji) { + if (!emoji) { + return this; + } + + return super.setEmoji(emoji); + } +} \ No newline at end of file diff --git a/src/util/format.js b/src/util/format.js index 54cbe1e73..87ac94f51 100644 --- a/src/util/format.js +++ b/src/util/format.js @@ -47,16 +47,19 @@ export function formatNumber(number, name) { } /** - * @param {string} configKey - * @param {?string} fallback - * @return {import('discord.js').APIMessageComponentEmoji} + * @param {string} configKey name of the emoji in the config + * @param {?string} fallback emoji character to use if the config key is not set + * @return {?import('discord.js').APIMessageComponentEmoji} */ export function componentEmojiIfExists(configKey, fallback = null) { const emoji = config.data.emoji[configKey]; - if (!emoji) { - return {name: fallback ?? undefined}; - } - else { + if (emoji) { return {id: emoji}; } + + if (fallback) { + return {name: fallback}; + } + + return null; } \ No newline at end of file