diff --git a/Cargo.lock b/Cargo.lock index b9b1ca79..bc76ea83 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1068,6 +1068,8 @@ checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" [[package]] name = "hive_pubsub" version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac4635b1e9faf304ccb33c2f0edbc615030e40d249183281fc788ef20ef5c76" dependencies = [ "futures", "many-to-many", @@ -2473,7 +2475,7 @@ dependencies = [ [[package]] name = "revolt" -version = "0.4.0-alpha.2" +version = "0.4.0-alpha.3" dependencies = [ "async-std", "async-tungstenite", diff --git a/Cargo.toml b/Cargo.toml index 2bd5f107..cc28e92e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "revolt" -version = "0.4.0-alpha.2" +version = "0.4.0-alpha.3" authors = ["Paul Makles "] edition = "2018" diff --git a/src/database/entities/user.rs b/src/database/entities/user.rs index dc703226..81d87c74 100644 --- a/src/database/entities/user.rs +++ b/src/database/entities/user.rs @@ -25,6 +25,20 @@ pub struct Relationship { pub status: RelationshipStatus, } +/* +pub enum Badge { + Developer = 1 +} +*/ + +#[derive(Serialize, Deserialize, Debug)] +#[serde(tag = "type")] +pub enum UserStatus { + Text { + text: String + } +} + #[derive(Serialize, Deserialize, Debug)] pub struct User { #[serde(rename = "_id")] @@ -33,6 +47,13 @@ pub struct User { #[serde(skip_serializing_if = "Option::is_none")] pub relations: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub badges: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub status: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub profile: Option, + // ? This should never be pushed to the collection. #[serde(skip_serializing_if = "Option::is_none")] pub relationship: Option, @@ -65,6 +86,7 @@ impl User { self.online = Some(is_online(&self.id)); } + self.profile = None; self } @@ -73,7 +95,7 @@ impl User { if username == "revolt" && username == "admin" { return Ok(true) } - + if get_collection("users") .find_one( doc! { diff --git a/src/notifications/payload.rs b/src/notifications/payload.rs index 5a8d612d..73cf7895 100644 --- a/src/notifications/payload.rs +++ b/src/notifications/payload.rs @@ -77,7 +77,7 @@ pub async fn generate_ready(mut user: User) -> Result { } }, FindOptions::builder() - .projection(doc! { "_id": 1, "username": 1 }) + .projection(doc! { "_id": 1, "username": 1, "badges": 1, "status": 1 }) .build(), ) .await diff --git a/src/routes/channels/message_send.rs b/src/routes/channels/message_send.rs index 6803ca5f..626fba91 100644 --- a/src/routes/channels/message_send.rs +++ b/src/routes/channels/message_send.rs @@ -32,11 +32,11 @@ pub async fn req(user: User, target: Ref, message: Json) -> Result JsonValue { json!({ - "revolt": "0.4.0-alpha.2", + "revolt": "0.4.0-alpha.3", "features": { "registration": !*DISABLE_REGISTRATION, "captcha": { diff --git a/src/routes/users/fetch_profile.rs b/src/routes/users/fetch_profile.rs new file mode 100644 index 00000000..7e2b6b91 --- /dev/null +++ b/src/routes/users/fetch_profile.rs @@ -0,0 +1,24 @@ +use crate::database::*; +use crate::util::result::{Error, Result}; + +use mongodb::bson::doc; +use rocket_contrib::json::JsonValue; + +#[get("//profile")] +pub async fn req(user: User, target: Ref) -> Result { + let target = target.fetch_user().await?; + let perm = permissions::PermissionCalculator::new(&user) + .with_user(&target) + .for_user_given() + .await?; + + if !perm.get_view_profile() { + Err(Error::MissingPermission)? + } + + if target.profile.is_some() { + Ok(json!({ "profile": target.profile })) + } else { + Ok(json!({})) + } +} diff --git a/src/routes/users/mod.rs b/src/routes/users/mod.rs index 163978fd..6945bcbe 100644 --- a/src/routes/users/mod.rs +++ b/src/routes/users/mod.rs @@ -3,6 +3,7 @@ use rocket::Route; mod add_friend; mod block_user; mod fetch_dms; +mod fetch_profile; mod fetch_relationship; mod fetch_relationships; mod fetch_user; @@ -19,6 +20,7 @@ pub fn routes() -> Vec { fetch_user::req, get_default_avatar::req, get_avatar::req, + fetch_profile::req, // Direct Messaging fetch_dms::req, open_dm::req,