aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/arguments/contentWithDuration.ts6
-rw-r--r--src/arguments/discordEmoji.ts17
-rw-r--r--src/arguments/duration.ts4
-rw-r--r--src/arguments/snowflake.ts8
-rw-r--r--src/commands/utilities/steal.ts60
-rw-r--r--src/lib/extensions/discord-akairo/BushClient.ts6
-rw-r--r--src/lib/extensions/discord-akairo/BushCommand.ts11
-rw-r--r--src/lib/utils/BushConstants.ts9
8 files changed, 84 insertions, 37 deletions
diff --git a/src/arguments/contentWithDuration.ts b/src/arguments/contentWithDuration.ts
index 314b761..38b3fa4 100644
--- a/src/arguments/contentWithDuration.ts
+++ b/src/arguments/contentWithDuration.ts
@@ -1,8 +1,8 @@
-import { BushArgumentTypeCaster, BushMessage } from '@lib';
+import { BushArgumentTypeCaster } from '@lib';
export const contentWithDurationTypeCaster: BushArgumentTypeCaster = async (
- _message: BushMessage,
- phrase: string
+ _,
+ phrase
): Promise<{ duration: number; contentWithoutTime: string | null }> => {
return client.util.parseDuration(phrase);
};
diff --git a/src/arguments/discordEmoji.ts b/src/arguments/discordEmoji.ts
new file mode 100644
index 0000000..9884c98
--- /dev/null
+++ b/src/arguments/discordEmoji.ts
@@ -0,0 +1,17 @@
+import { Snowflake } from 'discord-api-types';
+import { BushArgumentTypeCaster } from '../lib';
+
+export const discordEmojiTypeCaster: BushArgumentTypeCaster = (
+ _,
+ phrase
+): { name: string; id: Snowflake; animated: boolean } | null => {
+ console.log(phrase);
+ if (!phrase) return null;
+ const validEmoji = client.consts.regex.discordEmoji.test(phrase);
+ console.log(validEmoji);
+ if (!validEmoji) return null;
+ const emoji = phrase.replace(/[<>]/g, '').split(':');
+ const animated = emoji[0] === 'a';
+ console.log(emoji);
+ return { name: emoji[1], id: emoji[2], animated };
+};
diff --git a/src/arguments/duration.ts b/src/arguments/duration.ts
index ce181e8..6e76034 100644
--- a/src/arguments/duration.ts
+++ b/src/arguments/duration.ts
@@ -1,5 +1,5 @@
-import { BushArgumentTypeCaster, BushMessage } from '@lib';
+import { BushArgumentTypeCaster } from '@lib';
-export const durationTypeCaster: BushArgumentTypeCaster = (_message: BushMessage, phrase): number => {
+export const durationTypeCaster: BushArgumentTypeCaster = (_, phrase): number => {
return client.util.parseDuration(phrase).duration;
};
diff --git a/src/arguments/snowflake.ts b/src/arguments/snowflake.ts
new file mode 100644
index 0000000..0e6136f
--- /dev/null
+++ b/src/arguments/snowflake.ts
@@ -0,0 +1,8 @@
+import { Snowflake } from 'discord.js';
+import { BushArgumentTypeCaster } from '../lib';
+
+export const snowflakeTypeCaster: BushArgumentTypeCaster = (_, phrase): Snowflake | null => {
+ if (!phrase) return null;
+ if (client.consts.regex.snowflake.test(phrase)) return phrase;
+ return null;
+};
diff --git a/src/commands/utilities/steal.ts b/src/commands/utilities/steal.ts
index 6298271..734aab5 100644
--- a/src/commands/utilities/steal.ts
+++ b/src/commands/utilities/steal.ts
@@ -1,5 +1,5 @@
import { BushCommand, BushMessage } from '@lib';
-import { Argument } from 'discord-akairo';
+import { Snowflake } from 'discord-api-types';
export default class StealCommand extends BushCommand {
public constructor() {
@@ -13,19 +13,17 @@ export default class StealCommand extends BushCommand {
},
args: [
{
- id: 'emoji',
- customType: Argument.union(
- /<a?:(?<emojiName>[a-zA-Z0-9_]+):(?<emojiID>\d{15,21})>/gim, //emoji
- 'url',
- /^(\d{15,21})$/gim //snowflake
- ),
+ id: 'emojiOrName',
+ customType: util.arg.union('discordEmoji', 'snowflake', 'url'),
prompt: {
start: 'What emoji would you like to steal?',
- retry: '{error} Pick a valid emoji.',
+ retry: '{error} Pick a valid emoji, emoji id, or image url.',
optional: true
}
},
- { id: 'name', match: 'option', flag: '--name', default: 'stolen_emoji' }
+ {
+ id: 'name2'
+ }
],
slash: false,
channel: 'guild',
@@ -35,33 +33,39 @@ export default class StealCommand extends BushCommand {
}
public override async exec(
message: BushMessage,
- args: { emoji?: URL | string | { emojiName?: string; emojiID: string }; name: string }
+ args?: { emojiOrName?: { name: string; id: Snowflake; animated: boolean } | Snowflake | URL | string; name: string }
): Promise<unknown> {
- if ((!args || !args.emoji) && !message.attachments.size)
+ if ((!args || !args.emojiOrName) && !message.attachments.size)
return await message.util.reply(`${util.emojis.error} You must provide an emoji to steal.`);
- client.console.debug(args, 5);
+ console.log(args);
+
const image =
- (args?.emoji as any)?.matches && (args?.emoji as any)?.emojiID
- ? `https://cdn.discordapp.com/emojis/${(args.emoji as any).emojiID}`
- : typeof args.emoji === 'string'
- ? `https://cdn.discordapp.com/emojis/${args.emoji}`
- : typeof message.attachments.size && message.attachments.first()?.contentType?.includes('image/')
+ message.attachments.size && message.attachments.first()?.contentType?.includes('image/')
? message.attachments.first()!.url
- : args?.emoji instanceof URL
- ? args.emoji.href
+ : args?.emojiOrName instanceof URL
+ ? args.emojiOrName.href
+ : typeof args?.emojiOrName === 'object'
+ ? `https://cdn.discordapp.com/emojis/${args.emojiOrName.id}`
+ : client.consts.regex.discordEmoji.test(args?.emojiOrName ?? '')
+ ? `https://cdn.discordapp.com/emojis/${args!.emojiOrName}`
: undefined;
if (!image) return await message.util.reply(`${util.emojis.error} You must provide an emoji to steal.`);
+ if (message.attachments.size && typeof args?.emojiOrName !== 'string')
+ return await message.util.reply(`${util.emojis.error} You cannot attach an image and provide an argument.`);
- const creationSuccess = await message
- .guild!.emojis.create(
- image,
- args.name === 'stolen emoji' && (args?.emoji as any)?.emojiName ? (args?.emoji as any)?.emojiName : args.name,
- {
- reason: `Stolen by ${message.author.tag} (${message.author.id})`
- }
- )
- .catch((e: Error) => e);
+ const emojiName = message.attachments.size
+ ? (args?.emojiOrName as string) ?? 'stolen_emoji'
+ : args?.emojiOrName instanceof URL
+ ? args?.name ?? 'stolen_emoji'
+ : typeof args?.emojiOrName === 'object'
+ ? args?.name ?? args.emojiOrName.name ?? 'stolen_emoji'
+ : 'stolen_emoji';
+
+ const creationSuccess = await message.guild!.emojis.create(image, emojiName, {
+ reason: `Stolen by ${message.author.tag} (${message.author.id})`
+ });
+ // .catch((e: Error) => e);
if (!(creationSuccess instanceof Error))
return await message.util.reply(`${util.emojis.success} You successfully stole ${creationSuccess}.`);
diff --git a/src/lib/extensions/discord-akairo/BushClient.ts b/src/lib/extensions/discord-akairo/BushClient.ts
index 3feae96..ee92ded 100644
--- a/src/lib/extensions/discord-akairo/BushClient.ts
+++ b/src/lib/extensions/discord-akairo/BushClient.ts
@@ -21,8 +21,10 @@ import { exit } from 'process';
import readline from 'readline';
import { Sequelize } from 'sequelize';
import { contentWithDurationTypeCaster } from '../../../arguments/contentWithDuration';
+import { discordEmojiTypeCaster } from '../../../arguments/discordEmoji';
import { durationTypeCaster } from '../../../arguments/duration';
import { permissionTypeCaster } from '../../../arguments/permission';
+import { snowflakeTypeCaster } from '../../../arguments/snowflake';
import { UpdateCacheTask } from '../../../tasks/updateCache';
import { ActivePunishment } from '../../models/ActivePunishment';
import { Global } from '../../models/Global';
@@ -250,7 +252,9 @@ export class BushClient<Ready extends boolean = boolean> extends AkairoClient<Re
this.commandHandler.resolver.addTypes({
duration: durationTypeCaster,
contentWithDuration: contentWithDurationTypeCaster,
- permission: permissionTypeCaster
+ permission: permissionTypeCaster,
+ snowflake: snowflakeTypeCaster,
+ discordEmoji: discordEmojiTypeCaster
});
// loads all the handlers
const loaders = {
diff --git a/src/lib/extensions/discord-akairo/BushCommand.ts b/src/lib/extensions/discord-akairo/BushCommand.ts
index 0eaa5e0..7ecb679 100644
--- a/src/lib/extensions/discord-akairo/BushCommand.ts
+++ b/src/lib/extensions/discord-akairo/BushCommand.ts
@@ -6,7 +6,7 @@ import { BushClient } from './BushClient';
import { BushCommandHandler } from './BushCommandHandler';
import { BushSlashMessage } from './BushSlashMessage';
-export type BushArgumentType =
+export type BaseBushArgumentType =
| 'string'
| 'lowercase'
| 'uppercase'
@@ -61,7 +61,12 @@ export type BushArgumentType =
| 'listener'
| 'duration'
| 'contentWithDuration'
- | 'permission';
+ | 'permission'
+ | 'snowflake'
+ | 'discordEmoji';
+
+export type BushArgumentType = BaseBushArgumentType | RegExp;
+
interface BaseBushArgumentOptions extends Omit<ArgumentOptions, 'type'> {
id: string;
description?: string;
@@ -116,7 +121,7 @@ export interface BushArgumentOptions extends BaseBushArgumentOptions {
* - `contentWithDuration` tries to parse duration in milliseconds and returns the remaining content with the duration
* removed
*/
- type?: BushArgumentType;
+ type?: BushArgumentType | BaseBushArgumentType[];
}
export interface CustomBushArgumentOptions extends BaseBushArgumentOptions {
/**
diff --git a/src/lib/utils/BushConstants.ts b/src/lib/utils/BushConstants.ts
index 68393c4..1d7f81e 100644
--- a/src/lib/utils/BushConstants.ts
+++ b/src/lib/utils/BushConstants.ts
@@ -21,6 +21,10 @@ interface bushColors {
black: '#000000';
orange: '#E86100';
}
+
+('<:verifiedbot1:700325427998097449>');
+('');
+
export class BushConstants {
public static emojis = {
success: '<:checkmark:837109864101707807>',
@@ -99,6 +103,11 @@ export class BushConstants {
}
};
+ public static regex = {
+ snowflake: /\d{15,21}/gim,
+ discordEmoji: /<a?:[a-zA-Z0-9_]+:\d{15,21}>/gim
+ };
+
/** A bunch of mappings */
public static mappings = {
guilds: {