* Turned Friends Module into a shared module (to comply with Scene.AddXmlRPCHandler being shared).

* Fixed a null ref issue in Scene.Close()
0.6.0-stable
Teravus Ovares 2008-02-27 17:41:42 +00:00
parent aac7c1dda5
commit 34073607a2
2 changed files with 73 additions and 13 deletions

View File

@ -35,6 +35,7 @@ using OpenSim.Framework.Console;
using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Scenes;
using libsecondlife;
using Nwc.XmlRpc;
namespace OpenSim.Region.Environment.Modules
{
@ -42,17 +43,31 @@ namespace OpenSim.Region.Environment.Modules
{
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private Scene m_scene;
private List<Scene> m_scene = new List<Scene>();
Dictionary<LLUUID, LLUUID> m_pendingFriendRequests = new Dictionary<LLUUID, LLUUID>();
public void Initialise(Scene scene, IConfigSource config)
{
m_scene = scene;
lock (m_scene)
{
if (m_scene.Count == 0)
{
scene.AddXmlRPCHandler("presence_update", processPresenceUpdate);
}
if (!m_scene.Contains(scene))
m_scene.Add(scene);
}
scene.EventManager.OnNewClient += OnNewClient;
scene.EventManager.OnGridInstantMessageToFriendsModule += OnGridInstantMessage;
}
public XmlRpcResponse processPresenceUpdate(XmlRpcRequest req)
{
m_log.Info("[FRIENDS]: Got Notification about a user! OMG");
return new XmlRpcResponse();
}
private void OnNewClient(IClientAPI client)
{
// All friends establishment protocol goes over instant message
@ -112,7 +127,8 @@ namespace OpenSim.Region.Environment.Modules
msg.Position = new sLLVector3(Position);
msg.RegionID = RegionID.UUID;
msg.binaryBucket = binaryBucket;
m_scene.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule);
// We don't really care which scene we pipe it through.
m_scene[0].TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule);
}
// 39 == Accept Friendship
@ -133,6 +149,14 @@ namespace OpenSim.Region.Environment.Modules
if (m_pendingFriendRequests.ContainsKey(transactionID))
{
// Found Pending Friend Request with that Transaction..
Scene SceneAgentIn = m_scene[0];
// Found Pending Friend Request with that Transaction..
ScenePresence agentpresence = GetPresenceFromAgentID(agentID);
if (agentpresence != null)
{
SceneAgentIn = agentpresence.Scene;
}
// Compose response to other agent.
GridInstantMessage msg = new GridInstantMessage();
@ -145,13 +169,15 @@ namespace OpenSim.Region.Environment.Modules
msg.message = agentID.UUID.ToString();
msg.ParentEstateID = 0;
msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
msg.RegionID = m_scene.RegionInfo.RegionID.UUID;
msg.RegionID = SceneAgentIn.RegionInfo.RegionID.UUID;
msg.dialog = (byte)39;// Approved friend request
msg.Position = new sLLVector3();
msg.offline = (byte)0;
msg.binaryBucket = new byte[0];
m_scene.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule);
m_scene.StoreAddFriendship(m_pendingFriendRequests[transactionID], agentID, (uint)1);
// We don't really care which scene we pipe it through, it goes to the shared IM Module and/or the database
SceneAgentIn.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule);
SceneAgentIn.StoreAddFriendship(m_pendingFriendRequests[transactionID], agentID, (uint)1);
m_pendingFriendRequests.Remove(transactionID);
// TODO: Inform agent that the friend is online
@ -162,8 +188,14 @@ namespace OpenSim.Region.Environment.Modules
{
if (m_pendingFriendRequests.ContainsKey(transactionID))
{
// Found Pending Friend Request with that Transaction..
Scene SceneAgentIn = m_scene[0];
// Found Pending Friend Request with that Transaction..
ScenePresence agentpresence = GetPresenceFromAgentID(agentID);
if (agentpresence != null)
{
SceneAgentIn = agentpresence.Scene;
}
// Compose response to other agent.
GridInstantMessage msg = new GridInstantMessage();
msg.toAgentID = m_pendingFriendRequests[transactionID].UUID;
@ -175,19 +207,19 @@ namespace OpenSim.Region.Environment.Modules
msg.message = agentID.UUID.ToString();
msg.ParentEstateID = 0;
msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
msg.RegionID = m_scene.RegionInfo.RegionID.UUID;
msg.RegionID = SceneAgentIn.RegionInfo.RegionID.UUID;
msg.dialog = (byte)40;// Deny friend request
msg.Position = new sLLVector3();
msg.offline = (byte)0;
msg.binaryBucket = new byte[0];
m_scene.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule);
SceneAgentIn.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule);
m_pendingFriendRequests.Remove(transactionID);
}
}
private void OnTerminateFriendship(IClientAPI client, LLUUID agent, LLUUID exfriendID)
{
m_scene.StoreRemoveFriendship(agent, exfriendID);
m_scene[0].StoreRemoveFriendship(agent, exfriendID);
// TODO: Inform the client that the ExFriend is offline
}
@ -201,6 +233,29 @@ namespace OpenSim.Region.Environment.Modules
msg.binaryBucket);
}
private ScenePresence GetPresenceFromAgentID(LLUUID AgentID)
{
ScenePresence returnAgent = null;
lock (m_scene)
{
ScenePresence queryagent = null;
for (int i = 0; i < m_scene.Count; i++)
{
queryagent = m_scene[i].GetScenePresence(AgentID);
if (queryagent != null)
{
if (!queryagent.IsChildAgent)
{
returnAgent = queryagent;
break;
}
}
}
}
return returnAgent;
}
public void PostInitialise()
{
}
@ -216,7 +271,7 @@ namespace OpenSim.Region.Environment.Modules
public bool IsSharedModule
{
get { return false; }
get { return true; }
}
}
}

View File

@ -1466,7 +1466,12 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="agentID"></param>
public override void RemoveClient(LLUUID agentID)
{
bool childagentYN = false;
ScenePresence avatar = GetScenePresence(agentID);
if (avatar != null)
{
childagentYN = avatar.IsChildAgent;
}
try
{
if (avatar.IsChildAgent)
@ -1555,7 +1560,7 @@ namespace OpenSim.Region.Environment.Scenes
}
// Remove client agent from profile, so new logins will work
if (!avatar.IsChildAgent)
if (!childagentYN)
{
m_sceneGridService.ClearUserAgent(agentID);
}