From 3a87f2693fe8393254d2b8dda51d4c82df44983e Mon Sep 17 00:00:00 2001 From: ToastXC <100072983+toastxc@users.noreply.github.com> Date: Fri, 16 Jun 2023 14:13:02 +0800 Subject: [PATCH 1/5] basic implementation of pronoun system --- .../core/database/src/models/users/model.rs | 20 +++++++++++++++++ .../database/src/models/users/ops/mongodb.rs | 1 + crates/core/database/src/util/bridge/v0.rs | 22 +++++++++++++++++++ crates/core/models/src/v0/users.rs | 17 ++++++++++++++ crates/quark/src/models/users/user.rs | 19 ++++++++++++++++ 5 files changed, 79 insertions(+) diff --git a/crates/core/database/src/models/users/model.rs b/crates/core/database/src/models/users/model.rs index 1e49e022b..94551673d 100644 --- a/crates/core/database/src/models/users/model.rs +++ b/crates/core/database/src/models/users/model.rs @@ -44,6 +44,11 @@ auto_derived_partial!( /// Bot information #[serde(skip_serializing_if = "Option::is_none")] pub bot: Option, + + // User's displayed pronouns + #[cfg_attr(feature = "validator", validate(length(min = 1, max = 5)))] + #[serde(skip_serializing_if = "Option::is_none")] + pub pronouns: Option>, }, "PartialUser" ); @@ -114,6 +119,20 @@ auto_derived!( StatusPresence, ProfileContent, ProfileBackground, + Pronouns, + } + + // Pronoun options for Users + pub enum Pronoun { + She, + Her, + They, + Them, + He, + Him, + It, + Its, + Neo(String), } ); @@ -180,6 +199,7 @@ impl User { x.background = None; } } + FieldsUser::Pronouns => self.pronouns = None, } } diff --git a/crates/core/database/src/models/users/ops/mongodb.rs b/crates/core/database/src/models/users/ops/mongodb.rs index 6bea50779..5657be172 100644 --- a/crates/core/database/src/models/users/ops/mongodb.rs +++ b/crates/core/database/src/models/users/ops/mongodb.rs @@ -295,6 +295,7 @@ impl IntoDocumentPath for FieldsUser { FieldsUser::ProfileContent => "profile.content", FieldsUser::StatusPresence => "status.presence", FieldsUser::StatusText => "status.text", + FieldsUser::Pronouns => "pronouns", }) } } diff --git a/crates/core/database/src/util/bridge/v0.rs b/crates/core/database/src/util/bridge/v0.rs index 45fad9035..f453f7786 100644 --- a/crates/core/database/src/util/bridge/v0.rs +++ b/crates/core/database/src/util/bridge/v0.rs @@ -270,6 +270,12 @@ impl crate::User { relationship, online: can_see_profile && revolt_presence::is_online(&self.id).await, id: self.id, + pronouns: self.pronouns.map(|pronouns| { + pronouns + .iter() + .map(|pronoun| pronoun.to_owned().into()) + .collect() + }), } } } @@ -318,6 +324,22 @@ impl From for UserStatus { } } +impl From for Pronoun { + fn from(value: crate::Pronoun) -> Self { + match value { + crate::Pronoun::She => Pronoun::She, + crate::Pronoun::Her => Pronoun::Her, + crate::Pronoun::They => Pronoun::They, + crate::Pronoun::Them => Pronoun::Them, + crate::Pronoun::He => Pronoun::He, + crate::Pronoun::Him => Pronoun::Him, + crate::Pronoun::It => Pronoun::It, + crate::Pronoun::Its => Pronoun::Its, + crate::Pronoun::Neo(string) => Pronoun::Neo(string), + } + } +} + impl From for UserProfile { fn from(value: crate::UserProfile) -> Self { UserProfile { diff --git a/crates/core/models/src/v0/users.rs b/crates/core/models/src/v0/users.rs index 9652cd737..4eea3bddb 100644 --- a/crates/core/models/src/v0/users.rs +++ b/crates/core/models/src/v0/users.rs @@ -40,12 +40,29 @@ auto_derived!( #[serde(skip_serializing_if = "Option::is_none")] pub bot: Option, + // User's displayed pronouns + #[cfg_attr(feature = "validator", validate(length(min = 1, max = 5)))] + #[serde(skip_serializing_if = "Option::is_none")] + pub pronouns: Option>, /// Current session user's relationship with this user pub relationship: RelationshipStatus, /// Whether this user is currently online pub online: bool, } + // Pronoun options for Users + pub enum Pronoun { + She, + Her, + They, + Them, + He, + Him, + It, + Its, + Neo(String), + } + /// User's relationship with another user (or themselves) #[derive(Default)] pub enum RelationshipStatus { diff --git a/crates/quark/src/models/users/user.rs b/crates/quark/src/models/users/user.rs index 6c5e2c801..b20d23878 100644 --- a/crates/quark/src/models/users/user.rs +++ b/crates/quark/src/models/users/user.rs @@ -167,6 +167,25 @@ pub struct User { /// Whether this user is currently online #[serde(skip_serializing_if = "Option::is_none")] pub online: Option, + + // User's displayed pronouns + #[cfg_attr(feature = "validator", validate(length(min = 1, max = 5)))] + #[serde(skip_serializing_if = "Option::is_none")] + pub pronouns: Option>, +} + +// Pronoun options for Users +#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] +pub enum Pronoun { + She, + Her, + They, + Them, + He, + Him, + It, + Its, + Neo(String), } /// Optional fields on user object From 926fd68883413c0028afc67dd142599b75eeb827 Mon Sep 17 00:00:00 2001 From: ToastXC <100072983+toastxc@users.noreply.github.com> Date: Fri, 16 Jun 2023 14:43:19 +0800 Subject: [PATCH 2/5] implemented pronouns for edit user API call --- crates/delta/src/routes/users/edit_user.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/delta/src/routes/users/edit_user.rs b/crates/delta/src/routes/users/edit_user.rs index c1c2ba905..69a9f90ca 100644 --- a/crates/delta/src/routes/users/edit_user.rs +++ b/crates/delta/src/routes/users/edit_user.rs @@ -1,4 +1,4 @@ -use revolt_quark::models::user::{FieldsUser, PartialUser, User}; +use revolt_quark::models::user::{FieldsUser, PartialUser, Pronoun, User}; use revolt_quark::models::File; use revolt_quark::{Database, Error, Ref, Result}; @@ -52,6 +52,11 @@ pub struct DataEditUser { /// Fields to remove from user object #[validate(length(min = 1))] remove: Option>, + + // User's displayed pronouns + #[cfg_attr(feature = "validator", validate(length(min = 1, max = 5)))] + #[serde(skip_serializing_if = "Option::is_none")] + pub pronouns: Option>, } /// # Edit User @@ -96,6 +101,7 @@ pub async fn req( && data.badges.is_none() && data.flags.is_none() && data.remove.is_none() + && data.pronouns.is_none() { return Ok(Json(user)); } @@ -125,6 +131,7 @@ pub async fn req( display_name: data.display_name, badges: data.badges, flags: data.flags, + pronouns: data.pronouns, ..Default::default() }; From 21dba196e84a31711d1c0a8aded6ceba96f235b6 Mon Sep 17 00:00:00 2001 From: ToastXC <100072983+toastxc@users.noreply.github.com> Date: Fri, 16 Jun 2023 19:49:14 +0800 Subject: [PATCH 3/5] changed pronon data from enum to string --- crates/core/database/src/models/users/model.rs | 17 ++--------------- crates/core/database/src/util/bridge/v0.rs | 16 ---------------- crates/core/models/src/v0/users.rs | 16 +--------------- 3 files changed, 3 insertions(+), 46 deletions(-) diff --git a/crates/core/database/src/models/users/model.rs b/crates/core/database/src/models/users/model.rs index 94551673d..5505812a9 100644 --- a/crates/core/database/src/models/users/model.rs +++ b/crates/core/database/src/models/users/model.rs @@ -46,9 +46,8 @@ auto_derived_partial!( pub bot: Option, // User's displayed pronouns - #[cfg_attr(feature = "validator", validate(length(min = 1, max = 5)))] #[serde(skip_serializing_if = "Option::is_none")] - pub pronouns: Option>, + pub pronouns: Option>, }, "PartialUser" ); @@ -121,19 +120,6 @@ auto_derived!( ProfileBackground, Pronouns, } - - // Pronoun options for Users - pub enum Pronoun { - She, - Her, - They, - Them, - He, - Him, - It, - Its, - Neo(String), - } ); impl User { @@ -218,6 +204,7 @@ impl User { FieldsUser::StatusPresence, FieldsUser::ProfileContent, FieldsUser::ProfileBackground, + FieldsUser::Pronouns, ], ) .await diff --git a/crates/core/database/src/util/bridge/v0.rs b/crates/core/database/src/util/bridge/v0.rs index f453f7786..0c1062c61 100644 --- a/crates/core/database/src/util/bridge/v0.rs +++ b/crates/core/database/src/util/bridge/v0.rs @@ -324,22 +324,6 @@ impl From for UserStatus { } } -impl From for Pronoun { - fn from(value: crate::Pronoun) -> Self { - match value { - crate::Pronoun::She => Pronoun::She, - crate::Pronoun::Her => Pronoun::Her, - crate::Pronoun::They => Pronoun::They, - crate::Pronoun::Them => Pronoun::Them, - crate::Pronoun::He => Pronoun::He, - crate::Pronoun::Him => Pronoun::Him, - crate::Pronoun::It => Pronoun::It, - crate::Pronoun::Its => Pronoun::Its, - crate::Pronoun::Neo(string) => Pronoun::Neo(string), - } - } -} - impl From for UserProfile { fn from(value: crate::UserProfile) -> Self { UserProfile { diff --git a/crates/core/models/src/v0/users.rs b/crates/core/models/src/v0/users.rs index 4eea3bddb..2e69b3e6e 100644 --- a/crates/core/models/src/v0/users.rs +++ b/crates/core/models/src/v0/users.rs @@ -41,28 +41,14 @@ auto_derived!( pub bot: Option, // User's displayed pronouns - #[cfg_attr(feature = "validator", validate(length(min = 1, max = 5)))] #[serde(skip_serializing_if = "Option::is_none")] - pub pronouns: Option>, + pub pronouns: Option>, /// Current session user's relationship with this user pub relationship: RelationshipStatus, /// Whether this user is currently online pub online: bool, } - // Pronoun options for Users - pub enum Pronoun { - She, - Her, - They, - Them, - He, - Him, - It, - Its, - Neo(String), - } - /// User's relationship with another user (or themselves) #[derive(Default)] pub enum RelationshipStatus { From b8f34501f8406c9c458a263762260ed8a96ecc92 Mon Sep 17 00:00:00 2001 From: ToastXC <100072983+toastxc@users.noreply.github.com> Date: Fri, 16 Jun 2023 19:49:42 +0800 Subject: [PATCH 4/5] impl pronouns in FieldUser --- crates/quark/src/impl/generic/users/user.rs | 1 + crates/quark/src/impl/mongo/users/user.rs | 1 + crates/quark/src/models/users/user.rs | 1 + 3 files changed, 3 insertions(+) diff --git a/crates/quark/src/impl/generic/users/user.rs b/crates/quark/src/impl/generic/users/user.rs index 38609b0f7..bba94bd3c 100644 --- a/crates/quark/src/impl/generic/users/user.rs +++ b/crates/quark/src/impl/generic/users/user.rs @@ -71,6 +71,7 @@ impl User { } } FieldsUser::DisplayName => self.display_name = None, + FieldsUser::Pronouns => self.pronouns = None, } } diff --git a/crates/quark/src/impl/mongo/users/user.rs b/crates/quark/src/impl/mongo/users/user.rs index bd1bb3291..4fb1ce00d 100644 --- a/crates/quark/src/impl/mongo/users/user.rs +++ b/crates/quark/src/impl/mongo/users/user.rs @@ -338,6 +338,7 @@ impl IntoDocumentPath for FieldsUser { FieldsUser::StatusPresence => "status.presence", FieldsUser::StatusText => "status.text", FieldsUser::DisplayName => "display_name", + FieldsUser::Pronouns => "pronouns", }) } } diff --git a/crates/quark/src/models/users/user.rs b/crates/quark/src/models/users/user.rs index b20d23878..652143406 100644 --- a/crates/quark/src/models/users/user.rs +++ b/crates/quark/src/models/users/user.rs @@ -197,6 +197,7 @@ pub enum FieldsUser { ProfileContent, ProfileBackground, DisplayName, + Pronouns, } /// Enumeration providing a hint to the type of user we are handling From 2b1a136dc7fdaccda38d41701c7cd6d67a05c3ac Mon Sep 17 00:00:00 2001 From: ToastXC <100072983+toastxc@users.noreply.github.com> Date: Fri, 16 Jun 2023 19:58:25 +0800 Subject: [PATCH 5/5] fixed quark and delta Pronoun type --- crates/core/database/src/util/bridge/v0.rs | 9 +++------ crates/delta/src/routes/users/edit_user.rs | 4 ++-- crates/quark/src/models/users/user.rs | 16 +--------------- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/crates/core/database/src/util/bridge/v0.rs b/crates/core/database/src/util/bridge/v0.rs index 0c1062c61..71ee36e2b 100644 --- a/crates/core/database/src/util/bridge/v0.rs +++ b/crates/core/database/src/util/bridge/v0.rs @@ -270,12 +270,9 @@ impl crate::User { relationship, online: can_see_profile && revolt_presence::is_online(&self.id).await, id: self.id, - pronouns: self.pronouns.map(|pronouns| { - pronouns - .iter() - .map(|pronoun| pronoun.to_owned().into()) - .collect() - }), + pronouns: self + .pronouns + .map(|pronouns| pronouns.iter().map(|pronoun| pronoun.to_owned()).collect()), } } } diff --git a/crates/delta/src/routes/users/edit_user.rs b/crates/delta/src/routes/users/edit_user.rs index 69a9f90ca..d2979a103 100644 --- a/crates/delta/src/routes/users/edit_user.rs +++ b/crates/delta/src/routes/users/edit_user.rs @@ -1,4 +1,4 @@ -use revolt_quark::models::user::{FieldsUser, PartialUser, Pronoun, User}; +use revolt_quark::models::user::{FieldsUser, PartialUser, User}; use revolt_quark::models::File; use revolt_quark::{Database, Error, Ref, Result}; @@ -56,7 +56,7 @@ pub struct DataEditUser { // User's displayed pronouns #[cfg_attr(feature = "validator", validate(length(min = 1, max = 5)))] #[serde(skip_serializing_if = "Option::is_none")] - pub pronouns: Option>, + pub pronouns: Option>, } /// # Edit User diff --git a/crates/quark/src/models/users/user.rs b/crates/quark/src/models/users/user.rs index 652143406..07dad1c84 100644 --- a/crates/quark/src/models/users/user.rs +++ b/crates/quark/src/models/users/user.rs @@ -171,21 +171,7 @@ pub struct User { // User's displayed pronouns #[cfg_attr(feature = "validator", validate(length(min = 1, max = 5)))] #[serde(skip_serializing_if = "Option::is_none")] - pub pronouns: Option>, -} - -// Pronoun options for Users -#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] -pub enum Pronoun { - She, - Her, - They, - Them, - He, - Him, - It, - Its, - Neo(String), + pub pronouns: Option>, } /// Optional fields on user object