Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 66 additions & 66 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions crates/core/database/src/models/users/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,11 @@ auto_derived_partial!(
/// Display name
#[serde(skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
/// Preferred pronouns
#[serde(skip_serializing_if = "Option::is_none")]
pub pronouns: Option<Vec<String>>,
/// Avatar attachment
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar: Option<File>,
/// Relationships with other users
#[serde(skip_serializing_if = "Option::is_none")]
Expand Down Expand Up @@ -72,6 +75,7 @@ auto_derived!(
ProfileContent,
ProfileBackground,
DisplayName,
Pronouns,

// internal fields
Suspension,
Expand Down Expand Up @@ -171,6 +175,7 @@ impl Default for User {
username: Default::default(),
discriminator: Default::default(),
display_name: Default::default(),
pronouns: Default::default(),
avatar: Default::default(),
relations: Default::default(),
badges: Default::default(),
Expand Down Expand Up @@ -690,6 +695,7 @@ impl User {
}
}
FieldsUser::DisplayName => self.display_name = None,
FieldsUser::Pronouns => self.pronouns = None,
FieldsUser::Suspension => self.suspended_until = None,
FieldsUser::None => {}
}
Expand Down
1 change: 1 addition & 0 deletions crates/core/database/src/models/users/ops/mongodb.rs
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,7 @@ impl IntoDocumentPath for FieldsUser {
FieldsUser::StatusPresence => "status.presence",
FieldsUser::StatusText => "status.text",
FieldsUser::DisplayName => "display_name",
FieldsUser::Pronouns => "pronouns",
FieldsUser::Suspension => "suspended_until",
FieldsUser::None => "none",
})
Expand Down
34 changes: 28 additions & 6 deletions crates/core/database/src/util/bridge/v0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ impl From<crate::PartialChannel> for PartialChannel {
role_permissions: value.role_permissions,
default_permissions: value.default_permissions,
last_message_id: value.last_message_id,
voice: value.voice.map(|voice| voice.into())
voice: value.voice.map(|voice| voice.into()),
}
}
}
Expand All @@ -301,7 +301,7 @@ impl From<PartialChannel> for crate::PartialChannel {
role_permissions: value.role_permissions,
default_permissions: value.default_permissions,
last_message_id: value.last_message_id,
voice: value.voice.map(|voice| voice.into())
voice: value.voice.map(|voice| voice.into()),
}
}
}
Expand Down Expand Up @@ -515,7 +515,9 @@ impl From<crate::SystemMessage> for SystemMessage {
crate::SystemMessage::UserRemove { id, by } => Self::UserRemove { id, by },
crate::SystemMessage::MessagePinned { id, by } => Self::MessagePinned { id, by },
crate::SystemMessage::MessageUnpinned { id, by } => Self::MessageUnpinned { id, by },
crate::SystemMessage::CallStarted { by, finished_at } => Self::CallStarted { by, finished_at }
crate::SystemMessage::CallStarted { by, finished_at } => {
Self::CallStarted { by, finished_at }
}
}
}
}
Expand Down Expand Up @@ -1004,6 +1006,9 @@ impl crate::User {
username: self.username,
discriminator: self.discriminator,
display_name: self.display_name,
pronouns: self
.pronouns
.map(|pronouns| pronouns.iter().map(|pronoun| pronoun.to_owned()).collect()),
avatar: self.avatar.map(|file| file.into()),
relations: if let Some(crate::User { id, .. }) = perspective {
if id == &self.id {
Expand Down Expand Up @@ -1080,6 +1085,9 @@ impl crate::User {
username: self.username,
discriminator: self.discriminator,
display_name: self.display_name,
pronouns: self
.pronouns
.map(|pronouns| pronouns.iter().map(|pronoun| pronoun.to_owned()).collect()),
avatar: self.avatar.map(|file| file.into()),
relations: vec![],
badges,
Expand Down Expand Up @@ -1113,6 +1121,9 @@ impl crate::User {
username: self.username,
discriminator: self.discriminator,
display_name: self.display_name,
pronouns: self
.pronouns
.map(|pronouns| pronouns.iter().map(|pronoun| pronoun.to_owned()).collect()),
avatar: self.avatar.map(|file| file.into()),
relations: vec![],
badges,
Expand Down Expand Up @@ -1140,6 +1151,9 @@ impl crate::User {
username: self.username,
discriminator: self.discriminator,
display_name: self.display_name,
pronouns: self
.pronouns
.map(|pronouns| pronouns.iter().map(|pronoun| pronoun.to_owned()).collect()),
avatar: self.avatar.map(|file| file.into()),
relations: self
.relations
Expand Down Expand Up @@ -1183,6 +1197,9 @@ impl From<User> for crate::User {
username: value.username,
discriminator: value.discriminator,
display_name: value.display_name,
pronouns: value
.pronouns
.map(|pronouns| pronouns.iter().map(|pronoun| pronoun.to_owned()).collect()),
avatar: value.avatar.map(Into::into),
relations: None,
badges: Some(value.badges as i32),
Expand All @@ -1203,6 +1220,9 @@ impl From<crate::PartialUser> for PartialUser {
username: value.username,
discriminator: value.discriminator,
display_name: value.display_name,
pronouns: value
.pronouns
.map(|pronouns| pronouns.iter().map(|pronoun| pronoun.to_owned()).collect()),
avatar: value.avatar.map(|file| file.into()),
relations: value.relations.map(|relationships| {
relationships
Expand Down Expand Up @@ -1231,6 +1251,7 @@ impl From<FieldsUser> for crate::FieldsUser {
FieldsUser::StatusPresence => crate::FieldsUser::StatusPresence,
FieldsUser::StatusText => crate::FieldsUser::StatusText,
FieldsUser::DisplayName => crate::FieldsUser::DisplayName,
FieldsUser::Pronouns => crate::FieldsUser::Pronouns,

FieldsUser::Internal => crate::FieldsUser::None,
}
Expand All @@ -1246,6 +1267,7 @@ impl From<crate::FieldsUser> for FieldsUser {
crate::FieldsUser::StatusPresence => FieldsUser::StatusPresence,
crate::FieldsUser::StatusText => FieldsUser::StatusText,
crate::FieldsUser::DisplayName => FieldsUser::DisplayName,
crate::FieldsUser::Pronouns => FieldsUser::Pronouns,

crate::FieldsUser::Suspension => FieldsUser::Internal,
crate::FieldsUser::None => FieldsUser::Internal,
Expand Down Expand Up @@ -1382,15 +1404,15 @@ impl From<FieldsMessage> for crate::FieldsMessage {
impl From<VoiceInformation> for crate::VoiceInformation {
fn from(value: VoiceInformation) -> Self {
crate::VoiceInformation {
max_users: value.max_users
max_users: value.max_users,
}
}
}

impl From<crate::VoiceInformation> for VoiceInformation {
fn from(value: crate::VoiceInformation) -> Self {
VoiceInformation {
max_users: value.max_users
max_users: value.max_users,
}
}
}
}
33 changes: 32 additions & 1 deletion crates/core/models/src/v0/users.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,28 @@ use regex::Regex;
use super::File;

#[cfg(feature = "validator")]
use validator::Validate;
use validator::{Validate, ValidationError};

/// Validate user pronouns
///
/// Ensure there are no more than 4 sets of pronouns, and each one is under 15 characters
fn validate_pronouns(pronouns: &Vec<String>) -> Result<(), ValidationError> {
if pronouns.is_empty() || pronouns.len() > 4 {
return Err(ValidationError::new(
"Cannot have more than 4 or less than 1 set of pronouns.",
));
}

for pronoun in pronouns {
if pronoun.len() > 15 {
return Err(ValidationError::new(
"Pronouns cannot be more than 15 characters long.",
));
}
}

Ok(())
}

/// Regex for valid usernames
///
Expand All @@ -32,6 +53,9 @@ auto_derived_partial!(
/// Display name
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub display_name: Option<String>,
/// Preferred pronouns
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub pronouns: Option<Vec<String>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
/// Avatar attachment
pub avatar: Option<File>,
Expand Down Expand Up @@ -89,6 +113,7 @@ auto_derived!(
ProfileContent,
ProfileBackground,
DisplayName,
Pronouns,

/// Internal field, ignore this.
Internal,
Expand Down Expand Up @@ -225,6 +250,12 @@ auto_derived!(
validate(length(min = 2, max = 32), regex = "RE_DISPLAY_NAME")
)]
pub display_name: Option<String>,
#[cfg_attr(
feature = "validator",
validate(custom(function = "validate_pronouns"))
)]
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub pronouns: Option<Vec<String>>,
/// Attachment Id for avatar
#[cfg_attr(feature = "validator", validate(length(min = 1, max = 128)))]
pub avatar: Option<String>,
Expand Down
Loading
Loading