Skip to content
Snippets Groups Projects
Verified Commit 4b315333 authored by insert's avatar insert
Browse files
parent 4f6850b2
Branches
Tags
No related merge requests found
use crate::database::{ self, user::User, channel::Channel, message::Message }; use crate::database::{ self, user::User, channel::Channel, message::Message };
use crate::websocket;
use bson::{ bson, doc, from_bson, Bson::UtcDatetime }; use bson::{ bson, doc, from_bson, Bson::UtcDatetime };
use rocket_contrib::json::{ JsonValue, Json }; use rocket_contrib::json::{ JsonValue, Json };
...@@ -35,6 +36,13 @@ fn has_permission(user: &User, target: &Channel) -> bool { ...@@ -35,6 +36,13 @@ fn has_permission(user: &User, target: &Channel) -> bool {
} }
} }
fn get_recipients(target: &Channel) -> Vec<String> {
match target.channel_type {
0..=1 => target.recipients.clone().unwrap(),
_ => vec![]
}
}
/// fetch channel information /// fetch channel information
#[get("/<target>")] #[get("/<target>")]
pub fn channel(user: User, target: Channel) -> Option<JsonValue> { pub fn channel(user: User, target: Channel) -> Option<JsonValue> {
...@@ -139,17 +147,29 @@ pub fn send_message(user: User, target: Channel, message: Json<SendMessage>) -> ...@@ -139,17 +147,29 @@ pub fn send_message(user: User, target: Channel, message: Json<SendMessage>) ->
Some(match col.insert_one( Some(match col.insert_one(
doc! { doc! {
"_id": id.clone(), "_id": id.clone(),
"channel": target.id, "channel": target.id.clone(),
"author": user.id, "author": user.id.clone(),
"content": message.content.clone(), "content": message.content.clone(),
}, },
None None
) { ) {
Ok(_) => Ok(_) => {
websocket::queue_message(
get_recipients(&target),
json!({
"type": "message",
"id": id.clone(),
"channel": target.id,
"author": user.id,
"content": message.content.clone(),
}).to_string()
);
json!({ json!({
"success": true, "success": true,
"id": id "id": id
}), })
},
Err(_) => Err(_) =>
json!({ json!({
"success": false, "success": false,
...@@ -179,20 +199,33 @@ pub fn edit_message(user: User, target: Channel, message: Message, edit: Json<Se ...@@ -179,20 +199,33 @@ pub fn edit_message(user: User, target: Channel, message: Message, edit: Json<Se
} else { } else {
let col = database::get_collection("messages"); let col = database::get_collection("messages");
let edited = UtcDatetime(Utc::now());
match col.update_one( match col.update_one(
doc! { "_id": message.id }, doc! { "_id": message.id.clone() },
doc! { doc! {
"$set": { "$set": {
"content": edit.content.clone(), "content": edit.content.clone(),
"edited": UtcDatetime(Utc::now()) "edited": edited.clone()
} }
}, },
None None
) { ) {
Ok(_) => Ok(_) => {
websocket::queue_message(
get_recipients(&target),
json!({
"type": "message_update",
"id": message.id,
"channel": target.id,
"content": message.content.clone(),
"edited": edited
}).to_string()
);
json!({ json!({
"success": true "success": true
}), })
},
Err(_) => Err(_) =>
json!({ json!({
"success": false, "success": false,
...@@ -220,13 +253,23 @@ pub fn delete_message(user: User, target: Channel, message: Message) -> Option<J ...@@ -220,13 +253,23 @@ pub fn delete_message(user: User, target: Channel, message: Message) -> Option<J
let col = database::get_collection("messages"); let col = database::get_collection("messages");
match col.delete_one( match col.delete_one(
doc! { "_id": message.id }, doc! { "_id": message.id.clone() },
None None
) { ) {
Ok(_) => Ok(_) => {
websocket::queue_message(
get_recipients(&target),
json!({
"type": "message_delete",
"id": message.id,
"channel": target.id
}).to_string()
);
json!({ json!({
"success": true "success": true
}), })
},
Err(_) => Err(_) =>
json!({ json!({
"success": false, "success": false,
......
...@@ -147,15 +147,25 @@ pub fn launch_server() { ...@@ -147,15 +147,25 @@ pub fn launch_server() {
pub fn send_message(id: String, message: String) -> std::result::Result<(), ()> { pub fn send_message(id: String, message: String) -> std::result::Result<(), ()> {
unsafe { unsafe {
let map = CLIENTS.get().unwrap().read().unwrap(); let map = CLIENTS.get().unwrap().read().unwrap();
let arr = map.get(&id).unwrap(); if map.contains_key(&id) {
let arr = map.get(&id).unwrap();
Ok(for item in arr { for item in arr {
match item.out.send(message.clone()) { if let Err(_) = item.out.send(message.clone()) {
Ok(_) => (),
Err(_) => {
return Err(()); return Err(());
} }
} }
}) }
Ok(())
}
}
// ! TODO: WRITE THREADED QUEUE SYSTEM
// ! FETCH RECIPIENTS HERE INSTEAD OF IN METHOD
pub fn queue_message(ids: Vec<String>, message: String) {
for id in ids {
send_message(id, message.clone()).expect("uhhhhhhhhhh can i get uhhhhhhhhhhhhhhhhhh mcdonald cheese burger with fries");
} }
} }
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment