xmpp/message/receive/
chat.rs1use tokio_xmpp::{
8 jid::Jid,
9 parsers::{confirm::Confirm, message::Message, message_correct::Replace, muc::user::MucUser},
10};
11
12use crate::{Agent, Event, RoomNick, delay::StanzaTimeInfo};
13
14pub async fn handle_message_chat(
15 agent: &mut Agent,
16 events: &mut Vec<Event>,
17 from: Jid,
18 message: &mut Message,
19 time_info: StanzaTimeInfo,
20) {
21 let langs: Vec<&str> = agent.lang.iter().map(String::as_str).collect();
22
23 let confirm = message.extract_valid_payload::<Confirm>();
24 let is_muc_pm = message.extract_valid_payload::<MucUser>().is_some();
25
26 if !is_muc_pm && confirm.is_some() {
28 events.push(Event::AuthConfirm(
29 from.to_bare(),
30 confirm.unwrap(),
31 time_info,
32 ));
33 return;
34 }
35
36 let Some((_lang, body)) = message.get_best_body_cloned(langs) else {
38 debug!("Received normal/chat message without body:\n{:#?}", message);
39 return;
40 };
41
42 let correction = message.extract_valid_payload::<Replace>();
43
44 if is_muc_pm {
45 if from.resource().is_none() {
46 warn!(
47 "Received malformed MessageType::Chat in muc#user namespace from a bare JID:\n{message:#?}"
48 );
49 } else {
50 let full_from = from.clone().try_into_full().unwrap();
51
52 let event = if let Some(correction) = correction {
53 Event::RoomPrivateMessageCorrection(
54 correction.id,
55 full_from.to_bare(),
56 RoomNick::from_resource_ref(full_from.resource()),
57 body.clone(),
58 time_info,
59 )
60 } else {
61 Event::RoomPrivateMessage(
62 message.id.clone(),
63 from.to_bare(),
64 RoomNick::from_resource_ref(full_from.resource()),
65 body.clone(),
66 time_info,
67 )
68 };
69 events.push(event);
70 }
71 } else {
72 let event = if let Some(correction) = correction {
73 Event::ChatMessageCorrection(correction.id, from.to_bare(), body.clone(), time_info)
75 } else {
76 Event::ChatMessage(message.id.clone(), from.to_bare(), body, time_info)
77 };
78 events.push(event);
79 }
80}
81
82pub async fn handle_message_error(
83 _agent: &mut Agent,
84 events: &mut Vec<Event>,
85 from: Jid,
86 message: &mut Message,
87 time_info: StanzaTimeInfo,
88) {
89 let confirm = message.extract_valid_payload::<Confirm>();
90 if let Some(confirm) = confirm {
91 events.push(Event::AuthReject(from.to_bare(), confirm, time_info));
92 }
93}