Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(model, http, cache)!: remove guild_id from members #2083

Merged
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions twilight-cache-inmemory/src/event/guild.rs
Original file line number Diff line number Diff line change
Expand Up @@ -515,11 +515,11 @@ mod tests {
let guild_id = Id::new(1);
let cache = InMemoryCache::new();
let user = test::user(user_id);
let member = test::member(user_id, guild_id);
let member = test::member(user_id);
let guild = test::guild(guild_id, Some(1));

cache.update(&GuildCreate(guild));
cache.update(&MemberAdd(member));
cache.update(&MemberAdd { guild_id, member });

assert_eq!(cache.guild(guild_id).unwrap().member_count, Some(2));

Expand All @@ -533,7 +533,7 @@ mod tests {
let user_id = Id::new(2);
let guild_id = Id::new(1);
let cache = InMemoryCache::new();
let member = test::member(user_id, guild_id);
let member = test::member(user_id);
let mut guild = test::guild(guild_id, Some(1));
guild.members.push(member);

Expand Down
11 changes: 5 additions & 6 deletions twilight-cache-inmemory/src/event/member.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ impl InMemoryCache {
.or_default()
.insert(user_id);

let cached = CachedMember::from_partial_member(guild_id, user_id, member.clone());
let cached = CachedMember::from_partial_member(user_id, member.clone());
self.members.insert(id, cached);
}

Expand All @@ -87,7 +87,6 @@ impl InMemoryCache {
.insert(user_id);

let cached = CachedMember::from_interaction_member(
guild_id,
user_id,
member.clone(),
ComputedInteractionMemberFields { avatar, deaf, mute },
Expand All @@ -109,13 +108,13 @@ impl UpdateCache for MemberAdd {
return;
}

cache.cache_member(self.guild_id, self.0.clone());
cache.cache_member(self.guild_id, self.member.clone());

cache
.guild_members
.entry(self.guild_id)
.or_default()
.insert(self.0.user.id);
.insert(self.member.user.id);
}
}

Expand Down Expand Up @@ -210,7 +209,7 @@ mod tests {
let guild_1_members = guild_1_user_ids
.iter()
.copied()
.map(|id| test::member(id, Id::new(1)))
.map(test::member)
.collect::<Vec<_>>();

for member in guild_1_members {
Expand All @@ -237,7 +236,7 @@ mod tests {
let guild_2_members = guild_2_user_ids
.iter()
.copied()
.map(|id| test::member(id, Id::new(2)))
.map(test::member)
.collect::<Vec<_>>();
cache.cache_members(Id::new(2), guild_2_members);

Expand Down
1 change: 0 additions & 1 deletion twilight-cache-inmemory/src/event/voice_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,6 @@ mod tests {
avatar: None,
communication_disabled_until: None,
deaf: false,
guild_id: Id::new(2),
joined_at,
mute: false,
nick: None,
Expand Down
3 changes: 1 addition & 2 deletions twilight-cache-inmemory/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -935,7 +935,7 @@ mod tests {
fn clear() {
let cache = InMemoryCache::new();
cache.cache_emoji(Id::new(1), test::emoji(Id::new(3), None));
cache.cache_member(Id::new(2), test::member(Id::new(4), Id::new(2)));
cache.cache_member(Id::new(2), test::member(Id::new(2)));
cache.clear();
assert!(cache.emojis.is_empty());
assert!(cache.members.is_empty());
Expand All @@ -953,7 +953,6 @@ mod tests {
avatar: None,
communication_disabled_until: None,
deaf: false,
guild_id,
joined_at,
mute: false,
nick: None,
Expand Down
22 changes: 2 additions & 20 deletions twilight-cache-inmemory/src/model/member.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use twilight_model::{
application::interaction::application_command::InteractionMember,
guild::{Member, PartialMember},
id::{
marker::{GuildMarker, RoleMarker, UserMarker},
marker::{RoleMarker, UserMarker},
Id,
},
util::{ImageHash, Timestamp},
Expand All @@ -25,7 +25,6 @@ pub struct CachedMember {
pub(crate) avatar: Option<ImageHash>,
pub(crate) communication_disabled_until: Option<Timestamp>,
pub(crate) deaf: Option<bool>,
pub(crate) guild_id: Id<GuildMarker>,
pub(crate) joined_at: Timestamp,
pub(crate) mute: Option<bool>,
pub(crate) nick: Option<String>,
Expand Down Expand Up @@ -58,11 +57,6 @@ impl CachedMember {
self.deaf
}

/// ID of the guild this member is a part of.
pub const fn guild_id(&self) -> Id<GuildMarker> {
self.guild_id
}

/// [`Timestamp`] of this member's join date.
pub const fn joined_at(&self) -> Timestamp {
self.joined_at
Expand Down Expand Up @@ -106,7 +100,6 @@ impl CachedMember {
avatar,
communication_disabled_until,
deaf,
guild_id,
joined_at,
mute,
nick,
Expand All @@ -120,7 +113,6 @@ impl CachedMember {
avatar,
communication_disabled_until,
deaf: Some(deaf),
guild_id,
joined_at,
mute: Some(mute),
nick,
Expand All @@ -135,7 +127,6 @@ impl CachedMember {
// clippy: the contents of `fields` is consumed
#[allow(clippy::missing_const_for_fn, clippy::needless_pass_by_value)]
pub(crate) fn from_interaction_member(
guild_id: Id<GuildMarker>,
user_id: Id<UserMarker>,
member: InteractionMember,
fields: ComputedInteractionMemberFields,
Expand All @@ -156,7 +147,6 @@ impl CachedMember {
avatar,
communication_disabled_until,
deaf,
guild_id,
joined_at,
mute,
nick,
Expand All @@ -167,11 +157,7 @@ impl CachedMember {
}
}

pub(crate) fn from_partial_member(
guild_id: Id<GuildMarker>,
user_id: Id<UserMarker>,
member: PartialMember,
) -> Self {
pub(crate) fn from_partial_member(user_id: Id<UserMarker>, member: PartialMember) -> Self {
let PartialMember {
avatar,
communication_disabled_until,
Expand All @@ -189,7 +175,6 @@ impl CachedMember {
avatar,
communication_disabled_until,
deaf: Some(deaf),
guild_id,
joined_at,
mute: Some(mute),
nick,
Expand Down Expand Up @@ -250,7 +235,6 @@ mod tests {

assert_fields!(
CachedMember: deaf,
guild_id,
joined_at,
mute,
nick,
Expand All @@ -267,7 +251,6 @@ mod tests {
avatar: None,
communication_disabled_until: None,
deaf: Some(false),
guild_id: Id::new(3),
joined_at,
mute: Some(true),
nick: Some("member nick".to_owned()),
Expand Down Expand Up @@ -306,7 +289,6 @@ mod tests {
avatar: None,
communication_disabled_until: None,
deaf: false,
guild_id: Id::new(3),
joined_at,
mute: true,
nick: Some("member nick".to_owned()),
Expand Down
49 changes: 32 additions & 17 deletions twilight-cache-inmemory/src/permission.rs
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,7 @@ impl<'a> InMemoryCachePermissions<'a> {
})?;

let MemberRoles { assigned, everyone } = self
.member_roles(&member)
.member_roles(guild_id, &member)
.map_err(ChannelError::from_member_roles)?;

let overwrites = match channel.kind {
Expand Down Expand Up @@ -495,7 +495,7 @@ impl<'a> InMemoryCachePermissions<'a> {
})?;

let MemberRoles { assigned, everyone } = self
.member_roles(&member)
.member_roles(guild_id, &member)
.map_err(RootError::from_member_roles)?;
let calculator =
PermissionCalculator::new(guild_id, user_id, everyone, assigned.as_slice());
Expand Down Expand Up @@ -568,7 +568,11 @@ impl<'a> InMemoryCachePermissions<'a> {
///
/// Returns [`MemberRolesErrorType::RoleMissing`] if a role is missing from
/// the cache.
fn member_roles(&self, member: &'a CachedMember) -> Result<MemberRoles, MemberRolesErrorType> {
fn member_roles(
&self,
guild_id: Id<GuildMarker>,
member: &'a CachedMember,
) -> Result<MemberRoles, MemberRolesErrorType> {
let mut member_roles = Vec::with_capacity(member.roles.len());

for role_id in &member.roles {
Expand All @@ -581,8 +585,7 @@ impl<'a> InMemoryCachePermissions<'a> {
member_roles.push((*role_id, role.permissions));
}

// Assume that the `@everyone` role is always present, so do this last.
let everyone_role_id = member.guild_id().cast();
let everyone_role_id: Id<RoleMarker> = guild_id.cast();

if let Some(everyone_role) = self.cache.roles.get(&everyone_role_id) {
Ok(MemberRoles {
Expand Down Expand Up @@ -884,7 +887,10 @@ mod tests {
if g_id == GUILD_ID && u_id == USER_ID
));

cache.update(&MemberAdd(test::member(USER_ID, GUILD_ID)));
cache.update(&MemberAdd {
guild_id: GUILD_ID,
member: test::member(USER_ID),
});

assert!(matches!(
permissions.root(USER_ID, GUILD_ID).unwrap_err().kind(),
Expand All @@ -908,7 +914,10 @@ mod tests {
let permissions = cache.permissions();

cache.update(&GuildCreate(base_guild()));
cache.update(&MemberAdd(test::member(USER_ID, GUILD_ID)));
cache.update(&MemberAdd {
guild_id: GUILD_ID,
member: test::member(USER_ID),
});
cache.update(&MemberUpdate {
avatar: None,
communication_disabled_until: None,
Expand Down Expand Up @@ -964,12 +973,15 @@ mod tests {
if *g_id == GUILD_ID && *u_id == USER_ID
));

cache.update(&MemberAdd({
let mut member = test::member(USER_ID, GUILD_ID);
member.roles.push(OTHER_ROLE_ID);
cache.update(&MemberAdd {
guild_id: GUILD_ID,
member: {
let mut member = test::member(USER_ID);
member.roles.push(OTHER_ROLE_ID);

member
}));
member
},
});
assert!(matches!(
permissions.in_channel(USER_ID, CHANNEL_ID).unwrap_err().kind(),
&ChannelErrorType::RoleUnavailable { role_id }
Expand Down Expand Up @@ -1070,11 +1082,14 @@ mod tests {
)]);

cache.update(&GuildCreate(guild));
cache.update(&MemberAdd({
let mut member = test::member(USER_ID, GUILD_ID);
member.communication_disabled_until = Some(in_future);
member
}));
cache.update(&MemberAdd {
guild_id: GUILD_ID,
member: {
let mut member = test::member(USER_ID);
member.communication_disabled_until = Some(in_future);
member
},
});
assert_eq!(
Permissions::VIEW_CHANNEL | Permissions::READ_MESSAGE_HISTORY,
permissions.root(USER_ID, GUILD_ID)?
Expand Down
5 changes: 1 addition & 4 deletions twilight-cache-inmemory/src/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,6 @@ pub fn cache_with_message_and_reactions() -> InMemoryCache {
avatar: None,
communication_disabled_until: None,
deaf: false,
guild_id: Id::new(1),
joined_at,
mute: false,
nick: Some("member nick".to_owned()),
Expand Down Expand Up @@ -144,7 +143,6 @@ pub fn cache_with_message_and_reactions() -> InMemoryCache {
avatar: None,
communication_disabled_until: None,
deaf: false,
guild_id: Id::new(1),
joined_at,
mute: false,
nick: None,
Expand Down Expand Up @@ -265,14 +263,13 @@ pub fn guild_channel_text() -> (Id<GuildMarker>, Id<ChannelMarker>, Channel) {
(guild_id, channel_id, channel)
}

pub fn member(id: Id<UserMarker>, guild_id: Id<GuildMarker>) -> Member {
pub fn member(id: Id<UserMarker>) -> Member {
let joined_at = Timestamp::from_secs(1_632_072_645).expect("non zero");

Member {
avatar: None,
communication_disabled_until: None,
deaf: false,
guild_id,
joined_at,
mute: false,
nick: None,
Expand Down
25 changes: 11 additions & 14 deletions twilight-http/src/request/guild/member/get_guild_members.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@ use crate::{
client::Client,
error::Error,
request::{Request, TryIntoRequest},
response::{marker::MemberListBody, Response, ResponseFuture},
response::{marker::ListBody, Response, ResponseFuture},
routing::Route,
};
use std::future::IntoFuture;
use twilight_model::id::{
marker::{GuildMarker, UserMarker},
Id,
use twilight_model::{
guild::Member,
id::{
marker::{GuildMarker, UserMarker},
Id,
},
};
use twilight_validate::request::{
get_guild_members_limit as validate_get_guild_members_limit, ValidationError,
Expand Down Expand Up @@ -90,27 +93,21 @@ impl<'a> GetGuildMembers<'a> {

/// Execute the request, returning a future resolving to a [`Response`].
#[deprecated(since = "0.14.0", note = "use `.await` or `into_future` instead")]
pub fn exec(self) -> ResponseFuture<MemberListBody> {
pub fn exec(self) -> ResponseFuture<ListBody<Member>> {
self.into_future()
}
}

impl IntoFuture for GetGuildMembers<'_> {
type Output = Result<Response<MemberListBody>, Error>;
type Output = Result<Response<ListBody<Member>>, Error>;

type IntoFuture = ResponseFuture<MemberListBody>;
type IntoFuture = ResponseFuture<ListBody<Member>>;

fn into_future(self) -> Self::IntoFuture {
let guild_id = self.guild_id;
let http = self.http;

match self.try_into_request() {
Ok(request) => {
let mut future = http.request(request);
future.set_guild_id(guild_id);

future
}
Ok(request) => http.request(request),
Err(source) => ResponseFuture::error(source),
}
}
Expand Down
Loading