230 lines
5.5 KiB
JavaScript
230 lines
5.5 KiB
JavaScript
|
|
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;
|
|||
|
|
} // 解析群系统消息
|
|||
|
|
|
|||
|
|
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;
|
|||
|
|
}
|