|
|
|
@ -249,6 +249,145 @@ class IMManager { |
|
|
|
Get.log('📨 [IMManager] 消息内容已修改: ${message.localTime}'); |
|
|
|
} |
|
|
|
|
|
|
|
// 检查是否是通话消息 |
|
|
|
bool isCallMessage = false; |
|
|
|
try { |
|
|
|
if (message.body.type == MessageType.CUSTOM) { |
|
|
|
final customBody = message.body as EMCustomMessageBody; |
|
|
|
isCallMessage = customBody.event == 'call'; |
|
|
|
} |
|
|
|
} catch (e) { |
|
|
|
// 解析失败,不是通话消息 |
|
|
|
} |
|
|
|
|
|
|
|
// 如果是通话消息,更新 CallItem 显示 |
|
|
|
if (isCallMessage) { |
|
|
|
try { |
|
|
|
if (Get.isLogEnable) { |
|
|
|
Get.log('📞 [IMManager] 检测到通话消息内容修改: msgId=${message.msgId}'); |
|
|
|
} |
|
|
|
|
|
|
|
String? userId; |
|
|
|
|
|
|
|
// 根据消息方向确定对应的 userId |
|
|
|
if (message.direction == MessageDirection.RECEIVE) { |
|
|
|
// 接收到的消息,使用发送者ID |
|
|
|
userId = message.from; |
|
|
|
} else if (message.direction == MessageDirection.SEND) { |
|
|
|
// 发送的消息,使用接收者ID |
|
|
|
userId = message.to; |
|
|
|
} |
|
|
|
|
|
|
|
if (Get.isLogEnable) { |
|
|
|
Get.log('📞 [IMManager] 通话消息方向: ${message.direction}, userId: $userId'); |
|
|
|
} |
|
|
|
|
|
|
|
// 找到对应的 ChatController 并更新消息 |
|
|
|
if (userId != null && userId.isNotEmpty) { |
|
|
|
final controller = _activeChatControllers[userId]; |
|
|
|
if (controller != null) { |
|
|
|
// 更新消息列表中的消息 |
|
|
|
var index = controller.messages.indexWhere((msg) => msg.msgId == message.msgId); |
|
|
|
if (index != -1) { |
|
|
|
if (Get.isLogEnable) { |
|
|
|
final oldMessage = controller.messages[index]; |
|
|
|
final customBody = oldMessage.body as EMCustomMessageBody; |
|
|
|
Get.log('📞 [IMManager] 找到通话消息,index=$index, 旧状态: ${customBody.params?['callStatus']}, 新状态: ${(message.body as EMCustomMessageBody).params?['callStatus']}'); |
|
|
|
} |
|
|
|
|
|
|
|
// 更新消息对象 |
|
|
|
controller.messages[index] = message; |
|
|
|
// 强制刷新 RxList,确保 UI 更新 |
|
|
|
controller.messages.refresh(); |
|
|
|
// 调用 update() 触发 GetBuilder 重建 |
|
|
|
controller.update(); |
|
|
|
|
|
|
|
if (Get.isLogEnable) { |
|
|
|
Get.log('✅ [IMManager] 已更新通话消息: msgId=${message.msgId}, userId=$userId, index=$index'); |
|
|
|
} else { |
|
|
|
print('✅ [IMManager] 已更新通话消息: msgId=${message.msgId}, userId=$userId, index=$index'); |
|
|
|
} |
|
|
|
} else { |
|
|
|
// 如果找不到消息,尝试通过通话消息的特征来匹配(通过channelId和时间戳) |
|
|
|
if (Get.isLogEnable) { |
|
|
|
Get.log('⚠️ [IMManager] 未找到通话消息(通过msgId),尝试其他匹配方式: msgId=${message.msgId}, userId=$userId'); |
|
|
|
} |
|
|
|
|
|
|
|
// 尝试通过通话消息的特征来匹配(通过channelId) |
|
|
|
final customBody = message.body as EMCustomMessageBody; |
|
|
|
final channelId = customBody.params?['channelId']; |
|
|
|
|
|
|
|
if (channelId != null && channelId.isNotEmpty) { |
|
|
|
// 尝试通过channelId和时间戳匹配 |
|
|
|
final matchedIndex = controller.messages.indexWhere((msg) { |
|
|
|
if (msg.body.type == MessageType.CUSTOM) { |
|
|
|
final msgBody = msg.body as EMCustomMessageBody; |
|
|
|
if (msgBody.event == 'call' && msgBody.params != null) { |
|
|
|
final msgChannelId = msgBody.params?['channelId']; |
|
|
|
// 匹配相同的channelId和相似的时间戳(允许一定误差) |
|
|
|
if (msgChannelId == channelId) { |
|
|
|
// 检查时间戳是否接近(允许5秒误差) |
|
|
|
final timeDiff = (message.serverTime - msg.serverTime).abs(); |
|
|
|
return timeDiff < 5000; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return false; |
|
|
|
}); |
|
|
|
|
|
|
|
if (matchedIndex != -1) { |
|
|
|
if (Get.isLogEnable) { |
|
|
|
Get.log('📞 [IMManager] 通过channelId匹配到通话消息,index=$matchedIndex'); |
|
|
|
} |
|
|
|
|
|
|
|
// 更新消息对象 |
|
|
|
controller.messages[matchedIndex] = message; |
|
|
|
controller.messages.refresh(); |
|
|
|
controller.update(); |
|
|
|
|
|
|
|
if (Get.isLogEnable) { |
|
|
|
Get.log('✅ [IMManager] 已通过channelId更新通话消息: msgId=${message.msgId}, userId=$userId, index=$matchedIndex'); |
|
|
|
} else { |
|
|
|
print('✅ [IMManager] 已通过channelId更新通话消息: msgId=${message.msgId}, userId=$userId, index=$matchedIndex'); |
|
|
|
} |
|
|
|
} else { |
|
|
|
// 如果还是找不到,直接添加到列表(可能是新消息) |
|
|
|
if (Get.isLogEnable) { |
|
|
|
Get.log('⚠️ [IMManager] 无法匹配通话消息,添加到列表: msgId=${message.msgId}'); |
|
|
|
} |
|
|
|
controller.messages.add(message); |
|
|
|
controller.messages.refresh(); |
|
|
|
controller.update(); |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (Get.isLogEnable) { |
|
|
|
Get.log('⚠️ [IMManager] 通话消息没有channelId,无法匹配: msgId=${message.msgId}'); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (Get.isLogEnable) { |
|
|
|
Get.log('⚠️ [IMManager] 未找到 ChatController: userId=$userId'); |
|
|
|
} else { |
|
|
|
print('⚠️ [IMManager] 未找到 ChatController: userId=$userId'); |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (Get.isLogEnable) { |
|
|
|
Get.log('⚠️ [IMManager] userId 为空,无法更新通话消息'); |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (e, stackTrace) { |
|
|
|
if (Get.isLogEnable) { |
|
|
|
Get.log('⚠️ [IMManager] 处理通话消息更新失败: $e'); |
|
|
|
Get.log('堆栈跟踪: $stackTrace'); |
|
|
|
} else { |
|
|
|
print('⚠️ [IMManager] 处理通话消息更新失败: $e'); |
|
|
|
print('堆栈跟踪: $stackTrace'); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 处理金币数值:只对接收到的消息处理金币标签 |
|
|
|
// 从消息 attributes 中的 revenueInfo 获取金币信息并直接显示 |
|
|
|
// 只处理接收到的消息(自己发送的消息不显示金币标签) |
|
|
|
@ -1257,9 +1396,7 @@ class IMManager { |
|
|
|
// 同时存储发送者和接收者的信息 |
|
|
|
// 发送者信息:用于接收方在聊天列表显示发送者的头像和昵称 |
|
|
|
// 接收者信息:用于发送方在聊天列表显示接收者的头像和昵称 |
|
|
|
if (message.attributes == null) { |
|
|
|
message.attributes = {}; |
|
|
|
} |
|
|
|
message.attributes ??= {}; |
|
|
|
|
|
|
|
// 发送者信息(sender_ 前缀) |
|
|
|
message.attributes!['sender_userId'] = currentUserId; |
|
|
|
|