thelounge/client/js/chat.js

165 lines
3.2 KiB
JavaScript
Raw Normal View History

2014-03-06 15:11:25 +00:00
$(function() {
2014-04-19 21:40:36 +00:00
var chat = $("#chat");
var sidebar = $("#sidebar");
2014-04-07 21:19:20 +00:00
var commands = [
"/connect",
"/deop",
"/devoice",
"/disconnect",
"/join",
"/kick",
"/leave",
"/mode",
"/msg",
2014-04-07 21:19:20 +00:00
"/nick",
"/op",
"/part",
"/query",
"/quit",
"/server",
"/topic",
"/voice",
"/whois",
];
2014-03-06 15:11:25 +00:00
var socket = io.connect("");
var events = [
"join",
"msg",
"networks",
"nick",
"part",
"users",
].forEach(function(e) {
socket.on(e, function(data) {
event(e, data);
2014-03-12 13:10:53 +00:00
});
2014-03-07 03:18:53 +00:00
});
2014-04-08 14:18:06 +00:00
2014-03-19 17:30:06 +00:00
var tpl = [];
2014-05-02 17:46:18 +00:00
function render(name, data) {
tpl[name] = tpl[name] || Handlebars.compile($("#templates ." + name).html());
return tpl[name](data);
2014-03-19 17:30:06 +00:00
}
2014-03-22 23:42:07 +00:00
function event(e, data) {
switch (e) {
case "join":
2014-05-02 17:46:18 +00:00
chat.append(render("windows", {windows: [data.chan]}))
.find(".messages")
.last()
2014-05-02 17:46:18 +00:00
.scrollGlue({speed: 200})
.end()
.find(".input")
2014-04-28 18:05:19 +00:00
.tabComplete({list: commands})
2014-04-07 21:19:20 +00:00
.end();
2014-05-02 17:46:18 +00:00
2014-04-26 15:26:30 +00:00
$("#network-" + data.id)
2014-05-02 17:46:18 +00:00
.append(render("channels", {channels: [data.chan]}))
2014-04-26 15:26:30 +00:00
.find(".channel")
2014-03-18 23:08:11 +00:00
.last()
2014-05-02 17:46:18 +00:00
.trigger("click")
.end();
break;
case "msg":
2014-04-26 15:26:30 +00:00
$("#window-" + data.id)
.find(".messages")
2014-05-02 17:46:18 +00:00
.append(render("messages", {messages: [data.msg]}));
break;
case "networks":
2014-04-26 15:26:30 +00:00
var channels = $.map(data.networks, function(n) { return n.channels; });
2014-05-02 17:46:18 +00:00
chat.html(render("windows", {windows: channels}))
.find(".input")
2014-04-28 18:05:19 +00:00
.tabComplete({list: commands})
2014-04-07 21:19:20 +00:00
.end()
2014-04-26 15:26:30 +00:00
.find(".hidden")
.prev(".show-more")
2014-04-28 18:05:19 +00:00
.show();
2014-04-30 00:00:27 +00:00
chat.find(".messages")
2014-05-02 17:46:18 +00:00
.scrollGlue({speed: 200})
2014-04-30 00:00:27 +00:00
.end();
2014-04-26 15:26:30 +00:00
2014-05-02 17:46:18 +00:00
$("#networks")
.html(render("networks", {networks: data.networks}))
2014-04-26 15:26:30 +00:00
.find(".channel")
.last()
.addClass("active")
2014-04-07 21:19:20 +00:00
.end();
2014-03-17 16:24:32 +00:00
break;
case "part":
2014-04-26 15:26:30 +00:00
$("#channel-" + data.id)
.add("#window-" + data.id)
.remove();
break;
case "users":
2014-04-26 15:26:30 +00:00
$("#window-" + data.id)
.find(".users")
2014-05-02 17:46:18 +00:00
.html(render("users", {users: data.users}))
2014-04-28 18:05:19 +00:00
.end();
2014-03-12 13:10:53 +00:00
break;
}
2014-03-07 03:18:53 +00:00
}
2014-05-02 17:46:18 +00:00
var z = 1;
sidebar.on("click", "button", function() {
var button = $(this);
var target = button.data("target");
sidebar.find(".active").removeClass("active");
button.addClass("active")
$(target)
.css({"z-index": z++})
.find(".input")
.focus()
.end();
2014-03-06 15:11:25 +00:00
});
2014-05-02 17:46:18 +00:00
chat.on("click", ".show-more .btn", function() {
var target = $(this).parent();
var html = $.parseHTML(target.next(".hidden").remove().html());
target.replaceWith(html);
});
2014-04-23 22:03:35 +00:00
chat.on("click", ".user", function() {
var user = $(this);
2014-05-02 17:46:18 +00:00
var id = user.closest(".window").find(".form").data("target");
var name = user.html().replace(/[\s+@]/g, "");
2014-04-10 21:34:53 +00:00
if (name == "-!-" || name.indexOf(".") != -1) {
return;
}
2014-05-02 17:46:18 +00:00
console.log({id: id, text: "/whois " + name});
2014-04-09 20:54:04 +00:00
socket.emit("input", {
id: id,
text: "/whois " + name,
2014-04-09 20:54:04 +00:00
});
2014-03-31 22:02:28 +00:00
});
2014-04-23 22:03:35 +00:00
2014-05-02 17:46:18 +00:00
chat.on("submit", "form", function() {
var form = $(this);
var input = form.find(".input");
var text = input.val();
if (text == "") {
return;
}
input.val("");
2014-04-23 22:03:35 +00:00
socket.emit("input", {
2014-05-02 17:46:18 +00:00
id: form.data("target"),
text: text,
2014-04-23 22:03:35 +00:00
});
});
2014-04-26 15:26:30 +00:00
2014-05-02 17:46:18 +00:00
chat.on("focus", ".input", function() {
var input = $(this).parents().eq(1).find(".messages").scrollToBottom();
2014-04-06 20:53:07 +00:00
});
2014-05-02 17:46:18 +00:00
Handlebars.registerHelper(
"partial", function(id) {
2014-04-21 10:27:43 +00:00
return new Handlebars.SafeString(render(id, this));
2014-05-02 17:46:18 +00:00
}
);
2014-03-22 23:42:07 +00:00
});