diff --git a/package-lock.json b/package-lock.json index 9727857..2f6675c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1839,6 +1839,15 @@ "is-glob": "2.0.1" } }, + "parse-irc": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-irc/-/parse-irc-0.2.4.tgz", + "integrity": "sha1-BcVBeVmA2724Z9dGRhfF0FGaXvk=", + "requires": { + "inherits": "2.0.3", + "through2-objectify": "0.1.1" + } + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2239,6 +2248,47 @@ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "3.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "through2-objectify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/through2-objectify/-/through2-objectify-0.1.1.tgz", + "integrity": "sha1-oHQaR4vLeRY3b5eSQRgaGwZEvBk=", + "requires": { + "inherits": "2.0.3", + "through2": "0.5.1" + } + }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -2316,6 +2366,11 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" + }, "youtube-dl": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/youtube-dl/-/youtube-dl-1.12.2.tgz", diff --git a/package.json b/package.json index cdbddfc..018a7c4 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "dependencies": { "node-telegram-bot-api": "^0.29.0", "nodejs-mysql": "^0.1.3", + "parse-irc": "^0.2.4", "safe-eval": "^0.3.0", "youtube-dl": "^1.12.2" }, diff --git a/partjoin.txt b/partjoin.txt new file mode 100644 index 0000000..083f694 --- /dev/null +++ b/partjoin.txt @@ -0,0 +1,16 @@ +part { raw: ':Flummi!~bark@bark.bark.bark PART #f0ck :test\r\n', + prefix: 'Flummi!~bark@bark.bark.bark', + command: 'PART', + params: [ '#f0ck', 'test' ] } + + +join { raw: ':Flummi!~bark@bark.bark.bark JOIN :#f0ck\r\n', + prefix: 'Flummi!~bark@bark.bark.bark', + command: 'JOIN', + params: [ '#f0ck' ] } + + +nick { raw: ':Flummi!~bark@bark NICK flummi\r\n', + prefix: 'Flummi!~bark@bark', + command: 'NICK', + params: [ 'flummi\r\n' ] } \ No newline at end of file diff --git a/src/inc/clients/irc.js b/src/inc/clients/irc.js index 2e76ebc..87c26b8 100644 --- a/src/inc/clients/irc.js +++ b/src/inc/clients/irc.js @@ -1,7 +1,8 @@ const net = require("net") , tls = require("tls") , EventEmitter = require("events").EventEmitter - ,util = require("util"); + , util = require("util") + , parser = require("parse-irc"); class irc { constructor(options) { @@ -19,8 +20,10 @@ class irc { this.realname = this.options.realname || "test"; this.channels = this.options.channels || []; this._recachetime = 60 * 5; // 10 minutes + this.stream = parser(); this.server = { motd: "", + sasl: {}, me: {}, channel: [], user: new Map() @@ -32,14 +35,20 @@ class irc { }, () => { this.send(`NICK ${this.nickname}`); this.send(`USER ${this.username} 0 * : ${this.realname}`); - }); + if(this.options.sasl) { + this.send("CAP LS"); + //this.send("CAP REQ sasl"); + } + }).pipe(this.stream); this.socket.setEncoding("utf-8"); - this.socket.on("data", msg => { - msg = this.parse(msg); + this.stream.on("data", msg => { + //msg = this.parse(msg); let tmpuser = {}; let tmpchan = {}; let chans = []; let prefix = ""; + if(msg.command != "372") + console.log(msg); switch (msg.command) { // auslagern! // WHOIS BEGIN case "307": // Rizon Account @@ -127,7 +136,7 @@ class irc { this.whois(msg.params[5]); break; case "315": // who_end - console.log(this.server.channel); + //console.log(this.server.channel); break; case "372": // motd this.server.motd += `${msg.params[1]}\n`; @@ -140,18 +149,16 @@ class irc { this.emit("data", ["motd", this.server.motd]); break; case "464": // Password required - if (this.options.password.length > 0) + if (this.options.password.length > 0 && !this.options.sasl) this.send(`PASS ${this.options.password}`); // pwd break; case "PING": this.send(`PONG ${msg.params.join``}`); break; case "JOIN": - console.log("join", msg); this.send(`WHO ${msg.params[0]}`); break; case "PART": - console.log("part", msg); delete this.server.user[msg.params[0]]; //this.whois(msg.params[0], true); // force whois break; @@ -170,15 +177,40 @@ class irc { this.server.user.deli(prefix.nick); this.whois(msg.params[0], true); // force break; + /* CAPKACKE */ + case "CAP": + console.log("CAP", msg); + switch(msg.params[1]) { + case "LS": + this.server.sasl.ls = msg.params[2].split(" "); + this.send(`CAP REQ :${this.server.sasl.ls.join(" ")}`); + break; + case "ACK": // success + this.send("AUTHENTICATE PLAIN"); + break; + } + break; + case "AUTHENTICATE": + if(msg.params[0].match(/\+/)) + this.send(`AUTHENTICATE ${new Buffer(this.username+"\u0000"+this.username+"\u0000"+this.options.password).toString("base64")}`); + break; + case "900": + this.send("CAP END"); + this.join(this.options.channels); // tmp + break; default: - console.log(msg); + break; } }); } send() { - for (let i = 0; i < arguments.length; i++) + let args = ""; + for (let i = 0; i < arguments.length; i++) { this.socket.write(arguments[i]); + args += arguments[i]; + } + console.log(this.options.network, "sending", args); this.socket.write("\n"); } parse(data) { @@ -235,6 +267,7 @@ class irc { // act chan _chan: this.server.channel[tmp.params[0]], _user: this.server.user, + sasl: this.server.sasl, // commands join: chan => this.join(chan), part: (chan, msg) => this.part(chan, msg), @@ -252,12 +285,12 @@ class irc { user = user.toLowerCase(); if(this.server.user.hasi(user) && !force) { if(this.server.user.geti(user).cached >= ~~(Date.now() / 1000) - this._recachetime) { - console.log(this.server.user.geti(user).cached, ~~(Date.now() / 1000) - this._recachetime); - console.log(user, "already cached"); + //console.log(this.server.user.geti(user).cached, ~~(Date.now() / 1000) - this._recachetime); + //console.log(user, "already cached"); return; } } - console.log("get whois for", user); + //console.log("get whois for", user); this.send(`WHOIS ${user}`); } } diff --git a/src/inc/wrapper.js b/src/inc/wrapper.js index ff0976d..65031ac 100644 --- a/src/inc/wrapper.js +++ b/src/inc/wrapper.js @@ -9,21 +9,23 @@ const clients = []; const wrapper = function () { for (let srv in cfg.client) { - switch (cfg.client[srv].type) { - case "irc": - clients.push({ - name: cfg.client[srv].network, - type: "irc", - client: new irclib(cfg.client[srv]) - }); - break; - case "tg": - clients.push({ - name: "tg", - type: "tg", - client: new tglib(cfg.client[srv]) - }); - break; + if(cfg.client[srv].enabled) { + switch (cfg.client[srv].type) { + case "irc": + clients.push({ + name: cfg.client[srv].network, + type: "irc", + client: new irclib(cfg.client[srv]) + }); + break; + case "tg": + clients.push({ + name: "tg", + type: "tg", + client: new tglib(cfg.client[srv]) + }); + break; + } } }