Skip to content

Commit bf79aa9

Browse files
committed
Fix CacheUpdate implementations for extra FullEvents (#3066)
1 parent e5a4c30 commit bf79aa9

File tree

5 files changed

+62
-73
lines changed

5 files changed

+62
-73
lines changed

src/cache/event.rs

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::collections::VecDeque;
2+
use std::num::NonZeroU16;
23

34
use extract_map::entry::Entry;
45

@@ -46,6 +47,7 @@ use crate::model::guild::{
4647
Role,
4748
ScheduledEvent,
4849
};
50+
use crate::model::id::GuildId;
4951
use crate::model::user::{CurrentUser, OnlineStatus};
5052
use crate::model::voice::VoiceState;
5153

@@ -107,15 +109,20 @@ impl CacheUpdate for ChannelPinsUpdateEvent {
107109
}
108110

109111
impl CacheUpdate for GuildCreateEvent {
110-
type Output = std::convert::Infallible;
112+
type Output = Vec<GuildId>;
111113

112114
fn update(&mut self, cache: &Cache) -> Option<Self::Output> {
113115
cache.unavailable_guilds.remove(&self.guild.id);
114116
let guild = self.guild.clone();
115117

116118
cache.guilds.insert(self.guild.id, guild);
117119

118-
None
120+
if cache.unavailable_guilds.len() == 0 {
121+
cache.unavailable_guilds.shrink_to_fit();
122+
Some(cache.guilds.iter().map(|i| *i.key()).collect())
123+
} else {
124+
None
125+
}
119126
}
120127
}
121128

@@ -462,24 +469,28 @@ impl CacheUpdate for PresenceUpdateEvent {
462469
}
463470

464471
impl CacheUpdate for ReadyEvent {
465-
type Output = std::convert::Infallible;
472+
type Output = NonZeroU16;
466473

467474
fn update(&mut self, cache: &Cache) -> Option<Self::Output> {
468475
for unavailable in &self.ready.guilds {
469476
cache.guilds.remove(&unavailable.id);
470477
cache.unavailable_guilds.insert(unavailable.id, ());
471478
}
472479

473-
let shard_data = self.ready.shard.unwrap_or_default();
480+
let shard_info = self.ready.shard.unwrap_or_default();
474481

475-
{
476-
let mut cached_shard_data = cache.shard_data.write();
477-
cached_shard_data.total = shard_data.total;
478-
cached_shard_data.connected.insert(shard_data.id);
479-
}
480482
cache.user.write().clone_from(&self.ready.user);
481483

482-
None
484+
let mut shards = cache.shard_data.write();
485+
shards.total = shard_info.total;
486+
shards.connected.insert(shard_info.id);
487+
488+
if shards.connected.len() == shards.total.get() as usize && !shards.has_sent_shards_ready {
489+
shards.has_sent_shards_ready = true;
490+
Some(shards.total)
491+
} else {
492+
None
493+
}
483494
}
484495
}
485496

src/cache/mod.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,10 @@ pub type ChannelMessagesRef<'a> = CacheRef<'a, GenericChannelId, VecDeque<Messag
119119

120120
#[cfg_attr(feature = "typesize", derive(typesize::derive::TypeSize))]
121121
#[derive(Debug)]
122-
pub(crate) struct CachedShardData {
123-
pub total: NonZeroU16,
124-
pub connected: HashSet<ShardId>,
125-
pub has_sent_shards_ready: bool,
122+
struct CachedShardData {
123+
total: NonZeroU16,
124+
connected: HashSet<ShardId>,
125+
has_sent_shards_ready: bool,
126126
}
127127

128128
/// A cache containing data received from [`Shard`]s.
@@ -179,28 +179,28 @@ pub struct Cache {
179179
// ---
180180
/// A map of guilds with full data available. This includes data like [`Role`]s and [`Emoji`]s
181181
/// that are not available through the REST API.
182-
pub(crate) guilds: MaybeMap<GuildId, Guild>,
182+
guilds: MaybeMap<GuildId, Guild>,
183183
/// A list of guilds which are "unavailable".
184184
///
185185
/// Additionally, guilds are always unavailable for bot users when a Ready is received. Guilds
186186
/// are "sent in" over time through the receiving of [`Event::GuildCreate`]s.
187-
pub(crate) unavailable_guilds: MaybeMap<GuildId, ()>,
187+
unavailable_guilds: MaybeMap<GuildId, ()>,
188188

189189
// Messages cache:
190190
// ---
191-
pub(crate) messages: DashMap<GenericChannelId, VecDeque<Message>, BuildHasher>,
191+
messages: DashMap<GenericChannelId, VecDeque<Message>, BuildHasher>,
192192

193193
// Miscellanous fixed-size data
194194
// ---
195195
/// Information about running shards
196-
pub(crate) shard_data: RwLock<CachedShardData>,
196+
shard_data: RwLock<CachedShardData>,
197197
/// The current user "logged in" and for which events are being received for.
198198
///
199199
/// The current user contains information that a regular [`User`] does not, such as whether it
200200
/// is a bot, whether the user is verified, etc.
201201
///
202202
/// Refer to the documentation for [`CurrentUser`] for more information.
203-
pub(crate) user: RwLock<CurrentUser>,
203+
user: RwLock<CurrentUser>,
204204
/// The settings for the cache.
205205
settings: RwLock<Settings>,
206206
}
@@ -595,7 +595,7 @@ mod test {
595595
..Default::default()
596596
},
597597
};
598-
assert!(cache.update(&mut guild_create).is_none());
598+
assert!(cache.update(&mut guild_create).is_some());
599599
assert!(cache.update(&mut event).is_none());
600600

601601
let mut guild_delete = GuildDeleteEvent {

src/cache/wrappers.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@ impl<K: Eq + Hash, V> MaybeMap<K, V> {
2626
self.0.as_ref()?.get_mut(k)
2727
}
2828

29-
pub fn contains(&self, k: &K) -> bool {
30-
self.0.as_ref().is_some_and(|m| m.contains_key(k))
31-
}
32-
3329
pub fn insert(&self, k: K, v: V) -> Option<V> {
3430
self.0.as_ref()?.insert(k, v)
3531
}
@@ -82,6 +78,10 @@ impl<K: Eq + Hash, V> ReadOnlyMapRef<'_, K, V> {
8278
pub fn len(&self) -> usize {
8379
self.0.map_or(0, DashMap::len)
8480
}
81+
82+
pub fn contains(&self, k: &K) -> bool {
83+
self.0.is_some_and(|m| m.contains_key(k))
84+
}
8585
}
8686
pub struct Hasher(foldhash::fast::FoldHasher);
8787
impl std::hash::Hasher for Hasher {

src/gateway/client/dispatch.rs

Lines changed: 22 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ use crate::internal::tokio::spawn_named;
1111
use crate::model::channel::ChannelType;
1212
use crate::model::event::Event;
1313
use crate::model::guild::Member;
14-
#[cfg(feature = "cache")]
15-
use crate::model::id::GuildId;
1614

1715
#[cfg(feature = "cache")]
1816
macro_rules! if_cache {
@@ -144,7 +142,7 @@ fn update_cache_with_event(
144142
}
145143
},
146144
Event::ChannelDelete(mut event) => {
147-
let cached_messages = if_cache!(event.update(cache));
145+
let cached_messages = if_cache!(update_cache!(cache, event));
148146

149147
let channel = event.channel;
150148
if channel.base.kind == ChannelType::Category {
@@ -162,7 +160,7 @@ fn update_cache_with_event(
162160
pin: event,
163161
},
164162
Event::ChannelUpdate(mut event) => {
165-
let old_channel = if_cache!(event.update(cache));
163+
let old_channel = if_cache!(update_cache!(cache, event));
166164

167165
FullEvent::ChannelUpdate {
168166
old: old_channel,
@@ -182,22 +180,13 @@ fn update_cache_with_event(
182180
unbanned_user: event.user,
183181
},
184182
Event::GuildCreate(mut event) => {
185-
let is_new = if_cache!(Some(!cache.unavailable_guilds.contains(&event.guild.id)));
186-
187-
update_cache!(cache, event);
183+
let is_new = if_cache!(Some(!cache.unavailable_guilds().contains(&event.guild.id)));
188184

189185
#[cfg(feature = "cache")]
190-
{
191-
if cache.unavailable_guilds.len() == 0 {
192-
cache.unavailable_guilds.shrink_to_fit();
193-
194-
let guild_amount =
195-
cache.guilds.iter().map(|i| *i.key()).collect::<Vec<GuildId>>();
196-
197-
extra_event = Some(FullEvent::CacheReady {
198-
guilds: guild_amount,
199-
});
200-
}
186+
if let Some(guilds) = update_cache!(cache, event) {
187+
extra_event = Some(FullEvent::CacheReady {
188+
guilds,
189+
});
201190
}
202191

203192
FullEvent::GuildCreate {
@@ -206,7 +195,7 @@ fn update_cache_with_event(
206195
}
207196
},
208197
Event::GuildDelete(mut event) => {
209-
let full = if_cache!(event.update(cache));
198+
let full = if_cache!(update_cache!(cache, event));
210199

211200
FullEvent::GuildDelete {
212201
incomplete: event.guild,
@@ -232,7 +221,7 @@ fn update_cache_with_event(
232221
}
233222
},
234223
Event::GuildMemberRemove(mut event) => {
235-
let member = if_cache!(event.update(cache));
224+
let member = if_cache!(update_cache!(cache, event));
236225

237226
FullEvent::GuildMemberRemoval {
238227
guild_id: event.guild_id,
@@ -241,7 +230,7 @@ fn update_cache_with_event(
241230
}
242231
},
243232
Event::GuildMemberUpdate(mut event) => {
244-
let before = if_cache!(event.update(cache));
233+
let before = if_cache!(update_cache!(cache, event));
245234
let after: Option<Member> = if_cache!({
246235
let guild = cache.guild(event.guild_id);
247236
guild.and_then(|g| g.members.get(&event.user.id).cloned())
@@ -268,7 +257,7 @@ fn update_cache_with_event(
268257
}
269258
},
270259
Event::GuildRoleDelete(mut event) => {
271-
let role = if_cache!(event.update(cache));
260+
let role = if_cache!(update_cache!(cache, event));
272261

273262
FullEvent::GuildRoleDelete {
274263
guild_id: event.guild_id,
@@ -277,7 +266,7 @@ fn update_cache_with_event(
277266
}
278267
},
279268
Event::GuildRoleUpdate(mut event) => {
280-
let before = if_cache!(event.update(cache));
269+
let before = if_cache!(update_cache!(cache, event));
281270

282271
FullEvent::GuildRoleUpdate {
283272
old_data_if_available: before,
@@ -324,15 +313,15 @@ fn update_cache_with_event(
324313
guild_id: event.guild_id,
325314
},
326315
Event::MessageUpdate(mut event) => {
327-
let before = if_cache!(event.update(cache));
316+
let before = if_cache!(update_cache!(cache, event));
328317

329318
FullEvent::MessageUpdate {
330319
old_if_available: before,
331320
event,
332321
}
333322
},
334323
Event::PresenceUpdate(mut event) => {
335-
let old_data = if_cache!(event.update(cache));
324+
let old_data = if_cache!(update_cache!(cache, event));
336325

337326
FullEvent::PresenceUpdate {
338327
old_data,
@@ -354,19 +343,11 @@ fn update_cache_with_event(
354343
removed_reactions: event.reaction,
355344
},
356345
Event::Ready(mut event) => {
357-
update_cache!(cache, event);
358-
359346
#[cfg(feature = "cache")]
360-
{
361-
let mut shards = cache.shard_data.write();
362-
if shards.connected.len() == shards.total.get() as usize
363-
&& !shards.has_sent_shards_ready
364-
{
365-
shards.has_sent_shards_ready = true;
366-
extra_event = Some(FullEvent::ShardsReady {
367-
total_shards: shards.total,
368-
});
369-
}
347+
if let Some(total_shards) = update_cache!(cache, event) {
348+
extra_event = Some(FullEvent::ShardsReady {
349+
total_shards,
350+
});
370351
}
371352

372353
FullEvent::Ready {
@@ -380,7 +361,7 @@ fn update_cache_with_event(
380361
event,
381362
},
382363
Event::UserUpdate(mut event) => {
383-
let before = if_cache!(event.update(cache));
364+
let before = if_cache!(update_cache!(cache, event));
384365

385366
FullEvent::UserUpdate {
386367
old_data: before,
@@ -391,7 +372,7 @@ fn update_cache_with_event(
391372
event,
392373
},
393374
Event::VoiceStateUpdate(mut event) => {
394-
let before = if_cache!(event.update(cache));
375+
let before = if_cache!(update_cache!(cache, event));
395376

396377
FullEvent::VoiceStateUpdate {
397378
old: before,
@@ -445,15 +426,15 @@ fn update_cache_with_event(
445426
}
446427
},
447428
Event::ThreadUpdate(mut event) => {
448-
let old = if_cache!(event.update(cache));
429+
let old = if_cache!(update_cache!(cache, event));
449430

450431
FullEvent::ThreadUpdate {
451432
old,
452433
new: event.thread,
453434
}
454435
},
455436
Event::ThreadDelete(mut event) => {
456-
let full_thread_data = if_cache!(event.update(cache));
437+
let full_thread_data = if_cache!(update_cache!(cache, event));
457438

458439
FullEvent::ThreadDelete {
459440
thread: event.thread,

src/model/channel/message.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,7 +1137,6 @@ pub struct PollAnswerCount {
11371137
// all tests here require cache, move if non-cache test is added
11381138
#[cfg(all(test, feature = "cache"))]
11391139
mod tests {
1140-
use dashmap::DashMap;
11411140
use extract_map::ExtractMap;
11421141
use small_fixed_array::FixedArray;
11431142

@@ -1153,7 +1152,7 @@ mod tests {
11531152
UserId,
11541153
};
11551154
use crate::cache::Cache;
1156-
use crate::cache::wrappers::MaybeMap;
1155+
use crate::model::event::GuildCreateEvent;
11571156

11581157
fn new_extract_map<K, T>(val: T) -> ExtractMap<K, T>
11591158
where
@@ -1204,12 +1203,10 @@ mod tests {
12041203
};
12051204

12061205
// Cache, with the guild setup.
1207-
let mut cache = Cache::new();
1208-
cache.guilds = MaybeMap(Some({
1209-
let guilds = DashMap::default();
1210-
guilds.insert(guild.id, guild);
1211-
guilds
1212-
}));
1206+
let cache = Cache::new();
1207+
cache.update(&mut GuildCreateEvent {
1208+
guild,
1209+
});
12131210

12141211
// The author should only have the one permission, SEND_MESSAGES.
12151212
assert_eq!(message.author_permissions(&cache), Some(Permissions::SEND_MESSAGES));

0 commit comments

Comments
 (0)