From fa1a4bb1142141c6e92bbe4bbd24e14e4ab79ffc Mon Sep 17 00:00:00 2001 From: SL Date: Thu, 26 Oct 2023 17:30:21 +0800 Subject: [PATCH] add message reaction --- lib/db/const.dart | 1 - lib/db/message.dart | 107 ++-------------------- lib/db/reaction.dart | 123 ++++++++++++++++++++++++++ lib/manager/connect_manager.dart | 6 +- lib/manager/conversation_manager.dart | 3 +- lib/manager/message_manager.dart | 56 ++++++++++-- 6 files changed, 188 insertions(+), 108 deletions(-) create mode 100644 lib/db/reaction.dart diff --git a/lib/db/const.dart b/lib/db/const.dart index 5df30ea..d7eb785 100644 --- a/lib/db/const.dart +++ b/lib/db/const.dart @@ -94,7 +94,6 @@ class WKDBConst { reaction.createdAt = readString(data, 'created_at'); reaction.seq = readInt(data, 'seq'); reaction.emoji = readString(data, 'emoji'); - reaction.isDeleted = readInt(data, 'is_deleted'); return reaction; } diff --git a/lib/db/message.dart b/lib/db/message.dart index fdb264c..d9cc116 100644 --- a/lib/db/message.dart +++ b/lib/db/message.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:wukongimfluttersdk/db/channel.dart'; import 'package:wukongimfluttersdk/db/const.dart'; +import 'package:wukongimfluttersdk/db/reaction.dart'; import 'package:wukongimfluttersdk/entity/msg.dart'; import 'package:wukongimfluttersdk/type/const.dart'; import 'package:wukongimfluttersdk/wkim.dart'; @@ -66,7 +67,8 @@ class MessageDB { wkMsg = WKDBConst.serializeWKMsg(list[0]); } if (wkMsg != null) { - wkMsg.reactionList = await queryReactions(wkMsg.messageID); + wkMsg.reactionList = + await ReactionDB.shared.queryWithMessageId(wkMsg.messageID); } return wkMsg; } @@ -82,7 +84,8 @@ class MessageDB { wkMsg = WKDBConst.serializeWKMsg(list[0]); } if (wkMsg != null) { - wkMsg.reactionList = await queryReactions(wkMsg.messageID); + wkMsg.reactionList = + await ReactionDB.shared.queryWithMessageId(wkMsg.messageID); } return wkMsg; } @@ -111,20 +114,6 @@ class MessageDB { return list; } - Future> queryReactions(String messageID) async { - String sql = - "select * from ${WKDBConst.tableMessageReaction} where message_id='$messageID' and is_deleted=0 ORDER BY created_at desc"; - List list = []; - List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); - if (results.isNotEmpty) { - for (Map data in results) { - list.add(WKDBConst.serializeMsgReation(data)); - } - } - return list; - } - Future queryMaxOrderSeq(String channelID, int channelType) async { int maxOrderSeq = 0; String sql = @@ -231,7 +220,8 @@ class MessageDB { } } //扩展消息 - List list = await queryMsgReactionWithMessageIds(messageIds); + List list = + await ReactionDB.shared.queryWithMessageIds(messageIds); if (list.isNotEmpty) { for (int i = 0, size = msgList.length; i < size; i++) { for (int j = 0, len = list.length; j < len; j++) { @@ -640,72 +630,6 @@ class MessageDB { return list; } - Future> queryMsgReactionWithMessageIds( - List messageIds) async { - StringBuffer stringBuffer = StringBuffer(); - for (int i = 0, size = messageIds.length; i < size; i++) { - if (stringBuffer.length > 0) { - stringBuffer.write(","); - } - stringBuffer.write(messageIds[i]); - } - String sql = - "select * from ${WKDBConst.tableMessageReaction} where message_id in ($stringBuffer) and is_deleted=0 ORDER BY created_at desc"; - List list = []; - List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); - if (results.isNotEmpty) { - for (Map data in results) { - list.add(WKDBConst.serializeMsgReation(data)); - } - } - return list; - } - - insertOrUpdateReactionList(List list) { - if (list.isEmpty) return; - for (int i = 0, size = list.length; i < size; i++) { - insertOrUpdateReaction(list[i]); - } - } - - insertOrUpdateReaction(WKMsgReaction reaction) async { - bool isExist = await isExistReaction(reaction.uid, reaction.messageID); - if (isExist) { - updateReaction(reaction); - } else { - insertReaction(reaction); - } - } - - updateReaction(WKMsgReaction reaction) { - var map = {}; - map['is_deleted'] = reaction.isDeleted; - map['seq'] = reaction.seq; - map['emoji'] = reaction.emoji; - WKDBHelper.shared.getDB().update(WKDBConst.tableMessageReaction, map, - where: "message_id='${reaction.messageID}' and uid='${reaction.uid}'"); - } - - insertReaction(WKMsgReaction reaction) { - WKDBHelper.shared - .getDB() - .insert(WKDBConst.tableMessageReaction, getReactionMap(reaction)); - } - - Future isExistReaction(String uid, String messageID) async { - bool isExist = false; - String sql = - "select * from ${WKDBConst.tableMessageReaction} where message_id='$messageID' and uid='$uid' "; - - List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); - if (list.isNotEmpty) { - isExist = true; - } - return isExist; - } - updateSendingMsgFail() { var map = {}; map['status'] = WKSendMsgResult.sendFail; @@ -728,7 +652,8 @@ class MessageDB { } } if (wkMsg != null) { - wkMsg.reactionList = await queryReactions(wkMsg.messageID); + wkMsg.reactionList = + await ReactionDB.shared.queryWithMessageId(wkMsg.messageID); } return wkMsg; } @@ -782,18 +707,4 @@ class MessageDB { map['message_id'] = extra.messageID; return map; } - - dynamic getReactionMap(WKMsgReaction reaction) { - var map = {}; - map['channel_id'] = reaction.channelID; - map['channel_id'] = reaction.channelID; - map['channel_type'] = reaction.channelType; - map['message_id'] = reaction.messageID; - map['uid'] = reaction.uid; - map['name'] = reaction.name; - map['is_deleted'] = reaction.isDeleted; - map['seq'] = reaction.seq; - map['emoji'] = reaction.emoji; - map['created_at'] = reaction.createdAt; - } } diff --git a/lib/db/reaction.dart b/lib/db/reaction.dart new file mode 100644 index 0000000..d044b75 --- /dev/null +++ b/lib/db/reaction.dart @@ -0,0 +1,123 @@ +import 'package:wukongimfluttersdk/entity/msg.dart'; + +import 'const.dart'; +import 'wk_db_helper.dart'; + +class ReactionDB { + ReactionDB._privateConstructor(); + static final ReactionDB _instance = ReactionDB._privateConstructor(); + static ReactionDB get shared => _instance; + + Future queryMaxSeqWithChannel(String channelID, int channelType) async { + String sql = + "select max(seq) seq from ${WKDBConst.tableMessageReaction} where channel_id='$channelID' and channel_type=$channelType limit 0, 1"; + int version = 0; + + List> list = + await WKDBHelper.shared.getDB().rawQuery(sql); + if (list.isNotEmpty) { + dynamic data = list[0]; + if (data != null) { + version = WKDBConst.readInt(data, 'seq'); + } + } + return version; + } + + Future> queryWithMessageId(String messageId) async { + String sql = + "select * from ${WKDBConst.tableMessageReaction} where message_id='$messageId' and is_deleted=0 ORDER BY created_at desc"; + List list = []; + + List> results = + await WKDBHelper.shared.getDB().rawQuery(sql); + if (results.isNotEmpty) { + for (Map data in results) { + list.add(WKDBConst.serializeMsgReation(data)); + } + } + return list; + } + + Future> queryWithMessageIds( + List messageIds) async { + StringBuffer sb = StringBuffer(); + for (int i = 0, size = messageIds.length; i < size; i++) { + if (i != 0) { + sb.write("'"); + } + sb.write(messageIds[i]); + sb.write("'"); + } + + String sql = + "select * from ${WKDBConst.tableMessageReaction} where message_id in (${sb.toString()}) and is_deleted=0 ORDER BY created_at desc"; + List list = []; + List> results = + await WKDBHelper.shared.getDB().rawQuery(sql); + if (results.isNotEmpty) { + for (Map data in results) { + list.add(WKDBConst.serializeMsgReation(data)); + } + } + return list; + } + + insertOrUpdateReactionList(List list) { + if (list.isEmpty) return; + for (int i = 0, size = list.length; i < size; i++) { + insertOrUpdateReaction(list[i]); + } + } + + insertOrUpdateReaction(WKMsgReaction reaction) async { + bool isExist = await isExistReaction(reaction.uid, reaction.messageID); + if (isExist) { + updateReaction(reaction); + } else { + insertReaction(reaction); + } + } + + updateReaction(WKMsgReaction reaction) { + var map = {}; + map['is_deleted'] = reaction.isDeleted; + map['seq'] = reaction.seq; + map['emoji'] = reaction.emoji; + WKDBHelper.shared.getDB().update(WKDBConst.tableMessageReaction, map, + where: "message_id='${reaction.messageID}' and uid='${reaction.uid}'"); + } + + insertReaction(WKMsgReaction reaction) { + WKDBHelper.shared + .getDB() + .insert(WKDBConst.tableMessageReaction, getReactionMap(reaction)); + } + + Future isExistReaction(String uid, String messageID) async { + bool isExist = false; + String sql = + "select * from ${WKDBConst.tableMessageReaction} where message_id='$messageID' and uid='$uid' "; + + List> list = + await WKDBHelper.shared.getDB().rawQuery(sql); + if (list.isNotEmpty) { + isExist = true; + } + return isExist; + } + + dynamic getReactionMap(WKMsgReaction reaction) { + var map = {}; + map['channel_id'] = reaction.channelID; + map['channel_id'] = reaction.channelID; + map['channel_type'] = reaction.channelType; + map['message_id'] = reaction.messageID; + map['uid'] = reaction.uid; + map['name'] = reaction.name; + map['is_deleted'] = reaction.isDeleted; + map['seq'] = reaction.seq; + map['emoji'] = reaction.emoji; + map['created_at'] = reaction.createdAt; + } +} diff --git a/lib/manager/connect_manager.dart b/lib/manager/connect_manager.dart index 874810d..eeb39c9 100644 --- a/lib/manager/connect_manager.dart +++ b/lib/manager/connect_manager.dart @@ -108,9 +108,6 @@ class WKConnectionManager { _socket!.close(); } // if (isLogout) { - WKIM.shared.options.uid = ''; - WKIM.shared.options.token = ''; - WKIM.shared.messageManager.updateSendingMsgFail(); // } _closeAll(); } @@ -278,6 +275,9 @@ class WKConnectionManager { } _closeAll() { + WKIM.shared.options.uid = ''; + WKIM.shared.options.token = ''; + WKIM.shared.messageManager.updateSendingMsgFail(); _stopCheckNetworkTimer(); _stopHeartTimer(); _socket!.close(); diff --git a/lib/manager/conversation_manager.dart b/lib/manager/conversation_manager.dart index 5f53300..a309c37 100644 --- a/lib/manager/conversation_manager.dart +++ b/lib/manager/conversation_manager.dart @@ -1,6 +1,7 @@ import 'dart:collection'; import 'package:wukongimfluttersdk/db/message.dart'; +import 'package:wukongimfluttersdk/db/reaction.dart'; import 'package:wukongimfluttersdk/entity/msg.dart'; import 'package:wukongimfluttersdk/wkim.dart'; @@ -221,7 +222,7 @@ class WKConversationManager { ConversationDB.shared.insertMsgList(conversationMsgList); } if (msgReactionList.isNotEmpty) { - MessageDB.shared.insertOrUpdateReactionList(msgReactionList); + ReactionDB.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 d2d44f1..0e4c97c 100644 --- a/lib/manager/message_manager.dart +++ b/lib/manager/message_manager.dart @@ -6,6 +6,7 @@ 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/db/reaction.dart'; import 'package:wukongimfluttersdk/entity/msg.dart'; import 'package:wukongimfluttersdk/model/wk_media_message_content.dart'; import 'package:wukongimfluttersdk/proto/proto.dart'; @@ -177,15 +178,17 @@ class WKMessageManager { _saveSyncChannelMSGs(List list) { List msgList = []; List msgExtraList = []; + List msgReactionList = []; for (int j = 0, len = list.length; j < len; j++) { WKMsg wkMsg = list[j].getWKMsg(); msgList.add(wkMsg); if (list[j].messageExtra != null) { - if (list[j].messageExtra != null) { - WKMsgExtra extra = wkSyncExtraMsg2WKMsgExtra( - wkMsg.channelID, wkMsg.channelType, list[j].messageExtra!); - msgExtraList.add(extra); - } + WKMsgExtra extra = wkSyncExtraMsg2WKMsgExtra( + wkMsg.channelID, wkMsg.channelType, list[j].messageExtra!); + msgExtraList.add(extra); + } + if (wkMsg.reactionList != null && wkMsg.reactionList!.isNotEmpty) { + msgReactionList.addAll(wkMsg.reactionList!); } } if (msgExtraList.isNotEmpty) { @@ -194,6 +197,9 @@ class WKMessageManager { if (msgList.isNotEmpty) { MessageDB.shared.insertMsgList(msgList); } + if (msgReactionList.isNotEmpty) { + ReactionDB.shared.insertOrUpdateReactionList(msgReactionList); + } } WKMsgExtra wkSyncExtraMsg2WKMsgExtra( @@ -218,6 +224,46 @@ class WKMessageManager { return extra; } + saveMessageReactions(List list) async { + if (list.isEmpty) return; + List reactionList = []; + List msgIds = []; + for (int i = 0, size = list.length; i < size; i++) { + WKMsgReaction reaction = WKMsgReaction(); + reaction.messageID = list[i].messageID; + reaction.channelID = list[i].channelID; + reaction.channelType = list[i].channelType; + reaction.uid = list[i].uid; + reaction.name = list[i].name; + reaction.seq = list[i].seq; + reaction.emoji = list[i].emoji; + reaction.isDeleted = list[i].isDeleted; + reaction.createdAt = list[i].createdAt; + msgIds.add(reaction.messageID); + reactionList.add(reaction); + } + ReactionDB.shared.insertOrUpdateReactionList(reactionList); + List msgList = await MessageDB.shared.queryWithMessageIds(msgIds); + getMsgReactionsAndRefreshMsg(msgIds, msgList); + } + + getMsgReactionsAndRefreshMsg( + List messageIds, List updatedMsgList) async { + List reactionList = + await ReactionDB.shared.queryWithMessageIds(messageIds); + for (int i = 0, size = updatedMsgList.length; i < size; i++) { + for (int j = 0, len = reactionList.length; j < len; j++) { + if (updatedMsgList[i].messageID == reactionList[j].messageID) { + if (updatedMsgList[i].reactionList == null) { + updatedMsgList[i].reactionList = []; + } + updatedMsgList[i].reactionList!.add(reactionList[j]); + } + } + setRefreshMsg(updatedMsgList[i]); + } + } + /* * 查询或同步某个频道消息 *