From 5feffec13491b538d17504a7dda6782a9622b1a4 Mon Sep 17 00:00:00 2001 From: gallonyin Date: Fri, 28 Oct 2022 11:49:38 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E8=A7=A3=E6=95=A3=E7=BE=A4;=E6=94=B9?= =?UTF-8?q?=E7=BE=A4=E6=A8=A1=E6=9D=BF;=E8=BF=87=E6=BB=A4=E5=B7=B2?= =?UTF-8?q?=E9=80=80=E5=87=BA=E7=BE=A4=E8=81=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worktool/model/ExecCallbackBean.kt | 4 + .../worktool/model/WeworkMessageBean.java | 1 + .../org/yameida/worktool/service/MyLooper.kt | 3 + .../worktool/service/WeworkController.kt | 24 +++- .../worktool/service/WeworkOperationImpl.kt | 105 +++++++++++++++++- .../yameida/worktool/utils/HostTestHelper.kt | 35 ++++++ .../yameida/worktool/utils/WeworkRoomUtil.kt | 20 +++- 7 files changed, 178 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/yameida/worktool/model/ExecCallbackBean.kt b/app/src/main/java/org/yameida/worktool/model/ExecCallbackBean.kt index 4f09b92..23e4967 100644 --- a/app/src/main/java/org/yameida/worktool/model/ExecCallbackBean.kt +++ b/app/src/main/java/org/yameida/worktool/model/ExecCallbackBean.kt @@ -32,6 +32,8 @@ data class ExecCallbackBean( const val ERROR_ILLEGAL_DATA = 101011 //非法操作 const val ERROR_ILLEGAL_OPERATION = 101012 + //非法权限 + const val ERROR_ILLEGAL_PERMISSION = 101013 //创建群失败 const val ERROR_CREATE_GROUP = 201011 @@ -45,6 +47,8 @@ data class ExecCallbackBean( const val ERROR_GROUP_CHANGE_ANNOUNCEMENT = 201015 //改群备注失败 const val ERROR_GROUP_CHANGE_REMARK = 201016 + //改群模板失败 + const val ERROR_GROUP_TEMPLATE = 201017 //查找聊天窗失败 const val ERROR_INTO_ROOM = 201101 //发送消息失败 diff --git a/app/src/main/java/org/yameida/worktool/model/WeworkMessageBean.java b/app/src/main/java/org/yameida/worktool/model/WeworkMessageBean.java index 80ffbba..e7b7c6e 100644 --- a/app/src/main/java/org/yameida/worktool/model/WeworkMessageBean.java +++ b/app/src/main/java/org/yameida/worktool/model/WeworkMessageBean.java @@ -65,6 +65,7 @@ public class WeworkMessageBean { public static final int UPDATE_ANTI_HARASSMENT_RULE = 216; public static final int DELETED_ANTI_HARASSMENT_RULE = 217; public static final int PUSH_FILE = 218; + public static final int DISMISS_GROUP = 219; public static final int ROBOT_LOG = 301; public static final int ROBOT_ERROR_LOG = 302; diff --git a/app/src/main/java/org/yameida/worktool/service/MyLooper.kt b/app/src/main/java/org/yameida/worktool/service/MyLooper.kt index 489d13b..3759e8f 100644 --- a/app/src/main/java/org/yameida/worktool/service/MyLooper.kt +++ b/app/src/main/java/org/yameida/worktool/service/MyLooper.kt @@ -138,6 +138,9 @@ object MyLooper { WeworkMessageBean.PUSH_FILE -> { WeworkController.pushFile(message) } + WeworkMessageBean.DISMISS_GROUP -> { + WeworkController.dismissGroup(message) + } WeworkMessageBean.PASS_ALL_FRIEND_REQUEST -> { } WeworkMessageBean.ADD_FRIEND_BY_PHONE -> { 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 2fa495a..6aeebb2 100644 --- a/app/src/main/java/org/yameida/worktool/service/WeworkController.kt +++ b/app/src/main/java/org/yameida/worktool/service/WeworkController.kt @@ -119,16 +119,18 @@ object WeworkController { * @param message#selectList 添加群成员名称列表 选填 * @param message#groupAnnouncement 修改群公告 选填 * @param message#groupRemark 修改群备注 选填 + * @param message#groupTemplate 修改群模板 选填 */ @RequestMapping fun initGroup(message: WeworkMessageBean): Boolean { - LogUtils.d("initGroup(): ${message.groupName} ${message.selectList} ${message.groupAnnouncement} ${message.groupRemark}") + LogUtils.d("initGroup(): ${message.groupName} ${message.selectList} ${message.groupAnnouncement} ${message.groupRemark} ${message.groupTemplate}") return WeworkOperationImpl.initGroup( message, message.groupName, message.selectList, message.groupAnnouncement, - message.groupRemark + message.groupRemark, + message.groupTemplate ) } @@ -150,25 +152,41 @@ object WeworkController { * @param message#newGroupName 修改群名 选填 * @param message#newGroupAnnouncement 修改群公告 选填 * @param message#groupRemark 修改群备注 选填 + * @param message#groupTemplate 修改群模板 选填 * @param message#selectList 添加群成员名称列表/拉人 选填 * @param message#showMessageHistory 拉人是否附带历史记录 选填 * @param message#removeList 移除群成员名称列表/踢人 选填 */ @RequestMapping fun intoGroupAndConfig(message: WeworkMessageBean): Boolean { - LogUtils.d("intoGroupAndConfig(): ${message.groupName} ${message.newGroupName} ${message.newGroupAnnouncement} ${message.selectList} ${message.showMessageHistory} ${message.removeList} ${message.groupRemark}") + LogUtils.d("intoGroupAndConfig(): ${message.groupName} ${message.newGroupName} ${message.newGroupAnnouncement} ${message.selectList} ${message.showMessageHistory} ${message.removeList} ${message.groupRemark} ${message.groupTemplate}") return WeworkOperationImpl.intoGroupAndConfig( message, message.groupName, message.newGroupName, message.newGroupAnnouncement, message.groupRemark, + message.groupTemplate, message.selectList, message.showMessageHistory, message.removeList ) } + /** + * 解散群聊 + * @see WeworkMessageBean.DISMISS_GROUP + * @param message#groupName 待解散的群 + */ + @RequestMapping + fun dismissGroup(message: WeworkMessageBean): Boolean { + LogUtils.d("dismissGroup(): ${message.groupName}") + return WeworkOperationImpl.dismissGroup( + message, + message.groupName + ) + } + /** * 推送微盘图片 * @see WeworkMessageBean.PUSH_MICRO_DISK_IMAGE 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 7c879b1..afac70c 100644 --- a/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt +++ b/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt @@ -195,23 +195,23 @@ object WeworkOperationImpl { * 7.设置入群欢迎语 默认为空 * 8.拉入机器人 暂不开发 * 9.防骚扰 默认警告模式 - * 10.使用群配置模板 延迟开发 + * 10.使用群配置模板 * 11.消息免打扰 默认禁止 * 12.保存到通讯录 默认开启 * 注:群配置模板 1.群名称 2.禁群改名(使用) 3.设置管理员 4.入群欢迎语(使用) 5.自动回复 6.防骚扰规则(使用) - * 必须人工给机器人预先设置防骚扰规则 规则名"机器人" - * 必须人工给机器人预先设置群配置模板 模板名"机器人" * @param groupName 修改群名称 * @param selectList 添加群成员名称列表 选填 * @param groupAnnouncement 修改群公告 选填 * @param groupRemark 修改群备注 选填 + * @param groupTemplate 修改群模板 选填 */ fun initGroup( message: WeworkMessageBean, groupName: String, selectList: List?, groupAnnouncement: String?, - groupRemark: String? + groupRemark: String?, + groupTemplate: String ): Boolean { val startTime = System.currentTimeMillis() if (!WeworkRoomUtil.isGroupExists(groupName)) { @@ -236,6 +236,10 @@ object WeworkOperationImpl { uploadCommandResult(message, ExecCallbackBean.ERROR_GROUP_CHANGE_REMARK, "创建群成功 群改名成功 群拉人成功 群公告成功 群备注失败", startTime) return false } + if (!groupTemplate(groupTemplate)) { + uploadCommandResult(message, ExecCallbackBean.ERROR_GROUP_TEMPLATE, "创建群成功 群改名成功 群拉人成功 群公告成功 群备注成功 群模板失败", startTime) + return false + } getGroupQrcode(groupName, groupRemark) uploadCommandResult(message, ExecCallbackBean.SUCCESS, "", startTime) return true @@ -248,6 +252,7 @@ object WeworkOperationImpl { * @param newGroupName 修改群名 选填 * @param newGroupAnnouncement 修改群公告 选填 * @param groupRemark 修改群备注 选填 + * @param groupTemplate 修改群模板 选填 * @param selectList 添加群成员名称列表/拉人 选填 * @param showMessageHistory 拉人是否附带历史记录 选填 * @param removeList 移除群成员名称列表/踢人 选填 @@ -258,6 +263,7 @@ object WeworkOperationImpl { newGroupName: String?, newGroupAnnouncement: String?, groupRemark: String?, + groupTemplate: String?, selectList: List?, showMessageHistory: Boolean = false, removeList: List? @@ -287,10 +293,56 @@ object WeworkOperationImpl { uploadCommandResult(message, ExecCallbackBean.ERROR_GROUP_CHANGE_REMARK, "进入房间成功 群改名成功 群拉人成功 群公告成功 群备注失败", startTime) return false } + if (!groupTemplate(groupTemplate)) { + uploadCommandResult(message, ExecCallbackBean.ERROR_GROUP_TEMPLATE, "进入房间成功 群改名成功 群拉人成功 群公告成功 群备注成功 群模板失败", startTime) + return false + } uploadCommandResult(message, ExecCallbackBean.SUCCESS, "", startTime) return true } + /** + * 解散群聊 + * @see WeworkMessageBean.DISMISS_GROUP + * @param groupName 待解散的群 + */ + fun dismissGroup( + message: WeworkMessageBean, + groupName: String + ): Boolean { + val startTime = System.currentTimeMillis() + if (WeworkRoomUtil.intoRoom(groupName) && WeworkRoomUtil.intoGroupManager()) { + val groupManagerTv = + AccessibilityUtil.findOneByText(getRoot(), "群管理", exact = true, timeout = 2000) + if (groupManagerTv != null) { + AccessibilityUtil.performClick(groupManagerTv) + val dismissTv = + AccessibilityUtil.findOneByText(getRoot(), "解散群聊", exact = true, timeout = 2000) + AccessibilityUtil.performClick(dismissTv) + if (dismissTv != null) { + val confirmTv = AccessibilityUtil.findOneByText(getRoot(), "解散", "确定", exact = true, timeout = 2000) + if (confirmTv != null) { + AccessibilityUtil.performClick(confirmTv) + uploadCommandResult(message, ExecCallbackBean.SUCCESS, "", startTime) + return true + } else { + uploadCommandResult(message, ExecCallbackBean.ERROR_BUTTON, "未找到解散按钮 $groupName", startTime) + return false + } + } else { + uploadCommandResult(message, ExecCallbackBean.ERROR_BUTTON, "未找到解散群聊按钮 $groupName", startTime) + return false + } + } else { + uploadCommandResult(message, ExecCallbackBean.ERROR_BUTTON, "未找到群管理按钮 $groupName", startTime) + return false + } + } else { + uploadCommandResult(message, ExecCallbackBean.ERROR_INTO_ROOM, "进入房间失败 $groupName", startTime) + return false + } + } + /** * 推送微盘图片(不推荐) * @see pushFile @@ -495,6 +547,11 @@ object WeworkOperationImpl { extraText: String? = null ): Boolean { val startTime = System.currentTimeMillis() + if (!PermissionUtils.isGrantedDrawOverlays()) { + LogUtils.e("未打开悬浮窗权限") + uploadCommandResult(message, ExecCallbackBean.ERROR_ILLEGAL_PERMISSION, "未打开悬浮窗权限", startTime) + return false + } LogUtils.i("下载开始 $fileUrl") val execute = OkGo.get(fileUrl).execute() LogUtils.i("下载完成 $fileUrl") @@ -745,7 +802,8 @@ object WeworkOperationImpl { for (i in 0 until selectListView.childCount) { val item = selectListView.getChild(i) val searchResult = AccessibilityUtil.findOnceByTextRegex(item, regex) - if (searchResult != null) { + //过滤已退出的群聊 + if (searchResult != null && searchResult.parent.childCount < 3) { item.refresh() val imageView = AccessibilityUtil.findOneByClazz(item, Views.ImageView, root = false) @@ -1107,6 +1165,43 @@ object WeworkOperationImpl { return false } + /** + * 修改群模板 + */ + private fun groupTemplate(groupTemplate: String?): Boolean { + if (groupTemplate == null) return true + if (WeworkRoomUtil.intoGroupManager()) { + val textView = AccessibilityUtil.findOneByText(getRoot(), "使用模板快速配置群", exact = true) + if (textView != null) { + AccessibilityUtil.performClick(textView) + val item = AccessibilityUtil.findOneByDesc(getRoot(), groupTemplate) + if (item != null) { + AccessibilityUtil.performClick(item) + val useTemplateTv = AccessibilityUtil.findOneByDesc(getRoot(), "使用该模板") + if (useTemplateTv != null) { + AccessibilityUtil.performClick(useTemplateTv) + val useTv = AccessibilityUtil.findOneByDesc(getRoot(), "使用") + if (useTv != null) { + AccessibilityUtil.performClick(useTv) + return true + } else { + LogUtils.e("未找到使用按钮: $groupTemplate") + } + } else { + LogUtils.e("未找到使用该模板按钮: $groupTemplate") + } + } else { + LogUtils.e("未找到指定配置: $groupTemplate") + } + } else { + LogUtils.e("未找到使用模板按钮") + } + } else { + LogUtils.e("进入群管理页失败") + } + return false + } + /** * 发送消息+@at */ diff --git a/app/src/main/java/org/yameida/worktool/utils/HostTestHelper.kt b/app/src/main/java/org/yameida/worktool/utils/HostTestHelper.kt index f7994a6..2803e82 100644 --- a/app/src/main/java/org/yameida/worktool/utils/HostTestHelper.kt +++ b/app/src/main/java/org/yameida/worktool/utils/HostTestHelper.kt @@ -5,11 +5,17 @@ import com.blankj.utilcode.util.ToastUtils import com.lzy.okgo.OkGo import com.lzy.okgo.callback.StringCallback import com.lzy.okgo.model.Response +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.WebSocket +import okhttp3.WebSocketListener +import okio.ByteString import org.yameida.worktool.Constant object HostTestHelper { fun test() { + OkHttpUtil OkGo.get(Constant.getTestUrl()) .execute(object : StringCallback() { override fun onSuccess(response: Response) { @@ -25,4 +31,33 @@ object HostTestHelper { }) } + fun testWs() { + val s = OkHttpClient().newWebSocket(Request.Builder().url(Constant.getWsUrl()).build(), + object : WebSocketListener() { + override fun onOpen(webSocket: WebSocket, response: okhttp3.Response) { + ToastUtils.showLong("链接: ${Constant.getWsUrl()}\nonOpen\n" + response.body()) + } + + override fun onMessage(webSocket: WebSocket, text: String) { + ToastUtils.showLong("链接: ${Constant.getWsUrl()}\nonMessage\ntext:$text") + } + + override fun onMessage(webSocket: WebSocket, bytes: ByteString) { + ToastUtils.showLong("链接: ${Constant.getWsUrl()}\nonMessage\nbytes:$bytes") + } + + override fun onClosing(webSocket: WebSocket, code: Int, reason: String) { + ToastUtils.showLong("链接: ${Constant.getWsUrl()}\nonClosing\ncode:$code reason:$reason") + } + + override fun onClosed(webSocket: WebSocket, code: Int, reason: String) { + ToastUtils.showLong("链接: ${Constant.getWsUrl()}\nonClosed\ncode:$code reason:$reason") + } + + override fun onFailure(webSocket: WebSocket, t: Throwable, response: okhttp3.Response?) { + ToastUtils.showLong("链接: ${Constant.getWsUrl()}\nonClosed\nresponse:${response?.body()} t:${t.message}") + } + }) + } + } \ No newline at end of file diff --git a/app/src/main/java/org/yameida/worktool/utils/WeworkRoomUtil.kt b/app/src/main/java/org/yameida/worktool/utils/WeworkRoomUtil.kt index 8a22edb..dbd18fa 100644 --- a/app/src/main/java/org/yameida/worktool/utils/WeworkRoomUtil.kt +++ b/app/src/main/java/org/yameida/worktool/utils/WeworkRoomUtil.kt @@ -106,17 +106,25 @@ object WeworkRoomUtil { val selectListView = findOneByClazz(getRoot(), Views.ListView) val reverseRegexTitle = RegexHelper.reverseRegexTitle(trimTitle) val regex = "^$reverseRegexTitle" + if (needTrim) ".*?" else "(-.*)?(…)?(\\(.*?\\))?$" - val searchResult = AccessibilityUtil.findOneByTextRegex( + val searchResult = AccessibilityUtil.findAllByTextRegex( selectListView, regex, timeout = 2000, root = false ) - if (searchResult != null) { - AccessibilityUtil.performClick(searchResult) - LogUtils.d("进入房间: $title") - sleep(Constant.CHANGE_PAGE_INTERVAL) - return true + if (searchResult.isNotEmpty()) { + //过滤已退出的群聊 + val searchItem = searchResult.firstOrNull { + it.parent.childCount < 3 + } + if (searchItem != null) { + AccessibilityUtil.performClick(searchItem) + LogUtils.d("进入房间: $title") + sleep(Constant.CHANGE_PAGE_INTERVAL) + return true + } else { + LogUtils.e("搜索到已退出群聊") + } } else { LogUtils.e("未搜索到结果") }