From fec947b4c851ae0a91ddd5b8f85cfbb4cbd3ad6a Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Tue, 1 Aug 2023 14:55:25 +0100 Subject: [PATCH] feat(core/models): implement server model closes #279 --- crates/core/database/src/util/bridge/v0.rs | 61 ++++++++++ crates/core/models/src/v0/mod.rs | 2 + crates/core/models/src/v0/servers.rs | 124 +++++++++++++++++++++ crates/core/models/src/v0/users.rs | 53 ++++++--- 4 files changed, 224 insertions(+), 16 deletions(-) create mode 100644 crates/core/models/src/v0/servers.rs diff --git a/crates/core/database/src/util/bridge/v0.rs b/crates/core/database/src/util/bridge/v0.rs index 836156ed..15ae06bd 100644 --- a/crates/core/database/src/util/bridge/v0.rs +++ b/crates/core/database/src/util/bridge/v0.rs @@ -226,6 +226,67 @@ impl From for Metadata { } } +impl From for Server { + fn from(value: crate::Server) -> Self { + Server { + id: value.id, + owner: value.owner, + name: value.name, + description: value.description, + channels: value.channels, + categories: value + .categories + .map(|categories| categories.into_iter().map(|v| v.into()).collect()), + system_messages: value.system_messages.map(|v| v.into()), + roles: value + .roles + .into_iter() + .map(|(k, v)| (k, v.into())) + .collect(), + default_permissions: value.default_permissions, + icon: value.icon.map(|f| f.into()), + banner: value.banner.map(|f| f.into()), + flags: value.flags.unwrap_or_default() as u32, + nsfw: value.nsfw, + analytics: value.analytics, + discoverable: value.discoverable, + } + } +} + +impl From for Category { + fn from(value: crate::Category) -> Self { + Category { + id: value.id, + title: value.title, + channels: value.channels, + } + } +} + +impl From for SystemMessageChannels { + fn from(value: crate::SystemMessageChannels) -> Self { + SystemMessageChannels { + user_joined: value.user_joined, + user_left: value.user_left, + user_kicked: value.user_kicked, + user_banned: value.user_banned, + } + } +} + +impl From for Role { + fn from(value: crate::Role) -> Self { + Role { + name: value.name, + permissions: value.permissions, + colour: value.colour, + hoist: value.hoist, + rank: value.rank, + } + } +} + impl crate::User { pub async fn into

