aboutsummaryrefslogtreecommitdiff
path: root/src/commands
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands')
-rw-r--r--src/commands/config/_levelRoles.ts41
-rw-r--r--src/commands/config/config.ts2
-rw-r--r--src/commands/info/guildInfo.ts19
-rw-r--r--src/commands/leveling/level.ts6
-rw-r--r--src/commands/leveling/levelRoles.ts113
5 files changed, 130 insertions, 51 deletions
diff --git a/src/commands/config/_levelRoles.ts b/src/commands/config/_levelRoles.ts
deleted file mode 100644
index af7e637..0000000
--- a/src/commands/config/_levelRoles.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-// import { BushCommand, type BushMessage, type BushSlashMessage } from '#lib';
-
-// export default class LevelRolesCommand extends BushCommand {
-// public constructor() {
-// super('levelRole', {
-// aliases: ['level-role', 'level-roles', 'lr'],
-// category: 'config',
-// description: 'Configure roles to be assigned to users upon reaching certain levels.',
-// usage: ['level-role add <level> <role>', 'level-role remove <level>'],
-// examples: ['level-role 1 2'],
-// args: [
-// {
-// id: 'required_argument',
-// type: 'string',
-// description: 'This is the first argument.',
-// prompt: 'What would you like to set your first argument to be?',
-// retry: '{error} Pick a valid argument.',
-// slashType: 'STRING'
-// },
-// {
-// id: 'optional_argument',
-// type: 'string',
-// description: 'This is the second argument.',
-// prompt: 'What would you like to set your second argument to be?',
-// retry: '{error} Pick a valid argument.',
-// optional: true,
-// slashType: 'STRING'
-// }
-// ],
-// slash: true,
-// channel: 'guild',
-// clientPermissions: (m) => util.clientSendAndPermCheck(m),
-// userPermissions: ['MANAGE_GUILD', 'MANAGE_ROLES']
-// });
-// }
-
-// public override async exec(
-// message: BushMessage | BushSlashMessage,
-// args: { required_argument: string; optional_argument: string }
-// ) {}
-// }
diff --git a/src/commands/config/config.ts b/src/commands/config/config.ts
index c7da64f..9d8ba60 100644
--- a/src/commands/config/config.ts
+++ b/src/commands/config/config.ts
@@ -33,7 +33,7 @@ export default class ConfigCommand extends BushCommand {
category: 'config',
description: 'Configure server settings.',
usage: [
- `settings (${settingsArr.map((s) => `\`${s}\``).join(', ')}) (${['view', 'set', 'add', 'remove'].map((s) => `\`${s}\``)})`
+ `settings (${settingsArr.map((s) => `'${s}'`).join(', ')}) (${['view', 'set', 'add', 'remove'].map((s) => `'${s}'`)})`
],
examples: ['settings', 'config prefix set -'],
slash: true,
diff --git a/src/commands/info/guildInfo.ts b/src/commands/info/guildInfo.ts
index e543eee..7d3d170 100644
--- a/src/commands/info/guildInfo.ts
+++ b/src/commands/info/guildInfo.ts
@@ -1,4 +1,5 @@
-import { BushCommand, type ArgType, type BushMessage, type BushSlashMessage } from '#lib';
+import { BushCommand, type ArgType, type BushMessage, type BushSlashMessage, type OptionalArgType } from '#lib';
+import assert from 'assert';
import {
Constants,
Guild,
@@ -35,16 +36,20 @@ export default class GuildInfoCommand extends BushCommand {
});
}
- public override async exec(message: BushMessage | BushSlashMessage, args: { guild: ArgType<'guild'> | ArgType<'snowflake'> }) {
- if (!args?.guild && !message.guild) {
+ public override async exec(
+ message: BushMessage | BushSlashMessage,
+ args: { guild: OptionalArgType<'guild'> | OptionalArgType<'snowflake'> }
+ ) {
+ if (!args.guild && !message.inGuild()) {
return await message.util.reply(
`${util.emojis.error} You must either provide an server to provide info about or run this command in a server.`
);
}
+
const otherEmojis = client.consts.mappings.otherEmojis;
let isPreview = false;
- let _guild: ArgType<'guild'> | ArgType<'snowflake'> | GuildPreview = args.guild;
- if (['number', 'string'].includes(typeof args?.guild)) {
+ let _guild: ArgType<'guild'> | ArgType<'snowflake'> | GuildPreview = args.guild ?? message.guild!;
+ if (typeof _guild === 'string') {
const preview = await client.fetchGuildPreview(`${args.guild}` as Snowflake).catch(() => {});
if (preview) {
_guild = preview;
@@ -53,7 +58,9 @@ export default class GuildInfoCommand extends BushCommand {
return await message.util.reply(`${util.emojis.error} That guild is not discoverable or does not exist.`);
}
}
- const guild: Guild | GuildPreview = (_guild as Guild | GuildPreview) || (_guild as Guild);
+
+ const guild: Guild | GuildPreview = _guild;
+ assert(guild);
const emojis: string[] = [];
const guildAbout: string[] = [];
const guildStats: string[] = [];
diff --git a/src/commands/leveling/level.ts b/src/commands/leveling/level.ts
index 61672a3..be52a5d 100644
--- a/src/commands/leveling/level.ts
+++ b/src/commands/leveling/level.ts
@@ -3,11 +3,11 @@ import {
BushCommand,
CanvasProgressBar,
Level,
- type ArgType,
type BushGuild,
type BushMessage,
type BushSlashMessage,
- type BushUser
+ type BushUser,
+ type OptionalArgType
} from '#lib';
import { SimplifyNumber } from '@notenoughupdates/simplify-number';
import assert from 'assert';
@@ -46,7 +46,7 @@ export default class LevelCommand extends BushCommand {
});
}
- public override async exec(message: BushMessage | BushSlashMessage, args: { user?: ArgType<'user'> }) {
+ public override async exec(message: BushMessage | BushSlashMessage, args: { user: OptionalArgType<'user'> }) {
if (!message.guild) return await message.util.reply(`${util.emojis.error} This command can only be run in a server.`);
if (!(await message.guild.hasFeature('leveling')))
return await message.util.reply(
diff --git a/src/commands/leveling/levelRoles.ts b/src/commands/leveling/levelRoles.ts
new file mode 100644
index 0000000..a5eb5c4
--- /dev/null
+++ b/src/commands/leveling/levelRoles.ts
@@ -0,0 +1,113 @@
+import { AllowedMentions, BushCommand, type ArgType, type BushMessage, type BushSlashMessage, type OptionalArgType } from '#lib';
+import assert from 'assert';
+
+export default class LevelRolesCommand extends BushCommand {
+ public constructor() {
+ super('levelRole', {
+ aliases: ['level-role', 'level-roles', 'lr'],
+ category: 'config',
+ description: 'Configure roles to be assigned to users upon reaching certain levels.',
+ note: 'Omit the role to remove the role. View configured roles with `-config levelRoles`.',
+ usage: ['level-role <level> [role]'],
+ examples: ['level-role 100 @Super Cool Role'],
+ args: [
+ {
+ id: 'level',
+ type: 'integer',
+ description: 'The level to assign the role when reached.',
+ prompt: 'What level would you like to set a role for when reached?',
+ retry: '{error} Pick a valid integer representing the role to assign a role to when reached.',
+ slashType: 'INTEGER'
+ },
+ {
+ id: 'role',
+ type: 'role',
+ match: 'rest',
+ description: 'The role to assign to a user who reaches the specified level.',
+ prompt: 'What role would you like to assign to users when they reach that level?',
+ retry: '{error} Choose a valid role to assign to users upon reaching the specified level.',
+ slashType: 'ROLE',
+ optional: true
+ }
+ ],
+ slash: true,
+ channel: 'guild',
+ clientPermissions: (m) => util.clientSendAndPermCheck(m, ['MANAGE_ROLES']),
+ userPermissions: ['MANAGE_GUILD', 'MANAGE_ROLES']
+ });
+ }
+
+ public override async exec(
+ message: BushMessage | BushSlashMessage,
+ args: { level: ArgType<'integer'>; role: OptionalArgType<'role'> }
+ ) {
+ assert(message.inGuild());
+ assert(message.member);
+
+ if (!(await message.guild.hasFeature('leveling'))) {
+ return await message.util.reply(
+ `${util.emojis.error} This command can only be run in servers with the leveling feature enabled.`
+ );
+ }
+
+ if (args.level < 1) return await message.util.reply(`${util.emojis.error} You cannot set a level role less that 1.`);
+
+ if (args.role) {
+ if (args.role.managed)
+ return await message.util.reply({
+ content: `${util.emojis.error} You cannot set <@${args.role.id}> as a level role since it is managed.`,
+ allowedMentions: AllowedMentions.none()
+ });
+ else if (args.role.id === message.guild.id)
+ return await message.util.reply({
+ content: `${util.emojis.error} You cannot set the @everyone role as a level role.`,
+ allowedMentions: AllowedMentions.none()
+ });
+ else if (args.role.comparePositionTo(message.member.roles.highest) >= 0)
+ return await message.util.reply({
+ content: `${util.emojis.error} <@${args.role.id}> is higher or equal to your highest role.`,
+ allowedMentions: AllowedMentions.none()
+ });
+ else if (args.role.comparePositionTo(message.guild.me!.roles.highest) >= 0)
+ return await message.util.reply({
+ content: `${util.emojis.error} <@${args.role.id}> is higher or equal to my highest role.`,
+ allowedMentions: AllowedMentions.none()
+ });
+ }
+
+ const oldRoles = Object.freeze(await message.guild.getSetting('levelRoles'));
+ const newRoles = { ...oldRoles };
+
+ if (args.role) {
+ newRoles[args.level] = args.role.id;
+ } else {
+ delete newRoles[args.level];
+ }
+ Object.freeze(newRoles);
+
+ const success = await message.guild.setSetting('levelRoles', newRoles).catch(() => false);
+
+ if (!success) return await message.util.reply(`${util.emojis.error} An error occurred while setting the level roles.`);
+
+ if (!oldRoles[args.level] && newRoles[args.level]) {
+ return await message.util.reply({
+ content: `${util.emojis.success} The level role for **${args.level}** is now <@&${newRoles[args.level]}>.`,
+ allowedMentions: AllowedMentions.none()
+ });
+ } else if (oldRoles[args.level] && !newRoles[args.level]) {
+ return await message.util.reply({
+ content: `${util.emojis.success} The level role for **${args.level}** was <@&${
+ oldRoles[args.level]
+ }> but is now disabled.`,
+ allowedMentions: AllowedMentions.none()
+ });
+ } else if (oldRoles[args.level] && newRoles[args.level]) {
+ return await message.util.reply({
+ content: `${util.emojis.success} The level role for **${args.level}** has been updated from <@&${
+ oldRoles[args.level]
+ }> to <@&${newRoles[args.level]}>.`,
+ allowedMentions: AllowedMentions.none()
+ });
+ }
+ }
+}