diff options
-rw-r--r-- | src/commands/admin/roleAll.ts | 3 | ||||
-rw-r--r-- | src/commands/info/ping.ts | 41 | ||||
-rw-r--r-- | src/commands/leveling/levelRoles.ts | 2 | ||||
-rw-r--r-- | src/commands/leveling/setLevel.ts | 13 | ||||
-rw-r--r-- | src/commands/leveling/setXp.ts | 11 | ||||
-rw-r--r-- | src/commands/moulberry-bush/moulHammer.ts | 7 | ||||
-rw-r--r-- | src/commands/moulberry-bush/rule.ts | 33 | ||||
-rw-r--r-- | src/lib/extensions/discord-akairo/BushClientUtil.ts | 12 |
8 files changed, 58 insertions, 64 deletions
diff --git a/src/commands/admin/roleAll.ts b/src/commands/admin/roleAll.ts index fdf153a..7cb7346 100644 --- a/src/commands/admin/roleAll.ts +++ b/src/commands/admin/roleAll.ts @@ -1,4 +1,5 @@ import { AllowedMentions, BushCommand, type ArgType, type BushMessage, type BushSlashMessage } from '#lib'; +import assert from 'assert'; import { ApplicationCommandOptionType, PermissionFlagsBits, type GuildMember } from 'discord.js'; export default class RoleAllCommand extends BushCommand { @@ -39,7 +40,7 @@ export default class RoleAllCommand extends BushCommand { } public override async exec(message: BushMessage | BushSlashMessage, args: { role: ArgType<'role'>; bots: ArgType<'boolean'> }) { - if (!message.inGuild()) return await message.util.reply(`${util.emojis.error} This command can only be run in a server.`); + assert(message.inGuild()); if (!message.member!.permissions.has(PermissionFlagsBits.Administrator) && !message.member!.user.isOwner()) return await message.util.reply(`${util.emojis.error} You must have admin perms to use this command.`); if (message.util.isSlashMessage(message)) await message.interaction.deferReply(); diff --git a/src/commands/info/ping.ts b/src/commands/info/ping.ts index 086a77a..af0fa98 100644 --- a/src/commands/info/ping.ts +++ b/src/commands/info/ping.ts @@ -1,5 +1,5 @@ import { BushCommand, type BushMessage, type BushSlashMessage } from '#lib'; -import { EmbedBuilder, PermissionFlagsBits, type Message } from 'discord.js'; +import { EmbedBuilder, PermissionFlagsBits } from 'discord.js'; export default class PingCommand extends BushCommand { public constructor() { @@ -16,41 +16,32 @@ export default class PingCommand extends BushCommand { } public override async exec(message: BushMessage) { - const sentMessage = (await message.util.send('Pong!')) as Message; - const timestamp: number = message.editedTimestamp ? message.editedTimestamp : message.createdTimestamp; - const botLatency = `${'```'}\n ${Math.round(sentMessage.createdTimestamp - timestamp)}ms ${'```'}`; - const apiLatency = `${'```'}\n ${Math.round(message.client.ws.ping)}ms ${'```'}`; - const embed = new EmbedBuilder() - .setTitle('Pong! 🏓') - .addFields([ - { name: 'Bot Latency', value: botLatency, inline: true }, - { name: 'API Latency', value: apiLatency, inline: true } - ]) - .setFooter({ text: message.author.username, iconURL: message.author.displayAvatarURL() }) - .setColor(util.colors.default) - .setTimestamp(); - await sentMessage.edit({ - content: null, - embeds: [embed] - }); + const timestamp1 = message.editedTimestamp ? message.editedTimestamp : message.createdTimestamp; + const msg = await message.util.reply('Pong!'); + const timestamp2 = msg.editedTimestamp ? msg.editedTimestamp : msg.createdTimestamp; + void this.command(message, timestamp2 - timestamp1); } public override async execSlash(message: BushSlashMessage) { - const timestamp1 = message.interaction.createdTimestamp; - await message.interaction.reply('Pong!'); - const timestamp2 = await message.interaction.fetchReply().then((m) => (m as Message).createdTimestamp); - const botLatency = `${'```'}\n ${Math.round(timestamp2 - timestamp1)}ms ${'```'}`; - const apiLatency = `${'```'}\n ${Math.round(client.ws.ping)}ms ${'```'}`; + const timestamp1 = message.createdTimestamp; + const msg = (await message.util.reply({ content: 'Pong!', fetchReply: true })) as BushMessage; + const timestamp2 = msg.editedTimestamp ? msg.editedTimestamp : msg.createdTimestamp; + void this.command(message, timestamp2 - timestamp1); + } + + private command(message: BushMessage | BushSlashMessage, msgLatency: number) { + const botLatency = util.format.codeBlock(`${Math.round(msgLatency)}ms`); + const apiLatency = util.format.codeBlock(`${Math.round(message.client.ws.ping)}ms`); const embed = new EmbedBuilder() .setTitle('Pong! 🏓') .addFields([ { name: 'Bot Latency', value: botLatency, inline: true }, { name: 'API Latency', value: apiLatency, inline: true } ]) - .setFooter({ text: message.interaction.user.username, iconURL: message.interaction.user.displayAvatarURL() }) + .setFooter({ text: message.author.username, iconURL: message.author.displayAvatarURL() }) .setColor(util.colors.default) .setTimestamp(); - await message.interaction.editReply({ + return message.util.reply({ content: null, embeds: [embed] }); diff --git a/src/commands/leveling/levelRoles.ts b/src/commands/leveling/levelRoles.ts index 6886337..9fe7dd0 100644 --- a/src/commands/leveling/levelRoles.ts +++ b/src/commands/leveling/levelRoles.ts @@ -49,7 +49,7 @@ export default class LevelRolesCommand extends BushCommand { return await reply(`${util.emojis.error} This command can only be run in servers with the leveling feature enabled.`); } - if (args.level < 1) return await reply(`${util.emojis.error} You cannot set a level role less that 1.`); + if (args.level < 1) return await reply(`${util.emojis.error} You cannot set a level role less than **1**.`); if (args.role) { if (args.role.managed) diff --git a/src/commands/leveling/setLevel.ts b/src/commands/leveling/setLevel.ts index 30bbb72..ac7df57 100644 --- a/src/commands/leveling/setLevel.ts +++ b/src/commands/leveling/setLevel.ts @@ -45,18 +45,11 @@ export default class SetLevelCommand extends BushCommand { if (isNaN(level) || !Number.isInteger(level)) return await message.util.reply(`${util.emojis.error} Provide a valid number to set the user's level to.`); if (level > 6553 || level < 0) - return await message.util.reply(`${util.emojis.error} You cannot set a level higher than **6553**.`); + return await message.util.reply(`${util.emojis.error} You cannot set a level higher than **6,553**.`); const [levelEntry] = await Level.findOrBuild({ - where: { - user: user.id, - guild: message.guild.id - }, - defaults: { - user: user.id, - guild: message.guild.id, - xp: 0 - } + where: { user: user.id, guild: message.guild.id }, + defaults: { user: user.id, guild: message.guild.id, xp: 0 } }); await levelEntry.update({ xp: Level.convertLevelToXp(level), user: user.id, guild: message.guild.id }); return await message.util.send({ diff --git a/src/commands/leveling/setXp.ts b/src/commands/leveling/setXp.ts index e26cdcc..1f7c981 100644 --- a/src/commands/leveling/setXp.ts +++ b/src/commands/leveling/setXp.ts @@ -50,17 +50,12 @@ export default class SetXpCommand extends BushCommand { ); const [levelEntry] = await Level.findOrBuild({ - where: { - user: user.id, - guild: message.guild.id - }, - defaults: { - user: user.id, - guild: message.guild.id - } + where: { user: user.id, guild: message.guild.id }, + defaults: { user: user.id, guild: message.guild.id } }); await levelEntry.update({ xp: xp, user: user.id, guild: message.guild.id }); + return await message.util.send({ content: `Successfully set <@${user.id}>'s xp to ${util.format.input( levelEntry.xp.toLocaleString() diff --git a/src/commands/moulberry-bush/moulHammer.ts b/src/commands/moulberry-bush/moulHammer.ts index 7a5a91c..a5d2c27 100644 --- a/src/commands/moulberry-bush/moulHammer.ts +++ b/src/commands/moulberry-bush/moulHammer.ts @@ -1,4 +1,5 @@ import { BushCommand, type ArgType, type BushMessage, type BushSlashMessage } from '#lib'; +import assert from 'assert'; import { ApplicationCommandOptionType, EmbedBuilder, PermissionFlagsBits } from 'discord.js'; export default class MoulHammerCommand extends BushCommand { @@ -20,6 +21,7 @@ export default class MoulHammerCommand extends BushCommand { } ], slash: true, + channel: 'guild', slashGuilds: ['516977525906341928'], restrictedGuilds: ['516977525906341928'], clientPermissions: (m) => util.clientSendAndPermCheck(m, [PermissionFlagsBits.EmbedLinks], true), @@ -28,7 +30,10 @@ export default class MoulHammerCommand extends BushCommand { } public override async exec(message: BushMessage | BushSlashMessage, { user }: { user: ArgType<'user'> }) { - await message.delete(); + assert(message.inGuild()); + + if (message.channel.permissionsFor(message.guild.members.me!).has('ManageMessages')) await message.delete().catch(() => {}); + const embed = new EmbedBuilder() .setTitle('L') .setDescription(`${user.username} got moul'ed <:wideberry1:756223352598691942><:wideberry2:756223336832303154>`) diff --git a/src/commands/moulberry-bush/rule.ts b/src/commands/moulberry-bush/rule.ts index df6ba88..cd9994f 100644 --- a/src/commands/moulberry-bush/rule.ts +++ b/src/commands/moulberry-bush/rule.ts @@ -1,21 +1,25 @@ import { AllowedMentions, BushCommand, BushSlashMessage, type BushMessage, type OptArgType } from '#lib'; import { ApplicationCommandOptionType, EmbedBuilder, PermissionFlagsBits } from 'discord.js'; +import { stripIndent } from '../../lib/common/tags.js'; const rules = [ { title: "1.) Follow Discord's TOS", - description: - "Be sure to follow discord's TOS found at <https://discordapp.com/tos>, you must be 13 to use discord so if you admit to being under 13 you will be banned from the server." + description: stripIndent` + Be sure to follow discord's TOS found at <https://discordapp.com/tos>,\ + you must be 13 to use discord so if you admit to being under 13 you will be banned from the server.` }, { title: '2.) Be Respectful', - description: - 'Racist, sexist, homophobic, xenophobic, transphobic, ableist, hate speech, slurs, or any other derogatory, toxic, or discriminatory behavior will not be tolerated.' + description: stripIndent` + Racist, sexist, homophobic, xenophobic, transphobic, ableist, hate speech, slurs, or any other derogatory, \ + toxic, or discriminatory behavior will not be tolerated.` }, { title: '3.) No Spamming', - description: - 'Including but not limited to: any messages that do not contribute to the conversation, repeated messages, linebreaking, randomly tagging users, and chat flood.' + description: stripIndent` + Including but not limited to: any messages that do not contribute to the conversation, repeated messages, \ + linebreaking, randomly tagging users, and chat flood.` }, { title: '4.) English', @@ -23,8 +27,9 @@ const rules = [ }, { title: '5.) Safe for Work', - description: - 'Please keep NSFW and NSFL content out of this server, avoid borderline images as well as keeping your status, profile picture, and banner SFW.' + description: stripIndent` + Please keep NSFW and NSFL content out of this server, avoid borderline images as well as keeping your status, \ + profile picture, and banner SFW.` }, { title: '6.) No Advertising', @@ -32,13 +37,14 @@ const rules = [ }, { title: '7.) Impersonation', - description: 'Do not try to impersonate others for the express intent of being deceitful, defamation , and/or personal gain.' + description: 'Do not try to impersonate others for the express intent of being deceitful, defamation, and/or personal gain.' }, { title: '8.) Swearing', description: 'Swearing is allowed only when not used as an insult.' }, { title: "9.) Sending media that are able to crash a user's Discord", - description: - "Sending videos, GIFs, emojis, etc. that are able to crash someone's discord will result in a **permanent** ban that cannot be appealed." + description: stripIndent` + Sending videos, GIFs, emojis, etc. that are able to crash someone's discord will result in a \ + **permanent** ban that cannot be appealed.` }, { title: '10.) No Backseat Moderating', @@ -46,8 +52,9 @@ const rules = [ }, { title: '11.) Staff may moderate at their discretion', - description: - 'If there are loopholes in our rules, the staff team may moderate based on what they deem appropriate. The staff team holds final discretion.' + description: stripIndent` + If there are loopholes in our rules, the staff team may moderate based on what they deem appropriate. \ + The staff team holds final discretion.` } ]; diff --git a/src/lib/extensions/discord-akairo/BushClientUtil.ts b/src/lib/extensions/discord-akairo/BushClientUtil.ts index c0df724..c5a5b30 100644 --- a/src/lib/extensions/discord-akairo/BushClientUtil.ts +++ b/src/lib/extensions/discord-akairo/BushClientUtil.ts @@ -579,11 +579,12 @@ export class BushClientUtil extends ClientUtil { * Converts a duration in milliseconds to a human readable form. * @param duration The duration in milliseconds to convert. * @param largest The maximum number of units to display for the duration. + * @param round Whether or not to round the smallest unit displayed. * @returns A humanized string of the duration. */ - public humanizeDuration(duration: number, largest?: number): string { - if (largest) return humanizeDuration(duration, { language: 'en', maxDecimalPoints: 2, largest })!; - else return humanizeDuration(duration, { language: 'en', maxDecimalPoints: 2 })!; + public humanizeDuration(duration: number, largest?: number, round = true): string { + if (largest) return humanizeDuration(duration, { language: 'en', maxDecimalPoints: 2, largest, round })!; + else return humanizeDuration(duration, { language: 'en', maxDecimalPoints: 2, round })!; } /** @@ -620,10 +621,11 @@ export class BushClientUtil extends ClientUtil { * Creates a human readable representation between a date and the current time. * @param date The date to be compared with the current time. * @param largest The maximum number of units to display for the duration. + * @param round Whether or not to round the smallest unit displayed. * @returns A humanized string of the delta. */ - public dateDelta(date: Date, largest?: number): string { - return this.humanizeDuration(new Date().getTime() - date.getTime(), largest ?? 3); + public dateDelta(date: Date, largest?: number, round = true): string { + return this.humanizeDuration(new Date().getTime() - date.getTime(), largest ?? 3, round); } /** |