diff --git a/src/types/config/types/guild_configuration.rs b/src/types/config/types/guild_configuration.rs index 96e6ea8..65897ea 100644 --- a/src/types/config/types/guild_configuration.rs +++ b/src/types/config/types/guild_configuration.rs @@ -18,7 +18,7 @@ use crate::types::config::types::subconfigs::guild::{ }; use crate::types::{Error, GuildError}; -#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize, Hash)] #[serde(rename_all = "SCREAMING_SNAKE_CASE")] pub enum GuildFeatures { ActivitiesAlpha, @@ -139,7 +139,7 @@ pub enum GuildFeatures { InvitesClosed, } -#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize, Eq)] +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize, Eq, Hash)] pub struct GuildFeaturesList(Vec); impl Deref for GuildFeaturesList { diff --git a/src/types/entities/emoji.rs b/src/types/entities/emoji.rs index 51f78fb..4f56af5 100644 --- a/src/types/entities/emoji.rs +++ b/src/types/entities/emoji.rs @@ -35,6 +35,19 @@ pub struct Emoji { pub available: Option, } +impl std::hash::Hash for Emoji { + fn hash(&self, state: &mut H) { + self.id.hash(state); + self.name.hash(state); + self.roles.hash(state); + self.roles.hash(state); + self.require_colons.hash(state); + self.managed.hash(state); + self.animated.hash(state); + self.available.hash(state); + } +} + impl PartialEq for Emoji { fn eq(&self, other: &Self) -> bool { !(self.id != other.id diff --git a/src/types/entities/guild.rs b/src/types/entities/guild.rs index d810aea..3739cd2 100644 --- a/src/types/entities/guild.rs +++ b/src/types/entities/guild.rs @@ -111,8 +111,60 @@ pub struct Guild { pub widget_enabled: Option, } +impl std::hash::Hash for Guild { + fn hash(&self, state: &mut H) { + self.afk_channel_id.hash(state); + self.afk_timeout.hash(state); + self.application_id.hash(state); + self.approximate_member_count.hash(state); + self.approximate_presence_count.hash(state); + self.banner.hash(state); + self.bans.hash(state); + self.default_message_notifications.hash(state); + self.description.hash(state); + self.discovery_splash.hash(state); + self.explicit_content_filter.hash(state); + self.features.hash(state); + self.icon.hash(state); + self.icon_hash.hash(state); + self.id.hash(state); + self.invites.hash(state); + self.joined_at.hash(state); + self.large.hash(state); + self.max_members.hash(state); + self.max_presences.hash(state); + self.max_stage_video_channel_users.hash(state); + self.max_video_channel_users.hash(state); + self.mfa_level.hash(state); + self.name.hash(state); + self.nsfw_level.hash(state); + self.owner.hash(state); + self.owner_id.hash(state); + self.permissions.hash(state); + self.preferred_locale.hash(state); + self.premium_progress_bar_enabled.hash(state); + self.premium_subscription_count.hash(state); + self.premium_tier.hash(state); + self.primary_category_id.hash(state); + self.public_updates_channel_id.hash(state); + self.region.hash(state); + self.rules_channel.hash(state); + self.rules_channel_id.hash(state); + self.splash.hash(state); + self.stickers.hash(state); + self.system_channel_flags.hash(state); + self.system_channel_id.hash(state); + self.vanity_url_code.hash(state); + self.verification_level.hash(state); + self.welcome_screen.hash(state); + self.welcome_screen.hash(state); + self.widget_channel_id.hash(state); + self.widget_enabled.hash(state); + } +} + /// See -#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq, Eq)] +#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))] pub struct GuildBan { pub user: PublicUser, @@ -142,7 +194,26 @@ pub struct GuildInvite { pub vanity_url: Option, } -#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)] +impl std::hash::Hash for GuildInvite { + fn hash(&self, state: &mut H) { + self.code.hash(state); + self.temporary.hash(state); + self.uses.hash(state); + self.max_uses.hash(state); + self.max_age.hash(state); + self.created_at.hash(state); + self.expires_at.hash(state); + self.guild_id.hash(state); + self.channel_id.hash(state); + self.inviter_id.hash(state); + self.target_user_id.hash(state); + self.target_user.hash(state); + self.target_user_type.hash(state); + self.vanity_url.hash(state); + } +} + +#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq, Hash)] pub struct UnavailableGuild { id: Snowflake, unavailable: bool, @@ -209,7 +280,7 @@ pub struct GuildScheduledEventEntityMetadata { pub location: Option, } -#[derive(Serialize, Deserialize, Debug, Default, Clone, Eq, PartialEq)] +#[derive(Serialize, Deserialize, Debug, Default, Clone, Eq, PartialEq, Hash)] pub struct VoiceRegion { id: String, name: String, @@ -218,7 +289,7 @@ pub struct VoiceRegion { custom: bool, } -#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq)] +#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq, Hash, Copy)] #[repr(u8)] #[serde(rename_all = "SCREAMING_SNAKE_CASE")] /// See @@ -228,7 +299,7 @@ pub enum MessageNotificationLevel { OnlyMentions = 1, } -#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq)] +#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq, Hash, Copy)] #[repr(u8)] #[serde(rename_all = "SCREAMING_SNAKE_CASE")] /// See @@ -239,7 +310,7 @@ pub enum ExplicitContentFilterLevel { AllMembers = 2, } -#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq)] +#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq, Hash, Copy)] #[repr(u8)] #[serde(rename_all = "SCREAMING_SNAKE_CASE")] /// See @@ -252,7 +323,7 @@ pub enum VerificationLevel { VeryHigh = 4, } -#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq)] +#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq, Hash, Copy)] #[repr(u8)] #[serde(rename_all = "SCREAMING_SNAKE_CASE")] /// See @@ -262,7 +333,7 @@ pub enum MFALevel { Elevated = 1, } -#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq)] +#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq, Hash, Copy)] #[repr(u8)] #[serde(rename_all = "SCREAMING_SNAKE_CASE")] /// See @@ -274,7 +345,7 @@ pub enum NSFWLevel { AgeRestricted = 3, } -#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq)] +#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq, Hash, Copy)] #[repr(u8)] #[serde(rename_all = "SCREAMING_SNAKE_CASE")] /// See @@ -287,7 +358,7 @@ pub enum PremiumTier { } bitflags! { - #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)] + #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)] /// # Reference /// See pub struct SystemChannelFlags: u64 { diff --git a/src/types/entities/sticker.rs b/src/types/entities/sticker.rs index c2cdb46..593206d 100644 --- a/src/types/entities/sticker.rs +++ b/src/types/entities/sticker.rs @@ -28,6 +28,22 @@ pub struct Sticker { pub sort_value: Option, } +impl std::hash::Hash for Sticker { + fn hash(&self, state: &mut H) { + self.id.hash(state); + self.pack_id.hash(state); + self.name.hash(state); + self.description.hash(state); + self.tags.hash(state); + self.asset.hash(state); + self.sticker_type.hash(state); + self.format_type.hash(state); + self.available.hash(state); + self.guild_id.hash(state); + self.sort_value.hash(state); + } +} + impl PartialEq for Sticker { fn eq(&self, other: &Self) -> bool { self.id == other.id diff --git a/src/types/entities/user.rs b/src/types/entities/user.rs index 81d737a..eca5344 100644 --- a/src/types/entities/user.rs +++ b/src/types/entities/user.rs @@ -27,7 +27,7 @@ impl User { PublicUser::from(self) } } -#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq, Eq)] +#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "client", derive(Updateable, Composite))] #[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))] pub struct User { @@ -63,7 +63,7 @@ pub struct User { pub disabled: Option, } -#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize, Hash)] pub struct PublicUser { pub id: Snowflake, pub username: Option, diff --git a/src/types/interfaces/guild_welcome_screen.rs b/src/types/interfaces/guild_welcome_screen.rs index 4912a78..dbeef0f 100644 --- a/src/types/interfaces/guild_welcome_screen.rs +++ b/src/types/interfaces/guild_welcome_screen.rs @@ -2,14 +2,14 @@ use serde::{Deserialize, Serialize}; use crate::types::utils::Snowflake; -#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)] +#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq, Hash)] pub struct WelcomeScreenObject { pub enabled: bool, pub description: Option, pub welcome_channels: Vec, } -#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)] +#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq, Hash)] pub struct WelcomeScreenChannel { pub channel_id: Snowflake, pub description: String,