2024-01-16 14:59:06 +08:00

193 lines
5.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { emojiMap, emojiUrl } from './emojiMap';
/** 传入message.element群系统消息SystemMessage群提示消息GroupTip除外
* content = {
* type: 'TIMTextElem',
* content: {
* text: 'AAA[龇牙]AAA[龇牙]AAA[龇牙AAA]'
* }
*}
**/
// 群提示消息的含义 (opType)
const GROUP_TIP_TYPE = {
MEMBER_JOIN: 1,
MEMBER_QUIT: 2,
MEMBER_KICKED_OUT: 3,
MEMBER_SET_ADMIN: 4, // 被设置为管理员
MEMBER_CANCELED_ADMIN: 5, // 被取消管理员
GROUP_INFO_MODIFIED: 6, // 修改群资料转让群组为该类型msgBody.msgGroupNewInfo.ownerAccount表示新群主的ID
MEMBER_INFO_MODIFIED: 7, // 修改群成员信息
};
// 解析小程序text, 表情信息也是[嘻嘻]文本
export function parseText(message) {
const renderDom = [];
let temp = message.payload.text;
let left = -1;
let right = -1;
while (temp !== '') {
left = temp.indexOf('[');
right = temp.indexOf(']');
switch (left) {
case 0:
if (right === -1) {
renderDom.push({
name: 'span',
text: temp,
});
temp = '';
} else {
const _emoji = temp.slice(0, right + 1);
if (emojiMap[_emoji]) {
renderDom.push({
name: 'img',
src: emojiUrl + emojiMap[_emoji],
});
temp = temp.substring(right + 1);
} else {
renderDom.push({
name: 'span',
text: '[',
});
temp = temp.slice(1);
}
}
break;
case -1:
renderDom.push({
name: 'span',
text: temp,
});
temp = '';
break;
default:
renderDom.push({
name: 'span',
text: temp.slice(0, left),
});
temp = temp.substring(left);
break;
}
}
return renderDom;
}
// 解析群系统消息 operationType详情见 https://web.sdk.qcloud.com/im/doc/preview/Message.html#.GroupSystemNoticePayload
export function parseGroupSystemNotice(message) {
const { payload } = message;
const groupName = payload.groupProfile.name || payload.groupProfile.groupID;
const { groupID } = payload.groupProfile;
let text;
switch (payload.operationType) {
case 1:
text = `${payload.operatorID} 申请加入群组:${groupName}群ID:${groupID})`;
break;
case 2:
text = `成功加入群组:${groupName} 群ID:${groupID})`;
break;
case 3:
text = `申请加入群组:${groupName} 群ID:${groupID})被拒绝`;
break;
case 4:
text = `被管理员${payload.operatorID}踢出群组:${groupName}群ID:${groupID})`;
break;
case 5:
text = `群:${groupName} 群ID:${groupID})已被${payload.operatorID}解散`;
break;
case 6:
text = `用户ID:${payload.operatorID})成功创建群聊:${groupName}群ID:${groupID})`;
break;
case 7:
text = `用户ID${payload.operatorID}邀请你加群:${groupName}群ID:${groupID})`;
break;
case 8:
text = `你退出群组:${groupName}群ID:${groupID})`;
break;
case 9:
text = `你被${payload.operatorID}设置为群:${groupName}群ID:${groupID})的管理员`;
break;
case 10:
text = `你被${payload.operatorID}撤销群:${groupName} 群ID:${groupID})的管理员身份`;
break;
case 255:
text = `自定义群系统通知: ${payload.userDefinedField}`;
break;
}
return text;
}
// 解析群提示消息
export function parseGroupTip(message) {
const { payload } = message;
const userName = message.nick || payload.userIDList.join(',');
let tip;
let user;
switch (payload.operationType) {
case GROUP_TIP_TYPE.MEMBER_JOIN:
tip = `${userName} 加入群聊`;
break;
case GROUP_TIP_TYPE.MEMBER_QUIT:
tip = `群成员退群:${userName}`;
break;
case GROUP_TIP_TYPE.MEMBER_KICKED_OUT:
tip = `群成员被踢:${userName}`;
break;
case GROUP_TIP_TYPE.MEMBER_SET_ADMIN:
tip = `${payload.operatorID}${userName}设置为管理员`;
break;
case GROUP_TIP_TYPE.MEMBER_CANCELED_ADMIN:
tip = `${payload.operatorID}${userName}取消作为管理员`;
break;
case GROUP_TIP_TYPE.GROUP_INFO_MODIFIED:
tip = '群资料修改';
break;
case GROUP_TIP_TYPE.MEMBER_INFO_MODIFIED:
for (const member of payload.memberList) {
if (member.muteTime > 0) {
tip = `群成员:${member.userID}被禁言${member.muteTime}`;
} else {
tip = `群成员:${member.userID}被取消禁言`;
}
}
break;
case 256:
user = message.nick || message.from;
if (payload.text === '无应答') {
user = payload.userIDList.join(',');
}
tip = payload.text === '结束群聊' ? '结束群聊' : `"${user}" ${payload.text}`;
break;
}
return [{
name: 'groupTip',
text: tip,
}];
}
// 解析图片消息
export function parseImage(message) {
const renderDom = [{
name: 'image',
// 这里默认渲染的是 1080P 的图片
src: message.payload.imageInfoArray[0].url,
}];
return renderDom;
}
// 解析视频消息
export function parseVideo(message) {
const renderDom = [{
name: 'video',
src: message.payload.videoUrl,
}];
return renderDom;
}
// 解析语音消息
export function parseAudio(message) {
const renderDom = [{
name: 'audio',
src: message.payload.url,
second: message.payload.second === 0 ? 1 : message.payload.second,
}];
return renderDom;
}