add message reaction

This commit is contained in:
SL 2023-10-26 17:30:21 +08:00
parent fe7664f4d0
commit fa1a4bb114
6 changed files with 188 additions and 108 deletions

View File

@ -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;
}

View File

@ -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
View 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;
}
}

View File

@ -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();

View File

@ -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));

View File

@ -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]);
}
}
/*
*
*