New features such as message likes and replies added

This commit is contained in:
SL 2023-11-01 18:54:50 +08:00
parent 9cfd3004a4
commit cf5ce0edbe
8 changed files with 238 additions and 11 deletions

View File

@ -29,4 +29,6 @@
### 1.1.4
* update set reddot method
### 1.1.5
* update connnection device id with uid
* update connnection device id with uid
### 1.1.6
* New features such as message likes and replies added

View File

@ -9,7 +9,7 @@
#### 安装
```
dependencies:
wukongimfluttersdk: ^1.1.5
wukongimfluttersdk: ^1.1.6
```
#### 引入
```dart

View File

@ -499,7 +499,7 @@ packages:
path: ".."
relative: true
source: path
version: "1.1.5"
version: "1.1.6"
x25519:
dependency: transitive
description:

View File

@ -182,7 +182,7 @@ class MessageDB {
}
}
List<String> messageIds = [];
// List<String> replyMsgIds = [];
List<String> replyMsgIds = [];
List<String> fromUIDs = [];
List<Map<String, Object?>> results =
await WKDBHelper.shared.getDB().rawQuery(sql);
@ -197,9 +197,11 @@ class MessageDB {
messageIds.add(wkMsg.messageID);
}
// if (wkMsg.messageContent != null && wkMsg.messageContent.reply != null && !TextUtils.isEmpty(wkMsg.messageContent.reply.message_id)) {
// replyMsgIds.add(wkMsg.messageContent.reply.message_id);
// }
if (wkMsg.messageContent != null &&
wkMsg.messageContent!.reply != null &&
wkMsg.messageContent!.reply!.messageId != '') {
replyMsgIds.add(wkMsg.messageContent!.reply!.messageId);
}
if (wkMsg.fromUID != '') {
bool isAdd = true;
for (int i = 0; i < fromUIDs.length; i++) {
@ -263,6 +265,36 @@ class MessageDB {
}
}
//
if (replyMsgIds.isNotEmpty) {
List<WKMsgExtra> msgExtraList =
await queryMsgExtrasWithMsgIds(replyMsgIds);
if (msgExtraList.isNotEmpty) {
for (WKMsgExtra extra in msgExtraList) {
for (int i = 0, size = msgList.length; i < size; i++) {
if (msgList[i].messageContent != null &&
msgList[i].messageContent!.reply != null &&
extra.messageID ==
msgList[i].messageContent!.reply!.messageId) {
msgList[i].messageContent!.reply!.revoke = extra.revoke;
}
if (extra.contentEdit != '' &&
msgList[i].messageContent != null &&
msgList[i].messageContent!.reply != null &&
msgList[i].messageContent!.reply!.messageId != '' &&
extra.messageID ==
msgList[i].messageContent!.reply!.messageId) {
msgList[i].messageContent!.reply!.editAt = extra.editedAt;
msgList[i].messageContent!.reply!.contentEdit = extra.contentEdit;
var json = jsonEncode(extra.contentEdit);
var type = WKDBConst.readInt(json, 'type');
msgList[i].messageContent!.reply!.contentEditMsgModel =
WKIM.shared.messageManager.getMessageModel(type, json);
break;
}
}
}
}
}
return msgList;
}
@ -605,6 +637,33 @@ class MessageDB {
return extraVersion;
}
Future<List<WKMsgExtra>> queryMsgExtraWithNeedUpload(int needUpload) async {
String sql =
"select * from ${WKDBConst.tableMessageExtra} where needUpload=$needUpload";
List<WKMsgExtra> 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.serializeMsgExtra(data));
}
}
return list;
}
Future<WKMsgExtra?> queryMsgExtraWithMsgID(String messageID) async {
WKMsgExtra? msgExtra;
String sql =
"select * from ${WKDBConst.tableMessageExtra} where message_id='$messageID'";
List<Map<String, Object?>> list =
await WKDBHelper.shared.getDB().rawQuery(sql);
if (list.isNotEmpty) {
msgExtra = WKDBConst.serializeMsgExtra(list[0]);
}
return msgExtra;
}
Future<List<WKMsgExtra>> queryMsgExtrasWithMsgIds(List<String> msgIds) async {
StringBuffer sb = StringBuffer();
sb.write(

View File

@ -220,6 +220,65 @@ class WKSyncExtraMsg {
int editedAt = 0;
}
class WKReply {
// IDID
String rootMid = '';
// ID
String messageId = '';
// MessageSeq
int messageSeq = 0;
// uid
String fromUID = '';
//
String fromName = '';
//
WKMessageContent? payload;
//
String contentEdit = '';
//
WKMessageContent? contentEditMsgModel;
//
int editAt = 0;
int revoke = 0;
dynamic encode() {
var json = <String, dynamic>{};
json['root_mid'] = rootMid;
json['message_id'] = messageId;
json['message_seq'] = messageSeq;
json['from_uid'] = fromUID;
json['from_name'] = fromName;
if (payload != null) {
var contentJson = payload!.encodeJson();
contentJson['type'] = payload!.contentType;
json['payload'] = contentJson;
}
return json;
}
WKReply decode(dynamic data) {
rootMid = WKDBConst.readString(data, 'root_mid');
messageId = WKDBConst.readString(data, 'message_id');
messageSeq = WKDBConst.readInt(data, 'message_seq');
fromUID = WKDBConst.readString(data, 'from_uid');
fromName = WKDBConst.readString(data, 'from_name');
String contentJson = WKDBConst.readString(data, 'payload');
if (contentJson != '') {
var json = jsonDecode(contentJson);
var type = json['type'];
payload = WKIM.shared.messageManager.getMessageModel(type, json);
}
return this;
}
}
class WKMsgEntity {
int offset = 0;
int length = 0;
String type = '';
String value = '';
}
class WKSyncChannelMsg {
int startMessageSeq = 0;
int endMessageSeq = 0;

View File

@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:collection';
import 'dart:convert';
@ -29,6 +30,7 @@ class WKMessageManager {
Function(WKMsg wkMsg, Function(bool isSuccess, WKMsg wkMsg))?
_uploadAttachmentBack;
Function(WKMsg liMMsg)? _msgInsertedBack;
Function(WKMsgExtra)? _iUploadMsgExtraListener;
HashMap<String, Function(List<WKMsg>)>? _newMsgBack;
HashMap<String, Function(WKMsg)>? _refreshMsgBack;
HashMap<String, Function(String)>? _deleteMsgBack;
@ -58,6 +60,24 @@ class WKMessageManager {
}
}
content ??= WKUnknownContent();
//
var replyJson = WKDBConst.readString(json, 'reply');
if (replyJson != '') {
var reply = WKReply().decode(jsonDecode(replyJson));
content.reply = reply;
}
var entities = WKDBConst.readString(json, 'entities');
var jsonArray = jsonDecode(entities);
List<WKMsgEntity> list = [];
for (var entityJson in jsonArray) {
WKMsgEntity entity = WKMsgEntity();
entity.type = WKDBConst.readString(entityJson, 'type');
entity.offset = WKDBConst.readInt(entityJson, 'offset');
entity.length = WKDBConst.readInt(entityJson, 'length');
entity.value = WKDBConst.readString(entityJson, 'value');
list.add(entity);
}
content.entities = list;
return content;
}
@ -390,6 +410,44 @@ class WKMessageManager {
}
}
_setUploadMsgExtra(WKMsgExtra extra) {
if (_iUploadMsgExtraListener != null) {
_iUploadMsgExtraListener!(extra);
}
Future.delayed(const Duration(seconds: 5), () {
_startCheckTimer();
});
}
Timer? checkMsgNeedUploadTimer;
_startCheckTimer() {
_stopCheckMsgNeedUploadTimer();
checkMsgNeedUploadTimer =
Timer.periodic(const Duration(seconds: 5), (timer) async {
var list = await MessageDB.shared.queryMsgExtraWithNeedUpload(1);
if (list.isNotEmpty) {
for (var extra in list) {
if (_iUploadMsgExtraListener != null) {
_iUploadMsgExtraListener!(extra);
}
}
} else {
_stopCheckMsgNeedUploadTimer();
}
});
}
_stopCheckMsgNeedUploadTimer() {
if (checkMsgNeedUploadTimer != null) {
checkMsgNeedUploadTimer!.cancel();
checkMsgNeedUploadTimer = null;
}
}
addOnUploadMsgExtra(Function(WKMsgExtra) back) {
_iUploadMsgExtraListener = back;
}
addOnRefreshMsgListener(String key, Function(WKMsg) back) {
_refreshMsgBack ??= HashMap();
if (key != '') {
@ -465,9 +523,8 @@ class WKMessageManager {
int tempOrderSeq = await MessageDB.shared
.queryMaxOrderSeq(wkMsg.channelID, wkMsg.channelType);
wkMsg.orderSeq = tempOrderSeq + 1;
dynamic json = wkMsg.messageContent!.encodeJson();
json['type'] = wkMsg.contentType;
wkMsg.content = jsonEncode(json);
wkMsg.content = _getSendPayload(wkMsg);
int row = await saveMsg(wkMsg);
wkMsg.clientSeq = row;
WKIM.shared.messageManager.setOnMsgInserted(wkMsg);
@ -512,6 +569,29 @@ class WKMessageManager {
}
}
String _getSendPayload(WKMsg wkMsg) {
dynamic json = wkMsg.messageContent!.encodeJson();
json['type'] = wkMsg.contentType;
if (wkMsg.messageContent!.reply != null) {
json['reply'] = wkMsg.messageContent!.reply!.encode();
}
if (wkMsg.messageContent!.entities != null &&
wkMsg.messageContent!.entities!.isNotEmpty) {
var jsonArray = [];
for (WKMsgEntity entity in wkMsg.messageContent!.entities!) {
var jo = <String, dynamic>{};
jo['offset'] = entity.offset;
jo['length'] = entity.length;
jo['type'] = entity.type;
jo['value'] = entity.value;
jsonArray.add(jo);
}
json['entities'] = jsonArray;
}
return jsonEncode(json);
}
updateSendResult(
String messageID, int clientSeq, int messageSeq, int reasonCode) async {
WKMsg? wkMsg = await MessageDB.shared.queryWithClientSeq(clientSeq);
@ -578,6 +658,29 @@ class WKMessageManager {
}
}
updateMsgEdit(String messageID, String channelID, int channelType,
String content) async {
var msgExtra = await MessageDB.shared.queryMsgExtraWithMsgID(messageID);
msgExtra ??= WKMsgExtra();
msgExtra.messageID = messageID;
msgExtra.channelID = channelID;
msgExtra.channelType = channelType;
msgExtra.editedAt =
(DateTime.now().millisecondsSinceEpoch / 1000).truncate();
msgExtra.contentEdit = content;
msgExtra.needUpload = 1;
List<WKMsgExtra> list = [];
list.add(msgExtra);
List<String> messageIds = [];
messageIds.add(messageID);
var result = await MessageDB.shared.insertOrUpdateMsgExtras(list);
if (result) {
var wkMsgs = await MessageDB.shared.queryWithMessageIds(messageIds);
getMsgReactionsAndRefreshMsg(messageIds, wkMsgs);
_setUploadMsgExtra(msgExtra);
}
}
deleteWithClientMsgNo(String clientMsgNo) async {
var map = <String, Object>{};
map['is_deleted'] = 1;

View File

@ -1,7 +1,11 @@
import 'package:wukongimfluttersdk/entity/msg.dart';
class WKMessageContent {
var contentType = 0;
String content = "";
String topicId = "";
WKReply? reply;
List<WKMsgEntity>? entities;
Map<String, dynamic> encodeJson() {
return {};
}

View File

@ -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.5
version: 1.1.6
homepage: https://github.com/WuKongIM/WuKongIMFlutterSDK
environment: