From d15281703c3cafeda4f62f26e9675c1120831311 Mon Sep 17 00:00:00 2001 From: Flummi Date: Mon, 21 Nov 2016 07:30:40 +0100 Subject: [PATCH 01/10] muh --- src/trigger/cfg.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/trigger/cfg.js diff --git a/src/trigger/cfg.js b/src/trigger/cfg.js new file mode 100644 index 0000000..316b18c --- /dev/null +++ b/src/trigger/cfg.js @@ -0,0 +1,20 @@ +module.exports = (lib) => { + lib.trigger.add({ + name: 'cfg', + call: /^!cfg$/i, + level: 100, + active: 1, + func: (e) => { + // irc, main, websrv + var tmp = e.message.split('='); + var value = tmp[1].trim(); + var cmd = tmp[0].replace('!cfg.','').trim().split('.'); + + var kat = cmd[0]; + var key = cmd[1]; + + e.reply("kat: "+kat+" ; key: "+key+" ; val: "+value); + }, + desc: 'cfg' + }); +}; \ No newline at end of file From bdd4ef7b95b90c4ad7430b24afb4058474618962 Mon Sep 17 00:00:00 2001 From: Flummi Date: Mon, 21 Nov 2016 07:31:19 +0100 Subject: [PATCH 02/10] muh --- src/trigger/cfg.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trigger/cfg.js b/src/trigger/cfg.js index 316b18c..b6a3e99 100644 --- a/src/trigger/cfg.js +++ b/src/trigger/cfg.js @@ -1,7 +1,7 @@ module.exports = (lib) => { lib.trigger.add({ name: 'cfg', - call: /^!cfg$/i, + call: /^!cfg/i, level: 100, active: 1, func: (e) => { From a6495dd21333ead50438caa178ee81b816cd627b Mon Sep 17 00:00:00 2001 From: Flummi Date: Mon, 21 Nov 2016 19:05:02 +0100 Subject: [PATCH 03/10] WIP: cfgtrigger --- src/trigger/cfg.js | 62 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/src/trigger/cfg.js b/src/trigger/cfg.js index b6a3e99..af1ae54 100644 --- a/src/trigger/cfg.js +++ b/src/trigger/cfg.js @@ -1,19 +1,63 @@ module.exports = (lib) => { + var kats = { + main: [ + "allowedMimes", + "debugchannel", + "disallowedHosts", + "maxFileSize" + ] + }; + lib.trigger.add({ name: 'cfg', call: /^!cfg/i, level: 100, active: 1, func: (e) => { - // irc, main, websrv - var tmp = e.message.split('='); - var value = tmp[1].trim(); - var cmd = tmp[0].replace('!cfg.','').trim().split('.'); - - var kat = cmd[0]; - var key = cmd[1]; - - e.reply("kat: "+kat+" ; key: "+key+" ; val: "+value); + // irc, main, websrv, trigger + var msg = e.message.replace('!cfg.',''); + if(msg.match(/=/)) { + var tmp = e.message.split('='); + var value = tmp[1].trim(); + var cmd = tmp[0].trim().split('.'); + + if(cmd.length == 2) { + var kat = cmd[0]; + if(kat in kats) { + var key = cmd[1]; + if(kats[kat].indexOf(key) !== -1) { + e.reply("kat: "+kat+" ; key: "+key+" ; val: "+value); + } + else { + e.reply("key not found"); + } + } + else { + e.reply("kat not found"); + } + } + else { + e.reply("nope"); + } + } + else { + var cmd = msg.trim().split('.'); + var kat = cmd[0]; + if(kat in kats) { + var key = cmd[1]; + if(kats[kat].indexOf(key) !== -1) { + lib.getcfg(kat, (cb) => { + e.reply(kat+"."+key+" = "+JSON.stringify(cb)); + }, key); + } + else { + e.reply("key not found"); + } + } + else { + e.reply("kat not found"); + } + } }, desc: 'cfg' }); From a291e4f0a18f7852165be53a44e309ba11ac8e4e Mon Sep 17 00:00:00 2001 From: Flummi Date: Tue, 22 Nov 2016 06:26:12 +0100 Subject: [PATCH 04/10] muh --- src/cfg.js | 49 +++++++++++++++++++++++++++++++++++++++ src/lib.js | 67 +++++++++-------------------------------------------- src/main.js | 12 ++++++++-- 3 files changed, 70 insertions(+), 58 deletions(-) create mode 100644 src/cfg.js diff --git a/src/cfg.js b/src/cfg.js new file mode 100644 index 0000000..0fd6bcc --- /dev/null +++ b/src/cfg.js @@ -0,0 +1,49 @@ +var mysql = require('mysql'); + +var self = Cfg.prototype; +var haDC = () => { + self.sql = mysql.createConnection(require('../cfg/mysql.json')); + self.sql.connect((err) => { + if(err) setTimeout(haDC, 2000); + }); + self.sql.on('error', (err) => { + if(err.code === 'PROTOCOL_CONNECTION_LOST') haDC(); + }); +}; +haDC(); + +module.exports = Cfg; +function Cfg() { + +} + +self.read = (cb, kat, key) => { + // main, websrv, irc + var out = {}; + self.sql.query("select * from `f0ck`.`cfg`" + (kat?" where `class` = '"+kat+"'"+(key?" && `key` = '"+key+"'":""):""), (err, rows) => { + if(err || rows.length < 1) + cb(err); + else { + rows.forEach(e => { + out[e.key] = ((type, value) => { + switch(type) { + case 'string': + return value; + break; + case 'int': + return parseInt(value); + break; + case 'bool': + return (value === 'true')?true:false; + break; + case 'json': + return JSON.parse(value); + break; + } + })(e.type, e.value); + }); + if(cb) + cb( key?out[key]:out ); + } + }); +}; \ No newline at end of file diff --git a/src/lib.js b/src/lib.js index ec50436..09fbc31 100644 --- a/src/lib.js +++ b/src/lib.js @@ -4,7 +4,6 @@ var https = require('https'); var exec = require('child_process').exec; var crypto = require('crypto'); var request = require('request'); -var mysql = require('mysql'); var self = Lib.prototype; self.bot = require('coffea')(); @@ -25,29 +24,16 @@ self.trigger = { }); } }; -var haDC = () => { - self.sql = mysql.createConnection(require('../cfg/mysql.json')); - self.sql.connect((err) => { - if(err) setTimeout(haDC, 2000); - }); - self.sql.on('error', (err) => { - if(err.code === 'PROTOCOL_CONNECTION_LOST') haDC(); - }); -}; -haDC(); module.exports = Lib; -function Lib() { - self.cfg = {}; - self.getcfg('main', cfg => { - self.cfg.main = cfg; - self.debug = self.cfg.main.debug; - self.loadIRC(); - self.loadUser((cb) => console.log((cb)?"Admins wurden geladen":"Admins konnten nicht geladen werden")); - self.loadTrigger(); - self.loadEvents(); - self.getChanTrigger(); - }); +function Lib(config) { + self.cfg = config; + self.debug = self.cfg.main.debug; + self.loadIRC(); + self.loadUser((cb) => console.log((cb)?"Admins wurden geladen":"Admins konnten nicht geladen werden")); + self.loadTrigger(); + self.loadEvents(); + self.getChanTrigger(); } self.getUserlevel = (user, network, channel, cb) => { @@ -229,40 +215,9 @@ self.levelToModes = level => { return ""; }; -self.getcfg = (kat, cb, key) => { - // main, websrv, irc - var out = {}; - self.sql.query("select * from `f0ck`.`cfg` where `class` = ?"+(key?" && `key` = '"+key+"'":""), kat, (err, rows) => { - if(err || rows.length < 1) - cb(err); - else { - rows.forEach(e => { - out[e.key] = ((type, value) => { - switch(type) { - case 'string': - return value; - break; - case 'int': - return parseInt(value); - break; - case 'bool': - return (value === 'true')?true:false; - break; - case 'json': - return JSON.parse(value); - break; - } - })(e.type, e.value); - }); - if(cb) - cb( key?out[key]:out ); - } - }); -}; - self.loadIRC = () => { - self.getcfg('irc', cfg => { - self.cfg.irc = cfg; + //self.getcfg('irc', cfg => { + // self.cfg.irc = cfg; self.cfg.irc.irccfg.forEach(e => { self.bot.add({ "name": e.name, @@ -278,7 +233,7 @@ self.loadIRC = () => { }); console.log("Server "+e.name+" wurde geladen"); }); - }); + //}); }; self.getChanTrigger = () => { diff --git a/src/main.js b/src/main.js index 6633744..98779ab 100644 --- a/src/main.js +++ b/src/main.js @@ -1,5 +1,13 @@ +var Cfg = require('./cfg.js'); var Lib = require('./lib.js'); var Websrv = require('./websrv.js'); -var lib = new Lib(); -var websrv = new Websrv(lib); \ No newline at end of file +var cfg = new Cfg(); +cfg.read(config => { + if(config) { + var lib = new Lib(config); + var websrv = new Websrv(lib); + } + else + console.log(config); +}); \ No newline at end of file From 5ffb07c14cd2c1a5efeaecd0cc9b7f6e71342c3a Mon Sep 17 00:00:00 2001 From: Flummi Date: Tue, 22 Nov 2016 07:02:40 +0100 Subject: [PATCH 05/10] WIP: cfgzeugs --- src/cfg.js | 33 ++- src/events/message.js | 4 +- src/lib.js | 42 ++- src/main.js | 3 +- src/trigger/trigger.js | 69 ++--- src/websrv.js | 562 ++++++++++++++++++++--------------------- 6 files changed, 350 insertions(+), 363 deletions(-) diff --git a/src/cfg.js b/src/cfg.js index 0fd6bcc..5918e62 100644 --- a/src/cfg.js +++ b/src/cfg.js @@ -14,18 +14,23 @@ haDC(); module.exports = Cfg; function Cfg() { - + self.cfg; } self.read = (cb, kat, key) => { // main, websrv, irc - var out = {}; + var out = { + irc: {}, + main: {}, + websrv: {}, + trigger: {} + }; self.sql.query("select * from `f0ck`.`cfg`" + (kat?" where `class` = '"+kat+"'"+(key?" && `key` = '"+key+"'":""):""), (err, rows) => { if(err || rows.length < 1) cb(err); else { rows.forEach(e => { - out[e.key] = ((type, value) => { + out[e.class][e.key] = ((type, value) => { switch(type) { case 'string': return value; @@ -43,7 +48,27 @@ self.read = (cb, kat, key) => { })(e.type, e.value); }); if(cb) - cb( key?out[key]:out ); + cb( key?out[kat][key]:out ); + else + if(!kat && !key) + self.cfg = out; + } + }); +}; + +self.write = (kat, key, value, type, cb) => { + self.sql.query("select * from `f0ck`.`cfg` where `class` = ? && `key` = ? limit 1", [kat, key], (err, rows) => { + if(rows.length > 0) { + self.sql.query("update `f0ck`.`cfg` set `value` = ? where `class` = ? && `key` = ?", [value, kat, key], (err) => { + self.read(); + if(cb) cb(err); + }); + } + else { + self.sql.query("insert into `f0ck`.`cfg` (`class`,`key`,`value`,`type`) values (?,?,?,?)", [kat, key, value, type], (err) => { + self.read(); + if(cb) cb(err); + }); } }); }; \ No newline at end of file diff --git a/src/events/message.js b/src/events/message.js index 2711aea..8210483 100644 --- a/src/events/message.js +++ b/src/events/message.js @@ -3,8 +3,8 @@ module.exports = (lib) => { lib.trigger.trigger.forEach((entry,i,a) => { if(e.message.match(entry.call)) { let active = false; - if(lib.trigger.chans[e.network+e.channel.getName()] !== undefined) { - if(lib.trigger.chans[e.network+e.channel.getName()][entry.name]) + if(lib.cfg.trigger[e.network+e.channel.getName()] !== undefined) { + if(lib.cfg.trigger[e.network+e.channel.getName()][entry.name]) active = true; } else diff --git a/src/lib.js b/src/lib.js index 09fbc31..3750ecd 100644 --- a/src/lib.js +++ b/src/lib.js @@ -27,13 +27,14 @@ self.trigger = { module.exports = Lib; function Lib(config) { - self.cfg = config; + self.config = config; + self.sql = config.sql; + self.cfg = config.cfg; self.debug = self.cfg.main.debug; self.loadIRC(); self.loadUser((cb) => console.log((cb)?"Admins wurden geladen":"Admins konnten nicht geladen werden")); self.loadTrigger(); self.loadEvents(); - self.getChanTrigger(); } self.getUserlevel = (user, network, channel, cb) => { @@ -216,31 +217,20 @@ self.levelToModes = level => { }; self.loadIRC = () => { - //self.getcfg('irc', cfg => { - // self.cfg.irc = cfg; - self.cfg.irc.irccfg.forEach(e => { - self.bot.add({ - "name": e.name, - "host": e.host, - "port": e.port, - "ssl": e.ssl, - "ssl_allow_invalid": e.ssl_allow_invalid, - "pass": e.pass, - "nick": e.nick, - "username": e.username, - "realname": e.realname, - "throttling": e.throttling - }); - console.log("Server "+e.name+" wurde geladen"); + self.cfg.irc.irccfg.forEach(e => { + self.bot.add({ + "name": e.name, + "host": e.host, + "port": e.port, + "ssl": e.ssl, + "ssl_allow_invalid": e.ssl_allow_invalid, + "pass": e.pass, + "nick": e.nick, + "username": e.username, + "realname": e.realname, + "throttling": e.throttling }); - //}); -}; - -self.getChanTrigger = () => { - self.trigger.chans = {}; - self.getcfg('trigger', cb => { - for(let tmp in cb) - self.trigger.chans[tmp] = cb[tmp]; + console.log("Server "+e.name+" wurde geladen"); }); }; diff --git a/src/main.js b/src/main.js index 98779ab..fd35c8b 100644 --- a/src/main.js +++ b/src/main.js @@ -5,7 +5,8 @@ var Websrv = require('./websrv.js'); var cfg = new Cfg(); cfg.read(config => { if(config) { - var lib = new Lib(config); + cfg.cfg = config; + var lib = new Lib(cfg); var websrv = new Websrv(lib); } else diff --git a/src/trigger/trigger.js b/src/trigger/trigger.js index 04bd87c..b63d263 100644 --- a/src/trigger/trigger.js +++ b/src/trigger/trigger.js @@ -6,35 +6,31 @@ module.exports = (lib) => { active: 1, func: (e) => { var args = e.message.split(' '); - lib.getcfg('trigger', cb => { - if(!cb) - cb = lib.genStdTrigger(); - switch(args[1]) { - case "std": - e.reply(JSON.stringify(lib.genStdTrigger())); - break; - case "toggle": - if(trigger = args[2].toLowerCase()) { - cb = triggertoggle(cb, trigger); - writecfg('trigger', e.network+e.channel, JSON.stringify(cb), cbwc => { - if(!cbwc) { - e.reply("trigger "+ trigger +" in channel "+e.channel.getName() + lib.bot.format.get(cb[trigger]?'green':'red')+" "+(cb[trigger]?"activated":"deactivated")); - lib.getChanTrigger(); - } - else - e.reply(cbwc); - }); - } - break; - default: - var output = ""; - e.reply("Trigger in "+e.channel.getName()+" (green: activated, red: deactivated):"); - for(var key in cb) - output += lib.bot.format.get(cb[key]?'green':'red')+" "+key; - e.reply(output); - break; - } - }, e.network+e.channel); + if(!lib.cfg.trigger[e.network+e.channel]) + lib.cfg.trigger[e.network+e.channel] = lib.genStdTrigger(); + switch(args[1]) { + case "std": + e.reply(JSON.stringify(lib.genStdTrigger())); + break; + case "toggle": + if(trigger = args[2].toLowerCase()) { + lib.cfg.trigger[e.network+e.channel] = triggertoggle(lib.cfg.trigger[e.network+e.channel], trigger); + lib.config.write('trigger', e.network+e.channel, JSON.stringify(lib.cfg.trigger[e.network+e.channel]), 'json', cbwc => { + if(!cbwc) + e.reply("trigger "+ trigger +" in channel "+e.channel.getName() + lib.bot.format.get(lib.cfg.trigger[e.network+e.channel][trigger]?'green':'red')+" "+(lib.cfg.trigger[e.network+e.channel][trigger]?'activated':'deactivated')); + else + e.reply(cbwc); + }); + } + break; + default: + var output = ""; + e.reply("Trigger in "+e.channel.getName()+" (green: activated, red: deactivated):"); + for(var key in lib.cfg.trigger[e.network+e.channel]) + output += lib.bot.format.get(lib.cfg.trigger[e.network+e.channel][key]?'green':'red')+" "+key; + e.reply(output); + break; + } }, desc: 'muh' }); @@ -44,19 +40,4 @@ module.exports = (lib) => { trigger[key] = !trigger[key]; return trigger; }; - - var writecfg = (kat, key, value, cb) => { - lib.sql.query("select * from `f0ck`.`cfg` where `class` = ? && `key` = ? limit 1", [kat, key], (err, rows) => { - if(rows.length > 0) { - lib.sql.query("update `f0ck`.`cfg` set `value` = ? where `class` = ? && `key` = ?", [value, kat, key], (err) => { - if(cb) cb(err); - }); - } - else { - lib.sql.query("insert into `f0ck`.`cfg` (`class`,`key`,`value`,`type`) values (?,?,?,?)", [kat, key, value, 'json'], (err) => { - if(cb) cb(err); - }); - } - }); - }; }; \ No newline at end of file diff --git a/src/websrv.js b/src/websrv.js index ee85fac..a5b98ff 100644 --- a/src/websrv.js +++ b/src/websrv.js @@ -11,316 +11,306 @@ var lib; module.exports = Websrv; function Websrv(tlib) { this.lib = lib = tlib; - - lib.getcfg('websrv', cfg => { - lib.cfg.websrv = cfg; - Websrv.prototype.getTpls(); - - http.createServer((req, res) => { - if(lib.cfg.websrv.wlip.hasOwnProperty(req.connection.remoteAddress)) { - var filePath = '.' + req.url; - var url = req.url.split("/")[1]; - if(filePath == './') - filePath = './index.html'; - if(req.method == 'POST') { - if(filePath == './git' && req.headers['x-gitlab-token'] == lib.cfg.websrv.gittoken) { - var body = ''; - req.on('data', (data) => { - body += data; - if(body.length > 1e6) - req.connection.destroy(); - }); - req.on('end', () => { - body = JSON.parse(body); - var eventname = body.event_name; - var autor = body.user_name; - var branch = body.ref.split('/')[2]; - - if(branch === "master") { - var commit = ""; - try { - commit = body.commits[body.commits.length-1].message.replace('\n','').trim(); - } - catch(ex) { - commit = body.commits[body.commits.length-2].message.replace('\n','').trim(); - } - lib.bot.send( lib.cfg.main.debugchannel, eventname + ' from ' + autor + ' ('+commit+') in branch '+branch, 'n0xy' ); - if( lib.cfg.main.debugchannel === '#f0ck' ) { - exec('cd ../ & git pull', (error, stdout) => { - if(error === null) { - if(!lib.debug) - lib.bot.send(lib.cfg.main.debugchannel, 'git pull suxxessfully.', 'n0xy'); - else - lib.log(stdout); - } - }); - } + Websrv.prototype.getTpls(); + http.createServer((req, res) => { + if(lib.cfg.websrv.wlip.hasOwnProperty(req.connection.remoteAddress)) { + var filePath = '.' + req.url; + var url = req.url.split("/")[1]; + if(filePath == './') + filePath = './index.html'; + if(req.method == 'POST') { + if(filePath == './git' && req.headers['x-gitlab-token'] == lib.cfg.websrv.gittoken) { + var body = ''; + req.on('data', (data) => { + body += data; + if(body.length > 1e6) + req.connection.destroy(); + }); + req.on('end', () => { + body = JSON.parse(body); + var eventname = body.event_name; + var autor = body.user_name; + var branch = body.ref.split('/')[2]; + if(branch === "master") { + var commit = ""; + try { + commit = body.commits[body.commits.length-1].message.replace('\n','').trim(); } + catch(ex) { + commit = body.commits[body.commits.length-2].message.replace('\n','').trim(); + } + lib.bot.send( lib.cfg.main.debugchannel, eventname + ' from ' + autor + ' ('+commit+') in branch '+branch, 'n0xy' ); + if( lib.cfg.main.debugchannel === '#f0ck' ) { + exec('cd ../ & git pull', (error, stdout) => { + if(error === null) { + if(!lib.debug) + lib.bot.send(lib.cfg.main.debugchannel, 'git pull suxxessfully.', 'n0xy'); + else + lib.log(stdout); + } + }); + } + } + }); + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end('muh', 'utf-8'); + } + else + res.writeHead(403); + } + else { + var extname = String(path.extname(filePath)).toLowerCase(); + var contentType = 'text/html'; + var mimeTypes = { + '.html': 'text/html', + '.js': 'text/javascript', + '.css': 'text/css', + '.png': 'image/png', + '.jpg': 'image/jpg', + '.gif': 'image/gif', + '.mp3': 'audio/mpeg', + '.mp4': 'video/mp4', + '.webm': 'video/webm', + '.ogg': 'audio/ogg', + '.mov': 'video/quicktime' + }; // Todo: hat hier nichts zu suchen! + if(filePath == "./index.html") { // mainpage + var tpl = swig.compile(templates.index); + var data = { + items: [], + last: 10000 + }; + lib.sql.query("select `id`,`mime` from `f0ck`.`items` order by `id` desc limit 100", (err, rows, fields) => { + rows.forEach((e,i,a) => { + data.items.push({ "id": e.id, "mime": e.mime }); + data.last = e.id; }); res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end('muh', 'utf-8'); - } - else { - res.writeHead(403); - } + res.end(tpl(data), 'utf-8'); + }); } - else { - var extname = String(path.extname(filePath)).toLowerCase(); - var contentType = 'text/html'; - var mimeTypes = { - '.html': 'text/html', - '.js': 'text/javascript', - '.css': 'text/css', - '.png': 'image/png', - '.jpg': 'image/jpg', - '.gif': 'image/gif', - '.mp3': 'audio/mpeg', - '.mp4': 'video/mp4', - '.webm': 'video/webm', - '.ogg': 'audio/ogg', - '.mov': 'video/quicktime' - }; - if(filePath == "./index.html") { // mainpage - var tpl = swig.compile(templates.index); + else if(Number.isInteger(parseInt(url))) { // itempage + var query = "select * from `f0ck`.`items` where `id` = ? limit 1; " // get item + + "select `id` from `f0ck`.`items` where `id` = (select min(`id`) from `f0ck`.`items` where `id` > ?); " // get previous item + + "select `id` from `f0ck`.`items` where `id` = (select max(`id`) from `f0ck`.`items` where `id` < ?)"; // get next item + lib.sql.query(query, [url, url, url], (err, rows, fields) => { + var tpl = swig.compile(templates.item); var data = { - items: [], - last: 10000 + id: '', + username: '', + item: '', + src: '', + dest: '', + mime: '', + size: '', + userchannel: '', + usernetwork: '', + thumb: null, + next: null, + prev: null }; - lib.sql.query("select `id`,`mime` from `f0ck`.`items` order by `id` desc limit 100", (err, rows, fields) => { + if(rows[0].length) { + var e = rows[0][0]; + switch(e.mime) { + case "image/png": + case "image/jpeg": + case "image/gif": + data.item = 'image'; + break; + case "video/webm": + case "video/mp4": + case "video/quicktime": + data.item = 'video'; + break; + case "audio/mpeg": + case "audio/ogg": + data.item = 'audio'; + break; + } + data.id = e.id; + data.username = e.username; + data.srcurl = e.src; + data.src = urlm.parse(e.src).hostname; + data.thumb = (e.thumb != '' && e.thumb.match(/sndcdn\.com/i))?e.thumb:null; + data.dest = e.dest; + data.mime = e.mime; + data.size = lib.formatSize(e.size); + data.userchannel = e.userchannel; + data.usernetwork = e.usernetwork; + data.timestamp = new Date(e.stamp * 1000).toString(); + if(rows[1].length) + data.next = rows[1][0].id; + if(rows[2].length) + data.prev = rows[2][0].id; + } + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end(tpl(data), 'utf-8'); + }); + } + else if(filePath == "./random") { + lib.sql.query("select `id` from `f0ck`.`items` order by rand() limit 1", (err, rows, fields) => { + res.writeHead(301, { + 'Cache-Control': 'no-cache, public', + 'Location': '/' + rows[0].id + }); + res.end(); + }); + } + else if(filePath == "./how") { + var tpl = swig.compile(templates.how); + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end(tpl(), 'utf-8'); + } + else if(filePath == "./contact") { + var tpl = swig.compile(templates.contact); + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end(tpl(), 'utf-8'); + } + else if(filePath == "./scripts") { + var tpl = swig.compile(templates.scripts); + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end(tpl(), 'utf-8'); + } + else if(filePath.match(/^\.\/(b|s|t)\/.*/)) { // file + contentType = mimeTypes[extname]; + switch(contentType) { + case "video/webm": + case "video/mp4": + case "video/quicktime": + case "audio/mpeg": + case "audio/ogg": + var start = 0; + var end = 0; + var range = req.headers['range']; + var stat = fs.statSync(filePath); + if(range != null) { + start = parseInt(range.slice(range.indexOf('bytes=')+6, range.indexOf('-'))); + end = parseInt(range.slice(range.indexOf('-')+1, range.length)); + } + if(isNaN(end) || end == 0) end = stat.size-1; + if(start > end) return; + res.writeHead(206, { + 'Connection':'close', + 'Content-Type':contentType, + 'Content-Length':end - start, + 'Content-Range':'bytes '+start+'-'+end+'/'+stat.size, + 'Transfer-Encoding':'chunked' + }); + var stream = fs.createReadStream(filePath, { flags: 'r', start: start, end: end}); + stream.pipe(res); + break; + default: + fs.readFile(filePath, (error, content) => { + if(error) { + if(error.code == 'ENOENT') { + res.writeHead(200, { 'Content-Type': contentType }); + res.end('404 - f0ck you', 'utf-8'); + } + else { + res.writeHead(500); + res.end('Sorry, check with the site admin for error: '+error.code+' ..\n'); + res.end(); + } + } + else { + res.writeHead(200, { 'Content-Type': contentType, 'Content-Length': content.length, 'Cache-Control': 'max-age=2592000, public' }); + res.end(content, 'utf-8'); + } + }); + break; + } + fs.readFile(filePath, (error, content) => { + if(error) { + if(error.code == 'ENOENT') { + res.writeHead(200, { 'Content-Type': contentType }); + res.end('404 - f0ck you', 'utf-8'); + } + else { + res.writeHead(500); + res.end('Sorry, check with the site admin for error: '+error.code+' ..\n'); + res.end(); + } + } + }); + } + else if(filePath.match(/^\.\/api/i)) { // api + var url = filePath.split('/'); + if(url[2] === undefined) { // Mainpage + var query = "select * from `f0ck`.`items`"; + lib.sql.query(query, (err, rows, fields) => { + var items = []; rows.forEach((e,i,a) => { - data.items.push({ "id": e.id, "mime": e.mime }); - data.last = e.id; + items.push({ + 'id': e.id, + 'mime': e.mime + }); }); res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end(tpl(data), 'utf-8'); + res.end(JSON.stringify(items), 'utf-8'); }); } - else if(Number.isInteger(parseInt(url))) { // itempage - var query = "select * from `f0ck`.`items` where `id` = ? limit 1; " // get item - + "select `id` from `f0ck`.`items` where `id` = (select min(`id`) from `f0ck`.`items` where `id` > ?); " // get previous item - + "select `id` from `f0ck`.`items` where `id` = (select max(`id`) from `f0ck`.`items` where `id` < ?)"; // get next item - lib.sql.query(query, [url, url, url], (err, rows, fields) => { - var tpl = swig.compile(templates.item); - var data = { - id: '', - username: '', - item: '', - src: '', - dest: '', - mime: '', - size: '', - userchannel: '', - usernetwork: '', - thumb: null, - next: null, - prev: null + else if(url[2] == "p" && Number.isInteger(parseInt(url[3]))) { // pagination + var eps = 50; + var id = url[3]; + lib.sql.query("select * from `f0ck`.`items` where `id` < ? order by `id` desc limit ?", [id, eps], (err, rows, fields) => { + var items = { + "items": [], + "last": id }; + rows.forEach((e,i,a) => { + items.items.push({ + 'id': e.id, + 'mime': e.mime + }); + items.last = e.id; + }); + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end(JSON.stringify(items), 'utf-8'); + }); + } + else if(Number.isInteger(parseInt(url[2]))) { // Item + var query = "select * from `f0ck`.`items` where `id` = ? limit 1; " // get item + + "select `id` from `f0ck`.`items` where `id` = (select min(`id`) from `f0ck`.`items` where `id` > ?); " // get previous item + + "select `id` from `f0ck`.`items` where `id` = (select max(`id`) from `f0ck`.`items` where `id` < ?)"; // get next item + lib.sql.query(query, [url[2], url[2], url[2]], (err, rows, fields) => { + var data; if(rows[0].length) { var e = rows[0][0]; - switch(e.mime) { - case "image/png": - case "image/jpeg": - case "image/gif": - data.item = 'image'; - break; - case "video/webm": - case "video/mp4": - case "video/quicktime": - data.item = 'video'; - break; - case "audio/mpeg": - case "audio/ogg": - data.item = 'audio'; - break; - } - data.id = e.id; - data.username = e.username; - - data.srcurl = e.src; - data.src = urlm.parse(e.src).hostname; - data.thumb = (e.thumb != '' && e.thumb.match(/sndcdn\.com/i))?e.thumb:null; - - data.dest = e.dest; - data.mime = e.mime; - data.size = lib.formatSize(e.size); - data.userchannel = e.userchannel; - data.usernetwork = e.usernetwork; - data.timestamp = new Date(e.stamp * 1000).toString(); + data = { + id: e.id, + username: e.username, + src: e.src, + dest: e.dest, + mime: e.mime, + size: e.size, + userchannel: e.userchannel, + usernetwork: e.usernetwork, + next: null, + prev: null + }; if(rows[1].length) data.next = rows[1][0].id; if(rows[2].length) data.prev = rows[2][0].id; } + else + data = { error: 'nope' }; res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end(tpl(data), 'utf-8'); + res.end(JSON.stringify(data), 'utf-8'); }); } - else if(filePath == "./random") { - lib.sql.query("select `id` from `f0ck`.`items` order by rand() limit 1", (err, rows, fields) => { - res.writeHead(301, { - 'Cache-Control': 'no-cache, public', - 'Location': '/' + rows[0].id - }); - res.end(); - }); - } - else if(filePath == "./how") { - var tpl = swig.compile(templates.how); - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end(tpl(), 'utf-8'); - } - else if(filePath == "./contact") { - var tpl = swig.compile(templates.contact); - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end(tpl(), 'utf-8'); - } - else if(filePath == "./scripts") { - var tpl = swig.compile(templates.scripts); - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end(tpl(), 'utf-8'); - } - else if(filePath.match(/^\.\/(b|s|t)\/.*/)) { // file - contentType = mimeTypes[extname]; - switch(contentType) { - case "video/webm": - case "video/mp4": - case "video/quicktime": - case "audio/mpeg": - case "audio/ogg": - var start = 0; - var end = 0; - var range = req.headers['range']; - var stat = fs.statSync(filePath); - if(range != null) { - start = parseInt(range.slice(range.indexOf('bytes=')+6, range.indexOf('-'))); - end = parseInt(range.slice(range.indexOf('-')+1, range.length)); - } - if(isNaN(end) || end == 0) end = stat.size-1; - if(start > end) return; - res.writeHead(206, { - 'Connection':'close', - 'Content-Type':contentType, - 'Content-Length':end - start, - 'Content-Range':'bytes '+start+'-'+end+'/'+stat.size, - 'Transfer-Encoding':'chunked' - }); - var stream = fs.createReadStream(filePath, { flags: 'r', start: start, end: end}); - stream.pipe(res); - break; - default: - fs.readFile(filePath, (error, content) => { - if(error) { - if(error.code == 'ENOENT') { - res.writeHead(200, { 'Content-Type': contentType }); - res.end('404 - f0ck you', 'utf-8'); - } - else { - res.writeHead(500); - res.end('Sorry, check with the site admin for error: '+error.code+' ..\n'); - res.end(); - } - } - else { - res.writeHead(200, { 'Content-Type': contentType, 'Content-Length': content.length, 'Cache-Control': 'max-age=2592000, public' }); - res.end(content, 'utf-8'); - } - }); - break; - } - fs.readFile(filePath, (error, content) => { - if(error) { - if(error.code == 'ENOENT') { - res.writeHead(200, { 'Content-Type': contentType }); - res.end('404 - f0ck you', 'utf-8'); - } - else { - res.writeHead(500); - res.end('Sorry, check with the site admin for error: '+error.code+' ..\n'); - res.end(); - } - } - }); - } - else if(filePath.match(/^\.\/api/i)) { // api - var url = filePath.split('/'); - if(url[2] === undefined) { // Mainpage - var query = "select * from `f0ck`.`items`"; - lib.sql.query(query, (err, rows, fields) => { - var items = []; - rows.forEach((e,i,a) => { - items.push({ - 'id': e.id, - 'mime': e.mime - }); - }); - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end(JSON.stringify(items), 'utf-8'); - }); - } - else if(url[2] == "p" && Number.isInteger(parseInt(url[3]))) { // pagination - var eps = 50; - var id = url[3]; - - lib.sql.query("select * from `f0ck`.`items` where `id` < ? order by `id` desc limit ?", [id, eps], (err, rows, fields) => { - var items = { - "items": [], - "last": id - }; - rows.forEach((e,i,a) => { - items.items.push({ - 'id': e.id, - 'mime': e.mime - }); - items.last = e.id; - }); - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end(JSON.stringify(items), 'utf-8'); - }); - } - else if(Number.isInteger(parseInt(url[2]))) { // Item - var query = "select * from `f0ck`.`items` where `id` = ? limit 1; " // get item - + "select `id` from `f0ck`.`items` where `id` = (select min(`id`) from `f0ck`.`items` where `id` > ?); " // get previous item - + "select `id` from `f0ck`.`items` where `id` = (select max(`id`) from `f0ck`.`items` where `id` < ?)"; // get next item - lib.sql.query(query, [url[2], url[2], url[2]], (err, rows, fields) => { - var data; - if(rows[0].length) { - var e = rows[0][0]; - data = { - id: e.id, - username: e.username, - src: e.src, - dest: e.dest, - mime: e.mime, - size: e.size, - userchannel: e.userchannel, - usernetwork: e.usernetwork, - next: null, - prev: null - }; - if(rows[1].length) - data.next = rows[1][0].id; - if(rows[2].length) - data.prev = rows[2][0].id; - } - else - data = { error: 'nope' }; - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end(JSON.stringify(data), 'utf-8'); - }); - } - } - else { // errorpage - res.writeHead(404); - res.end('404 - f0ck you', 'utf-8'); - } + } + else { // errorpage + res.writeHead(404); + res.end('404 - f0ck you', 'utf-8'); } } - else { - res.writeHead(403); - res.end('403 - forbidden'); - } - }).listen(lib.cfg.websrv.port); - }); + } + else { + res.writeHead(403); + res.end('403 - forbidden'); + } + }).listen(lib.cfg.websrv.port); } Websrv.prototype.getTpls = () => { From ba246d672d002ea84d84e39c5c744daf582bac6f Mon Sep 17 00:00:00 2001 From: Flummi Date: Tue, 22 Nov 2016 16:58:06 +0100 Subject: [PATCH 06/10] bulkdel --- src/trigger/del.js | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/trigger/del.js b/src/trigger/del.js index 9900ee3..799df42 100644 --- a/src/trigger/del.js +++ b/src/trigger/del.js @@ -3,23 +3,30 @@ var fs = require('fs-extra'); module.exports = (lib) => { lib.trigger.add({ name: 'delete', - call: /^\!(del|rm) (\d+)$/i, + call: /^\!(del|rm)$/i, level: 100, active: 0, func: (e) => { - var id = e.message.split(' ')[1]; - lib.sql.query("select `dest` from `f0ck`.`items` where `id` = ?", id, (err, rows, fields) => { - if(rows[0]) { - lib.sql.query("delete from `f0ck`.`items` where `id` = ?", id).on('end', () => { - fs.unlink(rows[0].dest); - fs.unlink("./t/"+id+".png"); - e.reply("f0ck "+id+" deleted"); + var ids = e.message.split(' '); + var ok = []; + var fail = []; + ids.shift(); + for(var id in ids) { + if(Number.isInteger(parseInt(id))) { + lib.sql.query("select `dest` from `f0ck`.`items` where `id` = ?", id, (err, rows, fields) => { + if(rows[0]) { + lib.sql.query("delete from `f0ck`.`items` where `id` = ?", id).on('end', () => { + fs.unlink(rows[0].dest); + fs.unlink("./t/"+id+".png"); + ok.push(id); + }); + } + else + fail.push(id); }); } - else { - e.reply("404 - f0ck not found"); - } - }); + } + e.reply(ok+" from "+(ok+fail)+" f0cks deleted"); }, desc: 'delete f0ck' }); From f3280092e05f961c4e38ca1e6123b01ccf0aa8d1 Mon Sep 17 00:00:00 2001 From: Flummi Date: Tue, 22 Nov 2016 16:59:28 +0100 Subject: [PATCH 07/10] lel --- src/trigger/del.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trigger/del.js b/src/trigger/del.js index 799df42..2ba89d0 100644 --- a/src/trigger/del.js +++ b/src/trigger/del.js @@ -3,7 +3,7 @@ var fs = require('fs-extra'); module.exports = (lib) => { lib.trigger.add({ name: 'delete', - call: /^\!(del|rm)$/i, + call: /^\!(del|rm) .*/i, level: 100, active: 0, func: (e) => { From de01871498d5a35bf525d153ba3c5fbd15d827e9 Mon Sep 17 00:00:00 2001 From: Flummi Date: Tue, 22 Nov 2016 17:00:50 +0100 Subject: [PATCH 08/10] -.- --- src/trigger/del.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trigger/del.js b/src/trigger/del.js index 2ba89d0..bb9b6e6 100644 --- a/src/trigger/del.js +++ b/src/trigger/del.js @@ -3,7 +3,7 @@ var fs = require('fs-extra'); module.exports = (lib) => { lib.trigger.add({ name: 'delete', - call: /^\!(del|rm) .*/i, + call: /^\!(del|rm)/i, level: 100, active: 0, func: (e) => { From 36fcb306303e16056918353a3f7ff9a6fc0315b5 Mon Sep 17 00:00:00 2001 From: Flummi Date: Tue, 22 Nov 2016 17:02:26 +0100 Subject: [PATCH 09/10] -.- --- src/trigger/del.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trigger/del.js b/src/trigger/del.js index bb9b6e6..0e0bd0b 100644 --- a/src/trigger/del.js +++ b/src/trigger/del.js @@ -26,7 +26,7 @@ module.exports = (lib) => { }); } } - e.reply(ok+" from "+(ok+fail)+" f0cks deleted"); + e.reply(ok.length+" from "+(ok.length+fail.length)+" f0cks deleted"); }, desc: 'delete f0ck' }); From 9ddb8ad7d46966bbd2fe1210e537c6925b277082 Mon Sep 17 00:00:00 2001 From: Flummi Date: Tue, 22 Nov 2016 17:29:04 +0100 Subject: [PATCH 10/10] fixed --- src/trigger/del.js | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/trigger/del.js b/src/trigger/del.js index 0e0bd0b..8161a94 100644 --- a/src/trigger/del.js +++ b/src/trigger/del.js @@ -2,31 +2,30 @@ var fs = require('fs-extra'); module.exports = (lib) => { lib.trigger.add({ - name: 'delete', + name: 'del', call: /^\!(del|rm)/i, level: 100, active: 0, func: (e) => { var ids = e.message.split(' '); - var ok = []; - var fail = []; ids.shift(); - for(var id in ids) { - if(Number.isInteger(parseInt(id))) { - lib.sql.query("select `dest` from `f0ck`.`items` where `id` = ?", id, (err, rows, fields) => { + ids.forEach(id => { + if(Number.isInteger(parseInt(id))) { + lib.sql.query("select `dest` from `f0ck`.`items` where `id` = ? limit 1", id, (err, rows) => { if(rows[0]) { - lib.sql.query("delete from `f0ck`.`items` where `id` = ?", id).on('end', () => { - fs.unlink(rows[0].dest); - fs.unlink("./t/"+id+".png"); - ok.push(id); + lib.sql.query("delete from `f0ck`.`items` where `id` = ? limit 1", id, err => { + if(!err) { + fs.unlink(rows[0].dest, err => {}); + fs.unlink("./t/"+id+".png", err => {}); + } + else + e.reply(err); }); } - else - fail.push(id); }); } - } - e.reply(ok.length+" from "+(ok.length+fail.length)+" f0cks deleted"); + }); + e.reply("f0ck"+(ids.length>1?"s":"")+" deleted"); }, desc: 'delete f0ck' });