UNPKG

la-cosa-nostra

Version:

A Mafia bot designed to run in Discord - beware the traitors and the lies!

104 lines (63 loc) 2.63 kB
var logger = process.logger; module.exports = async function (game, id1, id2, detailed_substitution=true) { var client = game.client; var config = game.config; var player = game.getPlayerById(id1); var bef_member = player.getGuildMember(); player.substitute(id2); var aft_member = player.getGuildMember(); logger.log(2, "Player %s substituted for %s.", id1, id2); if (!detailed_substitution) { return null; }; var guild = client.guilds.get(config["server-id"]); var alive_role = guild.roles.find(x => x.name === config["permissions"]["alive"]); var pre_role = guild.roles.find(x => x.name === config["permissions"]["pre"]); var dead_role = guild.roles.find(x => x.name === config["permissions"]["dead"]); var spectator_role = guild.roles.find(x => x.name === config["permissions"]["spectator"]); var aftermath_role = guild.roles.find(x => x.name === config["permissions"]["aftermath"]); if (aft_member) { await removeRole(aft_member, [alive_role, pre_role, dead_role, spectator_role, aftermath_role]); var name = aft_member.displayName.replace(new RegExp("^(\[[A-z|0-9]{1,2}\] )*", "g"), ""); if (player.isAlive()) { await aft_member.addRole(alive_role); } else { await aft_member.addRole(dead_role); }; await aft_member.setNickname("[" + player.alphabet + "] " + name); }; if (bef_member) { await removeRole(bef_member, [alive_role, pre_role, dead_role, spectator_role, aftermath_role]); var name = bef_member.displayName.replace(new RegExp("^(\[[A-z|0-9]{1,2}\] )*", "g"), ""); if (name !== bef_member.displayName) { await bef_member.setNickname(name); }; }; if (!bef_member || !aft_member) { logger.log(4, "Non-existent substitution Discord user - skipping permission transfer."); return null; }; // Complete permission transfer var channels = player.getSpecialChannels().map(x => guild.channels.find(y => y.id === x.id)); var cache = new Array(); for (var i = 0; i < channels.length; i++) { var channel = channels[i]; var permissions = channel.memberPermissions(bef_member); if (!permissions) { continue; }; cache.push(channel.overwritePermissions(aft_member, permissions.serialize())); cache.push(channel.permissionOverwrites.find(x => x.id === bef_member.id).delete()); }; await Promise.all(cache); }; async function removeRole (member, roles) { for (var i = 0; i < roles.length; i++) { if (!roles[i]) { continue; }; if (member.roles.has(roles[i].id)) { await member.removeRole(roles[i]); }; }; };