initial commit

This commit is contained in:
Jan-Stefan Janetzky 2016-11-18 11:58:50 +01:00
commit b755988011
6 changed files with 503 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
node_modules

11
boot.sh Executable file
View File

@ -0,0 +1,11 @@
#!/bin/bash
export NVM_DIR="/home/gz/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
nvm use node
while true; do
echo starting node... $(date)
node index.js
sleep 3
done

214
chatCommands.js Normal file
View File

@ -0,0 +1,214 @@
"use strict";
let crypto = require("crypto");
let Sandbox = require("sandbox");
let google = require("google");
google.resultsPerPage = 1;
google.lang = "de";
google.tld = "de";
google.nextText = "Weiter";
const googleSearch = function (client, o) {
google(o.args, function (err, res) {
if (err) return;
const links = res.links;
if (links.length === 0) {
client.say(o.to, o.from + ": could not find anything D:");
}
else {
client.say(o.to, o.from + ": " + links[0].link + " " + links[0].title + " - " + links[0].description.replace(/(\r\n|\r|\n|\t)/g, " "));
}
});
};
let s = new Sandbox({
timeout: 1000
});
setInterval(x=>{
s.run("true", x=>{});
}, 10000);
let sbhead = "\"use strict\";const mett=9000,belst=Math.random()*mett|0;";
sbhead += Object.getOwnPropertyNames(Math).map(function(v){return "const " + v + "=Math." + v + ";" + (typeof Math[v] == "function" ? v + ".bind(Math);" : "")}).join("");
let handleChatCommands = function (irc, db) {
this.irc = irc;
this.db = db;
};
let p = handleChatCommands.prototype;
const userLevels = ["","+","%","@","&","~"];
const userLevelNames = ["user", "voiced", "halfop", "op", "admin", "owner"];
const getLevel = name => userLevelNames.indexOf(name);
const exec = require("child_process").exec;
p.run = function (o) {
let client = this.irc.client;
let db = this.db;
//let level = client.chans[o.to] ? client.chans[o.to].users[o.from] : undefined;
let level = client.chans["#w0bm"] ? client.chans["#w0bm"].users[o.from] : undefined;
level = typeof level != "undefined" ? level.split("").map(x=>userLevels.indexOf(x)).sort().pop() : -1;
if (level === null) level = -1;
switch(o.cmd) {
case ".reg":
if (level < getLevel("admin")) {
client.say(o.to, o.from + ": dein level: " + userLevelNames[level] + ", benötigtes level: admin");
return true;
}
if (!~["open", "close"].indexOf(o.args)) {
client.say(o.to, "momentane befehle: open und close");
return true;
}
client.say(o.to, "kleinen moment bitte");
exec("/bin/bash /var/www/w0bm.com/resources/views/"+o.args+".sh", (err, sout, serr)=>{
client.say(o.to, "registrierung erfolgreich " + (o.args == "open" ? "geöffnet" : "geschlossen"));
});
break;
case ".status":
/*if (level < getLevel("admin")) {
client.say(o.to, o.from + ": dein level: " + userLevelNames[level] + ", benötigtes level: admin");
return true;
}*/
db.getConnection((err, con) => {
if (err) {
client.say(o.to, "sorry.. datenbank is kapott D: BKA belst gz");
con.release();
return;
}
con.query("select disabled, deleted_at, banend, banreason, verified from users where username like ?", o.args, (err, rows, fields) => {
if (err) {
client.say(o.to, "ich bin zu doof zum coden.. hier hat sich ein fehler eingeschlichen D:");
con.release();
return;
}
if (rows.length == 0) {
client.say(o.to, "konnte keinen benutzer mit dem namen finden D:");
con.release();
return;
}
if (rows.length > 1) {
client.say(o.to, "fick dich. hör auf wildcards zu nutzen… oder… wir haben ein datenbank problem…");
con.release();
return;
}
const row = rows[0];
const stati = [];
if (row.disabled) stati.push("deaktiviert");
if (!row.disabled) stati.push("aktiviert");
if (!row.verified) stati.push("nicht verifiziert");
if (row.banend) stati.push("gebannt mit grund: " + row.banreason + ", bis: " + row.banend);
if (row.deleted_at) stati.push("gelöscht seit: " + row.deleted_at);
client.say(o.to, o.args + " ist: " + stati.join(", "));
/*var vid = rows[0];
if (!vid.id) {
client.say(to, from + ": konnte kein video finden D:");
con.release();
return;
}
var txt = [];
if (vid.deleted_at) txt.push("\x02gelöscht\x0f");
if (webm) txt.push("Link: \x02https://w0bm.com/" + vid.id + "\x0f");
["interpret", "songtitle", "category", "username", "comments"].forEach((v, i) => {
if (vid[v]) {
txt.push(
["Interpret", "Titel", "Kategorie", "Uploader", "Kommentare"][i] + ": "
+"\x02" + vid[v] + "\x0f");
}
});
client.say(to, txt.join(" | "));*/
con.release();
});
});
return true;
case "md5sum":
case "sha1sum":
case "sha256sum":
case "sha512sum":
o.cmd = o.cmd.substr(0, o.cmd.length -3);
case "md5":
case "sha1":
case "sha256":
case "sha512":
let crypt = crypto.createHash(o.cmd);
crypt.update(o.args);
client.say(o.to, "teh " + o.cmd + " sum iz: " + crypt.digest("hex"));
return true;
case "js":
/*if (level < getLevel("voiced")) {
client.say(o.to, o.from + ": dein level: " + userLevelNames[level] + ", benötigtes level: voiced");
return true;
}*/
s.run(sbhead + o.args, function (out) {
let con = out.console.length > 0 ? " and printed to console: " + out.console : "";
let text = (out.result + con).replace(/[\r\n\t]/g, " ");
client.say(o.to, o.from + " it returned: " + (text.length > 400 ? "fuck you" : text));
});
return true;
case "throw":
if (o.args != "a dice") break;
client.say(o.to, o.from + ": the magic dice shows " + ((Math.random()*6|0)+1) + " eyes.");
return true;
case ".choose":
case "choose:":
case "choice:":
let choices = o.args.split(",").map((str)=>str.trim());
if (choices.length < 2) {
client.say(o.to, "fuck you " + o.from + "!");
return true;
};
let choice = ~choices.indexOf("w0bm") ? "w0bm of course!" : choices[Math.random() * choices.length | 0];
client.say(o.to, o.from + ": i'd choose: " + choice);
return true;
case "mdn":
o.args += " site:developer.mozilla.org";
googleSearch(client, o);
return true;
case "hoogle":
o.args += " site:www.haskell.org/hoogle/";
googleSearch(client, o);
return true;
//case "google":
case ".google":
googleSearch(client, o);
return true;
case "b2o":
case "b2d":
case "b2h":
case "o2b":
case "o2d":
case "o2h":
case "d2b":
case "d2o":
case "d2h":
case "h2b":
case "h2o":
case "h2d":
if ({b:/[^01]/,o:/[^0-7]/,d:/[^\d]/,h:/[^\da-fA-F]/}[o.cmd[0]].test(o.args)) return false;
client.say(o.to, o.from + ": " + parseInt(o.args, {b:2,o:8,d:10,h:16}[o.cmd[0]]).toString({b:2,o:8,d:10,h:16}[o.cmd[2]]));
return true;
}
return false;
};
module.exports = function (irc, db) {
let hcc = new handleChatCommands(irc, db);
return function (o) {
hcc.run(o);
}
};

