From 797ee19cdbd0699cbff157686ad2aedba477937d Mon Sep 17 00:00:00 2001 From: tanjianbin <632190820@qq.com> Date: Wed, 25 Mar 2026 20:02:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E5=9B=9E=E5=A4=8D=E6=B6=88=E6=81=AF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 replyMessage 方法,支持在指定房间内回复特定消息。当无法找到原消息进行回复时,会自动转换为直接发送消息到该房间,确保消息能成功送达。同时包含完整的参数校验和错误处理逻辑。 --- .../worktool/service/WeworkController.kt | 27 ++++- .../worktool/service/WeworkOperationImpl.kt | 112 ++++++++++++++---- 2 files changed, 118 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/yameida/worktool/service/WeworkController.kt b/app/src/main/java/org/yameida/worktool/service/WeworkController.kt index 85d9bc4..38ea4dd 100644 --- a/app/src/main/java/org/yameida/worktool/service/WeworkController.kt +++ b/app/src/main/java/org/yameida/worktool/service/WeworkController.kt @@ -68,7 +68,32 @@ object WeworkController { waitingForReply = false return result } - + + /** + * 在房间内指定回复消息 + * @see WeworkMessageBean.REPLY_MESSAGE + * @param message#titleList 房间名称 + * @param message#receivedName 原始消息的发送者姓名 + * @param message#originalContent 原始消息的内容 + * @param message#textType 原始消息的消息类型 + * @param message#receivedContent 回复内容 + * @see WeworkMessageBean.TEXT_TYPE + */ + @RequestMapping + fun replyMessage(message: WeworkMessageBean): Boolean { + LogUtils.d("REQUEST replyMessage(): ${message.messageId} ${message.receivedName} ${message.originalContent} ${message.textType} ${message.receivedContent}") + val result = WeworkOperationImpl.replyMessage( + message, + message.titleList, + message.receivedName, + message.originalContent, + message.textType, + message.receivedContent + ) + // 发送完成,通知等待结束 + waitingForReply = false + return result + } /** * 在房间内转发消息 * @see WeworkMessageBean.RELAY_MESSAGE diff --git a/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt b/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt index 1a758e7..1f68751 100644 --- a/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt +++ b/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt @@ -99,30 +99,102 @@ object WeworkOperationImpl { uploadCommandResult(message, ExecCallbackBean.SUCCESS, "", startTime, successList, failList) return true } + /** * 在房间内指定回复消息 - * @see WeworkMessageBean.REPLY_MESSAGE - * @param message#titleList 房间名称 - * @param message#receivedName 原始消息的发送者姓名 - * @param message#originalContent 原始消息的内容 - * @param message#textType 原始消息的消息类型 - * @param message#receivedContent 回复内容 + * @param titleList 房间名称 + * @param receivedName 原始消息的发送者姓名 + * @param originalContent 原始消息的内容 + * @param textType 原始消息的消息类型 + * @param receivedContent 回复内容 * @see WeworkMessageBean.TEXT_TYPE */ - @RequestMapping - fun replyMessage(message: WeworkMessageBean): Boolean { - LogUtils.d("REQUEST replyMessage(): ${message.messageId} ${message.receivedName} ${message.originalContent} ${message.textType} ${message.receivedContent}") - val result = WeworkOperationImpl.replyMessage( - message, - message.titleList, - message.receivedName, - message.originalContent, - message.textType, - message.receivedContent - ) - // 发送完成,通知等待结束 - waitingForReply = false - return result + fun replyMessage( + message: WeworkMessageBean, + titleList: List, + receivedName: String?, + originalContent: String, + textType: Int?, + receivedContent: String? + ): Boolean { + val startTime = System.currentTimeMillis() + if (receivedContent.isNullOrEmpty()) { + LogUtils.d("未发现回复内容") + uploadCommandResult(message, ExecCallbackBean.ERROR_ILLEGAL_DATA, "回复内容为空", startTime, listOf(), titleList) + goHome() + return false + } + + // 验证titleList是否在当前会话列表中存在 + val currentRoomList = WeworkRoomUtil.getRoomTitle(print = false) + if (currentRoomList.isEmpty()) { + LogUtils.d("无法获取当前会话列表") + uploadCommandResult(message, ExecCallbackBean.ERROR_SEND_MESSAGE, "无法获取当前会话列表,请确保在微信首页", startTime, listOf(), titleList) + return false + } + val notFoundList = titleList.filter { title -> + currentRoomList.none { it == title || it.replace(Constant.digitalRegex, "") == title || title.replace(Constant.digitalRegex, "") == it } + } + if (notFoundList.isNotEmpty()) { + LogUtils.d("以下会话不存在: ${notFoundList.joinToString()}") + uploadCommandResult(message, ExecCallbackBean.ERROR_SEND_MESSAGE, "会话不存在: ${notFoundList.joinToString()}", startTime, listOf(), titleList) + return false + } + + val successList = arrayListOf() + val failList = arrayListOf() + for (title in LinkedHashSet(titleList)) { + if (WeworkRoomUtil.intoRoom(title) || WeworkRoomUtil.intoRoom(title, fastIn = false)) { + if (textType?.let { + WeworkTextUtil.longClickMessageItem( + //聊天消息列表 1ListView 0RecycleView xViewGroup + AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView), + it, + receivedName, + originalContent, + "回复", "引用" + ) + } == true + ) { + LogUtils.v("开始回复") + if (sendChatMessage(receivedContent, reply = true, title = title)) { + LogUtils.d("$title: 回复成功") + successList.add(title) + uploadCommandResult(message, ExecCallbackBean.SUCCESS, "", startTime, successList, failList) + return true + } else { + LogUtils.d("$title: 回复发送失败") + failList.add(title) + uploadCommandResult(message, ExecCallbackBean.ERROR_SEND_MESSAGE, "回复发送失败", startTime, successList, failList) + return false + } + } else { + LogUtils.d("$title: 回复失败 直接发送答案") + error("$title: 回复失败 直接发送答案 $receivedContent") + val text = if (originalContent.isNotEmpty()) "【$originalContent】\n$receivedContent" else receivedContent + if (sendChatMessage(text, receivedName, title = title)) { + LogUtils.d("$title: 直接发送答案成功") + successList.add(title) + uploadCommandResult(message, ExecCallbackBean.SUCCESS, "", startTime, successList, failList) + return true + } else { + LogUtils.d("$title: 直接发送答案失败") + failList.add(title) + uploadCommandResult(message, ExecCallbackBean.ERROR_SEND_MESSAGE, "直接发送答案失败", startTime, successList, failList) + return false + } + } + } else { + error("$title: 回复失败 $receivedContent") + LogUtils.d("进入房间失败 $title") + failList.add(title) + uploadCommandResult(message, ExecCallbackBean.ERROR_INTO_ROOM, "进入房间失败 $title", startTime, successList, failList) + return false + } + } + LogUtils.d("房间名为空") + uploadCommandResult(message, ExecCallbackBean.ERROR_ILLEGAL_DATA, "房间名为空", startTime, listOf(), titleList) + return false } /** * 在房间内转发消息