예제 #1
0
        public uint Count(uint estateID, RegionFlags flags)
        {
            IEstateConnector estates = Framework.Utilities.DataManager.RequestPlugin <IEstateConnector> ();

            if (estates == null)
            {
                return(0);
            }

            EstateSettings es = estates.GetEstateIDSettings((int)estateID);

            QueryFilter filter = new QueryFilter();

            filter.andBitfieldAndFilters ["Flags"] = (uint)flags;

            List <GridRegion> query = ParseQuery(null, m_GD.Query(new string [] { "*" }, m_realm, filter, null, null, null));

            uint count = 0;

            query.ForEach(delegate(GridRegion region) {
                if (region.EstateOwner == es.EstateOwner &&
                    estates.GetRegionEstateID(region.RegionID) == es.EstateID)
                {
                    ++count;
                }
            });

            return(count);
        }
        /// <summary>
        /// Shows details of all estates.
        /// </summary>
        /// <param name="scene">Scene.</param>
        /// <param name="cmd">Cmd.</param>
        void ShowEstatesCommand(IScene scene, string [] cmd)
        {
            IEstateConnector    estateConnector = Framework.Utilities.DataManager.RequestPlugin <IEstateConnector> ();
            IUserAccountService accountService  = m_registry.RequestModuleInterface <IUserAccountService> ();

            string estateInfo;
            var    estates = estateConnector.GetEstateNames();

            // headings
            estateInfo  = string.Format("{0, -20}", "Estate");
            estateInfo += string.Format("{0, -20}", "Owner");
            estateInfo += string.Format("{0, -10}", "Regions");
            estateInfo += string.Format("{0, -10}", "Voice");
            estateInfo += string.Format("{0, -10}", "Price/M");
            estateInfo += string.Format("{0, -10}", "Public");
            estateInfo += string.Format("{0, -10}", "Tax Free");
            estateInfo += string.Format("{0, -10}", "Direct Tp");

            MainConsole.Instance.CleanInfo(estateInfo);
            MainConsole.Instance.CleanInfo("--------------------------------------------------------------------------------------------------");

            foreach (string estate in estates)
            {
                var            estateID = estateConnector.GetEstateID(estate);
                EstateSettings ES       = estateConnector.GetEstateIDSettings(estateID);

                if (ES != null)
                {
                    //var regInfo = scene.RegionInfo;
                    UserAccount EstateOwner = accountService.GetUserAccount(null, ES.EstateOwner);
                    var         regions     = estateConnector.GetRegions(estateID);

                    // todo ... change hardcoded field sizes to public constants
                    estateInfo  = string.Format("{0, -20}", ES.EstateName);
                    estateInfo += string.Format("{0, -20}", EstateOwner.Name);
                    estateInfo += string.Format("{0, -10}", regions.Count);
                    estateInfo += string.Format("{0, -10}", (ES.AllowVoice) ? "Yes" : "No");
                    estateInfo += string.Format("{0, -10}", ES.PricePerMeter);
                    estateInfo += string.Format("{0, -10}", (ES.PublicAccess) ? "Yes" : "No");
                    estateInfo += string.Format("{0, -10}", (ES.TaxFree) ? "Yes" : "No");
                    estateInfo += string.Format("{0, -10}", (ES.AllowDirectTeleport) ? "Yes" : "No");

                    MainConsole.Instance.CleanInfo(estateInfo);
                }
            }
            MainConsole.Instance.CleanInfo("\n");
        }
