public byte[] RestGetMumbleServerInfo(IScene scene, string request,
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
{
if (m_murmurd_host == null)
{
httpResponse.StatusCode = 404;
httpResponse.StatusDescription = "Not Found";
string message = "[MUMBLE VOIP]: Server info request from " + httpRequest.RemoteIPEndPoint.Address + ". Cannot send response, module is not configured properly.";
m_log.Warn(message);
return Encoding.UTF8.GetBytes("Mumble server info is not available.");
}
if (httpRequest.Headers.GetValues("avatar_uuid") == null)
{
httpResponse.StatusCode = 400;
httpResponse.StatusDescription = "Bad Request";
string message = "[MUMBLE VOIP]: Invalid server info request from " + httpRequest.RemoteIPEndPoint.Address + "";
m_log.Warn(message);
return Encoding.UTF8.GetBytes("avatar_uuid header is missing");
}
string[] strings = httpRequest.Headers.GetValues("avatar_uuid");
if (strings != null)
{
string avatar_uuid = strings[0];
string responseBody = String.Empty;
UUID avatarId;
if (UUID.TryParse(avatar_uuid, out avatarId))
{
if (scene == null) throw new Exception("[MurmurVoice] Invalid scene.");
Agent agent = GetServerManager(scene).Agent.GetOrCreate(avatarId);
string channel_uri;
IScenePresence avatar = scene.GetScenePresence(avatarId);
// get channel_uri: check first whether estate
// settings allow voice, then whether parcel allows
// voice, if all do retrieve or obtain the parcel
// voice channel
LandData land = scene.RequestModuleInterface<IParcelManagementModule>().GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y).LandData;
m_log.DebugFormat("[MurmurVoice] region \"{0}\": Parcel \"{1}\" ({2}): avatar \"{3}\": request: {4}",
scene.RegionInfo.RegionName, land.Name, land.LocalID, avatar.Name, request);
if (/*((land.Flags & (uint)ParcelFlags.AllowVoiceChat) > 0) && */scene.RegionInfo.EstateSettings.AllowVoice)
{
agent.channel = GetServerManager(scene).Channel.GetOrCreate(ChannelName(scene, land));
// Host/port pair for voice server
channel_uri = String.Format("{0}:{1}", m_murmurd_host, m_murmurd_port);
if (agent.session > 0)
{
User state = GetServerManager(scene).Server.getState(agent.session);
GetServerCallback(scene).AddUserToChan(state, agent.channel);
}
m_log.InfoFormat("[MurmurVoice] {0}", channel_uri);
}
else
{
m_log.DebugFormat("[MurmurVoice] Voice not enabled.");
channel_uri = "";
}
const string m_context = "Mumble voice system";
httpResponse.AddHeader("Mumble-Server", m_murmurd_host);
httpResponse.AddHeader("Mumble-Version", m_server_version);
httpResponse.AddHeader("Mumble-Channel", channel_uri);
httpResponse.AddHeader("Mumble-User", avatar_uuid);
httpResponse.AddHeader("Mumble-Password", agent.pass);
httpResponse.AddHeader("Mumble-Avatar-Id", avatar_uuid);
httpResponse.AddHeader("Mumble-Context-Id", m_context);
responseBody += "Mumble-Server: " + m_murmurd_host + "\n";
responseBody += "Mumble-Version: " + m_server_version + "\n";
responseBody += "Mumble-Channel: " + channel_uri + "\n";
responseBody += "Mumble-User: " + avatar_uuid + "\n";
responseBody += "Mumble-Password: " + agent.pass + "\n";
responseBody += "Mumble-Avatar-Id: " + avatar_uuid + "\n";
responseBody += "Mumble-Context-Id: " + m_context + "\n";
string log_message = "[MUMBLE VOIP]: Server info request handled for " + httpRequest.RemoteIPEndPoint.Address + "";
m_log.Info(log_message);
}
else
{
httpResponse.StatusCode = 400;
httpResponse.StatusDescription = "Bad Request";
m_log.Warn("[MUMBLE VOIP]: Could not parse avatar uuid from request");
return Encoding.UTF8.GetBytes("could not parse avatar_uuid header");
}
return Encoding.UTF8.GetBytes(responseBody);
}
return Encoding.UTF8.GetBytes("Mumble server info is not available.");
}