Keep hold of X lines from IRCd for connection error context
authorDarren <darren@darrenwhitlen.com>
Wed, 27 Aug 2014 19:46:28 +0000 (20:46 +0100)
committerDarren <darren@darrenwhitlen.com>
Wed, 27 Aug 2014 19:46:28 +0000 (20:46 +0100)
server/irc/connection.js
server/irc/state.js

index 6267725652acd200c3dcf48b651c2504cbba78a2..c275feb7ac5afaac77a59c446e930509ebdf6dea 100644 (file)
@@ -46,6 +46,9 @@ var IrcConnection = function (hostname, port, ssl, nick, user, options, state, c
     // Number of times we have tried to reconnect
     this.reconnect_attempts = 0;
 
+    // Last few lines from the IRCd for context when disconnected (server errors, etc)
+    this.last_few_lines = [];
+
     // IRCd write buffers (flood controll)
     this.write_buffer = [];
 
@@ -846,7 +849,8 @@ function parseIrcLine(buffer_line) {
         tags = [],
         tag,
         line = '',
-        msg_obj;
+        msg_obj,
+        hold_last_lines;
 
     // Decode server encoding
     line = iconv.decode(buffer_line, this.encoding);
@@ -863,6 +867,18 @@ function parseIrcLine(buffer_line) {
         return;
     }
 
+    // If enabled, keep hold of the last X lines
+    if (global.config.hold_ircd_lines) {
+        this.last_few_lines.push(line.replace(/^\r+|\r+$/, ''));
+
+        // Trim the array down if it's getting to long. (max 3 by default)
+        hold_last_lines = parseInt(global.config.hold_ircd_lines, 10) || 3;
+
+        if (this.last_few_lines.length > hold_last_lines) {
+            this.last_few_lines = this.last_few_lines.slice(this.last_few_lines.length - hold_last_lines);
+        }
+    }
+
     // Extract any tags (msg[1])
     if (msg[1]) {
         tags = msg[1].split(';');
index 9ae2df031ff0cc3e251013eda573e3f14f7804a2..32e7cfc4dacc6540c16b8b846b2cc9d8ed09d977 100755 (executable)
@@ -66,7 +66,14 @@ State.prototype.connect = function (hostname, port, ssl, nick, user, options, ca
     });
 
     con.on('error', function IrcConnectionError(err) {
-        winston.warn('irc_connection error (%s):', hostname, err);
+        var context = '';
+
+        // If we have any of the last lines stored, include them in the log for context
+        if (con.last_few_lines.length > 0) {
+            context = '\n' + con.last_few_lines.join('\n') + '\n';
+        }
+
+        winston.warn('irc_connection error (%s):' + context, hostname, err);
         return callback(err.message);
     });