(self, perspective: P) -> User where diff --git a/crates/core/models/src/v0/mod.rs b/crates/core/models/src/v0/mod.rs index 5caf20c1..675bf0c0 100644 --- a/crates/core/models/src/v0/mod.rs +++ b/crates/core/models/src/v0/mod.rs @@ -2,10 +2,12 @@ mod bots; mod channel_webhooks; mod channels; mod files; +mod servers; mod users; pub use bots::*; pub use channel_webhooks::*; pub use channels::*; pub use files::*; +pub use servers::*; pub use users::*; diff --git a/crates/core/models/src/v0/servers.rs b/crates/core/models/src/v0/servers.rs new file mode 100644 index 00000000..11a63cf1 --- /dev/null +++ b/crates/core/models/src/v0/servers.rs @@ -0,0 +1,124 @@ +use super::File; + +use revolt_permissions::OverrideField; +use std::collections::HashMap; + +auto_derived!( + /// Server + pub struct Server { + /// Unique Id + #[cfg_attr(feature = "serde", serde(rename = "_id"))] + pub id: String, + /// User id of the owner + pub owner: String, + + /// Name of the server + pub name: String, + /// Description for the server + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub description: Option, + + /// Channels within this server + // ! FIXME: this may be redundant + pub channels: Vec, + /// Categories for this server + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub categories: Option>, + /// Configuration for sending system event messages + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub system_messages: Option, + + /// Roles for this server + #[cfg_attr( + feature = "serde", + serde( + default = "HashMap::::new", + skip_serializing_if = "HashMap::::is_empty" + ) + )] + pub roles: HashMap, + /// Default set of server and channel permissions + pub default_permissions: i64, + + /// Icon attachment + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub icon: Option, + /// Banner attachment + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub banner: Option, + + /// Bitfield of server flags + #[cfg_attr( + feature = "serde", + serde(skip_serializing_if = "crate::if_zero_u32", default) + )] + pub flags: u32, + + /// Whether this server is flagged as not safe for work + #[cfg_attr( + feature = "serde", + serde(skip_serializing_if = "crate::if_false", default) + )] + pub nsfw: bool, + /// Whether to enable analytics + #[cfg_attr( + feature = "serde", + serde(skip_serializing_if = "crate::if_false", default) + )] + pub analytics: bool, + /// Whether this server should be publicly discoverable + #[cfg_attr( + feature = "serde", + serde(skip_serializing_if = "crate::if_false", default) + )] + pub discoverable: bool, + } + + /// Channel category + pub struct Category { + /// Unique ID for this category + pub id: String, + /// Title for this category + pub title: String, + /// Channels in this category + pub channels: Vec, + } + + /// Role + pub struct Role { + /// Role name + pub name: String, + /// Permissions available to this role + pub permissions: OverrideField, + /// Colour used for this role + /// + /// This can be any valid CSS colour + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub colour: Option, + /// Whether this role should be shown separately on the member sidebar + #[cfg_attr( + feature = "serde", + serde(skip_serializing_if = "crate::if_false", default) + )] + pub hoist: bool, + /// Ranking of this role + #[cfg_attr(feature = "serde", serde(default))] + pub rank: i64, + } + + /// System message channel assignments + pub struct SystemMessageChannels { + /// ID of channel to send user join messages in + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub user_joined: Option, + /// ID of channel to send user left messages in + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub user_left: Option, + /// ID of channel to send user kicked messages in + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub user_kicked: Option, + /// ID of channel to send user banned messages in + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub user_banned: Option, + } +); diff --git a/crates/core/models/src/v0/users.rs b/crates/core/models/src/v0/users.rs index 9652cd73..82fd9a91 100644 --- a/crates/core/models/src/v0/users.rs +++ b/crates/core/models/src/v0/users.rs @@ -4,40 +4,52 @@ auto_derived!( /// User pub struct User { /// Unique Id - #[serde(rename = "_id")] + #[cfg_attr(feature = "serde", serde(rename = "_id"))] pub id: String, /// Username pub username: String, /// Discriminator pub discriminator: String, /// Display name - #[serde(skip_serializing_if = "Option::is_none")] + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub display_name: Option, - #[serde(skip_serializing_if = "Option::is_none")] + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] /// Avatar attachment pub avatar: Option, /// Relationships with other users - #[serde(skip_serializing_if = "Vec::is_empty", default)] + #[cfg_attr( + feature = "serde", + serde(skip_serializing_if = "Vec::is_empty", default) + )] pub relations: Vec, /// Bitfield of user badges - #[serde(skip_serializing_if = "crate::if_zero_u32", default)] + #[cfg_attr( + feature = "serde", + serde(skip_serializing_if = "crate::if_zero_u32", default) + )] pub badges: u32, /// User's current status - #[serde(skip_serializing_if = "Option::is_none")] + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub status: Option, /// User's profile page - #[serde(skip_serializing_if = "Option::is_none")] + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub profile: Option, /// Enum of user flags - #[serde(skip_serializing_if = "crate::if_zero_u32", default)] + #[cfg_attr( + feature = "serde", + serde(skip_serializing_if = "crate::if_zero_u32", default) + )] pub flags: u32, /// Whether this user is privileged - #[serde(skip_serializing_if = "crate::if_false", default)] + #[cfg_attr( + feature = "serde", + serde(skip_serializing_if = "crate::if_false", default) + )] pub privileged: bool, /// Bot information - #[serde(skip_serializing_if = "Option::is_none")] + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub bot: Option, /// Current session user's relationship with this user @@ -49,20 +61,29 @@ auto_derived!( /// User's relationship with another user (or themselves) #[derive(Default)] pub enum RelationshipStatus { + /// No relationship with other user #[default] None, + /// Other user is us User, + /// Friends with the other user Friend, + /// Pending friend request to user Outgoing, + /// Incoming friend request from user Incoming, + /// Blocked this user Blocked, + /// Blocked by this user BlockedOther, } /// Relationship entry indicating current status with other user pub struct Relationship { - #[serde(rename = "_id")] + /// Other user's Id + #[cfg_attr(feature = "serde", serde(rename = "_id"))] pub user_id: String, + /// Relationship status with them pub status: RelationshipStatus, } @@ -83,20 +104,20 @@ auto_derived!( /// User's active status pub struct UserStatus { /// Custom status text - #[serde(skip_serializing_if = "String::is_empty")] + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "String::is_empty"))] pub text: String, /// Current presence option - #[serde(skip_serializing_if = "Option::is_none")] + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub presence: Option, } /// User's profile pub struct UserProfile { /// Text content on user's profile - #[serde(skip_serializing_if = "String::is_empty")] + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "String::is_empty"))] pub content: String, /// Background visible on user's profile - #[serde(skip_serializing_if = "Option::is_none")] + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub background: Option, } @@ -143,7 +164,7 @@ auto_derived!( /// Bot information for if the user is a bot pub struct BotInformation { /// Id of the owner of this bot - #[serde(rename = "owner")] + #[cfg_attr(feature = "serde", serde(rename = "owner"))] pub owner_id: String, } );