Skip to content

Commit 2290a77

Browse files
committed
Fix CacheUpdate implementations for extra FullEvents
1 parent 04b3c76 commit 2290a77

File tree

4 files changed

+56
-64
lines changed

4 files changed

+56
-64
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

@@ -451,24 +458,28 @@ impl CacheUpdate for PresenceUpdateEvent {
451458
}
452459

453460
impl CacheUpdate for ReadyEvent {
454-
type Output = std::convert::Infallible;
461+
type Output = NonZeroU16;
455462

456463
fn update(&mut self, cache: &Cache) -> Option<Self::Output> {
457464
for unavailable in &self.ready.guilds {
458465
cache.guilds.remove(&unavailable.id);
459466
cache.unavailable_guilds.insert(unavailable.id, ());
460467
}
461468

462-
let shard_data = self.ready.shard.unwrap_or_default();
469+
let shard_info = self.ready.shard.unwrap_or_default();
463470

464-
{
465-
let mut cached_shard_data = cache.shard_data.write();
466-
cached_shard_data.total = shard_data.total;
467-
cached_shard_data.connected.insert(shard_data.id);
468-
}
469471
cache.user.write().clone_from(&self.ready.user);
470472

471-
None
473+
let mut shards = cache.shard_data.write();
474+
shards.total = shard_info.total;
475+
shards.connected.insert(shard_info.id);
476+
477+
if shards.connected.len() == shards.total.get() as usize && !shards.has_sent_shards_ready {
478+
shards.has_sent_shards_ready = true;
479+
Some(shards.total)
480+
} else {
481+
None
482+
}
472483
}
473484
}
474485

src/cache/mod.rs

Lines changed: 9 additions & 9 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
}

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,

0 commit comments

Comments
 (0)