diff --git a/src/xmpp/message.c b/src/xmpp/message.c index 18182e0c..1a97d9f1 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -831,14 +831,19 @@ _handle_groupchat(xmpp_stanza_t *const stanza) message->plain = strdup(message->body); } - // determine if the notifications happened whilst offline + // determine if the notifications happened whilst offline (MUC history) message->timestamp = stanza_get_delay_from(stanza, jid->barejid); if (message->timestamp == NULL) { // checking the domainpart is a workaround for some prosody versions (gh#1190) message->timestamp = stanza_get_delay_from(stanza, jid->domainpart); } - if (message->timestamp) { + bool is_muc_history = message->timestamp != NULL; + + // we want to display the oldest delay + message->timestamp = stanza_get_oldest_delay(stanza); + + if (is_muc_history) { sv_ev_room_history(message); } else { sv_ev_room_message(message); diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c index f793d035..e75bbd6e 100644 --- a/src/xmpp/stanza.c +++ b/src/xmpp/stanza.c @@ -1244,7 +1244,7 @@ _stanza_get_delay_timestamp_xep0091(xmpp_stanza_t *const x_stanza) GDateTime* stanza_get_delay_from(xmpp_stanza_t *const stanza, gchar *from) { - xmpp_stanza_t *delay; + xmpp_stanza_t *delay = NULL; // first check for XEP-0203 delayed delivery if (from) { @@ -1272,6 +1272,35 @@ stanza_get_delay_from(xmpp_stanza_t *const stanza, gchar *from) return NULL; } +GDateTime* +stanza_get_oldest_delay(xmpp_stanza_t *const stanza) +{ + xmpp_stanza_t *child; + const char *child_name; + GDateTime* oldest; + + for (child = xmpp_stanza_get_children(stanza); child; child = xmpp_stanza_get_next(child)) { + + child_name = xmpp_stanza_get_name(child); + + if (child_name && strcmp(child_name, STANZA_NAME_DELAY) == 0) { + GDateTime *tmp = _stanza_get_delay_timestamp_xep0203(stanza); + + if (!oldest || g_date_time_compare(oldest, tmp) == 1) + oldest = tmp; + } + + if (child_name && strcmp(child_name, STANZA_NAME_X) == 0) { + GDateTime *tmp = _stanza_get_delay_timestamp_xep0091(stanza); + + if (!oldest || g_date_time_compare(oldest, tmp) == 1) + oldest = tmp; + } + } + + return oldest; +} + char* stanza_get_status(xmpp_stanza_t *stanza, char *def) { diff --git a/src/xmpp/stanza.h b/src/xmpp/stanza.h index 4b241fe2..04749fd2 100644 --- a/src/xmpp/stanza.h +++ b/src/xmpp/stanza.h @@ -271,6 +271,7 @@ gboolean stanza_contains_chat_state(xmpp_stanza_t *stanza); GDateTime* stanza_get_delay(xmpp_stanza_t *const stanza); GDateTime* stanza_get_delay_from(xmpp_stanza_t *const stanza, gchar *from); +GDateTime* stanza_get_oldest_delay(xmpp_stanza_t *const stanza); gboolean stanza_is_muc_presence(xmpp_stanza_t *const stanza); gboolean stanza_is_muc_self_presence(xmpp_stanza_t *const stanza,