pockybot
Version:
Spark bot that handles team recognition
87 lines (83 loc) • 3.38 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const trigger_1 = require("../../models/trigger");
const constants_1 = require("../../constants");
const database_1 = require("../../models/database");
const command_1 = require("../../models/command");
const xmlMessageParser_1 = require("../parsers/xmlMessageParser");
class Status extends trigger_1.default {
constructor(webexService, databaseService, config, utilities) {
super();
this.webex = webexService;
this.database = databaseService;
this.config = config;
this.utilities = utilities;
}
isToTriggerOn(message) {
let parsedMessage = xmlMessageParser_1.default.parseNonPegMessage(message);
return parsedMessage.botId === constants_1.default.botId && parsedMessage.command.toLowerCase() === command_1.Command.Status;
}
isToTriggerOnPM(message) {
return message.text.toLowerCase().trim() === command_1.Command.Status;
}
async createMessage(message) {
let fromPerson = message.personId;
let pegs = await this.database.getPegsGiven(fromPerson);
let map = await this.mapIdToName(pegs);
let mapped = await this.mapData(map, fromPerson);
let response = `You have ${mapped.remaining} pegs left to give.`;
if (mapped.hasPegged) {
response += `
Here's the pegs you've given so far...
${mapped.goodPegs}`;
}
else {
response += `
You have not given any pegs so far.`;
}
if (mapped.hasPenalised) {
response += `
Here are the penalties you have received...
${mapped.penaltyPegs}`;
}
return {
markdown: response,
toPersonId: fromPerson,
roomId: null // Do this to over-write default
};
}
mapIdToName(data) {
const mapToDisplayNameAsync = data.reduce((promises, item) => {
return [...promises,
Promise.all([
this.webex.people.get(item.receiver),
item.comment
])
.then(([receiver, comment]) => ({ receiver: receiver.displayName, comment }))];
}, []);
return Promise.all(mapToDisplayNameAsync);
}
mapData(data, fromPerson) {
let remaining = '';
const keywords = this.config.getStringConfig('keyword');
const penaltyKeywords = this.config.getStringConfig('penaltyKeyword');
const nonPenaltyPegs = this.utilities.getNonPenaltyPegs(data, keywords, penaltyKeywords);
const penaltyPegs = this.utilities.getPenaltyPegs(data, keywords, penaltyKeywords);
const givenPegs = nonPenaltyPegs.length;
if (this.config.checkRole(fromPerson, database_1.Role.Unmetered)) {
remaining = 'unlimited';
}
else {
remaining = (this.config.getConfig('limit') - givenPegs).toString();
}
const pegMessageReducer = (msg, p) => msg + `* **${p.receiver}** — "_${p.comment}_"\n`;
return {
goodPegs: nonPenaltyPegs.reduce(pegMessageReducer, ''),
penaltyPegs: penaltyPegs.reduce(pegMessageReducer, ''),
remaining: remaining,
hasPegged: nonPenaltyPegs.length > 0,
hasPenalised: penaltyPegs.length > 0
};
}
}
exports.default = Status;