Exemplo n.º 1
0
 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();
        }