Skip to content

Commit b3713a5

Browse files
committed
Use SmolBitSet for Permissions
1 parent 5f70b8e commit b3713a5

File tree

6 files changed

+211
-170
lines changed

6 files changed

+211
-170
lines changed

src/builder/bot_auth_parameters.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,9 @@ impl<'a> CreateBotAuthParameters<'a> {
3030
#[must_use]
3131
pub fn build(self) -> String {
3232
// These bindings have to be defined before `valid_data`, due to Drop order.
33-
let (client_id_str, guild_id_str, scope_str, bits_str);
33+
let (client_id_str, guild_id_str, scope_str, perm_str);
3434

3535
let mut valid_data = ArrayVec::<_, 5>::new();
36-
let bits = self.permissions.bits();
3736

3837
if let Some(client_id) = self.client_id {
3938
client_id_str = client_id.to_arraystring();
@@ -45,9 +44,9 @@ impl<'a> CreateBotAuthParameters<'a> {
4544
valid_data.push(("scope", &scope_str));
4645
}
4746

48-
if bits != 0 {
49-
bits_str = bits.to_arraystring();
50-
valid_data.push(("permissions", &bits_str));
47+
perm_str = self.permissions.to_string();
48+
if perm_str != "0" {
49+
valid_data.push(("permissions", &perm_str));
5150
}
5251

5352
if let Some(guild_id) = self.guild_id {

src/builder/edit_role.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ pub struct EditRole<'a> {
4343
#[serde(skip_serializing_if = "Option::is_none")]
4444
name: Option<Cow<'a, str>>,
4545
#[serde(skip_serializing_if = "Option::is_none")]
46-
permissions: Option<u64>,
46+
permissions: Option<Permissions>,
4747
#[serde(skip_serializing_if = "Option::is_none")]
4848
#[serde(rename = "color")]
4949
colour: Option<Colour>,
@@ -78,7 +78,7 @@ impl<'a> EditRole<'a> {
7878
hoist: Some(role.hoist()),
7979
mentionable: Some(role.mentionable()),
8080
name: Some(Cow::Borrowed(&role.name)),
81-
permissions: Some(role.permissions.bits()),
81+
permissions: Some(role.permissions.clone()),
8282
position: Some(role.position),
8383
colour: Some(role.colour),
8484
unicode_emoji: role.unicode_emoji.as_ref().map(|v| Some(Cow::Borrowed(v.as_str()))),
@@ -122,7 +122,7 @@ impl<'a> EditRole<'a> {
122122

123123
/// Set the role's permissions.
124124
pub fn permissions(mut self, permissions: Permissions) -> Self {
125-
self.permissions = Some(permissions.bits());
125+
self.permissions = Some(permissions);
126126
self
127127
}
128128

@@ -204,11 +204,7 @@ pub struct CreateRoleColours {
204204

205205
impl CreateRoleColours {
206206
pub fn new(primary_colour: Colour) -> Self {
207-
Self {
208-
primary_color: primary_colour,
209-
secondary_color: None,
210-
tertiary_color: None,
211-
}
207+
Self { primary_color: primary_colour, secondary_color: None, tertiary_color: None }
212208
}
213209

214210
/// Sets the secondary colour for this role.

src/model/application/interaction.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@ use serde::ser::{Serialize, Serializer};
33
use serde_json::value::RawValue;
44

55
use super::{
6-
CommandInteraction,
7-
ComponentInteraction,
8-
InstallationContext,
9-
ModalInteraction,
6+
CommandInteraction, ComponentInteraction, InstallationContext, ModalInteraction,
107
PingInteraction,
118
};
129
use crate::internal::prelude::*;
@@ -60,10 +57,10 @@ impl Interaction {
6057
#[must_use]
6158
pub fn app_permissions(&self) -> Permissions {
6259
match self {
63-
Self::Ping(i) => i.app_permissions,
64-
Self::Command(i) | Self::Autocomplete(i) => i.app_permissions,
65-
Self::Component(i) => i.app_permissions,
66-
Self::Modal(i) => i.app_permissions,
60+
Self::Ping(i) => i.app_permissions.clone(),
61+
Self::Command(i) | Self::Autocomplete(i) => i.app_permissions.clone(),
62+
Self::Component(i) => i.app_permissions.clone(),
63+
Self::Modal(i) => i.app_permissions.clone(),
6764
}
6865
}
6966

@@ -525,10 +522,7 @@ impl serde::Serialize for MessageInteractionMetadata {
525522
val: T,
526523
kind: InteractionType,
527524
) -> StdResult<S::Ok, S::Error> {
528-
let wrapper = WithType {
529-
kind,
530-
val,
531-
};
525+
let wrapper = WithType { kind, val };
532526

533527
wrapper.serialize(serializer)
534528
}

src/model/channel/message.rs

Lines changed: 11 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ impl Message {
238238
};
239239

240240
if is_thread {
241-
permissions.set(Permissions::SEND_MESSAGES, permissions.send_messages_in_threads());
241+
permissions.set(Permission::SEND_MESSAGES, permissions.send_messages_in_threads());
242242
}
243243

244244
Some(permissions)
@@ -813,13 +813,7 @@ pub struct MessageReference {
813813
impl MessageReference {
814814
#[must_use]
815815
pub fn new(kind: MessageReferenceKind, channel_id: GenericChannelId) -> Self {
816-
Self {
817-
kind,
818-
channel_id,
819-
message_id: None,
820-
guild_id: None,
821-
fail_if_not_exists: None,
822-
}
816+
Self { kind, channel_id, message_id: None, guild_id: None, fail_if_not_exists: None }
823817
}
824818

825819
#[must_use]
@@ -988,11 +982,7 @@ pub struct MessageLink {
988982
impl Display for MessageLink {
989983
#[inline]
990984
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
991-
let MessageLink {
992-
message_id,
993-
channel_id,
994-
guild_id,
995-
} = self;
985+
let MessageLink { message_id, channel_id, guild_id } = self;
996986

997987
f.write_str("https://discord.com/channels")?;
998988
if let Some(guild_id) = guild_id {
@@ -1009,11 +999,7 @@ impl MessageId {
1009999
/// link will be valid for messages in either private channels or guilds.
10101000
#[must_use]
10111001
pub fn link(self, channel_id: GenericChannelId, guild_id: Option<GuildId>) -> MessageLink {
1012-
MessageLink {
1013-
message_id: self,
1014-
channel_id,
1015-
guild_id,
1016-
}
1002+
MessageLink { message_id: self, channel_id, guild_id }
10171003
}
10181004
}
10191005

@@ -1200,15 +1186,8 @@ mod tests {
12001186
use small_fixed_array::FixedArray;
12011187

12021188
use super::{
1203-
Guild,
1204-
GuildChannel,
1205-
Member,
1206-
Message,
1207-
PermissionOverwrite,
1208-
PermissionOverwriteType,
1209-
Permissions,
1210-
User,
1211-
UserId,
1189+
Guild, GuildChannel, Member, Message, PermissionOverwrite, PermissionOverwriteType,
1190+
Permissions, User, UserId,
12121191
};
12131192
use crate::cache::Cache;
12141193
use crate::model::event::GuildCreateEvent;
@@ -1227,10 +1206,7 @@ mod tests {
12271206
#[test]
12281207
fn author_permissions_respects_overwrites() {
12291208
// Author of the message, with a random ID that won't collide with defaults.
1230-
let author = User {
1231-
id: UserId::new(50778944701071),
1232-
..Default::default()
1233-
};
1209+
let author = User { id: UserId::new(50778944701071), ..Default::default() };
12341210

12351211
// Channel with the message, with SEND_MESSAGES on.
12361212
let channel = GuildChannel {
@@ -1246,26 +1222,17 @@ mod tests {
12461222
// Guild with the author and channel cached, default (empty) permissions.
12471223
let guild = Guild {
12481224
channels: new_extract_map(channel),
1249-
members: new_extract_map(Member {
1250-
user: author.clone(),
1251-
..Default::default()
1252-
}),
1225+
members: new_extract_map(Member { user: author.clone(), ..Default::default() }),
12531226
..Default::default()
12541227
};
12551228

12561229
// Message, tied to the guild and the channel.
1257-
let message = Message {
1258-
author,
1259-
channel_id,
1260-
guild_id: Some(guild.id),
1261-
..Default::default()
1262-
};
1230+
let message =
1231+
Message { author, channel_id, guild_id: Some(guild.id), ..Default::default() };
12631232

12641233
// Cache, with the guild setup.
12651234
let cache = Cache::new();
1266-
cache.update(&mut GuildCreateEvent {
1267-
guild,
1268-
});
1235+
cache.update(&mut GuildCreateEvent { guild });
12691236

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

src/model/guild/mod.rs

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ impl Guild {
273273
.members
274274
.iter()
275275
.map(|member| self.user_permissions_in(channel, member))
276-
.all(Permissions::view_channel)
276+
.all(|perm| Permissions::view_channel(&perm))
277277
})
278278
}
279279

@@ -320,10 +320,7 @@ impl Guild {
320320
icon: Option<ImageHash>,
321321
}
322322

323-
let body = CreateGuild {
324-
name,
325-
icon,
326-
};
323+
let body = CreateGuild { name, icon };
327324

328325
#[expect(deprecated)]
329326
http.create_guild(&body).await
@@ -894,17 +891,17 @@ impl Guild {
894891
match overwrite.kind {
895892
PermissionOverwriteType::Member(user_id) => {
896893
if member_user_id == user_id {
897-
member_allow_overwrites = overwrite.allow;
898-
member_deny_overwrites = overwrite.deny;
894+
member_allow_overwrites = overwrite.allow.clone();
895+
member_deny_overwrites = overwrite.deny.clone();
899896
}
900897
},
901898
PermissionOverwriteType::Role(role_id) => {
902899
if role_id.get() == guild_id.get() {
903-
everyone_allow_overwrites = overwrite.allow;
904-
everyone_deny_overwrites = overwrite.deny;
900+
everyone_allow_overwrites = overwrite.allow.clone();
901+
everyone_deny_overwrites = overwrite.deny.clone();
905902
} else if member_roles.contains(&role_id) {
906-
roles_allow_overwrites.push(overwrite.allow);
907-
roles_deny_overwrites.push(overwrite.deny);
903+
roles_allow_overwrites.push(overwrite.allow.clone());
904+
roles_deny_overwrites.push(overwrite.deny.clone());
908905
}
909906
},
910907
}
@@ -915,7 +912,7 @@ impl Guild {
915912
is_guild_owner: member_user_id == guild_owner_id,
916913
everyone_permissions: if let Some(role) = guild_roles.get(&RoleId::new(guild_id.get()))
917914
{
918-
role.permissions
915+
role.permissions.clone()
919916
} else {
920917
error!("@everyone role missing in {}", guild_id);
921918
Permissions::empty()
@@ -924,7 +921,7 @@ impl Guild {
924921
.iter()
925922
.map(|role_id| {
926923
if let Some(role) = guild_roles.get(role_id) {
927-
role.permissions
924+
role.permissions.clone()
928925
} else {
929926
warn!(
930927
"{} on {} has non-existent role {:?}",
@@ -1043,7 +1040,7 @@ fn calculate_permissions(data: CalculatePermissions) -> Permissions {
10431040
}
10441041

10451042
// 3. Overwrites that deny permissions for @everyone are applied at a channel level
1046-
permissions &= !data.everyone_deny_overwrites;
1043+
permissions.and_not_assign(&data.everyone_deny_overwrites);
10471044
// 4. Overwrites that allow permissions for @everyone are applied at a channel level
10481045
permissions |= data.everyone_allow_overwrites;
10491046

@@ -1052,7 +1049,7 @@ fn calculate_permissions(data: CalculatePermissions) -> Permissions {
10521049
for p in data.roles_deny_overwrites {
10531050
role_deny_permissions |= p;
10541051
}
1055-
permissions &= !role_deny_permissions;
1052+
permissions.and_not_assign(&role_deny_permissions);
10561053

10571054
// 6. Overwrites that allow permissions for specific roles are applied at a channel level
10581055
let mut role_allow_permissions = Permissions::empty();
@@ -1062,7 +1059,7 @@ fn calculate_permissions(data: CalculatePermissions) -> Permissions {
10621059
permissions |= role_allow_permissions;
10631060

10641061
// 7. Member-specific overwrites that deny permissions are applied at a channel level
1065-
permissions &= !data.member_deny_overwrites;
1062+
permissions.and_not_assign(&data.member_deny_overwrites);
10661063
// 8. Member-specific overwrites that allow permissions are applied at a channel level
10671064
permissions |= data.member_allow_overwrites;
10681065

@@ -1331,10 +1328,7 @@ mod test {
13311328
fn get_guild() -> Guild {
13321329
let m = get_member();
13331330

1334-
Guild {
1335-
members: ExtractMap::from_iter([m]),
1336-
..Default::default()
1337-
}
1331+
Guild { members: ExtractMap::from_iter([m]), ..Default::default() }
13381332
}
13391333

13401334
#[test]

0 commit comments

Comments
 (0)