define([], function () { var modal = { wsClient: false, wsConfig: {}, wsConnected: false, wsBannedList: {}, wsBanned: false, wsUserList: {}, wsOnline: 0, wsFd: 0, settings: {}, msgAt: {} }; modal.init = function (params) { modal.wsConfig = params.wsConfig || {}; modal.initWs(); modal.initClick(); setInterval(function () { if (modal.wsConnected) { modal.wsSend('communication', {toUser: 'system'}) }else{ modal.initWs(); } }, 20000) }; modal.initWs = function () { if (!modal.wsConfig || !modal.wsConfig.address) { modal.liveMsg('notice', '通讯服务器配置错误'); return } else { modal.liveMsg('notice', '初始化通讯服务...') } var wsConfig = modal.wsConfig; var wsClient = new WebSocket(wsConfig.address); wsClient.onopen = function () { modal.wsSend('login', {toUser: 'system'}) }; wsClient.onmessage = function (evt) { var data = JSON.parse(evt.data); if (data.type == 'connected') { modal.liveMsg('notice', '聊天服务器连接成功...'); modal.wsConnected = true; modal.wsFd = data.toUser; modal.settings = data.settings; if (data.banned.all == 1) { modal.wsBanned = true; $('.btn-bannedall').text('解除全员禁言') } $('#online').text(data.online); $('#banned').text(data.bannedNum); modal.wsOnline = data.online; if (!$.isArray(data.userList)) { modal.wsUserList = data.userList } if (!$.isArray(data.bannedList)) { modal.wsBannedList = data.bannedList } modal.wsBannedNum = data.bannedNum; modal.initUserList(); modal.initBannedList(); modal.initSetting(); modal.initOnline() } else if (data.type == 'notice') { modal.liveMsg('notice', data.text) } else if (data.type == 'userEnter') { modal.liveMsg('notice', data.nickname + '进入直播间!掌声欢迎~'); modal.wsUserList[data.fromUser] = {nickname: data.nickname, role: data.role, banned: data.banned}; modal.initUserList(); modal.wsOnline++; if (modal.settings.virtualadd > 1) { modal.settings.virtual += modal.settings.virtualadd || 1; modal.initSetting() } $('#online').text(modal.wsOnline); modal.initOnline() } else if (data.type == 'userLeave') { modal.liveMsg('notice', data.nickname + '离开了直播间...'); if (!$.isEmptyObject(modal.wsUserList)) { delete modal.wsUserList[data.fromUser]; modal.initUserList(); if (modal.wsOnline > 0) { modal.wsOnline--; $('#online').text(modal.wsOnline); modal.initOnline() } } } else if (data.type == 'text' || data.type == 'sent') { modal.liveMsg('text', data) } else if (data.type == 'image') { modal.liveMsg('image', data) } else if (data.type == 'repeal') { if (data.msgid) { var text = '"' + data.nickname + '"'; if (data.self == 1) { text = '我' } $('.panel-chat[data-tab="chat"] p[data-msgid="' + data.msgid + '"]').html('' + text + '撤回了一条消息') } } else if (data.type == 'delete') { if (data.msgid) { if (data.self == 1) { data.nickname = '我' } $('.panel-chat[data-tab="chat"] p[data-msgid="' + data.msgid + '"]').html('' + data.nickname + '删除了"' + data.deleteNick + '"的一条消息') } } else if (data.type == 'banned') { if (data.banned == 1) { modal.wsBannedList[data.bannedUid] = {nickname: data.bannedNick, banned: 1}; modal.initBannedList(); modal.wsBannedNum++; $('#banned').text(modal.wsBannedNum) } else { if ($.isEmptyObject(modal.wsBannedList)) { return } if (modal.wsBannedList[data.bannedUid]) { delete modal.wsBannedList[data.bannedUid]; modal.initBannedList(); if (modal.wsBannedNum > 0) { modal.wsBannedNum--; $('#banned').text(modal.wsBannedNum) } } } $('.panel-chat p').each(function () { var nick = $(this).find('.nickname'), btn = $(this).find('.btn-banned'); if (nick.data('uid') == data.bannedFd || nick.data('uid') == data.bannedUid) { if (data.banned == 1) { btn.text('解除禁言').data('banned', 1).attr('title', '允许此用户发言') } else { btn.text('禁言').data('banned', 0).attr('title', '禁止此用户发言') } } }) } else if (data.type == 'bannedAll') { if (data.banned == 1) { modal.wsBanned = true; $('.btn-bannedall').text('解除全员禁言'); modal.liveMsg('notice', data.nickname + '设置了全员禁言') } else { modal.wsBanned = false; $('.btn-bannedall').text('全员禁言'); modal.liveMsg('notice', data.nickname + '解除了全员禁言') } } else if (data.type == 'setting') { if (!$.isEmptyObject(data.settings)) { modal.settings = data.settings; modal.initSetting(); modal.initOnline() } } else if (data.type == 'goods') { modal.liveMsg('goods', data); if (data.self == 1) { tip.msgbox.suc('推送成功') } } else if (data.type == 'redpack') { modal.liveMsg('redpack', data); if (data.self == 1) { tip.msgbox.suc('推送成功') } modal.liveMsgPush('redpack', data) } else if (data.type == 'redpackdraw') { var elm = $('.panel-push tbody').find('tr[data-pushid="' + data.redpackid + '"]'); if (elm.length < 1) { return } elm.find('.total_remain').text(data.redpack.total_remain); elm.find('.money_remain').text(data.redpack.money_remain) } else if (data.type == 'coupon') { modal.liveMsg('coupon', data); if (data.self == 1) { tip.msgbox.suc('推送成功') } modal.liveMsgPush('coupon', data) } else if (data.type == 'coupondraw') { var elm = $('.panel-push tbody').find('tr[data-pushid="' + data.couponid + '"]'); if (elm.length < 1) { return } elm.find('.total_remain').text(data.coupon.total_remain); elm.find('.money_remain').text(data.coupon.money_remain) } }; wsClient.onclose = function (evt) { if (!modal.wsConnected) { return } modal.liveMsg('notice', '与通讯服务器断开 点击重连'); modal.wsConnected = false }; wsClient.onerror = function (evt) { modal.liveMsg('notice', '与通讯服务器连接失败 点击重连'); modal.wsConnected = false }; modal.wsClient = wsClient }; modal.wsSend = function (type, obj) { if (!type || $.isEmptyObject(obj)) { return false } if (type != 'login' && !modal.wsConnected) { tip.msgbox.err('与通讯服务器连接失败'); return false } var wsConfig = modal.wsConfig; obj.type = type; obj.role = 'manage'; obj.scene = wsConfig.scene; obj.roomid = wsConfig.roomid; obj.uniacid = wsConfig.uniacid; obj.uid = wsConfig.uid; if (!obj.nickname) { obj.nickname = modal.settings.nickname || wsConfig.nickname } if (modal.msgAt) { obj.at = modal.msgAt } modal.wsClient.send(JSON.stringify(obj)); return obj }; modal.initClick = function () { $(document).click(function (e) { var emojiList = $(e.target).closest('.emoji-list').length; var btnEmoji = $(e.target).closest('.btn-emoji').length; var input = $(e.target).closest('#input').length; if (!emojiList && !btnEmoji && !input) { $('.btn-emoji').removeClass('active'); $('.emoji-list').hide() } }); $('.panel-chat-tab a').click(function () { var tab = $(this).data('tab'); $(this).addClass('active').siblings().removeClass('active'); $('.panel-chat').hide(); $('.panel-chat[data-tab="' + tab + '"]').show() }); $(document).on('click', '.btn-reconnect', function () { if (modal.wsConnected) { return } modal.initWs() }); $('.btn-play').click(function () { tip.confirm('确定要开启直播?开启直播后用户可看到直播画面', function () { modal.wsSend('setstatus', {toUser: 'system', status: 1}) }) }); $('.btn-pause').click(function () { tip.confirm('确定要暂停直播?暂停直播后用户将隐藏直播画面', function () { modal.wsSend('setstatus', {toUser: 'system', status: 2}) }) }); $('.btn-stop').click(function () { tip.confirm('确定要关闭直播?', function () { modal.wsSend('setstatus', {toUser: 'system', status: 0}) }) }); $(document).on('click', '.btn-delete', function () { var _this = $(this); tip.confirm('确定删除此条发言吗?', function () { var msgid = _this.closest('p').data('msgid'); if (msgid) { var nickname = _this.closest('p').find('.nickname').data('nickname'); var uid = _this.closest('p').find('.nickname').data('uid'); modal.wsSend('delete', {toUser: 'system', deleteNick: nickname, deleteUid: uid, msgid: msgid}) } }) }); $(document).on('click', '.btn-repeal', function () { var _this = $(this); tip.confirm('确定撤回发言吗?', function () { var msgid = _this.closest('p').data('msgid'); if (msgid) { modal.wsSend('repeal', {toUser: 'system', msgid: msgid}) } }) }); $(document).on('click', '.btn-banned', function () { var _this = $(this), elm = $(this).closest('p').find('.nickname'); var nickname = elm.data('nickname'), uid = elm.data('uid'), banned = _this.data('banned') || 0; var text = banned == 1 ? '确定解除禁言用户' : '确定禁言用户'; if (uid) { tip.confirm(text + nickname + '"?', function () { modal.wsSend('banned', {banned: banned == 1 ? 0 : 1, bannedUid: uid, bannedNick: nickname}) }) } }); $('.btn-bannedall').click(function () { var _this = $(this); var text = modal.wsBanned ? '确定要解除禁言' : '确定要全员(除管理员外)禁言'; tip.confirm(text + '?', function () { if (!modal.wsConnected) { tip.msgbox.err('与通讯服务器连接失败'); return false } modal.wsSend('bannedAll', {toUser: 'all', banned: modal.wsBanned ? 0 : 1}); if (modal.wsBanned) { modal.wsBanned = false; tip.msgbox.suc('取消全员禁言'); _this.text('全员禁言') } else { modal.wsBanned = true; tip.msgbox.suc('设置全员禁言'); _this.text('取消全员禁言') } }) }); $('.btn-setting').click(function () { tip.confirm('确定设置并推送给所有用户吗?', function () { var manageNick = $.trim($('.managenick').val()) || modal.wsConfig.nickname; var canAt = $('.canat:checked').val(); var canRepeal = $('.canrepeal:checked').val(); var virtualNum = $('.virtual').val(); var virtualAddNum = $('.virtualadd').val(); modal.wsSend('setting', { toUser: 'system', manageNick: manageNick, canAt: canAt, canRepeal: canRepeal, virtualNum: virtualNum, virtualAddNum: virtualAddNum }) }) }); $('.btn-emoji').click(function () { if ($(this).hasClass('active')) { $(this).removeClass('active'); $('.emoji-list').hide() } else { $(this).addClass('active'); $('.emoji-list').show() } }); $('.emoji-list .item').click(function () { var text = $(this).attr('title'); modal.insertAtCaret('#input', '[' + text + ']'); $('.btn-emoji').removeClass('active'); $('.emoji-list').hide(); $('#btn-send').removeClass('disabled') }); $(document).on('click', '.nickname', function () { if ($(this).hasClass('noclick')) { return } if ($(this).hasClass('self')) { tip.msgbox.err('你不能@自己'); return } else { var uid = $(this).data('uid'), nickname = $(this).data('nickname'); var atLeng = modal.objectLength(modal.msgAt); if (atLeng >= 5) { tip.msgbox.err('单次最多@5个用户'); return } if (modal.msgAt[uid]) { return } modal.msgAt[uid] = nickname; if (atLeng < 1) { $('.btn-ats .item.big').data('uid', uid).attr('title', nickname).find('.text').text('@' + nickname); $('.btn-ats').show().removeClass('more'); $('.btn-ats .at-list').empty() } else { $('.btn-ats .item.big').data('uid', 'all').attr('title', '移除全部').find('.text').text('@2个用户'); $('.btn-ats .at-list').empty(); $.each(modal.msgAt, function (uid, nickname) { $('.btn-ats .at-list').append('
' + user.nickname + ''; if (user.role != 'manage') { userHtml += ''; if (modal.wsBannedList[uid]) { userHtml += '解除禁言' } else { userHtml += '禁言' } userHtml += ' / @TA' } userHtml += '
'; if (user.role == 'manage') { manage += userHtml } else { html += userHtml } }); $('.panel-chat[data-tab="visitor"] .empty-data').hide(); $('.panel-chat[data-tab="visitor"] .inner').html(manage + html) }; modal.initBannedList = function () { if ($.isEmptyObject(modal.wsBannedList)) { $('.panel-chat[data-tab="bannedlist"]').find('.empty-data').show(); return } var html = ''; $.each(modal.wsBannedList, function (uid, user) { if (typeof user != 'object') { user = JSON.parse(user) } user.nickname = user.nickname || '未获取到用户昵称'; html += '' + user.nickname + '(' + uid + ')解除禁言
' }); $('.panel-chat[data-tab="bannedlist"] .empty-data').hide(); $('.panel-chat[data-tab="bannedlist"] .inner').html(html) }; modal.deleteAt = function (nickname) { if (!modal.msgAt || $.isEmptyObject(modal.msgAt) || !nickname) { return } $.each(modal.msgAt, function (uid, nick) { if (nick == nickname) { delete modal.msgAt[uid] } }) }; modal.handleAt = function () { if (!modal.msgAt || $.isEmptyObject(modal.msgAt)) { return } var value = $.trim($('#input').val()); if (!value) { return } var res = value.match(/@(\S*)(\s){1}/g) }; modal.handleAtText = function (text, at) { if (at && !$.isEmptyObject(at)) { $.each(at, function (uid, nickname) { var replace = '@' + nickname + ' '; text = text.replace('@' + nickname + ' ', replace) }) } return text }; modal.liveMsg = function (type, msg) { var atText = ''; if (msg.atUsers && !$.isEmptyObject(msg.atUsers)) { $.each(msg.atUsers, function (uid, nickname) { atText += '@' + nickname + ' ' }) } if (type == 'image') { msg.text = modal.tomedia(msg.text); msg.text = '';
if (type != 'notice') {
var date = modal.time2date(msg.time);
html += '[' + date + '] ';
if (type == 'goods') {
text = '';
text += '';
text += '' + msg.goodsTitle + '¥' + msg.goodsPrice + '';
text += ''
} else if (type == 'redpack') {
text = '[余额红包] ' + msg.redpack.title + ',请到手机端查看'
} else if (type == 'coupon') {
text = '[优惠券] ' + msg.coupon.title + ',请到手机端查看'
}
if (msg.self) {
if (modal.msgAt) {
text = modal.handleAtText(text, modal.msgAt)
}
html += '' + msg.nickname + '(我):' + atText + text;
if (type != 'goods' && type != 'redpack' && type != 'coupon') {
html += ' 撤回'
}
} else {
if (msg.at) {
text = modal.handleAtText(text, msg.at)
}
html += '' + msg.nickname + ':' + atText + text;
if (type != 'goods' && type != 'redpack') {
html += '\n 删除';
html += '\n 禁言'
}
}
} else {
html += '系统提醒:' + text + ''
}
html += '
'; elm.append(html); if (elm[0].scrollHeight > elm.height()) { elm.stop(true).animate({scrollTop: elm[0].scrollHeight + "px"}, 1) } }; modal.liveMsgPush = function (type, data) { if (type == 'coupon') { var typetext = '-' } else { var typetext = data.redpack.type == 1 ? '拼手气红包' : '普通红包' } var pushtype = type == 'coupon' ? '优惠券' : '红包(余额)'; var pushid = type == 'coupon' ? data.coupon.id : data.redpack.id; var title = type == 'coupon' ? data.coupon.title : data.redpack.title; var total = type == 'coupon' ? data.coupon.total : data.redpack.total; var total = type == 'coupon' ? data.coupon.total : data.redpack.total; var money = type == 'coupon' ? '-' : data.redpack.money; var label = type == 'coupon' ? 'label-warning' : 'label-danger'; var html = '