change ready.relationships structure on gateway v9

This commit is contained in:
Luna 2021-08-28 18:12:33 -03:00
parent d5348fd33b
commit 9a09311c68
2 changed files with 47 additions and 7 deletions

View File

@ -74,7 +74,7 @@ WebsocketProperties = collections.namedtuple(
) )
def _complete_users_list(user_id: str, base_ready, user_ready) -> dict: def _complete_users_list(user_id: str, base_ready, user_ready, wsp) -> dict:
"""Use the data we were already preparing to send in READY to construct """Use the data we were already preparing to send in READY to construct
the users array, saving on I/O cost.""" the users array, saving on I/O cost."""
@ -100,6 +100,19 @@ def _complete_users_list(user_id: str, base_ready, user_ready) -> dict:
ready = {**base_ready, **user_ready} ready = {**base_ready, **user_ready}
ready["users"] = [value for value in users_to_send.values()] ready["users"] = [value for value in users_to_send.values()]
# relationship object structure changed in v9
if wsp.v == 9:
ready["relationships"] = []
for relationship in user_ready["relationships"]:
ready["relationships"].append(
{
"user_id": relationship["user"]["id"],
"type": relationship["type"],
"nickname": None, # TODO implement friend nicknames
"id": relationship["id"],
}
)
return ready return ready
@ -426,7 +439,9 @@ class GatewayWebsocket:
"shard": [self.state.current_shard, self.state.shard_count], "shard": [self.state.current_shard, self.state.shard_count],
} }
full_ready_data = _complete_users_list(user["id"], base_ready, user_ready) full_ready_data = _complete_users_list(
user["id"], base_ready, user_ready, self.wsp
)
if not self.state.bot: if not self.state.bot:
for guild in full_ready_data["guilds"]: for guild in full_ready_data["guilds"]:

View File

@ -49,19 +49,21 @@ async def _close(conn):
await conn.close(1000, "test end") await conn.close(1000, "test end")
async def get_gw(test_cli) -> str: async def get_gw(test_cli, version: int) -> str:
"""Get the Gateway URL.""" """Get the Gateway URL."""
gw_resp = await test_cli.get("/api/v6/gateway") gw_resp = await test_cli.get(f"/api/v{version}/gateway")
gw_json = await gw_resp.json gw_json = await gw_resp.json
return gw_json["url"] return gw_json["url"]
async def gw_start(test_cli, *, etf=False): async def gw_start(test_cli, *, version: int = 6, etf=False):
"""Start a websocket connection""" """Start a websocket connection"""
gw_url = await get_gw(test_cli) gw_url = await get_gw(test_cli, version)
if etf: if etf:
gw_url = f"{gw_url}?encoding=etf" gw_url = f"{gw_url}?v={version}&encoding=etf"
else:
gw_url = f"{gw_url}?v={version}&encoding=json"
return await websockets.connect(gw_url) return await websockets.connect(gw_url)
@ -159,6 +161,29 @@ async def test_ready_fields(test_cli_user):
await _close(conn) await _close(conn)
@pytest.mark.asyncio
async def test_ready_v9(test_cli_user):
conn = await gw_start(test_cli_user.cli, version=9)
await _json(conn)
await _json_send(
conn, {"op": OP.IDENTIFY, "d": {"token": test_cli_user.user["token"]}}
)
try:
ready = await _json(conn)
assert isinstance(ready, dict)
assert ready["op"] == OP.DISPATCH
assert ready["t"] == "READY"
data = ready["d"]
assert isinstance(data, dict)
assert data["v"] == 9
assert isinstance(data["user"], dict)
assert isinstance(data["relationships"], list)
finally:
await _close(conn)
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_heartbeat(test_cli_user): async def test_heartbeat(test_cli_user):
conn = await gw_start(test_cli_user.cli) conn = await gw_start(test_cli_user.cli)