getMessages method
Implementation
Future<List<WKMsg>> getMessages(String channelId, int channelType,
int oldestOrderSeq, bool contain, int pullMode, int limit) async {
List<WKMsg> msgList = [];
String sql;
var args = [];
if (oldestOrderSeq <= 0) {
sql =
"SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,?";
args.add(channelId);
args.add(channelType);
args.add(limit);
} else {
if (pullMode == 0) {
if (contain) {
sql =
"SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq<=?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,?";
} else {
sql =
"SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq<?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,?";
}
} else {
if (contain) {
sql =
"SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq>=?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq asc limit 0,?";
} else {
sql =
"SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq>?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq asc limit 0,?";
}
}
args.add(channelId);
args.add(channelType);
args.add(oldestOrderSeq);
args.add(limit);
}
List<String> messageIds = [];
List<String> replyMsgIds = [];
List<String> fromUIDs = [];
List<Map<String, Object?>> results =
await WKDBHelper.shared.getDB()!.rawQuery(sql, args);
if (results.isNotEmpty) {
WKChannel? wkChannel =
await ChannelDB.shared.query(channelId, channelType);
for (Map<String, Object?> data in results) {
WKMsg wkMsg = WKDBConst.serializeWKMsg(data);
wkMsg.setChannelInfo(wkChannel);
if (wkMsg.messageID != '') {
messageIds.add(wkMsg.messageID);
}
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++) {
if (fromUIDs[i] == wkMsg.fromUID) {
isAdd = false;
break;
}
}
if (isAdd) {
fromUIDs.add(wkMsg.fromUID);
}
}
if (pullMode == 0) {
msgList.insert(0, wkMsg);
} else {
msgList.add(wkMsg);
}
}
}
//扩展消息
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++) {
if (list[j].messageID == msgList[i].messageID) {
if (msgList[i].reactionList == null) {
msgList[i].reactionList = [];
}
msgList[i].reactionList!.add(list[j]);
}
}
}
}
// 发送者成员信息
if (channelType == WKChannelType.group) {
List<WKChannelMember> memberList = await ChannelMemberDB.shared
.queryMemberWithUIDs(channelId, channelType, fromUIDs);
if (memberList.isNotEmpty) {
for (WKChannelMember member in memberList) {
for (int i = 0, size = msgList.length; i < size; i++) {
if (msgList[i].fromUID != '' &&
msgList[i].fromUID == member.memberUID) {
msgList[i].setMemberOfFrom(member);
}
}
}
}
}
//消息发送者信息
List<WKChannel> wkChannels = await ChannelDB.shared
.queryWithChannelIdsAndChannelType(fromUIDs, WKChannelType.personal);
if (wkChannels.isNotEmpty) {
for (WKChannel wkChannel in wkChannels) {
for (int i = 0, size = msgList.length; i < size; i++) {
if (msgList[i].fromUID != '' &&
msgList[i].fromUID == wkChannel.channelID) {
msgList[i].setFrom(wkChannel);
}
}
}
}
// 查询编辑内容
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;
}