* 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.Interfaces;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using libsecondlife; using libsecondlife;
using Nwc.XmlRpc;
namespace OpenSim.Region.Environment.Modules 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 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>(); Dictionary<LLUUID, LLUUID> m_pendingFriendRequests = new Dictionary<LLUUID, LLUUID>();
public void Initialise(Scene scene, IConfigSource config) 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.OnNewClient += OnNewClient;
scene.EventManager.OnGridInstantMessageToFriendsModule += OnGridInstantMessage; 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) private void OnNewClient(IClientAPI client)
{ {
// All friends establishment protocol goes over instant message // All friends establishment protocol goes over instant message
@ -112,7 +127,8 @@ namespace OpenSim.Region.Environment.Modules
msg.Position = new sLLVector3(Position); msg.Position = new sLLVector3(Position);
msg.RegionID = RegionID.UUID; msg.RegionID = RegionID.UUID;
msg.binaryBucket = binaryBucket; 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 // 39 == Accept Friendship
@ -133,6 +149,14 @@ namespace OpenSim.Region.Environment.Modules
if (m_pendingFriendRequests.ContainsKey(transactionID)) if (m_pendingFriendRequests.ContainsKey(transactionID))
{ {
// Found Pending Friend Request with that Transaction.. // 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. // Compose response to other agent.
GridInstantMessage msg = new GridInstantMessage(); GridInstantMessage msg = new GridInstantMessage();
@ -145,13 +169,15 @@ namespace OpenSim.Region.Environment.Modules
msg.message = agentID.UUID.ToString(); msg.message = agentID.UUID.ToString();
msg.ParentEstateID = 0; msg.ParentEstateID = 0;
msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 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.dialog = (byte)39;// Approved friend request
msg.Position = new sLLVector3(); msg.Position = new sLLVector3();
msg.offline = (byte)0; msg.offline = (byte)0;
msg.binaryBucket = new byte[0]; msg.binaryBucket = new byte[0];
m_scene.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule); // We don't really care which scene we pipe it through, it goes to the shared IM Module and/or the database
m_scene.StoreAddFriendship(m_pendingFriendRequests[transactionID], agentID, (uint)1);
SceneAgentIn.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule);
SceneAgentIn.StoreAddFriendship(m_pendingFriendRequests[transactionID], agentID, (uint)1);
m_pendingFriendRequests.Remove(transactionID); m_pendingFriendRequests.Remove(transactionID);
// TODO: Inform agent that the friend is online // TODO: Inform agent that the friend is online
@ -162,8 +188,14 @@ namespace OpenSim.Region.Environment.Modules
{ {
if (m_pendingFriendRequests.ContainsKey(transactionID)) 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. // Compose response to other agent.
GridInstantMessage msg = new GridInstantMessage(); GridInstantMessage msg = new GridInstantMessage();
msg.toAgentID = m_pendingFriendRequests[transactionID].UUID; msg.toAgentID = m_pendingFriendRequests[transactionID].UUID;
@ -175,19 +207,19 @@ namespace OpenSim.Region.Environment.Modules
msg.message = agentID.UUID.ToString(); msg.message = agentID.UUID.ToString();
msg.ParentEstateID = 0; msg.ParentEstateID = 0;
msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 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.dialog = (byte)40;// Deny friend request
msg.Position = new sLLVector3(); msg.Position = new sLLVector3();
msg.offline = (byte)0; msg.offline = (byte)0;
msg.binaryBucket = new byte[0]; msg.binaryBucket = new byte[0];
m_scene.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule); SceneAgentIn.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule);
m_pendingFriendRequests.Remove(transactionID); m_pendingFriendRequests.Remove(transactionID);
} }
} }
private void OnTerminateFriendship(IClientAPI client, LLUUID agent, LLUUID exfriendID) 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 // TODO: Inform the client that the ExFriend is offline
} }
@ -201,6 +233,29 @@ namespace OpenSim.Region.Environment.Modules
msg.binaryBucket); 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() public void PostInitialise()
{ {
} }
@ -216,7 +271,7 @@ namespace OpenSim.Region.Environment.Modules
public bool IsSharedModule public bool IsSharedModule
{ {
get { return false; } get { return true; }
} }
} }
} }

View File

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