type: 收窄斗鱼手册与送礼执行器类型

This commit is contained in:
yml2213
2026-08-30 20:00:09 +08:00
parent 38fd809ca4
commit 9a5066cae8
2 changed files with 137 additions and 31 deletions
+72 -18
View File
@@ -3,6 +3,7 @@
from __future__ import annotations
import time
from datetime import datetime, timezone
from typing import Any, TYPE_CHECKING
from sqlalchemy.orm import Session
from core.douyu import DouyuActivityClient, DouyuActivityError
@@ -10,8 +11,31 @@ from ..models import Account, DouyuTask
from .douyu_service import account_uid, update_account_profile_from_cookie
from .douyu_runner_core import DOUYU_PAYMENT_POLL_INTERVAL, DOUYU_PAYMENT_POLL_SECONDS
if TYPE_CHECKING:
from .douyu_runner import DouyuBatchRunner
class ManualMixin:
"""手册域:精英/电竞手册开通支付、积分查询与到账轮询。"""
if TYPE_CHECKING:
_stop: Any
@staticmethod
def _to_int(value: Any) -> int | None: ...
def _client(self, cookie: str) -> DouyuActivityClient: ...
def _task_payload(self, task: DouyuTask) -> dict: ...
def _push_log(self, level: str, message: str) -> None: ...
def _mark_task(self, *args: Any, **kwargs: Any) -> None: ...
def _update_task_progress(self, *args: Any, **kwargs: Any) -> None: ...
@classmethod
def _confirm_act_alias(cls, config: dict) -> str: ...
@classmethod
def _bind_qr_act_alias(cls, config: dict) -> str: ...
def _refresh_account_points(
self,
client: DouyuActivityClient,
@@ -51,7 +75,9 @@ class ManualMixin:
last_points = None
while not self._stop.is_set() and time.monotonic() <= deadline:
try:
points_result = self._refresh_account_points(client, account, cookie, ctn=ctn)
points_result = self._refresh_account_points(
client, account, cookie, ctn=ctn
)
db.commit()
poll_count += 1
last_points = points_result["points"]
@@ -73,7 +99,9 @@ class ManualMixin:
poll_count += 1
result["payment_poll_count"] = poll_count
result["payment_poll_error"] = str(exc)
self._update_task_progress(db, task, "running", f"等待开通到账: {exc}", result)
self._update_task_progress(
db, task, "running", f"等待开通到账: {exc}", result
)
if self._stop.wait(DOUYU_PAYMENT_POLL_INTERVAL):
break
result["payment_polling"] = False
@@ -138,10 +166,7 @@ class ManualMixin:
result.update(handbook_result)
result["payment_poll_count"] = poll_count
result["payment_polling"] = True
opened = (
last_manual_type is not None
and last_manual_type >= 1
) or (
opened = (last_manual_type is not None and last_manual_type >= 1) or (
baseline_manual_score is not None
and last_manual_score is not None
and last_manual_score > baseline_manual_score
@@ -163,7 +188,9 @@ class ManualMixin:
poll_count += 1
result["payment_poll_count"] = poll_count
result["payment_poll_error"] = str(exc)
self._update_task_progress(db, task, "running", f"等待电竞手册到账: {exc}", result)
self._update_task_progress(
db, task, "running", f"等待电竞手册到账: {exc}", result
)
if self._stop.wait(DOUYU_PAYMENT_POLL_INTERVAL):
break
@@ -175,7 +202,9 @@ class ManualMixin:
result["points"] = last_manual_score
return False
def _execute_create_elite_qr(self, db: Session, task: DouyuTask, account: Account, cookie: str, config: dict):
def _execute_create_elite_qr(
self, db: Session, task: DouyuTask, account: Account, cookie: str, config: dict
):
client = self._client(cookie)
ctn = str(self._task_payload(task).get("ctn") or "")
if not ctn:
@@ -192,15 +221,21 @@ class ManualMixin:
)
account.bind_status = "elite_qr_created"
account.updated_at = datetime.now(timezone.utc)
self._update_task_progress(db, task, "running", "精英宝典支付码已生成,等待开通到账", result)
opened = self._wait_points_after_payment(db, task, account, client, cookie, ctn, result)
self._update_task_progress(
db, task, "running", "精英宝典支付码已生成,等待开通到账", result
)
opened = self._wait_points_after_payment(
db, task, account, client, cookie, ctn, result
)
if self._stop.is_set():
self._mark_task(db, task, "stopped", "任务已停止", result)
return
if opened:
account.bind_status = "elite_opened"
account.updated_at = datetime.now(timezone.utc)
self._mark_task(db, task, "success", f"精英宝典已开通,积分: {account.points}", result)
self._mark_task(
db, task, "success", f"精英宝典已开通,积分: {account.points}", result
)
return
self._mark_task(
db,
@@ -226,14 +261,18 @@ class ManualMixin:
act_alias = str(config.get("esports_act_alias") or "").strip()
manual_id = str(config.get("esports_manual_id") or "").strip()
if not act_alias or not manual_id:
self._mark_task(db, task, "failed", "请先配置电竞手册活动 actAlias 和 manualID")
self._mark_task(
db, task, "failed", "请先配置电竞手册活动 actAlias 和 manualID"
)
return
baseline_manual_type = None
baseline_manual_score = None
baseline_result: dict = {}
try:
baseline_result = self._refresh_esports_handbook(client, account, manual_id=manual_id)
baseline_result = self._refresh_esports_handbook(
client, account, manual_id=manual_id
)
baseline_manual_type = baseline_result["esports_manual_type"]
baseline_manual_score = baseline_result["esports_manual_score"]
db.commit()
@@ -261,7 +300,9 @@ class ManualMixin:
result.update(baseline_result)
account.esports_bind_status = "esports_qr_created"
account.updated_at = datetime.now(timezone.utc)
self._update_task_progress(db, task, "running", "电竞手册支付码已生成,等待开通到账", result)
self._update_task_progress(
db, task, "running", "电竞手册支付码已生成,等待开通到账", result
)
opened = self._wait_esports_open_after_payment(
db,
task,
@@ -314,14 +355,27 @@ class ManualMixin:
account.esports_bind_status = "esports_points_queried"
account.updated_at = datetime.now(timezone.utc)
points = result["esports_points"]
self._mark_task(db, task, "success", f"电竞积分: {points if points is not None else '-'}", result)
self._mark_task(
db,
task,
"success",
f"电竞积分: {points if points is not None else '-'}",
result,
)
def _execute_query_points(self, db: Session, task: DouyuTask, account: Account, cookie: str, config: dict):
def _execute_query_points(
self, db: Session, task: DouyuTask, account: Account, cookie: str, config: dict
):
client = self._client(cookie)
ctn = client.acf_ccn(refresh_subscribe=False)
result = self._refresh_account_points(client, account, cookie, ctn=ctn)
account.bind_status = "points_queried"
account.updated_at = datetime.now(timezone.utc)
points = result["points"]
self._mark_task(db, task, "success", f"积分: {points if points is not None else '-'}", result)
self._mark_task(
db,
task,
"success",
f"积分: {points if points is not None else '-'}",
result,
)