-
Notifications
You must be signed in to change notification settings - Fork 1
Callbacks (Events)
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);
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);
}
}
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);
}
}
This is a pretty feature that extends a context menu for a whole server, user or channel.
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);
}
}
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);