123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- import { formatTime } from "./date.ts";
- import { decodeText } from "./decodeText";
- import { bigEmojiList } from "./emojiMap";
- // 处理头像
- export function handleAvatar(item: any) {
- let avatar = "";
- if (item.type === uni.$TIM.TYPES.CONV_C2C) {
- avatar =
- item?.userProfile?.avatar ||
- "https://web.sdk.qcloud.com/component/TUIKit/assets/avatar_21.png";
- } else {
- avatar =
- item?.groupProfile?.avatar ||
- "https://web.sdk.qcloud.com/component/TUIKit/assets/group_avatar.png";
- }
- return avatar;
- }
- // 处理昵称
- export function handleName(item: any) {
- let name = "";
- switch (item.type) {
- case uni.$TIM.TYPES.CONV_C2C:
- name = item?.userProfile.nick || item?.userProfile?.userID || "";
- break;
- case uni.$TIM.TYPES.CONV_GROUP:
- name = item.groupProfile.name || item?.groupProfile?.groupID || "";
- break;
- case uni.$TIM.TYPES.CONV_SYSTEM:
- name = "系统通知";
- break;
- }
- return name;
- }
- // 处理系统提示消息展示
- export function handleTipMessageShowContext(message: any) {
- const options: any = {
- message,
- text: "",
- };
- const userName = message.nick || message.payload.userIDList.join(",");
- switch (message.payload.operationType) {
- case uni.$TIM.TYPES.GRP_TIP_MBR_JOIN:
- options.text = `群成员:${userName} 加入群组`;
- break;
- case uni.$TIM.TYPES.GRP_TIP_MBR_QUIT:
- options.text = `群成员:${userName} 退出群组`;
- break;
- case uni.$TIM.TYPES.GRP_TIP_MBR_KICKED_OUT:
- options.text = `群成员:${userName} 被 ${message.payload.operatorID} 踢出群组`;
- break;
- case uni.$TIM.TYPES.GRP_TIP_MBR_SET_ADMIN:
- options.text = `群成员:${userName} 成为管理员`;
- break;
- case uni.$TIM.TYPES.GRP_TIP_MBR_CANCELED_ADMIN:
- options.text = `群成员:${userName} 被撤销管理员`;
- break;
- case uni.$TIM.TYPES.GRP_TIP_GRP_PROFILE_UPDATED:
- // options.text = `${userName} 修改群组资料`;
- options.text = handleTipGrpUpdated(message);
- break;
- case uni.$TIM.TYPES.GRP_TIP_MBR_PROFILE_UPDATED:
- for (const member of message.payload.memberList) {
- if (member.muteTime > 0) {
- // options.text = `群成员:${member.userID}被禁言${member.muteTime}秒`;
- options.text = `群成员:${member.userID} 被禁言`;
- } else {
- options.text = `群成员:${member.userID} 被取消禁言`;
- }
- }
- break;
- default:
- options.text = `[群提示消息]`;
- break;
- }
- return options;
- }
- function handleTipGrpUpdated(message: any) {
- const { payload } = message;
- const { newGroupProfile } = payload;
- const { operatorID } = payload;
- let text = "";
- const name = Object.keys(newGroupProfile)[0];
- switch (name) {
- case "ownerID":
- text = `${newGroupProfile[name]} 成为新的群主`;
- break;
- case "groupName":
- text = `${operatorID} 修改群名为 ${newGroupProfile[name]}`;
- break;
- case "notification":
- text = `${operatorID} 发布新公告`;
- break;
- default:
- break;
- }
- return text;
- }
- // 解析处理文本消息展示
- export function handleTextMessageShowContext(item: any) {
- const options: any = {
- text: decodeText(item.payload),
- };
- return options;
- }
- // 解析处理表情消息展示
- export function handleFaceMessageShowContext(item: any) {
- const face: any = {
- message: item,
- name: "",
- url: "",
- };
- const currentEmojiList = bigEmojiList.filter(
- (emoItem: any) => emoItem.icon === item.payload.data
- );
- if (currentEmojiList.length > 0) {
- face.name = currentEmojiList[0].list[item.payload.index];
- }
- // 与native 互通兼容
- if (item.payload.data.indexOf("@2x") > 0) {
- face.name = item.payload.data;
- } else {
- face.name = `${item.payload.data}@2x`;
- }
- face.url = `https://web.sdk.qcloud.com/im/assets/face-elem/${face.name}.png`;
- return face;
- }
- // 解析处理位置消息展示
- export function handleLocationMessageShowContext(item: any) {
- const location: any = {
- lon: "",
- lat: "",
- href: "",
- url: "",
- description: "",
- message: item,
- };
- location.lon = item.payload.longitude.toFixed(6);
- location.lat = item.payload.latitude.toFixed(6);
- location.href =
- "https://map.qq.com/?type=marker&isopeninfowin=1&markertype=1&" +
- `pointx=${location.lon}&pointy=${location.lat}&name=${item.payload.description}`;
- location.url =
- "https://apis.map.qq.com/ws/staticmap/v2/?" +
- `center=${location.lat},${location.lon}&zoom=10&size=300*150&maptype=roadmap&` +
- `markers=size:large|color:0xFFCCFF|label:k|${location.lat},${location.lon}&` +
- "key=UBNBZ-PTP3P-TE7DB-LHRTI-Y4YLE-VWBBD";
- location.description = item.payload.description;
- return location;
- }
- // 解析处理图片消息展示
- export function handleImageMessageShowContext(item: any) {
- return {
- progress: item?.status === "unSend" && item.progress,
- info: item.payload.imageInfoArray,
- message: item,
- };
- }
- // 解析处理视频消息展示
- export function handleVideoMessageShowContext(item: any) {
- return {
- progress: item?.status === "unSend" && item?.progress,
- url: item?.payload?.videoUrl,
- snapshotUrl: item?.payload?.snapshotUrl,
- message: item,
- };
- }
- // 解析处理语音消息展示
- export function handleAudioMessageShowContext(item: any) {
- return {
- progress: item?.status === "unSend" && item.progress,
- url: item.payload.url,
- message: item,
- second: item.payload.second,
- };
- }
- // 解析处理文件消息展示
- export function handleFileMessageShowContext(item: any) {
- let size = "";
- if (item.payload.fileSize >= 1024 * 1024) {
- size = `${(item.payload.fileSize / (1024 * 1024)).toFixed(2)} Mb`;
- } else if (item.payload.fileSize >= 1024) {
- size = `${(item.payload.fileSize / 1024).toFixed(2)} Kb`;
- } else {
- size = `${item.payload.fileSize.toFixed(2)}B`;
- }
- return {
- progress: item?.status === "unSend" && item.progress,
- url: item.payload.fileUrl,
- message: item,
- name: item.payload.fileName,
- size,
- };
- }
- // 解析处理合并消息展示
- export function handleMergerMessageShowContext(item: any) {
- return { message: item, ...item.payload };
- }
- // 解析音视频通话消息
- export function extractCallingInfoFromMessage(message: any) {
- let callingmessage: any = {};
- let objectData: any = {};
- try {
- callingmessage = JSON.parse(message.payload.data);
- } catch (error) {
- callingmessage = {};
- }
- if (callingmessage.businessID !== 1) {
- return "";
- }
- try {
- objectData = JSON.parse(callingmessage.data);
- } catch (error) {
- objectData = {};
- }
- switch (callingmessage.actionType) {
- case 1: {
- if (objectData.call_end >= 0 && !callingmessage.groupID) {
- return `通话时长 :${formatTime(objectData.call_end)}`;
- }
- if (callingmessage.groupID) {
- return `结束群聊`;
- }
- if (objectData.data && objectData.data.cmd === "switchToAudio") {
- return `切换语音通话`;
- }
- if (objectData.data && objectData.data.cmd === "switchToVideo") {
- return `切换视频通话`;
- }
- return `发起通话`;
- }
- case 2:
- return `取消通话`;
- case 3:
- if (objectData.data && objectData.data.cmd === "switchToAudio") {
- return `切换语音通话`;
- }
- if (objectData.data && objectData.data.cmd === "switchToVideo") {
- return `切换视频通话`;
- }
- return `已接听`;
- case 4:
- return `拒绝通话`;
- case 5:
- if (objectData.data && objectData.data.cmd === "switchToAudio") {
- return `切换语音通话`;
- }
- if (objectData.data && objectData.data.cmd === "switchToVideo") {
- return `切换视频通话`;
- }
- return `无应答`;
- default:
- return "";
- }
- }
- // 解析处理自定义消息展示
- export function handleCustomMessageShowContext(item: any) {
- return {
- message: item,
- custom:
- extractCallingInfoFromMessage(item) ||
- item?.payload?.extension ||
- `[自定义消息]`,
- };
- }
- // 解析处理系统消息
- export function translateGroupSystemNotice(message: any) {
- const groupName =
- message.payload.groupProfile?.name || message.payload.groupProfile?.groupID;
- switch (message.payload.operationType) {
- case 1:
- return `${message.payload.operatorID} 申请加入群组:${groupName}`;
- case 2:
- return `成功加入群组:${groupName}`;
- case 3:
- return `申请加入群组:${groupName} 被拒绝`;
- case 4:
- return `你被管理员 ${message.payload.operatorID} 踢出群组:${groupName}`;
- case 5:
- return `群:${groupName} 被 ${message.payload.operatorID} 解散`;
- case 6:
- return `${message.payload.operatorID} 创建群:${groupName}`;
- case 7:
- return `${message.payload.operatorID} 邀请你加群:${groupName}`;
- case 8:
- return `你退出群组:${groupName}`;
- case 9:
- return `你被${message.payload.operatorID} 设置为群:${groupName} 的管理员`;
- case 10:
- return `你被 ${message.payload.operatorID} 撤销群:${groupName} 的管理员身份`;
- case 12:
- return `${message.payload.operatorID} 邀请你加群:${groupName}`;
- case 13:
- return `${message.payload.operatorID} 同意加群 :${groupName}`;
- case 14:
- return `${message.payload.operatorID} 拒接加群 :${groupName}`;
- case 255:
- return `自定义群系统通知: ${message.payload.userDefinedField}`;
- }
- }
|