Source code for main.webinar

from __future__ import annotations

from enum import Enum
from typing import Any, Dict, List


[docs]class Converter: """ класс-конвертер """
[docs] def __init__(self, object: Any, attrs: List[str], data: Dict[str, Any]) -> None: """ конструктор класса :param object: объект :param data: данные :param attrs: аттрибуты, аргументы """ self.object = object self.data = data self.attrs = attrs
[docs] def convert(self) -> Any: """ сама функция конвертирования """ for attr in set(self.data) & set(self.attrs): setattr(self.object, attr, self.data[attr]) return self.object
[docs]class BaseRouter(Enum): EVENTS = 'https://events.webinar.ru/{route}' STREAM = EVENTS.format(route='{user_id}/{event_id}/stream-new/{session_id}') API = EVENTS.format(route='api/{route}')
[docs]class UserRouter(Enum): LOGIN = BaseRouter.API.value.format(route='login') INFO = BaseRouter.API.value.format(route='user/{user_id}')
[docs]class EventRouter(Enum): PLANNED = BaseRouter.API.value.format(route='organizations/{organization_id}/eventsessions/list/planned') INFO = BaseRouter.API.value.format(route='event/{event_id}') START = BaseRouter.API.value.format(route='eventsession/{session_id}/start') STOP = BaseRouter.API.value.format(route='eventsession/{session_id}/stop')
[docs]class MessageRouter(Enum): CHAT = BaseRouter.API.value.format(route='eventsessions/{session_id}/chat') ACCEPT = BaseRouter.API.value.format(route='eventsessions/{session_id}/chat/messages/moderate') DELETE = BaseRouter.API.value.format(route='eventsessions/{session_id}/chat/messages/delete') SETTINGS = BaseRouter.API.value.format(route='eventsessions/{session_id}/chat/settings')
[docs]class Webinar: """ класс вебинара """
[docs] class User: """ класс пользователя :param attrs: аттрибуты пользователя """ attrs = ['id', 'name', 'secondName', 'email']
[docs] def __init__(self, data: Dict = {}, is_authenticated: bool = False) -> None: """ конструктор класса :param is_authenticated: флаг аутентификации пользователя :param memberships: членства пользователя (принадлежность организациям/группам) """ self = Converter(self, self.attrs, data).convert() self.is_authenticated = is_authenticated self.memberships = [Webinar.Organization(membership['organization']) for membership in data.get('memberships', [])]
[docs] class Organization: """ класс организации :param attrs: аттрибуты организации """ attrs = ['id', 'name']
[docs] def __init__(self, data: Dict) -> None: """ Конструктор класса организации """ self = Converter(self, self.attrs, data).convert()
[docs] class Message: """ класс сообщения :param attrs: аттрибуты сообщения """ attrs = ['id', 'authorName', 'text', 'isModerated', 'createAt']
[docs] def __init__(self, data: Dict) -> None: """ Конструктор класса сообщения """ self = Converter(self, self.attrs, data).convert()
[docs] def serialize(self) -> Dict: """ сериализация сообщения """ return {attr: getattr(self, attr) for attr in self.attrs}
[docs] class Chat: """ класс чата """ attrs = ['premoderation', 'show']
[docs] def __init__(self, messages: List[Dict], settings: Dict) -> None: """ Конструктор класса чата """ self = Converter(self, self.attrs, settings).convert() self.awaiting = [] self.moderated = [] for message in messages: message = Webinar.Message(message) [self.awaiting, self.moderated][message.isModerated].append(message) self.awaiting.reverse() self.moderated.reverse()
[docs] class Event: """ класс события вединара :param attrs: аттрибуты события вединара """ attrs = ['id', 'name', 'description', 'startsAt', 'endsAt']
[docs] def __init__(self, user_id: int, data: Dict) -> None: """ Конструктор класса события вединара """ self = Converter(self, self.attrs, data).convert() self.session_id = data['eventSessions'][0]['id'] self.status = data['eventSessions'][0]['status'] self.image = data['image']['url'] self.url = BaseRouter.STREAM.value.format( user_id=user_id, event_id=self.id, session_id=self.session_id )
class Error: attrs = ['code', 'message'] def __init__(self, data: Dict) -> None: self = Converter(self, self.attrs, data).convert() self.message = f'Webinar: {self.message}'