const fs = require("fs"); const websocket = require("ws"); var irc = require("irc"); const fetch = require("node-fetch"); const formdata = require("form-data"); const he = require("he"); const cheerio = require("cheerio"); var mmm = require("mmmagic"); var Magic = mmm.Magic; var ws_logged_in = false; const mineflayer = require("mineflayer"); const mc_bridge_enabled = false; const irc_bridge_enabled = true; const instance = "https://4get.lumaeris.com"; var scraper = "ddg"; const mc_options = { "host": "deek.chat", "port": 25565, "username": "rena_chan" // offline mode }; const irc_ip = "192.168.0.152"; var http = require("http"); const emitter = require("events"); const deek = new emitter(); const name = "rena_chan"; const password = "no"; const irc_password = "no"; const userid = 12; var channels = []; var ws = []; var results_cache = []; var is_pp_xeno = false; 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:130.0) Gecko/20100101 Firefox/130.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 fortunes = [ "You will meet a dark stranger.", "You will be eaten by a grue.", "Your fortune: Bad Luck.", "Your fortune: Good Luck.", "Your fortune: Reply hazy, try again.", "Your fortune: Outlook not so good.", "Your fortune: YES.", "Your fortune: NO.", "Your fortune: Absolutely.", "Your fortune: Very doubtful.", "Your fortune: Cannot predict now.", "Your fortune: Signs point to yes.", "Your fortune: Don't count on it.", "Your fortune: You may rely on it.", "Your fortune: Concentrate and ask again.", "Your fortune: The future is uncertain.", "Your fortune: it's over" ]; var headers = { "User-Agent": "renabot", "Origin": "https://deek.chat" }; /* HTTP server bullshit */ //process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; const http_bullshit_handler = function(req, res){ switch(req.url){ case "/": res.setHeader("Content-Type", "text/html"); res.writeHead(200); res.end('

all work and no play makes deek a dull boy

'); break; case "/kys": res.setHeader("Content-Type", "text/html"); res.writeHead(200); res.end('

bang!

'); send(1, "Resharted from web interface"); setTimeout(function(){ fs.utimesSync(__filename, Date.now(), Date.now()); }, 1000); break; default: res.writeHead(404); res.end("fuck you"); break; } } const http_bullshit = http.createServer(http_bullshit_handler); http_bullshit.listen(6969, "0.0.0.0", function(){ console.log("HTTP bullshit running"); }); /* 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].source[0].url, { 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].source[results[page].source.length - 1].url, { headers: img_headers, signal: AbortSignal.timeout(5000) } ); var res_get = await res.buffer(); } }catch(err){ var res = await fetch( results[page].source[results[page].source.length - 1].url, { headers: img_headers, signal: AbortSignal.timeout(5000) } ); var res_get = await res.buffer(); } send( msg, "Page " + (page + 1) + "/" + (results.length) + "\n[" + results[page].source[0].width + "x" + results[page].source[0].height + "] " + results[page].title + "\n" + results[page].url, res_get ); } /* Websocket functions */ async function send(channel, text, file = null, forcemime = null){ if(ws_logged_in === false){ return; } if(typeof channel == "object"){ channel = channel.channel; } 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 } ); var pong_time = Date.now(); ws.once("open", function(){ ws_logged_in = true; deek.emit("login"); const keep_alive = setInterval(function(){ //console.log("ping!"); if(pong_time + 10000 < Date.now()){ deek.emit("error", "Did not receive ping frame"); return; } ws.ping(); }, 5000); }); ws.on("pong", function(){ pong_time = Date.now(); //console.log(pong_time + ": pong!"); }); ws.once("close", function(){ ws_logged_in = false; 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 " + message); } if( username === "4lul" && message.startsWith(".run") ){ var cmd = message.split(" "); cmd.shift(); cmd = cmd.join(" "); mc_bot.chat(cmd); return; } if(message.startsWith("rena take me home")){ mc_bot.chat("/tp " + username + " rena_chan"); mc_bot.chat("I will take you home! <3"); } }); mc_bot.on("end", function(){ mc_logged_in = false; console.log("Minecraft: Kicked from server"); setTimeout(mc_login, 10000); // reconnect after 10 seconds }); mc_bot.on("error", function(){ console.log("Minecraft: error occured"); }); mc_bot.on("playerJoined", function(player){ send(1, ">" + player.username + " has joined deekcraft"); }) mc_bot.on("playerLeft", function(player){ send(1, ">" + player.username + " has left deekcraft"); }) } mc_login(); function mc_escape(str){ return str.replace( /[^-!\"#$%&'()*+,.\/0123456789:;<=>?@[\\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«» ]/gi, "" ).replace(/[\\"']/g, '\\$&') .replace(/\u0000/g, '\\0') .replace("\n", " "); } /* IRC bridge */ var irc_logged_in = false; var irc_debounce = false; var irc_client = null; function init_irc(){ if(irc_bridge_enabled === false){ return; } irc_client = new irc.Client( irc_ip, "rena_chan", { channels: [ "#deekchat" ], userName: "rena_chan", realName: "Rena Chan", autoRejoin: false, retryCount: 0 } ); irc_client.addListener("join#deekchat", function(){ console.log("Connected to IRC server on #deekchat"); irc_logged_in = true; irc_client.say("NickServ", "IDENTIFY rena_chan " + irc_password); irc_client.send("OPER", "rena_chan", irc_password); // add debounce so we dont send missed messages setTimeout(function(){ irc_debounce = true; }, 2500); }); irc_client.addListener("message", function(from, to, message){ if(irc_debounce === false){ return; } if(typeof from == "undefined"){ return; } switch(to){ case "#deekchat": send(1, "<" + from + "> " + message); deek.emit( "message", { text: message, id: -1, files: [], mentions: [], replies: [], channel: 1 }, { name: from, id: -1, picture: null } ); break; } }); irc_client.addListener("error", function(message){ console.log("IRC error"); console.log(message); irc_logged_in = false; irc_debounce = false; //irc_client.disconnect(); setTimeout(function(){ init_irc(); }, 2000); }); } init_irc(); /* User defined FUN-ctions!!! */ async function fetch_xeno(recording, index, msg){ index--; var filereq = await fetch( recording[index].file, {headers: img_headers} ); var file = await filereq.buffer(); send( msg, "Page " + (index + 1) + "/" + recording.length + "\n" + ">" + recording[index].en + " in " + recording[index].cnt + " (" + recording[index].loc + ")\n" + recording[index].rmk, file, [ "audio/mpeg", "mp3" ] ); } deek.on("login", function(channel){ console.log("Connected to websocket xoxo"); }); 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( mc_bridge_enabled && mc_logged_in && msg.channel === 1 ){ // ascii filter var mc_message = msg.text.replace( /[^-\n!\"#$%&'()*+,.\/0123456789:;<=>?@[\\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«» ]/gi, "?" ); var mc_username = mc_escape(user.name); mc_message.split("\n").forEach(function(a){ // split message into newlines // make sure message gets sent in chunks for(var i=0; i ' + mc_escape(a.slice(i, i + 100)).trim() + '"]'); }else{ mc_bot.chat('/tellraw @a "' + mc_escape(a.slice(i, i + 100)) + '"'); } } }); } if( irc_bridge_enabled && irc_logged_in && msg.channel === 1 && msg.id !== -1 ){ var irc_username = user.name.replace(/[^A-Za-z0-9-_]/g, "-"); var limit = 412 - ("RELAYMSG #deekchat " + irc_username + "/Dek").length; msg.text.split("\n").forEach(function(a){ for(var i=0; i]+/)){ link = link[0]; var download = null; var mimetype = null; try{ if(tweet = link.match(/https?:\/\/(?:www\.)?(?:twitter|x)\.com\/[A-Za-z0-9_]+\/status\/([0-9]+)/i)){ // // twitter embed // tweet = tweet[1]; var res = await fetch("https://cdn.syndication.twimg.com/tweet-result?id=" + tweet + "&token=5"); var json = await res.json(); var title = json.user.name + " (@" + json.user.screen_name + ") " + " on twatter"; var description = "❤️ " + json.favorite_count + " • 💬 " + json.conversation_count + " • 📅 " + json.created_at + "\n" + json.text + " ‎ "; if(typeof json.video == "object"){ download = json.video.variants[json.video.variants.length - 1].src; mimetype = ["video/mp4", "mp4", true]; }else if(typeof json.photos[0].url == "string"){ download = json.photos[0].url; mimetype = ["image/jpeg", "jpeg", true]; } }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 if(bsky = link.match(/https?:\/\/bsky\.app\/profile\/([^\/]+)\/post\/([^?]+)/)){ var bsky_profile = bsky[1]; var bsky_post = bsky[2]; if(!bsky_profile.match(/^did:plc:/)){ // resolve handle var handle = await(fetch("https://public.api.bsky.app/xrpc/com.atproto.identity.resolveHandle?handle=" + bsky_profile)); var handle_json = await handle.json(); bsky_profile = handle_json.did; } var res = await( fetch( "https://public.api.bsky.app/xrpc/app.bsky.feed.getPostThread" + "?uri=" + encodeURIComponent("at://" + bsky_profile + "/app.bsky.feed.post/" + bsky_post) + //"?uri=at%3A%2F%2Fdid%3Aplc%3Aknkltoiapkt336rr335ztt3p%2Fapp.bsky.feed.post%2F3l3gymllsto2z" + "&depth=0" + "&parentHeight=0" ) ); var json = await res.json(); var title = json.thread.post.author.displayName + " (@" + json.thread.post.author.handle + ") " + " on blueskeet"; var description = "❤️ " + json.thread.post.likeCount + " • 💬 " + json.thread.post.replyCount + " • 📅 " + json.thread.post.indexedAt + "\n" + json.thread.post.record.text + " ‎ "; if( typeof json.thread.post.embed == "object" && typeof json.thread.post.embed.images == "object" && typeof json.thread.post.embed.images[0] == "object" && typeof json.thread.post.embed.images[0].fullsize == "string" ){ // found image download = json.thread.post.embed.images[0].fullsize; mimetype = ["image/jpeg", "jpeg", true]; } else if( typeof json.thread.post.embed == "object" && typeof json.thread.post.embed.thumbnail == "string" ){ // no video support, fuck you bsky for not giving me mp4 files download = json.thread.post.embed.thumbnail; mimetype = ["image/jpeg", "jpeg", true]; } }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_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"); } if(tag_title.length !== 0){ title = tag_title.text(); } // 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; try{ var res = await fetch(instance + "/api/v1/images?s=" + encodeURIComponent(value) + "&nsfw=" + (ddg_mod ? "no" : "yes") + "&scraper=" + scraper); 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.image.length === 0){ send(msg, "No results found for " + value + "!!"); break; } }catch(error){ send(msg, "4get returned invalid response!!!!!! piece of fuckgin shit!!!11!111"); break; } results_cache = res_get.image; is_pp_xeno = false; await serveddg(msg, res_get.image, 1); break; case "scraper": switch(value.toLowerCase()){ case "ddg": case "yandex": case "brave": case "google": case "google_cse": case "startpage": case "qwant": case "yep": case "solofield": case "imgur": case "ftm": scraper = value.toLowerCase(); send(msg, "Scraper set to " + scraper + "!!"); break; default: send(msg, ">Current scraper: " + scraper +"\nChoices are: ddg, yandex, brave, google, google_cse, startpage, qwant, yep, solofield, imgur, ftm"); break; } 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(results_cache.length === 0){ send(msg, "Search buffer doesn't contain any links you horse fucker!!"); return; } if( value > results_cache.length || value <= 0 ){ send(msg, "Page offset must be between 1 and " + results_cache.length + " you dumbass!!"); return; } global_page = value; if(is_pp_xeno){ await fetch_xeno(results_cache, value, msg); break; } await serveddg(msg, results_cache, value); break; case "pp": global_page++; if(global_page > results_cache.length){ send(msg, "You reached the end of results stupid kike sucker!!"); return; } if(is_pp_xeno){ await fetch_xeno(results_cache, global_page, msg); break; } await serveddg(msg, results_cache, global_page); break; case "youtube": case "jewtube": case "yt": if(value.trim() == ""){ send(msg, "You need to search for something cum licker!!!"); break; } try{ var res = await fetch(instance + "/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; } }catch(error){ send(msg, "4get returned invalid response!!!!!! piece of fuckgin shit!!!11!111"); } 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": case "xeno-canto": 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; } global_page = 1; is_pp_xeno = true; results_cache = res_get.recordings; await fetch_xeno(res_get.recordings, 1, msg); break; case "fortune": case "f": send(msg, fortunes[Math.floor(Math.random() * fortunes.length)]); break; case "list": case "l": if(mc_bridge_enabled === false){ send(msg, "Deekcraft bridge is disabled"); break; } if(mc_logged_in === false){ send(msg, "Deekcraft is offline"); break; } send( msg, ">Players online on deekcraft:\n" + (Object.keys(mc_bot.players).filter(player => mc_bot.players[player].ping !== undefined)) .join("\n") ); 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" + ".fortune/.f => fortune teller cause cynic cant code :trol:\n" + ".yt/.youtube => search the jewish propaganda catalog\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" + ".list => players online on deekcraft\n" + ".ping => spam deekchat" ); break; } }); deek.on("close", function(channel){ console.log("It's over. Disconnected from websocket. Attempting reconnection in 10 seconds"); fs.utimesSync(__filename, Date.now(), Date.now()); }); deek.on("error", function(message){ console.error("Serber error: " + message + ". Attempting reconnection in 10 seconds"); fs.utimesSync(__filename, Date.now(), Date.now()); }); // connect to serber handshake(name, password);