diff --git a/app/dependencies/database.py b/app/dependencies/database.py index 77b15c3..a6b6e5c 100644 --- a/app/dependencies/database.py +++ b/app/dependencies/database.py @@ -38,3 +38,7 @@ async def create_tables(): # Redis 依赖 def get_redis(): return redis_client + + +def get_redis_pubsub(channel: str | None = None): + return redis_client.pubsub(ignore_subscribe_messages=True, channel=channel) diff --git a/app/service/daily_challenge.py b/app/service/daily_challenge.py index 1f92034..b2a6eb5 100644 --- a/app/service/daily_challenge.py +++ b/app/service/daily_challenge.py @@ -11,7 +11,6 @@ from app.log import logger from app.models.metadata_hub import DailyChallengeInfo from app.models.mods import APIMod from app.models.room import RoomCategory -from app.signalr.hub import MetadataHubs from .room import create_playlist_room @@ -44,6 +43,8 @@ async def create_daily_challenge_room( @get_scheduler().scheduled_job("cron", hour=0, minute=0, second=0, id="daily_challenge") async def daily_challenge_job(): + from app.signalr.hub import MetadataHubs + today = datetime.now(UTC).date() redis = get_redis() key = f"daily_challenge:{today.year}-{today.month}-{today.day}" diff --git a/app/service/subscriber.py b/app/service/subscriber.py new file mode 100644 index 0000000..39478ab --- /dev/null +++ b/app/service/subscriber.py @@ -0,0 +1,20 @@ +from __future__ import annotations + +from collections.abc import Awaitable, Callable +from typing import Any + +from app.dependencies.database import get_redis_pubsub + + +class RedisSubscriber: + def __init__(self, channel: str): + self.pubsub = get_redis_pubsub(channel) + self.handlers: dict[str, list[Callable[[str, str], Awaitable[Any]]]] = {} + + async def listen(self): + async for message in self.pubsub.listen(): + if message is not None and message["type"] == "message": + method = self.handlers.get(message["channel"]) + if method: + for handler in method: + await handler(message["channel"], message["data"])