public void setLastRequest(MamRequestTable request) { dB.InsertOrReplace(request); }
private async Task RequestMamAsync() { state = SetupState.REQUESTING_MAM; if (!ccHandler.client.connection.DISCO_HELPER.HasFeature(Consts.XML_XEP_0313_NAMESPACE, ccHandler.client.getXMPPAccount().getBareJid())) { Logger.Info("No need to request MAM for " + ccHandler.client.getXMPPAccount().getBareJid() + " - not supported."); Continue(); return; } bool extendedMamSupport = ccHandler.client.connection.DISCO_HELPER.HasFeature(Consts.XML_XEP_0313_EXTENDED_NAMESPACE, ccHandler.client.getXMPPAccount().getBareJid()); Logger.Info("Extended MAM support for " + ccHandler.client.getXMPPAccount().getBareJid() + ": " + extendedMamSupport); MamRequestTable mamRequest = MamDBManager.INSTANCE.getLastRequest(ccHandler.client.getXMPPAccount().getBareJid()); string lastMsgId = null; DateTime lastMsgDate = DateTime.MinValue; if (!(mamRequest is null)) { lastMsgId = mamRequest.lastMsgId; lastMsgDate = mamRequest.lastUpdate; } // Request all MAM messages: bool done = false; int iteration = 1; while (!done) { QueryFilter filter = new QueryFilter(); if (extendedMamSupport) { // Only extended MAM supports setting the 'after-id' property. // Reference: https://xmpp.org/extensions/xep-0313.html#support if (!(lastMsgId is null)) { filter.AfterId(lastMsgId); } } else { // Fallback for servers not supporting 'urn:xmpp:mam:2#extended'. if (lastMsgDate != DateTime.MinValue) { filter.Start(lastMsgDate); } } MessageResponseHelperResult <MamResult> result = await RequestMamWithRetry(filter, 2); if (result.STATE == MessageResponseHelperResultState.SUCCESS) { mamRequest = new MamRequestTable { accountId = ccHandler.client.getXMPPAccount().getBareJid(), lastUpdate = DateTime.Now }; if (result.RESULT.RESULTS.Count > 0) { mamRequest.lastMsgId = result.RESULT.LAST; lastMsgId = result.RESULT.LAST; HandleMamMessages(result.RESULT); Logger.Info("MAM request for " + ccHandler.client.getXMPPAccount().getBareJid() + " received " + result.RESULT.RESULTS.Count + " messages in iteration " + iteration + '.'); Logger.Debug("First: " + result.RESULT.RESULTS[result.RESULT.RESULTS.Count - 1].QUERY_ID + " Last: " + result.RESULT.RESULTS[0].QUERY_ID); } if (result.RESULT.COMPLETE || result.RESULT.RESULTS.Count <= 0) { done = true; Logger.Info("MAM request for " + ccHandler.client.getXMPPAccount().getBareJid()); } DateTime newDate = GetLastMessageDate(result.RESULT); if (newDate == mamRequest.lastUpdate) { done = true; Logger.Info("MAM request for " + ccHandler.client.getXMPPAccount().getBareJid()); } else { lastMsgDate = newDate; } MamDBManager.INSTANCE.setLastRequest(mamRequest); } else if (state == SetupState.REQUESTING_MAM) { done = true; Logger.Warn("Failed to request MAM archive for " + ccHandler.client.getXMPPAccount().getBareJid() + " with: " + result.STATE); } ++iteration; } Continue(); }