From 43eab5e16338b37defc2ae7113f41f2b37690718 Mon Sep 17 00:00:00 2001 From: Dev Random Date: Tue, 1 Apr 2014 08:56:05 -0400 Subject: Console command to rename Estate --- .../World/Estate/EstateManagementCommands.cs | 223 ++++++++------ .../World/Estate/EstateManagementModule.cs | 323 ++++++++++++--------- 2 files changed, 325 insertions(+), 221 deletions(-) (limited to 'OpenSim/Region/CoreModules/World') diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs index 59dd3bb..4c65ce3 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs @@ -54,14 +54,9 @@ namespace OpenSim.Region.CoreModules.World.Estate protected Commander m_commander = new Commander("estate"); - // variable used in processing "estate set owner" - private static string[] m_ownerCmd = null; - - // variable used in processing "estate set owner" - private static UserAccount m_ownerAccount; - - // variable used in processing "estate set owner" - private static List m_ownerEstates; + // used to prevent multiple processing of commands when called from root region + private static string[] m_currentCmd = null; + private static EstateSettings m_estateSettings = null; public EstateManagementCommands(EstateManagementModule module) { @@ -92,18 +87,22 @@ namespace OpenSim.Region.CoreModules.World.Estate "Specify -1 in or to wildcard that coordinate.", consoleSetWaterHeight); - m_module.Scene.AddCommand( "Estates", m_module, "estate show", "estate show", "Shows all estates on the simulator.", ShowEstatesCommand); m_module.Scene.AddCommand( - "Estates", m_module, "estate set owner", "estate set owner [ | ]", - "Sets the owner of the current region's estate to the specified UUID or user. " + - "If called from root region, all estates will be prompted for change.", SetEstateOwnerCommand); + "Estates", m_module, "estate set owner", "estate set owner [ | ]", + "Sets the owner of the specified estate to the specified UUID or user. ", SetEstateOwnerCommand); + + m_module.Scene.AddCommand( + "Estates", m_module, "estate set name", "estate set name ", + "Sets the name of the specified estate to the specified value. " + + "New name must be unique.", SetEstateNameCommand); } public void Close() {} - + + #region CommandHandlers protected void consoleSetTerrainTexture(string module, string[] args) { string num = args[3]; @@ -248,112 +247,170 @@ namespace OpenSim.Region.CoreModules.World.Estate EstateSettings es = m_module.Scene.RegionInfo.EstateSettings; - if(args != m_ownerCmd) + if (args == m_currentCmd) { - // new command... clear out the old values - m_ownerCmd = args; - m_ownerEstates = new List(); - m_ownerAccount = null; - } + // HACK to propagate new estate info to Scene Regions + if (m_estateSettings != null && es.EstateID == m_estateSettings.EstateID) + es.EstateOwner = m_estateSettings.EstateOwner; - if (MainConsole.Instance.ConsoleScene == null) - { - if(m_ownerEstates.Contains(es.EstateID)) - { - // already checked this one - return; - } - else if(m_ownerEstates.Count > 0 && m_ownerAccount == null) - { - // lookup will have been tried and not found. - return; - } - // flag this estate, so it is not tried multiple times - m_ownerEstates.Add(es.EstateID); + return; } - else if(MainConsole.Instance.ConsoleScene != m_module.Scene) + + // new command... clear out the old value + m_currentCmd = args; + + if (args.Length == 3) { - // trying to process a single region, and this isn't it - return; + response = "No estate specified."; } - UserAccount account = null; - if(m_ownerAccount == null) + else { - if(args.Length == 3) + int estateId; + if (!int.TryParse(args[3], out estateId)) { - response = "No user specified."; + response = String.Format("\"{0}\" is not a valid ID for an Estate", args[3]); } else { - // TODO: Is there a better choice here? - UUID scopeID = UUID.Zero; - - string s1 = args[3]; - if(args.Length == 4) + if (args.Length == 4) { - // attempt to get account by UUID - UUID u; - if(UUID.TryParse(s1, out u)) + response = "No user specified."; + } + else + { + UserAccount account = null; + + // TODO: Is there a better choice here? + UUID scopeID = UUID.Zero; + + string s1 = args[4]; + if (args.Length == 5) { - account = m_module.Scene.UserAccountService.GetUserAccount(scopeID, u); - if(account == null) + // attempt to get account by UUID + UUID u; + if (UUID.TryParse(s1, out u)) + { + account = m_module.Scene.UserAccountService.GetUserAccount(scopeID, u); + if (account == null) + response = String.Format("Could not find user {0}", s1); + } + else { - response = String.Format("Could not find user {0}", s1); + response = String.Format("Invalid UUID {0}", s1); } } else { - response = String.Format("Invalid UUID {0}", s1); - account = null; + // attempt to get account by Firstname, Lastname + string s2 = args[5]; + account = m_module.Scene.UserAccountService.GetUserAccount(scopeID, s1, s2); + if (account == null) + response = String.Format("Could not find user {0} {1}", s1, s2); } - } - else - { - // attempt to get account by Firstname, Lastname - string s2 = args[4]; - account = m_module.Scene.UserAccountService.GetUserAccount(scopeID, s1, s2); - if(account == null) + + // If it's valid, send it off for processing. + if (account != null) + response = m_module.SetEstateOwner(estateId, account); + + if (response == String.Empty) + { + response = String.Format("Estate owner changed to {0} ({1} {2})", account.PrincipalID, account.FirstName, account.LastName); + + // save data for propagation to other Scene Regions + m_estateSettings = new EstateSettings(); + m_estateSettings.EstateID = (uint)estateId; + m_estateSettings.EstateOwner = account.PrincipalID; + + // update current Scene Region if appropriate + if (es.EstateID == estateId) + es.EstateOwner = account.PrincipalID; + } + else { - response = String.Format("Could not find user {0} {1}", s1, s2); + m_estateSettings = null; } } } } - else + + // give the user some feedback + if (response != null) + MainConsole.Instance.Output(response); + } + + protected void SetEstateNameCommand(string module, string[] args) + { + string response = null; + + EstateSettings es = m_module.Scene.RegionInfo.EstateSettings; + + if (args == m_currentCmd) { - account = m_ownerAccount; + // HACK to propagate new estate info to Scene Regions + if (m_estateSettings != null && es.EstateID == m_estateSettings.EstateID) + es.EstateName = m_estateSettings.EstateName; + + return; } - if(account != null) - { - if (MainConsole.Instance.ConsoleScene == null) - m_ownerAccount = account; - string choice; - do - { - // Get user confirmation, in case there are multiple estates involved (from root) - choice = MainConsole.Instance.CmdPrompt( - string.Format("Change owner of Estate {0} ({1}) [y/n]? ",es.EstateID, es.EstateName), - "Y"); + // new command... clear out the old value + m_currentCmd = args; - if("y".Equals(choice, StringComparison.OrdinalIgnoreCase)) + if (args.Length == 3) + { + response = "No estate specified."; + } + else + { + int estateId; + if (!int.TryParse(args[3], out estateId)) + { + response = String.Format("\"{0}\" is not a valid ID for an Estate", args[3]); + } + else + { + if (args.Length == 4) { - response = m_module.setEstateOwner((int)es.EstateID, account); + response = "No name specified."; } - else if(!"n".Equals(choice, StringComparison.OrdinalIgnoreCase)) + else { - MainConsole.Instance.Output("Invalid response. Please select y or n."); - choice = null; + // everything after the estate ID is "name" + StringBuilder sb = new StringBuilder(args[4]); + for (int i = 5; i < args.Length; i++) + sb.Append (" " + args[i]); + + string estateName = sb.ToString(); + + // send it off for processing. + response = m_module.SetEstateName(estateId, estateName); + + if (response == String.Empty) + { + response = String.Format("Estate {0} renamed from \"{1}\" to \"{2}\"", estateId, es.EstateName, estateName); + + // save data for propagation to other Scene Regions + m_estateSettings = new EstateSettings(); + m_estateSettings.EstateID = (uint)estateId; + m_estateSettings.EstateName = estateName; + + // update current Scene Region if appropriate + if (es.EstateID == estateId) + es.EstateName = estateName; + } + else + { + m_estateSettings = null; + } } } - while(choice == null); } - - // Give the user some feedback - if(response != null) + // give the user some feedback + if (response != null) MainConsole.Instance.Output(response); } + #endregion } } \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 9e6d0fc..ae956e6 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -68,8 +68,6 @@ namespace OpenSim.Region.CoreModules.World.Estate public event ChangeDelegate OnEstateInfoChange; public event MessageDelegate OnEstateMessage; - private int m_delayCount = 0; - #region Region Module interface public string Name { get { return "EstateManagementModule"; } } @@ -117,6 +115,189 @@ namespace OpenSim.Region.CoreModules.World.Estate #endregion + #region IEstateModule Functions + public uint GetRegionFlags() + { + RegionFlags flags = RegionFlags.None; + + // Fully implemented + // + if (Scene.RegionInfo.RegionSettings.AllowDamage) + flags |= RegionFlags.AllowDamage; + if (Scene.RegionInfo.RegionSettings.BlockTerraform) + flags |= RegionFlags.BlockTerraform; + if (!Scene.RegionInfo.RegionSettings.AllowLandResell) + flags |= RegionFlags.BlockLandResell; + if (Scene.RegionInfo.RegionSettings.DisableCollisions) + flags |= RegionFlags.SkipCollisions; + if (Scene.RegionInfo.RegionSettings.DisableScripts) + flags |= RegionFlags.SkipScripts; + if (Scene.RegionInfo.RegionSettings.DisablePhysics) + flags |= RegionFlags.SkipPhysics; + if (Scene.RegionInfo.RegionSettings.BlockFly) + flags |= RegionFlags.NoFly; + if (Scene.RegionInfo.RegionSettings.RestrictPushing) + flags |= RegionFlags.RestrictPushObject; + if (Scene.RegionInfo.RegionSettings.AllowLandJoinDivide) + flags |= RegionFlags.AllowParcelChanges; + if (Scene.RegionInfo.RegionSettings.BlockShowInSearch) + flags |= RegionFlags.BlockParcelSearch; + + if (Scene.RegionInfo.RegionSettings.FixedSun) + flags |= RegionFlags.SunFixed; + if (Scene.RegionInfo.RegionSettings.Sandbox) + flags |= RegionFlags.Sandbox; + if (Scene.RegionInfo.EstateSettings.AllowVoice) + flags |= RegionFlags.AllowVoice; + if (Scene.RegionInfo.EstateSettings.AllowLandmark) + flags |= RegionFlags.AllowLandmark; + if (Scene.RegionInfo.EstateSettings.AllowSetHome) + flags |= RegionFlags.AllowSetHome; + if (Scene.RegionInfo.EstateSettings.BlockDwell) + flags |= RegionFlags.BlockDwell; + if (Scene.RegionInfo.EstateSettings.ResetHomeOnTeleport) + flags |= RegionFlags.ResetHomeOnTeleport; + + + // TODO: SkipUpdateInterestList + + // Omitted + // + // Omitted: NullLayer (what is that?) + // Omitted: SkipAgentAction (what does it do?) + + return (uint)flags; + } + + public bool IsManager(UUID avatarID) + { + if (avatarID == Scene.RegionInfo.EstateSettings.EstateOwner) + return true; + + List ems = new List(Scene.RegionInfo.EstateSettings.EstateManagers); + if (ems.Contains(avatarID)) + return true; + + return false; + } + + public void sendRegionHandshakeToAll() + { + Scene.ForEachClient(sendRegionHandshake); + } + + public void TriggerEstateInfoChange() + { + ChangeDelegate change = OnEstateInfoChange; + + if (change != null) + change(Scene.RegionInfo.RegionID); + } + + public void TriggerRegionInfoChange() + { + m_regionChangeTimer.Stop(); + m_regionChangeTimer.Start(); + + ChangeDelegate change = OnRegionInfoChange; + + if (change != null) + change(Scene.RegionInfo.RegionID); + } + + public void setEstateTerrainBaseTexture(int level, UUID texture) + { + setEstateTerrainBaseTexture(null, level, texture); + sendRegionHandshakeToAll(); + } + + public void setEstateTerrainTextureHeights(int corner, float lowValue, float highValue) + { + setEstateTerrainTextureHeights(null, corner, lowValue, highValue); + } + + public bool IsTerrainXfer(ulong xferID) + { + lock (this) + { + if (TerrainUploader == null) + return false; + else + return TerrainUploader.XferID == xferID; + } + } + + public string SetEstateOwner(int estateID, UserAccount account) + { + string response; + + // get the current settings from DB + EstateSettings dbSettings = Scene.EstateDataService.LoadEstateSettings(estateID); + if (dbSettings.EstateID == 0) + { + response = String.Format("No estate found with ID {0}", estateID); + } + else if (account.PrincipalID == dbSettings.EstateOwner) + { + response = String.Format("Estate already belongs to {0} ({1} {2})", account.PrincipalID, account.FirstName, account.LastName); + } + else + { + dbSettings.EstateOwner = account.PrincipalID; + dbSettings.Save(); + response = String.Empty; + + // make sure there's a log entry to document the change + m_log.InfoFormat("[ESTATE]: Estate Owner for {0} changed to {1} ({2} {3})", dbSettings.EstateName, + account.PrincipalID, account.FirstName, account.LastName); + + TriggerEstateInfoChange(); + sendRegionHandshakeToAll(); + } + return response; + } + + public string SetEstateName(int estateID, string newName) + { + string response; + + // get the current settings from DB + EstateSettings dbSettings = Scene.EstateDataService.LoadEstateSettings(estateID); + + if (dbSettings.EstateID == 0) + { + response = String.Format("No estate found with ID {0}", estateID); + } + else if (newName == dbSettings.EstateName) + { + response = String.Format("Estate {0} is already named \"{1}\"", estateID, newName); + } + else + { + List estates = Scene.EstateDataService.GetEstates(newName); + if (estates.Count() > 0) + { + response = String.Format("An estate named \"{0}\" already exists.", newName); + } + else + { + string oldName = dbSettings.EstateName; + dbSettings.EstateName = newName; + dbSettings.Save(); + response = String.Empty; + + // make sure there's a log entry to document the change + m_log.InfoFormat("[ESTATE]: Estate {0} renamed from \"{1}\" to \"{2}\"", estateID, oldName, newName); + + TriggerEstateInfoChange(); + sendRegionHandshakeToAll(); + } + } + return response; + } + + #endregion + #region Packet Data Responders private void clientSendDetailedEstateData(IClientAPI remote_client, UUID invoice) @@ -224,12 +405,6 @@ namespace OpenSim.Region.CoreModules.World.Estate sendRegionInfoPacketToAll(); } - public void setEstateTerrainBaseTexture(int level, UUID texture) - { - setEstateTerrainBaseTexture(null, level, texture); - sendRegionHandshakeToAll(); - } - public void setEstateTerrainBaseTexture(IClientAPI remoteClient, int level, UUID texture) { if (texture == UUID.Zero) @@ -256,11 +431,6 @@ namespace OpenSim.Region.CoreModules.World.Estate sendRegionInfoPacketToAll(); } - public void setEstateTerrainTextureHeights(int corner, float lowValue, float highValue) - { - setEstateTerrainTextureHeights(null, corner, lowValue, highValue); - } - public void setEstateTerrainTextureHeights(IClientAPI client, int corner, float lowValue, float highValue) { switch (corner) @@ -925,17 +1095,6 @@ namespace OpenSim.Region.CoreModules.World.Estate } } - public bool IsTerrainXfer(ulong xferID) - { - lock (this) - { - if (TerrainUploader == null) - return false; - else - return TerrainUploader.XferID == xferID; - } - } - private void handleTerrainRequest(IClientAPI remote_client, string clientFileName) { // Save terrain here @@ -1117,11 +1276,6 @@ namespace OpenSim.Region.CoreModules.World.Estate remoteClient.SendRegionHandshake(Scene.RegionInfo,args); } - public void sendRegionHandshakeToAll() - { - Scene.ForEachClient(sendRegionHandshake); - } - public void handleEstateChangeInfo(IClientAPI remoteClient, UUID invoice, UUID senderID, UInt32 parms1, UInt32 parms2) { if (parms2 == 0) @@ -1203,31 +1357,8 @@ namespace OpenSim.Region.CoreModules.World.Estate sendRegionInfoPacketToAll(); } - public string setEstateOwner(int estateID, UserAccount account) - { - string response; - // get the current settings from DB - EstateSettings dbSettings = Scene.EstateDataService.LoadEstateSettings(estateID); - if(account.PrincipalID != dbSettings.EstateOwner) { - dbSettings.EstateOwner = account.PrincipalID; - dbSettings.Save(); - response = String.Format("Estate owner changed to {0} ({1} {2})", account.PrincipalID, account.FirstName, account.LastName); - - // make sure there's a log entry to document the change - m_log.InfoFormat("[ESTATE]: Estate Owner for {0} changed to {1} ({2} {3})", dbSettings.EstateName, - account.PrincipalID, account.FirstName, account.LastName); - - TriggerEstateInfoChange(); - } - else - { - response = String.Format("Estate already belongs to {0} ({1} {2})", account.PrincipalID, account.FirstName, account.LastName); - } - return response; - } - - #endregion + #endregion private void EventManager_OnNewClient(IClientAPI client) { @@ -1257,60 +1388,7 @@ namespace OpenSim.Region.CoreModules.World.Estate sendRegionHandshake(client); } - public uint GetRegionFlags() - { - RegionFlags flags = RegionFlags.None; - - // Fully implemented - // - if (Scene.RegionInfo.RegionSettings.AllowDamage) - flags |= RegionFlags.AllowDamage; - if (Scene.RegionInfo.RegionSettings.BlockTerraform) - flags |= RegionFlags.BlockTerraform; - if (!Scene.RegionInfo.RegionSettings.AllowLandResell) - flags |= RegionFlags.BlockLandResell; - if (Scene.RegionInfo.RegionSettings.DisableCollisions) - flags |= RegionFlags.SkipCollisions; - if (Scene.RegionInfo.RegionSettings.DisableScripts) - flags |= RegionFlags.SkipScripts; - if (Scene.RegionInfo.RegionSettings.DisablePhysics) - flags |= RegionFlags.SkipPhysics; - if (Scene.RegionInfo.RegionSettings.BlockFly) - flags |= RegionFlags.NoFly; - if (Scene.RegionInfo.RegionSettings.RestrictPushing) - flags |= RegionFlags.RestrictPushObject; - if (Scene.RegionInfo.RegionSettings.AllowLandJoinDivide) - flags |= RegionFlags.AllowParcelChanges; - if (Scene.RegionInfo.RegionSettings.BlockShowInSearch) - flags |= RegionFlags.BlockParcelSearch; - - if (Scene.RegionInfo.RegionSettings.FixedSun) - flags |= RegionFlags.SunFixed; - if (Scene.RegionInfo.RegionSettings.Sandbox) - flags |= RegionFlags.Sandbox; - if (Scene.RegionInfo.EstateSettings.AllowVoice) - flags |= RegionFlags.AllowVoice; - if (Scene.RegionInfo.EstateSettings.AllowLandmark) - flags |= RegionFlags.AllowLandmark; - if (Scene.RegionInfo.EstateSettings.AllowSetHome) - flags |= RegionFlags.AllowSetHome; - if (Scene.RegionInfo.EstateSettings.BlockDwell) - flags |= RegionFlags.BlockDwell; - if (Scene.RegionInfo.EstateSettings.ResetHomeOnTeleport) - flags |= RegionFlags.ResetHomeOnTeleport; - - - // TODO: SkipUpdateInterestList - - // Omitted - // - // Omitted: NullLayer (what is that?) - // Omitted: SkipAgentAction (what does it do?) - - return (uint)flags; - } - - public uint GetEstateFlags() + private uint GetEstateFlags() { RegionFlags flags = RegionFlags.None; @@ -1351,37 +1429,6 @@ namespace OpenSim.Region.CoreModules.World.Estate return (uint)flags; } - public bool IsManager(UUID avatarID) - { - if (avatarID == Scene.RegionInfo.EstateSettings.EstateOwner) - return true; - - List ems = new List(Scene.RegionInfo.EstateSettings.EstateManagers); - if (ems.Contains(avatarID)) - return true; - - return false; - } - - public void TriggerRegionInfoChange() - { - m_regionChangeTimer.Stop(); - m_regionChangeTimer.Start(); - - ChangeDelegate change = OnRegionInfoChange; - - if (change != null) - change(Scene.RegionInfo.RegionID); - } - - public void TriggerEstateInfoChange() - { - ChangeDelegate change = OnEstateInfoChange; - - if (change != null) - change(Scene.RegionInfo.RegionID); - } - public void TriggerEstateMessage(UUID fromID, string fromName, string message) { MessageDelegate onmessage = OnEstateMessage; -- cgit v1.1