diff options
Diffstat (limited to 'index.js')
-rw-r--r-- | index.js | 200 |
1 files changed, 190 insertions, 10 deletions
@@ -1,10 +1,69 @@ -$(document).ready(function(){ +var linkify = require("linkifyjs"); +var linkifyHtml = require('linkifyjs/html'); +var shell = require('electron').shell; + +$(document).ready(function() { + $("#send-message").focus(); +}); + +$(document).on('click', 'a[href^="http"]', function(event) { + event.preventDefault(); + shell.openExternal(this.href); }); +function imagify(url, channel) { + console.log(url); + $.ajax({ + type: 'HEAD', + url: url, + complete: function(xhr) { + var type = xhr.getResponseHeader('Content-Type') + var size = xhr.getResponseHeader('Content-Length'); + console.log(type); + console.log(size); + if (size < 10000000) { + $("[data-img='"+url+"']").append("("+humanize(size)+")"); + $("[data-img='"+url+"']").append("<p class='chat-line'><img src="+url+" onload=scrollToTop('"+channel+"')></p>"); + $("[data-img='"+url+"']").removeClass("loading"); + + } + + } + }); + + return "<div data-img='"+url+"' class='ui image loading'></div>"; + +} + +function humanize(size) { + var units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB']; + var ord = Math.floor(Math.log(size) / Math.log(1000)); + var s = Math.round((size / Math.pow(1000, ord)) * 100) / 100; + return s + ' ' + units[ord]; +} + +var numChans = 1; $("#send-message").keypress(function(e) { if(e.which == 13) { - var channel = $(".tab.chat.active").attr("data-tab").replace("chan-", "#") - sendMsg($("#send-message").val(), channel) + var message = $("#send-message").val(); + var channel = $(".tab.active").attr("data-tab").replace("chan-", "#") + if (message.indexOf("/join") == 0) { + joinChannel(message.substring(6, message.length)); + } else if (message.indexOf("/part") == 0) { + if (message.length > 6) { + channel = message.substring(6, message.length) + } + console.log() + partChannel(channel); + } else { + var tab = $(".tab.active").attr("data-tab") + if (tab.startsWith("chan-")) { + sendMsg(message, channel.replace("#","")) + + } else if(tab.startsWith("pm-")){ + sendPm(message, tab.substring(3, tab.length)); + } + } $("#send-message").val(''); } }); @@ -17,25 +76,79 @@ function sendMsg(message, channel) { chanTab.scrollTop(chanTab.prop("scrollHeight")); } +function sendPm(message, nick) { + console.log(nick + ': ' + message); + client.say(nick, message); + var chanTab = $("[data-tab=pm-"+nick+"].chat"); + chanTab.append("<p class='chat-line'><" + "wclient" + "> " + message +"</p>"); + chanTab.scrollTop(chanTab.prop("scrollHeight")); +} + function joinChannel(channel) { client.join(channel); channel = channel.replace("#",""); - + chanId = $(".active.chat").attr("data-id") $(".active").removeClass("active"); - $(".ui.menu").append("<a class='active item' data-tab='chan-"+channel+"'>#"+channel+"</a>"); + $(".ui.menu").append("<a class='active item' data-id='"+numChans+"' data-tab='chan-"+channel+"'>#"+channel+"</a>"); + $("#chan-container").append("<div class='ui active tab' data-id='"+numChans+"' data-tab='chan-"+channel+"'></div>"); + var chanTab = $("[data-tab=chan-"+ channel +"].tab"); - $("#chan-container").append("<div class='ui active tab segment chat active' id='chan-"+channel+"' data-tab='chan-"+channel+"'></div>") + chanTab.append("<div class='ui selection list users' data-id='"+numChans+"' data-tab='chan-"+channel+"'></div>"); + chanTab.append("<div class='ui segment chat' data-id='"+numChans+"' data-tab='chan-"+channel+"'></div>"); $('.menu .item').tab({history:false}); - var chanTab = $("[data-tab=chan-"+ channel +"].chat"); + + client.addListener('message#'+channel, function (from, message) { + // message = message.autoLink( { + // callback: function(url) { + // return /\.(gif|png|jpe?g)$/i.test(url) ? '<img src="' + url + '">' : null; + // }, + // target: "_blank" + // }); + // console.log(message.autoLink()); console.log(from + ' => #'+ channel +': ' + message); - console.log(chanTab); - chanTab.append("<p class='chat-line'><" + from + "> " + message +"</p>"); - chanTab.scrollTop(chanTab.prop("scrollHeight")); + var chatTab = $("[data-tab=chan-"+ channel +"].chat"); + message = linkifyHtml(message); + + chatTab.append("<p class='chat-line'><" + from + "> " + message +"</p>"); + var imgMatch = message.match(/[a-z0-9\-]+[\.:]\S+\.(gif|png|jpe?g|bmp)/); + var vidMatch = message.match(/[a-z0-9\-]+[\.:]\S+\.(webm|mp4)/); + var audioMatch = message.match(/[a-z0-9\-]+[\.:]\S+\.(mp3|wav|ogg)/); + var youtubeMatch = message.match(/(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.be)\/(watch\?v=)?[a-z0-9A-Z_\-]+/); + if (imgMatch != null && imgMatch.length > 0) { + var image = imagify(imgMatch[0],channel); + chatTab.append("<p class=chat-line>"+image+"</p>"); + } + if (vidMatch != null && vidMatch.length > 0) { + chatTab.append("<p class=chat-line><video controls><source src="+vidMatch[0]+"></video></p>"); + } + if (audioMatch != null && audioMatch.length > 0) { + chatTab.append("<p class=chat-line><audio controls><source src="+audioMatch[0]+"></audio></p>"); + } + if (youtubeMatch != null && youtubeMatch.length > 0) { + console.log(youtubeMatch) + youtubeParts = youtubeMatch[0].split("/"); + youtubeId = youtubeParts[youtubeParts.length-1]; + youtubeId = youtubeId.replace("watch?v=",""); + chatTab.append("<p class=chat-line><iframe width='480' height='270' src='https://www.youtube.com/embed/"+youtubeId+"' frameborder='0' allowfullscreen></iframe></p>"); + } + + chatTab.scrollTop(chatTab.prop("scrollHeight")); }); + numChans++; } +function partChannel(channel) { + channel = channel.replace("#",""); + chanId = $("[data-tab=chan-"+channel+"].chat").attr("data-id"); + $("[data-tab=chan-"+channel+"]").remove(); + client.part("#"+channel); + while ($("[data-id="+(chanId-1)+"]").length == 0 && chanId >=0) { + chanId--; + } + $("[data-id="+(chanId-1)+"]").addClass("active"); +} const irc = require('irc'); @@ -55,7 +168,74 @@ client.addListener('registered', function() { }); }); +client.addListener('motd', function(motd) { + var statusTab = $("[data-tab=status].chat"); + statusTab.append("<p class='chat-line'>"+motd+"</p>") +}); + +client.addListener('raw', function(message) { + var statusTab = $("[data-tab=status].chat"); + statusTab.append("<p class='chat-line'>"+message.command+message.args+"</p>") + statusTab.scrollTop(statusTab.prop("scrollHeight")); +}); + +client.addListener('ctcp-version', function(from, to, text, message) { + client.ctcp(from, "VERSION", "VERSION blachat v0.1.0") +}); + + +client.addListener('names', function(channel, nicks) { + for(nick in nicks) { + var mode = nicks[nick]; + channel = channel.replace("#","") + if($(".ui.users[data-tab=chan-"+channel+"] [data-nick="+nick+"]").length == 0) { + $(".ui.users[data-tab=chan-"+channel+"]").append("<div class=item data-nick="+nick+">"+mode+nick+"</div>") + } + } +}); +- +client.addListener('join', function(channel, nick) { + channel = channel.replace("#","") + if($(".ui.users[data-tab=chan-"+channel+"] [data-nick="+nick+"]").length == 0) { + $(".ui.users[data-tab=chan-"+channel+"]").append("<div class=item data-nick="+nick+">"+nick+"</div>") + } + var chatTab = $("[data-tab=chan-"+ channel +"].chat"); + chatTab.append("<p class='chat-line'>"+nick+" joined #"+channel+"</p>") +}); + +client.addListener('part', function(channel, nick) { + channel = channel.replace("#","") + if($(".ui.users[data-tab=chan-"+channel+"] [data-nick="+nick+"]").length > 0) { + $(".ui.users[data-tab=chan-"+channel+"] [data-nick="+nick+"]").remove(); + } + var chatTab = $("[data-tab=chan-"+ channel +"].chat"); + chatTab.append("<p class='chat-line'>"+nick+" left #"+channel+"</p>") +}); + +client.addListener('quit', function(nick, reason, channels, message) { + channels.forEach(function(channel) { + channel = channel.replace("#","") + if($(".ui.users[data-tab=chan-"+channel+"] [data-nick="+nick+"]").length > 0) { + $(".ui.users[data-tab=chan-"+channel+"] [data-nick="+nick+"]").remove(); + } + var chatTab = $("[data-tab=chan-"+ channel +"].chat"); + chatTab.append("<p class='chat-line'>"+nick+" quit ("+reason+")</p>") + }); +}); + +client.addListener('pm', function(nick, text, message) { + if($(".ui.tab[data-tab=pm-"+nick+"]").length == 0) { + $(".ui.menu").append("<a class='item' data-id='"+numChans+"' data-tab='pm-"+nick+"'>"+nick+"</a>"); + $("#chan-container").append("<div class='ui tab' data-id='"+numChans+"' data-tab='pm-"+nick+"'></div>"); + var chanTab = $("[data-tab=pm-"+ nick +"].tab"); + chanTab.append("<div class='ui segment chat' data-id='"+numChans+"' data-tab='pm-"+nick+"'></div>"); + numChans++; + $('.menu .item').tab({history:false}); + } + var chatTab = $("[data-tab=pm-"+ nick +"].chat"); + chatTab.append("<p class='chat-line'><"+nick+"> "+text+"</p>") +}); // client.addListener('message#wtest', function (from, message) { // console.log(from + ' => #wtest: ' + message); |