mirror of
https://gitlab.com/comunic/comunicapiv3
synced 2025-06-20 16:35:17 +00:00
Send message through WebSocket fro new conversation messages
This commit is contained in:
@ -12,12 +12,17 @@ use crate::api_data::res_count_unread_conversations::ResultCountUnreadConversati
|
||||
use crate::api_data::res_create_conversation::ResCreateConversation;
|
||||
use crate::api_data::res_find_private_conversations::ResFindPrivateConversations;
|
||||
use crate::controllers::routes::RequestResult;
|
||||
use crate::controllers::user_ws_controller;
|
||||
use crate::controllers::user_ws_controller::WsConnection;
|
||||
use crate::data::base_request_handler::BaseRequestHandler;
|
||||
use crate::data::error::Res;
|
||||
use crate::data::http_request_handler::HttpRequestHandler;
|
||||
use crate::data::new_conversation::NewConversation;
|
||||
use crate::data::new_conversation_message::NewConversationMessage;
|
||||
use crate::data::user::UserID;
|
||||
use crate::helpers::{conversations_helper, user_helper};
|
||||
use crate::data::user_ws_message::UserWsMessage;
|
||||
use crate::helpers::{conversations_helper, events_helper, user_helper};
|
||||
use crate::helpers::events_helper::Event;
|
||||
use crate::utils::string_utils::remove_html_nodes;
|
||||
|
||||
/// Create a new conversation
|
||||
@ -334,4 +339,23 @@ pub fn delete_message(r: &mut HttpRequestHandler) -> RequestResult {
|
||||
conversations_helper::delete_message_by_id(msg_id)?;
|
||||
|
||||
r.success("The message has been successfully deleted!")
|
||||
}
|
||||
|
||||
/// Events handler
|
||||
pub fn handle_event(e: &events_helper::Event) -> Res {
|
||||
match e {
|
||||
Event::NewConversationMessage(msg) => {
|
||||
user_ws_controller::send_message_to_specific_connections(
|
||||
|f| f.conversations.contains(&msg.conv_id),
|
||||
|_| UserWsMessage::no_id_message("new_conv_message", ConversationMessageAPI::new(msg)),
|
||||
Some(|conn: &WsConnection| conversations_helper::mark_user_seen(msg.conv_id, &conn.user_id)),
|
||||
)?;
|
||||
}
|
||||
|
||||
Event::UpdatedConversationMessage(msg) => {}
|
||||
Event::DeleteConversationMessage(msg) => {}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
@ -483,6 +483,31 @@ pub fn send_message_to_users(msg: &UserWsMessage, users: &Vec<UserID>) -> Res {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Send a message to specific users
|
||||
pub fn send_message_to_specific_connections<F, M, A>(filter: F, msg_generator: M, after_send: Option<A>) -> Res
|
||||
where F: Fn(&WsConnection) -> bool,
|
||||
M: Fn(&WsConnection) -> Res<UserWsMessage>,
|
||||
A: Fn(&WsConnection) -> Res
|
||||
{
|
||||
let connections = get_ws_connections_list()
|
||||
.lock()
|
||||
.unwrap()
|
||||
.iter()
|
||||
.filter(|f| filter(f))
|
||||
.map(|f| f.clone())
|
||||
.collect::<Vec<WsConnection>>();
|
||||
|
||||
for con in connections {
|
||||
send_message(con.session.clone(), &msg_generator(&con)?)?;
|
||||
|
||||
if let Some(cb) = &after_send {
|
||||
cb(&con)?;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Check out whether user is connected or not
|
||||
pub fn is_user_connected(user_id: &UserID) -> bool {
|
||||
get_ws_connections_list().lock().unwrap().iter().any(|c| &c.user_id == user_id)
|
||||
|
Reference in New Issue
Block a user