pockybot
Version:
Spark bot that handles team recognition
162 lines (161 loc) • 6.43 kB
JavaScript
;
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;
;