fix: send UpdateMessage for Message sent by client user

This commit is contained in:
cel 🌸 2025-02-26 19:17:55 +00:00
parent 6b44ac8ea4
commit 357311cb93
4 changed files with 62 additions and 8 deletions

View File

@ -26,7 +26,7 @@ pub struct Body {
pub body: String,
}
#[derive(sqlx::FromRow)]
#[derive(sqlx::FromRow, Debug, Clone)]
pub struct Chat {
pub correspondent: JID,
// message history is not stored in chat, retreived separately.

View File

@ -179,9 +179,9 @@ async fn handle_stanza(
) {
match stanza {
Stanza::Message(stanza_message) => {
if let Some(from) = stanza_message.from {
if let Some(mut from) = stanza_message.from {
// TODO: group chat messages
let message = Message {
let mut message = Message {
id: stanza_message
.id
// TODO: proper id storage
@ -209,6 +209,8 @@ async fn handle_stanza(
)))
.await;
}
message.from = message.from.as_bare();
from = from.as_bare();
let _ = update_sender
.send(UpdateMessage::Message { to: from, message })
.await;

View File

@ -335,7 +335,42 @@ impl Db {
Ok(())
}
// create direct message
pub async fn create_message_with_self_resource_and_chat(
&self,
message: Message,
chat: JID,
) -> Result<(), Error> {
let from_jid = message.from.as_bare();
let resource = &message.from.resourcepart;
let bare_chat = chat.as_bare();
sqlx::query!(
"insert into users (jid) values (?) on conflict do nothing",
from_jid
)
.execute(&self.db)
.await?;
let id = Uuid::new_v4();
sqlx::query!(
"insert into chats (id, correspondent) values (?, ?) on conflict do nothing",
id,
bare_chat
)
.execute(&self.db)
.await?;
if let Some(resource) = resource {
sqlx::query!(
"insert into resources (bare_jid, resource) values (?, ?) on conflict do nothing",
from_jid,
resource
)
.execute(&self.db)
.await?;
}
self.create_message(message, chat).await?;
Ok(())
}
// create direct message from incoming
pub async fn create_message_with_user_resource_and_chat(
&self,
message: Message,

View File

@ -122,9 +122,11 @@ impl Luz {
)
.await;
debug!("connected and logged in as {}", jid);
debug!("test");
}
match streams_result {
Ok(s) => {
debug!("ok stream result");
let (shutdown_send, shutdown_recv) = oneshot::channel::<()>();
let (writer, supervisor) = SupervisorHandle::new(
s,
@ -242,6 +244,7 @@ impl Luz {
}
}
Err(e) => {
tracing::error!("error: {}", e);
let _ =
self.sender.send(UpdateMessage::Error(Error::Connecting(
ConnectionError::ConnectionFailed(e.into()),
@ -984,24 +987,38 @@ impl CommandMessage {
}),
thread: None,
});
let _ = sender.send(Ok(()));
// let _ = sender.send(Ok(message.clone()));
let result = write_handle.write(message).await;
match result {
Ok(_) => {
let message = Message {
let mut message = Message {
id,
from: owned_jid,
body,
};
if let Err(e) = db.create_message(message, jid).await.map_err(|e| e.into())
info!("send message {:?}", message);
if let Err(e) = db
.create_message_with_self_resource_and_chat(
message.clone(),
jid.clone(),
)
.await
.map_err(|e| e.into())
{
tracing::error!("{}", e);
let _ = update_sender.send(UpdateMessage::Error(Error::MessageSend(
error::MessageSendError::MessageHistory(e),
)));
}
let _ = sender.send(Ok(()));
// TODO: don't do this, have separate from from details
message.from = message.from.as_bare();
let _ = update_sender
.send(UpdateMessage::Message { to: jid, message })
.await;
}
Err(_) => {
let _ = sender.send(result);
// let _ = sender.send(result);
}
}
}