Skip to content

Callbacks (Events)

HarpyWar edited this page May 29, 2017 · 1 revision

Warning! There is a critical performance issue with Ice .NET callbacks https://github.com/mumble-voip/mumble/issues/2779#issuecomment-302973638

Set callbackAddress = 127.0.0.1 if a server is running on the same machine, or 0.0.0.0 if connection to a remote server.

var instance = new MurmurAdapter.Adapter("1.3.0").Instance;
instance.Connect(address, port, secret, callbackAddress);

Instance Callback

Handle virtual server stop/start events.

var icb = new InstanceCallbackHandler();
instance.AddCallback(icb);
private class InstanceCallbackHandler : IInstanceCallbackHandler
{
	public void Started(IVirtualServer server)
	{
		Console.WriteLine("server {0} started", server.Id);
	}
	public void Stopped(IVirtualServer server)
	{
		Console.WriteLine("server {0} stopped", server.Id);
	}
}

VirtualServer Callback

Handle user/channel action/state events on a specified virtual server.

foreach (var server in instance.GetAllServers())
{
	var cb = new VirtualServerCallbackHandler();
	server.AddCallback(cb);
}
private class VirtualServerCallbackHandler : IVirtualServerCallbackHandler
{
	public void ChannelCreated(VirtualServerEntity.Channel channel, IVirtualServer server)
	{
		Console.WriteLine("channel {0} created on server {1}", channel.Name, server.Id);
	}

	public void ChannelRemoved(VirtualServerEntity.Channel channel, IVirtualServer server)
	{
		Console.WriteLine("channel {0} removed on server {1}", channel.Name, server.Id);
	}

	public void ChannelStateChanged(VirtualServerEntity.Channel channel, IVirtualServer server)
	{
		Console.WriteLine("channel {0} state changed on server {1}", channel.Name, server.Id);
	}

	public void UserConnected(VirtualServerEntity.OnlineUser user, IVirtualServer server)
	{
		Console.WriteLine("user {0} connected on server {1}", user.Name, server.Id);
	}

	public void UserDisconnected(VirtualServerEntity.OnlineUser user, IVirtualServer server)
	{
		Console.WriteLine("user {0} disconnected on server {1}", user.Name, server.Id);
	}

	public void UserStateChanged(VirtualServerEntity.OnlineUser user, IVirtualServer server)
	{
		Console.WriteLine("user {0} state changed on server {1}", user.Name, server.Id);
	}

	public void UserTextMessage(VirtualServerEntity.OnlineUser user, string message, IVirtualServer server)
	{
		Console.WriteLine("user {0} write message {1} on server {2}", user.Name, message, server.Id);
	}
}

VirtualServer Context Callback

This is a pretty feature that extends a context menu for a whole server, user or channel.

Murmur Context Callback

Usually this callback should be added in UserConnected event, so when a user connected we create a new menu item for his session. But you can come up with another uses.

private class VirtualServerCallbackHandler : IVirtualServerCallbackHandler
{
	public void UserConnected(VirtualServerEntity.OnlineUser user, IVirtualServer server)
	{
                var ccb = new VirtualServerContextCallbackHandler();
                // in this example we set a context for server and channel
                server.AddContextCallback(user.Session, "superaction", "My Super Menu Item", ccb, Context.Server | Context.Channel);
	}
	...
}

private class VirtualServerContextCallbackHandler : IVirtualServerContextCallbackHandler
{
    public void ContextAction(string action, VirtualServerEntity.OnlineUser user, int session, int channelId, IVirtualServer server)
    {
        Console.WriteLine("action from {0}, session {1}, channelId {2} on server {3}", user.Name, session, channelId, server.Id);
    }
}

Remove Callbacks

Callback removes automatically when a user disconnect (for VirtualServerCallback and VirtualServerContextCallback) or when a virtual server stops (InstanceCallback).

Sometimes you may want to remove a callback by force:

string cbid = server.AddCallback(cb); // return callback id
server.RemoveCallback(cbid);