mirror of
https://github.com/WuKongIM/WuKongIMFlutterSDK
synced 2025-05-29 23:22:52 +00:00
add message reaction
This commit is contained in:
parent
fe7664f4d0
commit
fa1a4bb114
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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<List<WKMsgReaction>> queryReactions(String messageID) async {
|
||||
String sql =
|
||||
"select * from ${WKDBConst.tableMessageReaction} where message_id='$messageID' and is_deleted=0 ORDER BY created_at desc";
|
||||
List<WKMsgReaction> list = [];
|
||||
List<Map<String, Object?>> results =
|
||||
await WKDBHelper.shared.getDB().rawQuery(sql);
|
||||
if (results.isNotEmpty) {
|
||||
for (Map<String, Object?> data in results) {
|
||||
list.add(WKDBConst.serializeMsgReation(data));
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
Future<int> queryMaxOrderSeq(String channelID, int channelType) async {
|
||||
int maxOrderSeq = 0;
|
||||
String sql =
|
||||
@ -231,7 +220,8 @@ class MessageDB {
|
||||
}
|
||||
}
|
||||
//扩展消息
|
||||
List<WKMsgReaction> list = await queryMsgReactionWithMessageIds(messageIds);
|
||||
List<WKMsgReaction> 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<List<WKMsgReaction>> queryMsgReactionWithMessageIds(
|
||||
List<String> 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<WKMsgReaction> list = [];
|
||||
List<Map<String, Object?>> results =
|
||||
await WKDBHelper.shared.getDB().rawQuery(sql);
|
||||
if (results.isNotEmpty) {
|
||||
for (Map<String, Object?> data in results) {
|
||||
list.add(WKDBConst.serializeMsgReation(data));
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
insertOrUpdateReactionList(List<WKMsgReaction> 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 = <String, Object>{};
|
||||
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<bool> isExistReaction(String uid, String messageID) async {
|
||||
bool isExist = false;
|
||||
String sql =
|
||||
"select * from ${WKDBConst.tableMessageReaction} where message_id='$messageID' and uid='$uid' ";
|
||||
|
||||
List<Map<String, Object?>> list =
|
||||
await WKDBHelper.shared.getDB().rawQuery(sql);
|
||||
if (list.isNotEmpty) {
|
||||
isExist = true;
|
||||
}
|
||||
return isExist;
|
||||
}
|
||||
|
||||
updateSendingMsgFail() {
|
||||
var map = <String, Object>{};
|
||||
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 = <String, Object>{};
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
123
lib/db/reaction.dart
Normal file
123
lib/db/reaction.dart
Normal file
@ -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<int> 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<Map<String, Object?>> 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<List<WKMsgReaction>> queryWithMessageId(String messageId) async {
|
||||
String sql =
|
||||
"select * from ${WKDBConst.tableMessageReaction} where message_id='$messageId' and is_deleted=0 ORDER BY created_at desc";
|
||||
List<WKMsgReaction> list = [];
|
||||
|
||||
List<Map<String, Object?>> results =
|
||||
await WKDBHelper.shared.getDB().rawQuery(sql);
|
||||
if (results.isNotEmpty) {
|
||||
for (Map<String, Object?> data in results) {
|
||||
list.add(WKDBConst.serializeMsgReation(data));
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
Future<List<WKMsgReaction>> queryWithMessageIds(
|
||||
List<String> 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<WKMsgReaction> list = [];
|
||||
List<Map<String, Object?>> results =
|
||||
await WKDBHelper.shared.getDB().rawQuery(sql);
|
||||
if (results.isNotEmpty) {
|
||||
for (Map<String, Object?> data in results) {
|
||||
list.add(WKDBConst.serializeMsgReation(data));
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
insertOrUpdateReactionList(List<WKMsgReaction> 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 = <String, Object>{};
|
||||
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<bool> isExistReaction(String uid, String messageID) async {
|
||||
bool isExist = false;
|
||||
String sql =
|
||||
"select * from ${WKDBConst.tableMessageReaction} where message_id='$messageID' and uid='$uid' ";
|
||||
|
||||
List<Map<String, Object?>> list =
|
||||
await WKDBHelper.shared.getDB().rawQuery(sql);
|
||||
if (list.isNotEmpty) {
|
||||
isExist = true;
|
||||
}
|
||||
return isExist;
|
||||
}
|
||||
|
||||
dynamic getReactionMap(WKMsgReaction reaction) {
|
||||
var map = <String, Object>{};
|
||||
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;
|
||||
}
|
||||
}
|
@ -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();
|
||||
|
@ -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));
|
||||
|
@ -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<WKSyncMsg> list) {
|
||||
List<WKMsg> msgList = [];
|
||||
List<WKMsgExtra> msgExtraList = [];
|
||||
List<WKMsgReaction> 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<WKSyncMsgReaction> list) async {
|
||||
if (list.isEmpty) return;
|
||||
List<WKMsgReaction> reactionList = [];
|
||||
List<String> 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<WKMsg> msgList = await MessageDB.shared.queryWithMessageIds(msgIds);
|
||||
getMsgReactionsAndRefreshMsg(msgIds, msgList);
|
||||
}
|
||||
|
||||
getMsgReactionsAndRefreshMsg(
|
||||
List<String> messageIds, List<WKMsg> updatedMsgList) async {
|
||||
List<WKMsgReaction> 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]);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 查询或同步某个频道消息
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user