fix the new SetExtendedRegionInfo

This commit is contained in:
Madpeter 2025-07-09 16:15:35 +01:00
parent effd9929a4
commit 18c2334e8c
2 changed files with 83 additions and 80 deletions

View file

@ -29,13 +29,9 @@ using OpenMetaverse.Interfaces;
using OpenMetaverse.Messages.Linden; using OpenMetaverse.Messages.Linden;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using MessagePack.Formatters;
using OpenMetaverse.StructuredData;
using System.Security.Cryptography.X509Certificates;
using System.Security.Policy;
using System.Threading;
using System.Threading.Tasks;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks;
using OpenMetaverse.StructuredData;
using System.Text; using System.Text;
namespace OpenMetaverse namespace OpenMetaverse
@ -83,6 +79,13 @@ namespace OpenMetaverse
} }
#region Enums #region Enums
public enum RegionMaturity
{
PG = 13,
Mature = 21,
Adult = 42
}
/// <summary>Used in the ReportType field of a LandStatRequest</summary> /// <summary>Used in the ReportType field of a LandStatRequest</summary>
public enum LandStatReportType public enum LandStatReportType
{ {
@ -91,7 +94,7 @@ namespace OpenMetaverse
} }
/// <summary>Used by EstateOwnerMessage packets</summary> /// <summary>Used by EstateOwnerMessage packets</summary>
public enum EstateAccessDelta : uint public enum EstateAccessDelta : uint
{ {
BanUser = 64, BanUser = 64,
BanUserAllEstates = 66, BanUserAllEstates = 66,
@ -186,7 +189,7 @@ namespace OpenMetaverse
{ {
add { lock (m_TopCollidersReply_Lock) { m_TopCollidersReply += value; } } add { lock (m_TopCollidersReply_Lock) { m_TopCollidersReply += value; } }
remove { lock (m_TopCollidersReply_Lock) { m_TopCollidersReply -= value; } } remove { lock (m_TopCollidersReply_Lock) { m_TopCollidersReply -= value; } }
} }
/// <summary>The event subscribers. null if no subscribers</summary> /// <summary>The event subscribers. null if no subscribers</summary>
private EventHandler<TopScriptsReplyEventArgs> m_TopScriptsReply; private EventHandler<TopScriptsReplyEventArgs> m_TopScriptsReply;
@ -299,7 +302,7 @@ namespace OpenMetaverse
add { lock (m_EstateBansReply_Lock) { m_EstateBansReply += value; } } add { lock (m_EstateBansReply_Lock) { m_EstateBansReply += value; } }
remove { lock (m_EstateBansReply_Lock) { m_EstateBansReply -= value; } } remove { lock (m_EstateBansReply_Lock) { m_EstateBansReply -= value; } }
} }
/// <summary>The event subscribers. null if no subscribers</summary> /// <summary>The event subscribers. null if no subscribers</summary>
private EventHandler<EstateCovenantReplyEventArgs> m_EstateCovenantReply; private EventHandler<EstateCovenantReplyEventArgs> m_EstateCovenantReply;
@ -567,64 +570,36 @@ namespace OpenMetaverse
EstateOwnerMessage("restart", "-1"); EstateOwnerMessage("restart", "-1");
} }
/// <summary>Estate panel "Region" tab settings</summary> public async Task<KeyValuePair<bool, string>> extendedSetRegionInfo(
/// @deprecated Use the version with the adult flag instead bool blockTerraform, bool blockFly, bool blockFlyover, bool allowDamage, bool allowLandResell,
public void SetRegionInfo(bool blockTerraform, bool blockFly, bool allowDamage, bool allowLandResell, bool restrictPushing, bool allowParcelJoinDivide, float agentLimit, float objectBonus, bool mature) int agentLimit, float primBonus, RegionMaturity maturityLevel, bool blockObjectPush,
{ bool allowParcelChanges, bool blockParcelSearch)
SetRegionInfo(blockTerraform, blockFly, allowDamage, allowLandResell, restrictPushing, allowParcelJoinDivide, agentLimit, objectBonus, mature, false);
}
/// <summary>Estate panel "Region" tab settings</summary>
public void SetRegionInfo(bool blockTerraform, bool blockFly, bool allowDamage, bool allowLandResell, bool restrictPushing, bool allowParcelJoinDivide, float agentLimit, float objectBonus, bool mature, bool adult)
{
List<string> listParams = new List<string>();
listParams.Add(blockTerraform ? "Y" : "N");
listParams.Add(blockFly ? "Y" : "N");
listParams.Add(allowDamage ? "Y" : "N");
listParams.Add(allowLandResell ? "Y" : "N");
listParams.Add(agentLimit.ToString(CultureInfo.InvariantCulture));
listParams.Add(objectBonus.ToString(CultureInfo.InvariantCulture));
if (adult)
{
listParams.Add(((int)RegionMaturity.Adult).ToString());
}
else
{
listParams.Add(((int)(mature ? RegionMaturity.Mature : RegionMaturity.PG)).ToString());
}
listParams.Add(restrictPushing ? "Y" : "N");
listParams.Add(allowParcelJoinDivide ? "Y" : "N");
EstateOwnerMessage("setregioninfo", listParams);
}
public async void extendedSetRegionInfoAsync(bool blockTerraform, bool blockFly, bool blockFlyover, bool allowDamage, bool allowLandResell, int agentLimit, float primBonus, RegionMaturity maturityLevel, bool blockObjectPush, bool allowParcelChanges, bool blockParcelSearch)
{ {
if (Client == null) if (Client == null)
{ {
Logger.Log($"No client object (what the fuck)", Helpers.LogLevel.Warning); return new KeyValuePair<bool, string>(false, "No client object");
return;
} }
if (Client.Network == null) else if (Client.Network == null)
{ {
Logger.Log($"Not connected to a network extendedSetRegionInfoAsync", Helpers.LogLevel.Warning); return new KeyValuePair<bool, string>(false, "Not connected to a network");
return;
} }
if (Client.Network.CurrentSim == null) else if (Client.Network.CurrentSim == null)
{ {
Logger.Log($"Not connected to a sim extendedSetRegionInfoAsync", Helpers.LogLevel.Warning); return new KeyValuePair<bool, string>(false, "Not connected to a sim");
return;
} }
if (Client.Network.CurrentSim.Caps == null) else if (Client.Network.CurrentSim.Caps == null)
{ {
Logger.Log($"No caps endpoint for current sim extendedSetRegionInfoAsync", Helpers.LogLevel.Warning); return new KeyValuePair<bool, string>(false, "No caps endpoint for current sim");
return;
} }
else if (Client.HttpCapsClient == null)
{
return new KeyValuePair<bool, string>(false, "No HttpCapsClient available");
}
Uri uri = Client.Network.CurrentSim.Caps.CapabilityURI("DispatchRegionInfo"); Uri uri = Client.Network.CurrentSim.Caps.CapabilityURI("DispatchRegionInfo");
if (uri == null) if (uri == null)
{ {
Logger.Log($"unable to get URI for DispatchRegionInfo extendedSetRegionInfoAsync", Helpers.LogLevel.Warning); return new KeyValuePair<bool, string>(false, "Unable to get URI for DispatchRegionInfo");
return;
} }
OSDMap request = new OSDMap(); OSDMap request = new OSDMap();
request["block_terraform"] = blockTerraform; request["block_terraform"] = blockTerraform;
@ -639,23 +614,48 @@ namespace OpenMetaverse
request["allow_parcel_changes"] = allowParcelChanges; request["allow_parcel_changes"] = allowParcelChanges;
request["block_parcel_search"] = blockParcelSearch; request["block_parcel_search"] = blockParcelSearch;
// Serialize OSDMap to XML string string requestBody = OSDParser.SerializeLLSDXmlString(request);
string requestBody = request.ToString(); try
// Use StringContent to convert the string to HttpContent
using (var content = new StringContent(requestBody, Encoding.UTF8, "application/llsd+xml"))
{ {
using (var reply = await Client.HttpCapsClient.PostAsync(uri.ToString(), content)) var content = new StringContent(requestBody, Encoding.UTF8, "application/llsd+xml");
{ var reply = await Client.HttpCapsClient.PostAsync(uri.ToString(), content);
bool success = reply.IsSuccessStatusCode; string responseContent = await reply.Content.ReadAsStringAsync();
if (!success) if (reply.IsSuccessStatusCode)
{ {
Logger.Log($"Failed to make HTTP request to DispatchRegionInfo for extended update", return new KeyValuePair<bool, string>(true, "ok");
Helpers.LogLevel.Warning);
}
} }
return new KeyValuePair<bool, string>(false, $"HTTP {reply.StatusCode}: {responseContent}");
} }
catch (Exception e)
{
return new KeyValuePair<bool, string>(false, e.Message);
}
}
/// <summary>Estate panel "Region" tab settings</summary>
/// @deprecated Use the version with RegionMaturity support
public void SetRegionInfo(bool blockTerraform, bool blockFly, bool allowDamage, bool allowLandResell, bool restrictPushing, bool allowParcelJoinDivide, float agentLimit, float objectBonus, bool mature)
{
RegionMaturity rating = mature ? RegionMaturity.Mature : RegionMaturity.PG;
SetRegionInfo(blockTerraform, blockFly, allowDamage, allowLandResell, restrictPushing, allowParcelJoinDivide, agentLimit, objectBonus, rating);
}
/// <summary>Estate panel "Region" tab settings</summary>
public void SetRegionInfo(bool blockTerraform, bool blockFly, bool allowDamage, bool allowLandResell, bool restrictPushing, bool allowParcelJoinDivide, float agentLimit, float objectBonus, RegionMaturity maturity)
{
List<string> listParams = new List<string>();
listParams.Add(blockTerraform ? "Y" : "N");
listParams.Add(blockFly ? "Y" : "N");
listParams.Add(allowDamage ? "Y" : "N");
listParams.Add(allowLandResell ? "Y" : "N");
listParams.Add(agentLimit.ToString(CultureInfo.InvariantCulture));
listParams.Add(objectBonus.ToString(CultureInfo.InvariantCulture));
listParams.Add(maturity.ToString());
listParams.Add(restrictPushing ? "Y" : "N");
listParams.Add(allowParcelJoinDivide ? "Y" : "N");
EstateOwnerMessage("setregioninfo", listParams);
} }
/// <summary>Estate panel "Debug" tab settings</summary> /// <summary>Estate panel "Debug" tab settings</summary>
@ -1001,11 +1001,11 @@ namespace OpenMetaverse
if (type == LandStatReportType.TopScripts) if (type == LandStatReportType.TopScripts)
{ {
OnTopScriptsReply(new TopScriptsReplyEventArgs((int)p.RequestData.TotalObjectCount, Tasks)); OnTopScriptsReply(new TopScriptsReplyEventArgs((int)p.RequestData.TotalObjectCount, Tasks));
} }
else if (type == LandStatReportType.TopColliders) else if (type == LandStatReportType.TopColliders)
{ {
OnTopCollidersReply(new TopCollidersReplyEventArgs((int) p.RequestData.TotalObjectCount, Tasks)); OnTopCollidersReply(new TopCollidersReplyEventArgs((int)p.RequestData.TotalObjectCount, Tasks));
} }
/* /*
@ -1023,12 +1023,6 @@ namespace OpenMetaverse
} }
} }
public enum RegionMaturity
{
PG = 13,
Mature = 21,
Adult = 42
}
private void LandStatCapsReplyHandler(string capsKey, IMessage message, Simulator simulator) private void LandStatCapsReplyHandler(string capsKey, IMessage message, Simulator simulator)
{ {
LandStatReplyMessage m = (LandStatReplyMessage)message; LandStatReplyMessage m = (LandStatReplyMessage)message;
@ -1051,11 +1045,11 @@ namespace OpenMetaverse
if (type == LandStatReportType.TopScripts) if (type == LandStatReportType.TopScripts)
{ {
OnTopScriptsReply(new TopScriptsReplyEventArgs((int)m.TotalObjectCount, Tasks)); OnTopScriptsReply(new TopScriptsReplyEventArgs((int)m.TotalObjectCount, Tasks));
} }
else if (type == LandStatReportType.TopColliders) else if (type == LandStatReportType.TopColliders)
{ {
OnTopCollidersReply(new TopCollidersReplyEventArgs((int)m.TotalObjectCount, Tasks)); OnTopCollidersReply(new TopCollidersReplyEventArgs((int)m.TotalObjectCount, Tasks));
} }
} }
#endregion #endregion

View file

@ -110,8 +110,12 @@ namespace SecondBotEvents.Commands
{ {
regionMaturity = RegionMaturity.Adult; regionMaturity = RegionMaturity.Adult;
} }
GetClient().Estate.extendedSetRegionInfoAsync(blockTerraform, blockFly, blockFlyOver, allowDamage, allowLandResell, KeyValuePair<bool, string> result = GetClient().Estate.extendedSetRegionInfo(blockTerraform, blockFly, blockFlyOver, allowDamage, allowLandResell,
agentLimitValue, primBonusValue, regionMaturity, blockObjectPush, allowParcelChanges, blockParcelSearch); agentLimitValue, primBonusValue, regionMaturity, blockObjectPush, allowParcelChanges, blockParcelSearch).Await();
if (result.Key == false)
{
return Failure(result.Value, [setBlockTerraform, setBlockFly, setBlockFlyOver, setAllowDamage, setAllowLandResell, setAgentLimit, setPrimBonus, setMature, setAdult, setBlockObjectPush, setAllowParcelChanges, setBlockParcelSearch]);
}
return BasicReply("ok", [setBlockTerraform, setBlockFly, setBlockFlyOver, setAllowDamage, setAllowLandResell, setAgentLimit, setPrimBonus, setMature, setAdult, setBlockObjectPush, setAllowParcelChanges, setBlockParcelSearch]); return BasicReply("ok", [setBlockTerraform, setBlockFly, setBlockFlyOver, setAllowDamage, setAllowLandResell, setAgentLimit, setPrimBonus, setMature, setAdult, setBlockObjectPush, setAllowParcelChanges, setBlockParcelSearch]);
} }
@ -185,7 +189,12 @@ namespace SecondBotEvents.Commands
{ {
return Failure("Unable to process adult value please use true or false", [setBlockTerraform, setBlockFly, setAllowDamage, setAllowLandResell, setBlockPushing, setAllowParcelJoinDivide, setAgentLimit, setObjectBonus, setMature, setAdult]); return Failure("Unable to process adult value please use true or false", [setBlockTerraform, setBlockFly, setAllowDamage, setAllowLandResell, setBlockPushing, setAllowParcelJoinDivide, setAgentLimit, setObjectBonus, setMature, setAdult]);
} }
GetClient().Estate.SetRegionInfo(blockTerraform, blockFly, allowDamage, allowLandResell, blockPushing, allowParcelJoinDivide, agentLimit, objectBonus, mature, adult); RegionMaturity rating = mature ? RegionMaturity.Mature : RegionMaturity.PG;
if (adult)
{
rating = RegionMaturity.Adult;
}
GetClient().Estate.SetRegionInfo(blockTerraform, blockFly, allowDamage, allowLandResell, blockPushing, allowParcelJoinDivide, agentLimit, objectBonus, rating);
return BasicReply("ok", [setBlockTerraform, setBlockFly, setAllowDamage, setAllowLandResell, setBlockPushing, setAllowParcelJoinDivide, setAgentLimit, setObjectBonus, setMature, setAdult]); return BasicReply("ok", [setBlockTerraform, setBlockFly, setAllowDamage, setAllowLandResell, setBlockPushing, setAllowParcelJoinDivide, setAgentLimit, setObjectBonus, setMature, setAdult]);
} }