feat(chat): support mp/playlist chat
This commit is contained in:
@@ -3,6 +3,7 @@ from __future__ import annotations
|
||||
from datetime import UTC, datetime, timedelta
|
||||
|
||||
from app.database.beatmap import Beatmap
|
||||
from app.database.chat import ChannelType, ChatChannel
|
||||
from app.database.playlists import Playlist
|
||||
from app.database.room import APIUploadedRoom, Room
|
||||
from app.dependencies.fetcher import get_fetcher
|
||||
@@ -25,6 +26,18 @@ async def create_playlist_room_from_api(
|
||||
session.add(db_room)
|
||||
await session.commit()
|
||||
await session.refresh(db_room)
|
||||
|
||||
channel = ChatChannel(
|
||||
name=f"room_{db_room.id}",
|
||||
description="Playlist room",
|
||||
type=ChannelType.MULTIPLAYER,
|
||||
)
|
||||
session.add(channel)
|
||||
await session.commit()
|
||||
await session.refresh(channel)
|
||||
await session.refresh(db_room)
|
||||
db_room.channel_id = channel.channel_id
|
||||
|
||||
await add_playlists_to_room(session, db_room.id, room.playlist, host_id)
|
||||
await session.refresh(db_room)
|
||||
return db_room
|
||||
@@ -57,6 +70,18 @@ async def create_playlist_room(
|
||||
session.add(db_room)
|
||||
await session.commit()
|
||||
await session.refresh(db_room)
|
||||
|
||||
channel = ChatChannel(
|
||||
name=f"room_{db_room.id}",
|
||||
description="Playlist room",
|
||||
type=ChannelType.MULTIPLAYER,
|
||||
)
|
||||
session.add(channel)
|
||||
await session.commit()
|
||||
await session.refresh(channel)
|
||||
await session.refresh(db_room)
|
||||
db_room.channel_id = channel.channel_id
|
||||
|
||||
await add_playlists_to_room(session, db_room.id, playlist, host_id)
|
||||
await session.refresh(db_room)
|
||||
return db_room
|
||||
|
||||
@@ -24,6 +24,11 @@ class RedisSubscriber:
|
||||
del self.handlers[channel]
|
||||
await self.pubsub.unsubscribe(channel)
|
||||
|
||||
def add_handler(self, channel: str, handler: Callable[[str, str], Awaitable[Any]]):
|
||||
if channel not in self.handlers:
|
||||
self.handlers[channel] = []
|
||||
self.handlers[channel].append(handler)
|
||||
|
||||
async def listen(self):
|
||||
while True:
|
||||
message = await self.pubsub.get_message(
|
||||
|
||||
38
app/service/subscribers/chat.py
Normal file
38
app/service/subscribers/chat.py
Normal file
@@ -0,0 +1,38 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from .base import RedisSubscriber
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from app.router.chat.server import ChatServer
|
||||
|
||||
|
||||
JOIN_CHANNEL = "chat:room:joined"
|
||||
EXIT_CHANNEL = "chat:room:left"
|
||||
|
||||
|
||||
class ChatSubscriber(RedisSubscriber):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.room_subscriber: dict[int, list[int]] = {}
|
||||
self.chat_server: "ChatServer | None" = None
|
||||
|
||||
async def start_subscribe(self):
|
||||
await self.subscribe(JOIN_CHANNEL)
|
||||
self.add_handler(JOIN_CHANNEL, self.on_join_room)
|
||||
await self.subscribe(EXIT_CHANNEL)
|
||||
self.add_handler(EXIT_CHANNEL, self.on_leave_room)
|
||||
self.start()
|
||||
|
||||
async def on_join_room(self, c: str, s: str):
|
||||
channel_id, user_id = s.split(":")
|
||||
if self.chat_server is None:
|
||||
return
|
||||
await self.chat_server.join_room_channel(int(channel_id), int(user_id))
|
||||
|
||||
async def on_leave_room(self, c: str, s: str):
|
||||
channel_id, user_id = s.split(":")
|
||||
if self.chat_server is None:
|
||||
return
|
||||
await self.chat_server.leave_room_channel(int(channel_id), int(user_id))
|
||||
Reference in New Issue
Block a user