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 [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 [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 ', 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 ', 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 ', 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'); } }); };