private void HandleMamMessages(MamResult result) { Task.Run(async() => { foreach (QueryArchiveResultMessage message in result.RESULTS) { foreach (AbstractMessage abstractMessage in message.CONTENT) { if (abstractMessage is MessageMessage msg) { await ccHandler.HandleNewChatMessageAsync(msg); } else { Logger.Warn("MAM contained message of type: " + abstractMessage.GetType()); } } } }); }
/// <summary> /// Requests archived messages according options specified /// </summary> /// <param name="jid">The JID of the XMPP entity to get.</param> /// <param name="queryId">The Id related to this query - it will be used to identify this request</param> /// <param name="max">The maximum number of result expected /// <param name="isRoom">To know if we request archive from room /// <param name="before">Stanza ID - if not null search message before it /// <param name="max">Stanza ID - if not null search message before it /// <exception cref="ArgumentNullException">The jid parameter /// is null.</exception> /// <exception cref="NotSupportedException">The XMPP entity with /// the specified JID does not support the 'Ping' XMPP extension.</exception> /// <exception cref="XmppErrorException">The server returned an XMPP error code. /// Use the Error property of the XmppErrorException to obtain the specific /// error condition.</exception> /// <exception cref="XmppException">The server returned invalid data or another /// unspecified XMPP error occurred.</exception> public void RequestArchivedMessages(Jid jid, string queryId, int max, bool isRoom, string before = null, string after = null) { jid.ThrowIfNull("jid"); XmlElement rootElement; XmlElement subElement; XmlElement fieldElement; XmlElement valueElement; rootElement = Xml.Element("query", "urn:xmpp:mam:1"); rootElement.SetAttribute("queryid", queryId); subElement = Xml.Element("x", "jabber:x:data"); subElement.SetAttribute("type", "submit"); fieldElement = Xml.Element("field"); fieldElement.SetAttribute("var", "FORM_TYPE"); fieldElement.SetAttribute("type", "hidden"); valueElement = Xml.Element("value"); valueElement.InnerText = "urn:xmpp:mam:1"; fieldElement.Child(valueElement); subElement.Child(fieldElement); fieldElement = Xml.Element("field"); fieldElement.SetAttribute("var", "with"); valueElement = Xml.Element("value"); if (isRoom) { valueElement.InnerText = im.Jid.GetBareJid().ToString(); } else { valueElement.InnerText = jid.GetBareJid().ToString(); } fieldElement.Child(valueElement); subElement.Child(fieldElement); rootElement.Child(subElement); subElement = Xml.Element("set", "http://jabber.org/protocol/rsm"); if (max > 0) { subElement.Child(Xml.Element("max").Text(max.ToString())); } if (before == null) { subElement.Child(Xml.Element("before")); } else { subElement.Child(Xml.Element("before").Text(before)); } if (after != null) { subElement.Child(Xml.Element("after").Text(after)); } rootElement.Child(subElement); Jid to = null; if (isRoom) { to = jid; } //The Request is Async im.IqRequestAsync(IqType.Set, to, null, rootElement, null, (id, iq) => { //For any reply we execute the callback if (iq.Type == IqType.Error) { MessageArchiveManagementResult.Raise(this, new MessageArchiveManagementResultEventArgs()); return; } if (iq.Type == IqType.Result) { string queryid = ""; MamResult complete = MamResult.Error; int count = 0; string first = ""; string last = ""; try { if ((iq.Data["fin"] != null) && (iq.Data["fin"]["set"] != null)) { XmlElement e = iq.Data["fin"]; queryid = e.GetAttribute("queryid"); complete = (e.GetAttribute("complete") == "false") ? MamResult.InProgress : MamResult.Complete; if (e["set"]["count"] != null) { count = Int16.Parse(e["set"]["count"].InnerText); } if (e["set"]["first"] != null) { first = e["set"]["first"].InnerText; } if (e["set"]["last"] != null) { last = e["set"]["last"].InnerText; } MessageArchiveManagementResult.Raise(this, new MessageArchiveManagementResultEventArgs(queryid, complete, count, first, last)); return; } } catch (Exception) { log.LogError("RequestCustomIqAsync - an error occurred ..."); } MessageArchiveManagementResult.Raise(this, new MessageArchiveManagementResultEventArgs(queryid, MamResult.Error, count, first, last)); } }); }
/// <summary> /// Requests archived messages according options specified /// </summary> /// <param name="toJid">The JID of the XMPP entity to get.</param> /// <param name="withJid">Filtering result with this JID</param> /// <param name="queryId">The Id related to this query - it will be used to identify this request</param> /// <param name="start">Start date /// <param name="end">Edn date /// <exception cref="ArgumentNullException">The jid parameter /// is null.</exception> /// <exception cref="NotSupportedException">The XMPP entity with /// the specified JID does not support the 'Ping' XMPP extension.</exception> /// <exception cref="XmppErrorException">The server returned an XMPP error code. /// Use the Error property of the XmppErrorException to obtain the specific /// error condition.</exception> /// <exception cref="XmppException">The server returned invalid data or another /// unspecified XMPP error occurred.</exception> public void RequestArchivedMessagesByDate(Jid toJid, Jid fromJid, Jid withJid, string queryId, DateTime start, DateTime end) { /* * * <query xmlns='urn:xmpp:mam:1'> * <x xmlns='jabber:x:data' type='submit'> * <field var='FORM_TYPE' type='hidden'> * <value>urn:xmpp:mam:1</value> * </field> * <field var='start'> * <value>2010-06-07T00:00:00Z</value> * </field> * <field var='end'> * <value>2010-07-07T13:23:54Z</value> * </field> * </x> * </query> */ //jid.ThrowIfNull("jid"); XmlElement rootElement; XmlElement subElement; XmlElement fieldElement; XmlElement valueElement; rootElement = Xml.Element("query", "urn:xmpp:mam:1"); rootElement.SetAttribute("queryid", queryId); subElement = Xml.Element("x", "jabber:x:data"); subElement.SetAttribute("type", "submit"); fieldElement = Xml.Element("field"); fieldElement.SetAttribute("var", "FORM_TYPE"); fieldElement.SetAttribute("type", "hidden"); valueElement = Xml.Element("value"); valueElement.InnerText = "urn:xmpp:mam:1"; fieldElement.Child(valueElement); subElement.Child(fieldElement); if (withJid != null) { fieldElement = Xml.Element("field"); fieldElement.SetAttribute("var", "with"); valueElement = Xml.Element("value"); valueElement.InnerText = withJid.ToString(); fieldElement.Child(valueElement); subElement.Child(fieldElement); } fieldElement = Xml.Element("field"); fieldElement.SetAttribute("var", "start"); valueElement = Xml.Element("value"); valueElement.InnerText = start.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");; fieldElement.Child(valueElement); subElement.Child(fieldElement); fieldElement = Xml.Element("field"); fieldElement.SetAttribute("var", "end"); valueElement = Xml.Element("value"); valueElement.InnerText = end.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");; fieldElement.Child(valueElement); subElement.Child(fieldElement); rootElement.Child(subElement); //The Request is Async im.IqRequestAsync(IqType.Set, toJid, fromJid, rootElement, null, (id, iq) => { //For any reply we execute the callback if (iq.Type == IqType.Error) { MessageArchiveManagementResult.Raise(this, new MessageArchiveManagementResultEventArgs()); return; } if (iq.Type == IqType.Result) { string queryid = ""; MamResult complete = MamResult.Error; int count = 0; string first = ""; string last = ""; try { if ((iq.Data["fin"] != null) && (iq.Data["fin"]["set"] != null)) { XmlElement e = iq.Data["fin"]; queryid = e.GetAttribute("queryid"); complete = (e.GetAttribute("complete") == "false") ? MamResult.InProgress : MamResult.Complete; if (e["set"]["count"] != null) { count = Int16.Parse(e["set"]["count"].InnerText); } if (e["set"]["first"] != null) { first = e["set"]["first"].InnerText; } if (e["set"]["last"] != null) { last = e["set"]["last"].InnerText; } MessageArchiveManagementResult.Raise(this, new MessageArchiveManagementResultEventArgs(queryid, complete, count, first, last)); return; } } catch (Exception) { log.LogError("RequestCustomIqAsync - an error occurred ..."); } MessageArchiveManagementResult.Raise(this, new MessageArchiveManagementResultEventArgs(queryid, MamResult.Error, count, first, last)); } }); }
private DateTime GetLastMessageDate(MamResult result) { return(result.RESULTS.Count > 0 ? result.RESULTS[0].MESSAGE.delay : DateTime.Now); }
private DateTime GetLastMessageDate(MamResult result) { return(result.RESULTS.Count > 0 ? result.RESULTS.Last().DELAY : DateTime.Now); }