From a830c9cb77252f5acfd10f1ac78d5c0bc06275ae Mon Sep 17 00:00:00 2001 From: Luna Date: Wed, 14 Jul 2021 22:13:09 -0300 Subject: [PATCH] update gateway schemas --- litecord/gateway/schemas.py | 48 +++++++++++++++++++++++++++++++++-- litecord/gateway/websocket.py | 12 +++++++-- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/litecord/gateway/schemas.py b/litecord/gateway/schemas.py index ed8d12a..387740b 100644 --- a/litecord/gateway/schemas.py +++ b/litecord/gateway/schemas.py @@ -65,6 +65,47 @@ IDENTIFY_SCHEMA = { "shard": {"type": "list", "required": False}, "presence": {"type": "dict", "required": False}, "intents": {"coerce": Intents, "required": False}, + # TODO schema + "properties": { + "type": "dict", + "required": False, + "schema": { + "browser": {"type": "string", "required": False}, + "client_build_number": {"type": "number", "required": False}, + "client_event_source": { + "type": "string", + "required": False, + "nullable": True, + }, + "client_version": {"type": "string", "required": False}, + "distro": {"type": "string", "required": False}, + "os": {"type": "string", "required": False}, + "os_arch": {"type": "string", "required": False}, + "os_version": {"type": "string", "required": False}, + "release_channel": {"type": "string", "required": False}, + "system_locale": {"type": "string", "required": False}, + "window_manager": {"type": "string", "required": False}, + }, + }, + "capabilities": {"type": "number", "required": False}, + "client_state": { + "type": "dict", + "required": False, + "schema": { + # guild_hashes is a Dict with keys being guild ids and + # values being a list of 3 strings. this can not be + # validated by cerberus + "highest_last_message_id": { + "type": "string", + "required": False, + }, + "read_state_version": {"type": "number", "required": False}, + "user_guild_settings_version": { + "type": "number", + "required": False, + }, + }, + }, }, } }, @@ -90,8 +131,11 @@ REQ_GUILD_SCHEMA = { "d": { "type": "dict", "schema": { - "guild_id": {"type": "string", "required": True}, - "user_ids": {"type": "list", "required": False}, + "user_ids": { + "type": "list", + "required": False, + "schema": {"type": "string"}, + }, "query": {"type": "string", "required": False}, "limit": {"type": "number", "required": False}, "presences": {"type": "bool", "required": False}, diff --git a/litecord/gateway/websocket.py b/litecord/gateway/websocket.py index a0a7fef..9db80a5 100644 --- a/litecord/gateway/websocket.py +++ b/litecord/gateway/websocket.py @@ -664,7 +664,9 @@ class GatewayWebsocket: async def handle_2(self, payload: Dict[str, Any]): """Handle the OP 2 Identify packet.""" - payload = validate(payload, IDENTIFY_SCHEMA) + payload_copy = dict(payload) + payload_copy["d"].get("client_state", {}).pop("guild_hashes") + validate(payload_copy, IDENTIFY_SCHEMA) data = payload["d"] token = data["token"] @@ -924,7 +926,13 @@ class GatewayWebsocket: async def handle_8(self, payload: Dict): """Handle OP 8 Request Guild Members.""" - payload = validate(payload, REQ_GUILD_SCHEMA) + + # we do not validate guild ids because it can either be a string + # or a list of strings and cerberus does not validate that. + payload_copy = dict(payload) + payload_copy["d"].pop("guild_id") + validate(payload_copy, REQ_GUILD_SCHEMA) + data = payload["d"] gids = data["guild_id"]