From 78015bbbdc50d41cc002aab838487ab902750c4f Mon Sep 17 00:00:00 2001 From: Dev Random Date: Sat, 12 Apr 2014 17:33:45 -0400 Subject: Console commands for Estate Mgmt --- OpenSim/Region/Application/OpenSim.cs | 113 +++++++++++++++++++++ .../World/Estate/EstateManagementModule.cs | 63 ++++++++++++ .../Region/Framework/Interfaces/IEstateModule.cs | 3 + 3 files changed, 179 insertions(+) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index cc505f8..59b4614 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -402,6 +402,12 @@ namespace OpenSim "Delete a region from disk", RunCommand); + m_console.Commands.AddCommand("Estates", false, "estate create", + "estate create ", + "Creates a new estate with the specified name, owned by the specified user." + + " Estate name must be unique.", + CreateEstateCommand); + m_console.Commands.AddCommand("Estates", false, "estate set owner", "estate set owner [ | ]", "Sets the owner of the specified estate to the specified UUID or user. ", @@ -411,6 +417,11 @@ namespace OpenSim "estate set name ", "Sets the name of the specified estate to the specified value. New name must be unique.", SetEstateNameCommand); + + m_console.Commands.AddCommand("Estates", false, "estate link region", + "estate link region ", + "Attaches the specified region to the specified estate.", + EstateLinkRegionCommand); } protected override void ShutdownSpecific() @@ -1177,6 +1188,58 @@ namespace OpenSim SceneManager.SaveCurrentSceneToArchive(cmdparams); } + protected void CreateEstateCommand(string module, string[] args) + { + string response = null; + UUID userID; + + if (args.Length == 2) + { + response = "No user specified."; + } + else if (!UUID.TryParse(args[2], out userID)) + { + response = String.Format("{0} is not a valid UUID", args[2]); + } + else if (args.Length == 3) + { + response = "No estate name specified."; + } + else + { + Scene scene = SceneManager.CurrentOrFirstScene; + + // TODO: Is there a better choice here? + UUID scopeID = UUID.Zero; + UserAccount account = scene.UserAccountService.GetUserAccount(scopeID, userID); + if (account == null) + { + response = String.Format("Could not find user {0}", userID); + } + else + { + // concatenate it all to "name" + StringBuilder sb = new StringBuilder(args[3]); + for (int i = 4; i < args.Length; i++) + sb.Append (" " + args[i]); + string estateName = sb.ToString().Trim(); + + // send it off for processing. + IEstateModule estateModule = scene.RequestModuleInterface(); + response = estateModule.CreateEstate(estateName, userID); + if (response == String.Empty) + { + List estates = scene.EstateDataService.GetEstates(estateName); + response = String.Format("Estate {0} created as \"{1}\"", estates.ElementAt(0), estateName); + } + } + } + + // give the user some feedback + if (response != null) + MainConsole.Instance.Output(response); + } + protected void SetEstateOwnerCommand(string module, string[] args) { string response = null; @@ -1299,6 +1362,56 @@ namespace OpenSim MainConsole.Instance.Output(response); } + private void EstateLinkRegionCommand(string module, string[] args) + { + int estateId =-1; + UUID regionId = UUID.Zero; + Scene scene = null; + string response = null; + + if (args.Length == 3) + { + response = "No estate specified."; + } + else 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 = "No region specified."; + } + else if (!UUID.TryParse(args[4], out regionId)) + { + response = String.Format("\"{0}\" is not a valid UUID for a Region", args [4]); + } + else if (!SceneManager.TryGetScene(regionId, out scene)) + { + // region may exist, but on a different sim. + response = String.Format("No access to Region \"{0}\"", args [4]); + } + + if (response != null) + { + MainConsole.Instance.Output(response); + return; + } + + // send it off for processing. + IEstateModule estateModule = scene.RequestModuleInterface(); + response = estateModule.SetRegionEstate(scene.RegionInfo, estateId); + if (response == String.Empty) + { + estateModule.TriggerRegionInfoChange(); + estateModule.sendRegionHandshakeToAll(); + response = String.Format ("Region {0} is now attached to estate {1}", regionId, estateId); + } + + // give the user some feedback + if (response != null) + MainConsole.Instance.Output (response); + } + #endregion private static string CombineParams(string[] commandParams, int pos) diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 54a7302..a032bc7 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -313,6 +313,69 @@ namespace OpenSim.Region.CoreModules.World.Estate return response; } + public string SetRegionEstate(RegionInfo regionInfo, int estateID) + { + string response; + + if (regionInfo.EstateSettings.EstateID == estateID) + { + response = String.Format("\"{0}\" is already part of estate {1}", regionInfo.RegionName, estateID); + } + else + { + // 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 (Scene.EstateDataService.LinkRegion(regionInfo.RegionID, estateID)) + { + // make sure there's a log entry to document the change + m_log.InfoFormat("[ESTATE]: Region {0} ({1}) moved to Estate {2} ({3}).", regionInfo.RegionID, regionInfo.RegionName, estateID, dbSettings.EstateName); + + // propagate the change + ChangeDelegate change = OnEstateInfoChange; + + if (change != null) + change(regionInfo.RegionID); + + response = String.Empty; + } + else + { + response = String.Format("Could not move \"{0}\" to estate {1}", regionInfo.RegionName, estateID); + } + } + return response; + } + + public string CreateEstate(string estateName, UUID ownerID) + { + string response; + if (string.IsNullOrEmpty(estateName)) + { + response = "No estate name specified."; + } + else + { + List estates = Scene.EstateDataService.GetEstates(estateName); + if (estates.Count() > 0) + { + response = String.Format("An estate named \"{0}\" already exists.", estateName); + } + else + { + EstateSettings settings = Scene.EstateDataService.CreateNewEstate(); + settings.EstateOwner = ownerID; + settings.EstateName = estateName; + settings.Save(); + response = String.Empty; + } + } + return response; + } + #endregion #region Packet Data Responders diff --git a/OpenSim/Region/Framework/Interfaces/IEstateModule.cs b/OpenSim/Region/Framework/Interfaces/IEstateModule.cs index 600ecfe..461c880 100644 --- a/OpenSim/Region/Framework/Interfaces/IEstateModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IEstateModule.cs @@ -26,6 +26,7 @@ */ using OpenMetaverse; +using OpenSim.Framework; using OpenSim.Services.Interfaces; namespace OpenSim.Region.Framework.Interfaces @@ -44,6 +45,8 @@ namespace OpenSim.Region.Framework.Interfaces string SetEstateOwner(int estateID, UserAccount account); string SetEstateName(int estateID, string newName); + string SetRegionEstate(RegionInfo regionInfo, int estateID); + string CreateEstate(string estateName, UUID ownerID); /// /// Tell all clients about the current state of the region (terrain textures, water height, etc.). -- cgit v1.1