浏览代码

update wfc model and etc.

imndx 2 年之前
父节点
当前提交
22fcfeffb7

+ 2 - 0
wfc/av/engine/callEndReason.js

@@ -20,4 +20,6 @@ export default class CallEndReason {
     static RoomNotExist = 14;
     static RoomParticipantsFull = 15;
 
+    static Interrupted = 16;
+    static RemoteInterrupted = 17;
 }

+ 2 - 2
wfc/av/messages/callStartMessageContent.js

@@ -22,7 +22,7 @@ export default class CallStartMessageContent extends MessageContent {
      * 7, Timeout,
      * 8, AcceptByOtherClient
      */
-    status;
+    status = 0;
     audioOnly;
     pin;
 
@@ -57,7 +57,7 @@ export default class CallStartMessageContent extends MessageContent {
             audioOnly:this.audioOnly,
             participants:this.targetIds,
         }
-        payload.pushData = JSON.toString(pushData);
+        payload.pushData = JSON.stringify(pushData);
         return payload;
     }
 

+ 0 - 1
wfc/av/messages/joinCallRequestMessageContent.js

@@ -3,7 +3,6 @@
  */
 import MessageContent from '../../messages/messageContent';
 import wfc from "../../client/wfc"
-import {_patchToJavaLong, _reverseToJsLongString, longValue, stringValue} from '../../util/longUtil'
 import MessageContentType from '../../messages/messageContentType';
 
 export default class JoinCallRequestMessageContent extends MessageContent {

+ 0 - 1
wfc/av/messages/multiCallOngoingMessageContent.js

@@ -3,7 +3,6 @@
  */
 import MessageContent from '../../messages/messageContent';
 import wfc from "../../client/wfc"
-import {_patchToJavaLong, _reverseToJsLongString, longValue, stringValue} from '../../util/longUtil'
 import MessageContentType from '../../messages/messageContentType';
 
 export default class MultiCallOngoingMessageContent extends MessageContent {

+ 5 - 0
wfc/client/connectionStatus.js

@@ -3,6 +3,8 @@
  */
 
 export default class ConnectionStatus {
+    static ConnectionStatusTimeInconsistent = -9;
+    static ConnectionStatusNotLicensed = -8;
     static ConnectionStatusKickedOff = -7;
     static ConnectionStatusSecretKeyMismatch = -6;
     static ConnectionStatusTokenIncorrect = -5;
@@ -13,8 +15,11 @@ export default class ConnectionStatus {
     static ConnectionStatusConnecting = 0;
     static ConnectionStatusConnected = 1;
     static ConnectionStatusReceiveing = 2;
+
     static desc(status) {
         const desc = {
+            '-9': '客户端和IM 服务端时间不同步,请进行时钟同步',
+            '-8': 'IM 服务未授权或已过期,专业版IM-Server 是绑定域名或者 ip 的,只能通过所绑定的域名去连接',
             '-7': '被踢下线',
             '-6': '会话密钥错误,请参考 https://docs.wildfirechat.cn/faq/general.html 第12个问题排查',
             '-5': 'token错误',

+ 2 - 0
wfc/client/errorCode.js

@@ -20,6 +20,8 @@ export default class ErrorCode {
     static kEcServerFriendRquestBlocked = 18;
     static kEcServerFriendRequestOvertime = 19;
     static kEcServerNotInChatroom = 20;
+    static kEcServerNotLicensed = 22;
+    static kEcServerTimeInconsistent = 30;
     static kEcServerUserIsBlocked = 245;
     static kEcServerInBlacklist = 246;
     static kEcServerForbidden_send_msg = 247;

+ 2 - 3
wfc/client/messageConfig.js

@@ -63,7 +63,6 @@ import MultiCallOngoingMessageContent from "../av/messages/multiCallOngoingMessa
 import JoinCallRequestMessageContent from "../av/messages/joinCallRequestMessageContent";
 import RichNotificationMessageContent from "../messages/notification/richNotificationMessageContent";
 import ArticlesMessageContent from "../messages/articlesMessageContent";
-
 import ChannelMenuEventMessageContent from "../messages/channelMenuEventMessageContent";
 import EnterChannelChatMessageContent from "../messages/enterChannelChatMessageContent";
 import LeaveChannelChatMessageContent from "../messages/leaveChannelChatMessageContent";
@@ -213,13 +212,13 @@ export default class MessageConfig {
         },
         {
             name: 'friendGreeting',
-            flag: PersistFlag.No_Persist,
+            flag: PersistFlag.Persist,
             type: MessageContentType.Friend_Added,
             contentClazz: FriendGreetingNotification,
         },
         {
             name: 'friendAdded',
-            flag: PersistFlag.No_Persist,
+            flag: PersistFlag.Persist,
             type: MessageContentType.Friend_Greeting,
             contentClazz: FriendAddedNotification,
         },

+ 51 - 27
wfc/client/wfc.js

@@ -38,15 +38,12 @@ export class WfcManager {
         };
     }
 
-
     /**
      * 初始化,请参考本demo的用法
-     * 只可以在主窗口调用,其他窗口调用之后,会导致主窗口通知失效。
-     * 如果其他窗口想调用wfc里面的非通知方法,可以参考{@link attach}
      * @param {[]} args,pc 时,传入[node实例]; web 时,可以传入Config配置对象,配置项,请参考{@link Config}
      */
     init(args = []) {
-		console.log('wfc init')
+        console.log('wfc init');
         impl.init(args);
         //avenginekit.setup(self);
         //self.setProxyInfo("", "192.168.1.80", 1080, "", "");
@@ -289,12 +286,26 @@ export class WfcManager {
      * @param {function (number)} fail 失败回调
      */
     getUserInfoEx(userId, refresh, success, fail) {
-        impl.getUserInfoEx(userId, refresh, (info) => {
-            if (!info.portrait || info.portrait.startsWith(Config.APP_SERVER)) {
-                info.portrait = this.defaultUserPortrait(info);
+        impl.getUserInfoEx(userId, refresh, success, fail);
             }
-            success && success(info);
-        }, fail);
+
+    /**
+     * 批量从服务端拉取用户信息
+     * @param {[string]} userIds 用户ids
+     * @param {function ([UserInfo])} successCB 成功回调
+     * @param {function (Number)} failCB 失败回调
+     */
+    getUserInfosEx(userIds,  successCB, failCB) {
+        impl.getUserInfosEx(userIds, userInfos => {
+            userInfos.forEach((u)=>{
+                if(!u.portrait || u.portrait.startsWith(Config.APP_SERVER)){
+                    u.portrait = this.defaultUserPortrait(u);
+                }
+            });
+            successCB && successCB(userInfos);
+        }, err => {
+            failCB && failCB(err);
+        });
     }
 
     /**
@@ -507,12 +518,12 @@ export class WfcManager {
     }
 
     /**
-     * 设置管理员
+     * 设置管理员
      * @param {string} groupId 群id
      * @param {boolean} isSet true,设置;false,取消设置
      * @param {[string]} memberIds 将被设置为管理或取消管理远的群成员的用户id
      * @param {[number]} lines 默认传[0]即可
-     * @param {TODO } notifyContent 默认传null即可
+     * @param {Object} notifyContent 默认传null即可
      * @param {function ()} successCB
      * @param {function (number)} failCB
      * @returns {Promise<void>}
@@ -535,6 +546,12 @@ export class WfcManager {
         return info;
     }
 
+    /**
+     * 批量获取群信息
+     * @param {[string]} groupIds 群id
+     * @param {boolean} refresh 是否刷新,如果刷新,且有更新的话,会通过{@link eventEmitter}通知
+     * @returns {[GroupInfo]}
+     */
     getGroupInfos(groupIds, refresh = false) {
         let infos = impl.getGroupInfos(groupIds, refresh);
         infos.forEach(info => {
@@ -1078,7 +1095,7 @@ export class WfcManager {
     /**
      * 会话置顶或取消置顶
      * @param {Conversation} conversation 需要置顶或取消置顶的会话
-     * @param {int} top 置顶优先级
+     * @param {number} top > 0, 置顶,可以根据这个值进行置顶排序;0,取消置顶
      * @param {function ()} successCB
      * @param {function (number)} failCB
      */
@@ -1161,7 +1178,10 @@ export class WfcManager {
     }
 
     /**
-     * 清楚所有消息的未读状态
+     * 清除所有消息的未读状态
+     *
+     * 特别注意1:本方法只清除了底层数据库中的未读状态,并未清理 UI 层会话列表中的未读状态,UI 层会话列表中的未读状态,需要手动重置。
+     * 特别注意2:本方法不会触发{@link ConversationInfoUpdate} 事件
      */
     clearAllUnreadStatus() {
         impl.clearAllUnreadStatus();
@@ -1526,10 +1546,11 @@ export class WfcManager {
      * 搜索消息
      * @param {Conversation} conversation 目标会话
      * @param {string} keyword 关键字
+     * @param {string} withUser 目标用户
      * @returns {[Message]}
      */
-    searchMessage(conversation, keyword) {
-        return impl.searchMessage(conversation, keyword);
+    searchMessage(conversation, keyword, withUser = '') {
+        return impl.searchMessage(conversation, keyword, withUser);
     }
 
     /**
@@ -1539,10 +1560,11 @@ export class WfcManager {
      * @param {boolean} desc 逆序排列
      * @param {int} limit 返回数量
      * @param {int} offset 偏移
+     * @param {string} withUser 目标用户
      * @returns {Message[]}
      */
-    searchMessageEx(conversation, keyword, desc, limit, offset) {
-        return impl.searchMessageEx(conversation, keyword, desc, limit, offset);
+    searchMessageEx(conversation, keyword, desc, limit, offset, withUser = '') {
+        return impl.searchMessageEx(conversation, keyword, desc, limit, offset, withUser);
     }
 
     /**
@@ -1553,10 +1575,11 @@ export class WfcManager {
      * @param {boolean} desc 逆序排列
      * @param {int} limit 返回数量
      * @param {int} offset 偏移
+     * @param {string} withUser 目标用户
      * @returns {Message[]}
      */
-    searchMessageByTypes(conversation, keyword, contentTypes, desc, limit, offset) {
-        return impl.searchMessageByTypes(conversation, keyword, contentTypes, desc, limit, offset);
+    searchMessageByTypes(conversation, keyword, contentTypes, desc, limit, offset, withUser = '') {
+        return impl.searchMessageByTypes(conversation, keyword, contentTypes, desc, limit, offset, withUser);
     }
 
     /**
@@ -1569,10 +1592,11 @@ export class WfcManager {
      * @param {boolean} desc 逆序排列
      * @param {int} limit 返回数量
      * @param {int} offset 偏移
+     * @param {string} withUser 目标用户
      * @returns {Message[]}
      */
-    searchMessageByTypesAndTimes(conversation, keyword, contentTypes, startTime, endTime, desc, limit, offset) {
-        return impl.searchMessageByTypesAndTimes(conversation, keyword, contentTypes, startTime, endTime, desc, limit, offset);
+    searchMessageByTypesAndTimes(conversation, keyword, contentTypes, startTime, endTime, desc, limit, offset, withUser = '') {
+        return impl.searchMessageByTypesAndTimes(conversation, keyword, contentTypes, startTime, endTime, desc, limit, offset, withUser);
     }
 
     /**
@@ -1584,10 +1608,11 @@ export class WfcManager {
      * @param {number} fromIndex messageId,表示从那一条消息开始获取
      * @param {boolean} desc 逆序排列
      * @param {number} count 最大数量
+     * @param {string} withUser 目标用户
      * @returns {[Message]}
      */
-    searchMessageEx2(conversationTypes, lines, contentTypes, keyword, fromIndex, desc, count) {
-        return impl.searchMessageEx2(conversationTypes, lines, contentTypes, keyword, fromIndex, desc, count);
+    searchMessageEx2(conversationTypes, lines, contentTypes, keyword, fromIndex, desc, count, withUser = '') {
+        return impl.searchMessageEx2(conversationTypes, lines, contentTypes, keyword, fromIndex, desc, count, withUser);
     }
 
     /**
@@ -1601,7 +1626,7 @@ export class WfcManager {
      * @param {function (number)} failCB
      * @returns {Promise<void>}
      */
-    async sendConversationMessage(conversation, messageContent, toUsers, preparedCB, progressCB, successCB, failCB) {
+    async sendConversationMessage(conversation, messageContent, toUsers = [], preparedCB = null, progressCB = null, successCB = null, failCB = null) {
         impl.sendConversationMessage(conversation, messageContent, toUsers, preparedCB, progressCB, successCB, failCB);
     }
 
@@ -1702,13 +1727,12 @@ export class WfcManager {
      * @param {MessageContent} messageContent 具体的消息内容,一定要求是{@link MessageContent} 的子类,不能是普通的object
      * @param {number} status 消息状态,可选值参考{@link MessageStatus}
      * @param {boolean} notify 是否触发onReceiveMessage
-     * @param {[string]} toUsers 定向发送给会话中的某些用户;为空,则发给所有人;另外对单聊会话,本参数无效
      * @param {Number} serverTime 服务器时间,精度到毫秒
      *
      * @return {Message} 插入的消息
      */
-    insertMessage(conversation, messageContent, status, notify = false, toUsers = [], serverTime = 0) {
-        return impl.insertMessage(conversation, messageContent, status, notify, toUsers, serverTime);
+    insertMessage(conversation, messageContent, status, notify = false, serverTime = 0) {
+        return impl.insertMessage(conversation, messageContent, status, notify, serverTime);
     }
 
     /**

+ 7 - 23
wfc/messages/compositeMessageContent.js

@@ -8,6 +8,7 @@ import Long from "long";
 import {compare} from "../util/longUtil";
 import MessagePayload from "../messages/messagePayload";
 import ArticlesMessageContent from "./articlesMessageContent";
+import MessageContentMediaType from "./messageContentMediaType";
 
 export default class CompositeMessageContent extends MediaMessageContent {
     title = '';
@@ -16,7 +17,7 @@ export default class CompositeMessageContent extends MediaMessageContent {
     loaded = false;
 
     constructor() {
-        super(MessageContentType.Composite_Message, '', '')
+        super(MessageContentType.Composite_Message, MessageContentMediaType.General, '')
     }
 
     setMessages(msgs) {
@@ -104,12 +105,6 @@ export default class CompositeMessageContent extends MediaMessageContent {
             let blob = new Blob([str]);
             let fileName = 'wcf-' + new Date().getTime() + '.data';
             this.file = new File([blob], fileName);
-            // if (isElectron()) {
-            //     this.localPath = require('tmp').tmpNameSync() + fileName;
-            //     require('fs').writeFileSync(this.localPath, str);
-            //     payload.localMediaPath = this.localPath;
-            //     payload.mediaType = MessageContentType.File;
-            // }
             obj = {
                 ms: binArr,
             }
@@ -140,24 +135,13 @@ export default class CompositeMessageContent extends MediaMessageContent {
         let str;
         if (this.file) {
             // web
-            // let fileReader = new FileReader();
-            // fileReader.onload(ev => {
-            //     this._decodeMessages(ev.target.result);
-            // });
-            // fileReader.readAsBinaryString(this.file);
+            let fileReader = new FileReader();
+            fileReader.onload(ev => {
+                this._decodeMessages(ev.target.result);
+            });
+            fileReader.readAsBinaryString(this.file);
 
         } else if (this.localPath) {
-            // electron
-            // if (isElectron()) {
-            //     const fs = require("fs");
-            //     if (fs.existsSync(this.localPath)) {
-            //         const buffer = fs.readFileSync(this.localPath);
-            //         str = buffer.toString();
-            //         this._decodeMessages(str);
-            //     } else {
-            //         console.log('media composite message not downloaded', this.remotePath);
-            //     }
-            // }
         }
 
         if (!str) {

+ 15 - 0
wfc/messages/imageMessageContent.js

@@ -9,6 +9,9 @@ import MessageContentType from './messageContentType';
 export default class ImageMessageContent extends MediaMessageContent {
     // base64 encoded, 不包含头部:data:image/png;base64,
     thumbnail;
+    imageWidth;
+    imageHeight;
+
 
     constructor(fileOrLocalPath, remotePath, thumbnail) {
         super(MessageContentType.Image, MessageContentMediaType.Image, fileOrLocalPath, remotePath);
@@ -23,11 +26,23 @@ export default class ImageMessageContent extends MediaMessageContent {
         let payload = super.encode();
         payload.mediaType = MessageContentMediaType.Image;
         payload.binaryContent = this.thumbnail;
+        if (this.imageWidth) {
+            let obj = {
+                w: this.imageWidth,
+                h: this.imageHeight
+            }
+            payload.content = JSON.stringify(obj)
+        }
         return payload;
     }
 
     decode(payload) {
         super.decode(payload);
         this.thumbnail = payload.binaryContent;
+        if (payload.content) {
+            let obj = JSON.parse(payload.content)
+            this.imageWidth = obj['w'];
+            this.imageHeight = obj['h'];
+        }
     }
 }

+ 24 - 24
wfc/messages/message.js

@@ -67,14 +67,14 @@ export default class Message {
     }
 
     static fromProtoMessage(obj) {
-        if(!obj){
+        if (!obj) {
             return null;
         }
         if (!obj.conversation.target) {
             return null;
         }
         // iOS,Android,Windows,OSX
-        if ([1, 2, 3, 4, 8, 9].indexOf(Config.getWFCPlatform()) >= 0) {
+        if ([1, 2, 3, 4, 7, 8, 9].indexOf(Config.getWFCPlatform()) >= 0) {
             let msg = Object.assign(new Message(), obj);
             // big integer to number
             msg.messageId = Number(msg.messageId);
@@ -84,15 +84,15 @@ export default class Message {
 
             msg.messageUid = Long.fromValue(msg.messageUid);
             if (msg.timestamp){
-                msg.timestamp = Long.fromValue(msg.timestamp).toNumber();
+            msg.timestamp = Long.fromValue(msg.timestamp).toNumber();
             } else {
                 // 移动端
                 msg.timestamp = Long.fromValue(msg.serverTime).toNumber();
             }
             msg.localExtra = obj.localExtra;
-            if (!msg.from){
+            if (!msg.from) {
                 // 移动端
-            	msg.from = obj.sender;
+                msg.from = obj.sender;
             }
             msg.conversation = new Conversation(obj.conversation.conversationType !== undefined ? obj.conversation.conversationType : obj.conversation.type, obj.conversation.target, obj.conversation.line);
             let contentClazz = MessageConfig.getMessageContentClazz(msg.content.type !== undefined ? msg.content.type : msg.content.messageContentType);
@@ -113,7 +113,7 @@ export default class Message {
                     }
                 }
                 msg.messageContent = content;
-                if (content instanceof UnknownMessageContent){
+                if (content instanceof UnknownMessageContent) {
                     console.log('unknownMessage Content', obj)
                 }
 
@@ -133,26 +133,26 @@ export default class Message {
             let contentClazz = MessageConfig.getMessageContentClazz(obj.content.type);
             if (contentClazz) {
                 let content = new contentClazz();
-                try {
-                    if (obj.content.data && obj.content.data.length > 0) {
-                        obj.content.binaryContent = encode(obj.content.data);
-                    }
-                    content.decode(obj.content);
-                    content.extra = obj.content.extra;
-                    if (content instanceof NotificationMessageContent) {
-                        content.fromSelf = msg.from === wfc.getUserId();
-                    }
-                } catch (error) {
-                    console.error('decode message payload failed, fallback to unkownMessage', obj.content, error);
-                    let flag = MessageConfig.getMessageContentPersitFlag(obj.content.type);
-                    if (PersistFlag.Persist === flag || PersistFlag.Persist_And_Count === flag) {
-                        content = new UnknownMessageContent(obj.content);
-                    } else {
-                        return null;
+                    try {
+                        if (obj.content.data && obj.content.data.length > 0) {
+                            obj.content.binaryContent = encode(obj.content.data);
+                        }
+                        content.decode(obj.content);
+                        content.extra = obj.content.extra;
+                        if (content instanceof NotificationMessageContent) {
+                            content.fromSelf = msg.from === wfc.getUserId();
+                        }
+                    } catch (error) {
+                        console.error('decode message payload failed, fallback to unkownMessage', obj.content, error);
+                        let flag = MessageConfig.getMessageContentPersitFlag(obj.content.type);
+                        if (PersistFlag.Persist === flag || PersistFlag.Persist_And_Count === flag) {
+                            content = new UnknownMessageContent(obj.content);
+                        } else {
+                            return null;
+                        }
                     }
-                }
                 msg.messageContent = content;
-                if (content instanceof UnknownMessageContent){
+                if (content instanceof UnknownMessageContent) {
                     console.log('unknownMessage Content', obj)
                 }
             } else {

+ 2 - 0
wfc/messages/messageContentType.js

@@ -86,6 +86,8 @@ export default class MessageContentType {
     static CONFERENCE_CONTENT_TYPE_INVITE = 408;
     static CONFERENCE_CONTENT_TYPE_CHANGE_MODE = 410;
     static CONFERENCE_CONTENT_TYPE_KICKOFF_MEMBER = 411;
+    static CONFERENCE_CONTENT_TYPE_COMMAND = 412;
+
     static VOIP_Multi_Call_Ongoing = 416;
     static VOIP_Join_Call_Request = 417;
 

+ 3 - 2
wfc/messages/notification/addGroupMemberNotification.js

@@ -34,8 +34,9 @@ export default class AddGroupMemberNotification extends GroupNotificationContent
         }
 
         let membersStr = '';
-        this.invitees.forEach(m => {
-            membersStr += ' ' + wfc.getUserDisplayName(m);
+        let userInfos = wfc.getUserInfos(this.invitees, this.groupId);
+        userInfos.forEach(m => {
+            membersStr += ' ' + m.displayName;
         });
 
         return notifyStr + membersStr + '加入了群组';

+ 1 - 1
wfc/messages/notification/groupJoinTypeNotificationContent.js

@@ -34,7 +34,7 @@ export default class GroupJoinTypeNotificationContent extends GroupNotificationC
                 notifyStr += ' 仅允许群成员邀请加入群组';
                 break;
             case 2:
-                notifyStr += " 关闭了加入群组功能";
+                notifyStr += " 关闭了加入群组功能";
                 break;
             default:
                 break;

+ 7 - 2
wfc/messages/notification/kickoffGroupMemberNotification.js

@@ -26,8 +26,13 @@ export default class KickoffGroupMemberNotification extends GroupNotificationCon
         }
 
         let kickedMembersStr = '';
-        this.kickedMembers.forEach(m => {
-            kickedMembersStr += ' ' + wfc.getGroupMemberDisplayName(this.groupId, m);
+        let userInfos = wfc.getUserInfos(this.kickedMembers, this.groupId);
+        userInfos.forEach(userInfo => {
+            if (userInfo.uid === wfc.getUserId()) {
+                kickedMembersStr += ' 您';
+            } else {
+                kickedMembersStr += ' ' + userInfo.displayName;
+            }
         });
 
         return notifyStr + kickedMembersStr + ' 移除了群组';

+ 7 - 2
wfc/messages/notification/kickoffGroupMemberVisiableNotification.js

@@ -26,8 +26,13 @@ export default class KickoffGroupMemberVisiableNotification extends GroupNotific
         }
 
         let kickedMembersStr = '';
-        this.kickedMembers.forEach(m => {
-            kickedMembersStr += ' ' + wfc.getGroupMemberDisplayName(this.groupId, m);
+        let userInfos = wfc.getUserInfos(this.kickedMembers, this.groupId);
+        userInfos.forEach(userInfo => {
+            if (userInfo.uid === wfc.getUserId()) {
+                kickedMembersStr += ' 您';
+            } else {
+                kickedMembersStr += ' ' + userInfo.displayName;
+            }
         });
 
         return notifyStr + kickedMembersStr + ' 移除了群组';

+ 2 - 5
wfc/model/conversationInfo.js

@@ -25,15 +25,12 @@ export default class ConversationInfo {
         let conversationInfo = Object.assign(new ConversationInfo(), obj);
         conversationInfo.top = obj.isTop;
         delete conversationInfo.isTop;
-        if(obj.conversation){
+        if (obj.conversation) {
             conversationInfo.conversation = new Conversation(obj.conversation.type, obj.conversation.target, obj.conversation.line);
-        }else{
+        } else {
             conversationInfo.conversation = new Conversation(obj.conversationType, obj.target, obj.line);
         }
         conversationInfo.lastMessage = Message.fromProtoMessage(obj.lastMessage);
-        if (conversationInfo.draft && conversationInfo.lastMessage && gt(conversationInfo.lastMessage.timestamp, 0)) {
-            conversationInfo.timestamp = conversationInfo.lastMessage.timestamp;
-        }
         if (!conversationInfo.timestamp){
             conversationInfo.timestamp = 0;
         }

+ 12 - 4
wfc/model/favItem.js

@@ -11,8 +11,8 @@ import MessagePayload from "../messages/messagePayload";
 import SoundMessageContent from "../messages/soundMessageContent";
 import Long from "long";
 import UnknownMessageContent from "../messages/unknownMessageContent";
-
 import Config from '../../config'
+
 export default class FavItem {
     id;
     messageUid;
@@ -91,6 +91,13 @@ export default class FavItem {
                 let compositeContent = message.messageContent;
                 favItem.title = compositeContent.title;
                 let payload = compositeContent.encode();
+                if (payload.remoteMediaUrl) {
+                    let str = wfc.b64_to_utf8(payload.binaryContent);
+                    let obj = JSON.parse(str)
+                    obj['remote_url'] = payload.remoteMediaUrl;
+                    str = JSON.stringify(obj);
+                    payload.binaryContent = wfc.utf8_to_b64(str);
+                }
                 favItem.data = payload.binaryContent;
                 break;
             case MessageContentType.Voice:
@@ -101,7 +108,7 @@ export default class FavItem {
                 }
                 favItem.data = JSON.stringify(data);
                 break;
-            // TODO
+        // TODO
             // case MessageContentType.Link:
             //     break
             default:
@@ -122,7 +129,6 @@ export default class FavItem {
         }
         let content;
         try {
-
         switch (this.favType) {
             case MessageContentType.Text:
                 content = new TextMessageContent(this.title);
@@ -154,6 +160,8 @@ export default class FavItem {
                     payload.type = this.favType;
                     payload.content = this.title;
                     payload.binaryContent = this.data;
+                        let obj = JSON.parse(this.data);
+                        payload.remoteMediaUrl = obj['remote_url'];
                     content.decode(payload)
                 }
                 break;
@@ -163,7 +171,7 @@ export default class FavItem {
                     content.duration = this.data.duration;
                 }
                 break;
-            // TODO
+        // TODO
             // case MessageContentType.Link:
             //     break
             default:

+ 3 - 0
wfc/model/groupInfo.js

@@ -36,6 +36,9 @@ export default class GroupInfo {
     //是否运行群中普通成员私聊。0 允许,1不允许
     privateChat = 0;
 
+    //是否是超级群组
+    superGroup = 0;
+
     //是否可以搜索到该群,功能暂未实现
     searchable