la-cosa-nostra
Version:
A Mafia bot designed to run in Discord - beware the traitors and the lies!
414 lines (273 loc) • 12.6 kB
JavaScript
var lcn = require("../../../../source/lcn.js");
var auxils = lcn.auxils;
var expansion_config = require("../../miscellaneous/config.js");
module.exports = async function (game, message, params) {
// Create conspiracy channels
// cc create <name> [users...]
var config = game.config;
if (params.length < 1) {
await message.channel.send(":x: Wrong syntax! Use `" + config["command-prefix"] + "cc <create/add/remove>` instead!");
return null;
};
var day = game.isDay();
if (day && !expansion_config["enabled"]["day"]) {
await message.channel.send(":x: You may not create/modify conspiracy channels during the day.");
return null;
};
if (!day && !expansion_config["enabled"]["night"]) {
await message.channel.send(":x: You may not create/modify conspiracy channels at night.");
return null;
};
var sender = game.getPlayerById(message.author.id);
if (sender === null) {
await message.channel.send(":x: You are not in the game!");
return null;
};
if (!sender.status.alive) {
await message.channel.send(":x: You are dead!");
return null;
};
switch (params[0].toLowerCase()) {
case "create":
// Only in private channel, not in CCs
if (sender.channel.id !== message.channel.id) {
await message.channel.send(":x: You can only create conspiracy channels from your private channel!");
return null;
};
if (params.length < 3) {
await message.channel.send(":x: Wrong syntax! Use `" + config["command-prefix"] + "cc create <name of channel> [<alphabet/name>...]` instead!");
return null;
};
// Check limits
if (game.conspiracy_channels && game.conspiracy_channels.channels.filter(x => x.owner === sender.identifier).length > expansion_config["max-ccs-per-player"]) {
await message.channel.send(":x: You may not create more than **" + expansion_config["max-ccs-per-player"] + "** conspiracy channels.");
return null;
};
var players = new Array();
for (var i = 2; i < params.length; i++) {
var player = getPlayer(params[i]);
if (!player) {
await message.channel.send(":x: I cannot find player `" + params[i] + "`!");
return null;
};
if (!player.status.alive) {
await message.channel.send(":x: **" + player.getDisplayName() + "** is dead! You cannot create conspiracy channels with dead players!");
return null;
};
if (player.id === message.author.id) {
continue;
};
players.push(player);
};
if (players.length > expansion_config["max-players-per-cc"] - 1) {
await message.channel.send(":x: A conspiracy channel cannot exceed **" + expansion_config["max-players-per-cc"] + "** players (owner included).");
return null;
};
players = auxils.getUniqueArray(players);
// Check reserved names
var name = params[1];
for (var key in config["channels"]) {
if (name.toLowerCase() === config["channels"][key].toLowerCase()) {
await message.channel.send(":x: A conspiracy channel cannot be created with that name.");
return null;
};
};
message.channel.startTyping();
var channel = await createCC(name, sender, players);
await message.channel.send(":exclamation: You have created the conspiracy channel <#" + channel.id + ">.");
await message.channel.stopTyping(true);
break;
case "add":
if (!game.conspiracy_channels || !game.conspiracy_channels.channels.some(x => x.id === message.channel.id)) {
await message.channel.send(":x: You may only add players in the respective conspiracy channels!");
return null;
};
if (params.length < 2) {
await message.channel.send(":x: Wrong syntax! Use `" + config["command-prefix"] + "cc add [<alphabet/name>...]` instead!");
return null;
};
// Check ownership
var conspiracy_channel = game.conspiracy_channels.channels.find(x => x.id === message.channel.id);
if (conspiracy_channel.owner !== sender.identifier) {
await message.channel.send(":x: You are not the owner of this conspiracy channel.");
return null;
};
var players = new Array();
for (var i = 1; i < params.length; i++) {
var player = getPlayer(params[i]);
if (!player) {
await message.channel.send(":x: I cannot find player `" + params[i] + "`!");
return null;
};
if (!player.status.alive) {
await message.channel.send(":x: **" + player.getDisplayName() + "** is dead! You cannot create conspiracy channels with dead players!");
return null;
};
if (player.id === message.author.id) {
await message.channel.send(":x: You are already in this conspiracy channel!");
return null;
};
if (conspiracy_channel.members.includes(player.identifier)) {
await message.channel.send(":x: **" + player.getDisplayName() + "** is already in the conspiracy channel!");
return null;
};
players.push(player);
};
if (conspiracy_channel.members + players.length > expansion_config["max-players-per-cc"]) {
await message.channel.send(":x: A conspiracy channel cannot exceed **" + expansion_config["max-players-per-cc"] + "** players (owner included).");
return null;
};
players.sort(function (a, b) {
if (a.alphabet < b.alphabet) { return -1; };
if (a.alphabet > b.alphabet) { return 1; };
return 0;
});
players = auxils.getUniqueArray(players);
var permissions = players.map(x => {
var target = message.client.users.get(x.id);
if (!target) {
return null;
};
return {target: target, permissions: config["base-perms"]["post"]};
}).filter(x => x !== null);
await setPermissions(message.channel, permissions);
await message.channel.send(":exclamation: Added " + auxils.pettyFormat(players.map(x => "<@" + x.id + ">")) + " to the conspiracy channel <#" + message.channel.id + ">.");
conspiracy_channel.members = conspiracy_channel.members.concat(players.map(x => x.identifier));
for (var i = 0; i < players.length; i++) {
players[i].addSpecialChannel(message.channel);
};
break;
case "remove":
if (!game.conspiracy_channels || !game.conspiracy_channels.channels.some(x => x.id === message.channel.id)) {
await message.channel.send(":x: You may only remove players in the respective conspiracy channels!");
return null;
};
if (params.length < 2) {
await message.channel.send(":x: Wrong syntax! Use `" + config["command-prefix"] + "cc add [<alphabet/name>...]` instead!");
return null;
};
// Check ownership
var conspiracy_channel = game.conspiracy_channels.channels.find(x => x.id === message.channel.id);
if (conspiracy_channel.owner !== sender.identifier) {
await message.channel.send(":x: You are not the owner of this conspiracy channel.");
return null;
};
var players = new Array();
for (var i = 1; i < params.length; i++) {
var player = getPlayer(params[i]);
if (!player) {
await message.channel.send(":x: I cannot find player `" + params[i] + "`!");
return null;
};
if (!player.status.alive) {
await message.channel.send(":x: **" + player.getDisplayName() + "** is dead! No need to remove them from your conspiracy channel!");
return null;
};
if (player.id === message.author.id) {
await message.channel.send(":x: You may not remove yourself from your own conspiracy channel!");
return null;
};
if (!conspiracy_channel.members.includes(player.identifier)) {
await message.channel.send(":x: **" + player.getDisplayName() + "** is not in this conspiracy channel!");
return null;
};
players.push(player);
};
players.sort(function (a, b) {
if (a.alphabet < b.alphabet) { return -1; };
if (a.alphabet > b.alphabet) { return 1; };
return 0;
});
players = auxils.getUniqueArray(players);
var permissions = players.map(x => {
var target = message.client.users.get(x.id);
if (!target) {
return null;
};
return {target: target, permissions: config["base-perms"]["deny"]};
}).filter(x => x !== null);
await setPermissions(message.channel, permissions);
await message.channel.send(":exclamation: Removed " + auxils.pettyFormat(players.map(x => "**" + x.getDisplayName() + "**")) + " from the conspiracy channel <#" + message.channel.id + ">.");
for (var i = 0; i < players.length; i++) {
conspiracy_channel.members = conspiracy_channel.members.filter(x => x !== players[i].identifier);
players[i].removeSpecialChannel(message.channel);
};
break;
default:
await message.channel.send(":x: Wrong syntax! Use `" + config["command-prefix"] + "cc <create/add/remove>` instead!");
return null;
};
game.save();
function getPlayer (target) {
var player = game.getPlayerMatch(target);
if (player.score < 0.7) {
return null;
};
return player.player;
};
async function createCC (name, owner, players) {
if (!game.conspiracy_channels) {
game.conspiracy_channels = {
categories: new Array(),
channels: new Array()
};
};
// Create conspiracy channel
var guild = game.getGuild();
var empty_category = null;
var categories = game.conspiracy_channels.categories;
for (var i = 0; i < categories.length; i++) {
var category = guild.channels.find(x => x.id === categories[i]);
var children = category ? category.children.array().length : 0;
if (children < 50) {
empty_category = category;
break;
};
};
var spectator = guild.roles.find(x => x.name === config["permissions"]["spectator"]);
var admin = guild.roles.find(x => x.name === config["permissions"]["admin"]);
var standard_permissions = [{target: spectator, permissions: config["base-perms"]["read"]},
{target: admin, permissions: config["base-perms"]["manage"]}];
if (empty_category === null) {
var category_name = expansion_config["cc-category-prefix"] + " " + String.fromCharCode(categories.length + 65);
empty_category = await guild.createChannel(category_name, {type: "category", permissionOverwrites: [{id: guild.id, deny: ["READ_MESSAGES"]}]});
categories.push(empty_category.id);
await setPermissions(empty_category, standard_permissions);
};
// Create channel
var channel = await guild.createChannel(name, {type: "text", permissionOverwrites: [{id: guild.id, deny: ["READ_MESSAGES"]}], parent: empty_category});
players.sort(function (a, b) {
if (a.alphabet < b.alphabet) { return -1; };
if (a.alphabet > b.alphabet) { return 1; };
return 0;
});
players.unshift(owner);
var permissions = standard_permissions.concat(players.map(x => {
var target = message.client.users.get(x.id);
if (!target) {
return null;
};
return {target: target, permissions: config["base-perms"]["post"]};
})).filter(x => x !== null);
await setPermissions(channel, permissions);
game.conspiracy_channels.channels.push({id: channel.id, owner: owner.identifier, members: players.map(x => x.identifier)});
for (var i = 0; i < players.length; i++) {
players[i].addSpecialChannel(channel);
};
await channel.send("**" + owner.getDisplayName() + "** has created a conspiracy channel <#" + channel.id + ">.\n\n**Members**:\n" + players.map(x => "<@" + x.id + ">").join("\n"));
return channel;
};
async function setPermissions (channel, permissions) {
var cache = new Array();
for (var i = 0; i < permissions.length; i++) {
if (!permissions[i].target) {
continue;
};
cache.push(channel.overwritePermissions(permissions[i].target, permissions[i].permissions));
};
await Promise.all(cache);
};
};
module.exports.ALLOW_PREGAME = false;
module.exports.ALLOW_GAME = true;
module.exports.ALLOW_POSTGAME = false;