diff options
author | IRONM00N <64110067+IRONM00N@users.noreply.github.com> | 2022-01-01 08:53:23 -0500 |
---|---|---|
committer | IRONM00N <64110067+IRONM00N@users.noreply.github.com> | 2022-01-01 08:53:23 -0500 |
commit | e0ae0639d0b36c3cfd4065f791b95a32c1d7ea64 (patch) | |
tree | 46547b51ad50b0a7a73fbc848ad643f8736399ae /src/commands | |
parent | cbb68773614e44eb246e4cf2ff0d64d3e90f620f (diff) | |
download | tanzanite-e0ae0639d0b36c3cfd4065f791b95a32c1d7ea64.tar.gz tanzanite-e0ae0639d0b36c3cfd4065f791b95a32c1d7ea64.tar.bz2 tanzanite-e0ae0639d0b36c3cfd4065f791b95a32c1d7ea64.zip |
added autocomplete to a few commands and performed some fixes
Diffstat (limited to 'src/commands')
-rw-r--r-- | src/commands/config/log.ts | 2 | ||||
-rw-r--r-- | src/commands/dev/eval.ts | 120 | ||||
-rw-r--r-- | src/commands/dev/javascript.ts | 12 | ||||
-rw-r--r-- | src/commands/info/color.ts | 2 | ||||
-rw-r--r-- | src/commands/info/help.ts | 28 | ||||
-rw-r--r-- | src/commands/moulberry-bush/capes.ts | 21 | ||||
-rw-r--r-- | src/commands/moulberry-bush/rule.ts | 41 | ||||
-rw-r--r-- | src/commands/utilities/activity.ts | 23 | ||||
-rw-r--r-- | src/commands/utilities/price.ts | 45 | ||||
-rw-r--r-- | src/commands/utilities/suicide.ts | 21 | ||||
-rw-r--r-- | src/commands/utilities/wolframAlpha.ts | 13 |
11 files changed, 162 insertions, 166 deletions
diff --git a/src/commands/config/log.ts b/src/commands/config/log.ts index ad3aacc..3072866 100644 --- a/src/commands/config/log.ts +++ b/src/commands/config/log.ts @@ -81,7 +81,7 @@ export default class LogCommand extends BushCommand { ? `${util.emojis.success} Successfully ${oldChannel ? 'changed' : 'set'}` : `${util.emojis.error} Unable to ${oldChannel ? 'change' : 'set'}` } ${ - oldChannel ? ` the **${args.log_type}** log channel from <#${oldChannel}>` : ` the \`${args.log_type}\` log channel` + oldChannel ? `the **${args.log_type}** log channel from <#${oldChannel}>` : `the **${args.log_type}** log channel` } to ${args.channel ? `<#${args.channel.id}>` : '`disabled`'}` ); } diff --git a/src/commands/dev/eval.ts b/src/commands/dev/eval.ts index ac114ea..5b2f27a 100644 --- a/src/commands/dev/eval.ts +++ b/src/commands/dev/eval.ts @@ -1,10 +1,45 @@ -import { BushCommand, type ArgType, type BushMessage, type BushSlashMessage } from '#lib'; +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { + ActivePunishment, + BushCommand, + BushMessage, + BushSlashMessage, + Global, + Guild, + Level, + ModLog, + StickyRole, + type ArgType +} from '#lib'; +import { Canvas } from 'canvas'; import { exec } from 'child_process'; -import { MessageEmbed as _MessageEmbed } from 'discord.js'; +import { + ButtonInteraction, + Collection, + Collector, + CommandInteraction, + ContextMenuInteraction, + DMChannel, + Emoji, + Interaction, + InteractionCollector, + Message, + MessageActionRow, + MessageAttachment, + MessageButton, + MessageCollector, + MessageEmbed, + MessageSelectMenu, + ReactionCollector, + Util +} from 'discord.js'; import ts from 'typescript'; import { promisify } from 'util'; - -const { transpile } = ts; +const { transpile } = ts, + emojis = util.emojis, + colors = util.colors, + sh = promisify(exec); +/* eslint-enable @typescript-eslint/no-unused-vars */ export default class EvalCommand extends BushCommand { public constructor() { @@ -21,8 +56,7 @@ export default class EvalCommand extends BushCommand { match: 'rest', prompt: 'What would you like to eval?', retry: '{error} Invalid code to eval.', - slashType: 'STRING', - only: 'slash' + slashType: 'STRING' }, { id: 'sel_depth', @@ -98,15 +132,6 @@ export default class EvalCommand extends BushCommand { prompt: 'Would you like to inspect the prototype chain to find methods?', slashType: 'BOOLEAN', optional: true - }, - { - id: 'code', - description: 'The code you would like to evaluate.', - match: 'rest', - prompt: 'What would you like to eval?', - retry: '{error} Invalid code to eval.', - slashType: 'STRING', - only: 'text' } ], slash: true, @@ -120,14 +145,14 @@ export default class EvalCommand extends BushCommand { message: BushMessage | BushSlashMessage, args: { sel_depth: ArgType<'integer'>; - code: string; - sudo: boolean; - silent: boolean; - deleteMSG: boolean; - typescript: boolean; - hidden: boolean; - show_proto: boolean; - show_methods: boolean; + code: ArgType<'string'>; + sudo: ArgType<'boolean'>; + silent: ArgType<'boolean'>; + deleteMSG: ArgType<'boolean'>; + typescript: ArgType<'boolean'>; + hidden: ArgType<'boolean'>; + show_proto: ArgType<'boolean'>; + show_methods: ArgType<'boolean'>; } ) { if (!message.author.isOwner()) @@ -135,16 +160,16 @@ export default class EvalCommand extends BushCommand { if (message.util.isSlashMessage(message)) { await message.interaction.deferReply({ ephemeral: args.silent }); } - const _isTypescript = args.typescript || args.code.includes('```ts'); - const _code = args.code.replace(/[“”]/g, '"').replace(/```*(?:js|ts)?/g, ''); + const isTypescript = args.typescript || args.code.includes('```ts'); + const rawCode = args.code.replace(/[“”]/g, '"').replace(/```*(?:js|ts)?/g, ''); const code: { ts: string | null; js: string; lang: 'ts' | 'js' } = { - ts: _isTypescript ? _code : null, - js: _isTypescript ? transpile(_code) : _code, - lang: _isTypescript ? 'ts' : 'js' + ts: isTypescript ? rawCode : null, + js: isTypescript ? transpile(rawCode) : rawCode, + lang: isTypescript ? 'ts' : 'js' }; - const embed = new _MessageEmbed(); + const embed = new MessageEmbed(); const badPhrases = ['delete', 'destroy']; if (badPhrases.some((p) => code[code.lang]!.includes(p)) && !args.sudo) { @@ -152,39 +177,14 @@ export default class EvalCommand extends BushCommand { } /* eslint-disable @typescript-eslint/no-unused-vars */ - const sh = promisify(exec), - me = message.member, + const me = message.member, member = message.member, bot = client, guild = message.guild, channel = message.channel, config = client.config, members = message.guild?.members, - roles = message.guild?.roles, - emojis = util.emojis, - colors = util.colors, - { ActivePunishment, Global, Guild, Level, ModLog, StickyRole } = await import('#lib'), - { - ButtonInteraction, - Collection, - Collector, - CommandInteraction, - ContextMenuInteraction, - DMChannel, - Emoji, - Interaction, - InteractionCollector, - Message, - MessageActionRow, - MessageAttachment, - MessageButton, - MessageCollector, - MessageEmbed, - MessageSelectMenu, - ReactionCollector, - Util - } = await import('discord.js'), - { Canvas } = await import('canvas'); + roles = message.guild?.roles; /* eslint-enable @typescript-eslint/no-unused-vars */ const inputJS = await util.inspectCleanRedactCodeblock(code.js, 'js'); @@ -228,11 +228,13 @@ export default class EvalCommand extends BushCommand { } else { try { await message.author.send({ embeds: [embed] }); - if (!args.deleteMSG) await (message as BushMessage).react(emojis.successFull); + if (!args.deleteMSG) await message.react(emojis.successFull); } catch { - if (!args.deleteMSG) await (message as BushMessage).react(emojis.errorFull); + if (!args.deleteMSG) await message.react(emojis.errorFull); } } - if (args.deleteMSG && (message as BushMessage).deletable) await (message as BushMessage).delete(); + if (args.deleteMSG && 'deletable' in message && message.deletable) await message.delete(); } } + +/** @typedef {ActivePunishment|Global|Guild|Level|ModLog|StickyRole|ButtonInteraction|Collection|Collector|CommandInteraction|ContextMenuInteraction|DMChannel|Emoji|Interaction|InteractionCollector|Message|MessageActionRow|MessageAttachment|MessageButton|MessageCollector|MessageSelectMenu|ReactionCollector|Util|Canvas} VSCodePleaseDontRemove */ diff --git a/src/commands/dev/javascript.ts b/src/commands/dev/javascript.ts index a5f90cb..8c5dcb4 100644 --- a/src/commands/dev/javascript.ts +++ b/src/commands/dev/javascript.ts @@ -17,8 +17,7 @@ export default class JavascriptCommand extends BushCommand { match: 'rest', prompt: 'What code would you like to run in a sand boxed environment?', retry: '{error} Invalid code to run in a sand boxed environment.', - slashType: 'STRING', - only: 'slash' + slashType: 'STRING' }, { id: 'sel_depth', @@ -30,15 +29,6 @@ export default class JavascriptCommand extends BushCommand { prompt: 'How deep would you like to inspect the output?', slashType: 'INTEGER', optional: true - }, - { - id: 'code', - description: 'The code you would like to run in a sand boxed environment.', - match: 'rest', - prompt: 'What code would you like to run in a sand boxed environment?', - retry: '{error} Invalid code to run in a sand boxed environment.', - slashType: 'STRING', - only: 'text' } ], slash: true, diff --git a/src/commands/info/color.ts b/src/commands/info/color.ts index 7f3e593..2b8ba9c 100644 --- a/src/commands/info/color.ts +++ b/src/commands/info/color.ts @@ -52,7 +52,7 @@ export default class ColorCommand extends BushCommand { args: { color: string | ArgType<'role'> | ArgType<'member'> } ) { const _color = message.util.isSlashMessage(message) - ? ((await util.arg.cast(util.arg.union(isValidTinyColor as any, 'role', 'member'), message, args.color as string)) as + ? ((await util.arg.cast(util.arg.union(isValidTinyColor, 'role', 'member'), message, args.color as string)) as | string | BushRole | BushGuildMember) diff --git a/src/commands/info/help.ts b/src/commands/info/help.ts index e1e9844..c4abf78 100644 --- a/src/commands/info/help.ts +++ b/src/commands/info/help.ts @@ -1,5 +1,6 @@ import { BushCommand, type ArgType, type BushMessage, type BushSlashMessage } from '#lib'; -import { MessageActionRow, MessageButton, MessageEmbed } from 'discord.js'; +import { AutocompleteInteraction, MessageActionRow, MessageButton, MessageEmbed } from 'discord.js'; +import Fuse from 'fuse.js'; import packageDotJSON from '../../../package.json' assert { type: 'json' }; export default class HelpCommand extends BushCommand { @@ -19,7 +20,8 @@ export default class HelpCommand extends BushCommand { prompt: 'What command do you need help with?', retry: '{error} Choose a valid command to find help for.', slashType: 'STRING', - optional: true + optional: true, + autocomplete: true }, { id: 'showHidden', @@ -49,7 +51,7 @@ export default class HelpCommand extends BushCommand { const isSuperUser = client.isSuperUser(message.author); const command = args.command ? typeof args.command === 'string' - ? (client.commandHandler.findCommand(args.command) as BushCommand) ?? null + ? client.commandHandler.findCommand(args.command) ?? null : args.command : null; if (!isOwner) args.showHidden = false; @@ -150,4 +152,24 @@ export default class HelpCommand extends BushCommand { return row; } + + public override autocomplete(interaction: AutocompleteInteraction) { + const aliases = this.handler.modules.map((module) => module.aliases).flat(); + + const fuzzy = new Fuse(aliases, { + threshold: 0.5, + isCaseSensitive: false, + findAllMatches: true + }).search(interaction.options.getFocused().toString()); + + const res = fuzzy.slice(0, fuzzy.length >= 25 ? 25 : undefined).map((v) => ({ name: v.item, value: v.item })); + + const startingCommands = [ + ...this.handler.modules.filter((command) => !command.ownerOnly && !command.hidden && !command.pseudo).keys() + ] + .slice(0, 25) + .map((v) => ({ name: v, value: v })); + + void interaction.respond(res.length ? res : startingCommands); + } } diff --git a/src/commands/moulberry-bush/capes.ts b/src/commands/moulberry-bush/capes.ts index 4bdb360..ab6910a 100644 --- a/src/commands/moulberry-bush/capes.ts +++ b/src/commands/moulberry-bush/capes.ts @@ -1,5 +1,6 @@ import { BushCommand, ButtonPaginator, DeleteButton, type BushMessage, type OptionalArgType } from '#lib'; -import { type MessageEmbedOptions } from 'discord.js'; +import { AutocompleteInteraction, type MessageEmbedOptions } from 'discord.js'; +import Fuse from 'fuse.js'; import got from 'got'; export default class CapesCommand extends BushCommand { @@ -18,8 +19,8 @@ export default class CapesCommand extends BushCommand { prompt: 'What cape would you like to see?', retry: '{error} Choose a cape to see.', optional: true, - slashType: 'STRING' - // choices: client.consts.mappings.capes.map((v) => ({ name: v.name, value: v.name })) + slashType: 'STRING', + autocomplete: true } ], slash: true, @@ -96,6 +97,20 @@ export default class CapesCommand extends BushCommand { description: cape.purchasable ? ':money_with_wings: **purchasable** :money_with_wings:' : undefined }; } + + public override autocomplete(interaction: AutocompleteInteraction) { + const capes = client.consts.mappings.capes.map((v) => v.name); + + const fuzzy = new Fuse(capes, { + threshold: 0.5, + isCaseSensitive: false, + findAllMatches: true + }).search(interaction.options.getFocused().toString()); + + const res = fuzzy.slice(0, fuzzy.length >= 25 ? 25 : undefined).map((v) => ({ name: v.item, value: v.item })); + + void interaction.respond(res); + } } export interface GithubFile { diff --git a/src/commands/moulberry-bush/rule.ts b/src/commands/moulberry-bush/rule.ts index ab2632c..28483a4 100644 --- a/src/commands/moulberry-bush/rule.ts +++ b/src/commands/moulberry-bush/rule.ts @@ -1,4 +1,4 @@ -import { AllowedMentions, BushCommand, type BushMessage, type OptionalArgType } from '#lib'; +import { AllowedMentions, BushCommand, BushSlashMessage, type BushMessage, type OptionalArgType } from '#lib'; import { MessageEmbed } from 'discord.js'; const rules = [ @@ -92,7 +92,7 @@ export default class RuleCommand extends BushCommand { } public override async exec( - message: BushMessage, + message: BushMessage | BushSlashMessage, { rule, user }: { rule: OptionalArgType<'integer'>; user: OptionalArgType<'user'> } ) { const rulesEmbed = new MessageEmbed() @@ -114,35 +114,18 @@ export default class RuleCommand extends BushCommand { if (rules[i]?.title && rules[i]?.description) rulesEmbed.addField(rules[i].title, rules[i].description); } } - await respond(); + await message.util.send({ + content: user ? `<@${user.id}>` : undefined, + embeds: [rulesEmbed], + allowedMentions: AllowedMentions.users(), + // If the original message was a reply -> imitate it + reply: + !message.util.isSlashMessage(message) && message.reference?.messageId + ? { messageReference: message.reference.messageId } + : undefined + }); if (!message.util.isSlash) { await message.delete().catch(() => {}); } - return; - async function respond() { - if (!user) { - return ( - // If the original message was a reply -> imitate it - message.reference?.messageId && !message.util.isSlash - ? await message.channel.messages.fetch(message.reference.messageId).then(async (message) => { - await message.reply({ embeds: [rulesEmbed], allowedMentions: AllowedMentions.users() }); - }) - : await message.util.send({ embeds: [rulesEmbed], allowedMentions: AllowedMentions.users() }) - ); - } else { - return message.reference?.messageId && !message.util.isSlash - ? await message.util.send({ - content: `<@!${user.id}>`, - embeds: [rulesEmbed], - allowedMentions: AllowedMentions.users(), - reply: { messageReference: message.reference.messageId } - }) - : await message.util.send({ - content: `<@!${user.id}>`, - embeds: [rulesEmbed], - allowedMentions: AllowedMentions.users() - }); - } - } } } diff --git a/src/commands/utilities/activity.ts b/src/commands/utilities/activity.ts index 6801358..e1c2d88 100644 --- a/src/commands/utilities/activity.ts +++ b/src/commands/utilities/activity.ts @@ -70,24 +70,7 @@ const activityTypeCaster = (_message: Message | BushMessage | BushSlashMessage, export default class YouTubeCommand extends BushCommand { constructor() { super('activity', { - aliases: [ - 'activity', - 'yt', - 'youtube', - 'chess', - 'park', - 'poker', - 'fish', - 'fishing', - 'fishington', - 'betrayal', - 'doodle-crew', - 'doodle', - 'wood-snacks', - 'wood', - 'letter-tile', - 'letter' - ], + aliases: Object.values(activityMap).flatMap((a) => a.aliases), category: 'utilities', description: 'Allows you to play discord activities in voice channels.', usage: [ @@ -139,7 +122,7 @@ export default class YouTubeCommand extends BushCommand { const target_application_id = message.util.isSlash ? args.activity : activityTypeCaster(message, args.activity); let response: string; - const invite = await (client as any).api + const invite = await (<any>client).api .channels(channel.id) .invites.post({ data: { @@ -152,7 +135,7 @@ export default class YouTubeCommand extends BushCommand { } }) .catch((e: Error | DiscordAPIError) => { - if ((e as DiscordAPIError).code === 50013) { + if ((e as DiscordAPIError)?.code === 50013) { response = `${util.emojis.error} I am missing permissions to make an invite in that channel.`; return; } else response = `${util.emojis.error} An error occurred while generating your invite: ${e?.message ?? e}`; diff --git a/src/commands/utilities/price.ts b/src/commands/utilities/price.ts index 16dd327..e2cb837 100644 --- a/src/commands/utilities/price.ts +++ b/src/commands/utilities/price.ts @@ -1,9 +1,11 @@ import { BushCommand, type BushMessage } from '#lib'; -import { MessageEmbed } from 'discord.js'; +import { AutocompleteInteraction, MessageEmbed } from 'discord.js'; import Fuse from 'fuse.js'; import got from 'got'; export default class PriceCommand extends BushCommand { + public static cachedItemList: string[] = []; + public constructor() { super('price', { aliases: ['price'], @@ -19,7 +21,8 @@ export default class PriceCommand extends BushCommand { match: 'content', prompt: 'What item would you like to find the price of?', retry: '{error} Choose a valid item.', - slashType: 'STRING' + slashType: 'STRING', + autocomplete: true }, { id: 'strict', @@ -40,14 +43,14 @@ export default class PriceCommand extends BushCommand { public override async exec(message: BushMessage, { item, strict }: { item: string; strict: boolean }) { if (message.util.isSlashMessage(message)) await message.interaction.deferReply(); - const errors = new Array<string>(); + const errors: string[] = []; //prettier-ignore const [bazaar, currentLowestBIN, averageLowestBIN, auctionAverages] = (await Promise.all([ - got.get('https://api.hypixel.net/skyblock/bazaar').json().catch(() => errors.push('bazaar')), - got.get('https://moulberry.codes/lowestbin.json').json().catch(() => errors.push('current lowest BIN')), - got.get('https://moulberry.codes/auction_averages_lbin/3day.json').json().catch(() => errors.push('average Lowest BIN')), - got.get('https://moulberry.codes/auction_averages/3day.json').json().catch(() => errors.push('auction average')) + got.get('https://api.hypixel.net/skyblock/bazaar').json().catch(() => { errors.push('bazaar') }), + got.get('https://moulberry.codes/lowestbin.json').json().catch(() => { errors.push('current lowest BIN') }), + got.get('https://moulberry.codes/auction_averages_lbin/3day.json').json().catch(() => { errors.push('average Lowest BIN') }), + got.get('https://moulberry.codes/auction_averages/3day.json').json().catch(() => { errors.push('auction average') }) ])) as [Bazaar, LowestBIN, LowestBIN, AuctionAverages]; let parsedItem = item.toString().toUpperCase().replace(/ /g, '_').replace(/'S/g, ''); @@ -61,10 +64,10 @@ export default class PriceCommand extends BushCommand { // create a set from all the item names so that there are no duplicates for the fuzzy search const itemNames = new Set([ - ...Object.keys(averageLowestBIN || {}), - ...Object.keys(currentLowestBIN || {}), - ...Object.keys(auctionAverages || {}), - ...Object.keys(bazaar?.products || {}) + ...Object.keys(averageLowestBIN ?? {}), + ...Object.keys(currentLowestBIN ?? {}), + ...Object.keys(auctionAverages ?? {}), + ...Object.keys(bazaar?.products ?? {}) ]); // fuzzy search @@ -132,15 +135,27 @@ export default class PriceCommand extends BushCommand { priceEmbed.addField(name, price.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })); } } + + public override autocomplete(interaction: AutocompleteInteraction) { + const fuzzy = new Fuse(PriceCommand.cachedItemList, { + threshold: 0.5, + isCaseSensitive: false, + findAllMatches: true + }).search(interaction.options.getFocused().toString()); + + const res = fuzzy.slice(0, fuzzy.length >= 25 ? 25 : undefined).map((v) => ({ name: v.item, value: v.item })); + + void interaction.respond(res); + } } -interface Summary { +export interface Summary { amount: number; pricePerUnit: number; orders: number; } -interface Bazaar { +export interface Bazaar { success: boolean; lastUpdated: number; products: { @@ -163,11 +178,11 @@ interface Bazaar { }; } -interface LowestBIN { +export interface LowestBIN { [key: string]: number; } -interface AuctionAverages { +export interface AuctionAverages { [key: string]: { price?: number; count?: number; diff --git a/src/commands/utilities/suicide.ts b/src/commands/utilities/suicide.ts index f0d75a2..b347f9c 100644 --- a/src/commands/utilities/suicide.ts +++ b/src/commands/utilities/suicide.ts @@ -1,5 +1,5 @@ import { AllowedMentions, BushCommand, type BushMessage, type BushSlashMessage } from '#lib'; -import { MessageEmbed, type Message } from 'discord.js'; +import { MessageEmbed } from 'discord.js'; export default class TemplateCommand extends BushCommand { public constructor() { @@ -44,17 +44,14 @@ export default class TemplateCommand extends BushCommand { ].join('\n') ); - return ( + return message.util.send({ + embeds: [suicideEmbed], + allowedMentions: AllowedMentions.users(), // If the original message was a reply -> imitate it - !message.util.isSlashMessage(message) && (message as Message).reference?.messageId && message.guild && message.channel - ? await message.channel.messages.fetch((message as Message).reference!.messageId!).then(async (message1) => { - await message1.reply({ - embeds: [suicideEmbed], - allowedMentions: AllowedMentions.users(), - target: message1 - }); - }) - : await message.util.send({ embeds: [suicideEmbed], allowedMentions: AllowedMentions.users() }) - ); + reply: + !message.util.isSlashMessage(message) && message.reference?.messageId + ? { messageReference: message.reference.messageId } + : undefined + }); } } diff --git a/src/commands/utilities/wolframAlpha.ts b/src/commands/utilities/wolframAlpha.ts index 705e157..faf575c 100644 --- a/src/commands/utilities/wolframAlpha.ts +++ b/src/commands/utilities/wolframAlpha.ts @@ -18,8 +18,7 @@ export default class WolframAlphaCommand extends BushCommand { match: 'rest', prompt: 'What would you like to look up?', retry: '{error} Pick something to look up.', - slashType: 'STRING', - only: 'slash' + slashType: 'STRING' }, { id: 'image', @@ -29,16 +28,6 @@ export default class WolframAlphaCommand extends BushCommand { prompt: 'Would you like to use the Simple API instead of the Short Answers API?', slashType: 'BOOLEAN', optional: true - }, - { - id: 'expression', - description: 'The expression to query the Wolfram|Alpha api for.', - type: 'string', - match: 'rest', - prompt: 'What would you like to look up?', - retry: '{error} Pick something to look up.', - slashType: 'STRING', - only: 'text' } ], slash: true, |