Light12306/Web12306/js/ui/chat/roomsession.js
2014-12-16 23:31:53 +08:00

384 lines
13 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

define(function (require, exports, module) {
var EventObject = require("../../platform/EventObject.js");
var ep = require("../../platform/extensionPort.js");
var port = ep.port;
var mp = require("../widget_message_popup.js");
var sessMgr = require("../../account/sessionMgr.js");
var param = require("../../data.js");
var page = $("#chat_container");
var user = sessMgr.current;
var utility = require("../../utility.js");
sessMgr.on("sessionChanged", function () {
user = sessMgr.current;
});
var checkIllegal = function (str) {
if (_.some([
[/1[\d\s]{10}/i],
[/求/, /联系/, /\d+/],
[/[三3③叁].*?[六陆⑥6].*?[0零oO]/],
[/[求]/, /黄.*?牛/],
[/联.*?系.*?我/],
[/[\d①②③④⑤⑥⑦⑧⑨零一二三四五六七八九\s]{7,}/]
], function (array) {
return _.all(array, function (exp) { return exp.test(str); });
}))
return "为保护您的隐私以及正常的秩序,请勿泄露您的个人隐私以及禁止出现的信息。";
if (_.some([
[/[求转购].*?\d+\s*张/]
], function(array) {
return _.all(array, function(exp) { return exp.test(str); });
}))
return "很抱歉,本平台谢绝任何加价代购、倒卖、求购类信息。";
return null;
};
var RoomSession = function () {
EventObject.apply(this);
var that = this;
var room;
var chatListContainer = page.find("article.chat-items");
var chatListContainerDom = chatListContainer[0];
var roomStateTemplate = $("#chat_connect_server").doT();
var roomSystemNoticeTemplate = $("#chat_sys_alert").doT();
var chatMsgItem = $("#chat_msg_item").doT();
//init pic send.
var fileReader = new FileReader();
fileReader.onload = function (fe) {
that.sendMsg({
color: user.options.chatColor,
text: "[贴图]",
target: []
}, [
{
type: "image",
data: fe.target.result
}]);
};
this.sendPic = function (file) {
if (!/^image\//i.test(file.type) || file.size > 100 * 1024) {
mp.showMessagePopup("error", "只能发送小于100K的图片哦");
return;
}
fileReader.readAsDataURL(file);
};
this.clearConnectingState = function () {
chatListContainer.find(".chat-state").remove();
};
this.enterRoom = function (targetRoom) {
if (targetRoom === room)
return;
room = targetRoom;
//UI
$("#chat_frame>section").removeClass("chat-page-current");
page.addClass("chat-page-current");
page.find(">header>span:eq(0)").html(room.name);
chatListContainer.empty();
that.refreshOnlineCount();
page.find("button.button-primary").prop("disabled", true);
that.fireEvent("enterRoom");
if (!room.url) {
that.appendMessageItem(roomStateTemplate({ state: "connecting", stateIcon: "fa-spin fa-spinner", msg: "正在获得房间地址..." }));
$.post(param.chatServerGetAddressApi, { roomId: room.id }, "json").done(function (result) {
if (!result.url) {
that.clearConnectingState();
that.appendMessageItem(roomStateTemplate({ state: "disconnect", stateIcon: "fa-times", msg: "无法进入房间,请重试。", exinfo: "<a href='javascript:;' class='chat-frame-reconnect'>重新连接</a>" }));
that.exitRoom();
mp.showMessagePopup("error", "无法进入房间,请稍后重试。");
} else {
room.url = result.url;
room.heartbeat = result.heartbeat;
that.clearConnectingState();
port.postMessage("enterChatRoom", room);
}
}).fail(function () {
that.clearConnectingState();
that.appendMessageItem(roomStateTemplate({ state: "disconnect", stateIcon: "fa-times", msg: "无法进入房间,请重试。", exinfo: "<a href='javascript:;' class='chat-frame-reconnect'>重新连接</a>" }));
that.exitRoom();
mp.showMessagePopup("error", "无法进入房间,请稍后重试。");
});
} else {
port.postMessage("enterChatRoom", room);
}
ep.track(param.trackTypes.JOIN_CHAT);
};
this.refreshOnlineCount = function () {
page.find(">header>span:eq(1)").html("当前在线 " + room.onlinecount + " 人");
page.find(".chat-online-count").html(room.onlinecount);
};
this.exitRoom = function () {
room = null;
port.postMessage("disconnectChatRoom");
that.fireEvent("exitRoom");
ep.track(param.trackTypes.EXIT_CHAT);
};
this.appendMessageItem = function (html) {
chatListContainer.append(html);
if (sessMgr.current.options.autoScroll !== 0)
chatListContainerDom.scrollTop = chatListContainerDom.scrollHeight;
};
this.clearDisplay = function () {
chatListContainer.empty();
};
this.sendMsg = function (msg, media) {
var errormsg = checkIllegal(msg.text);
if (errormsg) {
alert(errormsg);
return;
}
var data = {
items: [msg],
media: media || [],
from: {
realname: user.dispname,
username: user.username
},
target: msg.target || [],
time: new Date().getTime()
}
port.postMessage("chatRoomSendMsg", data);
};
this.reconnect = function () {
if (!room)
return;
port.postMessage("enterChatRoom", room);
};
Object.defineProperty(this, "room", {
get: function () {
return room;
}
});
port.on("chatRoomConnecting", function () {
that.appendMessageItem(roomStateTemplate({ state: "connecting", stateIcon: "fa-spin fa-spinner", msg: "正在连接服务器中..." }));
that.fireEvent("chatRoomConnecting");
});
port.on("chatRoomConnected", function () {
page.find("button.button-primary").prop("disabled", false);
that.clearConnectingState();
that.appendMessageItem(roomSystemNoticeTemplate(room));
that.fireEvent("chatRoomConnected");
});
port.on("chatRoomReceiveMsg", function (e, data) {
that.fireEvent("chatRoomReceiveMsg");
//check
if (data.media) {
if (_.some(data.media, function (m) {
if (m.type === "image")
return !/^data:image\/[^;]+;\s*base64,.*/i.test(m.data);
return true;
}))
return;
}
if (data.time) {
data.time = new Date(data.time);
data.timeStr = utility.formatDate(data.time, "hh:mm:ss");
}
data.self = data.from.username == sessMgr.current.username;
//咩哈哈哈哈
if (data.from.username === "iccfish" || data.from.username === "imfish") {
data.from.realname = "木魚";
data.from.exStyle = "font-weight:bold;";
}
data.sys = data.from.username || false;
data.tome = false;
if (data.target && data.target.length) {
var selfTarget = _.findWhere(data.target, { username: sessMgr.current.username });
if (selfTarget) {
data.tome = true;
selfTarget.username = null;
selfTarget.realname = "我";
}
}
that.appendMessageItem(chatMsgItem(data));
});
port.on("chatRoomDisconnected", function () {
that.clearConnectingState();
that.appendMessageItem(roomStateTemplate({ state: "disconnect", stateIcon: "fa-times", msg: "服务器已断开连接。", exinfo: "<a href='javascript:;' class='chat-frame-reconnect'>重新连接</a>" }));
that.fireEvent("chatRoomDisconnected");
page.find("button.button-primary").prop("disabled", true);
});
port.on("chatUpdateOnline", function (e, d) {
if (!room)
return;
room.onlinecount = d.count;
//更新显示
that.refreshOnlineCount();
//更新显示
$("#chat_server_select li[data-id='" + room.id + "'] span").html("(" + d.count + "人)");
});
port.on("sendMessageFailed", function (e, data) {
that.appendMessageItem(roomStateTemplate({ state: "error", stateIcon: "fa-times", msg: "消息发送失败:" + data, exinfo: "" }));
});
return this;
};
RoomSession.prototype = Object.create(EventObject);
RoomSession.constructor = RoomSession;
var session = new RoomSession();
(function chatEditor() {
var editor = page.find("section.chat-editor");
var sendBtn = editor.find(">footer>button.button-primary");
var editorArea = editor.find(".chat-editor-container");
var specChars = "(^.^)\n(;_;)\n(¬_¬)\n(u_u)\n♪(´ε`)\n♪(´▽`)\n*_*\n⊙⊙!\n(ーー;)\n(-_-)zz\n↖(^ω^)↗\n囧rz\n^_^\n`(*∩_∩*)\n ̄□ ̄\nO(∩_∩)O\n*^_^* \n^_^#\n(☆_☆)/~~\n→_→ \n( o )~zZ\n(^ω^) \n(ˇ^ˇ)\no(>_<)o ~~\n>_<#\n⊙▂⊙\n╰_╯\n`(*><*)\n(⊙o⊙)\no(╯□╰)o\n::>_<:: \n=_=\nT_T\no(>_<)o ~~\n(#)凸\n:-x\n{{{(>_< )}}} \n(╯-╰)/ \nY(^o^)Y~\nY(^o^)Y~\n($ _ $)\no(︶︿︶)o\n⊙△⊙\n~~~^o^~~~\n╮(╯_╰)╭\n^_^#\n`(*∩_∩*)\n(⊙_⊙;)\n>_<||| \n@_@\n(⊙⊙?)\n^_~ \n(ˉ(∞)ˉ) \n^(oo)^ \n(◦ \"̮ ◦)\nヽミ ´∀`ミノ< \nヽ゚Д゚丿\nヽ(●´ε`●) \nヽ(≧Д≦)\nヽ(^0^)\nヾ(@^▽^@) \nヽ(*´∀`)\nヾ ^_^♪\n━(゚∀゚)━!\n(^▽^)コ祝贺你\nლ(╹ε╹ლ) \nლ(╹◡╹ლ)\nლ(^o^ლ) \nΣ(゚д゚lll)\nΣ(゚д゚;)\nΣ(TωT)努力--\nσ(´┰`=)\nε=┌(;・∀・)┘\nε=(・д・`*)ハァ…\nY(・∀・)Y 蟹\nY(>_<、)Y\nw(^_ン\n=0=\nT(;_;)T\np(^^)q\no(TヘTo)\noo\nm(-_-m) \nm(__)m\n♪(´ε` )\n☆彡\n☆ミ\n☆⌒(>。≪)\n☆⌒(*-゜)v\n≡(  ´Д`)/≡=\n∑(O_O)\n∑(・∀・) コ坏了 !!\n<(ToT)>\n{[(-_-)(-_-)]}zzz\n(・o・)/!\n(◎o◎)\n(^o^)/了解!\n(つд⊂)伤心\n゚Θ゚ \n(T▽T)\n(T_T)/~~\n(o・・o)/~\n(๑╹ڡ╹)╭ ♡\n(・。・)\n(・(仝)・)\n(・(ェ)・)\n¬з¬\n(=゚Д゚=)\n(=-ω-)zzZZ乙乙\n(--〆)\n( ̄Д ̄)ノ\n(-_-メ) \n(^^♪\n(^。^)y\n-.。o○\n(^ _ ^)/~~\n(-。-)y-゜゜゜\n(*゚Д゚)つミ匚___\n(*°∀°)=3\n(ー_ー)!!\n ^ω^\n( ^∀^)".split('\n');
var faceSelector = editor.find(">header>select");
var filereader = new FileReader();
filereader.onload = function (fe) {
editor.find(".chat-editor-container").append("<img src='" + fe.target.result + "' />");
};
var initEditor = function () {
if (!sessMgr.current)
return;
var color = sessMgr.current.options.chatColor || "#000000";
editor.find(">header .chat-editor-color").val(color);
editor.find(".chat-editor-container").css("color", color);
var faceDom = faceSelector[0];
specChars.forEach(function (f) {
var x = new Option(f, f);
faceDom.options[faceDom.options.length] = x;
});
faceSelector.change(function () {
var v = faceSelector.val();
if (v) {
pasteHtml(v);
}
faceSelector[0].selectedIndex = 0;
});
$(".chat-items").on("click", ".chat-item > section > img", function () {
$(this).colorbox({ html: this.outerHTML });
});
};
var delayEnableSend = function () {
sendBtn.prop("disabled", true);
setTimeout(function () {
sendBtn.prop("disabled", false);
}, param.chatSendMsgDelay);
};
var pasteHtml = function (html) {
editorArea.append(html);
var range = document.createRange();
range.selectNodeContents(editorArea[0]);
range.collapse(false);
var selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
editorArea[0].focus();
};
initEditor();
editor.find(".chat-editor-container").keyup(function (e) {
if (e.keyCode === 13 && sendBtn.is(":enabled")) {
sendBtn.click();
}
})[0].addEventListener("paste", function (e) {
if (e.clipboardData) {
var items = e.clipboardData.items;
if (items) {
for (var i = 0; i < items.length; i++) {
if (items[i].type.indexOf("image") === 0) {
var blob = items[i].getAsFile();
filereader.readAsDataURL(blob);
}
}
}
else {
}
}
});
sessMgr.on("sessionChanged", function () {
initEditor();
});
editor.find(">header .chat-btn-cls").click(function () {
session.clearDisplay();
});
editor.find(">header .chat-editor-color").change(function () {
user.options.chatColor = this.value;
editor.find(".chat-editor-container").css("color", this.value);
sessMgr.save();
});
editor.find("#chat_file").change(function () {
var file = this;
if (file.files.length > 0) {
session.sendPic(this.files[0]);
}
file.value = "";
});
editor.find(">footer>button.button-default").click(function () {
session.exitRoom();
});
editor.find(">footer>button.button-primary").click(function () {
var editorObj = editor.find(".chat-editor-container");
var target = [];
var addedUser = [];
editorObj.find("span.chat-editor-at").each(function () {
var username = this.dataset.un;
if (addedUser[username])
return;
addedUser[username] = true;
target.push({
realname: $.trim($(this).text()).substr(1),
username: username
});
}).remove();
var msg = {
color: user.options.chatColor,
text: $.trim(editorObj.text()).replace(/\u00a0/g, ""),
target: target
}
var media = editorObj.find("img").toBase64Data();
if (!msg.text && !media.length)
return;
msg.text = msg.text || "[贴图]";
editor.find(".chat-editor-container").empty();
session.sendMsg(msg, media);
delayEnableSend();
});
$(document).on("click", "a.chat-item-at", function () {
var un = this.dataset.un;
var name = this.innerHTML;
if (!un)
return;
var html = "<span class='chat-editor-at' contenteditable='false' data-un='" + un + "'>@" + name + "</span>&nbsp;";
pasteHtml(html);
});
$(document).on("click", "a.chat-frame-reconnect", function () {
$(".chat-item").remove();
session.reconnect();
});
})();
return {
session: session,
enterRoom: session.enterRoom
}
});