async def __main(self, loop: asyncio.ProactorEventLoop): """This instance handles the websocket connections.""" async def event_loop(): async def execute_listener(listener: str, *args): listener = self.__listeners.get(listener) if listener: asyncio.ensure_future(listener[0]( *args) if listener[1] else asyncio.create_task( listener[0](self, *args))) info("Dogehouse: Starting event listener loop") while self.__active: res = loads(await self.__socket.recv()) op = res if isinstance(res, str) else res.get("op") if op == "auth-good": info("Dogehouse: Received client ready") self.user = User.from_dict(res["d"]["user"]) await execute_listener("on_ready") elif op == "new-tokens": info("Dogehouse: Received new authorization tokens") self.__token = res["d"]["accessToken"] self.__refresh_token = res["d"]["refreshToken"] elif op == "fetch_done": fetch = self.__fetches.get(res.get("fetchId"), False) if fetch: del self.__fetches[res.get("fetchId")] if fetch == "get_top_public_rooms": info("Dogehouse: Received new rooms") self.rooms = list( map(Room.from_dict, res["d"]["rooms"])) elif fetch == "create_room": info("Dogehouse: Created new room") self.room = Room.from_dict(res["d"]["room"]) elif op == "you-joined-as-speaker": await execute_listener("on_room_join", True) elif op == "join_room_done": self.room = Room.from_dict(res["d"]["room"]) await execute_listener("on_room_join", False) elif op == "new_user_join_room": await execute_listener("on_user_join", User.from_dict(res["d"]["user"])) elif op == "user_left_room": await self.get_top_public_rooms() await execute_listener("on_user_leave", res["d"]["userId"]) elif op == "new_chat_msg": msg = Message.from_dict(res["d"]["msg"]) await execute_listener("on_message", msg) async def heartbeat(): debug("Dogehouse: Starting heartbeat") while self.__active: await self.__socket.send("ping") await asyncio.sleep(heartbeatInterval) async def get_top_rooms_loop(): debug("Dogehouse: Starting to get all rooms") while self.__active and not self.room: await self.get_top_public_rooms() await asyncio.sleep(topPublicRoomsInterval) try: info("Dogehouse: Connecting with Dogehouse websocket") async with websockets.connect(apiUrl) as ws: info( "Dogehouse: Websocket connection established successfully") self.__active = True self.__socket = ws info("Dogehouse: Attemting to authenticate") await self.__send( 'auth', { "accessToken": self.__token, "refreshToken": self.__refresh_token, "reconnectToVoice": self.__reconnect_voice, "muted": self.__muted, "currentRoomId": self.room, "platform": "dogehouse.py" }) info("Dogehouse: Successfully authenticated") event_loop_task = loop.create_task(event_loop()) get_top_rooms_task = loop.create_task(get_top_rooms_loop()) await heartbeat() await event_loop_task() await get_top_rooms_task() except ConnectionClosedOK: info("Dogehouse: Websocket connection closed peacefully") self.__active = False except ConnectionClosedError as e: if (e.code == 4004): raise InvalidAccessToken()
async def __main(self, loop: asyncio.ProactorEventLoop): """This instance handles the websocket connections.""" async def event_loop(): async def execute_listener(listener: str, *args): listener = self.__listeners.get(listener.lower()) if listener: asyncio.ensure_future(listener[0]( *args) if listener[1] else listener[0](self, *args)) async def execute_command(command_name: str, ctx: Message, *args): command = self.__commands.get(command_name.lower()) if command: arguments = [] params = {} parameters = list(signature(command[0]).parameters.items()) if not command[1]: arguments.append(self) parameters.pop(0) if parameters: arguments.append(ctx) parameters.pop(0) for idx, (key, param) in enumerate(parameters): value = args[idx] if param.kind == param.KEYWORD_ONLY: value = " ".join(args[idx::]) params[key] = value try: asyncio.ensure_future(command[0](*arguments, **params)) except TypeError: raise NotEnoughArguments( f"Not enough arguments were provided in command `{command_name}`." ) else: raise CommandNotFound( f"The requested command `{command_name}` does not exist." ) info("Dogehouse: Starting event listener loop") while self.__active: res = loads(await self.__socket.recv()) op = res if isinstance(res, str) else res.get("op") if op == "auth-good": info("Dogehouse: Received client ready") self.user = User.from_dict(res["d"]["user"]) await execute_listener("on_ready") elif op == "new-tokens": info("Dogehouse: Received new authorization tokens") self.__token = res["d"]["accessToken"] self.__refresh_token = res["d"]["refreshToken"] elif op == "fetch_done": fetch = self.__fetches.get(res.get("fetchId"), False) if fetch: del self.__fetches[res.get("fetchId")] if fetch == "get_top_public_rooms": info("Dogehouse: Received new rooms") self.rooms = list( map(Room.from_dict, res["d"]["rooms"])) elif fetch == "create_room": info("Dogehouse: Created new room") self.room = Room.from_dict(res["d"]["room"]) elif op == "you-joined-as-speaker": await execute_listener("on_room_join", True) elif op == "join_room_done": self.room = Room.from_dict(res["d"]["room"]) await execute_listener("on_room_join", False) elif op == "new_user_join_room": await execute_listener("on_user_join", User.from_dict(res["d"]["user"])) elif op == "user_left_room": await self.get_top_public_rooms() await execute_listener("on_user_leave", res["d"]["userId"]) elif op == "new_chat_msg": msg = Message.from_dict(res["d"]["msg"]) await execute_listener("on_message", msg) try: if msg.content.startswith(self.prefix) and len( msg.content) > len(self.prefix) + 1: splitted = msg.content[len(self.prefix)::].split( " ") await execute_command(splitted[0], msg, *splitted[1::]) except Exception as e: await execute_listener("on_error", e) async def heartbeat(): debug("Dogehouse: Starting heartbeat") while self.__active: await self.__socket.send("ping") await asyncio.sleep(heartbeatInterval) async def get_top_rooms_loop(): debug("Dogehouse: Starting to get all rooms") while self.__active and not self.room: await self.get_top_public_rooms() await asyncio.sleep(topPublicRoomsInterval) try: info("Dogehouse: Connecting with Dogehouse websocket") async with websockets.connect(apiUrl) as ws: info( "Dogehouse: Websocket connection established successfully") self.__active = True self.__socket = ws info("Dogehouse: Attemting to authenticate") await self.__send( 'auth', { "accessToken": self.__token, "refreshToken": self.__refresh_token, "reconnectToVoice": self.__reconnect_voice, "muted": self.__muted, "currentRoomId": self.room, "platform": "dogehouse.py" }) info("Dogehouse: Successfully authenticated") event_loop_task = loop.create_task(event_loop()) get_top_rooms_task = loop.create_task(get_top_rooms_loop()) await heartbeat() await event_loop_task() await get_top_rooms_task() except ConnectionClosedOK: info("Dogehouse: Websocket connection closed peacefully") self.__active = False except ConnectionClosedError as e: if (e.code == 4004): raise InvalidAccessToken()