259
index.js Normal file
View File

@ -0,0 +1,259 @@
"use strict";
const Irc = require("irc");
const Mysql = require("mysql");
let db = Mysql.createPool({
host: "localhost",
user: "laravel",
password: "mvYx-.c6{m98rwKE",
database: "laravel",
timezone: "utc"
});
let irc = {};
/*Irc.Client.prototype._connectionHandler = function() {
if (this.opt.webirc.ip && this.opt.webirc.pass && this.opt.webirc.host) {
this.send('WEBIRC', this.opt.webirc.pass, this.opt.userName, this.opt.webirc.host, this.opt.webirc.ip);
}
if (this.opt.password) {
this.send('PASS', this.opt.password);
}
if (this.opt.debug)
console.log('Sending irc NICK/USER');
this.send('NICK', this.opt.nick);
this.nick = this.opt.nick;
this._updateMaxLineLength();
this.send('USER', this.opt.userName, 'realnetzprotokolladresse.w0bm.com', 'realnetzprotokolladresse.w0bm.com', this.opt.realName);
this.emit('connect');
};*/
//irc.client = new Irc.Client('irc.rizon.so', 'w0bm', {
//irc.client = new Irc.Client('irc.n0xy.net', 'w0bm', {
irc.client = new Irc.Client('znc.gottz.de', 'w0bm', {
// channels: ["#gz", "#w0bm"],
port: 6667,
secure: false,
retryCount: 12000,
retryDelay: 3000,
userName: "Abdullah",
realName: "Fritz",
debug: false,
selfSigned: false,
debugRaw: false,
autoConnect: false,
password: "w0bm/n0xy:Roquaib7jae9miey3aey"
});
const repl = require("repl").start("> ");
repl.context.i = irc;
repl.context.c = irc.client;
repl.context.w = (msg) => irc.client.say("#w0bm", msg);
repl.context.s = (cmd, msg) => irc.client.send(cmd, msg);
Object.defineProperty(repl.context, "q", {get:process.exit});
let needJoin = false;
irc.client.addListener("registered", () => {
console.log("registered…");
const c = irc.client;
//c.say("NickServ", "IDENTIFY dI0k2k7PH");
//c.say("NickServ", "IDENTIFY jae2Loax");
//c.say("HostServ", "ON");
//needJoin = true;
});
irc.client.addListener("notice", (from, to, text) => {
if (needJoin && from == "NickServ" && text.indexOf("Password accepted") != -1) {
needJoin = false;
const c = irc.client;
//c.join("#w0bm");
//c.join("#gz");
}
});
process.nextTick(()=>irc.client.connect());
const handleChatCommands = require("./chatCommands")(irc, db);
const shiftRegex = /^(\.?\w+:?)\s+(.+)/;
const w0bmregex = /(?:[^\/]|^|\/\/)w0bm\.com\/(?:(?:b\/)?\w+\/)?([^ '\/@`´]+\.(webm)|\d+)/i;
const capsmsg = [
"Captain capslock did not approve this!",
"CAPS",
"caps lock. unleash the mother fucking fury",
"DON'T YOU TYPE AT ME IN THAT TONE OF VOICE.",
"Suddenly, CAPS LOCK",
"OH, so you wanna argue? BRING IT. I got my CAPS LOCK ON",
"WELCOME TO THE INTERNET"
];
irc.client.addListener("error", message => console.log("error: ", message));
irc.client.on("raw", raw => {
if (irc.client.opt.debugRaw) console.log(raw);
/*if (raw.command == "rpl_whoischannels") {
let chan = raw.args[2].split(" ").filter(c => /#w0bm$/.test(c));
if (!chan || !chan[0] || chan[0].split("#")) return;
let mode = chan[0].split("#")[0];
irc.client.chans["#w0bm"].users[raw.args[1]] = mode;
}*/
});
/*irc.client.on("-mode", (chan, nick, mode, user, message) => {
if (typeof user != "undefined")
irc.client.send("WHOIS", user);
})
irc.client.on("+mode", (chan, nick, mode, user, message) => {
if (typeof user != "undefined")
irc.client.send("WHOIS", user);
})*/
irc.client.addListener("message", (from, to, message, raw) => {
const client = irc.client;
// if (client.opt.debug) console.log("raw:", raw);
let pm;
if (pm = !/^#/.test(to)) {
if (client.opt.debug) console.log("setting to from:", to, "to:", from, "cause its a PM");
to = from;
}
if (client.opt.debug) console.log("from:", from, "to:", to, "message:", message);
if (shiftRegex.test(message)) {
let cmd = message.match(shiftRegex);
let args = cmd[2].trim();
cmd = cmd[1];
if (handleChatCommands({
from: from,
to: to,
message: message,
cmd: cmd,
args: args
})) {
//console.log("cmd:", cmd, "arg:", arg);
return;
}
}
/*if (/w0bm\.com\/\d+/.test(message)) {
client.say(to, "durch Aufruf des Links: "+(message.match(/(w0bm\.com\/\d+)/)[0])+" machen Sie sich strafbar!");
return;
}*/
if (/pr0gramm\.com/.test(message) && to == "#w0bm") {
client.say(to, pr0text[Math.random()*pr0text.length|0]);
return;
}
/* if (message.toUpperCase() == message && message.trim().split("").filter(c=>/[A-Z]/.test(c)).length > 5) {
client.say(to, capsmsg[Math.random()*capsmsg.length|0]);
}
*/
if (w0bmregex.test(message)) {
var link = message.match(w0bmregex);
if (link) {
var id = link[1];
if (id.length > 20) {
client.say(to, "fuck you");
return;
}
var webm = link[2];
db.getConnection((err, con) => {
if (err) {
client.say(to, "sorry.. there seems to be a database problem right now D:");
con.release();
return;
}
con.query(
"select v.id, v.deleted_at, u.username, c.name as category, v.interpret, v.songtitle, v.imgsource,"+
" (select 1 from taggable_taggables t where t.taggable_id = v.id and t.tag_id = 1) as sfw,"+
" (select count(cm.id) from comments cm where cm.video_id = v.id and cm.deleted_at is NULL) as comments"+
" from videos v, users u, categories c where v.user_id = u.id and v.category_id = c.id"+
" and " + (webm ? "v.file" : "v.id") + " = '" + id + "'", (err, rows, fields) => {
if (err) {
client.say(to, "sorry.. there seems to be an sql query problem D:");
client.say(to, "" + err);
con.release();
return;
}
var vid = rows[0];
if (!vid) {
client.say(to, from + ": konnte kein video finden D:");
con.release();
return;
}
var txt = [];
if (vid.deleted_at) txt.push("\x02gelöscht\x0f");
if (webm) txt.push("Link: \x02https://w0bm.com/" + vid.id + "\x0f");
txt.push(vid["sfw"] ? "\x039SFW\x0f" : "\x034NSFW\x0f");
["interpret", "songtitle", "category", "username", "comments"].forEach((v, i) => {
if (vid[v]) {
txt.push(
["Artist", "Title", "Category", "Uploader", "Comments"][i] + ": "
+"\x02" + vid[v] + "\x0f"
);
}
});
client.say(to, txt.join(" | "));
con.release();
});
});
return;
}
}
if (~haitext.indexOf(message.toLowerCase())) {
client.say(to, haitext[Math.random()*haitext.length|0] + " " + from + "!");
return;
}
if (/^!d$/.test(message)) {
client.say(to, from + ": the magic dice shows " + ((Math.random()*6|0)+1) + " eyes.");
}
if (/^a+[yi][yiou]*$/.test(message)) {
client.say(to, "ayy lmao");
return;
}
if (/.+\?\?$/.test(message)) {
let ye = Math.random() * 2 | 0;
client.say(to, "[" + (ye?"x":" ") + "] ja [" + (ye?" ":"x") + "] nein | " + message);
return;
}
if (~[".guuchan", ".vizon", ".lottery"].indexOf(message)) {
let values = new Array(29).fill().map((v,i)=>1+i);
let choices = new Array(6).fill().map(()=>values.splice(Math.random()*values.length|0,1)).sort((x,y)=>x-y).join(" ");
client.say(to, "/notice guuchan !bet " + choices);
return;
}
});
const haitext = ["ohaio", "ohayou", "ohayo", "ohaiou", "ohai", "nabend", "morgen", "guten tag", "hallo", "hi", "hai", "hey", "moin", "hellau", "hello", "hallu", "yo", "servus", "tag", "tach", "alaaf", "alaf", "As-Salamu 'alaikum wa Rahmatullahi wa Barakatuhu"];
const pr0text = [
"pr0gramm.com existiert nicht!",
"endlich oc von deiner fotze?",
"Pfui Daibel",
"kommandozeile war vorher da",
"keiner von uns",
"Falsches Grau",
"das reicht uns nicht",
"Zapalot nochmal!",
"meinten sie reddit, 9gag oder fagbook?",
"lustig weil pr0gramm",
"lustig weil fett",
"marina die huuure",
"har har har kefer",
"Ach du scheiße. Da drückste Minus.",
"0815 wie fick",
"stumpf ist trumpf",
"f man weiß ja nie",
"lass das nicht die repost polizei sehen!"
];

17
package.json Normal file
View File

@ -0,0 +1,17 @@
{
"name": "ircbot",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "gz",
"license": "ISC",
"dependencies": {
"google": "^2.0.0",
"irc": "^0.5.0",
"mysql": "^2.10.2",
"sandbox": "^0.8.6"
}
}

1
readme.md Normal file
View File

@ -0,0 +1 @@
woop woop