const blessed = require("neo-blessed"); var screen = blessed.screen({ smartCSR: true }); screen.key(['escape', 'C-c'], function(ch, key) { return process.exit(0); }); var screen_msg = blessed.message({ parent:screen, top:'center', left:'center', height:'shrink', width:'shrink', align:'center', tags:true, hidden:true, border:'line' }); const fs = require("fs"); // Read config var config_file = fs.readFileSync("./settings.conf", "utf8"); config_file = config_file.split("\n"); config = {}; for(i=0; i/g, "{light-gray-fg}:$1:{/light-gray-fg}" ) .replace( /<[^>]+>/ig, "" ) ); return html; } /* Websocket functions */ async function send(channel, text/*, file = null, forcemime = null*/){ 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(){ /* Get cookie */ screen_msg.display("{light-gray-fg}Logging in as {bold}" + config.username + "{/bold}...{/light-gray-fg}"); const form = new formdata(); form.append("name", config.username); form.append("password", config.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){ deek.emit("error", "Could not connect to Deekchat"); 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 || session_id === null ){ deek.emit("error", "Could not get api_token or session_id!!"); return; } headers.Cookie = "session_id=" + session_id[1] + "; api_token=" + api_token[1] + "; lastMessageTimestamps={}"; /* Scrape channel list */ var subscribed = await fetch( "https://deek.chat/rooms/fetch/subscribed", { method: "GET", headers: headers } ); var res = await subscribed.buffer(); res = JSON.parse(res.toString("utf8")); shittierloop: for(var i=0; i{/red-fg}{/bold} " + msg.text.trim() .replace( /^>[^>].*/gm, function(match){ return "{light-green-fg}" + match + "{/light-green-fg}" } ) .replace( /^<[^<].*/gm, function(match){ return "{light-red-fg}" + match + "{/light-red-fg}" } ) + filetext; messagelist.setContent(textbuffer); if(render){ messagelist.setScrollPerc(100); screen.render(); } } deek.on("login", function(channel){ messagelist = blessed.box({ parent: screen, label: '{bold}{cyan-fg}#' + channel.name + '{/cyan-fg}{/bold}', tags: true, border: 'line', width: "100%", top: 0, left: 0, bottom: 1, scrollable: true, scrollbar: { ch:'', track: { bg: 'cyan' }, style: { inverse:true } } }); var input = blessed.textarea({ parent:screen, bottom:0, height:1, inputOnFocus:true }); /* Append messages to list */ for(var i=0; i {bold}/help{/bold}\n{light-gray-fg} * Client side commands:\n * /help\n * /list\n * /exit{/light-gray-fg}"); check = true; break; case "/list": var users = ""; for(var i=0; i {bold}/list{/bold}\n{light-gray-fg} * There are " + i + " deekers online:\n * " + users + "{/light-gray-fg}"); check = true; break; case "/exit": process.exit(0); break; } } if(check === false){ send(channel.id, sendmessage); } this.clearValue(); messagelist.setScrollPerc(100); screen.render(); }); }); deek.on("enter", async function(user){ //messagelist.pushLine("{light-gray-fg} * {bold}" + blessed.escape(user.name) + "{/bold} from " + user.country.name + " has joined{/light-gray-fg}"); messagelist.setScrollPerc(100); screen.render(); }); deek.on("exit", async function(user){ //messagelist.pushLine("{light-gray-fg} * {bold}" + blessed.escape(user.name) + "{/bold} has left{/light-gray-fg}"); messagelist.setScrollPerc(100); screen.render(); }); deek.on("message", async function(msg, user){ appendmessage(msg, user); }); deek.on("close", async function(channel){ //messagelist.pushLine("{light-red-fg}It's over. Disconnected from channel " + channel.name + " (id:" + channel.id + "){/light-red-fg}"); messagelist.setScrollPerc(100); screen.render(); }); deek.on("error", async function(message){ screen_msg.display("{light-red-fg}{bold}Serber error{/bold}\n" + message + ".\nUse CTRL+C to exit{/light-red-fg}"); screen.render(); }); // connect to serber handshake();