refactor(task): 重构 toolbar_home,提取 toolbar_menu

1. toolbar_home 改用 HsvColorFilter 预处理器实现
2. image.expect_wait(R.Daily.IconMenu) 提取为 toolbar_menu 函数
This commit is contained in:
XcantloadX 2025-03-16 12:22:43 +08:00
parent b831e9e2bd
commit 425e998adb
3 changed files with 45 additions and 16 deletions

View File

Before

Width:  |  Height:  |  Size: 474 B

After

Width:  |  Height:  |  Size: 474 B

View File

@ -1,10 +1,11 @@
"""领取社团奖励,并尽可能地给其他人送礼物"""
import logging
from kotonebot import task, device, image, sleep, ocr
from . import R
from .common import conf
from .actions.scenes import at_home, goto_home
from kotonebot.tasks.game_ui import toolbar_menu
from kotonebot import task, device, image, sleep, ocr
logger = logging.getLogger(__name__)
@ -23,7 +24,7 @@ def club_reward():
# 进入社团UI
logger.info('Entering club UI')
device.click(image.expect_wait(R.Daily.IconMenu, timeout=5))
device.click(toolbar_menu(True))
device.click(image.expect_wait(R.Daily.IconMenuClub, timeout=5))
sleep(3)

View File

@ -1,16 +1,19 @@
from dataclasses import dataclass
from typing import Literal, NamedTuple
from typing import Literal, NamedTuple, overload
import cv2
import numpy as np
from cv2.typing import MatLike
from kotonebot.backend.image import TemplateMatchResult
from . import R
from kotonebot import action, device, color, image, ocr, sleep
from kotonebot.backend.color import HsvColor
from kotonebot.util import Rect
from kotonebot.backend.core import HintBox, Image
from kotonebot.backend.preprocessor import HsvColorFilter
import cv2
from cv2.typing import MatLike
@action('按钮是否禁用', screenshot_mode='manual-inherit')
def button_state(*, target: Image | None = None, rect: Rect | None = None) -> bool | None:
@ -189,20 +192,45 @@ class CommuEventButtonUI:
ocr_result = ocr.raw().ocr(img, rect=rects[0])
return ocr_result.squash().text
def filter_white(img: MatLike):
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_white = np.array([0, 0, 180])
upper_white = np.array([180, 50, 255])
return cv2.inRange(hsv, lower_white, upper_white)
class WhiteFilter(HsvColorFilter):
def __init__(self):
super().__init__(WHITE_LOW, WHITE_HIGH)
@overload
def toolbar_home(critical: Literal[False] = False) -> TemplateMatchResult | None:
"""寻找工具栏上的首页按钮。"""
...
@overload
def toolbar_home(critical: Literal[True]) -> TemplateMatchResult:
"""寻找工具栏上的首页按钮。若未找到,则抛出异常。"""
...
# TODO: image 对象加入自定义 hook处理 post-process 和 pre-process
@action('工具栏按钮.寻找首页', screenshot_mode='manual-inherit')
def toolbar_home():
img = device.screenshot()
img = filter_white(img)
result = image.raw().find(img, R.Common.ButtonToolbarHomeBinary.binary())
return result
def toolbar_home(critical: bool = False):
device.screenshot()
if critical:
return image.expect_wait(R.Common.ButtonToolbarHome, preprocessors=[WhiteFilter()])
else:
return image.find(R.Common.ButtonToolbarHome, preprocessors=[WhiteFilter()])
@overload
def toolbar_menu(critical: Literal[False] = False) -> TemplateMatchResult | None:
"""寻找工具栏上的菜单按钮。"""
...
@overload
def toolbar_menu(critical: Literal[True]) -> TemplateMatchResult:
"""寻找工具栏上的菜单按钮。若未找到,则抛出异常。"""
...
@action('工具栏按钮.寻找菜单', screenshot_mode='manual-inherit')
def toolbar_menu(critical: bool = False):
device.screenshot()
if critical:
return image.expect_wait(R.Common.ButtonToolbarMenu, preprocessors=[WhiteFilter()])
else:
return image.find(R.Common.ButtonToolbarMenu, preprocessors=[WhiteFilter()])
if __name__ == '__main__':
from pprint import pprint as print