flying-squid/src/lib/plugins/moderation.js
2015-12-05 22:08:00 -08:00

176 lines
No EOL
4.1 KiB
JavaScript

var moment=require("moment");
var rp=require("request-promise");
var nodeUuid=require('node-uuid');
module.exports.server=function(serv)
{
serv.ban = (uuid, reason) => {
serv.bannedPlayers[uuid] = {
time: +moment(),
reason: reason || "You are banned!"
};
};
function uuidInParts(plainUUID)
{
return nodeUuid.unparse(nodeUuid.parse(plainUUID));
}
serv.getUUIDFromUsername = username => {
return rp('https://api.mojang.com/users/profiles/minecraft/' + username)
.then((body) => {
if(!body) throw new Error("username not found");
return uuidInParts(JSON.parse(body).id)
})
.catch(err => {throw err;});
};
serv.banUsername = (username, reason) => {
return serv.getUUIDFromUsername(username)
.then(uuid => serv.ban(uuid, reason));
};
serv.pardonUsername = (username) => {
return serv.getUUIDFromUsername(username)
.then(pardon);
};
function pardon(uuid) {
if (serv.bannedPlayers[uuid]) {
delete serv.bannedPlayers[uuid];
return true;
}
return false;
}
serv.bannedPlayers = {};
};
module.exports.player=function(player,serv)
{
player.kick = reason =>
{
player._client.write('kick_disconnect', {
reason: reason ? JSON.stringify(reason) : '"You were kicked!"'
});
};
player.ban = reason => {
reason = reason || "You were banned!";
player.kick(reason);
var uuid=player._client.uuid;
serv.ban(uuid, reason);
};
player.pardon = () => serv.pardon(player._client.uuid);
player.commands.add({
base: 'kick',
info: 'to kick a player',
usage: '/kick <player> [reason]',
op: true,
parse(str) {
if(!str.match(/([a-zA-Z0-9_]+)(?: (.*))?/))
return false;
var parts = str.split(' ');
return {
username:parts.shift(),
reason:parts.join(' ')
};
},
action({username,reason}) {
var kickPlayer = serv.getPlayer(username);
if (!kickPlayer) {
player.chat(username + " is not on this server!");
} else {
kickPlayer.kick(reason);
kickPlayer.emit("kicked", player, reason);
}
}
});
player.commands.add({
base: 'ban',
info: 'to ban a player',
usage: '/ban <player> [reason]',
op: true,
parse(str) {
if(!str.match(/([a-zA-Z0-9_]+)(?: (.*))?/))
return false;
var parts = str.split(' ');
return {
username:parts.shift(),
reason:parts.join(' ')
};
},
action({username,reason}) {
var banPlayer = serv.getPlayer(username);
if (!banPlayer) {
serv.banUsername(username, reason)
.then(() => {
serv.emit('banned', player, username, reason);
player.chat(username + ' was banned');
})
.catch(err => player.chat(username + " is not a valid player!"));
} else {
banPlayer.ban(reason);
serv.emit("banned", player, username, reason);
}
}
});
player.commands.add({
base: 'pardon',
info: 'to pardon a player',
usage: '/pardon <player>',
op: true,
parse(str) {
if(!str.match(/([a-zA-Z0-9_]+)/))
return false;
return str;
},
action(nick) {
serv.pardonUsername(nick)
.then(()=> player.chat(nick + " is unbanned"))
.catch(err => player.chat(nick + " is not banned"));
}
});
player.commands.add({
base: 'op',
info: 'op any player',
usage: '/op <player>',
op: true,
parse(str) {
if (!str.match(/([a-zA-Z0-9_]+)/)) return false;
return str;
},
action(username) {
var user = serv.getPlayer(username);
if (!user) return 'That player is not on the server.'
user.op = true;
player.chat(username + ' is opped');
}
});
player.commands.add({
base: 'deop',
info: 'deop any player',
usage: '/deop <player>',
op: true,
parse(str) {
if (!str.match(/([a-zA-Z0-9_]+)/)) return false;
return str;
},
action(username) {
var user = serv.getPlayer(username);
if (!user) return 'That player is not on the server.'
user.op = false;
player.chat(username + ' is deopped');
}
});
};