cosa-nostra-backstabbers
Version:
Turbo Mafia bot based off LCN
188 lines (107 loc) • 4.04 kB
JavaScript
var Game = require("./Game.js");
var Setup = require("./Setup.js");
module.exports = class {
constructor (client, config) {
this.client = client;
this.config = config;
this.guild = this.client.guilds.find(x => x.id === config["server-id"]);
this.players = new Array();
this.vote_start = new Array();
this.setup_votes = new Object();
this.setup = new Setup();
this.createTimeout();
}
voteSetup (identifier, member) {
var keys = Object.keys(this.setup_votes);
for (var i = 0; i < keys.length; i++) {
this.setup_votes[keys[i]] = this.setup_votes[keys[i]].filter(x => x !== member.id);
};
if (!keys.includes(identifier)) {
this.setup_votes[identifier] = new Array();
};
this.setup_votes[identifier].push(member.id);
keys.push(identifier);
// Find the most voted setup
var vote_count = new Array();
for (var i = 0; i < keys.length; i++) {
vote_count.push(this.setup_votes[keys[i]].length);
};
var max_votes = Math.max(...vote_count);
if (this.setup_votes[identifier].length === max_votes) {
// Favour the latest vote
this.setup.setSetup(identifier);
return [this.setup_votes[identifier].length, identifier, this.setup_votes[identifier].length];
};
// Otherwise, find best
var best_identifier = keys[vote_count.indexOf(max_votes)];
this.setup.setSetup(best_identifier);
return [this.setup_votes[identifier].length, best_identifier, this.setup_votes[best_identifier].length];
};
resetSetupVotes () {
}
join (member) {
this.players.push(member);
var role = this.guild.roles.find(x => x.name === this.config["permissions"]["player"]);
member.addRole(role);
return this;
}
leave (member) {
var keys = Object.keys(this.setup_votes);
for (var i = 0; i < keys.length; i++) {
this.setup_votes[keys[i]] = this.setup_votes[keys[i]].filter(x => x !== member.id);
};
this.players = this.players.filter(x => x.id !== member.id);
var role = this.guild.roles.find(x => x.name === this.config["permissions"]["player"]);
member.removeRole(role);
return this;
}
isInGame (member) {
return this.players.some(x => x.id === member.id);
}
voteStart (member) {
var is_in_game = this.players.some(x => x.id !== member.id);
var is_voting = this.vote_start.some(x => x.id === member.id);
if (this.setup.setup.PLAYER_LIMITS[0] > this.players.length || this.setup.setup.PLAYER_LIMITS[1] < this.players.length) {
return null;
};
var required = Math.floor(0.35 * this.players.length);
if (is_voting) {
return required - this.vote_start.length + 1;
};
this.vote_start.push(member);
if (this.vote_start.length > required) {
this.start();
return 0;
};
return required - this.vote_start.length + 1;
}
createTimeout () {
var timeout_time = this.config["timeout"];
var lobby = this;
this.timeout = setTimeout(async function () {
var config = lobby.config;
var lobby_channel = lobby.guild.channels.find(x => x.name === config["channels"]["lobby"]);
lobby_channel.send(":negative_squared_cross_mark: The game took too long to start and has been cancelled. Please use `" + config["command-prefix"] + "join` to start a new game.");
lobby.destroy();
}, timeout_time * 60 * 1000);
}
start () {
var setup = this.setup.evaluate(this.players);
if (!setup) {
return null;
};
clearTimeout(this.timeout);
// Run standard setup determination, etc.
process.game = new Game(this.client, this.config, this.players, setup, this.setup);
delete process.lobby;
}
destroy () {
// Clear timeout
clearTimeout(this.timeout);
var role = this.guild.roles.find(x => x.name === this.config["permissions"]["player"]);
for (var i = 0; i < this.players.length; i++) {
this.players[i].removeRole(role);
};
delete process.lobby;
}
};