UNPKG

pockybot

Version:

Spark bot that handles team recognition

162 lines (161 loc) 6.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const trigger_1 = require("../../models/trigger"); const constants_1 = require("../../constants"); const xmlMessageParser_1 = require("../parsers/xmlMessageParser"); const logger_1 = require("../logger"); const command_1 = require("../../models/command"); // A joke option. Tells users pegs have been removed, but no pegs will actually be taken. class Unpeg extends trigger_1.default { constructor(webex, database, utilities) { super(); this.webex = webex; this.database = database; this.utilities = utilities; } isToTriggerOn(message) { logger_1.Logger.debug('entering the unpeg isToTriggerOn'); let parsedMessage = xmlMessageParser_1.default.parsePegMessage(message); return this.validateTrigger(parsedMessage); } async createMessage(message, room) { if (!this.validateMessage(message)) { return { markdown: `I'm sorry, I couldn't understand your unpeg request. Please use the following format: @${constants_1.default.botName} unpeg @Person this is the reason for giving you a peg` }; } let parsedMessage = xmlMessageParser_1.default.parsePegMessage(message); let fromPersonId = message.personId; try { let toPerson = await this.getToPerson(parsedMessage); let fromData = await this.database.getUser(fromPersonId); if (!fromData.userid) { throw new Error('No from person was obtained'); } toPerson = this.getDestinationName(fromData.username, toPerson); return await this.returnRandomResponse(toPerson, fromData.username, room); } catch (error) { return { markdown: 'User could not be found or created. No peg removed.' }; } } validateTrigger(message) { if (message.botId !== constants_1.default.botId) { return false; } return message.children[1].text().toLowerCase().trim().startsWith(command_1.Command.Unpeg); } validateMessage(message) { try { let parsedMessage = xmlMessageParser_1.default.parsePegMessage(message); if (parsedMessage.botId !== constants_1.default.botId) { logger_1.Logger.warn('First person mentioned in unpeg candidate message is not bot'); return false; } if (parsedMessage.children.length < 2) { logger_1.Logger.warn('Unpeg candidate message does not contain 2 or more xml parts.'); return false; } if (parsedMessage.children[1].text().toLowerCase().trim().startsWith(command_1.Command.Unpeg)) { return true; } else { logger_1.Logger.warn(`Unpeg candidate message child 1 does not contain unpegCommand: ${parsedMessage.children[1].text()}`); return false; } } catch (e) { logger_1.Logger.error(`Error in unpeg validateMessage:\n${e.message}`); throw new Error('Error in unpeg validateMessage'); } } async getToPerson(message) { if (message.toPersonId) { let data = await this.database.getUser(message.toPersonId); if (!data.userid) { throw new Error('No to person was obtained'); } return data.username; } else { const pattern = new RegExp('^' + command_1.Command.Unpeg, 'ui'); const text = message.children.reduce((a, child, index) => { // first child should be mention if (index > 0) { return a + child.text(); } return a; }, '').trim().replace(pattern, '').trim(); const index = text.indexOf(' for'); if (index < 0) { return text.split(' ')[0]; } else { return text.split(' for')[0]; } } } async returnRandomResponse(toUser, fromUser, room) { let num = this.utilities.getRandomInt(7); toUser = (toUser || 'someone'); fromUser = (fromUser || 'Dave'); switch (num) { case 0: return await this.sendFollowUpResponse(`Peg removed from ${toUser}.`, 'Kidding!', room); case 1: return this.sendResponse(`It looks like ${toUser} has hidden their pegs too well for me to find them!`); case 2: return await this.sendFollowUpResponse(`${toUser}'s peg has been removed...`, `But ${toUser} stole it back!`, room); case 3: return await this.sendFollowUpResponse(`Peg given to ${toUser}`, `But ${toUser} didn't want it!`, room); case 4: return this.sendResponse(`I'm sorry ${fromUser}, I'm afraid I can't do that.`); case 5: return this.sendResponse(`### HTTP Status Code 418: I'm a teapot. Unable to brew coffee. Or pegs.`); case 6: let nonAlphanumericRegex = new RegExp('[^0-9a-z]', 'gi'); let safeName = fromUser.replace(nonAlphanumericRegex, ''); if (safeName.length === 0) { safeName = 'ThatPerson'; } return this.sendResponse(`\`\`\` Error: Access Denied user ${fromUser} does not have the correct privileges at UnPeg (unpeg.js:126) at EveryoneBut${safeName} (unpeg.js:4253) at ExecuteBadCode (pockybot.js:1467) at DecrementPegs (pockybot.js:1535) \`\`\``); default: return { markdown: `Whoops, looks like RNGesus did not smile upon you today.` }; } } sendResponse(response) { return { markdown: response }; } async sendFollowUpResponse(initialResponse, followUp, room) { this.webex.messages.create({ markdown: initialResponse, roomId: room }); await this.utilities.sleep(30); return { markdown: followUp }; } getDestinationName(from, to) { if (to === "me") { return from; } return to; } } exports.default = Unpeg; ;