summary refs log tree commit diff homepage
diff options
context:
space:
mode:
authordestruc7i0n <destruc7i0n@users.noreply.github.com>2016-01-23 18:58:39 -0500
committerdestruc7i0n <destruc7i0n@users.noreply.github.com>2016-01-23 18:58:39 -0500
commit7dd1e60f5069c7d4c5993d7f51fa351f66e9e2f4 (patch)
tree46e0a9af403b19820af7a6be99263315aa1b9650
parentAdd Suggestions and fix one comment (diff)
parentOnly have one RCON reconnect at the same time (diff)
downloadshulker-7dd1e60f5069c7d4c5993d7f51fa351f66e9e2f4.tar.gz
shulker-7dd1e60f5069c7d4c5993d7f51fa351f66e9e2f4.zip
Merge pull request #6 from SecretOnline/rcon-error
Fix RCON errors when Minecraft server goes down
-rw-r--r--config.json1
-rw-r--r--index.js72
2 files changed, 43 insertions, 30 deletions
diff --git a/config.json b/config.json
index 48778d3..07e3895 100644
--- a/config.json
+++ b/config.json
@@ -9,5 +9,6 @@
     "WEBHOOK": "/minecraft/hook",
     "REGEX_MATCH_CHAT_MC": "\\[Server thread/INFO\\]: <(.*)> (.*)",
     "REGEX_IGNORED_CHAT": "packets too frequently",
+    "RCON_RECONNECT_DELAY": 10,
     "DEBUG": false
 }
\ No newline at end of file
diff --git a/index.js b/index.js
index 24e6464..e034e9a 100644
--- a/index.js
+++ b/index.js
@@ -1,65 +1,77 @@
 /*jslint bitwise: true, node: true */
+'use strict';
 
 var Discord = require("discord.js");
 var Rcon = require("rcon");
 var express = require("express");
-var app = express(); 
-var http = require("http").Server(app); 
+var app = express();
+var http = require("http").Server(app);
 var c = require("./config.json");
 var debug = c.DEBUG;
 var shulker = new Discord.Client();
 
 var client = new Rcon(c.MINECRAFT_SERVER_RCON_IP, c.MINECRAFT_SERVER_RCON_PORT, c.MINECRAFT_SERVER_RCON_PASSWORD);
+var rconTimeout;
 
 client.on("auth", function() {
-    console.log("[INFO] Authenticated with "+c.MINECRAFT_SERVER_RCON_IP+":"+c.MINECRAFT_SERVER_RCON_PORT);
+    console.log("[INFO] Authenticated with " + c.MINECRAFT_SERVER_RCON_IP + ":" + c.MINECRAFT_SERVER_RCON_PORT);
 }).on("response", function(str) {
-    if(debug && str) {
+    if (debug && str) {
         console.log("[DEBUG] Got response: " + str);
     }
 }).on("end", function() {
     console.log("[INFO] Rcon closed!");
+}).on("error", function() {
+    if (typeof rconTimeout === 'undefined') {
+        client.disconnect();
+        rconTimeout = setTimeout(function() {
+            client.connect();
+            rconTimeout = undefined;
+        }, c.RCON_RECONNECT_DELAY * 1000);
+    }
 });
 
 client.connect();
 
 app.use(function(request, response, next) {
-  request.rawBody = "";
-  request.setEncoding("utf8");
+    request.rawBody = "";
+    request.setEncoding("utf8");
 
-  request.on("data", function(chunk) { 
-      request.rawBody += chunk;
-  });
+    request.on("data", function(chunk) {
+        request.rawBody += chunk;
+    });
 
-  request.on("end", function() {
-      next();
-  });
+    request.on("end", function() {
+        next();
+    });
 });
 
 shulker.on("ready", function() {
-    var channel = shulker.channels.get("name", c.DISCORD_CHANNEL).id; 
-    app.post(c.WEBHOOK, function(request, response){
-        body = request.rawBody;
-        console.log("[INFO] Recieved "+body);  
-        re = new RegExp(c.REGEX_MATCH_CHAT_MC);
-        ignored = new RegExp(c.REGEX_IGNORED_CHAT);
-        if(!ignored.test(body)) {
-            bodymatch = body.match(re);
-            if(debug) {
-                console.log("[DEBUG] Username: "+bodymatch[1]);
-                console.log("[DEBUG] Text: "+bodymatch[2]);
+    var channel = shulker.channels.get("name", c.DISCORD_CHANNEL).id;
+    app.post(c.WEBHOOK, function(request, response) {
+        var body = request.rawBody;
+        console.log("[INFO] Recieved " + body);
+        var re = new RegExp(c.REGEX_MATCH_CHAT_MC);
+        var ignored = new RegExp(c.REGEX_IGNORED_CHAT);
+        if (!ignored.test(body)) {
+            var bodymatch = body.match(re);
+            if (debug) {
+                console.log("[DEBUG] Username: " + bodymatch[1]);
+                console.log("[DEBUG] Text: " + bodymatch[2]);
             }
-            message = "**"+bodymatch[1]+"**: "+bodymatch[2];
+            var message = "**" + bodymatch[1] + "**: " + bodymatch[2];
             shulker.channels.get("id", channel).sendMessage(message);
         }
         response.send("");
     });
 });
 
-shulker.on("message", function (message) {
-    if(message.author.id !== shulker.user.id) {
-        data = { text: "<"+message.author.username+"> "+message.content };
-        client.send('tellraw @a ["",'+JSON.stringify(data)+']');
+shulker.on("message", function(message) {
+    if (message.author.id !== shulker.user.id) {
+        var data = {
+            text: "<" + message.author.username + "> " + message.content
+        };
+        client.send('tellraw @a ["",' + JSON.stringify(data) + ']');
     }
 });
 
@@ -68,11 +80,11 @@ shulker.login(c.DISCORD_EMAIL, c.DISCORD_PASSWORD);
 var ipaddress = process.env.OPENSHIFT_NODEJS_IP || process.env.IP || "127.0.0.1";
 var serverport = process.env.OPENSHIFT_NODEJS_PORT || process.env.PORT || c.PORT;
 if (process.env.OPENSHIFT_NODEJS_IP !== undefined) {
-    http.listen( serverport, ipaddress, function() {
+    http.listen(serverport, ipaddress, function() {
         console.log("[INFO] Bot listening on *:" + serverport);
     });
 } else {
-    http.listen( serverport, function() {
+    http.listen(serverport, function() {
         console.log("[INFO] Bot listening on *:" + c.PORT);
     });
 }