Stop NPC's getting hypergrid like names in some circumstances.

This meant punching in another AddUser() method in IUserManagement to do a direct name to UUID associated without the account check (since NPCs don't have accounts).
May address http://opensimulator.org/mantis/view.php?id=5645
bulletsim
Justin Clark-Casey (justincc) 2011-08-19 00:45:22 +01:00
parent 3146f4bae0
commit c9e6b7bd10
5 changed files with 103 additions and 30 deletions

View File

@ -186,7 +186,6 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
} }
} }
private string[] GetUserNames(UUID uuid) private string[] GetUserNames(UUID uuid)
{ {
string[] returnstring = new string[2]; string[] returnstring = new string[2];
@ -292,6 +291,25 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
return userID.ToString(); return userID.ToString();
} }
public void AddUser(UUID uuid, string first, string last)
{
if (m_UserCache.ContainsKey(uuid))
return;
UserData user = new UserData();
user.Id = uuid;
user.FirstName = first;
user.LastName = last;
// user.ProfileURL = we should initialize this to the default
AddUserInternal(user);
}
public void AddUser(UUID uuid, string first, string last, string profileURL)
{
AddUser(uuid, profileURL + ";" + first + " " + last);
}
public void AddUser(UUID id, string creatorData) public void AddUser(UUID id, string creatorData)
{ {
if (m_UserCache.ContainsKey(id)) if (m_UserCache.ContainsKey(id))
@ -299,18 +317,17 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
// m_log.DebugFormat("[USER MANAGEMENT MODULE]: Adding user with id {0}, craetorData {1}", id, creatorData); // m_log.DebugFormat("[USER MANAGEMENT MODULE]: Adding user with id {0}, craetorData {1}", id, creatorData);
UserData user = new UserData();
user.Id = id;
UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, id); UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, id);
if (account != null) if (account != null)
{ {
user.FirstName = account.FirstName; AddUser(id, account.FirstName, account.LastName);
user.LastName = account.LastName;
// user.ProfileURL = we should initialize this to the default
} }
else else
{ {
UserData user = new UserData();
user.Id = id;
if (creatorData != null && creatorData != string.Empty) if (creatorData != null && creatorData != string.Empty)
{ {
//creatorData = <endpoint>;<name> //creatorData = <endpoint>;<name>
@ -338,17 +355,19 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
user.FirstName = "Unknown"; user.FirstName = "Unknown";
user.LastName = "User"; user.LastName = "User";
} }
AddUserInternal(user);
} }
lock (m_UserCache)
m_UserCache[id] = user;
m_log.DebugFormat("[USER MANAGEMENT MODULE]: Added user {0} {1} {2} {3}", user.Id, user.FirstName, user.LastName, user.HomeURL);
} }
public void AddUser(UUID uuid, string first, string last, string profileURL) void AddUserInternal(UserData user)
{ {
AddUser(uuid, profileURL + ";" + first + " " + last); lock (m_UserCache)
m_UserCache[user.Id] = user;
m_log.DebugFormat(
"[USER MANAGEMENT MODULE]: Added user {0} {1} {2} {3}",
user.Id, user.FirstName, user.LastName, user.HomeURL);
} }
//public void AddUser(UUID uuid, string userData) //public void AddUser(UUID uuid, string userData)

View File

@ -5,13 +5,48 @@ using OpenMetaverse;
namespace OpenSim.Region.Framework.Interfaces namespace OpenSim.Region.Framework.Interfaces
{ {
/// <summary>
/// This maintains the relationship between a UUID and a user name.
/// </summary>
public interface IUserManagement public interface IUserManagement
{ {
string GetUserName(UUID uuid); string GetUserName(UUID uuid);
string GetUserHomeURL(UUID uuid); string GetUserHomeURL(UUID uuid);
string GetUserUUI(UUID uuid); string GetUserUUI(UUID uuid);
string GetUserServerURL(UUID uuid, string serverType); string GetUserServerURL(UUID uuid, string serverType);
void AddUser(UUID uuid, string userData);
/// <summary>
/// Add a user.
/// </summary>
/// <remarks>
/// If an account is found for the UUID, then the names in this will be used rather than any information
/// extracted from creatorData.
/// </remarks>
/// <param name="uuid"></param>
/// <param name="creatorData">The creator data for this user.</param>
void AddUser(UUID uuid, string creatorData);
/// <summary>
/// Add a user.
/// </summary>
/// <remarks>
/// The UUID is related to the name without any other checks being performed, such as user account presence.
/// </remarks>
/// <param name="uuid"></param>
/// <param name="firstName"></param>
/// <param name="lastName"></param>
void AddUser(UUID uuid, string firstName, string lastName);
/// <summary>
/// Add a user.
/// </summary>
/// <remarks>
/// The arguments apart from uuid are formed into a creatorData string and processing proceeds as for the
/// AddUser(UUID uuid, string creatorData) method.
/// </remarks>
/// <param name="uuid"></param>
/// <param name="firstName"></param>
/// <param name="profileURL"></param>
void AddUser(UUID uuid, string firstName, string lastName, string profileURL); void AddUser(UUID uuid, string firstName, string lastName, string profileURL);
} }
} }

