Vue3接入悟空IM实现直播评论互动需求 前端即时通讯
之前用websocket实现过跨端发送和接收任务,不算难。
这次的需求复杂些,需要实现直播的评论互动,改用开源的悟空IM。
安装
npm i wukongimjssdk
引入
import WKSDK from "wukongimjssdk"
- 通过
<script>
标签引入使用必须都加前缀 wk, 例如wk.WKSDK.shared()
开发需要的API:
// 集群模式通过此方法获取连接地址
// WKSDK.shared().config.provider.connectAddrCallback = async (callback: ConnectAddrCallback) => {
// const addr = await xxxx // addr 格式为 ip:port
// callback(addr)
// }
// 单机模式可以直接设置地址
WKSDK.shared().config.addr = 'ws://IP:PORT'; // 默认端口为5200
// 认证信息
WKSDK.shared().config.uid = 'xxxx'; // 用户uid(需要在悟空通讯端注册过)
WKSDK.shared().config.token = 'xxxx'; // 用户token (需要在悟空通讯端注册过)
// 连接
WKSDK.shared().connectManager.connect();
// 断开
WKSDK.shared().connectManager.disconnect();
// 连接状态监听
WKSDK.shared().connectManager.addConnectStatusListener(
(status: ConnectStatus, reasonCode?: number) => {
if (status === ConnectStatus.Connected) {
console.log('连接成功');
} else {
console.log('连接失败', reasonCode); // reasonCode: 2表示认证失败(uid或token错误)
}
},
);
/**
* 发送消息
* @param content 消息内容
* @param channel 频道对象 个人频道,群频道
* @returns 完整消息对象
*/
WKSDK.shared().chatManager.send(content: MessageContent, channel: Channel)
// 案例
// 导入 对应的包
import { MessageText,Channel,WKSDK,ChannelTypePerson,ChannelTypeGroup } from "wukongimjssdk";
// 例如发送文本消息hello给用户u10001
const text = new MessageText("hello") // 文本消息
WKSDK.shared().chatManager.send(text,new Channel("u10001",ChannelTypePerson))
// 例如发送文本消息hello给群频道g10001
WKSDK.shared().chatManager.send(text,new Channel("g10001",ChannelTypeGroup))
// 文本消息
const msgContent = new MessageText("hello")
// 发送
WKSDK.shared().chatManager.send(msgContent,channel)
- 监听消息发送状态
const listen = (packet: SendackPacket) => {
console.log('消息clientSeq->', packet.clientSeq); // 消息客户端序号用来匹配对应的发送的消息
if (packet.reasonCode === 1) {
// 发送成功
} else {
// 发送失败
}
}
- 添加监听
// 消息发送状态监听
WKSDK.shared().chatManager.addMessageStatusListener(listen);
- 移除监听
// 消息发送状态监听
WKSDK.shared().chatManager.removeMessageStatusListener(listen)
- 监听常规消息
const listen = (message: Message) => {
message.content // 消息内容
message.channel // 消息频道
message.fromUID // 消息发送者
....
}
- 添加监听
WKSDK.shared().chatManager.addMessageListener(listen);
- 移除监听
WKSDK.shared().chatManager.removeMessageListener(listen)
- 获取某个频道历史消息
const messages = await WKSDK.shared().chatManager.syncMessages(channel, opts)
//opts参数解释
{
startMessageSeq: number = 0 // 开始消息列号(结果包含startMessageSeq的消息)
endMessageSeq: number = 0 // 结束消息列号(结果不包含endMessageSeq的消息)0表示不限制
limit: number = 30 // 每次限制数量
pullMode: PullMode = PullMode.Down // 拉取模式 0:向下拉取 1:向上拉取
}
//详解
以startMessageSeq为基准 pullMode控制拉取方向,endMessageSeq和limit控制结束位置
------------------ 上拉 ------------------
pullMode为1 表示向上拉,逻辑如下:
消息以startMessageSeq为起点,加载大于或等于startMessageSeq的消息,加载到超过endMessageSeq(结果不包含endMessageSeq)或超过limit为止,如果endMessageSeq为0则以limit为准
例如:
startMessageSeq=100 endMessageSeq=200 limit=10 以limit为准,则返回的messageSeq为100-110的消息.
startMessageSeq=100 endMessageSeq=105 limit=10 以endMessageSeq为准,则返回的messageSeq为100-104的消息
startMessageSeq=100 endMessageSeq=0 limit=10 以limit为准,则返回的messageSeq为100-110的消息
------------------ 下拉 ------------------
pullMode为0 表示向下拉,逻辑如下:
消息以startMessageSeq为起点,加载小于或等于startMessageSeq的消息,加载到超过endMessageSeq(结果不包含endMessageSeq)或超过limit为止,如果endMessageSeq为0则以limit为准
例如:
startMessageSeq=100 endMessageSeq=50 limit=10 以limit为准,则返回的messageSeq为100-91的消息.
startMessageSeq=100 endMessageSeq=95 limit=10 以endMessageSeq为准,则返回的messageSeq为100-96的消息
startMessageSeq=100 endMessageSeq=0 limit=10 以limit为准,则返回的messageSeq为100-91的消息
如果startMessageSeq和endMessageSeq都为0,则不管pullMode为那种都加载最新的limit条消息。
案例
固定频道,可以顺利实现消息发送与监听其他用户发送的消息,其他根据需求自己定义
<template>
<van-field v-model="review" placeholder="说点什么吧~" @keyup.enter="addReview"/>
</template>
import {MessageText,Channel,WKSDK,ChannelTypePerson,ChannelTypeGroup,ConnectStatus} from "wukongimjssdk"
onMounted(() => {
initWukongIM();
});
const review = ref('')
const reviewList = ref([
{title:'用户名A',type:3,content:'进入直播间'},
{title:'系统提示',type:2,content:'互动评论须严格遵守直播规范,严谨传播赌博等非法内容,和谐团结友爱。'},
{title:'直播公告',type:1,content:'每天晚上7:00直播(周一休息哦~)'},
]);
//新增评论
const addReview = ()=>{
if(review.value=='')return;
sendMessage(review.value)
}
const IMChannel = '123456'
async function initWukongIM () {
WKSDK.shared().config.addr = 'ws://60.191.221.232:5200'; // 默认端口为5200 后端联调的地址 自己定义
WKSDK.shared().config.uid = '111'; // 用户uid(需要在悟空通讯端注册过)
WKSDK.shared().config.token = '111'; // 用户token (需要在悟空通讯端注册过)
// 连接
try {
WKSDK.shared().connectManager.connect();
} catch (error) {
console.log('error',error);
}
// 连接状态监听
WKSDK.shared().connectManager.addConnectStatusListener(
async (status, reasonCode) => {
if (status === ConnectStatus.Connected) {
console.log('连接成功');
} else {
console.log('连接失败', reasonCode); // reasonCode: 2表示认证失败(uid或token错误)
}
},
);
// 本地消息发送状态监听
const MessageStatusListener = (packet) => {
console.log('消息clientSeq->', packet.clientSeq); // 消息客户端序号用来匹配对应的发送的消息
if (packet.reasonCode === 1) {
console.log('发送成功')
review.value = ''; // 自己绑定的输入框文本
} else {
console.log('发送失败')
}
}
WKSDK.shared().chatManager.addMessageStatusListener(MessageStatusListener);
//远程消息发送状态监听
const MessageListener = (message) => {
message.channel // 消息频道
message.fromUID // 消息发送者
message.content // 消息内容
console.log('消息频道:',message.channel,'消息发送者:',message.fromUID,'消息内容:',message.content);
if (message.channel?.channelID == IMChannel) {
reviewList.value.unshift({title:message.fromUID,content:message.content.text,type:4}) // 自己定义的消息列表
}
}
WKSDK.shared().chatManager.addMessageListener(MessageListener);
}
// 发消息
function sendMessage(content) {
const text = new MessageText(content) // 文本消息
WKSDK.shared().chatManager.send(text,new Channel(IMChannel,ChannelTypeGroup))// 例如发送文本消息hello给群频道g10001
}
// 断开
function disconnect() {
WKSDK.shared().connectManager.disconnect();
// 移除消息发送状态监听
WKSDK.shared().chatManager.removeMessageStatusListener(MessageStatusListener)
// 移除远程消息发送状态监听
WKSDK.shared().chatManager.removeMessageListener(MessageListener)
// 移除订阅者监听
WKSDK.shared().channelManager.removeSubscriberChangeListener(listenChannelMember)
}
原文地址:https://blog.csdn.net/Beatingworldline/article/details/140485444
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!