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 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: "重新连接" })); 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: "重新连接" })); 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 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.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: "重新连接" })); 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(^_^)ン\nv(=^0^=)v\nT(;_;)T\np(^^)q\no(TヘTo)\no(^∀^)o\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(""); }; 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 = "@" + name + " "; pasteHtml(html); }); $(document).on("click", "a.chat-frame-reconnect", function () { $(".chat-item").remove(); session.reconnect(); }); })(); return { session: session, enterRoom: session.enterRoom } });