public bool TryUnlinkRegion(string mapName) { MainConsole.Instance.DebugFormat("[HYPERGRID LINKER]: Request to unlink {0}", mapName); GridRegion regInfo = null; //TODO: List <GridRegion> regions = m_Database.Get(mapName, null, null, null); if (regions != null && regions.Count > 0) { Aurora.Framework.RegionFlags rflags = (Aurora.Framework.RegionFlags)regions[0].Flags; if ((rflags & Aurora.Framework.RegionFlags.Hyperlink) != 0) { regInfo = new GridRegion(); regInfo.RegionID = regions[0].RegionID; regInfo.ScopeID = m_ScopeID; } } if (regInfo != null) { RemoveHyperlinkRegion(regInfo.RegionID); return(true); } else { MainConsole.Instance.InfoFormat("[HYPERGRID LINKER]: Region {0} not found", mapName); return(false); } }
public uint Count(uint estateID, RegionFlags flags) { IEstateConnector estates = Aurora.DataManager.DataManager.RequestPlugin <IEstateConnector>(); if (estates == null) { return(0); } EstateSettings es = estates.GetEstateSettings((int)estateID); QueryFilter filter = new QueryFilter(); filter.andBitfieldAndFilters["Flags"] = (uint)flags; List <GridRegion> query = ParseQuery(null, GD.Query(new string[] { "*" }, m_realm, filter, null, null, null)); uint count = 0; query.ForEach(delegate(GridRegion region) { if (region.EstateOwner == es.EstateOwner && estates.GetEstateID(region.RegionID) == es.EstateID) { ++count; } }); return(count); }
private void HandleSetFlags(string[] cmd) { if (cmd.Length < 5) { MainConsole.Instance.Info("Syntax: set region flags <region name> <flags>"); return; } List <GridRegion> regions = m_Database.Get(cmd[3], UUID.Zero); if (regions == null || regions.Count < 1) { MainConsole.Instance.Info("Region not found"); return; } foreach (GridRegion r in regions) { int flags = r.Flags; flags = ParseFlags(flags, cmd[4]); r.Flags = flags; RegionFlags f = (RegionFlags)flags; MainConsole.Instance.Info(String.Format("Set region {0} to {1}", r.RegionName, f)); m_Database.Store(r); } }
private void HandleShowRegion(string[] cmd) { if (cmd.Length != 3) { MainConsole.Instance.Info("Syntax: show region <region name>"); return; } List <GridRegion> regions = m_Database.Get(cmd[2], UUID.Zero); if (regions == null || regions.Count < 1) { MainConsole.Instance.Info("Region not found"); return; } foreach (GridRegion r in regions) { MainConsole.Instance.Info("-------------------------------------------------------------------------------"); RegionFlags flags = (RegionFlags)Convert.ToInt32(r.Flags); MainConsole.Instance.Info("Region Name: " + r.RegionName); MainConsole.Instance.Info("Region UUID: " + r.RegionID); MainConsole.Instance.Info("Region Location: " + String.Format("{0},{1}", r.RegionLocX, r.RegionLocY)); MainConsole.Instance.Info("Region URI: " + r.ServerURI); MainConsole.Instance.Info("Region Owner: " + r.EstateOwner); MainConsole.Instance.Info("Region Flags: " + flags); MainConsole.Instance.Info("-------------------------------------------------------------------------------"); } return; }
public List <GridRegion> Get(RegionFlags flags) { QueryFilter filter = new QueryFilter(); filter.andBitfieldAndFilters["Flags"] = (uint)flags; return(ParseQuery(null, GD.Query(new string[1] { "*" }, m_realm, filter, null, null, null))); }
public uint Count(RegionFlags includeFlags, RegionFlags excludeFlags) { QueryFilter filter = new QueryFilter(); if (includeFlags > 0) { filter.andBitfieldAndFilters["Flags"] = (uint)includeFlags; } if (excludeFlags > 0) { filter.andBitfieldNandFilters["Flags"] = (uint)excludeFlags; } return(uint.Parse(GD.Query(new string[1] { "COUNT(*)" }, m_realm, filter, null, null, null)[0])); }
public List <GridRegion> Get(RegionFlags includeFlags, RegionFlags excludeFlags, uint?start, uint?count, Dictionary <string, bool> sort) { QueryFilter filter = new QueryFilter(); if (includeFlags > 0) { filter.andBitfieldAndFilters["Flags"] = (uint)includeFlags; } if (excludeFlags > 0) { filter.andBitfieldNandFilters["Flags"] = (uint)excludeFlags; } return(ParseQuery(null, GD.Query(new string[1] { "*" }, m_realm, filter, sort, start, count))); }
public List <GridRegion> Get(uint start, uint count, uint estateID, RegionFlags flags, Dictionary <string, bool> sort) { List <GridRegion> resp = new List <GridRegion>(); IEstateConnector estates = Aurora.DataManager.DataManager.RequestPlugin <IEstateConnector>(); if (count == 0 || estates == null) { return(resp); } EstateSettings es = estates.GetEstateSettings((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, 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.GetEstateID(region.RegionID) == es.EstateID) { resp.Add(region); } }); start += limit; } return(resp); }
private int ParseFlags(int prev, string flags) { RegionFlags f = (RegionFlags)prev; string[] parts = flags.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); foreach (string p in parts) { int val; try { if (p.StartsWith("+")) { val = (int)Enum.Parse(typeof(RegionFlags), p.Substring(1)); f |= (RegionFlags)val; } else if (p.StartsWith("-")) { val = (int)Enum.Parse(typeof(RegionFlags), p.Substring(1)); f &= ~(RegionFlags)val; } else { val = (int)Enum.Parse(typeof(RegionFlags), p); f |= (RegionFlags)val; } } catch (Exception) { MainConsole.Instance.Info("Error in flag specification: " + p); } } return((int)f); }
public List <GridRegion> Get(RegionFlags flags, Dictionary <string, bool> sort) { return(Get(flags, 0, null, null, sort)); }
public virtual string RegisterRegion(GridRegion regionInfos, UUID oldSessionID, out UUID SessionID, out List <GridRegion> neighbors) { SessionID = UUID.Zero; neighbors = new List <GridRegion>(); if (m_DisableRegistrations) { return("Registrations are disabled."); } UUID NeedToDeletePreviousRegion = UUID.Zero; IConfig gridConfig = m_config.Configs["GridService"]; //Get the range of this so that we get the full count and make sure that we are not overlapping smaller regions List <GridRegion> regions = m_Database.Get(regionInfos.RegionLocX, regionInfos.RegionLocY, regionInfos.RegionLocX + regionInfos.RegionSizeX - 1, regionInfos.RegionLocY + regionInfos.RegionSizeY - 1, regionInfos.ScopeID); if (regions.Count > 1) { //More than one region is here... it is overlapping stuff MainConsole.Instance.WarnFormat( "[GRID SERVICE]: Region {0} tried to register in coordinates {1}, {2} which are already in use in scope {3}.", regionInfos.RegionID, regionInfos.RegionLocX, regionInfos.RegionLocY, regionInfos.ScopeID); return("Region overlaps another region"); } GridRegion region = regions.Count > 0 ? regions[0] : null; if (!m_AllowNewRegistrations && region == null) { MainConsole.Instance.WarnFormat("[GRID SERVICE]: Region {0} tried to register but registrations are disabled.", regionInfos.RegionName); return("Registrations are disabled."); } if (m_maxRegionSize != 0 && (regionInfos.RegionSizeX > m_maxRegionSize || regionInfos.RegionSizeY > m_maxRegionSize)) { //Too big... kick it out MainConsole.Instance.WarnFormat("[GRID SERVICE]: Region {0} tried to register with too large of a size {1},{2}.", regionInfos.RegionName, regionInfos.RegionSizeX, regionInfos.RegionSizeY); return("Region overlaps another region"); } if ((region != null) && (region.RegionID != regionInfos.RegionID)) { MainConsole.Instance.WarnFormat( "[GRID SERVICE]: Region {0} tried to register in coordinates {1}, {2} which are already in use in scope {3}.", regionInfos.RegionName, regionInfos.RegionLocX, regionInfos.RegionLocY, regionInfos.ScopeID); return("Region overlaps another region"); } if ((region != null) && (region.RegionID == regionInfos.RegionID) && ((region.RegionLocX != regionInfos.RegionLocX) || (region.RegionLocY != regionInfos.RegionLocY))) { if ((region.Flags & (int)RegionFlags.NoMove) != 0) { return("Can't move this region," + region.RegionLocX + "," + region.RegionLocY); } // Region reregistering in other coordinates. Delete the old entry MainConsole.Instance.DebugFormat( "[GRID SERVICE]: Region {0} ({1}) was previously registered at {2}-{3}. Deleting old entry.", regionInfos.RegionName, regionInfos.RegionID, regionInfos.RegionLocX, regionInfos.RegionLocY); NeedToDeletePreviousRegion = regionInfos.RegionID; } if (region != null) { // There is a preexisting record // // Get it's flags // RegionFlags rflags = (RegionFlags)region.Flags; // Is this a reservation? // if ((rflags & RegionFlags.Reservation) != 0) { // Regions reserved for the null key cannot be taken. if (region.SessionID == UUID.Zero) { return("Region location is reserved"); } // Treat it as an auth request // // NOTE: Fudging the flags value here, so these flags // should not be used elsewhere. Don't optimize // this with the later retrieval of the same flags! rflags |= RegionFlags.Authenticate; } if ((rflags & RegionFlags.Authenticate) != 0) { // Can we authenticate at all? // if (m_AuthenticationService == null) { return("No authentication possible"); } //Make sure the key exists if (!m_AuthenticationService.CheckExists(regionInfos.SessionID, "SessionID")) { return("Bad authentication"); } //Now verify the key if (!m_AuthenticationService.Verify(regionInfos.SessionID, "SessionID", regionInfos.AuthToken, 30)) { return("Bad authentication"); } } } if (!m_AllowDuplicateNames) { List <GridRegion> dupe = m_Database.Get(regionInfos.RegionName, regionInfos.ScopeID); if (dupe != null && dupe.Count > 0) { #if (!ISWIN) foreach (GridRegion d in dupe) { if (d.RegionID != regionInfos.RegionID) { MainConsole.Instance.WarnFormat("[GRID SERVICE]: Region {0} tried to register duplicate name with ID {1}.", regionInfos.RegionName, regionInfos.RegionID); return("Duplicate region name"); } } #else if (dupe.Any(d => d.RegionID != regionInfos.RegionID)) { MainConsole.Instance.WarnFormat("[GRID SERVICE]: Region {0} tried to register duplicate name with ID {1}.", regionInfos.RegionName, regionInfos.RegionID); return("Duplicate region name"); } #endif } } if (region != null) { //If we are locked out, we can't come in if ((region.Flags & (int)RegionFlags.LockedOut) != 0) { return("Region locked out"); } //Remove the reservation if we are there now region.Flags &= ~(int)RegionFlags.Reservation; regionInfos.Flags = region.Flags; // Preserve flags } else { //Regions do not get to set flags, so wipe them regionInfos.Flags = 0; //See if we are in the configs anywhere and have flags set if ((gridConfig != null) && regionInfos.RegionName != string.Empty) { int newFlags = 0; string regionName = regionInfos.RegionName.Trim().Replace(' ', '_'); newFlags = ParseFlags(newFlags, gridConfig.GetString("DefaultRegionFlags", String.Empty)); newFlags = ParseFlags(newFlags, gridConfig.GetString("Region_" + regionName, String.Empty)); newFlags = ParseFlags(newFlags, gridConfig.GetString("Region_" + regionInfos.RegionID.ToString(), String.Empty)); regionInfos.Flags = newFlags; } } //Set these so that we can make sure the region is online later regionInfos.Flags |= (int)RegionFlags.RegionOnline; regionInfos.Flags |= (int)RegionFlags.Safe; regionInfos.LastSeen = Util.UnixTimeSinceEpoch(); if (region != null) { //If we already have a session, we need to check it if (!VerifyRegionSessionID(region, oldSessionID)) { MainConsole.Instance.WarnFormat( "[GRID SERVICE]: Region {0} called register, but the sessionID they provided is wrong!", region.RegionName); return("Wrong Session ID"); } } //Update the sessionID, use the old so that we don't generate a bunch of these SessionID = oldSessionID == UUID.Zero ? UUID.Random() : oldSessionID; regionInfos.SessionID = SessionID; // Everything is ok, let's register try { if (NeedToDeletePreviousRegion != UUID.Zero) { m_Database.Delete(NeedToDeletePreviousRegion); } if (m_Database.Store(regionInfos)) { //Fire the event so that other modules notice m_simulationBase.EventManager.FireGenericEventHandler("RegionRegistered", regionInfos); //Get the neighbors for them neighbors = GetNeighbors(regionInfos); FixNeighbors(regionInfos, neighbors, false); MainConsole.Instance.DebugFormat("[GRID SERVICE]: Region {0} registered successfully at {1}-{2}", regionInfos.RegionName, regionInfos.RegionLocX, regionInfos.RegionLocY); return(String.Empty); } } catch (Exception e) { MainConsole.Instance.WarnFormat("[GRID SERVICE]: Database exception: {0}", e); } return("Failed to save region into the database."); }