diff --git a/konabot/common/nb/qq_broadcast.py b/konabot/common/nb/qq_broadcast.py new file mode 100644 index 0000000..8adab2f --- /dev/null +++ b/konabot/common/nb/qq_broadcast.py @@ -0,0 +1,30 @@ +from typing import Any, cast +import nonebot +from nonebot_plugin_alconna import UniMessage +from nonebot.adapters.onebot.v11 import Bot as OBBot + + +async def qq_broadcast(groups: list[str], msg: UniMessage[Any]): + bots: dict[str, OBBot] = {} + + # group_id -> bot_id + availabilities: dict[str, str] = {} + + for bot_id, bot in nonebot.get_bots().items(): + if not isinstance(bot, OBBot): + continue + bots[bot_id] = bot + gl = await bot.get_group_list() + for g in gl: + gid = str(g.get("group_id", -1)) + if gid in groups: + availabilities[gid] = bot_id + + for group in groups: + if group in availabilities: + bot = bots[availabilities[group]] + await bot.send_group_msg( + group_id=int(group), + message=cast(Any, await msg.export(bot)), + auto_escape=False, + ) diff --git a/konabot/plugins/kona_ph/__init__.py b/konabot/plugins/kona_ph/__init__.py index 51fdcef..949f9f3 100644 --- a/konabot/plugins/kona_ph/__init__.py +++ b/konabot/plugins/kona_ph/__init__.py @@ -1,9 +1,13 @@ from math import ceil +from loguru import logger from nonebot_plugin_alconna import Alconna, Args, UniMessage, on_alconna +from konabot.common.nb.qq_broadcast import qq_broadcast from konabot.plugins.kona_ph.core.storage import get_today_date from konabot.plugins.kona_ph.manager import PUZZLE_PAGE_SIZE, create_admin_commands, config, puzzle_manager from konabot.common.longtask import DepLongTaskTarget +from nonebot_plugin_apscheduler import scheduler + create_admin_commands() @@ -84,3 +88,14 @@ async def _(target: DepLongTaskTarget, index_id: str = "", page: int = 1): msg = msg.text(f"\n==== 第 {page} 页,共 {count_pages} 页 ====") await target.send_message(msg) + +@scheduler.scheduled_job("cron", hour="8") +async def _(): + async with puzzle_manager() as manager: + puzzle = manager.get_today_puzzle() + if puzzle is not None: + logger.info(f"找到了题目 {puzzle.raw_id},发送") + await qq_broadcast(config.plugin_puzzle_playgroup, puzzle.get_unimessage()) + else: + logger.info("自动任务:没有找到题目,跳过") + diff --git a/konabot/plugins/kona_ph/manager.py b/konabot/plugins/kona_ph/manager.py index 786d4dc..f4d4d54 100644 --- a/konabot/plugins/kona_ph/manager.py +++ b/konabot/plugins/kona_ph/manager.py @@ -7,6 +7,7 @@ from pydantic import BaseModel from konabot.common.longtask import DepLongTaskTarget from konabot.common.nb.extract_image import download_image_bytes +from konabot.common.nb.qq_broadcast import qq_broadcast from konabot.plugins.kona_ph.core.storage import Puzzle, get_today_date, puzzle_manager PUZZLE_PAGE_SIZE = 10 @@ -322,6 +323,7 @@ def create_admin_commands(): p = manager.get_today_puzzle(strong=True) if p is None: return await target.send_message("上架失败了orz,可能是没题了") + await qq_broadcast(config.plugin_puzzle_playgroup, p.get_unimessage()) return await target.send_message("Ok!") return cmd_admin