* Committing more unfinished stuff. Nothing significant at the moment. IM related.

0.6.0-stable
Teravus Ovares 2008-06-01 10:05:22 +00:00
parent 52c55c8c23
commit d20cae2d03
5 changed files with 362 additions and 11 deletions

View File

@ -49,6 +49,8 @@ namespace OpenSim.Framework.Communications
/// <returns>A user profile. Returns null if no user profile is found.</returns> /// <returns>A user profile. Returns null if no user profile is found.</returns>
UserProfileData GetUserProfile(LLUUID userId); UserProfileData GetUserProfile(LLUUID userId);
UserAgentData GetAgentByUUID(LLUUID userId);
void clearUserAgent(LLUUID avatarID); void clearUserAgent(LLUUID avatarID);
List<AvatarPickerAvatar> GenerateAgentPickerRequestResponse(LLUUID QueryID, string Query); List<AvatarPickerAvatar> GenerateAgentPickerRequestResponse(LLUUID QueryID, string Query);

View File

@ -103,7 +103,20 @@ namespace OpenSim.Framework.Communications
return null; return null;
} }
public UserAgentData GetAgentByUUID(LLUUID userId)
{
foreach (KeyValuePair<string, IUserData> plugin in _plugins)
{
UserAgentData agent = plugin.Value.GetAgentByUUID(userId);
if (agent != null)
{
return agent;
}
}
return null;
}
// see IUserService // see IUserService
public UserProfileData GetUserProfile(LLUUID uuid) public UserProfileData GetUserProfile(LLUUID uuid)
{ {

View File

@ -420,6 +420,54 @@ namespace OpenSim.Grid.UserServer
return ProfileToXmlRPCResponse(userProfile); return ProfileToXmlRPCResponse(userProfile);
} }
public XmlRpcResponse XmlRPCGetAgentMethodUUID(XmlRpcRequest request)
{
XmlRpcResponse response = new XmlRpcResponse();
Hashtable requestData = (Hashtable)request.Params[0];
UserProfileData userProfile;
//CFK: this clogs the UserServer log and is not necessary at this time.
//CFK: Console.WriteLine("METHOD BY UUID CALLED");
if (requestData.Contains("avatar_uuid"))
{
LLUUID guess = LLUUID.Zero;
Helpers.TryParse((string)requestData["avatar_uuid"],out guess);
if (guess == LLUUID.Zero)
{
return CreateUnknownUserErrorResponse();
}
userProfile = GetUserProfile(guess);
if (userProfile == null)
{
return CreateUnknownUserErrorResponse();
}
// no agent???
if (userProfile.CurrentAgent == null)
{
return CreateUnknownUserErrorResponse();
}
Hashtable responseData = new Hashtable();
responseData["handle"]=userProfile.CurrentAgent.Handle.ToString();
responseData["session"]=userProfile.CurrentAgent.SessionID.ToString();
if (userProfile.CurrentAgent.AgentOnline)
responseData["agent_online"]="TRUE";
else
responseData["agent_online"]="FALSE";
response.Value = responseData;
}
else
{
return CreateUnknownUserErrorResponse();
}
return ProfileToXmlRPCResponse(userProfile);
}
public XmlRpcResponse XmlRpcResponseXmlRPCUpdateUserProfile(XmlRpcRequest request) public XmlRpcResponse XmlRpcResponseXmlRPCUpdateUserProfile(XmlRpcRequest request)

View File

