Skip to content

Instantly share code, notes, and snippets.

@eeeeeta
Created April 5, 2015 07:52
Show Gist options
  • Save eeeeeta/13ec3775a4253b2127ab to your computer and use it in GitHub Desktop.
Save eeeeeta/13ec3775a4253b2127ab to your computer and use it in GitHub Desktop.
Daemon to keep track of reddit's /r/thebutton April Fools 2015 prank. You'll need io.js (or run node.js with --harmony), a Redis server running locally, and the packages needle, redis and ws. You'll probably want to run this with systemd or something else to restart it, as it doesn't have bulletproof error handling.
/*jslint node:true,esnext:true*/
"use strict";
var needle = require('needle'),
redis = require('redis'),
ws = require('ws'),
net = require('net');
console.log('~ buttond v2 by η (eeeeeta) ~');
console.log('INIT: Requesting http://reddit.com/r/thebutton');
needle.get('http://reddit.com/r/thebutton', {follow: 5}, function(err, res) {
if (err) {
console.error('ERROR: Failed to get thebutton html');
throw err;
}
if (res.statusCode != 200) {
console.error('ERROR: Got code ' + res.statusCode + ' instead of 200');
return;
}
let addrRegexp = /"thebutton_websocket": "([^\,]+)",/i;
if (!res.body.match(addrRegexp)) {
console.error('ERROR: Failed to retrieve thebutton websocket URL');
return;
}
let URL = res.body.match(addrRegexp)[1];
console.log('INIT: got button websocket URL as ' + URL);
console.log('INIT: connecting to redis (on localhost)');
var rd = redis.createClient();
rd.on('ready', function() {
console.log('INIT: redis connection successful');
console.log('INIT: getting record from redis');
var record = 60;
rd.get('record', function(err, rec) {
if (err) throw err;
if (!rec) {
rd.set('record', record);
console.log('INIT: no record set, set it to 60');
}
else {
record = Number(rec);
console.log('INIT: got record of ' + record);
}
console.log('INIT: connecting to thebutton websocket');
var btn = new ws(URL);
var cur = 60;
var participants = 'error';
btn.on('open', function() {
console.log('INIT: connected to thebutton websocket');
var tid = setTimeout(function() {
console.error('ERROR: no message from thebutton since 30 seconds');
process.exit(1);
}, 30000);
btn.on('message', function(data) {
clearTimeout(tid);
tid = setTimeout(function() {
console.error('ERROR: no message from thebutton since 30 seconds');
process.exit(1);
}, 30000);
data = JSON.parse(data);
if (data.type != 'ticking') {
console.log('Unidentified socket object: ');
return console.dir(data);
}
cur = data.payload.seconds_left;
participants = data.payload.participants_text;
if (data.payload.seconds_left < record) {
record = data.payload.seconds_left;
rd.set('record', record, function(err, reply) {
if (err) throw err;
if (reply != 'OK') {
console.error('ERROR: got reply ' + reply + ' instead of "OK" setting new record');
process.exit(1);
}
console.log('[!] Set new button record: ' + data.payload.seconds_left + 's');
});
}
});
net.createServer(function(sock) {
console.log('[+] server connection from ' + sock.remoteAddress + ':' + sock.remotePort);
sock.write('\n\nbuttond v2 by η (eeeeeta)\n');
sock.write('\nCurrent record: ' + record + 's');
sock.write('\nSeconds left: ' + cur + 's');
sock.write('\nParticipants: ' + participants + ' filthy pressers');
sock.write('\n\nHave a good day.\n\n');
sock.end();
}).listen(5432);
console.log('INIT: server listening on port 5432');
console.log('~ buttond ready ~');
});
});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment