Skip to content

Instantly share code, notes, and snippets.

@ChristopherKing42
Forked from ifandswitch/trollboxMonero.js
Last active August 31, 2016 20:34
Show Gist options
  • Save ChristopherKing42/2a6e38f266ed7903a0c1883fc974794a to your computer and use it in GitHub Desktop.
Save ChristopherKing42/2a6e38f266ed7903a0c1883fc974794a to your computer and use it in GitHub Desktop.
Node.JS - Quick & Dirty Poloniex Trollbox IRC Relay. Debian/Ubuntu: apt-get install libicu-dev / NPM Modules: npm install autobahn ent irc irc-colors
// Poloniex Trollbox IRC Relay with filter
var autobahn = require('autobahn');
var ent = require('ent');
var irc = require('irc');
var c = require('irc-colors');
// set it up
var config = {
network: 'irc.freenode.net',
channelName: '##testbox',
botName: 'TROLLBOX',
captureDuration: 60 * 1000, // 60 seconds in milis
wsuri: 'wss://api.poloniex.com',
useFilters: true
}
// filter strings (always lowercase)
var keywords = ['monero', 'xmr', 'moonero'];
var nicks = ['fluffypony', 'needmoney90'];
// colour replacements (requires both to avoid modifying original)
var colours = {
'xmr': c.blue,
'XMR': c.blue,
'btc': c.green,
'BTC': c.green,
'know': c.rainbow,
'fluffypony': c.rainbow
};
// connect to web socket
var connection = new autobahn.Connection({
url: config.wsuri,
realm: "realm1"
});
// configure irc client
var client = new irc.Client(config.network, config.botName, {
userName: config.botName,
realName: 'Poloniex Trollbox IRC Relay',
port: 6667,
debug: false,
autoRejoin: true,
channels: [config.channelName]
});
client.addListener('error', function(message) {
console.log('error: ', message);
});
connection.onopen = function (session) {
session.subscribe('trollbox', messageReceived);
};
function messageReceived(args, kwargs) {
var nick = args[2];
var msg = ent.decode(args[3]);
if(shouldCaptureMessage(nick, msg)) {
say(nick, msg);
}
}
/**
* Check if we should say it
*/
function shouldCaptureMessage(nick, msg) {
var shouldCapture = false;
nick = nick.toLowerCase();
msg = msg.toLowerCase();
// skip if filtering is off
if(!config.useFilters) return true;
// check for keywords
keywords.forEach(function(capture) {
if(msg.indexOf(capture) != -1 || nick == capture) {
nicks.push(nick);
setTimeout(function() {
nicks.splice(nicks.indexOf(nick), 1);
}, config.captureDuration);
shouldCapture = true;
}
});
// check for user nicks
nicks.forEach(function(capture) {
if(msg.indexOf(capture) != -1 || capture == nick) {
shouldCapture = true;
}
});
return shouldCapture;
}
/**
* Send the message to IRC
*/
function say(nick, msg) {
client.say(config.channelName, '-> ' + c.bold(nick) + ': ' + colourize(msg));
}
/**
* Add some colour
*/
function colourize(msg) {
Object.keys(colours).forEach(function(key) {
msg = msg.replace(key, colours[key](key));
});
return msg;
}
connection.onclose = function () {
console.log("Websocket connection closed.");
}
connection.open();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment