const fs = require("fs"); const websocket = require("ws"); const fetch = require("node-fetch"); const formdata = require("form-data"); const he = require("he"); const cheerio = require("cheerio"); const ddg = require("duckduckgo-images-api"); var mmm = require("mmmagic"); var Magic = mmm.Magic; var http = require("http"); const emitter = require("events"); const deek = new emitter(); const name = "rena_chan"; const password = "pass"; const mc_password = "pass"; const userid = 12; var channels = []; var ws = []; var ddg_cache = []; var ddg_mod = true; // dont show porn in .img var global_page = 1; // .img page var raid = false; // raid? var img_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "DNT": "1", "Connection": "keep-alive" }; var headers = { "User-Agent": "renabot", "Origin": "https://deek.chat" }; /* Minecraft functions */ async function send_mc(username, message){ if(mc_logged_in){ var txt = message.split("\n"); var txt_out = ""; txt.forEach(function(a){ mc.chat('/tellraw @a ["<",{"text":"' + mc_escape(username) + '","color":"gold"},"> ' + mc_escape(a) + '"]'); }); } } function mc_escape(str){ return str.replace( /[^-!\"#$%&'()*+,.\/0123456789:;<=>?@[\\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«» ]/gi, "" ); } /* Helper functions */ async function getmime(file){ return new Promise(function(resolve, reject){ var magic = new Magic(mmm.MAGIC_MIME_TYPE); magic.detect(file, function(err, result){ if(err){ resolve([ "image/png", "png", false ]); }else{ resolve([ result, result.split("/")[1], true ]); } }); }); } function removehtml(html){ return he.decode(html.replace(/<[^>]+>/ig,"")); }; async function serveddg(msg, results, page){ page--; try{ var res = await fetch( results[page].image, { headers: img_headers, signal: AbortSignal.timeout(3000) } ); var res_get = await res.buffer(); var m = await getmime(res_get); if( m[2] === false || m[0].split("/")[0] != "image" ){ var res = await fetch( results[page].thumbnail, { headers: img_headers, signal: AbortSignal.timeout(5000) } ); var res_get = await res.buffer(); } }catch(err){ var res = await fetch( results[page].thumbnail, { headers: img_headers, signal: AbortSignal.timeout(5000) } ); var res_get = await res.buffer(); } send( msg, "Page " + (page + 1) + "/" + (results.length) + "\n[" + results[page].width + "x" + results[page].height + "] " + results[page].title + "\n" + results[page].url, res_get ); } /* Websocket functions */ async function send(channel, text, file = null, forcemime = null){ if(typeof channel == "object"){ channel = channel.channel; } if(channel === 1){ send_mc(name, text); } if(channel === -1){ channel = 1; } if(file === null){ ws.send(JSON.stringify({ type: "messageEnd", data: text, roomId: channel })); return; } /* Send file */ if(forcemime === null){ var mimetype = await getmime(file); }else{ var mimetype = forcemime; } var form_data = new formdata(); form_data.append("text", text); form_data.append( "files[]", file, { contentType: mimetype[0], name: "file", filename: "file." + mimetype[1] } ); var headers_copy = headers; headers_copy["Content-Type"] = form_data.getHeaders()["content-type"]; fetch("https://deek.chat/message/send/" + channel, { method: 'POST', body: form_data, headers: headers_copy }); } /* Handshake */ async function handshake(name, password){ /* Get cookie */ console.log("logging in as " + name); const form = new formdata(); form.append("name", name); form.append("password", password); form.append("submit", "log+in"); try{ var login = await fetch( "https://deek.chat/login/submit", { method: "POST", redirect: "manual", body: form, headers: headers } ); }catch(err){ console.log("Could not login. Trying again in 10 seconds..."); setTimeout(function(){ fs.utimesSync(__filename, Date.now(), Date.now()); }, 10000); return; } var cookie = await login.headers.get("set-cookie"); var api_token = cookie.match(/api_token=([^;]+)/); var session_id = cookie.match(/session_id=([^;]+)/); if( api_token === null || typeof api_token[1] != "string" || typeof session_id[1] != "string" ){ deek.emit("error", "Could not get api_token or session_id !!"); return; } headers.cookie = "session_id=" + session_id[1] + "; api_token=" + api_token[1]; /* Connect to websocket serber */ ws = new websocket( "wss://deek.chat/ws", { protocolVersion: 13, encoding: "utf8", headers: headers } ); ws.once("open", function(){ deek.emit("login"); }); ws.once("close", function(){ deek.emit("close"); }); ws.on("message", function(message, isbin){ if(isbin){ return; } var m = JSON.parse(message.toString("utf8")); if(typeof m.type == "undefined"){ return; } switch(m.type){ case "message": case "messageEnd": for(var k=0; k Deekchat bridge */ const mineflayer = require('mineflayer'); var mc_logged_in = false; const mc = mineflayer.createBot({ host: 'deek.chat', username: name, auth: 'offline', port: 25565 }); mc.on("login", function(){ mc_logged_in = true; mc.chat("/login " + mc_password); console.log("Logged to minecraft server as " + mc.username); }); mc.on("death", function(user){ mc.respawn(); }); /* User defined FUN-ctions!!! */ deek.on("login", function(channel){ console.log("Connected to websocket xoxo"); mc.on("chat", function(username, message){ if(username === mc.username){ return; } send(-1, "<" + username + "> " + message); deek.emit( "message", { text: message, id: 0, files: [], mentions: [], replies: [], channel: 1, is_mc: true }, { name: username, id: -1, picture: null } ); }); mc.on("playerJoined", function(user){ send(-1, ">" + user.username + " joined deekcraft"); }); mc.on("playerLeft", function(user){ send(-1, ">" + user.username + " left deekcraft"); }); // Log errors and kick reasons: mc.on("kicked", function(msg){ mc_logged_in = false; console.log(msg); }); mc.on("error", function(msg){ mc_logged_in = false; console.log(msg); }); }); deek.on("message", async function(msg, user){ if( ( user.id === 13 || // me lol user.id === 14 || // aves user.id === 8 || // aves again user.id === 30 || // eagle user.id === 2 || // deek raid === false ) === false ){ return; } if( user.id === userid || user.name == name ){ return; } /* if(user.id === 5311){ user.name = msg.text.split(">")[0].substr(1); msg.text = msg.text.split(">").splice(1).join(">").trim(); }*/ if( msg.channel === 1 && typeof msg.is_mc === "undefined" ){ send_mc(user.name, msg.text); } switch(msg.text.toLowerCase()){ case "hello rena": case "hi rena": case "what's up rena": case "whats up rena": send(msg, "hi " + user.name); return; case "/help": send(msg, "lmao newfag"); return; case "fuck you rena": send(msg, "fuck you eagle"); return; } /* shitty embed support */ if(link = msg.text.match(/https?:\/\/[^ \n\r'>]+/)){ link = link[0]; try{ if(tweet = link.match(/https?:\/\/(?:www\.)?twitter\.com\/[A-Za-z0-9_]+\/status\/([0-9]+)/i)){ tweet = tweet[1]; var res = await fetch("https://cdn.syndication.twimg.com/tweet-result?id=" + tweet + "&token=2rkokdcv41v"); var json = await res.json(); var title = json.user.name + " (@" + json.user.screen_name + ") " + " on twatter"; var description = json.text; }else if(watch = link.match(/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/\s]{11})/i)){ watch = watch[1]; var res = await fetch("https://youtube.com/oembed?url=/watch?v=" + watch); var json = await res.json(); var title = json.title; var description = "By " + json.author_name; }else{ var res = await fetch( link, { headers: img_headers, signal: AbortSignal.timeout(5000) } ); var headers_arr = [...res.headers]; var headers = []; for(i=0; i 10485760 // 10MB ) ){ var text = "This thingy^ "; if(headers["content-type"]){ var format = headers["content-type"].split("/"); format = format[format.length - 1].split(";")[0]; text += "is a " + format + " file "; }else{ text += "is uhh... something.. err.. " } if(headers["content-length"]){ var filesize = Math.round(parseInt(headers["content-length"]) / 1048576); text += "that weighs " + (Math.round(parseInt(headers["content-length"]) / 1048576)) + "MB!!"; }else{ text += "that uhh weighs something probably idk!!!"; } text += " lol thats all i know fuck you"; send(msg, text); return; } // cancerous code ahead var buffer = await res.buffer(); const parser = cheerio.load(buffer); // get title var title = "Unknown title lol, shit website"; var tag_title = parser("title"); var tag_name_og_title = parser("meta[name='og:title']"); var tag_property_og_title = parser("meta[property='og:title']"); if(tag_title.length !== 0){ title = tag_title.text(); } if(tag_name_og_title.length !== 0){ title = tag_name_og_title.attr("content"); } if(tag_property_og_title.length !== 0){ title = tag_property_og_title.attr("content"); } // get description var description = "Unknown description lol, stupid website do not click"; var tag_name_description = parser("meta[name='description']"); var tag_name_og_description = parser("meta[name='og:description']"); var tag_property_description = parser("meta[property='description']"); var tag_property_og_description = parser("meta[property='og:description']"); if(typeof tag_name_description.attr("content") != "undefined"){description = tag_name_description.attr("content"); } if(typeof tag_name_og_description.attr("content") != "undefined"){description = tag_name_og_description.attr("content"); } if(typeof tag_property_description.attr("content") != "undefined"){description = tag_property_description.attr("content"); } if(typeof tag_property_og_description.attr("content") != "undefined"){description = tag_property_og_description.attr("content"); } if(typeof tag_name_description.attr("value") != "undefined"){description = tag_name_description.attr("value"); } if(typeof tag_name_og_description.attr("value") != "undefined"){description = tag_name_og_description.attr("value"); } if(typeof tag_property_description.attr("value") != "undefined"){description = tag_property_description.attr("value"); } if(typeof tag_property_og_description.attr("value") != "undefined"){description = tag_property_og_description.attr("value"); } } var text = ""; description = description.split("\n"); for(var i=0; i" + err); } return; } /* Commands */ var regex = msg.text.match(/^\.([^ ]+)(?: (.*))?/); if( regex === null || typeof regex[1] == "undefined" ){ return; } var cmd = regex[1]; if(typeof regex[2] != "undefined"){ var value = regex[2]; }else{ var value = ""; } switch(cmd.toLowerCase()){ case "raid": if( ( user.id === 13 || // me lol user.id === 14 || // aves user.id === 8 || // aves again user.id === 30 || // eagle user.id === 2 // deek ) === false ){ break; } if(raid === false){ raid = true; send(msg, "Ignoring all messages from now on, fuck you lol!!"); }else{ raid = false; send(msg, "Now listening to messages!!!"); } break; case "rc": case "reconnect": if(user.id !== 13){ break; } send(msg, "brb"); setTimeout(function(){ fs.utimesSync(__filename, Date.now(), Date.now()); }, 1000); break; case "ping": send(msg, "Pong!!!!"); break; case "dice": case "roll": case "d": case "r": value = parseInt(value); if(isNaN(value)){ value = 6; } if(value <= 1){ send( msg, "Rolling a " + value + " faced dice...\nWait what?? " + "You fucking shit, a black hole just appeared!!!!!! Oh my fucking shit!!!!!" ); return; } send( msg, "Rolling a " + value + " faced dice...\nAnd you got " + ( Math.floor(Math.random() * value + 1) ) + "!!!" ); break; case "mumble": case "m": var port = 64738; if(value == ""){ var ip = "lolcat.ca"; }else{ var value = value.split(":"); if(value.length >= 2){ var port = value[1]; } var ip = value[0]; } try{ var res = await fetch("https://lolcat.ca/api/mumble/?ip=" + ip + "&port=" + port); var res_get = await res.json(); if(res_get.status != "ok"){ send(msg, "An error occured... " + res_get.status); return; } res_get = res_get.server; var servername = res_get.name === null ? res_get.domains[0] : res_get.name; var website = res_get.website === null ? "No website available" : res_get.website; send( msg, ">Server information for " + servername + ":\n" + "Known domains => " + res_get.domains.join(", ") + "\n" + "Ping => " + res_get.ping + "\n" + "Users => " + res_get.online + "/" + res_get.max + "\n" + "Bandwidth => " + res_get.bandwidth + "\n" + "Country => " + res_get.country.name + " (" + res_get.country.code + ")\n" + "Version => " + res_get.version + "\n" + "Website => " + website ); }catch(err){ send(msg, "lolcat.ca api sucks and is offline and dead"); } break; case "prop": try{ var res = await fetch("https://www.hamqsl.com/solarn0nbh.php"); var res_get = await res.buffer(); send(msg, "Good news: the sun has not yet exploded", res_get); }catch(err){ send(msg, "Could not fetch image!!! FUCK!!!!111\n" + err); } break; case "img": case "im": case "i": if(value.trim() == ""){ send(msg, "You need to search for something cum licker!!!"); return; } global_page = 1; ddg.image_search( { query: value, moderate: ddg_mod, iterations: 1 } ).then(async results => { ddg_cache = results; if(results.length === 0){ send(msg, "No results found for " + value + "!!"); return; } await serveddg(msg, results, 1); }); break; case "boobs": case "boob": case "nsfw": switch(value.toLowerCase()){ case "yes": case "y": case "1": case "yea": case "true": case "yup": send(msg, "I will now show boobs when using .img"); ddg_mod = false; break; case "no": case "n": case "nae": case "false": case "no": case "off": case "nope": case "nah": case "0": send(msg, "I will now prevent eagle from jacking off in main chat"); ddg_mod = true; break; default: var active = ddg_mod ? "NOT " : ""; send(msg, "I will " + active + "show boobs. Use .boobs to toggle"); break; } break; case "page": case "p": value = parseInt(value); if( isNaN(value) || value == "" ){ send(msg, "You didn't enter a valid number you dumbass!!"); return; } if(ddg_cache.length === 0){ send(msg, "Search buffer doesn't contain any links you horse fucker!!"); return; } if( value > ddg_cache.length || value <= 0 ){ send(msg, "Page offset must be between 1 and " + ddg_cache.length + " you dumbass!!"); return; } global_page = value; await serveddg(msg, ddg_cache, value); break; case "pp": global_page++; if(global_page > ddg_cache.length){ send(msg, "You reached the end of results stupid kike sucker!!"); return; } await serveddg(msg, ddg_cache, global_page); break; case "youtube": case "jewtube": case "yt": if(value.trim() == ""){ send(msg, "You need to search for something cum licker!!!"); break; } var res = await fetch("https://4get.zzls.xyz/api/v1/videos?s=" + encodeURIComponent(value)); var res_get = await res.json(); if(res_get.status != "ok"){ send(msg, "Shit!!!!! 4get sucks balls and returned this error: " + res_get.status); break; } if(res_get.video.length === 0){ send(msg, "No results found for " + value + "!!"); break; } if(res_get.status != "ok"){ send(msg, "4get sucks!!!!! It returned ERRRO!!RRRO!!O!O!O!11\n>" + res_get.status); break; } var text = []; for(var i=0; iDuration: " + (new Date(res_get.video[i].duration * 1000).toISOString().slice(11, 19)) + " • Views: " + (new Intl.NumberFormat().format(res_get.video[i].views)) + " • Author: " + res_get.video[i].author.name + "\n" + res_get.video[i].title + "\n▶ " + res_get.video[i].url ); } send(msg, "Search results for \"" + value + "\"\n\n" + text.join("\n\n")); break; case "x": case "xeno": if(value.trim() == ""){ send( msg, "You must give me a search term you autistic cocksucker with no legs!!\nExample: .x owl" ); break; } var res = await fetch("https://xeno-canto.org/api/2/recordings?query=" + encodeURIComponent(value)); var res_get = await res.json(); if(res_get.recordings.length === 0){ send( msg, "No recordings found for \"" + value + "\"!!!!!" ); break; } var filereq = await fetch( res_get.recordings[0].file, {headers: img_headers} ); var file = await filereq.buffer(); send( msg, ">" + res_get.recordings[0].en + " in " + res_get.recordings[0].cnt + " (" + res_get.recordings[0].loc + ")\n" + res_get.recordings[0].rmk, file, [ "audio/mpeg", "mp3" ] ); break; case "help": case "h": send( msg, "== help menu ==\n\n" + ".help => lol idk\n" + ".img/.im/.i => search duckduckgo for birds\n" + ".boobs => Boobs?\n" + ".page/.p => get page offset for image search\n" + ".pp => get next page\n" + ".yt/.youtube => search the jewish propaganda catalog (now powered by 4get)\n" + ".x/xeno => search for bird sounds\n" + ".roll/.r => Because deekchat was too slow\n" + ".mumble/.m <[optional]ip:port> => check if lolcat died\n" + ".prop => check if the sun has exploded or smth\n" + ".ping => spam deekchat" ); break; } }); deek.on("close", function(channel){ console.log("It's over. Disconnected from websocket. Attempting reconnection in 10 seconds"); setTimeout(function(){ fs.utimesSync(__filename, Date.now(), Date.now()); }, 10000); }); deek.on("error", function(message){ console.error("Serber error: " + message + ". Attempting reconnection in 10 seconds"); setTimeout(function(){ fs.utimesSync(__filename, Date.now(), Date.now()); }, 10000); }); // connect to serber handshake(name, password);