@ -85,6 +85,58 @@ namespace OpenSim.Region.Communications.OGS1
(float) Convert.ToDecimal((string) data["home_look_z"])); (float) Convert.ToDecimal((string) data["home_look_z"]));
return userData; return userData;
}
/// <summary>
/// Get a user agent from the user server
/// </summary>
/// <param name="avatarID"></param>
/// <returns>null if the request fails</returns>
public UserAgentData GetAgentByUUID(LLUUID userId)
{
try
{
Hashtable param = new Hashtable();
param["avatar_uuid"] = userId.ToString();
IList parameters = new ArrayList();
parameters.Add(param);
XmlRpcRequest req = new XmlRpcRequest("get_agent_by_uuid", parameters);
XmlRpcResponse resp = req.Send(m_parent.NetworkServersInfo.UserURL, 6000);
Hashtable respData = (Hashtable) resp.Value;
if (respData.Contains("error_type"))
{
m_log.Warn("[GRID]: " +
"Error sent by user server when trying to get agent: (" +
(string) respData["error_type"] +
"): " + (string)respData["error_desc"]);
return null;
}
LLUUID sessionid = LLUUID.Zero;
UserAgentData userAgent = new UserAgentData();
userAgent.Handle = Convert.ToUInt64((string)respData["handle"]);
Helpers.TryParse((string)respData["sessionid"], out sessionid);
userAgent.SessionID = sessionid;
if ((string)respData["agent_online"] == "TRUE")
{
userAgent.AgentOnline = true;
}
else
{
userAgent.AgentOnline = false;
}
return userAgent;
}
catch (Exception e)
{
m_log.ErrorFormat(
"[OGS1 USER SERVICES]: Error when trying to fetch agent data by uuid from remote user server: {0}",
e);
}
return null;
} }
public AvatarAppearance ConvertXMLRPCDataToAvatarAppearance(Hashtable data) public AvatarAppearance ConvertXMLRPCDataToAvatarAppearance(Hashtable data)
@ -335,6 +387,7 @@ namespace OpenSim.Region.Communications.OGS1
return null; return null;
} }
public void clearUserAgent(LLUUID avatarID) public void clearUserAgent(LLUUID avatarID)
{ {
// TODO: implement // TODO: implement

View File

@ -27,7 +27,11 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection;
using System.Net;
using System.Threading;
using libsecondlife; using libsecondlife;
using log4net;
using Nini.Config; using Nini.Config;
using Nwc.XmlRpc; using Nwc.XmlRpc;
using OpenSim.Framework; using OpenSim.Framework;
@ -38,11 +42,15 @@ namespace OpenSim.Region.Environment.Modules.Avatar.InstantMessage
{ {
public class InstantMessageModule : IRegionModule public class InstantMessageModule : IRegionModule
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private readonly List<Scene> m_scenes = new List<Scene>(); private readonly List<Scene> m_scenes = new List<Scene>();
private Dictionary<LLUUID, ulong> m_userRegionMap = new Dictionary<LLUUID, ulong>();
#region IRegionModule Members #region IRegionModule Members
private bool gridmode = false; private bool gridmode = false;
public void Initialise(Scene scene, IConfigSource config) public void Initialise(Scene scene, IConfigSource config)
{ {
@ -150,14 +158,19 @@ namespace OpenSim.Region.Environment.Modules.Avatar.InstantMessage
return; return;
} }
} }
if (gridmode)
{
// Still here, try send via Grid
// TODO
if (client != null)
{
if (dialog != (byte)InstantMessageDialog.StartTyping && dialog != (byte)InstantMessageDialog.StopTyping && dialog != (byte)InstantMessageDialog.SessionDrop)
client.SendInstantMessage(toAgentID, fromAgentSession, "Unable to send instant message", fromAgentID, imSessionID, "System", (byte)InstantMessageDialog.BusyAutoResponse, (uint)Util.UnixTimeSinceEpoch());// SendAlertMessage("Unable to send instant message");
}
}
} }
if (gridmode)
{
// Still here, try send via Grid
// TODO
}
} }
// Trusty OSG1 called method. This method also gets called from the FriendsModule // Trusty OSG1 called method. This method also gets called from the FriendsModule
@ -174,6 +187,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.InstantMessage
} }
protected virtual XmlRpcResponse processXMLRPCGridInstantMessage(XmlRpcRequest request) protected virtual XmlRpcResponse processXMLRPCGridInstantMessage(XmlRpcRequest request)
{ {
bool successful = false;
// various rational defaults // various rational defaults
LLUUID fromAgentID = LLUUID.Zero; LLUUID fromAgentID = LLUUID.Zero;
LLUUID fromAgentSession = LLUUID.Zero; LLUUID fromAgentSession = LLUUID.Zero;
@ -185,7 +199,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.InstantMessage
byte dialog = (byte)0; byte dialog = (byte)0;
bool fromGroup = false; bool fromGroup = false;
byte offline = (byte)0; byte offline = (byte)0;
uint ParentEstateID; uint ParentEstateID=0;
LLVector3 Position = LLVector3.Zero; LLVector3 Position = LLVector3.Zero;
LLUUID RegionID = LLUUID.Zero ; LLUUID RegionID = LLUUID.Zero ;
byte[] binaryBucket = new byte[0]; byte[] binaryBucket = new byte[0];
@ -303,12 +317,48 @@ namespace OpenSim.Region.Environment.Modules.Avatar.InstantMessage
Position = new LLVector3(pos_x, pos_y, pos_z); Position = new LLVector3(pos_x, pos_y, pos_z);
binaryBucket = (byte[])requestData["binary_bucket"]; binaryBucket = (byte[])requestData["binary_bucket"];
GridInstantMessage gim = new GridInstantMessage();
gim.fromAgentID = fromAgentID.UUID;
gim.fromAgentName = fromAgentName;
gim.fromAgentSession = fromAgentSession.UUID;
gim.fromGroup = fromGroup;
gim.imSessionID = imSessionID.UUID;
gim.RegionID = RegionID.UUID;
gim.timestamp = timestamp;
gim.toAgentID = toAgentID.UUID;
gim.message = message;
gim.dialog = dialog;
gim.offline = offline;
gim.ParentEstateID = ParentEstateID;
gim.Position = new sLLVector3(Position);
gim.binaryBucket = binaryBucket;
foreach (Scene scene in m_scenes)
{
if (scene.Entities.ContainsKey(toAgentID) && scene.Entities[toAgentID] is ScenePresence)
{
// Local message
ScenePresence user = (ScenePresence)scene.Entities[toAgentID];
if (!user.IsChildAgent)
{
scene.EventManager.TriggerGridInstantMessage(gim, InstantMessageReceiver.FriendsModule | InstantMessageReceiver.GroupsModule | InstantMessageReceiver.IMModule);
}
}
}
OnGridInstantMessage(gim);
successful = true;
} }
return new XmlRpcResponse(); XmlRpcResponse resp = new XmlRpcResponse();
//(string) Hashtable respdata = new Hashtable();
//(string)requestData["message"]; if (successful)
respdata["success"] = "TRUE";
else
respdata["success"] = "FALSE";
resp.Value = respdata;
return resp;
} }
protected virtual void SendGridInstantMessageViaXMLRPC(IClientAPI client, LLUUID fromAgentID, protected virtual void SendGridInstantMessageViaXMLRPC(IClientAPI client, LLUUID fromAgentID,
@ -316,9 +366,194 @@ namespace OpenSim.Region.Environment.Modules.Avatar.InstantMessage
LLUUID imSessionID, uint timestamp, string fromAgentName, LLUUID imSessionID, uint timestamp, string fromAgentName,
string message, byte dialog, bool fromGroup, byte offline, string message, byte dialog, bool fromGroup, byte offline,
uint ParentEstateID, LLVector3 Position, LLUUID RegionID, uint ParentEstateID, LLVector3 Position, LLUUID RegionID,
byte[] binaryBucket) byte[] binaryBucket, ulong regionhandle, ulong prevRegionHandle)
{ {
UserAgentData upd = null;
bool lookupAgent = false;
lock (m_userRegionMap)
{
if (m_userRegionMap.ContainsKey(toAgentID) && prevRegionHandle == 0)
{
upd = new UserAgentData();
upd.AgentOnline = true;
upd.Handle = m_userRegionMap[toAgentID];
}
else
{
lookupAgent = true;
}
}
if (lookupAgent)
{
upd = m_scenes[0].CommsManager.UserService.GetAgentByUUID(toAgentID);
// check if we've tried this before..
if (upd.Handle == prevRegionHandle)
{
m_log.Error("[GRID INSTANT MESSAGE]: Unable to deliver an instant message");
if (client != null)
client.SendInstantMessage(toAgentID, fromAgentSession, "Unable to send instant message", fromAgentID, imSessionID, "System", (byte)InstantMessageDialog.MessageFromObject,(uint)Util.UnixTimeSinceEpoch());// SendAlertMessage("Unable to send instant message");
return;
}
}
if (upd != null)
{
if (upd.AgentOnline)
{
RegionInfo reginfo = m_scenes[0].CommsManager.GridService.RequestNeighbourInfo(upd.Handle);
if (reginfo != null)
{
GridInstantMessage msg = new GridInstantMessage();
msg.fromAgentID = fromAgentID.UUID;
msg.fromAgentSession = fromAgentSession.UUID;
msg.toAgentID = toAgentID.UUID;
msg.imSessionID = imSessionID.UUID;
msg.timestamp = timestamp;
msg.fromAgentName = fromAgentName;
msg.message = message;
msg.dialog = dialog;
msg.fromGroup = fromGroup;
msg.offline = offline;
msg.ParentEstateID = ParentEstateID;
msg.Position = new sLLVector3(Position);
msg.RegionID = RegionID.UUID;
msg.binaryBucket = binaryBucket;
Hashtable msgdata = ConvertGridInstantMessageToXMLRPC(msg);
msgdata["region_handle"] = getLocalRegionHandleFromUUID(RegionID);
bool imresult = doIMSending(reginfo, msgdata);
if (imresult)
{
lock (m_userRegionMap)
{
if (m_userRegionMap.ContainsKey(toAgentID))
{
m_userRegionMap[toAgentID] = upd.Handle;
}
else
{
m_userRegionMap.Add(toAgentID, upd.Handle);
}
}
m_log.Info("[GRID INSTANT MESSAGE]: Successfully sent a message");
}
else
{
// try again, but lookup user this time.
SendGridInstantMessageViaXMLRPC(client, fromAgentID,
fromAgentSession, toAgentID,
imSessionID, timestamp, fromAgentName,
message, dialog, fromGroup, offline,
ParentEstateID, Position, RegionID,
binaryBucket, regionhandle, upd.Handle);
}
}
}
else
{
// send Agent Offline message
if (client != null)
client.SendInstantMessage(toAgentID, fromAgentSession, "Unable to send instant message", fromAgentID, imSessionID, "System", (byte)InstantMessageDialog.MessageFromObject, (uint)Util.UnixTimeSinceEpoch());// SendAlertMessage("Unable to send instant message");
}
}
else
{
// send Agent Offline message
if (client != null)
client.SendInstantMessage(toAgentID, fromAgentSession, "Unable to send instant message", fromAgentID, imSessionID, "System", (byte)InstantMessageDialog.MessageFromObject, (uint)Util.UnixTimeSinceEpoch());// SendAlertMessage("Unable to send instant message");
}
} }
private bool doIMSending(RegionInfo reginfo, Hashtable xmlrpcdata)
{
ArrayList SendParams = new ArrayList();
SendParams.Add(xmlrpcdata);
XmlRpcRequest GridReq = new XmlRpcRequest("grid_instant_message", SendParams);
try
{
XmlRpcResponse GridResp = GridReq.Send("http://" + reginfo.ExternalHostName + ":" + reginfo.HttpPort, 3000);
Hashtable responseData = (Hashtable)GridResp.Value;
if (responseData.ContainsKey("success"))
{
if ((string)responseData["success"] == "TRUE")
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
catch (WebException)
{
m_log.ErrorFormat("[GRID INSTANT MESSAGE]: Error sending message to {0} the host didn't respond", "http://" + reginfo.ExternalHostName + ":" + reginfo.HttpPort);
}
return false;
}
private ulong getLocalRegionHandleFromUUID(LLUUID regionID)
{
ulong returnhandle = 0;
lock (m_scenes)
{
foreach (Scene sn in m_scenes)
{
if (sn.RegionInfo.RegionID == regionID)
{
returnhandle = sn.RegionInfo.RegionHandle;
break;
}
}
}
return returnhandle;
}
private Hashtable ConvertGridInstantMessageToXMLRPC(GridInstantMessage msg)
{
Hashtable gim = new Hashtable();
gim["from_agent_id"] = msg.fromAgentID.ToString();
gim["from_agent_session"] = msg.fromAgentSession.ToString();
gim["to_agent_id"] = msg.toAgentID.ToString();
gim["im_session_id"] = msg.imSessionID.ToString();
gim["timestamp"] = msg.timestamp.ToString();
gim["from_agent_name"] = msg.fromAgentName;
gim["message"] = msg.message;
gim["dialog"] = msg.dialog;
if (msg.fromGroup)
gim["from_group"] = "TRUE";
else
gim["from_group"] = "FALSE";
gim["offline"] = msg.offline;
gim["parent_estate_id"] = msg.ParentEstateID.ToString();
gim["position_x"] = msg.Position.x.ToString();
gim["position_y"] = msg.Position.y.ToString();
gim["position_z"] = msg.Position.z.ToString();
gim["region_id"] = msg.RegionID.ToString();
gim["binary_bucket"] = msg.binaryBucket;
return gim;
}
} }
} }