UNPKG

pockybot

Version:

Spark bot that handles team recognition

85 lines (84 loc) 5.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DefaultWinnersService = void 0; const tableHelper_1 = require("../parsers/tableHelper"); const helpers_1 = require("../helpers/helpers"); class DefaultWinnersService { constructor(database, config, utilities, pegService) { this.cannotDisplayResults = 'Error encountered; cannot display winners.'; this.database = database; this.config = config; this.utilities = utilities; this.pegService = pegService; } getWinners(results) { let allReceivers = results.map(x => x.receiverId); allReceivers = helpers_1.distinct(allReceivers); let resultsForEligibleWinners = this.getEligibleWinnerResults(allReceivers, results); // This two-step process used to prevent array out of bounds exceptions if there are too few winners let topNumberOfPegsReceived = resultsForEligibleWinners.map(x => x.weightedPegsReceived).sort((a, b) => b - a) .slice(0, this.config.getConfig('winners')); let topCutoff = topNumberOfPegsReceived[topNumberOfPegsReceived.length - 1]; return resultsForEligibleWinners.sort((a, b) => b.weightedPegsReceived - a.weightedPegsReceived) .filter(x => x.weightedPegsReceived >= topCutoff); } async returnWinnersResponse() { const data = await this.database.returnResults(); const pegs = await this.pegService.getPegs(data); const winners = this.getWinners(pegs); let columnWidths = tableHelper_1.default.getReceiverColumnWidths(winners); // define table heading let winnersTable = tableHelper_1.default.padString('Receiver', columnWidths.receiver) + ' | ' + tableHelper_1.default.padString('Sender', columnWidths.sender) + ' | Comments\n'; winnersTable += 'Total'.padEnd(columnWidths.receiver) + ' | ' + ' '.padEnd(columnWidths.sender) + ' | \n'; winnersTable += ''.padEnd(columnWidths.receiver, '-') + '-+-' + ''.padEnd(columnWidths.sender, '-') + '-+-' + ''.padEnd(columnWidths.comment, '-') + '\n'; // put in table data winners.forEach((winner) => { winnersTable += winner.personName.padEnd(columnWidths.receiver) + ' | ' + ''.padEnd(columnWidths.sender) + ' | \n'; let firstPeg = true; let pegCount = winner.weightedPegsReceived; winner.validPegsReceived.forEach((peg) => { if (firstPeg) { winnersTable += pegCount.toString().padEnd(columnWidths.receiver) + ' | ' + peg.senderName.padEnd(columnWidths.sender) + ' | ' + peg.comment + '\n'; firstPeg = false; } else { winnersTable += ''.padEnd(columnWidths.receiver) + ' | ' + peg.senderName.padEnd(columnWidths.sender) + ' | ' + peg.comment + '\n'; } }); }); return '```\n' + winnersTable + '```'; } /** * * @param allCandidates a string array of the userIds of every person who has sent any pegs * @param results an array of every single peg given * @returns an array of results for all the users who have given above the minimum required to be eligible to win */ getEligibleWinnerResults(allCandidates, results) { const minimum = this.config.getConfig('minimum'); const requireKeywords = this.config.getConfig('requireValues'); const keywords = this.config.getStringConfig('keyword'); const penaltyKeywords = this.config.getStringConfig('penaltyKeyword'); let resultsForEligibleWinners = []; allCandidates.forEach(person => { const validPegsSent = results.filter(x => x.senderId === person && this.utilities.pegValid(x.comment, requireKeywords, keywords, penaltyKeywords)); if (validPegsSent.length >= minimum) { const validPegsReceived = results.filter(x => x.receiverId === person && this.utilities.pegValid(x.comment, requireKeywords, keywords, penaltyKeywords)); const validPegsTotal = validPegsReceived.reduce((a, b) => a + b.pegWeighting, 0); const penaltyPegsGiven = results.filter(x => x.senderId === person && !this.utilities.pegValid(x.comment, requireKeywords, keywords, penaltyKeywords)); const personName = validPegsReceived.length > 0 ? validPegsReceived[0].receiverName : penaltyPegsGiven[0].senderName; const personLocation = validPegsReceived.length > 0 ? validPegsReceived[0].receiverLocation : penaltyPegsGiven[0].senderLocation; resultsForEligibleWinners.push({ personId: person, personName, personLocation, weightedPegsReceived: validPegsTotal - penaltyPegsGiven.length, validPegsReceived, penaltyPegsGiven }); } }); return resultsForEligibleWinners; } } exports.DefaultWinnersService = DefaultWinnersService;