UNPKG

d-bot

Version:

A quirky Discord bot made for single, small, private servers

137 lines (129 loc) 5.71 kB
// Checking server statuses var util = require(__base+'core/util.js'); var discord = require(__base+'core/discord.js'); var config = require(__base+'core/config.js'); var request = require('request'); var download = require('download'); var telnet = require('expect-telnet'); var nodecraft = require('nodecraft-api')('vegeta897', 'AF0Mi-MWVFr-EuJML-u7KHq'); var _commands = {}; // TODO: Use promises or observables _commands.mumble = function(data) { // TODO: CommandChannel is rip if(!config.mumble || !config.mumble.email || !config.mumble.apiKey) return; var url = 'http://api.commandchannel.com/cvp.json?email=' + config.mumble.email + '&apiKey=' + config.mumble.apiKey; request(url, function(err, response, body) { if(err) { console.log(err); return data.reply('Error getting Mumble status...'); } body = JSON.parse(body); var channels = []; var checkChannel = function(channel) { if(channel.users.length > 0) { var users = ''; for(var u = 0; u < channel.users.length; u++) { users += (u === 0 ? ' ' : ', ') + channel.users[u].name; } channels.push({ name: channel.name, users: users }); } if(channel.channels.length > 0) { for(var sc = 0; sc < channel.channels.length; sc++) { checkChannel(channel.channels[sc]); } } }; checkChannel(body.root); var embed = { color: 0xDDDDDD }; if(channels.length === 0) { embed.footer = { text: 'Nobody is in Mumble :(' }; embed.color = 0xAAAAAA; } else { embed.fields = []; channels.sort(function(a, b) { return a.users.length < b.users.length; }); // Sort longest to shortest channels.forEach(function(channel, index) { var field = { name: channel.name, value: channel.users }; if(!(channels.length % 2) || index > 0) { // Short channels if even count or not biggest channel field.inline = true; } embed.fields.push(field); }); } discord.bot.createMessage( data.channel, { content: '**Mumble Status**', embed } ); }); }; _commands.minecraft = function(data) { // data.messageObject.channel.sendTyping(); // nodecraft.services.stats('967ae4ea-a1a0-4026-8dd7-618b8581b2b3', (err, server) => { // if(err) { // console.log(err); // return data.reply('Error getting Minecraft server status...'); // } // if(server.stats.status === 'online') { // var msg = `Minecraft server is **online!** Uptime: ${server.stats.time}`; // for(var i = 0; i < server.stats.players.length; i++) { // if(i === 0) msg += `\nPlayers online: **${server.stats.players[i].username}**`; // else msg += `, **${server.stats.players[i].username}**` // } // data.reply(msg); // } else { // data.reply('Minecraft server is currently offline... @vegeta897'); // } // }); if(!config.minecraft || !config.minecraft.ip || !config.minecraft.port) return; data.messageObject.channel.sendTyping(); var url = 'http://mcapi.us/server/status?ip=' + config.minecraft.ip + '&port=' + config.minecraft.port; request(url, function(err, response, body) { if(err) { console.log(err); return data.reply('Error getting Minecraft server status...'); } body = JSON.parse(body); var status = '*Minecraft server is currently offline*'; if(body.online) { status = '**Minecraft** server is **online** - '; if(body.players.now) { status += `**${body.players.now}** people are playing!`; } else { status += '*Nobody is playing!*'; } } data.reply(status); }); }; _commands.starbound = function(data) { if(!config.starbound || !config.starbound.statusImage) return; data.messageObject.channel.sendTyping(); download(config.starbound.statusImage).then(img => { discord.uploadFile({ to: data.channel, file: img, filename: 'sb.png', message: '**Starbound Server Status**' }); }); }; _commands['7d'] = function(data) { if(!config['7d'] || !config['7d'].ip || !config['7d'].telnetPort || !config['7d'].telnetPass) return; data.messageObject.channel.sendTyping(); telnet(config['7d'].ip + ':' + config['7d'].telnetPort, [ {expect: 'Please enter password:', send: config['7d'].telnetPass + '\r' }, {expect: '\u0000\u0000', send: "gt\r" }, {expect: /successful/, send: "\r" }, {expect: /version/, send: "\r" }, {expect: /Day /, out: function(output) { output = output.split('\n')[1]; data.reply(`It is **${output.trim()}** on the 7D server`); }, send: "exit\r"} ], function(err) { if (err) data.reply('*Sorry, the 7D server is unavailable.*'); }); }; module.exports = { commands: _commands, help: { minecraft: ['Get the Minecraft server status (if configured)'], mumble: ['Get the Mumble server status (if configured)'], starbound: ['Get the Starbound server status (if configured)'], '7d': ['Get the 7 Days to Die server status (if configured)'] } };