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