예제 #3
0
        public List <GridRegion> GetList(uint start, uint count, uint estateID, RegionFlags flags,
                                         Dictionary <string, bool> sort)
        {
            List <GridRegion> resp    = new List <GridRegion> ();
            IEstateConnector  estates = Framework.Utilities.DataManager.RequestPlugin <IEstateConnector> ();

            if (count == 0 || estates == null)
            {
                return(resp);
            }

            EstateSettings es = estates.GetEstateIDSettings((int)estateID);

            QueryFilter filter = new QueryFilter();

            filter.andBitfieldAndFilters ["Flags"] = (uint)flags;

            while (resp.Count < count)
            {
                uint limit = count - (uint)resp.Count;
                List <GridRegion> query =
                    ParseQuery(null, m_GD.Query(new string [] { "*" }, m_realm, filter, sort, start, count));

                if (query.Count == 0)
                {
                    break;
                }

                query.ForEach(delegate(GridRegion region) {
                    if (region.EstateOwner == es.EstateOwner &&
                        estates.GetRegionEstateID(region.RegionID) == es.EstateID)
                    {
                        resp.Add(region);
                    }
                });

                start += limit;
            }

            return(resp);
        }
        /// <summary>
        /// Checks for a valid system estate. Adds or corrects if required
        /// </summary>
        /// <param name="estateID">Estate I.</param>
        /// <param name="estateName">Estate name.</param>
        /// <param name="ownerUUID">Owner UUI.</param>
        void CheckSystemEstateInfo(int estateID, string estateName, UUID ownerUUID)
        {
            // these should have already been checked but just make sure...
            if (m_estateConnector == null)
            {
                return;
            }

            if (m_estateConnector.RemoteCalls())
            {
                return;
            }

            ISystemAccountService sysAccounts = m_registry.RequestModuleInterface <ISystemAccountService> ();
            EstateSettings        ES;

            // check for existing estate name in case of estate ID change
            ES = m_estateConnector.GetEstateSettings(estateName);
            if (ES != null)
            {
                // ensure correct ID
                if (ES.EstateID != estateID)
                {
                    UpdateSystemEstates(m_estateConnector, ES, estateID);
                }
            }

            ES = m_estateConnector.GetEstateIDSettings(estateID);
            if ((ES != null) && (ES.EstateID != 0))
            {
                // ensure correct owner
                if (ES.EstateOwner != ownerUUID)
                {
                    ES.EstateOwner = ownerUUID;
                    m_estateConnector.SaveEstateSettings(ES);
                    MainConsole.Instance.Info("[EstateService]: The system Estate owner has been updated to " +
                                              sysAccounts.GetSystemEstateOwnerName(estateID));
                }


                // in case of configuration changes
                if (ES.EstateName != estateName)
                {
                    ES.EstateName = estateName;
                    m_estateConnector.SaveEstateSettings(ES);
                    MainConsole.Instance.Info("[EstateService]: The system Estate name has been updated to " + estateName);
                }

                return;
            }

            // Create a new estate

            ES             = new EstateSettings();
            ES.EstateName  = estateName;
            ES.EstateOwner = ownerUUID;

            ES.EstateID = (uint)m_estateConnector.CreateNewEstate(ES);
            if (ES.EstateID == 0)
            {
                MainConsole.Instance.Warn("There was an error in creating the system estate: " + ES.EstateName);
                //EstateName holds the error. See LocalEstateConnector for more info.
            }
            else
            {
                MainConsole.Instance.InfoFormat("[EstateService]: The estate '{0}' owned by '{1}' has been created.",
                                                ES.EstateName, sysAccounts.GetSystemEstateOwnerName(estateID));
            }
        }
