diff --git a/dist/discord.js b/dist/discord.js index 0ee607b..0e6f5c4 100644 --- a/dist/discord.js +++ b/dist/discord.js @@ -13,7 +13,8 @@ const commands = [ type: 4, name: 'teamsize', description: 'size of each team', - required: true + required: true, + min_value: 1 } ] }, @@ -30,8 +31,8 @@ const commands = [ description: 'ready the queue and display team info' }, { - name: 'queueinfo', - description: 'get info of the current queue' + name: 'cancel', + description: 'cancels the current queue (must have the Manage Messages permission)' }, { name: 'elo', diff --git a/dist/index.js b/dist/index.js index 5c47fc3..e873226 100644 --- a/dist/index.js +++ b/dist/index.js @@ -51,6 +51,8 @@ CLIENT.on('interactionCreate', async (interaction) => { await (0, queue_1.leaveQueue)(interaction); else if (interaction.commandName === 'ready') await (0, queue_1.readyQueue)(interaction); + else if (interaction.commandName === 'cancel') + await (0, queue_1.cancelQueue)(interaction); else if (interaction.commandName === 'queueinfo') await (0, queue_1.queueInfo)(interaction); else if (interaction.commandName === 'elo') diff --git a/dist/queue.js b/dist/queue.js index 284f73b..29bb257 100644 --- a/dist/queue.js +++ b/dist/queue.js @@ -1,6 +1,10 @@ "use strict"; +/* TODO +- queue timeout + - after 5 mins of inactivity, the queue will close +*/ Object.defineProperty(exports, "__esModule", { value: true }); -exports.queueInfo = exports.readyQueue = exports.leaveQueue = exports.joinQueue = exports.createQueue = exports.queueContains = void 0; +exports.queueInfo = exports.cancelQueue = exports.readyQueue = exports.leaveQueue = exports.joinQueue = exports.createQueue = exports.queueContains = void 0; const discord_js_1 = require("discord.js"); const util_1 = require("./util"); //maps ChannelID to QueueInfo @@ -17,6 +21,18 @@ function getMember(interaction) { throw 'Unable to retrieve guild member information, please try again'; return member; } +/** + * get the TextChannel of an interaction + * @param interaction + * @throws string message if it cannot be read + * @returns member + */ +function getChannel(interaction) { + let channel = interaction.channel; + if (!(channel instanceof discord_js_1.TextChannel)) + throw 'Unable to retrieve text channel information, please try again'; + return channel; +} /** * get the queueInfo of an interaction * @param interaction @@ -29,13 +45,24 @@ function getInfo(interaction) { throw 'There is not an active queue in this channel, type `/queue` to create one'; return info; } +/** + * compiles all the get functions above + * @param interaction + * @throws string message if it does not exist + * @returns object containing each + */ +const getAll = (interaction) => ({ + member: getMember(interaction), + channel: getChannel(interaction), + info: getInfo(interaction) +}); /** * checks if the interaction data is already in the queue * @param interaction * @returns boolean */ function queueContains(interaction) { - let member = getMember(interaction), info = getInfo(interaction); + let { member, info } = getAll(interaction); if (info.players.map(m => m.id).includes(member.id)) return true; return false; @@ -66,7 +93,7 @@ exports.createQueue = createQueue; * @throws string message if it cannot be joined */ async function joinQueue(interaction) { - let member = getMember(interaction), info = getInfo(interaction); + let { member, info } = getAll(interaction); if (queueContains(interaction)) throw 'You are already in the active queue'; info.players.push(member); @@ -80,7 +107,7 @@ exports.joinQueue = joinQueue; * @throws string message if it cannot be left */ async function leaveQueue(interaction) { - let member = getMember(interaction), info = getInfo(interaction); + let { member, info } = getAll(interaction); if (!queueContains(interaction)) throw 'You aren\'t in the active queue'; info.players.splice(info.players.indexOf(member), 1); @@ -94,7 +121,7 @@ exports.leaveQueue = leaveQueue; * @throws string message if it cannot be readied */ async function readyQueue(interaction) { - let member = getMember(interaction), info = getInfo(interaction), { initiator } = info; + let { member, info } = getAll(interaction), { initiator } = info; if (member.id !== initiator.id) throw 'Only the queue initiator can ready the queue'; //reset queue @@ -116,6 +143,20 @@ async function readyQueue(interaction) { await interaction.reply('```\n' + teamsStr.join('\n\n') + '\n```'); } exports.readyQueue = readyQueue; +/** + * readys a queue from an interaction + * @param interaction + * @throws string message if it cannot be reset + */ +async function cancelQueue(interaction) { + let { member, channel } = getAll(interaction); + if (!member.permissionsIn(channel).has('MANAGE_MESSAGES')) + throw 'You do not have permission to run this command'; + //reset queue + QUEUE.delete(interaction.channelId); + await interaction.reply('Queue has been reset'); +} +exports.cancelQueue = cancelQueue; /** * sends the queue information from an interaction * @param interaction diff --git a/src/discord.ts b/src/discord.ts index 0ea2fd4..0fd3178 100644 --- a/src/discord.ts +++ b/src/discord.ts @@ -11,7 +11,8 @@ const commands = [ type: 4, //INTEGER name: 'teamsize', description: 'size of each team', - required: true + required: true, + min_value: 1 } ] }, @@ -28,8 +29,8 @@ const commands = [ description: 'ready the queue and display team info' }, { - name: 'queueinfo', - description: 'get info of the current queue' + name: 'cancel', + description: 'cancels the current queue (must have the Manage Messages permission)' }, { name: 'elo', diff --git a/src/index.ts b/src/index.ts index 32325dd..042bc7b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,7 @@ import { Client, Intents } from 'discord.js'; import * as fs from 'fs'; import { getPlayerInteraction } from './api'; import { registerCommands } from './discord'; -import { createQueue, joinQueue, leaveQueue, queueInfo, readyQueue } from './queue'; +import { cancelQueue, createQueue, joinQueue, leaveQueue, queueInfo, readyQueue } from './queue'; const CLIENT = new Client({ intents: [Intents.FLAGS.GUILDS] }); //init logs with a timestamp @@ -37,6 +37,8 @@ CLIENT.on('interactionCreate', async interaction => { await leaveQueue(interaction); else if (interaction.commandName === 'ready') await readyQueue(interaction); + else if (interaction.commandName === 'cancel') + await cancelQueue(interaction); else if (interaction.commandName === 'queueinfo') await queueInfo(interaction); else if (interaction.commandName === 'elo') diff --git a/src/queue.ts b/src/queue.ts index c9a7a86..5a435eb 100644 --- a/src/queue.ts +++ b/src/queue.ts @@ -1,5 +1,9 @@ -import { info } from "console"; -import { CommandInteraction, GuildMember } from "discord.js"; +/* TODO +- queue timeout + - after 5 mins of inactivity, the queue will close +*/ + +import { CommandInteraction, GuildMember, TextChannel } from "discord.js"; import { shuffle } from "./util"; type queueInfo = { @@ -26,6 +30,21 @@ function getMember(interaction: CommandInteraction): GuildMember { return member; } +/** + * get the TextChannel of an interaction + * @param interaction + * @throws string message if it cannot be read + * @returns member + */ +function getChannel(interaction: CommandInteraction): TextChannel { + let channel = interaction.channel; + + if (!(channel instanceof TextChannel)) + throw 'Unable to retrieve text channel information, please try again'; + + return channel; +} + /** * get the queueInfo of an interaction * @param interaction @@ -41,6 +60,18 @@ function getInfo(interaction: CommandInteraction): queueInfo { return info; } +/** + * compiles all the get functions above + * @param interaction + * @throws string message if it does not exist + * @returns object containing each + */ +const getAll = (interaction: CommandInteraction) => ({ + member: getMember(interaction), + channel: getChannel(interaction), + info: getInfo(interaction) + }); + /** * checks if the interaction data is already in the queue * @param interaction @@ -48,8 +79,7 @@ function getInfo(interaction: CommandInteraction): queueInfo { */ export function queueContains(interaction: CommandInteraction): boolean { - let member = getMember(interaction), - info = getInfo(interaction); + let {member, info} = getAll(interaction); if (info.players.map(m=>m.id).includes(member.id)) return true; @@ -91,8 +121,7 @@ export async function createQueue(interaction: CommandInteraction) { */ export async function joinQueue(interaction: CommandInteraction) { - let member = getMember(interaction), - info = getInfo(interaction); + let {member, info} = getAll(interaction); if (queueContains(interaction)) throw 'You are already in the active queue'; @@ -112,8 +141,7 @@ export async function joinQueue(interaction: CommandInteraction) { */ export async function leaveQueue(interaction: CommandInteraction) { - let member = getMember(interaction), - info = getInfo(interaction); + let {member, info} = getAll(interaction); if (!queueContains(interaction)) throw 'You aren\'t in the active queue'; @@ -133,8 +161,7 @@ export async function leaveQueue(interaction: CommandInteraction) { */ export async function readyQueue(interaction: CommandInteraction) { - let member = getMember(interaction), - info = getInfo(interaction), + let {member, info} = getAll(interaction), {initiator} = info; if (member.id !== initiator.id) @@ -168,6 +195,25 @@ export async function readyQueue(interaction: CommandInteraction) { } +/** + * readys a queue from an interaction + * @param interaction + * @throws string message if it cannot be reset + */ +export async function cancelQueue(interaction: CommandInteraction) { + + let {member, channel} = getAll(interaction); + + if (!member.permissionsIn(channel).has('MANAGE_MESSAGES')) + throw 'You do not have permission to run this command'; + + //reset queue + QUEUE.delete(interaction.channelId); + + await interaction.reply('Queue has been reset'); + +} + /** * sends the queue information from an interaction * @param interaction