refactor(arabot): change subcommand logic to sapphire's plugin

This commit is contained in:
smyalygames 2023-02-09 13:37:43 +00:00
parent 8d83365c8a
commit 80f201a1ad
3 changed files with 71 additions and 113 deletions

View File

@ -17,7 +17,8 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { Command, RegisterBehavior } from '@sapphire/framework';
import { RegisterBehavior } from '@sapphire/framework';
import { Subcommand } from '@sapphire/plugin-subcommands';
import type { Guild, TextChannel } from 'discord.js';
import {
CategoryChannel,
@ -29,18 +30,28 @@ import {
} from 'discord.js';
import IDs from '#utils/ids';
export class PrivateCommand extends Command {
public constructor(context: Command.Context, options: Command.Options) {
export class PrivateCommand extends Subcommand {
public constructor(context: Subcommand.Context, options: Subcommand.Options) {
super(context, {
...options,
name: 'private',
subcommands: [
{
name: 'create',
chatInputRun: 'create',
},
{
name: 'delete',
chatInputRun: 'delete',
},
],
description: 'Creates/deletes private channels for a user',
preconditions: ['CoordinatorOnly'],
});
}
// Registers that this is a slash command
public override registerApplicationCommands(registry: Command.Registry) {
public override registerApplicationCommands(registry: Subcommand.Registry) {
registry.registerChatInputCommand(
(builder) => builder
.setName(this.name)
@ -60,32 +71,7 @@ export class PrivateCommand extends Command {
);
}
// Command run
public async chatInputRun(interaction: Command.ChatInputCommandInteraction) {
const subcommand = interaction.options.getSubcommand(true);
// Checks what subcommand was run
switch (subcommand) {
case 'create': {
await this.create(interaction);
return;
}
case 'delete': {
await this.delete(interaction);
return;
}
default: {
// If subcommand is invalid
await interaction.reply({
content: 'Invalid sub command!',
ephemeral: true,
fetchReply: true,
});
}
}
}
private async create(interaction: Command.ChatInputCommandInteraction) {
public async create(interaction: Subcommand.ChatInputCommandInteraction) {
// Get the arguments
const user = interaction.options.getUser('user');
const mod = interaction.member;
@ -227,7 +213,7 @@ export class PrivateCommand extends Command {
});
}
private async delete(interaction: Command.ChatInputCommandInteraction) {
public async delete(interaction: Subcommand.ChatInputCommandInteraction) {
// Get the arguments
const user = interaction.options.getUser('user');
const mod = interaction.member;

View File

@ -17,12 +17,8 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {
Args,
Command,
container,
RegisterBehavior,
} from '@sapphire/framework';
import { Args, container, RegisterBehavior } from '@sapphire/framework';
import { Subcommand } from '@sapphire/plugin-subcommands';
import {
ChannelType,
GuildMember,
@ -33,30 +29,42 @@ import {
import type { TextChannel } from 'discord.js';
import IDs from '#utils/ids';
export class DiversityCommand extends Command {
public constructor(context: Command.Context, options: Command.Options) {
export class DiversityCommand extends Subcommand {
public constructor(context: Subcommand.Context, options: Subcommand.Options) {
super(context, {
...options,
name: 'diversity',
aliases: ['di', 'div'],
subcommands: [
{
name: 'role',
default: true,
chatInputRun: 'roleCommand',
messageRun: 'roleMessage',
},
{
name: 'toggleopen',
chatInputRun: 'toggleOpen',
},
],
description: 'Commands for the Diversity Coordinators',
preconditions: ['DiversityCoordinatorOnly'],
});
}
// Registers that this is a slash command
public override registerApplicationCommands(registry: Command.Registry) {
public override registerApplicationCommands(registry: Subcommand.Registry) {
registry.registerChatInputCommand(
(builder) => builder
.setName(this.name)
.setDescription(this.description)
.addSubcommand((command) => command.setName('toggleopen')
.setDescription('Toggles read-only for vegans in diversity section'))
.addSubcommand((command) => command.setName('role')
.setDescription('Gives/removes the diversity role')
.addUserOption((option) => option.setName('user')
.setDescription('User to give/remove diversity to')
.setRequired(true))),
.setRequired(true)))
.addSubcommand((command) => command.setName('toggleopen')
.setDescription('Toggles read-only for vegans in diversity section')),
{
behaviorWhenNotIdentical: RegisterBehavior.Overwrite,
},
@ -64,32 +72,7 @@ export class DiversityCommand extends Command {
}
// Command run
public async chatInputRun(interaction: Command.ChatInputCommandInteraction) {
const subcommand = interaction.options.getSubcommand(true);
// Checks what subcommand was run
switch (subcommand) {
case 'toggleopen': {
await this.toggleOpen(interaction);
return;
}
case 'role': {
await this.roleCommand(interaction);
return;
}
default: {
// If subcommand is invalid
await interaction.reply({
content: 'Invalid sub command!',
ephemeral: true,
fetchReply: true,
});
}
}
}
// Command run
public async toggleOpen(interaction: Command.ChatInputCommandInteraction) {
public async toggleOpen(interaction: Subcommand.ChatInputCommandInteraction) {
// Check if guild is not null
if (interaction.guild === null) {
await interaction.reply({
@ -148,7 +131,7 @@ export class DiversityCommand extends Command {
});
}
public async roleCommand(interaction: Command.ChatInputCommandInteraction) {
public async roleCommand(interaction: Subcommand.ChatInputCommandInteraction) {
// TODO add database updates
// Get the arguments
const user = interaction.options.getUser('user');
@ -201,7 +184,7 @@ export class DiversityCommand extends Command {
.catch(() => {});
}
public async messageRun(message: Message, args: Args) {
public async roleMessage(message: Message, args: Args) {
// Get arguments
let user: GuildMember;
try {

View File

@ -17,7 +17,8 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { Command, RegisterBehavior, Args } from '@sapphire/framework';
import { RegisterBehavior, Args } from '@sapphire/framework';
import { Subcommand } from '@sapphire/plugin-subcommands';
import {
ChannelType,
EmbedBuilder,
@ -41,17 +42,38 @@ import IDs from '#utils/ids';
// TODO add a check when they join the server to give the user the sus role again
export class SusCommand extends Command {
public constructor(context: Command.Context) {
export class SusCommand extends Subcommand {
public constructor(context: Subcommand.Context, options: Subcommand.Options) {
super(context, {
...options,
name: 'sus',
subcommands: [
{
name: 'add',
default: true,
chatInputRun: 'addNote',
messageRun: 'addMessage',
},
{
name: 'view',
chatInputRun: 'listNote',
},
{
name: 'remove',
chatInputRun: 'removeNote',
},
{
name: 'purge',
chatInputRun: 'removeAllNotes',
},
],
description: 'Notes about users that are sus',
preconditions: [['VerifierOnly', 'ModOnly']],
});
}
// Registers that this is a slash command
public override registerApplicationCommands(registry: Command.Registry) {
public override registerApplicationCommands(registry: Subcommand.Registry) {
registry.registerChatInputCommand(
(builder) => builder
.setName(this.name)
@ -89,41 +111,8 @@ export class SusCommand extends Command {
);
}
// Command run
public async chatInputRun(interaction: Command.ChatInputCommandInteraction) {
const subcommand = interaction.options.getSubcommand(true);
// Checks what subcommand was run
switch (subcommand) {
case 'add': {
await this.addNote(interaction);
return;
}
case 'view': {
await this.listNote(interaction);
return;
}
case 'remove': {
await this.removeNote(interaction);
return;
}
case 'purge': {
await this.removeAllNotes(interaction);
return;
}
default: {
// If subcommand is invalid
await interaction.reply({
content: 'Invalid sub command!',
ephemeral: true,
fetchReply: true,
});
}
}
}
// Subcommand to add sus note
private async addNote(interaction: Command.ChatInputCommandInteraction) {
public async addNote(interaction: Subcommand.ChatInputCommandInteraction) {
// Get the arguments
const user = interaction.options.getUser('user');
const note = interaction.options.getString('note');
@ -177,7 +166,7 @@ export class SusCommand extends Command {
});
}
private async listNote(interaction: Command.ChatInputCommandInteraction) {
public async listNote(interaction: Subcommand.ChatInputCommandInteraction) {
// Get the arguments
const user = interaction.options.getUser('user');
const { guild } = interaction;
@ -243,7 +232,7 @@ export class SusCommand extends Command {
});
}
private async removeNote(interaction: Command.ChatInputCommandInteraction) {
public async removeNote(interaction: Subcommand.ChatInputCommandInteraction) {
// Get the arguments
const noteId = interaction.options.getInteger('id');
const { guild, channel } = interaction;
@ -368,7 +357,7 @@ export class SusCommand extends Command {
});
}
private async removeAllNotes(interaction: Command.ChatInputCommandInteraction) {
public async removeAllNotes(interaction: Subcommand.ChatInputCommandInteraction) {
// Get the arguments
const user = interaction.options.getUser('user');
const { guild, channel } = interaction;
@ -488,7 +477,7 @@ export class SusCommand extends Command {
// Non Application Command method of adding a sus note
// xlevra begged me to add this... so I guess here it is
public async messageRun(message: Message, args: Args) {
public async addMessage(message: Message, args: Args) {
// Get arguments
let user: GuildMember;
try {