diff --git a/litecord/gateway/websocket.py b/litecord/gateway/websocket.py index a2e037e..d9b70a1 100644 --- a/litecord/gateway/websocket.py +++ b/litecord/gateway/websocket.py @@ -69,6 +69,29 @@ WebsocketProperties = collections.namedtuple( ) +def _complete_users_list(base_ready, user_ready) -> dict: + """Use the data we were already preparing to send in READY to construct + the users array, saving on I/O cost.""" + + # TODO deduplication + users_list = [] + + for guild in base_ready["guilds"]: + if guild["unavailable"]: + continue + + for member in guild["members"]: + users_list.append(member["user"]) + + for private_channel in base_ready["private_channels"]: + for recipient in private_channel["recipients"]: + users_list.append(recipient) + + ready = {**base_ready, **user_ready} + ready["users"] = users_list + return ready + + class GatewayWebsocket: """Main gateway websocket logic.""" @@ -378,7 +401,8 @@ class GatewayWebsocket: "shard": [self.state.current_shard, self.state.shard_count], } - await self.dispatch("READY", {**base_ready, **user_ready}) + full_ready_data = _complete_users_list(base_ready, user_ready) + await self.dispatch("READY", full_ready_data) app.sched.spawn(self._guild_dispatch(guilds)) async def _check_shards(self, shard, user_id):