View File

@ -2582,12 +2582,13 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
if (GetScenePresence(client.AgentId) != null) ScenePresence createdSp = GetScenePresence(client.AgentId);
if (createdSp != null)
{ {
m_LastLogin = Util.EnvironmentTickCount(); m_LastLogin = Util.EnvironmentTickCount();
// Cache the user's name // Cache the user's name
CacheUserName(aCircuit); CacheUserName(createdSp, aCircuit);
EventManager.TriggerOnNewClient(client); EventManager.TriggerOnNewClient(client);
if (vialogin) if (vialogin)
@ -2595,28 +2596,41 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
private void CacheUserName(AgentCircuitData aCircuit) /// <summary>
/// Cache the user name for later use.
/// </summary>
/// <param name="sp"></param>
/// <param name="aCircuit"></param>
private void CacheUserName(ScenePresence sp, AgentCircuitData aCircuit)
{ {
IUserManagement uMan = RequestModuleInterface<IUserManagement>(); IUserManagement uMan = RequestModuleInterface<IUserManagement>();
if (uMan != null) if (uMan != null)
{ {
string homeURL = string.Empty;
string first = aCircuit.firstname, last = aCircuit.lastname; string first = aCircuit.firstname, last = aCircuit.lastname;
if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) if (sp.PresenceType == PresenceType.Npc)
homeURL = aCircuit.ServiceURLs["HomeURI"].ToString();
if (aCircuit.lastname.StartsWith("@"))
{ {
string[] parts = aCircuit.firstname.Split('.'); uMan.AddUser(aCircuit.AgentID, first, last);
if (parts.Length >= 2)
{
first = parts[0];
last = parts[1];
}
} }
else
{
string homeURL = string.Empty;
uMan.AddUser(aCircuit.AgentID, first, last, homeURL); if (aCircuit.ServiceURLs.ContainsKey("HomeURI"))
homeURL = aCircuit.ServiceURLs["HomeURI"].ToString();
if (aCircuit.lastname.StartsWith("@"))
{
string[] parts = aCircuit.firstname.Split('.');
if (parts.Length >= 2)
{
first = parts[0];
last = parts[1];
}
}
uMan.AddUser(aCircuit.AgentID, first, last, homeURL);
}
} }
} }

View File

@ -34,6 +34,7 @@ using OpenMetaverse;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Framework.Communications; using OpenSim.Framework.Communications;
using OpenSim.Region.CoreModules.Avatar.AvatarFactory; using OpenSim.Region.CoreModules.Avatar.AvatarFactory;
using OpenSim.Region.CoreModules.Framework.UserManagement;
using OpenSim.Region.CoreModules.ServiceConnectorsOut.Avatar; using OpenSim.Region.CoreModules.ServiceConnectorsOut.Avatar;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
@ -57,8 +58,10 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
config.Configs["NPC"].Set("Enabled", "true"); config.Configs["NPC"].Set("Enabled", "true");
AvatarFactoryModule afm = new AvatarFactoryModule(); AvatarFactoryModule afm = new AvatarFactoryModule();
UserManagementModule umm = new UserManagementModule();
TestScene scene = SceneHelpers.SetupScene(); TestScene scene = SceneHelpers.SetupScene();
SceneHelpers.SetupSceneModules(scene, config, afm, new NPCModule()); SceneHelpers.SetupSceneModules(scene, config, afm, umm, new NPCModule());
ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1));
// ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId); // ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId);
@ -81,6 +84,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
Assert.That(npc, Is.Not.Null); Assert.That(npc, Is.Not.Null);
Assert.That(npc.Appearance.Texture.FaceTextures[8].TextureID, Is.EqualTo(originalFace8TextureId)); Assert.That(npc.Appearance.Texture.FaceTextures[8].TextureID, Is.EqualTo(originalFace8TextureId));
Assert.That(umm.GetUserName(npc.UUID), Is.EqualTo(string.Format("{0} {1}", npc.Firstname, npc.Lastname)));
} }
[Test] [Test]

View File

@ -331,6 +331,7 @@ namespace OpenSim.Tests.Common
agentData.InventoryFolder = UUID.Zero; agentData.InventoryFolder = UUID.Zero;
agentData.startpos = Vector3.Zero; agentData.startpos = Vector3.Zero;
agentData.CapsPath = "http://wibble.com"; agentData.CapsPath = "http://wibble.com";
agentData.ServiceURLs = new Dictionary<string, object>();
return agentData; return agentData;
} }