diff --git a/discord/client.py b/discord/client.py index 6be3e9822..e44e5e217 100644 --- a/discord/client.py +++ b/discord/client.py @@ -147,6 +147,8 @@ class Client: .. versionadded:: 1.5 member_cache_flags: :class:`MemberCacheFlags` Allows for finer control over how the library caches members. + If not given, defaults to cache as much as possible is with the + currently selected intents. .. versionadded:: 1.5 fetch_offline_members: :class:`bool` diff --git a/discord/flags.py b/discord/flags.py index a204937cb..4607b2ce9 100644 --- a/discord/flags.py +++ b/discord/flags.py @@ -754,6 +754,32 @@ class MemberCacheFlags(BaseFlags): """ return 4 + @classmethod + def from_intents(cls, intents): + """A factory method that creates a :class:`MemberCacheFlags` based on + the currently selected :class:`Intents`. + + Parameters + ------------ + intents: :class:`Intents` + The intents to select from. + + Returns + --------- + :class:`MemberCacheFlags` + The resulting member cache flags. + """ + + self = cls.none() + if intents.members: + self.joined = True + if intents.presences: + self.online = True + if intents.voice_states: + self.voice = True + + return self + def _verify_intents(self, intents): if self.online and not intents.presences: raise ValueError('MemberCacheFlags.online requires Intents.presences enabled') diff --git a/discord/state.py b/discord/state.py index db47059b9..22bfdcca9 100644 --- a/discord/state.py +++ b/discord/state.py @@ -144,12 +144,12 @@ class ConnectionState: cache_flags = options.get('member_cache_flags', None) if cache_flags is None: - cache_flags = MemberCacheFlags.all() + cache_flags = MemberCacheFlags.from_intents(intents) else: if not isinstance(cache_flags, MemberCacheFlags): raise TypeError('member_cache_flags parameter must be MemberCacheFlags not %r' % type(cache_flags)) - cache_flags._verify_intents(intents) + cache_flags._verify_intents(intents) self._member_cache_flags = cache_flags self._activity = activity