小程序

腾讯云通讯IM 接入小程序 (二)收发消息

2019-08-16  本文已影响0人  彬_哥哥

消息分为两种 : 发送消息 接收消息 (目前我用到的是单对单的聊天 1v1)

*发送消息 : 1、发送普通文字消息 。 2、发送表情。 3、发送图片。4、发送语言。(常用的就这)
*接收消息: 文字、表情、图片、语言等 包括最近七天之内的历史消息等

QQ图片20190617160054.png

1 .收消息

/* function getC2CHistoryMsgs
 * 拉取C2C漫游消息
 * params:
 *   options    - 请求参数
 *   cbOk    - function(msgList)类型, 成功时的回调函数, msgList 为消息数组,格式为[Msg 对象],
 *   cbErr    - function(err)类型, 失败时回调函数, err 为错误对象
 * return:
 *   (无)
 */


//获取最新的 C2C 历史消息,用于切换好友聊天,重新拉取好友的聊天消息
var getLastC2CHistoryMsgs = function (cbOk, cbError) {
    if (selType == webim.SESSION_TYPE.GROUP) {
        alert('当前的聊天类型为群聊天,不能进行拉取好友历史消息操作');
        return;
    }
    var lastMsgTime = 0;//第一次拉取好友历史消息时,必须传0
    var msgKey = '';
    var options = {
        'Peer_Account': selToID, //好友帐号,selToID 为全局变量,表示当前正在进行的聊天 ID,当聊天类型为私聊时,该值为好友帐号,否则为群号。
        'MaxCnt': reqMsgCount, //拉取消息条数
        'LastMsgTime': lastMsgTime, //最近的消息时间,即从这个时间点向前拉取历史消息
        'MsgKey': msgKey
    };
    webim.getC2CHistoryMsgs(
            options,
            function (resp) {
                var complete = resp.Complete;//是否还有历史消息可以拉取,1表示没有,0表示有
                var retMsgCount = resp.MsgCount;//返回的消息条数,小于或等于请求的消息条数,小于的时候,说明没有历史消息可拉取了
                if (resp.MsgList.length == 0) {
                    webim.Log.error("没有历史消息了:data=" + JSON.stringify(options));
                    return;
                }
                getPrePageC2CHistroyMsgInfoMap[selToID] = {//保留服务器返回的最近消息时间和消息 Key,用于下次向前拉取历史消息
                    'LastMsgTime': resp.LastMsgTime,
                    'MsgKey': resp.MsgKey
                };
                if (cbOk)
                    cbOk(resp.MsgList);
            },
            cbError
            );
};

//获取所有会话 (这里可以根据需求使用)
var sessMap = webim.MsgStore.sessMap();
for (var i in sessMap) {
       sess = sessMap[i];
       if (selToID != sess.id()) {//更新其他聊天对象的未读消息数,selToID 为全局变量,表示当前正在进行的聊天 ID,当聊天类型为私聊时,该值为好友帐号,否则为群号。
           updateSessDiv(sess.type(), sess.id(), sess.unread());
       }
}

1 .发送消息

//发送消息(文本或者表情)
function onSendMsg() {
    if (!selToID) {    // selToID 为全局变量,表示当前正在进行的聊天 ID,当聊天类型为私聊时,该值为好友帐号,否则为群号。
        alert("您还没有选中好友或者群组,暂不能聊天");
        $("#send_msg_text").val('');
        return;
    }
    //获取消息内容
    var msgtosend = document.getElementsByClassName("msgedit")[0].value;
    var msgLen = webim.Tool.getStrBytes(msgtosend);
    if (msgtosend.length < 1) {
        alert("发送的消息不能为空!");
        $("#send_msg_text").val('');
        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;
    }
    if (!selSess) {
      var  selSess = new webim.Session(selType, selToID, selToID, friendHeadUrl, Math.round(new Date().getTime() / 1000));
    }
    var isSend = true;//是否为自己发送
    var seq = -1;//消息序列,-1表示 IM SDK 自动生成,用于去重
    var random = Math.round(Math.random() * 4294967296);//消息随机数,用于去重
    var msgTime = Math.round(new Date().getTime() / 1000);//消息时间戳
    var subType;//消息子类型
    if (selType == webim.SESSION_TYPE.C2C) {
        subType = webim.C2C_MSG_SUB_TYPE.COMMON;
    } else {
        //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;
    }
    var msg = new webim.Msg(selSess, isSend, seq, random, msgTime, loginInfo.identifier, subType, loginInfo.identifierNick);   
    var text_obj, face_obj, tmsg, emotionIndex, emotion, restMsgIndex;
    //解析文本和表情
    var expr = /\[[^[\]]{1,3}\]/mg;
    var emotions = msgtosend.match(expr);
    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.Tool.setCookie("tmpmsg_" + selToID, '', 0);
        $("#send_msg_text").val('');
        turnoffFaces_box();
    }, function (err) {
        alert(err.ErrorInfo);
        $("#send_msg_text").val('');
    });
}

腾讯云IM中获取用户头像的方法:

主要的方法是:webim.getProfilePortrait(options,cbOk,cbErr);
options里面主要是id和profileitem,根据官方文档指示,大概是:
{
    "To_Account":["id1"], //需要获得资料的用户的id
    "TagList":
    [
        "Tag_Profile_IM_Nick"//比如这就是昵称。我们这边主要是需要头像和昵称
    ]
}

var tag_list = new Array();
tag_list.push("Tag_Profile_IM_Nick");
tag_list.push("Tag_Profile_IM_Image");
var options = {};
var account = new Array();
var userId = selSess.getFromAccount();
account.push(userId);
options.To_Account = account;
options.TagList = tag_list;
//现目前只记起这种书写方式 --!然后

 webim.getProfilePortrait(
    options,
    function (res) {
    //这里面的数据就是用户的资料了,当然是获得的你所写了的资料
     var UserProfileItem = res.UserProfileItem;
     //嗯,是个数组
     var C2cNick, C2cImage;
     for (var i = 0; i < UserProfileItem.length; i++) {
         var data = UserProfileItem[i].ProfileItem;
         C2cNick = data[0].Value;
         C2cImage = data[1].Value;
     }
 })

到这里基本都差别多了,这里很多代码都是官方的我们需要使用只需要调用就行了;
var webimhandler = require('../../../utils/webim_handler.js');这个JS文件是官方封装好了的直接调用里面方法即可。有问题多百度,多看文档。千万别问我,因为我也不知道;

上一篇下一篇

猜你喜欢

热点阅读