// 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 SendPlayerRankMessageAction extends ChannelAction {
/**
* @description Create an action that will send a message to the game channel
* with the player rankings.
*/
constructor() {
super((hg, game, channel) => {
const current = game.currentGame;
const rankEmbed = new hg._parent.Discord.EmbedBuilder();
rankEmbed.setColor([255, 0, 255]);
rankEmbed.setTitle('Final Ranks (kills)');
const rankList =
current.includedUsers.sort((a, b) => a.rank - b.rank).map((obj) => {
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)}...`;
}
}
shortName = shortName.replace(/_/g, '\\_');
const kills = obj.kills > 0 ? ` (${obj.kills})` : '';
return `${obj.rank}) ${shortName}${kills}`;
});
if (rankList.length == 0) {
// Can't send ranks if there are no players.
return;
} else if (rankList.length <= 20) {
rankEmbed.setDescription(rankList.join('\n'));
} else if (rankList.length > 100) {
rankList.splice(100);
const thirdLength = Math.floor(rankList.length / 3);
for (let i = 0; i < 2; i++) {
const thisMessage =
rankList.splice(0, thirdLength).join('\n').slice(0, 1024);
rankEmbed.addFields([{name: `${i + 1}`, value: thisMessage}]);
}
rankEmbed.addFields(
[{name: '3', value: rankList.join('\n').slice(0, 1024)}]);
} else {
const thirdLength = Math.floor(rankList.length / 3);
for (let i = 0; i < 2; i++) {
const thisMessage =
rankList.splice(0, thirdLength).join('\n').slice(0, 1024);
rankEmbed.addFields([{name: `${i + 1}`, value: thisMessage}]);
}
rankEmbed.addFields(
[{name: '3', value: rankList.join('\n').slice(0, 1024)}]);
}
if (!game.options.disableOutput) {
channel.send({embeds: [rankEmbed]}).catch((err) => {
hg._parent.error(`Failed to send ranks message: ${channel.id}`);
console.error(err);
});
}
}, 5000);
}
/**
* @description Create action from save data.
* @public
* @static
* @override
* @returns {HungryGames~SendPlayerRankMessageAction} The created action.
*/
static create() {
return new SendPlayerRankMessageAction();
}
}
module.exports = SendPlayerRankMessageAction;