Source code for backtracked.models.room

from .base import Model, Collection
from .user import MemberCollection
from .. import utils
from ..client.constants import Presence, Actions, Endpoints
from datetime import datetime

__all__ = ["Room", "RoomCollection"]

[docs]class Room(Model): """ Represents a room on QueUp that may or may not be currently joined. Attributes ---------- id: str ID of this room. name: str Name of this room. description: str Description of this room. slug: str Slug used for joining this room, seen in the URL upon room join. rtc: str Real-time channel identifier for this room. type: str Type of this room is_public: bool True if this room is public, False otherwise. lang: str Preferred language for talking in this room. Can be None. music_type: Music type for this room. """ def __init__(self, client, data: dict): super().__init__(client) self.id = data.get("_id") self.name = data.get("name") self.description = data.get("description") self.slug = data.get("roomUrl") self.rtc = data.get("realTimeChannel") self.type = data.get("roomType") self.is_public = data.get("isPublic") self.lang = data.get("lang") self.music_type = data.get("musicType") self.max_djs = data.get("allowedDjs") self.max_song_length = data.get("maxLengthSong") self.max_queue_length = data.get("maxSongQueueLength") self.dj_recycle = data.get("recycleDJ") self.display = RoomDisplaySettings(data) self.created_at = utils.dt(data.get("created")) self.updated_at = utils.dt(data.get("updated")) self.max_repeat_distance = data.get("timeSongQueueRepeat") self.active_users = data.get("activeUsers") self.queue_locked = data.get("lockQueue") self.meta_description = data.get("metaDescription") self.welcome_message = data.get("welcomeMessage") self.now_playing = data.get("currentSong") self.slow_mode = data.get("slowMode") self.room_id = "room:" + self.id self.members = MemberCollection() self.playlist = RoomPlaylist(current_song=data.get("currentSong"))
[docs] async def change_presence(self, presence: Presence): """ Change the logged-in user's presence in this room. Parameters ---------- presence: :class:`Presence` Presence enum representing the desired presence. """ await self.client.socket.send(action=Actions.presence_change, channel=self.room_id, presence= PresenceChange(presence, self.client.user.id, self.client.connection_id))
[docs] async def send_message(self, text: str): """ Sends a message to this room. Parameters ---------- text: str Text to send in the message. Returns ------- :class:`Message` The sent message. """ from . import Message _, raw = await self.client.http.post(Endpoints.chat(rid=self.id), data={ "type": "chat-message", "realTimeChannel": self.rtc, "time": utils.ts(datetime.utcnow()), "message": text }) raw.update(raw['req']) return Message(self.client, raw)
class RoomDisplaySettings: def __init__(self, data: dict): self.queue = data.get("displayQueue") self.in_search = data.get("displayInSearch") self.in_lobby = data.get("displayInLobby") self.dj_in_queue = data.get("displayDJinQueue") self.user_join = data.get("displayUserJoin") self.user_leave = data.get("displayUserLeave") self.user_grab = data.get("displayUserGrab") class RoomPlaylist(list): def __init__(self, current_song=None): super().__init__() self.now_playing = current_song def next_song(self): self.now_playing = self.pop(0) class RoomCollection(Collection): def from_rtc(self, rtc): return utils.get(self.values(), rtc=rtc) def from_room_id(self, room_id: str): _, rid = room_id.split(":") return self.get(rid, None) class PresenceChange: def __init__(self, presence: Presence, client_id: str, connection_id: str): self.action = presence.value self.clientId = client_id self.connectionId = connection_id self.data = {}