* 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
parent
aac7c1dda5
commit
34073607a2
|
@ -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; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue