From 27d7782cd750a34317a9813a5cef8e8b063ecade Mon Sep 17 00:00:00 2001 From: UK <41271523+NeloBlivion@users.noreply.github.com> Date: Sun, 25 Jun 2023 03:45:38 +0100 Subject: [PATCH] fix: always set Guild._member_count (#2145) * always set Guild._member_count * change set process * changelog --------- Co-authored-by: Lala Sabathil --- CHANGELOG.md | 2 ++ discord/guild.py | 24 ++++++++++-------------- discord/state.py | 8 ++------ 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa6cbc5342..ad1afa4959 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -142,6 +142,8 @@ These changes are available on the `master` branch, but have not yet been releas ([#2091](https://github.com/Pycord-Development/pycord/pull/2091)) - Fixed `AttributeError` when accessing a `Select`'s values when it hasn't been interacted with. ([#2104](https://github.com/Pycord-Development/pycord/pull/2104)) +- Fixed `Guild._member_count` sometimes not being set. + ([#2145](https://github.com/Pycord-Development/pycord/pull/2145)) - Fixed `Thread.applied_tags` not being updated. ([#2146](https://github.com/Pycord-Development/pycord/pull/2146)) diff --git a/discord/guild.py b/discord/guild.py index 9f1aae0c2b..2bd77b2dd5 100644 --- a/discord/guild.py +++ b/discord/guild.py @@ -383,7 +383,7 @@ def __repr__(self) -> str: ("name", self.name), ("shard_id", self.shard_id), ("chunked", self.chunked), - ("member_count", getattr(self, "_member_count", None)), + ("member_count", self._member_count), ) inner = " ".join("%s=%r" % t for t in attrs) return f"" @@ -441,11 +441,11 @@ def _remove_role(self, role_id: int, /) -> Role: return role def _from_data(self, guild: GuildPayload) -> None: - # according to Stan, this is always available even if the guild is unavailable - # I don't have this guarantee when someone updates the guild. - member_count = guild.get("member_count", None) - if member_count is not None: - self._member_count: int = member_count + member_count = guild.get("member_count") + # Either the payload includes member_count, or it hasn't been set yet. + # Prevents valid _member_count from suddenly changing to None + if member_count is not None or not hasattr(self, "_member_count"): + self._member_count: int | None = member_count self.name: str = guild.get("name") self.verification_level: VerificationLevel = try_enum( @@ -532,7 +532,7 @@ def _from_data(self, guild: GuildPayload) -> None: self._sync(guild) self._large: bool | None = ( - None if member_count is None else self._member_count >= 250 + None if self._member_count is None else self._member_count >= 250 ) self.owner_id: int | None = utils._get_as_snowflake(guild, "owner_id") @@ -598,10 +598,7 @@ def large(self) -> bool: members, which for this library is set to the maximum of 250. """ if self._large is None: - try: - return self._member_count >= 250 - except AttributeError: - return len(self._members) >= 250 + return (self._member_count or len(self._members)) >= 250 return self._large @property @@ -1002,10 +999,9 @@ def chunked(self) -> bool: If this value returns ``False``, then you should request for offline members. """ - count = getattr(self, "_member_count", None) - if count is None: + if self._member_count is None: return False - return count == len(self._members) + return self._member_count == len(self._members) @property def shard_id(self) -> int: diff --git a/discord/state.py b/discord/state.py index 4ae5c30b5a..d222ba4518 100644 --- a/discord/state.py +++ b/discord/state.py @@ -1139,10 +1139,8 @@ def parse_guild_member_add(self, data) -> None: if self.member_cache_flags.joined: guild._add_member(member) - try: + if guild._member_count is not None: guild._member_count += 1 - except AttributeError: - pass self.dispatch("member_join", member) @@ -1152,10 +1150,8 @@ def parse_guild_member_remove(self, data) -> None: guild = self._get_guild(int(data["guild_id"])) if guild is not None: - try: + if guild._member_count is not None: guild._member_count -= 1 - except AttributeError: - pass member = guild.get_member(user.id) if member is not None: