diff options
author | MarcoPolo-PasTonMolo <marcopolopastonmolo@protonmail.com> | 2022-07-03 21:23:07 +0300 |
---|---|---|
committer | MarcoPolo-PasTonMolo <marcopolopastonmolo@protonmail.com> | 2022-07-03 21:23:07 +0300 |
commit | f0202a2fe0da0a1aa05009b875dffe47bfa3df8d (patch) | |
tree | a62f0792df34fae5796fe55743485ac79bd3f825 /src/xmpp/iq.c | |
parent | 476c73251c2787930f866c76484eb1417a834cea (diff) | |
download | profani-tty-f0202a2fe0da0a1aa05009b875dffe47bfa3df8d.tar.gz |
On new chatwin fetch mam according to guidelines.
Taken from here: https://github.com/modernxmpp/modernxmpp/commit/cd3e871e55c2cff45dffd05d6e50380b99845849
Diffstat (limited to 'src/xmpp/iq.c')
-rw-r--r-- | src/xmpp/iq.c | 61 |
1 files changed, 42 insertions, 19 deletions
diff --git a/src/xmpp/iq.c b/src/xmpp/iq.c index 8d40a86f..9918354e 100644 --- a/src/xmpp/iq.c +++ b/src/xmpp/iq.c @@ -2582,24 +2582,43 @@ iq_mam_request(ProfChatWin* win) return; } + ProfMessage* last_msg = log_database_get_limits_info(win->barejid, TRUE); + char* lastid = NULL; + char* firstid = NULL; + char* startdate = NULL; + char* enddate = NULL; + gboolean should_add_rsm_handler = TRUE; + + // If last message found + if (last_msg->timestamp) { + lastid = last_msg->stanzaid; + startdate = g_date_time_format(last_msg->timestamp, "%FT%T.%f%:z"); + + } else { + GDateTime* now = g_date_time_new_now_utc(); + enddate = g_date_time_format(now, "%FT%T.%f%:z"); + g_date_time_unref(now); + // To get last page we need to set before to empty string + firstid = ""; + should_add_rsm_handler = FALSE; + } + xmpp_ctx_t* const ctx = connection_get_ctx(); - GDateTime* now = g_date_time_new_now_utc(); - GDateTime* timestamp = g_date_time_add_days(now, -7); - g_date_time_unref(now); - gchar* datestr = g_date_time_format(timestamp, "%FT%TZ"); - xmpp_stanza_t* iq = stanza_create_mam_iq(ctx, win->barejid, datestr, NULL); + xmpp_stanza_t* iq = stanza_create_mam_iq(ctx, win->barejid, startdate, enddate, firstid, lastid); - MamRsmUserdata* data = malloc(sizeof(MamRsmUserdata)); - if (data) { - data->datestr = strdup(datestr); - data->barejid = strdup(win->barejid); + if (should_add_rsm_handler) { + MamRsmUserdata* data = malloc(sizeof(MamRsmUserdata)); + if (data) { + data->start_datestr = startdate; + data->end_datestr = enddate; + data->barejid = strdup(win->barejid); - iq_id_handler_add(xmpp_stanza_get_id(iq), _mam_rsm_id_handler, NULL, data); + iq_id_handler_add(xmpp_stanza_get_id(iq), _mam_rsm_id_handler, NULL, data); + } } - g_free(datestr); - g_date_time_unref(timestamp); + message_free(last_msg); iq_send_stanza(iq); xmpp_stanza_release(iq); @@ -2619,24 +2638,28 @@ _mam_rsm_id_handler(xmpp_stanza_t* const stanza, void* const userdata) } else if (g_strcmp0(type, "result") == 0) { xmpp_stanza_t* fin = xmpp_stanza_get_child_by_name_and_ns(stanza, STANZA_NAME_FIN, STANZA_NS_MAM2); if (fin) { + gboolean is_complete = g_strcmp0(xmpp_stanza_get_attribute(fin, "complete"), "true") == 0; + + if (is_complete) { + return 0; + } + xmpp_stanza_t* set = xmpp_stanza_get_child_by_name_and_ns(fin, STANZA_TYPE_SET, STANZA_NS_RSM); if (set) { char* lastid = NULL; xmpp_stanza_t* last = xmpp_stanza_get_child_by_name(set, STANZA_NAME_LAST); - if (last) { - lastid = xmpp_stanza_get_text(last); - } + lastid = xmpp_stanza_get_text(last); // 4.3.2. send same stanza with set,max stanza xmpp_ctx_t* const ctx = connection_get_ctx(); MamRsmUserdata* data = (MamRsmUserdata*)userdata; - xmpp_stanza_t* iq = stanza_create_mam_iq(ctx, data->barejid, data->datestr, lastid); - free(data->barejid); - free(data->datestr); - free(data); + + xmpp_stanza_t* iq = stanza_create_mam_iq(ctx, data->barejid, data->start_datestr, data->end_datestr, NULL, lastid); free(lastid); + iq_id_handler_add(xmpp_stanza_get_id(iq), _mam_rsm_id_handler, NULL, data); + iq_send_stanza(iq); xmpp_stanza_release(iq); } |