about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/event/server_events.c24
-rw-r--r--src/ui/chatwin.c13
-rw-r--r--src/xmpp/message.c19
-rw-r--r--src/xmpp/xmpp.h1
4 files changed, 42 insertions, 15 deletions
diff --git a/src/event/server_events.c b/src/event/server_events.c
index 11b5d877..057af9bf 100644
--- a/src/event/server_events.c
+++ b/src/event/server_events.c
@@ -622,16 +622,30 @@ void
 sv_ev_incoming_message(ProfMessage *message)
 {
     gboolean new_win = FALSE;
-    ProfChatWin *chatwin = wins_get_chat(message->from_jid->barejid);
+    ProfChatWin *chatwin;
+    char *looking_for_jid = message->from_jid->barejid;
+
+    if (message->is_mam) {
+        Jid *my_jid = jid_create(connection_get_fulljid());
+        if (g_strcmp0(my_jid->barejid, message->from_jid->barejid) == 0) {
+            looking_for_jid = message->to_jid->barejid;
+        }
+        jid_destroy(my_jid);
+    }
+
+    chatwin = wins_get_chat(looking_for_jid);
+
     if (!chatwin) {
-        ProfWin *window = wins_new_chat(message->from_jid->barejid);
+        ProfWin *window = wins_new_chat(looking_for_jid);
         chatwin = (ProfChatWin*)window;
         new_win = TRUE;
 
 #ifdef HAVE_OMEMO
-        if (omemo_automatic_start(message->from_jid->barejid)) {
-            omemo_start_session(message->from_jid->barejid);
-            chatwin->is_omemo = TRUE;
+        if (!message->is_mam) {
+            if (omemo_automatic_start(message->from_jid->barejid)) {
+                omemo_start_session(message->from_jid->barejid);
+                chatwin->is_omemo = TRUE;
+            }
         }
 #endif
     }
diff --git a/src/ui/chatwin.c b/src/ui/chatwin.c
index 6846eb71..1c04432c 100644
--- a/src/ui/chatwin.c
+++ b/src/ui/chatwin.c
@@ -251,12 +251,19 @@ chatwin_incoming_msg(ProfChatWin *chatwin, ProfMessage *message, gboolean win_cr
     assert(chatwin != NULL);
     char *old_plain = message->plain;
 
-    message->plain = plugins_pre_chat_message_display(chatwin->barejid, message->from_jid->resourcepart, message->plain);
+    message->plain = plugins_pre_chat_message_display(message->from_jid->barejid, message->from_jid->resourcepart, message->plain);
 
     ProfWin *window = (ProfWin*)chatwin;
     int num = wins_get_num(window);
 
-    char *display_name = roster_get_msg_display_name(chatwin->barejid, message->from_jid->resourcepart);
+    char *display_name;
+    Jid *my_jid = jid_create(connection_get_fulljid());
+    if (g_strcmp0(my_jid->barejid, message->from_jid->barejid) == 0) {
+        display_name = strdup("me");
+    } else {
+        display_name = roster_get_msg_display_name(message->from_jid->barejid, message->from_jid->resourcepart);
+    }
+    jid_destroy(my_jid);
 
     gboolean is_current = wins_is_current(window);
     gboolean notify = prefs_do_chat_notify(is_current);
@@ -304,7 +311,7 @@ chatwin_incoming_msg(ProfChatWin *chatwin, ProfMessage *message, gboolean win_cr
 
     free(display_name);
 
-    plugins_post_chat_message_display(chatwin->barejid, message->from_jid->resourcepart, message->plain);
+    plugins_post_chat_message_display(message->from_jid->barejid, message->from_jid->resourcepart, message->plain);
 
     free(message->plain);
     message->plain = old_plain;
diff --git a/src/xmpp/message.c b/src/xmpp/message.c
index 59970012..d8d12a74 100644
--- a/src/xmpp/message.c
+++ b/src/xmpp/message.c
@@ -84,7 +84,7 @@ static void _handle_muc_private_message(xmpp_stanza_t *const stanza);
 static void _handle_conference(xmpp_stanza_t *const stanza);
 static void _handle_captcha(xmpp_stanza_t *const stanza);
 static void _handle_receipt_received(xmpp_stanza_t *const stanza);
-static void _handle_chat(xmpp_stanza_t *const stanza);
+static void _handle_chat(xmpp_stanza_t *const stanza, gboolean is_mam);
 static gboolean _handle_mam(xmpp_stanza_t *const stanza);
 
 static void _send_message_stanza(xmpp_stanza_t *const stanza);
@@ -166,7 +166,7 @@ _message_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *con
         }
     }
 
-    _handle_chat(stanza);
+    _handle_chat(stanza, FALSE);
 
     return 1;
 }
@@ -1161,7 +1161,7 @@ out:
 }
 
 static void
-_handle_chat(xmpp_stanza_t *const stanza)
+_handle_chat(xmpp_stanza_t *const stanza, gboolean is_mam)
 {
     // ignore if type not chat or absent
     const char *type = xmpp_stanza_get_type(stanza);
@@ -1206,10 +1206,15 @@ _handle_chat(xmpp_stanza_t *const stanza)
 
     // standard chat message, use jid without resource
     ProfMessage *message = message_init();
-    // TODO: safe to_jid too. also need to have the same check like in carbons. in case this is MAM.
-    // or have a is_mam and handle later. 
-    message->from_jid = jid;
     message->type = PROF_MSG_TYPE_CHAT;
+    message->from_jid = jid;
+
+    const gchar *to_text = xmpp_stanza_get_to(stanza);
+    if (to_text) {
+        message->to_jid = jid_create(to_text);
+    }
+
+    message->is_mam = is_mam;
 
     // message stanza id
     const char *id = xmpp_stanza_get_id(stanza);
@@ -1296,7 +1301,7 @@ _handle_mam(xmpp_stanza_t *const stanza)
     }
 
     xmpp_stanza_t *message_stanza = xmpp_stanza_get_child_by_ns(forwarded, "jabber:client");
-    _handle_chat(message_stanza);
+    _handle_chat(message_stanza, TRUE);
 
     return TRUE;
 }
diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h
index 3f384fb7..cb0004e3 100644
--- a/src/xmpp/xmpp.h
+++ b/src/xmpp/xmpp.h
@@ -155,6 +155,7 @@ typedef struct prof_message_t {
    GDateTime *timestamp;
    prof_enc_t enc;
    gboolean trusted;
+   gboolean is_mam;
    prof_msg_type_t type;
 } ProfMessage;