// Copyright 2019 Campbell Crowley. All rights reserved.
// Author: Campbell Crowley (dev@campbellcrowley.com)
const ChannelAction = require('./ChannelAction.js');
/**
* @description Sends message with player rankings.
*
* @memberof HungryGames~Action
* @inner
* @augments HungryGames~Action~ChannelAction
*/
class SendTeamRankMessageAction extends ChannelAction {
/**
* @description Create an action that will send a message to the game channel
* with the team rankings.
*/
constructor() {
super((hg, game, channel) => {
if (game.options.teamSize > 0) {
const current = game.currentGame;
const teamRankEmbed = new hg._parent.Discord.EmbedBuilder();
teamRankEmbed.setTitle('Final Team Ranks');
this._sortTeams(game);
const splitEmbeds =
game.currentGame.teams.length < 25 && game.options.teamSize > 0;
let prevTeam = -1;
const statusList = current.includedUsers.map((obj) => {
const myTeam = current.teams.findIndex((team) => {
return team.players.findIndex((player) => player == obj.id) > -1;
});
let shortName;
if (obj.nickname && game.options.useNicknames) {
shortName = obj.nickname.substring(0, 16);
if (shortName != obj.nickname) {
shortName = shortName.substring(0, 13) + '...';
}
} else {
shortName = obj.name.substring(0, 16);
if (shortName != obj.name) {
shortName = shortName.substring(0, 13) + '...';
}
}
if (splitEmbeds) return shortName;
let prefix = '';
if (myTeam != prevTeam) {
prevTeam = myTeam;
prefix = current.teams[myTeam].rank + ') __' +
current.teams[myTeam].name + '__\n';
}
return `${prefix}\`${shortName}\``;
});
if (splitEmbeds) {
game.currentGame.teams.forEach((el) => {
teamRankEmbed.addFields([{
name: `${el.rank}) ${el.name}`,
value: statusList.splice(0, el.players.length)
.join('\n')
.slice(0, 1023),
}]);
});
} else {
if (statusList.length >= 5) {
const numCols = hg._parent.calcColNum(
statusList.length > 10 ? 3 : 2, statusList);
const quarterLength = Math.ceil(statusList.length / numCols);
for (let i = 0; i < numCols - 1; i++) {
const thisMessage =
statusList.splice(0, quarterLength).join('\n');
teamRankEmbed.addFields([{name: i + 1, value: thisMessage}]);
}
teamRankEmbed.addFields(
[{name: numCols, value: statusList.join('\n')}]);
} else {
teamRankEmbed.setDescription(statusList.join('\n'));
}
}
teamRankEmbed.setColor([255, 0, 255]);
if (!game.options.disableOutput) {
channel.send({embeds: [teamRankEmbed]}).catch((err) => {
hg._parent.error('Failed to send final team ranks: ' + channel.id);
console.error(err);
});
}
}
}, 10000);
}
/**
* @description Sort the includedUsers and teams by final ranking.
* @private
* @param {HungryGames~GuildGame} game The game to sort.
*/
_sortTeams(game) {
game.currentGame.teams.sort((a, b) => a.rank - b.rank);
game.currentGame.includedUsers.sort((a, b) => {
const aTeam = game.currentGame.teams.find(
(team) => team.players.find((p) => p == a.id));
const bTeam = game.currentGame.teams.find(
(team) => team.players.find((p) => p == b.id));
if (!aTeam || !bTeam || aTeam.id == bTeam.id) {
const aN = ((game.options.useNicknames && a.nickname) || a.name)
.toLocaleLowerCase();
const bN = ((game.options.useNicknames && b.nickname) || b.name)
.toLocaleLowerCase();
if (aN < bN) return -1;
if (aN > bN) return 1;
return 0;
} else {
return aTeam.rank - bTeam.rank;
}
});
}
/**
* @description Create action from save data.
* @public
* @static
* @override
* @returns {HungryGames~SendTeamRankMessageAction} The created action.
*/
static create() {
return new SendTeamRankMessageAction();
}
}
module.exports = SendTeamRankMessageAction;