Skip to content

Commit 708c57c

Browse files
authored
Fix dm_channel_ids cache component check (#726)
- Change dm_channel_ids to LimitedCapacityCacheMap
1 parent 1a7a8f1 commit 708c57c

3 files changed

Lines changed: 34 additions & 20 deletions

File tree

hikari/config.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,9 +450,17 @@ class CacheSettings:
450450
"""
451451

452452
max_messages: int = attr.field(default=300)
453-
"""The max number of messages to store in the cache at once.
453+
"""The maximum number of messages to store in the cache at once.
454454
455455
This will have no effect if the messages cache is not enabled.
456456
457457
Defaults to `300`.
458458
"""
459+
460+
max_dm_channel_ids: int = attr.field(default=50)
461+
"""The maximum number of channel IDs to store in the cache at once.
462+
463+
This will have no effect if the channel IDs cache is not enabled.
464+
465+
Defaults to `50`.
466+
"""

hikari/impl/cache.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,10 @@ class CacheImpl(cache.MutableCache):
8282
"_settings",
8383
)
8484

85-
_dm_channel_entries: collections.ExtendedMutableMapping[snowflakes.Snowflake, snowflakes.Snowflake]
8685
# For the sake of keeping things clean, the annotations are being kept separate from the assignment here.
8786
_me: typing.Optional[users.OwnUser]
8887
_emoji_entries: collections.ExtendedMutableMapping[snowflakes.Snowflake, cache_utility.KnownCustomEmojiData]
88+
_dm_channel_entries: collections.ExtendedMutableMapping[snowflakes.Snowflake, snowflakes.Snowflake]
8989
_guild_channel_entries: collections.ExtendedMutableMapping[snowflakes.Snowflake, channels.GuildChannel]
9090
_guild_entries: collections.ExtendedMutableMapping[snowflakes.Snowflake, cache_utility.GuildRecord]
9191
_invite_entries: collections.ExtendedMutableMapping[str, cache_utility.InviteData]
@@ -104,7 +104,6 @@ class CacheImpl(cache.MutableCache):
104104

105105
def __init__(self, app: traits.RESTAware, settings: config.CacheSettings) -> None:
106106
self._app = app
107-
self._me = None
108107
self._settings = settings
109108
self._create_cache()
110109

@@ -113,7 +112,8 @@ def settings(self) -> config.CacheSettings:
113112
return self._settings
114113

115114
def _create_cache(self) -> None:
116-
self._dm_channel_entries = collections.FreezableDict()
115+
self._me = None
116+
self._dm_channel_entries = collections.LimitedCapacityCacheMap(limit=self._settings.max_dm_channel_ids)
117117
self._emoji_entries = collections.FreezableDict()
118118
self._guild_channel_entries = collections.FreezableDict()
119119
self._guild_entries = collections.FreezableDict()
@@ -142,21 +142,33 @@ def clear(self) -> None:
142142
self._create_cache()
143143

144144
def clear_dm_channel_ids(self) -> cache.CacheView[snowflakes.Snowflake, snowflakes.Snowflake]:
145+
if not self._is_cache_enabled_for(config.CacheComponents.DM_CHANNEL_IDS):
146+
return cache_utility.EmptyCacheView()
147+
145148
result = self._dm_channel_entries
146-
self._dm_channel_entries = collections.FreezableDict()
149+
self._dm_channel_entries = collections.LimitedCapacityCacheMap(limit=self._settings.max_dm_channel_ids)
147150
return cache_utility.CacheMappingView(result)
148151

149152
def delete_dm_channel_id(
150153
self, user: snowflakes.SnowflakeishOr[users.PartialUser], /
151154
) -> typing.Optional[snowflakes.Snowflake]:
155+
if not self._is_cache_enabled_for(config.CacheComponents.DM_CHANNEL_IDS):
156+
return None
157+
152158
return self._dm_channel_entries.pop(snowflakes.Snowflake(user), None)
153159

