Handlers

Instead of subscribing to XmppXElementStreamObserver for handling packets we also can write handlers and inject them to the ChannelPipeline.

The following example is creating a handler that handles incoming software version requests XEP-0092: Software Version

using Matrix.Attributes;
using Matrix.Network.Handlers;
using Matrix.Xml;
using Matrix.Xmpp;
using Matrix.Xmpp.Client;    
using Matrix.Xmpp.Version;

/// <summary>
/// This handler automatically replies to incoming XMPP software version requests (XEP-0092: Software Version)
/// </summary>    
[Name("XmppVersion-Handler")]
public class XmppVersionHandler : XmppStanzaHandler
{
    public XmppVersionHandler()
    {
        /*
             setup a handler which handles elements
              * which are of type Iq
              * AND have a type of get
              * AND the query is of type Version
        */
        Handle(
            el =>
                el.OfType<Iq>()
                && el.Cast<Iq>().Type == IqType.Get
                && el.Cast<Iq>().Query.OfType<Version>(),

            async (context, xmppXElement) =>
            {
                var iq = xmppXElement.Cast<Iq>();

                var resIq = new VersionIq();
                resIq.Id = iq.Id;
                resIq.To = iq.From;
                resIq.Type = IqType.Result;
                
                resIq.Version.Name = "Matrix-Client";
                resIq.Version.Os = "Windows";
                resIq.Version.Ver = "1.2.0";

                await SendAsync(resIq);
            });
    }
}

Now our handler then can be ingested to the channel pipeline. Here we do it in the constructor when we create our XmppClinet instance.

var pipelineInitializerAction = new Action<IChannelPipeline>(pipeline =>
{
    pipeline.AddBefore<XmppStanzaHandler>(new XmppVersionHandler());
});

var xmppClient = new XmppClient(pipelineInitializerAction);