diff --git a/set_version.sh b/set_version.sh index 7e7ea8e7251c95d494e9f9245f46a7970d72f87f..44ddcfd6dc885be754d31e0c167709eb219b6116 100755 --- a/set_version.sh +++ b/set_version.sh @@ -1,3 +1,3 @@ #!/bin/bash -export version=0.4.1-alpha.12 +export version=0.4.1-alpha.13 echo "pub const VERSION: &str = \"${version}\";" > src/version.rs diff --git a/src/database/entities/user.rs b/src/database/entities/user.rs index 48befa4db17d28bf9e42e1b06f0d262e2a7c5b35..6648ad1aec5b997bd169fe935926a3c2129a57d2 100644 --- a/src/database/entities/user.rs +++ b/src/database/entities/user.rs @@ -6,11 +6,15 @@ use mongodb::{ }; use serde::{Deserialize, Serialize}; use validator::Validate; +use num_enum::TryFromPrimitive; +use ulid::Ulid; +use std::ops; use crate::database::permissions::user::UserPermissions; use crate::database::*; use crate::notifications::websocket::is_online; use crate::util::result::{Error, Result}; +use crate::util::variables::EARLY_ADOPTER_BADGE; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub enum RelationshipStatus { @@ -30,13 +34,6 @@ pub struct Relationship { pub status: RelationshipStatus, } -/* -pub enum Badge { - Developer = 1, - Translator = 2, -} -*/ - #[derive(Serialize, Deserialize, Debug)] pub enum Presence { Online, @@ -62,6 +59,17 @@ pub struct UserProfile { pub background: Option<File>, } +#[derive(Debug, PartialEq, Eq, TryFromPrimitive, Copy, Clone)] +#[repr(i32)] +pub enum Badges { + Developer = 1, + Translator = 2, + Supporter = 4, + EarlyAdopter = 256 +} + +impl_op_ex_commutative!(+ |a: &i32, b: &Badges| -> i32 { *a | *b as i32 }); + // When changing this struct, update notifications/payload.rs#80 #[derive(Serialize, Deserialize, Debug)] pub struct User { @@ -110,6 +118,15 @@ impl User { /// Mutate the user object to appear as seen by user. pub fn with(mut self, permissions: UserPermissions<[u32; 1]>) -> User { + let mut badges = self.badges.unwrap_or_else(|| 0); + if let Ok(id) = Ulid::from_string(&self.id) { + if id.datetime().timestamp_millis() < *EARLY_ADOPTER_BADGE { + badges = badges + Badges::EarlyAdopter; + } + } + + self.badges = Some(badges); + if permissions.get_view_profile() { self.online = Some(is_online(&self.id)); } else { diff --git a/src/database/permissions/channel.rs b/src/database/permissions/channel.rs index d58886b8a5535805cf34818307e59584382aff9d..2009bb4e4a58eca1f85aa8eb4946115463d9921b 100644 --- a/src/database/permissions/channel.rs +++ b/src/database/permissions/channel.rs @@ -16,6 +16,9 @@ pub enum ChannelPermission { VoiceCall = 16, } +impl_op_ex!(+ |a: &ChannelPermission, b: &ChannelPermission| -> u32 { *a as u32 | *b as u32 }); +impl_op_ex_commutative!(+ |a: &u32, b: &ChannelPermission| -> u32 { *a | *b as u32 }); + bitfield! { pub struct ChannelPermissions(MSB0 [u32]); u32; @@ -26,9 +29,6 @@ bitfield! { pub get_voice_call, _: 27; } -impl_op_ex!(+ |a: &ChannelPermission, b: &ChannelPermission| -> u32 { *a as u32 | *b as u32 }); -impl_op_ex_commutative!(+ |a: &u32, b: &ChannelPermission| -> u32 { *a | *b as u32 }); - impl<'a> PermissionCalculator<'a> { pub async fn calculate_channel(self) -> Result<u32> { let channel = if let Some(channel) = self.channel { diff --git a/src/util/variables.rs b/src/util/variables.rs index 788bb94ffc5979505379ea4cd67da1ed6f316e39..9d4a136cbda329dc8a58b9e361e50b26827e2b61 100644 --- a/src/util/variables.rs +++ b/src/util/variables.rs @@ -64,6 +64,8 @@ lazy_static! { // Application Logic Settings pub static ref MAX_GROUP_SIZE: usize = env::var("REVOLT_MAX_GROUP_SIZE").unwrap_or_else(|_| "50".to_string()).parse().unwrap(); + pub static ref EARLY_ADOPTER_BADGE: i64 = + env::var("REVOLT_EARLY_ADOPTER_BADGE").unwrap_or_else(|_| "0".to_string()).parse().unwrap(); } pub fn preflight_checks() { diff --git a/src/version.rs b/src/version.rs index be9c2743b5bf5ea33b27253f4cf9aad586fbc5d3..3ea17218961c31e178a72f525de561152f8961ae 100644 --- a/src/version.rs +++ b/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "0.4.1-alpha.12"; +pub const VERSION: &str = "0.4.1-alpha.13";