Skip to content

Commit 9f19cbd

Browse files
committed
Fix CacheUpdate implementations for extra FullEvents
1 parent 18d9582 commit 9f19cbd

File tree

4 files changed

+59
-67
lines changed

4 files changed

+59
-67
lines changed

src/cache/event.rs

+24-13
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::collections::{HashSet, VecDeque};
2+
use std::num::NonZeroU16;
23

34
use super::{Cache, CacheUpdate};
45
use crate::internal::prelude::*;
@@ -33,6 +34,7 @@ use crate::model::event::{
3334
};
3435
use crate::model::gateway::Presence;
3536
use crate::model::guild::{Guild, GuildMemberFlags, Member, MemberGeneratedFlags, Role};
37+
use crate::model::id::GuildId;
3638
use crate::model::user::{CurrentUser, OnlineStatus};
3739
use crate::model::voice::VoiceState;
3840

@@ -90,15 +92,20 @@ impl CacheUpdate for ChannelPinsUpdateEvent {
9092
}
9193

9294
impl CacheUpdate for GuildCreateEvent {
93-
type Output = ();
95+
type Output = Vec<GuildId>;
9496

95-
fn update(&mut self, cache: &Cache) -> Option<()> {
97+
fn update(&mut self, cache: &Cache) -> Option<Self::Output> {
9698
cache.unavailable_guilds.remove(&self.guild.id);
9799
let guild = self.guild.clone();
98100

99101
cache.guilds.insert(self.guild.id, guild);
100102

101-
None
103+
if cache.unavailable_guilds.len() == 0 {
104+
cache.unavailable_guilds.shrink_to_fit();
105+
Some(cache.guilds.iter().map(|i| *i.key()).collect())
106+
} else {
107+
None
108+
}
102109
}
103110
}
104111

@@ -435,9 +442,9 @@ impl CacheUpdate for PresenceUpdateEvent {
435442
}
436443

437444
impl CacheUpdate for ReadyEvent {
438-
type Output = ();
445+
type Output = NonZeroU16;
439446

440-
fn update(&mut self, cache: &Cache) -> Option<()> {
447+
fn update(&mut self, cache: &Cache) -> Option<Self::Output> {
441448
for unavailable in &self.ready.guilds {
442449
cache.guilds.remove(&unavailable.id);
443450
cache.unavailable_guilds.insert(unavailable.id, ());
@@ -447,12 +454,12 @@ impl CacheUpdate for ReadyEvent {
447454
let mut guilds_to_remove = vec![];
448455
let ready_guilds_hashset =
449456
self.ready.guilds.iter().map(|status| status.id).collect::<HashSet<_>>();
450-
let shard_data = self.ready.shard.unwrap_or_default();
457+
let shard_info = self.ready.shard.unwrap_or_default();
451458

452459
for guild_entry in cache.guilds.iter() {
453460
let guild = guild_entry.key();
454461
// Only handle data for our shard.
455-
if crate::utils::shard_id(*guild, shard_data.total) == shard_data.id.0
462+
if crate::utils::shard_id(*guild, shard_info.total) == shard_info.id.0
456463
&& !ready_guilds_hashset.contains(guild)
457464
{
458465
guilds_to_remove.push(*guild);
@@ -464,14 +471,18 @@ impl CacheUpdate for ReadyEvent {
464471
}
465472
}
466473

467-
{
468-
let mut cached_shard_data = cache.shard_data.write();
469-
cached_shard_data.total = shard_data.total;
470-
cached_shard_data.connected.insert(shard_data.id);
471-
}
472474
cache.user.write().clone_from(&self.ready.user);
473475

474-
None
476+
let mut shards = cache.shard_data.write();
477+
shards.total = shard_info.total;
478+
shards.connected.insert(shard_info.id);
479+
480+
if shards.connected.len() == shards.total.get() as usize && !shards.has_sent_shards_ready {
481+
shards.has_sent_shards_ready = true;
482+
Some(shards.total)
483+
} else {
484+
None
485+
}
475486
}
476487
}
477488

src/cache/mod.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,10 @@ pub type ChannelMessagesRef<'a> = CacheRef<'a, ChannelId, VecDeque<Message>, Nev
117117

118118
#[cfg_attr(feature = "typesize", derive(typesize::derive::TypeSize))]
119119
#[derive(Debug)]
120-
pub(crate) struct CachedShardData {
121-
pub total: NonZeroU16,
122-
pub connected: HashSet<ShardId>,
123-
pub has_sent_shards_ready: bool,
120+
struct CachedShardData {
121+
total: NonZeroU16,
122+
connected: HashSet<ShardId>,
123+
has_sent_shards_ready: bool,
124124
}
125125

126126
/// A cache containing data received from [`Shard`]s.
@@ -172,28 +172,28 @@ pub struct Cache {
172172
// ---
173173
/// A map of guilds with full data available. This includes data like [`Role`]s and [`Emoji`]s
174174
/// that are not available through the REST API.
175-
pub(crate) guilds: MaybeMap<GuildId, Guild>,
175+
guilds: MaybeMap<GuildId, Guild>,
176176
/// A list of guilds which are "unavailable".
177177
///
178178
/// Additionally, guilds are always unavailable for bot users when a Ready is received. Guilds
179179
/// are "sent in" over time through the receiving of [`Event::GuildCreate`]s.
180-
pub(crate) unavailable_guilds: MaybeMap<GuildId, ()>,
180+
unavailable_guilds: MaybeMap<GuildId, ()>,
181181

182182
// Messages cache:
183183
// ---
184-
pub(crate) messages: DashMap<ChannelId, VecDeque<Message>, BuildHasher>,
184+
messages: DashMap<ChannelId, VecDeque<Message>, BuildHasher>,
185185

186186
// Miscellanous fixed-size data
187187
// ---
188188
/// Information about running shards
189-
pub(crate) shard_data: RwLock<CachedShardData>,
189+
shard_data: RwLock<CachedShardData>,
190190
/// The current user "logged in" and for which events are being received for.
191191
///
192192
/// The current user contains information that a regular [`User`] does not, such as whether it
193193
/// is a bot, whether the user is verified, etc.
194194
///
195195
/// Refer to the documentation for [`CurrentUser`] for more information.
196-
pub(crate) user: RwLock<CurrentUser>,
196+
user: RwLock<CurrentUser>,
197197
/// The settings for the cache.
198198
settings: RwLock<Settings>,
199199
}

src/cache/wrappers.rs

+4-4
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(fxhash::FxHasher);
8787
impl std::hash::Hasher for Hasher {

src/gateway/client/dispatch.rs

+22-41
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ use crate::internal::prelude::*;
1010
use crate::model::channel::ChannelType;
1111
use crate::model::event::Event;
1212
use crate::model::guild::Member;
13-
#[cfg(feature = "cache")]
14-
use crate::model::id::GuildId;
1513

1614
#[cfg(feature = "cache")]
1715
macro_rules! if_cache {
@@ -121,7 +119,7 @@ fn update_cache_with_event(
121119
}
122120
},
123121
Event::ChannelDelete(mut event) => {
124-
let cached_messages = if_cache!(event.update(cache));
122+
let cached_messages = if_cache!(update_cache!(cache, event));
125123

126124
let channel = event.channel;
127125
if channel.kind == ChannelType::Category {
@@ -139,7 +137,7 @@ fn update_cache_with_event(
139137
pin: event,
140138
},
141139
Event::ChannelUpdate(mut event) => {
142-
let old_channel = if_cache!(event.update(cache));
140+
let old_channel = if_cache!(update_cache!(cache, event));
143141

144142
FullEvent::ChannelUpdate {
145143
old: old_channel,
@@ -159,22 +157,13 @@ fn update_cache_with_event(
159157
unbanned_user: event.user,
160158
},
161159
Event::GuildCreate(mut event) => {
162-
let is_new = if_cache!(Some(!cache.unavailable_guilds.contains(&event.guild.id)));
163-
164-
update_cache!(cache, event);
160+
let is_new = if_cache!(Some(!cache.unavailable_guilds().contains(&event.guild.id)));
165161

166162
#[cfg(feature = "cache")]
167-
{
168-
if cache.unavailable_guilds.len() == 0 {
169-
cache.unavailable_guilds.shrink_to_fit();
170-
171-
let guild_amount =
172-
cache.guilds.iter().map(|i| *i.key()).collect::<Vec<GuildId>>();
173-
174-
extra_event = Some(FullEvent::CacheReady {
175-
guilds: guild_amount,
176-
});
177-
}
163+
if let Some(guilds) = update_cache!(cache, event) {
164+
extra_event = Some(FullEvent::CacheReady {
165+
guilds,
166+
});
178167
}
179168

180169
FullEvent::GuildCreate {
@@ -183,7 +172,7 @@ fn update_cache_with_event(
183172
}
184173
},
185174
Event::GuildDelete(mut event) => {
186-
let full = if_cache!(event.update(cache));
175+
let full = if_cache!(update_cache!(cache, event));
187176

188177
FullEvent::GuildDelete {
189178
incomplete: event.guild,
@@ -209,7 +198,7 @@ fn update_cache_with_event(
209198
}
210199
},
211200
Event::GuildMemberRemove(mut event) => {
212-
let member = if_cache!(event.update(cache));
201+
let member = if_cache!(update_cache!(cache, event));
213202

214203
FullEvent::GuildMemberRemoval {
215204
guild_id: event.guild_id,
@@ -218,7 +207,7 @@ fn update_cache_with_event(
218207
}
219208
},
220209
Event::GuildMemberUpdate(mut event) => {
221-
let before = if_cache!(event.update(cache));
210+
let before = if_cache!(update_cache!(cache, event));
222211
let after: Option<Member> = if_cache!({
223212
let guild = cache.guild(event.guild_id);
224213
guild.and_then(|g| g.members.get(&event.user.id).cloned())
@@ -245,7 +234,7 @@ fn update_cache_with_event(
245234
}
246235
},
247236
Event::GuildRoleDelete(mut event) => {
248-
let role = if_cache!(event.update(cache));
237+
let role = if_cache!(update_cache!(cache, event));
249238

250239
FullEvent::GuildRoleDelete {
251240
guild_id: event.guild_id,
@@ -254,7 +243,7 @@ fn update_cache_with_event(
254243
}
255244
},
256245
Event::GuildRoleUpdate(mut event) => {
257-
let before = if_cache!(event.update(cache));
246+
let before = if_cache!(update_cache!(cache, event));
258247

259248
FullEvent::GuildRoleUpdate {
260249
old_data_if_available: before,
@@ -301,7 +290,7 @@ fn update_cache_with_event(
301290
guild_id: event.guild_id,
302291
},
303292
Event::MessageUpdate(mut event) => {
304-
let before = if_cache!(event.update(cache));
293+
let before = if_cache!(update_cache!(cache, event));
305294
let after = if_cache!(cache.message(event.channel_id, event.id).map(|m| m.clone()));
306295

307296
FullEvent::MessageUpdate {
@@ -311,7 +300,7 @@ fn update_cache_with_event(
311300
}
312301
},
313302
Event::PresenceUpdate(mut event) => {
314-
let old_data = if_cache!(event.update(cache));
303+
let old_data = if_cache!(update_cache!(cache, event));
315304

316305
FullEvent::PresenceUpdate {
317306
old_data,
@@ -333,19 +322,11 @@ fn update_cache_with_event(
333322
removed_reactions: event.reaction,
334323
},
335324
Event::Ready(mut event) => {
336-
update_cache!(cache, event);
337-
338325
#[cfg(feature = "cache")]
339-
{
340-
let mut shards = cache.shard_data.write();
341-
if shards.connected.len() == shards.total.get() as usize
342-
&& !shards.has_sent_shards_ready
343-
{
344-
shards.has_sent_shards_ready = true;
345-
extra_event = Some(FullEvent::ShardsReady {
346-
total_shards: shards.total,
347-
});
348-
}
326+
if let Some(total_shards) = update_cache!(cache, event) {
327+
extra_event = Some(FullEvent::ShardsReady {
328+
total_shards,
329+
});
349330
}
350331

351332
FullEvent::Ready {
@@ -359,7 +340,7 @@ fn update_cache_with_event(
359340
event,
360341
},
361342
Event::UserUpdate(mut event) => {
362-
let before = if_cache!(event.update(cache));
343+
let before = if_cache!(update_cache!(cache, event));
363344

364345
FullEvent::UserUpdate {
365346
old_data: before,
@@ -370,7 +351,7 @@ fn update_cache_with_event(
370351
event,
371352
},
372353
Event::VoiceStateUpdate(mut event) => {
373-
let before = if_cache!(event.update(cache));
354+
let before = if_cache!(update_cache!(cache, event));
374355

375356
FullEvent::VoiceStateUpdate {
376357
old: before,
@@ -423,15 +404,15 @@ fn update_cache_with_event(
423404
}
424405
},
425406
Event::ThreadUpdate(mut event) => {
426-
let old = if_cache!(event.update(cache));
407+
let old = if_cache!(update_cache!(cache, event));
427408

428409
FullEvent::ThreadUpdate {
429410
old,
430411
new: event.thread,
431412
}
432413
},
433414
Event::ThreadDelete(mut event) => {
434-
let full_thread_data = if_cache!(event.update(cache));
415+
let full_thread_data = if_cache!(update_cache!(cache, event));
435416

436417
FullEvent::ThreadDelete {
437418
thread: event.thread,

0 commit comments

Comments
 (0)