예제 #5
0
        /// <summary>
        /// Fixes missing region owners command.
        /// </summary>
        /// <param name="scene">Scene.</param>
        /// <param name="cmd">Cmd.</param>
        void FixMissingRegionOwners(IScene scene, string [] cmd)
        {
            QueryFilter filter = new QueryFilter();

            filter.andFilters ["OwnerUUID"] = UUID.Zero;

            List <GridRegion> borked = ParseQuery(null, m_GD.Query(new string [] { "*" }, m_realm, filter, null, null, null));

            if (borked.Count < 1)
            {
                MainConsole.Instance.Info("[LocalGridConnector] No regions found with missing owners.");
                return;
            }

            IEstateConnector estatePlugin = Framework.Utilities.DataManager.RequestPlugin <IEstateConnector> ();

            if (estatePlugin == null)
            {
                MainConsole.Instance.Error("[LocalGridConnector] " + borked.Count +
                                           " regions found with missing owners, but could not get IEstateConnector plugin.");
                return;
            }


            MainConsole.Instance.Error("[LocalGridConnector] " + borked.Count +
                                       " regions found with missing owners, attempting fix.");

            Dictionary <int, List <GridRegion> > borkedByEstate = new Dictionary <int, List <GridRegion> > ();

            foreach (GridRegion region in borked)
            {
                int estateID = estatePlugin.GetRegionEstateID(region.RegionID);
                if (!borkedByEstate.ContainsKey(estateID))
                {
                    borkedByEstate [estateID] = new List <GridRegion> ();
                }
                borkedByEstate [estateID].Add(region);
            }

            Dictionary <int, UUID> estateOwnerIDs = new Dictionary <int, UUID> ();
            uint estateFail = 0;

            foreach (int estateID in borkedByEstate.Keys)
            {
                EstateSettings es = estatePlugin.GetEstateIDSettings(estateID);
                if ((es == null) || (es.EstateID == 0))
                {
                    MainConsole.Instance.Error("[LocalGridConnector] Cannot fix missing owner for regions in Estate " +
                                               estateID + ", could not get estate settings.");
                }
                else if (es.EstateOwner == UUID.Zero)
                {
                    MainConsole.Instance.Error("[LocalGridConnector] Cannot fix missing owner for regions in Estate " +
                                               estateID + ", Estate Owner is also missing.");
                }
                if (es == null || es.EstateOwner == UUID.Zero)
                {
                    ++estateFail;
                    continue;
                }
                estateOwnerIDs [estateID] = es.EstateOwner;
            }

            if (estateFail > 0)
            {
                if (estateFail == borkedByEstate.Count)
                {
                    MainConsole.Instance.Error("[LocalGridConnector] " + borked.Count +
                                               " regions found with missing owners, could not locate any estate settings from IEstateConnector plugin.");
                    return;
                }

                MainConsole.Instance.Error("[LocalGridConnector] " + borked.Count +
                                           " regions found with missing owners, could not locate estate settings for " +
                                           estateFail + " estates.");
            }

            uint storeSuccess = 0;
            uint storeFail    = 0;
            int  borkedCount  = borked.Count;

            foreach (KeyValuePair <int, UUID> kvp in estateOwnerIDs)
            {
                List <GridRegion> regions = borkedByEstate [kvp.Key];
                foreach (GridRegion region in regions)
                {
                    region.EstateOwner = kvp.Value;
                    if (!Store(region))
                    {
                        MainConsole.Instance.Error("[LocalGridConnector] Failed to fix missing region for " +
                                                   region.RegionName + " (" + region.RegionID + ")");
                        ++storeFail;
                    }
                    else
                    {
                        ++storeSuccess;
                        borked.Remove(region);
                    }
                }
            }

            if (storeFail > 0)
            {
                MainConsole.Instance.Error("[LocalGridConnector] " + borkedCount +
                                           " regions found with missing owners, fix failed on " + storeFail +
                                           " regions, fix attempted on " + storeSuccess + " regions.");
            }
            else if (storeSuccess != borked.Count)
            {
                MainConsole.Instance.Error("[LocalGridConnector] " + borkedCount +
                                           " regions found with missing owners, fix attempted on " + storeSuccess +
                                           " regions.");
            }
            else
            {
                MainConsole.Instance.Info(
                    "[LocalGridConnector] All regions found with missing owners should have their owners restored.");
            }
            if (borked.Count > 0)
            {
                List <string> blurbs = new List <string> (borked.Count);
                foreach (GridRegion region in borked)
                {
                    blurbs.Add(region.RegionName + " (" + region.RegionID + ")");
                }
                MainConsole.Instance.Info("[LocalGridConnector] Failed to fix missing region owners for regions " +
                                          string.Join(", ", blurbs.ToArray()));
            }
        }