154160
def get_dm_channel_id(
155161
self, user: snowflakes.SnowflakeishOr[users.PartialUser], /
156162
) -> typing.Optional[snowflakes.Snowflake]:
163+
if not self._is_cache_enabled_for(config.CacheComponents.DM_CHANNEL_IDS):
164+
return None
165+
157166
return self._dm_channel_entries.get(snowflakes.Snowflake(user))
158167

159168
def get_dm_channel_ids_view(self) -> cache.CacheView[snowflakes.Snowflake, snowflakes.Snowflake]:
169+
if not self._is_cache_enabled_for(config.CacheComponents.DM_CHANNEL_IDS):
170+
return cache_utility.EmptyCacheView()
171+
160172
return cache_utility.CacheMappingView(self._dm_channel_entries.freeze())
161173

162174
def set_dm_channel_id(
@@ -165,9 +177,10 @@ def set_dm_channel_id(
165177
channel: snowflakes.SnowflakeishOr[channels.PartialChannel],
166178
/,
167179
) -> None:
168-
user = snowflakes.Snowflake(user)
169-
if self._is_cache_enabled_for(config.CacheComponents.EMOJIS) and user in self._user_entries:
170-
self._dm_channel_entries[user] = snowflakes.Snowflake(channel)
180+
if not self._is_cache_enabled_for(config.CacheComponents.DM_CHANNEL_IDS):
181+
return None
182+
183+
self._dm_channel_entries[snowflakes.Snowflake(user)] = snowflakes.Snowflake(channel)
171184

172185
def _build_emoji(
173186
self,

tests/hikari/impl/test_cache.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -129,18 +129,6 @@ def test_set_dm_channel_id(self, cache_impl):
129129

130130
assert cache_impl._dm_channel_entries == {43123123: 12222}
131131

132-
def test_set_dm_channel_id_when_user_not_known(self, cache_impl):
133-
cache_impl.set_dm_channel_id(StubModel(43123123), StubModel(12222))
134-
135-
assert cache_impl._dm_channel_entries == {}
136-
137-
def test_set_dm_channel_id_when_not_enabled(self, cache_impl):
138-
cache_impl._user_entries = collections.FreezableDict({43123123: object()})
139-
cache_impl._settings.components = 0
140-
cache_impl.set_dm_channel_id(StubModel(43123123), StubModel(12222))
141-
142-
assert cache_impl._dm_channel_entries == {}
143-
144132
def test__build_emoji(self, cache_impl):
145133
mock_user = mock.MagicMock(users.User)
146134
emoji_data = cache_utilities.KnownCustomEmojiData(
@@ -2666,6 +2654,11 @@ def test_update_message_for_unknown_partial_message(self, cache_impl):
26662654
@pytest.mark.parametrize(
26672655
("name", "component", "expected"),
26682656
[
2657+
("clear_dm_channel_ids", config.CacheComponents.DM_CHANNEL_IDS, cache_utilities.EmptyCacheView()),
2658+
("delete_dm_channel_id", config.CacheComponents.DM_CHANNEL_IDS, None),
2659+
("get_dm_channel_id", config.CacheComponents.DM_CHANNEL_IDS, None),
2660+
("get_dm_channel_ids_view", config.CacheComponents.DM_CHANNEL_IDS, cache_utilities.EmptyCacheView()),
2661+
("set_dm_channel_id", config.CacheComponents.DM_CHANNEL_IDS, None),
26692662
("clear_emojis", config.CacheComponents.EMOJIS, cache_utilities.EmptyCacheView()),
26702663
("clear_emojis_for_guild", config.CacheComponents.EMOJIS, cache_utilities.EmptyCacheView()),
26712664
("clear_guild_channels", config.CacheComponents.GUILD_CHANNELS, cache_utilities.EmptyCacheView()),

0 commit comments

Comments
 (0)