la-cosa-nostra
Version:
A Mafia bot designed to run in Discord - beware the traitors and the lies!
177 lines (115 loc) • 4.5 kB
JavaScript
var texts = require("./text/texts.js");
var format = require("./__formatter.js");
var alphabets = require("../alpha_table.js");
var auxils = require("./../auxils.js");
module.exports = async function (game) {
var roles = game.players;
var client = game.client;
var config = game.config;
var no_lynch_option = game.config["game"]["lynch"]["no-lynch-option"];
var guild = client.guilds.get(config["server-id"]);
var vote = guild.channels.find(x => x.name === config["channels"]["voting"]);
var message = texts.public_vote;
message = message.replace("{;public_votes}", getVoteList());
message = message.replace("{;vote_configurations}", getVoteConfiguration());
message = await vote.send(format(game, message));
var chunk = 16;
var messages = [message];
var alive = game.getAlivePlayers();
var reactions = alive.map(x => alphabets[x.alphabet.toLowerCase()]);
if (no_lynch_option) {
// No lynch reaction trigger
reactions.push(alphabets["nl"]);
};
var special_vote_types = game.getPeriodLog().special_vote_types;
for (var i = 0; i < special_vote_types.length; i++) {
if (special_vote_types[i].emote) {
reactions.push(special_vote_types[i].emote);
};
};
for (var i = 0; i < reactions.length; i += chunk) {
var current = reactions.slice(i, i + chunk);
if (i === 0) {
for (var j = 0; j < current.length; j++) {
await message.react(current[j]);
};
} else {
var message = await vote.send("_ _");
messages.push(message);
for (var j = 0; j < current.length; j++) {
await message.react(current[j]);
};
};
};
game.save();
return messages;
function getVoteList () {
var displays = new Array();
for (var i = 0; i < roles.length; i++) {
if (roles[i].status.alive) {
// Get display role
// Get people voting against
var voting_against = roles[i].votes;
var concat = new Array();
// Get their display names
for (var j = 0; j < voting_against.length; j++) {
// Mapped by IDs
var player = game.getPlayerByIdentifier(voting_against[j].identifier);
concat.push(player.getDisplayName());
};
var names = auxils.pettyFormat(concat);
names = voting_against.length > 0 ? ": " + names : "";
displays.push("<@" + roles[i].id + "> (" + roles[i].countVotes() + ")" + names);
} else {
displays.push("[" + roles[i].alphabet + " - dead, **" + roles[i].getDisplayRole(false) + "**]");
};
};
if (no_lynch_option) {
var voters = game.getNoLynchVoters();
var vote_count = game.getNoLynchVoteCount();
var concat = voters.map(x => game.getPlayerByIdentifier(x).getDisplayName());
var names = auxils.pettyFormat(concat);
names = voters.length > 0 ? ": " + names : "";
displays.push("**No-lynch** (" + vote_count + ")" + names);
};
var special_vote_types = game.getPeriodLog().special_vote_types;
for (var i = 0; i < special_vote_types.length; i++) {
var voters = special_vote_types[i].voters;
var vote_count = game.getSpecialVoteCount(special_vote_types[i].identifier);
var names = auxils.pettyFormat(voters.map(x => game.getPlayerByIdentifier(x.identifier).getDisplayName()));
names = voters.length > 0 ? ": " + names : "";
displays.push("**" + special_vote_types[i].name + "** (" + vote_count + ")" + names);
};
return displays.join("\n");
};
function getVoteConfiguration () {
var ret = new Array();
var lynch_config = config["game"]["lynch"];
if (game.getLynchesAvailable() > 1) {
ret.push(texts.lynchtext_available);
};
if (!lynch_config["top-voted-lynch"] || game.hammerActive()) {
if (lynch_config["no-lynch-option"]) {
ret.push(texts.lynchtext_nolynch);
} else {
ret.push(texts.lynchtext_standard);
};
} else {
ret.push(texts.lynchtext_tvl);
};
if (game.hammerActive() && !lynch_config["top-voted-lynch"]) {
ret.push(texts.lynchtext_hammer);
};
if (game.hammerActive() && lynch_config["top-voted-lynch"]) {
ret.push(texts.lynchtext_hammer_tvl);
};
if (lynch_config["top-voted-lynch"]) {
if (lynch_config["tied-random"]) {
ret.push(texts.lynchtext_maxrandom);
} else {
ret.push(texts.lynchtext_maxnolynch);
};
};
return ret.join("\n");
};
};