UNPKG

pockybot

Version:

Spark bot that handles team recognition

87 lines (83 loc) 3.38 kB
"use strict"; 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;