diff --git a/src/routes/channel.rs b/src/routes/channel.rs
index 5501ef5a445a9498fa571e0e8aa7df0db22b7b7e..7a0d3c161e0b647b3120d5e2415691152f36bd57 100644
--- a/src/routes/channel.rs
+++ b/src/routes/channel.rs
@@ -1,4 +1,5 @@
 use crate::database::{ self, user::User, channel::Channel, message::Message };
+use crate::websocket;
 
 use bson::{ bson, doc, from_bson, Bson::UtcDatetime };
 use rocket_contrib::json::{ JsonValue, Json };
@@ -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
 #[get("/<target>")]
 pub fn channel(user: User, target: Channel) -> Option<JsonValue> {
@@ -139,17 +147,29 @@ pub fn send_message(user: User, target: Channel, message: Json<SendMessage>) ->
 	Some(match col.insert_one(
 		doc! {
 			"_id": id.clone(),
-			"channel": target.id,
-			"author": user.id,
+			"channel": target.id.clone(),
+			"author": user.id.clone(),
 			"content": message.content.clone(),
 		},
 		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!({
 				"success": true,
 				"id": id
-			}),
+			})
+		},
 		Err(_) =>
 			json!({
 				"success": false,
@@ -179,20 +199,33 @@ pub fn edit_message(user: User, target: Channel, message: Message, edit: Json<Se
 		} else {
 			let col = database::get_collection("messages");
 
+			let edited = UtcDatetime(Utc::now());
 			match col.update_one(
-				doc! { "_id": message.id },
+				doc! { "_id": message.id.clone() },
 				doc! {
 					"$set": {
 						"content": edit.content.clone(),
-						"edited": UtcDatetime(Utc::now())
+						"edited": edited.clone()
 					}
 				},
 				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!({
 						"success": true
-					}),
+					})
+				},
 				Err(_) =>
 					json!({
 						"success": false,
@@ -220,13 +253,23 @@ pub fn delete_message(user: User, target: Channel, message: Message) -> Option<J
 			let col = database::get_collection("messages");
 
 			match col.delete_one(
-				doc! { "_id": message.id },
+				doc! { "_id": message.id.clone() },
 				None
 			) {
-				Ok(_) =>
+				Ok(_) => {
+					websocket::queue_message(
+						get_recipients(&target),
+						json!({
+							"type": "message_delete",
+							"id": message.id,
+							"channel": target.id
+						}).to_string()
+					);
+
 					json!({
 						"success": true
-					}),
+					})
+				},
 				Err(_) =>
 					json!({
 						"success": false,
diff --git a/src/websocket/mod.rs b/src/websocket/mod.rs
index bcc35f644696c1230a4ef8e31605bf25f6aade4e..5204050ae406c89a12e2506ae6cd0d1cfab95309 100644
--- a/src/websocket/mod.rs
+++ b/src/websocket/mod.rs
@@ -147,15 +147,25 @@ pub fn launch_server() {
 pub fn send_message(id: String, message: String) -> std::result::Result<(), ()> {
 	unsafe {
 		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 {
-			match item.out.send(message.clone()) {
-				Ok(_) => (),
-				Err(_) => {
+			for item in arr {
+				if let Err(_) = item.out.send(message.clone()) {
 					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");
 	}
 }