Task-based asynchronous MUC room configuration

The question on how to change the configuration of a Muc room, or how to make a room persistend comes up very often in our forums and support enquiries.

Here is a small example using MatriX and the task based asynchronous pattern.

In MatriX most of the Muc functionality can be accessed with the MucManager component. We assume that you are familiar with the MucManager and have joined or created Muc rooms already.

In this small example we want to make an existing room persistent.
Four steps are required to achieve this:

  1. Request the current room configuration.
  2. Parse the current room configuration in code or render it to a GUI.
  3. Create the xdata result, either in code or from the user input in the GUI.
  4. Submit the new room configuration.

Here is the code:

private async void MakeRoomPersitent(Jid roomJid)
{	
	// Step 1, request the room configuration
	var iq = await mm.RequestRoomConfigurationAsync(roomJid);
	if (iq.Type == IqType.result) // only proceed on result
	{
		// Step 2 and 3, parsing the current config and
		// creating the	result is done in the same loop here.
		var xdata = iq.Query.Element<Data>();
		var xDataResult = new Data
		{
			Type = FormType.submit
		};

		foreach (var field in xdata.GetFields())
		{
			var retField = new Field()
			{
				Type = field.Type, // keep the type
				Var = field.Var // keep the var
			};

			// we are changing the muc#roomconfig_persistentroom only
			// other fields get copied only with the existing values			
			if (field.Var == "muc#roomconfig_persistentroom")
				retField.AddValue(true);
			else
				retField.AddValues(field.GetValues().ToArray());

			xDataResult.AddField(retField);
		}

		// Step 4, submit the changed configuration back to the server (room)
		var submitIq = await mm.SubmitRoomConfigurationAsync(roomJid, xDataResult);
		if (submitIq.Type == IqType.result)
			Debug.WriteLine("success");
		else
			Debug.WriteLine("something went wrong");
	}
}

If you want to render Data froms to UI, and generate responses from the UI input, you can use the sources in the MatriX.Ui project which can we downloaded from here:
http://www.ag-software.net/download-directory/

MatriX Screencast #2 published

The 2nd screencast has been published. This tutorial covers the following:

  • installation of a local Openfire XMPP server
  • configuration of the server
  • creating user accounts
  • starting XMPP client development on the local server

More screencasts and tutorials for other XMPP server software is coming.

MatriX XMPP SDK Screencast 2

This tutorial shows how to install you own local Openfire XMPP server for development with the MatriX XMPP SDK

MatriX XMPP SDK Screencast 1

This tutorial shows how to get started with the MatriX XMPP SDK

NuGet package available

Some of our customers asked for NuGet packages. The roadmap of our development is heavily impacted by our customer requests. We are always receptive to your criticism, ideas and praise

When you prefer NuGet for managing your references then you can start using it for MatriX as well now.

You can find the MatriX NuGet package here:
https://www.nuget.org/packages/MatriX/

MatriX Screencast #1 published

We have published the first MatriX screencast. This small tutorial shows you howto download and install the MatriX XMPP SDK. And howto login with the MiniClient example using your Gmail Id.

You an find the screencasts here. More screencasts are coming soon…

Await MatriX

C# 5.0 brought us the great new Async and Await feature. It helps to avoid bottlenecks when it comes to performance or to improve the responsiveness of UI applications.

Both of them were never a problem in MatriX, because its completely asynchronous internal. We helped GUI developers a lot by handling all multi threading and invoking to GUI threads inside of MatriX.

But the traditional techniques for writing asynchronous code based on callbacks can be complicated, difficult to maintain, hard to debug, error prone, and often ends in the callback hell.

Here is an for requesting a vcard with the new async await API

var viq = new VcardIq { To = "bob@ag-software.net", Type = IqType.get };
var vcardResult = await xmppClient.IqFilter.SendIqAsync(viq);

Here is a more complex example of creating a MUC room containing the following steps.

  • request our reserved nickname
  • create the room with the requested nickname
  • request the room configuration
  • submit the room configuration

With the old async callback based API this simple task requires you to setup multiple callbacks or listen to multiple events. This splits your code in many different functions, or you use many inline lambdas. Error handling gets complicated and the control flow is hard to follow.

So look at the code with the new async await API. It looks like simple synchronous code. Easy to read with simple try/catch error handling, fully asynchronous. The compiler is doing all the complicated work for us.

try
{
    Jid roomJid = "dev@conference.ag-software.de";
    var nick = await mucManager.DiscoverReservedNicknameAsync(roomJid);
    var createResult = await mucManager.CreateRoomAsync(roomJid, nick);
    // check from createResult if the room requires configuration
    if (createResult.Error != null 
        && createResult.Error.Condition == ErrorCondition.ItemNotFound)
    {
        var roomConfig = await mucManager.RequestRoomConfigurationAsync(roomJid);
        var data = ProcessRoomConfig(roomConfig);
        var submitResult = await mucManager.SubmitRoomConfigurationAsync(roomJid, data);  
    }        
}
catch (TimeoutException ex)
{
     // handle exceptions here
}
catch (Exception ex)
{
     // handle exceptions here
}

Many of our customers are tied to older .NET versions and not able to use the latest and greatest features. This is the reason why we will offer separate builds for .NET 4.5 with the async API extensions, and .NET 3.5 builds.

We will upload new .NET 4.5 builds soon, so stay tuned. If you can’t await then contact us directly ;-)

Excellent SDK and support

I recently started using the MatriX SDK for a web-based chat in ASP.NET. I use it in combination with OpenFire and so far it seems like an excellent SDK that I will most likely buy and keep using.

They also give very good support via their forums. I had a problem with my implementation and they helped me identify the problem and fix it. They respond very fast to my forum posts and give useful information.

Gilian Keulens, Obec Software Engineering B.V.

MatriX for WinRT released

Now with the availability of Windows 8 and the first Windows 8 devices we have released the WinRT version of MatriX to the public.

The API and supported features are nearly the same as in all our other MatriX editions.

Start to use the power of XMPP in your WinRT apps now!!

The WinRT version can be downloaded from here:
Download MatriX for WinRT

Research and Development

Matrix library is very awesome. We have already used it without a problem until now. The API is very great and very extensible. You can use the library even without looking at the documentation. Another great thing is the customer support, it’s awesome. Definitely a great library in .NET world.

Welly Tambunan, PT Petrolink Services R&D