diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e1f160..02c6b26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,4 +23,6 @@ ### 1.1.1 * Update online cmd messages ### 1.1.2 - * Optimize connections \ No newline at end of file + * Optimize connections + ### 1.1.3 + * Add some methods \ No newline at end of file diff --git a/README.md b/README.md index a9964de..f432e34 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ #### 安装 ``` dependencies: - wukongimfluttersdk: ^1.1.2 + wukongimfluttersdk: ^1.1.3 ``` #### 引入 ```dart diff --git a/example/lib/http.dart b/example/lib/http.dart index 58d3229..05e5d2d 100644 --- a/example/lib/http.dart +++ b/example/lib/http.dart @@ -40,6 +40,7 @@ class HttpUtils { lastSsgSeqs, // 客户端所有频道会话的最后一条消息序列号拼接出来的同步串 格式: channelID:channelType:last_msg_seq|channelID:channelType:last_msg_seq (此字段非必填,如果不填就获取全量数据,填写了获取增量数据,看你自己的需求。) "msg_count": 10 // 每个会话获取最大的消息数量,一般为app点进去第一屏的数据 }); + print(response.data); WKSyncConversation conversation = WKSyncConversation(); conversation.conversations = []; if (response.statusCode == HttpStatus.ok) { diff --git a/example/pubspec.lock b/example/pubspec.lock index 46002a9..ce49fab 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -499,7 +499,7 @@ packages: path: ".." relative: true source: path - version: "1.1.2" + version: "1.1.3" x25519: dependency: transitive description: diff --git a/lib/db/conversation.dart b/lib/db/conversation.dart index ed54cf0..ba3ee3d 100644 --- a/lib/db/conversation.dart +++ b/lib/db/conversation.dart @@ -141,20 +141,18 @@ class ConversationDB { List> updateList = []; for (WKConversationMsg msg in list) { + bool isAdd = true; if (existList.isNotEmpty) { for (var i = 0; i < existList.length; i++) { - bool isAdd = true; if (existList[i].channelID == msg.channelID && existList[i].channelType == msg.channelType) { updateList.add(getMap(msg, true)); isAdd = false; break; } - if (isAdd) { - insertList.add(getMap(msg, true)); - } } - } else { + } + if (isAdd) { insertList.add(getMap(msg, true)); } } @@ -176,6 +174,31 @@ class ConversationDB { } } + clearAll() { + WKDBHelper.shared.getDB().delete(WKDBConst.tableConversation); + } + + Future queryExtraMaxVersion() async { + int maxVersion = 0; + String sql = + "select max(version) version from ${WKDBConst.tableConversationExtra}"; + + List> list = + await WKDBHelper.shared.getDB().rawQuery(sql); + if (list.isNotEmpty) { + dynamic data = list[0]; + maxVersion = WKDBConst.readInt(data, 'version'); + } + return maxVersion; + } + + Future updateWithField( + dynamic map, String channelID, int channelType) async { + return await WKDBHelper.shared.getDB().update( + WKDBConst.tableConversation, map, + where: "channel_id=$channelID and channel_type=$channelType"); + } + WKUIConversationMsg getUIMsg(WKConversationMsg conversationMsg) { WKUIConversationMsg msg = WKUIConversationMsg(); msg.lastMsgSeq = conversationMsg.lastMsgSeq; diff --git a/lib/db/message.dart b/lib/db/message.dart index e98888d..fdb264c 100644 --- a/lib/db/message.dart +++ b/lib/db/message.dart @@ -11,10 +11,10 @@ import '../entity/channel_member.dart'; import 'channel_member.dart'; import 'wk_db_helper.dart'; -class MessaggeDB { - MessaggeDB._privateConstructor(); - static final MessaggeDB _instance = MessaggeDB._privateConstructor(); - static MessaggeDB get shared => _instance; +class MessageDB { + MessageDB._privateConstructor(); + static final MessageDB _instance = MessageDB._privateConstructor(); + static MessageDB get shared => _instance; final String extraCols = "IFNULL(${WKDBConst.tableMessageExtra}.readed,0) as readed,IFNULL(${WKDBConst.tableMessageExtra}.readed_count,0) as readed_count,IFNULL(${WKDBConst.tableMessageExtra}.unread_count,0) as unread_count,IFNULL(${WKDBConst.tableMessageExtra}.revoke,0) as revoke,IFNULL(${WKDBConst.tableMessageExtra}.revoker,'') as revoker,IFNULL(${WKDBConst.tableMessageExtra}.extra_version,0) as extra_version,IFNULL(${WKDBConst.tableMessageExtra}.is_mutual_deleted,0) as is_mutual_deleted,IFNULL(${WKDBConst.tableMessageExtra}.need_upload,0) as need_upload,IFNULL(${WKDBConst.tableMessageExtra}.content_edit,'') as content_edit,IFNULL(${WKDBConst.tableMessageExtra}.edited_at,0) as edited_at"; final String messageCols = @@ -714,6 +714,25 @@ class MessaggeDB { .update(WKDBConst.tableMessage, map, where: 'status=0'); } + Future queryMaxOrderSeqMsgWithChannel( + String channelID, int channelType) async { + WKMsg? wkMsg; + String sql = + "select * from ${WKDBConst.tableMessage} where channel_id='$channelID' and channel_type=$channelType and is_deleted=0 and type<>0 and type<>99 order by order_seq desc limit 1"; + List> list = + await WKDBHelper.shared.getDB().rawQuery(sql); + if (list.isNotEmpty) { + dynamic data = list[0]; + if (data != null) { + wkMsg = WKDBConst.serializeWKMsg(data); + } + } + if (wkMsg != null) { + wkMsg.reactionList = await queryReactions(wkMsg.messageID); + } + return wkMsg; + } + dynamic getMap(WKMsg msg) { var map = {}; map['message_id'] = msg.messageID; diff --git a/lib/manager/conversation_manager.dart b/lib/manager/conversation_manager.dart index 5bd380c..5ab30ee 100644 --- a/lib/manager/conversation_manager.dart +++ b/lib/manager/conversation_manager.dart @@ -55,6 +55,43 @@ class WKConversationManager { return uiMsg; } + Future getExtraMaxVersion() async { + return ConversationDB.shared.queryExtraMaxVersion(); + } + + Future getWithChannel( + String channelID, int channelType) async { + var msg = await ConversationDB.shared + .queryMsgByMsgChannelId(channelID, channelType); + if (msg != null) { + return ConversationDB.shared.getUIMsg(msg); + } + return null; + } + + clearAll() { + ConversationDB.shared.clearAll(); + } + + updateRedDot(String channelID, int channelType, int redDot) async { + var map = {}; + map['unread_count'] = redDot; + var result = await ConversationDB.shared + .updateWithField(map, channelID, channelType); + if (result > 0) { + _refreshMsg(channelID, channelType); + } + } + + _refreshMsg(String channelID, int channelType) async { + var msg = await ConversationDB.shared + .queryMsgByMsgChannelId(channelID, channelType); + if (msg != null) { + var uiMsg = ConversationDB.shared.getUIMsg(msg); + setRefreshMsg(uiMsg, true); + } + } + addOnDeleteMsgListener(String key, Function(String, int) back) { _deleteMsgMap ??= HashMap(); _deleteMsgMap![key] = back; @@ -174,17 +211,17 @@ class WKConversationManager { } } if (msgExtraList.isNotEmpty) { - MessaggeDB.shared.insertOrUpdateMsgExtras(msgExtraList); + MessageDB.shared.insertOrUpdateMsgExtras(msgExtraList); } if (msgList.isNotEmpty) { - MessaggeDB.shared.insertMsgList(msgList); + MessageDB.shared.insertMsgList(msgList); } if (conversationMsgList.isNotEmpty) { ConversationDB.shared.insertMsgList(conversationMsgList); } if (msgReactionList.isNotEmpty) { - MessaggeDB.shared.insertOrUpdateReactionList(msgReactionList); + MessageDB.shared.insertOrUpdateReactionList(msgReactionList); } if (msgList.isNotEmpty && msgList.length < 20) { msgList.sort((a, b) => a.messageSeq.compareTo(b.messageSeq)); diff --git a/lib/manager/message_manager.dart b/lib/manager/message_manager.dart index 1c16472..d2d44f1 100644 --- a/lib/manager/message_manager.dart +++ b/lib/manager/message_manager.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'package:uuid/uuid.dart'; import 'package:wukongimfluttersdk/common/logs.dart'; import 'package:wukongimfluttersdk/db/const.dart'; +import 'package:wukongimfluttersdk/db/conversation.dart'; import 'package:wukongimfluttersdk/db/message.dart'; import 'package:wukongimfluttersdk/entity/msg.dart'; import 'package:wukongimfluttersdk/model/wk_media_message_content.dart'; @@ -29,6 +30,8 @@ class WKMessageManager { Function(WKMsg liMMsg)? _msgInsertedBack; HashMap)>? _newMsgBack; HashMap? _refreshMsgBack; + HashMap? _deleteMsgBack; + Function( String channelID, int channelType, @@ -86,11 +89,11 @@ class WKMessageManager { } Future getWithClientMsgNo(String clientMsgNo) { - return MessaggeDB.shared.queryWithClientMsgNo(clientMsgNo); + return MessageDB.shared.queryWithClientMsgNo(clientMsgNo); } Future saveMsg(WKMsg msg) async { - return await MessaggeDB.shared.insert(msg); + return await MessageDB.shared.insert(msg); } String generateClientMsgNo() { @@ -101,7 +104,7 @@ class WKMessageManager { int messageSeq, String channelID, int channelType) async { if (messageSeq == 0) { int tempOrderSeq = - await MessaggeDB.shared.queryMaxOrderSeq(channelID, channelType); + await MessageDB.shared.queryMaxOrderSeq(channelID, channelType); return tempOrderSeq + 1; } return messageSeq * wkOrderSeqFactor; @@ -111,23 +114,22 @@ class WKMessageManager { dynamic json = {}; json['viewed'] = 1; json['viewed_at'] = viewedAt; - return MessaggeDB.shared - .updateMsgWithFieldAndClientMsgNo(json, clientMsgNO); + return MessageDB.shared.updateMsgWithFieldAndClientMsgNo(json, clientMsgNO); } Future getMaxExtraVersionWithChannel( String channelID, int channelType) async { - return MessaggeDB.shared + return MessageDB.shared .queryMaxExtraVersionWithChannel(channelID, channelType); } saveRemoteExtraMsg(List list) async { - MessaggeDB.shared.insertOrUpdateMsgExtras(list); + MessageDB.shared.insertOrUpdateMsgExtras(list); List msgIds = []; for (var extra in list) { msgIds.add(extra.messageID); } - var msgList = await MessaggeDB.shared.queryWithMessageIds(msgIds); + var msgList = await MessageDB.shared.queryWithMessageIds(msgIds); for (var msg in msgList) { for (var extra in list) { msg.wkMsgExtra ??= WKMsgExtra(); @@ -187,10 +189,10 @@ class WKMessageManager { } } if (msgExtraList.isNotEmpty) { - MessaggeDB.shared.insertOrUpdateMsgExtras(msgExtraList); + MessageDB.shared.insertOrUpdateMsgExtras(msgExtraList); } if (msgList.isNotEmpty) { - MessaggeDB.shared.insertMsgList(msgList); + MessageDB.shared.insertMsgList(msgList); } } @@ -250,7 +252,7 @@ class WKMessageManager { contain = true; pullMode = 0; } else { - int minOrderSeq = await MessaggeDB.shared + int minOrderSeq = await MessageDB.shared .getOrderSeq(channelId, channelType, aroundMsgOrderSeq, 3); if (minOrderSeq == 0) { oldestOrderSeq = aroundMsgOrderSeq; @@ -265,7 +267,7 @@ class WKMessageManager { } } else { // todo 这里只会查询3条数据 oldestOrderSeq = minOrderSeq - int startOrderSeq = await MessaggeDB.shared + int startOrderSeq = await MessageDB.shared .getOrderSeq(channelId, channelType, aroundMsgOrderSeq, limit); if (startOrderSeq == 0) { oldestOrderSeq = aroundMsgOrderSeq; @@ -278,7 +280,7 @@ class WKMessageManager { contain = true; } } - MessaggeDB.shared.getOrSyncHistoryMessages( + MessageDB.shared.getOrSyncHistoryMessages( channelId, channelType, oldestOrderSeq, @@ -297,7 +299,7 @@ class WKMessageManager { } Future getMaxMessageSeq(String channelID, int channelType) { - return MessaggeDB.shared.getMaxMessageSeq(channelID, channelType); + return MessageDB.shared.getMaxMessageSeq(channelID, channelType); } pushNewMsg(List list) { @@ -321,6 +323,27 @@ class WKMessageManager { } } + addOnDeleteMsgListener(String key, Function(String) back) { + _deleteMsgBack ??= HashMap(); + if (key != '') { + _deleteMsgBack![key] = back; + } + } + + removeDeleteMsgListener(String key) { + if (_deleteMsgBack != null) { + _deleteMsgBack!.remove(key); + } + } + + _setDeleteMsg(String clientMsgNo) { + if (_deleteMsgBack != null) { + _deleteMsgBack!.forEach((key, back) { + back(clientMsgNo); + }); + } + } + addOnRefreshMsgListener(String key, Function(WKMsg) back) { _refreshMsgBack ??= HashMap(); if (key != '') { @@ -393,7 +416,7 @@ class WKMessageManager { wkMsg.channelType = channel.channelType; wkMsg.fromUID = WKIM.shared.options.uid!; wkMsg.contentType = messageContent.contentType; - int tempOrderSeq = await MessaggeDB.shared + int tempOrderSeq = await MessageDB.shared .queryMaxOrderSeq(wkMsg.channelID, wkMsg.channelType); wkMsg.orderSeq = tempOrderSeq + 1; dynamic json = wkMsg.messageContent!.encodeJson(); @@ -445,7 +468,7 @@ class WKMessageManager { updateSendResult( String messageID, int clientSeq, int messageSeq, int reasonCode) async { - WKMsg? wkMsg = await MessaggeDB.shared.queryWithClientSeq(clientSeq); + WKMsg? wkMsg = await MessageDB.shared.queryWithClientSeq(clientSeq); if (wkMsg != null) { wkMsg.messageID = messageID; wkMsg.messageSeq = messageSeq; @@ -457,7 +480,7 @@ class WKMessageManager { int orderSeq = await WKIM.shared.messageManager .getMessageOrderSeq(messageSeq, wkMsg.channelID, wkMsg.channelType); map['order_seq'] = orderSeq; - MessaggeDB.shared.updateMsgWithField(map, clientSeq); + MessageDB.shared.updateMsgWithField(map, clientSeq); setRefreshMsg(wkMsg); } } @@ -465,9 +488,9 @@ class WKMessageManager { updateMsgStatusFail(int clientMsgSeq) async { var map = {}; map['status'] = WKSendMsgResult.sendFail; - int row = await MessaggeDB.shared.updateMsgWithField(map, clientMsgSeq); + int row = await MessageDB.shared.updateMsgWithField(map, clientMsgSeq); if (row > 0) { - MessaggeDB.shared.queryWithClientSeq(clientMsgSeq).then((wkMsg) { + MessageDB.shared.queryWithClientSeq(clientMsgSeq).then((wkMsg) { if (wkMsg != null) { setRefreshMsg(wkMsg); } @@ -477,14 +500,14 @@ class WKMessageManager { updateContent(String clientMsgNO, WKMessageContent messageContent, bool isRefreshUI) async { - WKMsg? wkMsg = await MessaggeDB.shared.queryWithClientMsgNo(clientMsgNO); + WKMsg? wkMsg = await MessageDB.shared.queryWithClientMsgNo(clientMsgNO); if (wkMsg != null) { var map = {}; dynamic json = messageContent.encodeJson(); json['type'] = wkMsg.contentType; map['content'] = jsonEncode(json); - int result = await MessaggeDB.shared + int result = await MessageDB.shared .updateMsgWithFieldAndClientMsgNo(map, clientMsgNO); if (isRefreshUI && result > 0) { setRefreshMsg(wkMsg); @@ -493,6 +516,33 @@ class WKMessageManager { } updateSendingMsgFail() { - MessaggeDB.shared.updateSendingMsgFail(); + MessageDB.shared.updateSendingMsgFail(); + } + + deleteWithClientMsgNo(String clientMsgNo) async { + var map = {}; + map['is_deleted'] = 1; + + var result = await MessageDB.shared + .updateMsgWithFieldAndClientMsgNo(map, clientMsgNo); + if (result > 0) { + _setDeleteMsg(clientMsgNo); + var wkMsg = await getWithClientMsgNo(clientMsgNo); + if (wkMsg != null) { + var coverMsg = await ConversationDB.shared + .queryMsgByMsgChannelId(wkMsg.channelID, wkMsg.channelType); + if (coverMsg != null && coverMsg.lastClientMsgNO == clientMsgNo) { + var tempMsg = await MessageDB.shared.queryMaxOrderSeqMsgWithChannel( + wkMsg.channelID, wkMsg.channelType); + if (tempMsg != null) { + var uiMsg = + await WKIM.shared.conversationManager.saveWithLiMMsg(tempMsg); + if (uiMsg != null) { + WKIM.shared.conversationManager.setRefreshMsg(uiMsg, true); + } + } + } + } + } } } diff --git a/pubspec.yaml b/pubspec.yaml index 40ffbf4..7b643bd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ description: wukong IM flutter sdk # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.1.2 +version: 1.1.3 homepage: https://github.com/WuKongIM/WuKongIMFlutterSDK environment: