From 148d93aaabfcd9166d8bf4a1bcf8eeec9510c954 Mon Sep 17 00:00:00 2001 From: ashley zomo Date: Mon, 7 Feb 2022 14:39:05 -0600 Subject: [PATCH] updated file names --- dist/index.js | 19 ++- dist/queue.js | 395 +++++++++++++++++++++++++++----------------------- src/index.ts | 2 +- src/queue.ts | 6 +- 4 files changed, 225 insertions(+), 197 deletions(-) diff --git a/dist/index.js b/dist/index.js index 6d22b89..9388f0d 100644 --- a/dist/index.js +++ b/dist/index.js @@ -29,31 +29,30 @@ const CLIENT = new discord_js_1.Client({ intents: [discord_js_1.Intents.FLAGS.GU //init logs with a timestamp console.log(new Date().toISOString() + '\n\n'); //get token -if (!fs.existsSync('./token')) { - fs.writeFileSync('./token', ''); +if (!fs.existsSync('./token.txt')) { + fs.writeFileSync('./token.txt', ''); console.error('Missing Discord Token, please enter the bot token into the token file'); process.exit(1); } -const TOKEN = fs.readFileSync('./token').toString(); +const TOKEN = fs.readFileSync('./token.txt').toString(); //discord connections CLIENT.on('ready', client => { console.log(`Logged in as ${client.user.tag}`); client.guilds.fetch().then(guilds => (0, discord_1.registerCommands)(TOKEN, client.user.id, guilds.map(g => g.id))); + (0, queue_1.discordInit)(client); }); CLIENT.on('interactionCreate', async (interaction) => { if (!interaction.isCommand()) return; try { if (interaction.commandName === 'queue') - await (0, queue_1.createQueue)(interaction); + await queue_1.QueueCommands.queue(interaction); else if (interaction.commandName === 'join') - await (0, queue_1.joinQueue)(interaction); + await queue_1.QueueCommands.join(interaction); else if (interaction.commandName === 'leave') - 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); + await queue_1.QueueCommands.leave(interaction); + else if (interaction.commandName === 'stop') + await queue_1.QueueCommands.stop(interaction); else if (interaction.commandName === 'player') await (0, api_1.getPlayerInteraction)(interaction); } diff --git a/dist/queue.js b/dist/queue.js index 77c1bbd..98a44e8 100644 --- a/dist/queue.js +++ b/dist/queue.js @@ -1,189 +1,218 @@ "use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.cancelQueue = exports.readyQueue = exports.leaveQueue = exports.joinQueue = exports.createQueue = exports.queueContains = exports.getAll = exports.getInfo = void 0; -const discord_js_1 = require("discord.js"); -const util_1 = require("./util"); -//maps ChannelID to QueueInfo -const QUEUE = new Map(); -/** - * get the queueInfo of an interaction - * @param interaction - * @throws errorMessage class if it does not exist - * @returns queue info - */ -function getInfo(interaction) { - let info = QUEUE.get(interaction.channelId); - if (!info) - throw (0, util_1.emsg)('There is not an active queue in this channel, type `/queue` to create one'); - return info; -} -exports.getInfo = getInfo; -/** - * compiles all the get functions above - * @param interaction - * @throws if another get function throws - * @returns object containing each - */ -const getAll = (interaction) => ({ - member: (0, util_1.getMember)(interaction), - channel: (0, util_1.getChannel)(interaction), - info: getInfo(interaction) +/* TODO + +join message should contain your current position in the queue, editing it to keep it current +*/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; }); -exports.getAll = getAll; -/** - * checks if the interaction data is already in the queue - * @param interaction - * @returns boolean - */ -function queueContains(interaction) { - let { member, info } = (0, exports.getAll)(interaction); - if (info.players.map(m => m.id).includes(member.id)) - return true; - return false; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.QueueCommands = exports.discordInit = void 0; +const discord_js_1 = require("discord.js"); +const fs = __importStar(require("fs")); +const util_1 = require("./util"); +//load queues from file +if (!fs.existsSync('./queues.json')) + fs.writeFileSync('./queues.json', '{}'); +const _QUEUE = fs.readFileSync('./queues.json').toString(), QUEUE = new Map(); +try { + let queueJson = JSON.parse(_QUEUE); + for (let channelId of queueJson) { + let { teamsize } = queueJson[channelId]; + if (teamsize) + QUEUE.set(channelId, { teamsize, players: [] }); + } } -exports.queueContains = queueContains; -/** - * creates the timeout for the queue - * @param interaction - * @returns time timeout identifier - */ -function setQueueTimeout(interaction) { - let channel = (0, util_1.getChannel)(interaction); - return setTimeout(() => { - clearQueue(interaction); - channel.send('Queue has been reset due to inactivity'); - }, 5 * 60 * 1000); //5 minutes +catch (e) { } +function SaveQueue() { + let queueJson = Object.fromEntries(QUEUE), queueFileJson = {}; + for (let channelId in QUEUE.keys()) + queueFileJson[channelId] = { teamsize: queueJson[channelId].teamsize }; + fs.writeFileSync('./queues.json', JSON.stringify(queueFileJson, null, 2)); } -/** - * updates the rich embed for the current queue - * @param interaction - */ -async function sendQueueEmbed(interaction, closed = false) { - let info = getInfo(interaction), origInteraction = info.initiator.interaction; - let embed = new discord_js_1.MessageEmbed() - .setTitle('Queue') - .setAuthor({ - name: info.initiator.member.displayName, - iconURL: info.initiator.member.displayAvatarURL({ dynamic: true }) - }) - .addField('Team Size', info.teamsize.toString(), true) - .addField('Players Joined', info.players.length.toString(), true) - .setFooter({ text: closed ? 'queue is finished' : 'type /join' }); - if (origInteraction.deferred || origInteraction.replied) - await origInteraction.editReply({ embeds: [embed] }); - else - await origInteraction.reply({ embeds: [embed] }); +async function checkQueue(channel) { + let info = QUEUE.get(channel.id); + if (!info) + return; + if (info.players.length > info.teamsize) { + let team = info.players.splice(0, info.teamsize).map(m => m.toString()); + let embed = new discord_js_1.MessageEmbed() + .setTitle('Team') + .setDescription(team.join('\n')); + await channel.send({ embeds: [embed] }); + } } -/** - * sends the list of teams - * @param interaction - */ -async function sendTeamsEmbed(interaction, teams) { - let embed = new discord_js_1.MessageEmbed() - .setTitle('Teams'); - teams.forEach((team, i) => { - team.map(m => m.user.tag); - embed.addField(`Title ${i + 1}`, team.join('\n')); +var Queue; +(function (Queue) { + function create(channelId, teamsize) { + if (!QUEUE.has(channelId)) { + QUEUE.set(channelId, { teamsize, players: [] }); + SaveQueue(); + } + } + Queue.create = create; + function remove(channelId) { + if (QUEUE.has(channelId)) { + QUEUE.delete(channelId); + SaveQueue(); + } + } + Queue.remove = remove; + function addPlayer(channelId, member) { + if (QUEUE.has(channelId)) { + QUEUE.delete(channelId); + } + } + Queue.addPlayer = addPlayer; + function removePlayer(channelId, member) { + if (QUEUE.has(channelId)) { + QUEUE.delete(channelId); + } + } + Queue.removePlayer = removePlayer; +})(Queue || (Queue = {})); +SaveQueue(); +async function discordInit(client) { + for (let channelId in QUEUE.keys()) { + let info = QUEUE.get(channelId), channel = await client.channels.fetch(channelId); + if (!info) { //no idea what could cause this but TS complains + Queue.remove(channelId); + continue; + } + if (!channel || !(channel instanceof discord_js_1.TextChannel)) { + console.error(`Unable to find channel ${channelId} for teams of ${info?.teamsize}`); + Queue.remove(channelId); + continue; + } + channel.send('The bot has just restarted and anybody in the queues have been reset'); + } +} +exports.discordInit = discordInit; +var QueueCommands; +(function (QueueCommands) { + /** + * get the queueInfo of an interaction + * @param interaction + * @throws errorMessage class if it does not exist + * @returns queue info + */ + function getInfo(interaction) { + let info = QUEUE.get(interaction.channelId); + if (!info) + throw (0, util_1.emsg)('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 if another get function throws + * @returns object containing each + */ + const getAll = (interaction) => ({ + member: (0, util_1.getMember)(interaction), + channel: (0, util_1.getChannel)(interaction), + info: getInfo(interaction) }); - interaction.reply({ embeds: [embed] }); -} -/** - * sends the list of teams - * @param interaction - */ -async function clearQueue(interaction) { - let info = getInfo(interaction); - sendQueueEmbed(interaction, true); - clearTimeout(info.timeout); - QUEUE.delete(interaction.channelId); -} -/** - * creates a queue from an interaction - * @param interaction - * @throws errorMessage class if it cannot be created - */ -async function createQueue(interaction) { - let member = (0, util_1.getMember)(interaction), { channelId } = interaction, teamsize = interaction.options.getInteger('teamsize', true); - if (QUEUE.has(channelId)) - throw (0, util_1.emsg)('There is already an active queue in this channel, ' + (queueContains(interaction) ? 'and you are already in it' : 'type `/join` to join')); - QUEUE.set(channelId, { - players: [ - member - ], - initiator: { - interaction, - member - }, - teamsize: teamsize, - timeout: setQueueTimeout(interaction) - }); - sendQueueEmbed(interaction); -} -exports.createQueue = createQueue; -/** - * joins a queue from an interaction - * @param interaction - * @throws errorMessage class if it cannot be joined - */ -async function joinQueue(interaction) { - let { member, info } = (0, exports.getAll)(interaction); - if (queueContains(interaction)) - throw (0, util_1.emsg)('You are already in the active queue'); - info.players.push(member); - clearTimeout(info.timeout); - info.timeout = setQueueTimeout(interaction); - QUEUE.set(interaction.channelId, info); - sendQueueEmbed(interaction); - await interaction.reply('Joined the queue'); -} -exports.joinQueue = joinQueue; -/** - * leaves a queue from an interaction - * @param interaction - * @throws errorMessage class if it cannot be left - */ -async function leaveQueue(interaction) { - let { member, info } = (0, exports.getAll)(interaction); - if (!queueContains(interaction)) - throw (0, util_1.emsg)('You aren\'t in the active queue'); - info.players.splice(info.players.indexOf(member), 1); - clearTimeout(info.timeout); - info.timeout = setQueueTimeout(interaction); - QUEUE.set(interaction.channelId, info); - sendQueueEmbed(interaction); - await interaction.reply('Left the queue'); -} -exports.leaveQueue = leaveQueue; -/** - * readys a queue from an interaction - * @param interaction - * @throws errorMessage class if it cannot be readied - */ -async function readyQueue(interaction) { - let { member, info } = (0, exports.getAll)(interaction), { initiator } = info; - if (member.id !== initiator.member.id) - throw (0, util_1.emsg)('Only the queue initiator can ready the queue'); - clearQueue(interaction); - if (info.players.filter(m => m.id !== initiator.member.id).length === 0) - throw (0, util_1.emsg)('Nobody signed up for the queue, the queue has been reset'); - //team data - let playerlist = (0, util_1.shuffle)(info.players), teams = []; - //fill team data - for (let i = 0; i < playerlist.length; i += info.teamsize) - teams.push(playerlist.slice(i, i + info.teamsize)); - sendTeamsEmbed(interaction, teams); -} -exports.readyQueue = readyQueue; -/** - * readys a queue from an interaction - * @param interaction - * @throws errorMessage class if it cannot be reset - */ -async function cancelQueue(interaction) { - let { info, member, channel } = (0, exports.getAll)(interaction); - if (!member.permissionsIn(channel).has('MANAGE_MESSAGES')) - throw (0, util_1.emsg)('You do not have permission to run this command'); - clearQueue(interaction); - await interaction.reply('Queue has been reset'); -} -exports.cancelQueue = cancelQueue; + /** + * checks if the interaction data is already in the queue + * @param interaction + * @returns boolean + */ + function queueContains(interaction) { + let { member, info } = getAll(interaction); + if (info.players.map(m => m.id).includes(member.id)) + return true; + return false; + } + QueueCommands.queueContains = queueContains; + /** + * creates a queue from an interaction + * @param interaction + * @throws errorMessage class if it cannot be left + */ + function queueCreate(interaction) { + (0, util_1.memberIsModThrow)(interaction); + let { channelId } = interaction, teamsize = interaction.options.getInteger('teamsize', true); + if (QUEUE.has(channelId)) + throw (0, util_1.emsg)(`There is already an active queue in this channel for teams of ${QUEUE.get(channelId)?.teamsize}`); + Queue.create(channelId, teamsize); + interaction.reply(`A queue for teams of ${teamsize} has been started`); + } + QueueCommands.queueCreate = queueCreate; + /** + * creates a queue from an interaction + * @param interaction + * @throws errorMessage class if it cannot be left + */ + async function queue(interaction) { + let teamsize = interaction.options.getInteger('teamsize'); + if (teamsize) { + queueCreate(interaction); + return; + } + let info = getInfo(interaction); + let embed = new discord_js_1.MessageEmbed() + .setTitle('Active Queue') + .addField('Team Size', info.teamsize.toString(), true) + .addField('Players Joined', info.players.length.toString(), true) + .setFooter({ text: 'type /join' }); + await interaction.reply({ embeds: [embed], ephemeral: true }); + } + QueueCommands.queue = queue; + /** + * stops a queue from an interaction + * @param interaction + * @throws errorMessage class if it cannot be joined + */ + async function stop(interaction) { + (0, util_1.memberIsModThrow)(interaction); + QUEUE.delete(interaction.channelId); + await interaction.reply('Queue has been reset'); + } + QueueCommands.stop = stop; + /** + * joins a queue from an interaction + * @param interaction + * @throws errorMessage class if it cannot be readied + */ + async function join(interaction) { + let { member, info, channel } = getAll(interaction); + if (queueContains(interaction)) + throw (0, util_1.emsg)('You are already in the queue'); + info.players.push(member); + QUEUE.set(interaction.channelId, info); + await interaction.reply('Joined the queue'); + checkQueue(channel); + } + QueueCommands.join = join; + /** + * leaves a queue from an interaction + * @param interaction + * @throws errorMessage class if it cannot be reset + */ + async function leave(interaction) { + let { member, info } = getAll(interaction); + if (!queueContains(interaction)) + throw (0, util_1.emsg)('You aren\'t in the queue'); + info.players.splice(info.players.indexOf(member), 1); + QUEUE.set(interaction.channelId, info); + await interaction.reply('Left the queue'); + } + QueueCommands.leave = leave; +})(QueueCommands = exports.QueueCommands || (exports.QueueCommands = {})); diff --git a/src/index.ts b/src/index.ts index 7a17465..54463b3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,7 +16,7 @@ if (!fs.existsSync('./token.txt')) { console.error('Missing Discord Token, please enter the bot token into the token file'); process.exit(1); } -const TOKEN = fs.readFileSync('./token').toString(); +const TOKEN = fs.readFileSync('./token.txt').toString(); //discord connections CLIENT.on('ready', client => { diff --git a/src/queue.ts b/src/queue.ts index 8b550f2..57cb6cf 100644 --- a/src/queue.ts +++ b/src/queue.ts @@ -8,10 +8,10 @@ import * as fs from 'fs'; import { emsg, getChannel, getMember, memberIsModThrow, queueInfo, queueInfoBase } from "./util"; //load queues from file -if (!fs.existsSync('./queues')) - fs.writeFileSync('./queues', '{}'); +if (!fs.existsSync('./queues.json')) + fs.writeFileSync('./queues.json', '{}'); -const _QUEUE = fs.readFileSync('./queues').toString(), +const _QUEUE = fs.readFileSync('./queues.json').toString(), QUEUE = new Map(); try {