Compare commits

...

3 commits

Author SHA1 Message Date
c5571899d3 活动室汇总邮件通知
All checks were successful
ci/woodpecker/push/check_format Pipeline was successful
2025-02-02 15:55:20 +08:00
3d0621c84b 活动室user改为头像识别 2025-02-02 12:56:59 +08:00
b42b052e29 活动商店点击物品使用ctap
All checks were successful
ci/woodpecker/push/check_format Pipeline was successful
2025-02-02 09:32:53 +08:00
2 changed files with 50 additions and 24 deletions

View file

@ -1,12 +1,10 @@
import cv2
from mower.solvers.fight.battle_choose.battle_fill_choose import BattleFillChooseSolver
from mower.solvers.infra.base_mixin import BaseMixin
from mower.utils import config
from mower.utils.character_recognize import match_portrait
from mower.utils.character_recognize import match_avatar
from mower.utils.email import assistants_template, send_message
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import ss
from .enter_activity import EnterActivitySolver
@ -16,34 +14,38 @@ class SwitchActivityUsersSolver(BaseSolver, BaseMixin):
def run(self):
self.flag = True
self.limit = config.conf.trust_limit # 设置的信赖值阈值
self.assistants_before = [] # 记录切换前的干员
self.assistants_after = [] # 记录切换后的干员
self.black_list = []
for i in range(1, 4):
if not self.flag:
break
self.num = i
if EnterActivitySolver().run(i):
self.switched = False
self.need_switch = False
super().run()
send_message(
assistants_template.render(
assistants_before=self.assistants_before,
assistants_after=self.assistants_after,
limit=str(self.limit) + "%",
),
"活动室信赖汇总通知",
"INFO",
)
def detect_oper(self) -> str:
return match_portrait(
cv2.resize(config.recog.gray, (int(1920 / 1.5), int(1080 / 1.5))),
segment=[ss(2 / 3, 2 / 3, ((1450, 400), (1670, 530)))],
return match_avatar(
config.recog.gray,
segment=[((20, 935), (135, 1015))],
)[0][0]
def transition(self) -> bool:
if (scene := self.scene()) == Scene.ACTIVITY_ROOM_DETAILS:
if self.animation(ratio=0.2):
return
if (
self.find("no_user")
or config.recog.num.number_int(
"riic_base", ((220, 920), (330, 970)), 23, 130, rect_ed=-3
)
>= config.conf.trust_limit
):
if self.switched:
self.flag = False
if self.need_switch and not self.switched:
if not self.flag:
return True
if self.find("user_on"):
self.ctap((1550, 480), 3)
@ -51,7 +53,30 @@ class SwitchActivityUsersSolver(BaseSolver, BaseMixin):
return
self.ctap("user", 3)
return
return True
if self.find("no_user"):
self.assistants_before.append(["活动室" + str(self.num), None])
self.need_switch = True
else:
oper = self.detect_oper()
num = config.recog.num.number_int(
"riic_base", ((220, 920), (330, 970)), 23, 130, rect_ed=-3
)
if self.switched:
self.assistants_after.append(
["活动室" + str(self.num), oper, str(num) + "%"]
)
if num >= self.limit:
self.flag = False
return True
self.assistants_before.append(
["活动室" + str(self.num), oper, str(num) + "%"]
)
if num >= self.limit:
self.need_switch = True
return
return True
elif scene == Scene.OPERATOR_AGENT_SELECT:
name = BattleFillChooseSolver().run("信赖值", 1, self.black_list)
self.black_list.append(name[0])

View file

@ -67,9 +67,8 @@ class Shop(BaseSolver):
name = crop2content(name)
name = ocr_rec(name)
if name not in config.conf.activity_shop_blacklist:
self.product = name
return va(top_left, (245, 110))
return None
return name, va(top_left, (245, 110))
return None, None
def transition(self):
if (scene := self.scene()) == Scene.TERMINAL_MAIN:
@ -79,8 +78,10 @@ class Shop(BaseSolver):
elif scene == Scene.ACTIVITY_SHOP:
if self.animation():
return
if pos := self.next_product():
self.tap(pos)
name, pos = self.next_product()
if pos is not None:
if self.ctap(pos):
self.product = name
return
self.swipe_ext([(1600, 340), (300, 340), (300, 150)], [0.2, 0.3], 0, 0.1)
elif scene == Scene.ACTIVITY_SHOP_BUY: