var webim = require('./webim_wx.js'); var selToID ,loginInfo ,accountMode ,accountType ,sdkAppID ,avChatRoomId ,selType ,selToID ,selSess ,selSessHeadUrl ; //监听大群新消息(普通,点赞,提示,红包) function onBigGroupMsgNotify(msgList, textMessageCallback, sketchpadDataCallback) { for (var i = msgList.length - 1; i >= 0; i--) {//遍历消息,按照时间从后往前 var msg = msgList[i]; //console.warn(msg); webim.Log.warn('receive a new avchatroom group msg: ' + msg.getFromAccountNick()); //显示收到的消息 // callback(showMsg(msg)); handleGroupMessage(msg, textMessageCallback, sketchpadDataCallback); // console.log('监听大群新消息', msg); //showMsg(msg); } } function handleGroupMessage(msg, textMessageCallback, sketchpadDataCallback) { console.log('0x256 - handleGroupMessage:', msg); textMessageCallback && textMessageCallback(showMsg(msg)); var elems, elem, type, content, ext; elems = msg.getElems();//获取消息包含的元素数组 console.log('获取消息包含的元素数组',elems) // 屏蔽自己的白板消息 console.log(`----> msg.fromAccount: ${msg.fromAccount}, identifier: ${loginInfo.identifier}`) if (msg.fromAccount === loginInfo.identifier) { console.log('self msg') return; } for (var i in elems) { elem = elems[i]; if (!elem) continue; type = elem.getType();//获取元素类型 console.log('0x256 - type: ' + type); content = elem.getContent();//获取元素对象 if (!content) { console.log('content is null') continue; } if (type === 'TIMCustomElem') { let ext = content.getExt(); //'白板标签' let data = content.getData(); //数据 if (ext === 'TXWhiteBoardExt') { console.log('无压缩数据类型: TXWhiteBoardExt'); sketchpadDataCallback && sketchpadDataCallback(data); break; } } else if (type === 'TIMCustomFile') { console.warn('已压缩压缩数据类型: TXWhiteBoardExt_gzip_'); } } } //监听新消息(私聊(包括普通消息、全员推送消息),普通群(非直播聊天室)消息)事件 //newMsgList 为新消息数组,结构为[Msg] function onMsgNotify(newMsgList, callback) { var newMsg; for (var j in newMsgList) {//遍历新消息 newMsg = newMsgList[j]; handlderMsg(newMsg, callback);//处理新消息 } } //处理消息(私聊(包括普通消息和全员推送消息),普通群(非直播聊天室)消息) function handlderMsg(msg, callback) { var fromAccount, fromAccountNick, sessType, subType, contentHtml; console.log('处理消息(私聊(包括普通消息和全员推送消息),普通群(非直播聊天室)消息)',msg) fromAccount = msg.getFromAccount(); if (!fromAccount) { fromAccount = ''; } fromAccountNick = msg.getFromAccountNick(); if (!fromAccountNick) { fromAccountNick = fromAccount; } //解析消息 //获取会话类型 //webim.SESSION_TYPE.GROUP-群聊, //webim.SESSION_TYPE.C2C-私聊, sessType = msg.getSession().type(); //获取消息子类型 //会话类型为群聊时,子类型为:webim.GROUP_MSG_SUB_TYPE //会话类型为私聊时,子类型为:webim.C2C_MSG_SUB_TYPE subType = msg.getSubType(); switch (sessType) { case webim.SESSION_TYPE.C2C://私聊消息 switch (subType) { case webim.C2C_MSG_SUB_TYPE.COMMON://c2c普通消息 //业务可以根据发送者帐号fromAccount是否为app管理员帐号,来判断c2c消息是否为全员推送消息,还是普通好友消息 //或者业务在发送全员推送消息时,发送自定义类型(webim.MSG_ELEMENT_TYPE.CUSTOM,即TIMCustomElem)的消息,在里面增加一个字段来标识消息是否为推送消息 contentHtml = convertMsgtoHtml(msg); webim.Log.warn('receive a new c2c msg: fromAccountNick=' + fromAccountNick + ", content=" + contentHtml); //c2c消息一定要调用已读上报接口 var opts = { 'To_Account': fromAccount,//好友帐号 'LastedMsgTime': msg.getTime()//消息时间戳 }; webim.c2CMsgReaded(opts); if (callback) { var resMsg = { fromAccountNick: fromAccountNick, content: contentHtml } callback(resMsg); } console.error('收到一条c2c消息(好友消息或者全员推送消息): 发送人=' + fromAccountNick + ", 内容=" + contentHtml); break; } break; case webim.SESSION_TYPE.GROUP://普通群消息,对于直播聊天室场景,不需要作处理 break; } } //sdk登录 function sdkLogin(userInfo, listeners, options, avChatRoomId, callback, callbackOptions) { //web sdk 登录 console.log('identifierNick为登录用户昵称(没有设置时,为帐号),无登录态时为空',userInfo) webim.login(userInfo, listeners, options, function (identifierNick) { //identifierNick为登录用户昵称(没有设置时,为帐号),无登录态时为空 webim.Log.info('webim登录成功'); loginInfo = userInfo; setProfilePortrait({ 'ProfileItem': [{ "Tag": "Tag_Profile_IM_Nick", "Value": userInfo.identifierNick }] },function(ret){ if(ret) { // 设置昵称失败 callback & callback({ errCode: ret.ErrorCode, errMsg: ret.ErrorInfo || '修改昵称失败', callback: callbackOptions }); return; } if(avChatRoomId) applyJoinBigGroup(avChatRoomId);//加入大群 callback & callback({ errCode: 0, errMsg: '', callback: callbackOptions }); }) //hideDiscussForm();//隐藏评论表单 //initEmotionUL();//初始化表情 }, function (err) { console.error(err.ErrorInfo); console.log('webim登录失败'); callback & callback({ errCode: err, errMsg: err.ErrorInfo, callback: callbackOptions }); } );// } //修改昵称 function setProfilePortrait(options,callback){ webim.setProfilePortrait(options, function(res){ webim.Log.info('修改昵称成功'); callback && callback(); }, function(ret){ console.log('修改昵称失败',ret); callback && callback(ret); } ); } // 创建大群 function createBigGroup(options, callback, callbackOptions) { avChatRoomId = options.roomID; webim.createGroup({ GroupId: options.roomID, Owner_Account: options.userID, Type: 'AVChatRoom', // 默认先是大群 Name: options.roomName || '', MaxMemberCount: 500, ApplyJoinOption: 'FreeAccess', MemberList: [] },function(ret){ if(ret.ErrorCode) { // 建房失败 callback && callback({ errCode: ret.ErrorCode, errMsg: ret.err_msg, callback: callbackOptions }); return; } selToID = options.roomID; // 建房成功 callback && callback({ errCode: 0, callback: callbackOptions }); },function(ret){ if (ret && ret.ErrorCode == 10025) { //群组 ID 已被使用,并且操作者为群主,可以直接使用 // 建房成功 callback && callback({ errCode: 0, callback: callbackOptions }); return; } // 建房失败 callback && callback({ errCode: ret.ErrorCode, errMsg: ret.ErrorInfo || 'webim建房失败', callback: callbackOptions }); }); } //进入大群 function applyJoinBigGroup(groupId, callback, callbackOptions) { var options = { 'GroupId': groupId//群id }; // 做一些预处理 avChatRoomId = groupId; selSess = null; webim.applyJoinBigGroup( options, function (resp) { //JoinedSuccess:加入成功; WaitAdminApproval:等待管理员审批 if (resp.JoinedStatus && resp.JoinedStatus == 'JoinedSuccess') { webim.Log.info('进群成功'); selToID = groupId; callback && callback({ errCode: 0, callback: callbackOptions }); } else { console.error('进群失败'); callback && callback({ errCode: 999, errMsg: 'IM进群失败', callback: callbackOptions }); } }, function (err) { console.error(err.ErrorInfo); console.log('进群请求失败', err.ErrorInfo); callback && callback({ errCode: 999, errMsg: err.ErrorInfo || 'IM进群失败', callback: callbackOptions }); } ); } //显示消息(群普通+点赞+提示+红包) function showMsg(msg) { var isSelfSend, fromAccount, fromAccountNick, sessType, subType; var ul, li, paneDiv, textDiv, nickNameSpan, contentSpan; fromAccount = msg.getFromAccount(); if (!fromAccount) { fromAccount = ''; } fromAccountNick = msg.getFromAccountNick(); if (!fromAccountNick) { fromAccountNick = '未知用户'; } //解析消息 //获取会话类型,目前只支持群聊 //webim.SESSION_TYPE.GROUP-群聊, //webim.SESSION_TYPE.C2C-私聊, sessType = msg.getSession().type(); //获取消息子类型 //会话类型为群聊时,子类型为:webim.GROUP_MSG_SUB_TYPE //会话类型为私聊时,子类型为:webim.C2C_MSG_SUB_TYPE subType = msg.getSubType(); console.log('解析消息解析消息解析消息解析消息解析消息解析消息',subType) console.log('webim.GROUP_MSG_SUB_TYPE.COMMON',webim.GROUP_MSG_SUB_TYPE.COMMON) console.log('msg',msg) isSelfSend = msg.getIsSend();//消息是否为自己发的 var content = ""; switch (subType) { case webim.GROUP_MSG_SUB_TYPE.COMMON://群普通消息 content = convertMsgtoHtml(msg); break; case webim.GROUP_MSG_SUB_TYPE.REDPACKET://群红包消息 content = "[群红包消息]" + convertMsgtoHtml(msg); break; case webim.GROUP_MSG_SUB_TYPE.LOVEMSG://群点赞消息 //业务自己可以增加逻辑,比如展示点赞动画效果 content = "[群点赞消息]" + convertMsgtoHtml(msg); //展示点赞动画 showLoveMsgAnimation(); break; case webim.GROUP_MSG_SUB_TYPE.TIP://群提示消息 content = "[群提示]" + convertMsgtoHtml(msg); break; } return { fromAccountNick : fromAccountNick, content : content } } //把消息转换成Html function convertMsgtoHtml(msg) { var html = "", elems, elem, type, content; elems = msg.getElems();//获取消息包含的元素数组 for (var i in elems) { elem = elems[i]; type = elem.getType();//获取元素类型 content = elem.getContent();//获取元素对象 switch (type) { case webim.MSG_ELEMENT_TYPE.TEXT: html += convertTextMsgToHtml(content); break; case webim.MSG_ELEMENT_TYPE.FACE: html += convertFaceMsgToHtml(content); break; case webim.MSG_ELEMENT_TYPE.IMAGE: html += convertImageMsgToHtml(content); break; case webim.MSG_ELEMENT_TYPE.SOUND: html += convertSoundMsgToHtml(content); break; case webim.MSG_ELEMENT_TYPE.FILE: html += convertFileMsgToHtml(content); break; case webim.MSG_ELEMENT_TYPE.LOCATION://暂不支持地理位置 //html += convertLocationMsgToHtml(content); break; case webim.MSG_ELEMENT_TYPE.CUSTOM: html += convertCustomMsgToHtml(content); break; case webim.MSG_ELEMENT_TYPE.GROUP_TIP: html += convertGroupTipMsgToHtml(content); break; default: webim.Log.error('未知消息元素类型: elemType=' + type); break; } } return webim.Tool.formatHtml2Text(html); } //解析文本消息元素 function convertTextMsgToHtml(content) { return content.getText(); } //解析表情消息元素 function convertFaceMsgToHtml(content) { return content.getData(); return content; var faceUrl = null; var data = content.getData(); var index = webim.EmotionDataIndexs[data]; var emotion = webim.Emotions[index]; if (emotion && emotion[1]) { faceUrl = emotion[1]; } if (faceUrl) { return ""; } else { return data; } } //解析图片消息元素 function convertImageMsgToHtml(content) { var smallImage = content.getImage(webim.IMAGE_TYPE.SMALL);//小图 var bigImage = content.getImage(webim.IMAGE_TYPE.LARGE);//大图 var oriImage = content.getImage(webim.IMAGE_TYPE.ORIGIN);//原图 if (!bigImage) { bigImage = smallImage; } if (!oriImage) { oriImage = smallImage; } return ""; } //解析语音消息元素 function convertSoundMsgToHtml(content) { var second = content.getSecond();//获取语音时长 var downUrl = content.getDownUrl(); if (webim.BROWSER_INFO.type == 'ie' && parseInt(webim.BROWSER_INFO.ver) <= 8) { return '[这是一条语音消息]demo暂不支持ie8(含)以下浏览器播放语音,语音URL:' + downUrl; } return ''; } //解析文件消息元素 function convertFileMsgToHtml(content) { var fileSize = Math.round(content.getSize() / 1024); return ' ' + content.getName() + '(' + fileSize + 'KB)'; } //解析位置消息元素 function convertLocationMsgToHtml(content) { return '经度=' + content.getLongitude() + ',纬度=' + content.getLatitude() + ',描述=' + content.getDesc(); } //解析自定义消息元素 function convertCustomMsgToHtml(content) { var data = content.getData(); var desc = content.getDesc(); var ext = content.getExt(); // return "data=" + data + ", desc=" + desc + ", ext=" + ext; return data; } //解析群提示消息元素 function convertGroupTipMsgToHtml(content) { console.log('群提示消息类型(操作类型)',content) var WEB_IM_GROUP_TIP_MAX_USER_COUNT = 10; var text = ""; var maxIndex = WEB_IM_GROUP_TIP_MAX_USER_COUNT - 1; var opType, opUserId, userIdList; var memberCount; opType = content.getOpType();//群提示消息类型(操作类型) opUserId = content.getOpUserId();//操作人id switch (opType) { case webim.GROUP_TIP_TYPE.JOIN://加入群 userIdList = content.getUserIdList(); //text += opUserId + "邀请了"; for (var m in userIdList) { text += userIdList[m] + ","; //text += user.nickname + ","; if (userIdList.length > WEB_IM_GROUP_TIP_MAX_USER_COUNT && m == maxIndex) { text += "等" + userIdList.length + "人"; break; } } text = text.substring(0, text.length - 1); text += "进入房间"; text += ';{"type":' + opType + ',"userIdList":"' + userIdList.join(',') + '"}'; //房间成员数加1 // memberCount = $('#user-icon-fans').html(); memberCount = parseInt(memberCount) + 1; break; case webim.GROUP_TIP_TYPE.QUIT://退出群 text += opUserId + "离开房间"; text += ';{"type":' + opType + ',"userIdList":"' + opUserId + '"}'; //房间成员数减1 if (memberCount > 0) { memberCount = parseInt(memberCount) - 1; } break; case webim.GROUP_TIP_TYPE.KICK://踢出群 text += opUserId + "将"; userIdList = content.getUserIdList(); for (var m in userIdList) { text += userIdList[m] + ","; if (userIdList.length > WEB_IM_GROUP_TIP_MAX_USER_COUNT && m == maxIndex) { text += "等" + userIdList.length + "人"; break; } } text += "踢出该群"; break; case webim.GROUP_TIP_TYPE.SET_ADMIN://设置管理员 text += opUserId + "将"; userIdList = content.getUserIdList(); for (var m in userIdList) { text += userIdList[m] + ","; if (userIdList.length > WEB_IM_GROUP_TIP_MAX_USER_COUNT && m == maxIndex) { text += "等" + userIdList.length + "人"; break; } } text += "设为管理员"; break; case webim.GROUP_TIP_TYPE.CANCEL_ADMIN://取消管理员 text += opUserId + "取消"; userIdList = content.getUserIdList(); for (var m in userIdList) { text += userIdList[m] + ","; if (userIdList.length > WEB_IM_GROUP_TIP_MAX_USER_COUNT && m == maxIndex) { text += "等" + userIdList.length + "人"; break; } } text += "的管理员资格"; break; case webim.GROUP_TIP_TYPE.MODIFY_GROUP_INFO://群资料变更 text += opUserId + "修改了群资料:"; var groupInfoList = content.getGroupInfoList(); var type, value; for (var m in groupInfoList) { type = groupInfoList[m].getType(); value = groupInfoList[m].getValue(); switch (type) { case webim.GROUP_TIP_MODIFY_GROUP_INFO_TYPE.FACE_URL: text += "群头像为" + value + "; "; break; case webim.GROUP_TIP_MODIFY_GROUP_INFO_TYPE.NAME: text += "群名称为" + value + "; "; break; case webim.GROUP_TIP_MODIFY_GROUP_INFO_TYPE.OWNER: text += "群主为" + value + "; "; break; case webim.GROUP_TIP_MODIFY_GROUP_INFO_TYPE.NOTIFICATION: text += "群公告为" + value + "; "; break; case webim.GROUP_TIP_MODIFY_GROUP_INFO_TYPE.INTRODUCTION: text += "群简介为" + value + "; "; break; default: text += "未知信息为:type=" + type + ",value=" + value + "; "; break; } } break; case webim.GROUP_TIP_TYPE.MODIFY_MEMBER_INFO://群成员资料变更(禁言时间) text += opUserId + "修改了群成员资料:"; var memberInfoList = content.getMemberInfoList(); var userId, shutupTime; for (var m in memberInfoList) { userId = memberInfoList[m].getUserId(); shutupTime = memberInfoList[m].getShutupTime(); text += userId + ": "; if (shutupTime != null && shutupTime !== undefined) { if (shutupTime == 0) { text += "取消禁言; "; } else { text += "禁言" + shutupTime + "秒; "; } } else { text += " shutupTime为空"; } if (memberInfoList.length > WEB_IM_GROUP_TIP_MAX_USER_COUNT && m == maxIndex) { text += "等" + memberInfoList.length + "人"; break; } } break; default: text += "未知群提示消息类型:type=" + opType; break; } return text; } //tls登录 function tlsLogin() { //跳转到TLS登录页面 console.warn('tlslogin need rewrite'); // TLSHelper.goLogin({ // sdkappid: loginInfo.sdkAppID, // acctype: loginInfo.accountType, // url: window.location.href // }); } //第三方应用需要实现这个函数,并在这里拿到UserSig function tlsGetUserSig(res) { //成功拿到凭证 if (res.ErrorCode == webim.TLS_ERROR_CODE.OK) { //从当前URL中获取参数为identifier的值 loginInfo.identifier = webim.Tool.getQueryString("identifier"); //拿到正式身份凭证 loginInfo.userSig = res.UserSig; //从当前URL中获取参数为sdkappid的值 loginInfo.sdkAppID = loginInfo.appIDAt3rd = Number(webim.Tool.getQueryString("sdkappid")); //从cookie获取accountType var accountType = webim.Tool.getCookie('accountType'); if (accountType) { loginInfo.accountType = accountType; sdkLogin();//sdk登录 } else { location.href = location.href.replace(/\?.*$/gi,""); } } else { //签名过期,需要重新登录 if (res.ErrorCode == webim.TLS_ERROR_CODE.SIGNATURE_EXPIRATION) { tlsLogin(); } else { console.error("[" + res.ErrorCode + "]" + res.ErrorInfo); } } } //单击图片事件 function imageClick(imgObj) { var imgUrls = imgObj.src; var imgUrlArr = imgUrls.split("#"); //字符分割 var smallImgUrl = imgUrlArr[0];//小图 var bigImgUrl = imgUrlArr[1];//大图 var oriImgUrl = imgUrlArr[2];//原图 webim.Log.info("小图url:" + smallImgUrl); webim.Log.info("大图url:" + bigImgUrl); webim.Log.info("原图url:" + oriImgUrl); } //切换播放audio对象 function onChangePlayAudio(obj) { if (curPlayAudio) {//如果正在播放语音 if (curPlayAudio != obj) {//要播放的语音跟当前播放的语音不一样 curPlayAudio.currentTime = 0; curPlayAudio.pause(); curPlayAudio = obj; } } else { curPlayAudio = obj;//记录当前播放的语音 } } //单击评论图片 function smsPicClick() { if (!loginInfo.identifier) {//未登录 if (accountMode == 1) {//托管模式 //将account_type保存到cookie中,有效期是1天 webim.Tool.setCookie('accountType', loginInfo.accountType, 3600 * 24); //调用tls登录服务 tlsLogin(); } else {//独立模式 console.error('请填写帐号和票据'); } return; } else { hideDiscussTool();//隐藏评论工具栏 showDiscussForm();//显示评论表单 } } //发送消息(普通消息) function onSendMsg(msg,callback) { console.log('accountMode',accountMode); if (!loginInfo.identifier) {//未登录 if (accountMode == 1) {//托管模式 //将account_type保存到cookie中,有效期是1天 webim.Tool.setCookie('accountType', loginInfo.accountType, 3600 * 24); //调用tls登录服务 tlsLogin(); } else {//独立模式 console.error('请填写帐号和票据'); } return; } if (!selToID) { console.error("您还没有进入房间,暂不能聊天"); return; } //获取消息内容 var msgtosend = msg; var msgLen = webim.Tool.getStrBytes(msg); if (msgtosend.length < 1) { console.error("发送的消息不能为空!"); return; } var maxLen, errInfo; if (selType == webim.SESSION_TYPE.GROUP) { maxLen = webim.MSG_MAX_LENGTH.GROUP; errInfo = "消息长度超出限制(最多" + Math.round(maxLen / 3) + "汉字)"; } else { maxLen = webim.MSG_MAX_LENGTH.C2C; errInfo = "消息长度超出限制(最多" + Math.round(maxLen / 3) + "汉字)"; } if (msgLen > maxLen) { console.error(errInfo); return; } if (!selSess) { selSess = new webim.Session(selType, selToID, selToID, selSessHeadUrl, Math.round(new Date().getTime() / 1000)); } var isSend = true;//是否为自己发送 var seq = -1;//消息序列,-1表示sdk自动生成,用于去重 var random = Math.round(Math.random() * 4294967296);//消息随机数,用于去重 var msgTime = Math.round(new Date().getTime() / 1000);//消息时间戳 var subType;//消息子类型 if (selType == webim.SESSION_TYPE.GROUP) { //群消息子类型如下: //webim.GROUP_MSG_SUB_TYPE.COMMON-普通消息, //webim.GROUP_MSG_SUB_TYPE.LOVEMSG-点赞消息,优先级最低 //webim.GROUP_MSG_SUB_TYPE.TIP-提示消息(不支持发送,用于区分群消息子类型), //webim.GROUP_MSG_SUB_TYPE.REDPACKET-红包消息,优先级最高 subType = webim.GROUP_MSG_SUB_TYPE.COMMON; } else { //C2C消息子类型如下: //webim.C2C_MSG_SUB_TYPE.COMMON-普通消息, subType = webim.C2C_MSG_SUB_TYPE.COMMON; } var msg = new webim.Msg(selSess, isSend, seq, random, msgTime, loginInfo.identifier, subType, loginInfo.identifierNick); //解析文本和表情 var expr = /\[[^[\]]{1,3}\]/mg; var emotions = msgtosend.match(expr); var text_obj, face_obj, tmsg, emotionIndex, emotion, restMsgIndex; if (!emotions || emotions.length < 1) { text_obj = new webim.Msg.Elem.Text(msgtosend); msg.addText(text_obj); } else {//有表情 for (var i = 0; i < emotions.length; i++) { tmsg = msgtosend.substring(0, msgtosend.indexOf(emotions[i])); if (tmsg) { text_obj = new webim.Msg.Elem.Text(tmsg); msg.addText(text_obj); } emotionIndex = webim.EmotionDataIndexs[emotions[i]]; emotion = webim.Emotions[emotionIndex]; if (emotion) { face_obj = new webim.Msg.Elem.Face(emotionIndex, emotions[i]); msg.addFace(face_obj); } else { text_obj = new webim.Msg.Elem.Text(emotions[i]); msg.addText(text_obj); } restMsgIndex = msgtosend.indexOf(emotions[i]) + emotions[i].length; msgtosend = msgtosend.substring(restMsgIndex); } if (msgtosend) { text_obj = new webim.Msg.Elem.Text(msgtosend); msg.addText(text_obj); } } webim.sendMsg(msg, function (resp) { if (selType == webim.SESSION_TYPE.C2C) {//私聊时,在聊天窗口手动添加一条发的消息,群聊时,长轮询接口会返回自己发的消息 showMsg(msg); } webim.Log.info("发消息成功"); callback && callback(); //hideDiscussForm();//隐藏评论表单 //showDiscussTool();//显示评论工具栏 //hideDiscussEmotion();//隐藏表情 }, function (err) { webim.Log.error("发消息失败:" + err.ErrorInfo); console.error("发消息失败:" + err.ErrorInfo); }); } function sendC2CCustomMsg(toUserID, msg, callback) { if (!loginInfo.identifier) {//未登录 if (accountMode == 1) {//托管模式 //将account_type保存到cookie中,有效期是1天 webim.Tool.setCookie('accountType', loginInfo.accountType, 3600 * 24); //调用tls登录服务 tlsLogin(); } else {//独立模式 console.error('请填写帐号和票据'); } return; } console.log('请填写帐号和票据',msg) // custom消息 var data = msg.data || ''; var desc = msg.desc || ''; var ext = msg.ext || ''; var msgLen = webim.Tool.getStrBytes(data); var maxLen = webim.MSG_MAX_LENGTH.C2C; var errInfo = "消息长度超出限制(最多" + Math.round(maxLen / 3) + "汉字)"; if (msgLen > maxLen) { alert(errInfo); return; } var session = new webim.Session(webim.SESSION_TYPE.C2C, toUserID, toUserID, '', Math.round(new Date().getTime() / 1000)); var isSend = true;//是否为自己发送 var seq = -1;//消息序列,-1表示sdk自动生成,用于去重 var random = Math.round(Math.random() * 4294967296);//消息随机数,用于去重 var msgTime = Math.round(new Date().getTime() / 1000);//消息时间戳 var subType = webim.C2C_MSG_SUB_TYPE.COMMON;//消息子类型 var msg = new webim.Msg(session, isSend, seq, random, msgTime, loginInfo.identifier, subType, loginInfo.identifierNick); var custom_obj = new webim.Msg.Elem.Custom(data, desc, ext); msg.addCustom(custom_obj); //调用发送消息接口 webim.sendMsg(msg, function (resp) { webim.Log.info("发自定义消息成功000"); console.log('发自定义消息成功'); callback && callback({ errCode: 0, errMsg: "" }); }, function (err) { webim.Log.info(err.ErrorInfo); console.log('发自定义消息失败:', err); callback && callback({ errCode: -1, errMsg: '发自定义消息失败:' + err.ErrorInfo }); }); } /** * 发送自定义消息 * 一条custom消息+一条text消息 * 自定义,用于携带头像与昵称(其他端使用精简版text不能携带) */ function sendCustomMsg(msg,callback) { console.log('自定义,用于携带头像与昵称(其他端使用精简版text不能携带)',msg) if (!loginInfo.identifier) {//未登录 if (accountMode == 1) {//托管模式 //将account_type保存到cookie中,有效期是1天 webim.Tool.setCookie('accountType', loginInfo.accountType, 3600 * 24); //调用tls登录服务 tlsLogin(); } else {//独立模式 console.error('请填写帐号和票据'); } return; } if (!selToID) { console.error("您还没有进入房间,暂不能聊天"); return; } // custom消息 var data = msg.data || ''; var desc = msg.desc || ''; var ext = msg.ext || ''; var msgLen = webim.Tool.getStrBytes(data); if (data.length < 1) { alert("发送的消息不能为空!"); return; } var maxLen, errInfo; if (selType == webim.SESSION_TYPE.C2C) { maxLen = webim.MSG_MAX_LENGTH.C2C; errInfo = "消息长度超出限制(最多" + Math.round(maxLen / 3) + "汉字)"; } else { maxLen = webim.MSG_MAX_LENGTH.GROUP; errInfo = "消息长度超出限制(最多" + Math.round(maxLen / 3) + "汉字)"; } if (msgLen > maxLen) { alert(errInfo); return; } // text消息 var msgtosend = msg.text; var msgLen = webim.Tool.getStrBytes(msg.text); if (msgtosend.length < 1) { console.error("发送的消息不能为空!"); return; } var maxLen, errInfo; if (selType == webim.SESSION_TYPE.GROUP) { maxLen = webim.MSG_MAX_LENGTH.GROUP; errInfo = "消息长度超出限制(最多" + Math.round(maxLen / 3) + "汉字)"; } else { maxLen = webim.MSG_MAX_LENGTH.C2C; errInfo = "消息长度超出限制(最多" + Math.round(maxLen / 3) + "汉字)"; } if (msgLen > maxLen) { console.error(errInfo); return; } if (!selSess) { selSess = new webim.Session(selType, selToID, selToID, selSessHeadUrl, Math.round(new Date().getTime() / 1000)); } var isSend = true;//是否为自己发送 var seq = -1;//消息序列,-1表示sdk自动生成,用于去重 var random = Math.round(Math.random() * 4294967296);//消息随机数,用于去重 var msgTime = Math.round(new Date().getTime() / 1000);//消息时间戳 var subType;//消息子类型 if (selType == webim.SESSION_TYPE.GROUP) { //群消息子类型如下: //webim.GROUP_MSG_SUB_TYPE.COMMON-普通消息, //webim.GROUP_MSG_SUB_TYPE.LOVEMSG-点赞消息,优先级最低 //webim.GROUP_MSG_SUB_TYPE.TIP-提示消息(不支持发送,用于区分群消息子类型), //webim.GROUP_MSG_SUB_TYPE.REDPACKET-红包消息,优先级最高 subType = webim.GROUP_MSG_SUB_TYPE.COMMON; } else { //C2C消息子类型如下: //webim.C2C_MSG_SUB_TYPE.COMMON-普通消息, subType = webim.C2C_MSG_SUB_TYPE.COMMON; } var msg = new webim.Msg(selSess, isSend, seq, random, msgTime, loginInfo.identifier, subType, loginInfo.identifierNick); var custom_obj = new webim.Msg.Elem.Custom(data, desc, ext); msg.addCustom(custom_obj); //解析文本和表情 var expr = /\[[^[\]]{1,3}\]/mg; var emotions = msgtosend.match(expr); var text_obj, face_obj, tmsg, emotionIndex, emotion, restMsgIndex; if (!emotions || emotions.length < 1) { text_obj = new webim.Msg.Elem.Text(msgtosend); msg.addText(text_obj); } else {//有表情 for (var i = 0; i < emotions.length; i++) { tmsg = msgtosend.substring(0, msgtosend.indexOf(emotions[i])); if (tmsg) { text_obj = new webim.Msg.Elem.Text(tmsg); msg.addText(text_obj); } emotionIndex = webim.EmotionDataIndexs[emotions[i]]; emotion = webim.Emotions[emotionIndex]; if (emotion) { face_obj = new webim.Msg.Elem.Face(emotionIndex, emotions[i]); msg.addFace(face_obj); } else { text_obj = new webim.Msg.Elem.Text(emotions[i]); msg.addText(text_obj); } restMsgIndex = msgtosend.indexOf(emotions[i]) + emotions[i].length; msgtosend = msgtosend.substring(restMsgIndex); } if (msgtosend) { text_obj = new webim.Msg.Elem.Text(msgtosend); msg.addText(text_obj); } } //调用发送消息接口 webim.sendMsg(msg, function (resp) { if(selType==webim.SESSION_TYPE.C2C){//私聊时,在聊天窗口手动添加一条发的消息,群聊时,长轮询接口会返回自己发的消息 addMsg(msg); } webim.Log.info("发自定义消息成功"); console.log('发自定义消息成功'); callback && callback(); }, function (err) { webim.Log.info(err.ErrorInfo); console.log('发自定义消息失败:',err); }); } //发送消息(群点赞消息) function sendGroupLoveMsg() { if (!loginInfo.identifier) {//未登录 if (accountMode == 1) {//托管模式 //将account_type保存到cookie中,有效期是1天 webim.Tool.setCookie('accountType', loginInfo.accountType, 3600 * 24); //调用tls登录服务 tlsLogin(); } else {//独立模式 console.error('请填写帐号和票据'); } return; } if (!selToID) { console.error("您还没有进入房间,暂不能点赞"); return; } if (!selSess) { selSess = new webim.Session(selType, selToID, selToID, selSessHeadUrl, Math.round(new Date().getTime() / 1000)); } var isSend = true;//是否为自己发送 var seq = -1;//消息序列,-1表示sdk自动生成,用于去重 var random = Math.round(Math.random() * 4294967296);//消息随机数,用于去重 var msgTime = Math.round(new Date().getTime() / 1000);//消息时间戳 //群消息子类型如下: //webim.GROUP_MSG_SUB_TYPE.COMMON-普通消息, //webim.GROUP_MSG_SUB_TYPE.LOVEMSG-点赞消息,优先级最低 //webim.GROUP_MSG_SUB_TYPE.TIP-提示消息(不支持发送,用于区分群消息子类型), //webim.GROUP_MSG_SUB_TYPE.REDPACKET-红包消息,优先级最高 var subType = webim.GROUP_MSG_SUB_TYPE.LOVEMSG; var msg = new webim.Msg(selSess, isSend, seq, random, msgTime, loginInfo.identifier, subType, loginInfo.identifierNick); var msgtosend = 'love_msg'; var text_obj = new webim.Msg.Elem.Text(msgtosend); msg.addText(text_obj); webim.sendMsg(msg, function (resp) { if (selType == webim.SESSION_TYPE.C2C) {//私聊时,在聊天窗口手动添加一条发的消息,群聊时,长轮询接口会返回自己发的消息 showMsg(msg); } webim.Log.info("点赞成功"); }, function (err) { webim.Log.error("发送点赞消息失败:" + err.ErrorInfo); console.error("发送点赞消息失败:" + err.ErrorInfo); }); } //隐藏评论文本框 function hideDiscussForm() { //$(".video-discuss-form").hide(); } //显示评论文本框 function showDiscussForm() { //$(".video-discuss-form").show(); } //隐藏评论工具栏 function hideDiscussTool() { //$(".video-discuss-tool").hide(); } //显示评论工具栏 function showDiscussTool() { //$(".video-discuss-tool").show(); } //隐藏表情框 function hideDiscussEmotion() { //$(".video-discuss-emotion").hide(); ////$(".video-discuss-emotion").fadeOut("slow"); } //显示表情框 function showDiscussEmotion() { //$(".video-discuss-emotion").show(); //$(".video-discuss-emotion").fadeIn("slow"); } //展示点赞动画 function showLoveMsgAnimation() { //点赞数加1 // var loveCount = $('#user-icon-like').html(); // $('#user-icon-like').html(parseInt(loveCount) + 1); // var toolDiv = document.getElementById("video-discuss-tool"); // var loveSpan = document.createElement("span"); // var colorList = ['red', 'green', 'blue']; // var max = colorList.length - 1; // var min = 0; // var index = parseInt(Math.random() * (max - min + 1) + min, max + 1); // var color = colorList[index]; // loveSpan.setAttribute('class', 'like-icon zoomIn ' + color); // toolDiv.appendChild(loveSpan); } //初始化表情 function initEmotionUL() { return; for (var index in webim.Emotions) { var emotions = $('').attr({ "id": webim.Emotions[index][0], "src": webim.Emotions[index][1], "style": "cursor:pointer;" }).click(function () { selectEmotionImg(this); }); $('
  • ').append(emotions).appendTo($('#emotionUL')); } } //打开或显示表情 function showEmotionDialog() { if (openEmotionFlag) {//如果已经打开 openEmotionFlag = false; hideDiscussEmotion();//关闭 } else {//如果未打开 openEmotionFlag = true; showDiscussEmotion();//打开 } } //选中表情 function selectEmotionImg(selImg) { $("#send_msg_text").val($("#send_msg_text").val() + selImg.id); } // 解散群 function destroyGroup() { var options = { 'GroupId': avChatRoomId,//群id Type: 'AVChatRoom' }; webim.destroyGroup( options, function(ret){ webim.Log.info('解散群成功'); selSess = null; } ); } //退出大群 function quitBigGroup() { var options = { 'GroupId': avChatRoomId//群id }; webim.quitBigGroup( options, function (resp) { webim.Log.info('退群成功'); console.log('IM退群成功'); selSess = null; //webim.Log.error('进入另一个大群:'+avChatRoomId2); //applyJoinBigGroup(avChatRoomId2);//加入大群 }, function (err) { console.error(err.ErrorInfo); } ); } //登出 function logout() { //登出 webim.logout( function (resp) { webim.Log.info('登出成功'); console.log('IM登出成功'); if(loginInfo) { loginInfo.identifier = null; loginInfo.userSig = null; } selSess = null; } ); } //监听 申请加群 系统消息 function onApplyJoinGroupRequestNotify(notify) { webim.Log.warn("执行 加群申请 回调:" + JSON.stringify(notify)); var timestamp = notify.MsgTime; var reportTypeCh = "[申请加群]"; var content = notify.Operator_Account + "申请加入你的群"; showGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, timestamp); } //监听 申请加群被同意 系统消息 function onApplyJoinGroupAcceptNotify(notify) { webim.Log.warn("执行 申请加群被同意 回调:" + JSON.stringify(notify)); var reportTypeCh = "[申请加群被同意]"; var content = notify.Operator_Account + "同意你的加群申请,附言:" + notify.RemarkInfo; showGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime); } //监听 申请加群被拒绝 系统消息 function onApplyJoinGroupRefuseNotify(notify) { webim.Log.warn("执行 申请加群被拒绝 回调:" + JSON.stringify(notify)); var reportTypeCh = "[申请加群被拒绝]"; var content = notify.Operator_Account + "拒绝了你的加群申请,附言:" + notify.RemarkInfo; showGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime); } //监听 被踢出群 系统消息 function onKickedGroupNotify(notify) { webim.Log.warn("执行 被踢出群 回调:" + JSON.stringify(notify)); var reportTypeCh = "[被踢出群]"; var content = "你被管理员" + notify.Operator_Account + "踢出该群"; showGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime); } //监听 解散群 系统消息 function onDestoryGroupNotify(notify) { webim.Log.warn("执行 解散群 回调:" + JSON.stringify(notify)); var reportTypeCh = "[群被解散]"; var content = "群主" + notify.Operator_Account + "已解散该群"; showGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime); } //监听 创建群 系统消息 function onCreateGroupNotify(notify) { webim.Log.warn("执行 创建群 回调:" + JSON.stringify(notify)); var reportTypeCh = "[创建群]"; var content = "你创建了该群"; showGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime); } //监听 被邀请加群 系统消息 function onInvitedJoinGroupNotify(notify) { webim.Log.warn("执行 被邀请加群 回调: " + JSON.stringify(notify)); var reportTypeCh = "[被邀请加群]"; var content = "你被管理员" + notify.Operator_Account + "邀请加入该群"; showGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime); } //监听 主动退群 系统消息 function onQuitGroupNotify(notify) { webim.Log.warn("执行 主动退群 回调: " + JSON.stringify(notify)); var reportTypeCh = "[主动退群]"; var content = "你退出了该群"; showGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime); } //监听 被设置为管理员 系统消息 function onSetedGroupAdminNotify(notify) { webim.Log.warn("执行 被设置为管理员 回调:" + JSON.stringify(notify)); var reportTypeCh = "[被设置为管理员]"; var content = "你被群主" + notify.Operator_Account + "设置为管理员"; showGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime); } //监听 被取消管理员 系统消息 function onCanceledGroupAdminNotify(notify) { webim.Log.warn("执行 被取消管理员 回调:" + JSON.stringify(notify)); var reportTypeCh = "[被取消管理员]"; var content = "你被群主" + notify.Operator_Account + "取消了管理员资格"; showGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime); } //监听 群被回收 系统消息 function onRevokeGroupNotify(notify) { webim.Log.warn("执行 群被回收 回调:" + JSON.stringify(notify)); var reportTypeCh = "[群被回收]"; var content = "该群已被回收"; showGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime); } //监听 用户自定义 群系统消息 function onCustomGroupNotify(notify) { webim.Log.warn("执行 用户自定义系统消息 回调:" + JSON.stringify(notify)); var reportTypeCh = "[用户自定义系统消息]"; var content = notify.UserDefinedField;//群自定义消息数据 showGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime); } //监听 群资料变化 群提示消息 function onGroupInfoChangeNotify(groupInfo) { webim.Log.warn("执行 群资料变化 回调: " + JSON.stringify(groupInfo)); var groupId = groupInfo.GroupId; var newFaceUrl = groupInfo.GroupFaceUrl;//新群组图标, 为空,则表示没有变化 var newName = groupInfo.GroupName;//新群名称, 为空,则表示没有变化 var newOwner = groupInfo.OwnerAccount;//新的群主id, 为空,则表示没有变化 var newNotification = groupInfo.GroupNotification;//新的群公告, 为空,则表示没有变化 var newIntroduction = groupInfo.GroupIntroduction;//新的群简介, 为空,则表示没有变化 if (newName) { //更新群组列表的群名称 //To do webim.Log.warn("群id=" + groupId + "的新名称为:" + newName); } } //显示一条群组系统消息 function showGroupSystemMsg(type, typeCh, group_id, group_name, msg_content, msg_time) { var sysMsgStr = "收到一条群系统消息: type=" + type + ", typeCh=" + typeCh + ",群ID=" + group_id + ", 群名称=" + group_name + ", 内容=" + msg_content + ", 时间=" + webim.Tool.formatTimeStamp(msg_time); webim.Log.warn(sysMsgStr); console.error(sysMsgStr); } function init(opts){ accountMode = opts.accountMode; accountType = opts.accountType; sdkAppID = opts.sdkAppID; avChatRoomId = opts.avChatRoomId || 0; selType = opts.selType; selToID = opts.selToID; } module.exports = { init : init, onBigGroupMsgNotify : onBigGroupMsgNotify, onMsgNotify : onMsgNotify, handlderMsg : handlderMsg, sdkLogin : sdkLogin, createBigGroup : createBigGroup, applyJoinBigGroup : applyJoinBigGroup, showMsg : showMsg, convertMsgtoHtml : convertMsgtoHtml, convertTextMsgToHtml : convertTextMsgToHtml, convertFaceMsgToHtml : convertFaceMsgToHtml, convertImageMsgToHtml : convertImageMsgToHtml, convertSoundMsgToHtml : convertSoundMsgToHtml, convertFileMsgToHtml : convertFileMsgToHtml, convertLocationMsgToHtml : convertLocationMsgToHtml, convertCustomMsgToHtml : convertCustomMsgToHtml, convertGroupTipMsgToHtml : convertGroupTipMsgToHtml, tlsLogin : tlsLogin, tlsGetUserSig : tlsGetUserSig, imageClick : imageClick, onChangePlayAudio : onChangePlayAudio, smsPicClick : smsPicClick, onSendMsg : onSendMsg, sendCustomMsg : sendCustomMsg, sendC2CCustomMsg : sendC2CCustomMsg, sendGroupLoveMsg : sendGroupLoveMsg, hideDiscussForm : hideDiscussForm, showDiscussForm : showDiscussForm, hideDiscussTool : hideDiscussTool, showDiscussTool : showDiscussTool, hideDiscussEmotion : hideDiscussEmotion, showDiscussEmotion : showDiscussEmotion, showLoveMsgAnimation : showLoveMsgAnimation, initEmotionUL : initEmotionUL, showEmotionDialog : showEmotionDialog, selectEmotionImg : selectEmotionImg, quitBigGroup : quitBigGroup, destroyGroup : destroyGroup, logout : logout, onApplyJoinGroupRequestNotify : onApplyJoinGroupRequestNotify, onApplyJoinGroupAcceptNotify : onApplyJoinGroupAcceptNotify, onApplyJoinGroupRefuseNotify : onApplyJoinGroupRefuseNotify, onKickedGroupNotify : onKickedGroupNotify, onDestoryGroupNotify : onDestoryGroupNotify, onCreateGroupNotify : onCreateGroupNotify, onInvitedJoinGroupNotify : onInvitedJoinGroupNotify, onQuitGroupNotify : onQuitGroupNotify, onSetedGroupAdminNotify : onSetedGroupAdminNotify, onCanceledGroupAdminNotify : onCanceledGroupAdminNotify, onRevokeGroupNotify : onRevokeGroupNotify, onCustomGroupNotify : onCustomGroupNotify, onGroupInfoChangeNotify : onGroupInfoChangeNotify, showGroupSystemMsg : showGroupSystemMsg };