update
This commit is contained in:
@@ -1,11 +1,12 @@
|
||||
import asyncio
|
||||
import threading
|
||||
from typing import Callable
|
||||
from typing import Callable, Awaitable
|
||||
|
||||
import redis
|
||||
|
||||
room_set_key = "bilibili:live:danmu:room_set"
|
||||
r: redis.Redis | None = None
|
||||
on_room_changed: Callable[[list[int]], None] = lambda ignore: None
|
||||
on_room_changed: Callable[[list[int]], Awaitable[None]] | None = None
|
||||
|
||||
|
||||
def init(redis_conf: dict | None):
|
||||
@@ -21,7 +22,7 @@ def init(redis_conf: dict | None):
|
||||
)
|
||||
|
||||
# run subscribe_redis on new thread
|
||||
threading.Thread(target=subscribe_redis, daemon=True).start()
|
||||
threading.Thread(target=_subscribe_redis, daemon=True).start()
|
||||
|
||||
|
||||
def get_room_list() -> list[int]:
|
||||
@@ -31,13 +32,17 @@ def get_room_list() -> list[int]:
|
||||
return [int(room_id) for room_id in r.smembers(room_set_key)]
|
||||
|
||||
|
||||
def subscribe_redis():
|
||||
def _subscribe_redis():
|
||||
loop = asyncio.new_event_loop()
|
||||
asyncio.set_event_loop(loop)
|
||||
loop.run_until_complete(_subscribe_redis_async)
|
||||
loop.close()
|
||||
|
||||
|
||||
async def _subscribe_redis_async():
|
||||
p = r.pubsub()
|
||||
p.psubscribe(**{f"__keyspace@0__:{room_set_key}": room_changed_handler})
|
||||
for message in p.listen():
|
||||
pass
|
||||
|
||||
|
||||
# noinspection PyUnusedLocal
|
||||
def room_changed_handler(ignore):
|
||||
on_room_changed(get_room_list())
|
||||
p.subscribe(f"__keyspace@0__:{room_set_key}")
|
||||
while p.subscribed:
|
||||
msg = await asyncio.to_thread(p.get_message, ignore_subscribe_messages=True, timeout=1)
|
||||
if msg and on_room_changed is not None:
|
||||
await on_room_changed(get_room_list())
|
||||
|
||||
Reference in New Issue
Block a user