impl Hash for Guild

This commit is contained in:
bitfl0wer 2023-09-03 17:09:44 +02:00
parent b7ae75f7ce
commit 1340a11a65
6 changed files with 116 additions and 16 deletions

View File

@ -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<GuildFeatures>);
impl Deref for GuildFeaturesList {

View File

@ -35,6 +35,19 @@ pub struct Emoji {
pub available: Option<bool>,
}
impl std::hash::Hash for Emoji {
fn hash<H: std::hash::Hasher>(&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

View File

@ -111,8 +111,60 @@ pub struct Guild {
pub widget_enabled: Option<bool>,
}
impl std::hash::Hash for Guild {
fn hash<H: std::hash::Hasher>(&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 <https://docs.spacebar.chat/routes/#get-/guilds/-guild_id-/bans/-user->
#[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<bool>,
}
#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)]
impl std::hash::Hash for GuildInvite {
fn hash<H: std::hash::Hasher>(&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<String>,
}
#[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 <https://discord-userdoccers.vercel.app/resources/guild#message-notification-level>
@ -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 <https://discord-userdoccers.vercel.app/resources/guild#explicit-content-filter-level>
@ -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 <https://discord-userdoccers.vercel.app/resources/guild#verification-level>
@ -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 <https://discord-userdoccers.vercel.app/resources/guild#verification-level>
@ -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 <https://discord-userdoccers.vercel.app/resources/guild#verification-level>
@ -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 <https://discord-userdoccers.vercel.app/resources/guild#verification-level>

View File

@ -28,6 +28,22 @@ pub struct Sticker {
pub sort_value: Option<u8>,
}
impl std::hash::Hash for Sticker {
fn hash<H: std::hash::Hasher>(&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

View File

@ -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<bool>,
}
#[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<String>,

View File

@ -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<String>,
pub welcome_channels: Vec<WelcomeScreenChannel>,
}
#[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,