const webim = require('../../../utils/webim_wx'); module.exports = { initData(userData, groupData = {}) { this.userData = userData || {}; this.userData['accountType'] = 1; this.groupData = groupData || {}; this.groupData['sessionType'] = webim.SESSION_TYPE.GROUP; this.selSess = null; // 当前会话 this.selSessHeadUrl = null; // 当前会话头像 }, /** * 初始化登录IM的监听函数 * @param {Object} loginListeners */ initLoginListeners(loginListeners) { this.loginListeners = loginListeners; }, /** * 登录IM * @param {Function} success * @param {Function} fail */ loginIm(success, fail) { webim.login(this.userData, this.loginListeners, { isAccessFormalEnv: true, isLogOn: false }, success, fail); }, /** * 注销IM */ logout() { webim.logout(); }, /** * 创建群组 * @param {*} groupId 群组ID * @param {*} userID 用户ID * @param {*} succ 成功回调 * @param {*} fail 失败回调 */ createGroup(groupId, userID, succ, fail) { var options = { 'GroupId': String(groupId), 'Owner_Account': String(userID), 'Type': "AVChatRoom", //Private/Public/ChatRoom/AVChatRoom 'ApplyJoinOption': 'FreeAccess', 'Name': String(groupId), 'Notification': "", 'Introduction': "", 'MemberList': [], }; webim.createGroup( options, function (resp) { if (succ) succ(); }, function (err) { if (err.ErrorCode == 10025 || err.ErrorCode == 10021) { if (succ) succ(); } else { if (fail) fail(err); } } ); }, /** * 加入群组 * @param {*} groupId 群组ID * @param {*} succ 成功回调 * @param {*} fail 失败回调 */ joinGroup(groupId, succ, fail) { var self = this; this.selSess = null; // 先创建群,成功后加入群 this.createGroup(groupId, this.userData.identifier, () => { webim.applyJoinBigGroup({ GroupId: String(groupId) }, function (resp) { //JoinedSuccess:加入成功; WaitAdminApproval:等待管理员审批 if (resp.JoinedStatus && resp.JoinedStatus == 'JoinedSuccess') { self.groupData['groupId'] = groupId; succ && succ(resp); } else { fail && fail(resp); } }, function (err) { if (err.ErrorCode == 10013) { // 被邀请加入的用户已经是群成员,也表示成功 self.groupData['groupId'] = groupId; console.warn('applyJoinGroupSucc', groupId) return; } if (fail) { fail(err); } } ); }, fail); }, /** * 发送C2C文本消息 * @param {string} msg * @param {function} succ * @param {function} fail */ sendC2CTextMsg(receiveUser, msg, succ, fail) { this.sendTextMessage(webim.SESSION_TYPE.C2C, receiveUser, msg, succ, fail); }, /** * 发送C2C自定义消息 * @param {object} msgObj {data: 'xxx', desc: 'xxxx', ext: 'xxxx'} * @param {function} succ * @param {function} fail */ sendC2CCustomMsg(toUser, msgObj, succ, fail) { this.sendCustomMsg(webim.SESSION_TYPE.C2C, toUser, msgObj, succ, fail); }, /** * 发送群组文本消息 * @param {string} msg * @param {function} succ * @param {function} fail */ sendGroupTextMsg(msg, succ, fail) { this.sendTextMessage(webim.SESSION_TYPE.GROUP, null, msg, succ, fail); }, /** * 发送群组自定义消息 * @param {object} msgObj {data: 'xxx', desc: 'xxxx', ext: 'xxxx'} * @param {function} succ * @param {function} fail */ sendGroupCustomMsg(msgObj, succ, fail) { this.sendCustomMsg(webim.SESSION_TYPE.GROUP, null, msgObj, succ, fail); }, /** * 发送普通文本消息 * @param {*} selType 接收方类型(个人/群组) * @param {*} msgText 消息内容 * @param {*} toUser 接收方ID */ sendTextMessage(selType, toUser, msgText, succ, fail) { var maxLen, errInfo; if (selType == webim.SESSION_TYPE.C2C) { if (!toUser) { fail && fail(-1, '没有接收人'); return; } maxLen = webim.MSG_MAX_LENGTH.C2C; errInfo = "消息长度超出限制(最多" + Math.round(maxLen / 3) + "汉字)"; } else { maxLen = webim.MSG_MAX_LENGTH.GROUP; errInfo = "消息长度超出限制(最多" + Math.round(maxLen / 3) + "汉字)"; } if (msgText.length < 1) { fail && fail(-2, '不能发送空消息'); return; } var msgLen = webim.Tool.getStrBytes(msgText); if (msgLen > maxLen) { fail && fail(-3, errInfo); return; } var selSess = null; var subType; //消息子类型 // 如果是发给群组 if (selType == webim.SESSION_TYPE.GROUP) { var groupId = this.groupData['groupId']; selSess = new webim.Session(webim.SESSION_TYPE.GROUP, groupId, groupId); subType = webim.GROUP_MSG_SUB_TYPE.COMMON; } else { subType = webim.C2C_MSG_SUB_TYPE.COMMON; selSess = new webim.Session(selType, toUser, toUser, '', this.getUnixTimestamp()); } var isSend = true; //是否为自己发送 var seq = -1; //消息序列,-1表示 SDK 自动生成,用于去重 var random = Math.round(Math.random() * 4294967296); //消息随机数,用于去重 var msgTime = this.getUnixTimestamp(); //消息时间戳 var msg = new webim.Msg(selSess, isSend, seq, random, msgTime, this.userData.identifier, subType, this.userData.identifierNick); var text_obj, face_obj, tmsg, emotionIndex, emotion, restMsgIndex; //解析文本和表情 var expr = /\[[^[\]]{1,3}\]/mg; var emotions = msgText.match(expr); if (!emotions || emotions.length < 1) { text_obj = new webim.Msg.Elem.Text(msgText); msg.addText(text_obj); } else { for (var i = 0; i < emotions.length; i++) { tmsg = msgText.substring(0, msgText.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 = msgText.indexOf(emotions[i]) + emotions[i].length; msgText = msgText.substring(restMsgIndex); } if (msgText) { text_obj = new webim.Msg.Elem.Text(msgText); msg.addText(text_obj); } } webim.sendMsg(msg, function (resp) { succ && succ(msg); }, function (err) { fail && fail(-4, err); }); }, /** * 发送自定义消息 * @param {*} selType 接收方类型(个人/群组) * @param {*} msgObj 消息内容 * @param {*} toUser 接收方ID */ sendCustomMsg(selType, toUser, msgObj, succ, fail) { var maxLen, errInfo; if (selType == webim.SESSION_TYPE.C2C) { if (!toUser) { event.fire(this, Constant.EVENT.IM.SEND_CHAT_MSG_EMPTY_RECEIVE_ERROR, JSON.stringify(msgObj)); fail && fail(-1, '没有接收人'); return; } maxLen = webim.MSG_MAX_LENGTH.C2C; errInfo = "消息长度超出限制(最多" + Math.round(maxLen / 3) + "汉字)"; } else { maxLen = webim.MSG_MAX_LENGTH.GROUP; errInfo = "消息长度超出限制(最多" + Math.round(maxLen / 3) + "汉字)"; } var data = msgObj.data + ''; var desc = msgObj.desc; var ext = msgObj.ext; var msgLen = webim.Tool.getStrBytes(data); if (data.length < 1) { fail && fail(-2, '不能发送空消息'); return; } if (msgLen > maxLen) { fail && fail(-3, errInfo); return; } var selSess = null; var subType; //消息子类型 // 如果是发给群组 if (selType == webim.SESSION_TYPE.GROUP) { var groupId = this.groupData['groupId']; selSess = new webim.Session(webim.SESSION_TYPE.GROUP, groupId, groupId); subType = webim.GROUP_MSG_SUB_TYPE.COMMON; } else { selSess = new webim.Session(selType, toUser, toUser, '', this.getUnixTimestamp()); subType = webim.C2C_MSG_SUB_TYPE.COMMON; } var isSend = true; //是否为自己发送 var seq = -1; //消息序列,-1表示 SDK 自动生成,用于去重 var random = Math.round(Math.random() * 4294967296); //消息随机数,用于去重 var msgTime = this.getUnixTimestamp(); //消息时间戳 var msg = new webim.Msg(selSess, isSend, seq, random, msgTime, this.userData.identifier, subType, this.userData.identifierNick); var custom_obj = new webim.Msg.Elem.Custom(data, desc, ext); msg.addCustom(custom_obj); //调用发送消息接口 webim.sendMsg(msg, function (resp) { // if (selType == webim.SESSION_TYPE.C2C) { //私聊时,在聊天窗口手动添加一条发的消息,群聊时,长轮询接口会返回自己发的消息 // succ && succ(msg); // } succ && succ(msg); }, function (err) { fail && fail(-4, err); }); }, /** * 获取unixTimestamp时间戳 */ getUnixTimestamp() { return Math.round(new Date().getTime() / 1000); }, /** * 组织自定义消息体 * @param {*} msg 要发送的消息 * @param {*} succ */ formatCustomMsg(msg) { // custom消息 var data = msg.data || ''; var desc = msg.desc || ''; var ext = msg.ext || ''; if (!this.selSess) { this.selSess = new webim.Session(this.groupData.sessionType, this.groupData.groupId, this.groupData.groupId, this.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 (this.groupData.sessionType == 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(this.selSess, isSend, seq, random, msgTime, this.userData.identifier, subType, this.userData.identifierNick); var custom_obj = new webim.Msg.Elem.Custom(data, desc, ext); msg.addCustom(custom_obj); return msg; }, /** * G * @param {*} toUserID * @param {*} msg */ formatC2CCustomMsg(toUserID, msg) { // custom消息 var data = msg.data || ''; var desc = msg.desc || ''; var ext = msg.ext || ''; var msgLen = webim.Tool.getStrBytes(data); 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, this.userData.identifier, subType, this.userData.identifierNick); var custom_obj = new webim.Msg.Elem.Custom(data, desc, ext); msg.addCustom(custom_obj); return msg; } }