예제 #6
0
        /// <summary>
        /// Changes the region estate.
        /// </summary>
        /// <param name="scene">Scene.</param>
        /// <param name="cmd">Cmd parameters.</param>
        protected void ChangeRegionEstate(IScene scene, string [] cmd)
        {
            var    conScenes = MainConsole.Instance.ConsoleScenes;
            IScene regScene  = scene;

            IEstateConnector estateConnector = Framework.Utilities.DataManager.RequestPlugin <IEstateConnector> ();

            if (estateConnector == null)
            {
                MainConsole.Instance.Error("[Estate]: Unable to obtain estate connector for update");
                return;
            }

            string regionName;

            if (regScene == null)
            {
                regionName = cmd.Length > 2 ? cmd [2] : MainConsole.Instance.Prompt("The region you wish to change?");
                if (string.IsNullOrEmpty(regionName))
                {
                    return;
                }

                // find the required region/scene
                regionName = regionName.ToLower();
                foreach (IScene scn in conScenes)
                {
                    if (scn.RegionInfo.RegionName.ToLower() == regionName)
                    {
                        regScene = scn;
                        break;
                    }
                }

                if (regScene == null)
                {
                    MainConsole.Instance.Error("[Estate]: The region '" + regionName + "' could not be found.");
                    return;
                }
            }
            else
            {
                regionName = regScene.RegionInfo.RegionName;
            }

            // check for mainland regions
            if (regScene.RegionInfo.RegionType.ToLower().StartsWith("m", System.StringComparison.Ordinal))
            {
                var sysEstates     = regScene.RequestModuleInterface <ISystemEstateService> ();
                var mainlandEstate = sysEstates.MainlandEstateName;
                MainConsole.Instance.InfoFormat("[Estate]: {0} is a Mainland region and is automatically part of the '{1}' estate",
                                                regionName, mainlandEstate);
                return;
            }

            var regionID   = regScene.RegionInfo.RegionID;
            var oldOwnerID = regScene.RegionInfo.EstateSettings.EstateOwner;

            // get the new estate name
            string estateName = cmd.Length > 3
                ? cmd [3]
                : MainConsole.Instance.Prompt("The new estate for " + regionName + " (? for more options)");

            if (string.IsNullOrEmpty(estateName))
            {
                return;
            }

            int newEstateId = 0;

            if (estateName != "?")
            {
                newEstateId = estateConnector.GetEstateID(estateName);
            }

            if (newEstateId == 0)
            {
                if (estateName != "?")
                {
                    MainConsole.Instance.Warn("[Estate]: The estate '" + estateName + "' matches no known estate.");
                }

                // try the long way...
                newEstateId = GetUserEstateID(regScene, estateConnector);
                if (newEstateId == 0)
                {
                    return;
                }
                var estate = estateConnector.GetEstateIDSettings(newEstateId);
                if (estate != null)
                {
                    estateName = estate.EstateName;
                }
            }

            // we have a region & estate name
            bool deLinkEstate = true;

            if (cmd.Length == 3)
            {
                var resp = MainConsole.Instance.Prompt(
                    "Are you sure you want to change '" + regionName + "' to the '" + estateName + "' estate? (yes/no)", "yes");
                deLinkEstate = (resp.StartsWith("y", System.StringComparison.Ordinal));
            }
            if (!deLinkEstate)
            {
                return;
            }

            // good to go
            if (!estateConnector.DelinkRegion(regionID))
            {
                MainConsole.Instance.Warn("[Estate]: Aborting - Unable to remove this region from the current estate.");
                return;
            }

            // check for'Mainland'
            string regType = regScene.RegionInfo.RegionType.ToLower();

            if (regType.StartsWith("m", System.StringComparison.Ordinal))
            {
                if (newEstateId == Constants.MainlandEstateID)
                {
                    MainConsole.Instance.Info("[Estate]: This region is already part of the Mainland estate");
                    return;
                }

                // link this region to the mainland
                MainConsole.Instance.Info("[Estate]: Mainland type regions must be part of the Mainland estate");
                LinkSystemEstate(regionID, Constants.MainlandEstateID);
                return;
            }

            var newEstate = LinkRegionEstate(regionID, newEstateId);

            if (newEstate != null)
            {
                regScene.RegionInfo.EstateSettings = newEstate;

                // Linking was successful, change any previously owned parcels to the new owner
                if (oldOwnerID != UUID.Zero)
                {
                    IParcelManagementModule parcelManagement = regScene.RequestModuleInterface <IParcelManagementModule> ();
                    if (parcelManagement != null)
                    {
                        parcelManagement.ReclaimParcels(oldOwnerID, newEstate.EstateOwner);
                    }
                }
            }
        }