fix ReturnAllObjectsOnParcel
This commit is contained in:
parent
f000a0324a
commit
c1be1499ee
2 changed files with 124 additions and 72 deletions
|
|
@ -7,6 +7,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using static OpenMetaverse.DirectoryManager;
|
using static OpenMetaverse.DirectoryManager;
|
||||||
using static OpenMetaverse.ParcelManager;
|
using static OpenMetaverse.ParcelManager;
|
||||||
using static OpenMetaverse.Stats.UtilizationStatistics;
|
using static OpenMetaverse.Stats.UtilizationStatistics;
|
||||||
|
|
@ -597,6 +598,128 @@ namespace SecondBotEvents.Commands
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[About("Returns all objects on a parcel owned by selected avatar")]
|
||||||
|
[ReturnHintsFailure("Error not in a sim")]
|
||||||
|
[ReturnHintsFailure("Parcel data not ready")]
|
||||||
|
[ReturnHintsFailure("Land is not group owned and im not the owner")]
|
||||||
|
[ReturnHintsFailure("I do not have access to the group")]
|
||||||
|
[ReturnHintsFailure("No objects found to return")]
|
||||||
|
[ReturnHintsFailure("Timeout waiting for object owners reply")]
|
||||||
|
[ReturnHintsFailure("Invaild avatar")]
|
||||||
|
[ReturnHints("ok")]
|
||||||
|
[ArgHints("avatar", "uuid of the avatar or Firstname Lastname")]
|
||||||
|
public object ReturnAllObjectsOnParcelByOwner(string avatar)
|
||||||
|
{
|
||||||
|
KeyValuePair<bool, string> tests = SetupCurrentParcel();
|
||||||
|
if (tests.Key == false)
|
||||||
|
{
|
||||||
|
return Failure(tests.Value);
|
||||||
|
}
|
||||||
|
ProcessAvatar(avatar);
|
||||||
|
if (avataruuid == UUID.Zero)
|
||||||
|
{
|
||||||
|
return Failure("Invaild avatar", [avatar]);
|
||||||
|
}
|
||||||
|
return ReturnAllObjectsOnParcelReal(avataruuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
[About("Returns all objects on a parcel")]
|
||||||
|
[ReturnHintsFailure("Error not in a sim")]
|
||||||
|
[ReturnHintsFailure("Parcel data not ready")]
|
||||||
|
[ReturnHintsFailure("Land is not group owned and im not the owner")]
|
||||||
|
[ReturnHintsFailure("I do not have access to the group")]
|
||||||
|
[ReturnHintsFailure("No objects found to return")]
|
||||||
|
[ReturnHintsFailure("Timeout waiting for object owners reply")]
|
||||||
|
[ReturnHints("ok")]
|
||||||
|
public object ReturnAllObjectsOnParcel()
|
||||||
|
{
|
||||||
|
KeyValuePair<bool, string> tests = SetupCurrentParcel();
|
||||||
|
if (tests.Key == false)
|
||||||
|
{
|
||||||
|
return Failure(tests.Value);
|
||||||
|
}
|
||||||
|
return ReturnAllObjectsOnParcelReal(UUID.Zero);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected object ReturnAllObjectsOnParcelReal(UUID filter,bool repeat = false)
|
||||||
|
{
|
||||||
|
if (targetparcel.OwnerID != GetClient().Self.AgentID)
|
||||||
|
{
|
||||||
|
// im not the owner of the parcel
|
||||||
|
if (targetparcel.GroupID == UUID.Zero)
|
||||||
|
{
|
||||||
|
// the parcel is not group owned
|
||||||
|
return Failure("Land is not group owned and im not the owner");
|
||||||
|
}
|
||||||
|
if (targetparcel.GroupID != GetClient().Self.ActiveGroup)
|
||||||
|
{
|
||||||
|
if (repeat == true)
|
||||||
|
{
|
||||||
|
return Failure("I do not have access to the group");
|
||||||
|
}
|
||||||
|
GetClient().Groups.ActivateGroup(targetparcel.GroupID);
|
||||||
|
return ReturnAllObjectsOnParcelReal(filter,true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var ownersList = new List<UUID>();
|
||||||
|
using (var waitHandle = new AutoResetEvent(false))
|
||||||
|
{
|
||||||
|
EventHandler<ParcelObjectOwnersReplyEventArgs> handler = null;
|
||||||
|
handler = (sender, e) =>
|
||||||
|
{
|
||||||
|
// Unsubscribe immediately to avoid leaks
|
||||||
|
GetClient().Parcels.ParcelObjectOwnersReply -= handler;
|
||||||
|
|
||||||
|
foreach (ParcelPrimOwners A in e.PrimOwners)
|
||||||
|
{
|
||||||
|
if (A.OwnerID == UUID.Zero)
|
||||||
|
{
|
||||||
|
// Skip if the owner is zero
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (ownersList.Contains(A.OwnerID))
|
||||||
|
{
|
||||||
|
// Skip if the owner is already in the list
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(filter != UUID.Zero)
|
||||||
|
{
|
||||||
|
if (filter == A.OwnerID)
|
||||||
|
{
|
||||||
|
// Skip if the owner is not the filter target
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ownersList.Add(A.OwnerID);
|
||||||
|
}
|
||||||
|
waitHandle.Set();
|
||||||
|
};
|
||||||
|
|
||||||
|
GetClient().Parcels.ParcelObjectOwnersReply += handler;
|
||||||
|
GetClient().Parcels.RequestObjectOwners(GetClient().Network.CurrentSim, targetparcel.LocalID);
|
||||||
|
|
||||||
|
// Wait for the event to be signaled, with a timeout to avoid deadlock
|
||||||
|
if (!waitHandle.WaitOne(13000)) // 13 seconds timeout
|
||||||
|
{
|
||||||
|
GetClient().Parcels.ParcelObjectOwnersReply -= handler;
|
||||||
|
return Failure("Timeout waiting for object owners reply");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ownersList.Count == 0)
|
||||||
|
{
|
||||||
|
return Failure("No objects found to return");
|
||||||
|
}
|
||||||
|
GetClient().Parcels.ReturnObjects(
|
||||||
|
GetClient().Network.CurrentSim,
|
||||||
|
targetparcel.LocalID,
|
||||||
|
ObjectReturnType.List,
|
||||||
|
ownersList
|
||||||
|
);
|
||||||
|
|
||||||
|
return BasicReply("ok");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
[About("Updates the current parcels name")]
|
[About("Updates the current parcels name")]
|
||||||
[ReturnHints("true|false")]
|
[ReturnHints("true|false")]
|
||||||
[ReturnHintsFailure("Error not in a sim")]
|
[ReturnHintsFailure("Error not in a sim")]
|
||||||
|
|
@ -674,77 +797,6 @@ namespace SecondBotEvents.Commands
|
||||||
return BasicReply("Applying perms", [escapedflagdata]);
|
return BasicReply("Applying perms", [escapedflagdata]);
|
||||||
}
|
}
|
||||||
|
|
||||||
[About("Returns all objects from the current parcel for the selected avatar")]
|
|
||||||
[ReturnHints("ok")]
|
|
||||||
[ReturnHintsFailure("Error not in a sim")]
|
|
||||||
[ReturnHintsFailure("Parcel data not ready")]
|
|
||||||
[ReturnHintsFailure("Invaild avatar UUID")]
|
|
||||||
[ArgHints("avatar", "avatar uuid or Firstname Lastname")]
|
|
||||||
public object ParcelReturnTargeted(string avatar)
|
|
||||||
{
|
|
||||||
KeyValuePair<bool, string> tests = SetupCurrentParcel();
|
|
||||||
if (tests.Key == false)
|
|
||||||
{
|
|
||||||
return Failure(tests.Value, [avatar]);
|
|
||||||
}
|
|
||||||
ProcessAvatar(avatar);
|
|
||||||
if (avataruuid == UUID.Zero)
|
|
||||||
{
|
|
||||||
return Failure("Invaild avatar UUID", [avatar]);
|
|
||||||
}
|
|
||||||
GetClient().Parcels.ReturnObjects(GetClient().Network.CurrentSim, targetparcel.LocalID, ObjectReturnType.None, [avataruuid]);
|
|
||||||
return BasicReply("ok", [avatar]);
|
|
||||||
}
|
|
||||||
|
|
||||||
[About("Returns all objects from the current parcel for all avatars")]
|
|
||||||
[ReturnHints("ok")]
|
|
||||||
[ReturnHintsFailure("Error not in a sim")]
|
|
||||||
[ReturnHintsFailure("Parcel data not ready")]
|
|
||||||
public object ParcelReturnAll()
|
|
||||||
{
|
|
||||||
KeyValuePair<bool, string> tests = SetupCurrentParcel();
|
|
||||||
if (tests.Key == false)
|
|
||||||
{
|
|
||||||
return Failure(tests.Value);
|
|
||||||
}
|
|
||||||
// Create a blocking event
|
|
||||||
AutoResetEvent eventWaitHandle = new(false);
|
|
||||||
|
|
||||||
void OnParcelObjectOwnersReply(object sender, ParcelObjectOwnersReplyEventArgs e)
|
|
||||||
{
|
|
||||||
// Signal that the event has been handled
|
|
||||||
eventWaitHandle.Set();
|
|
||||||
if(e.Simulator != GetClient().Network.CurrentSim)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
foreach (ParcelPrimOwners A in e.PrimOwners)
|
|
||||||
{
|
|
||||||
ParcelReturnTargeted(A.OwnerID.ToString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
GetClient().Parcels.ParcelObjectOwnersReply += OnParcelObjectOwnersReply;
|
|
||||||
GetClient().Parcels.RequestObjectOwners(GetClient().Network.CurrentSim, targetparcel.LocalID);
|
|
||||||
bool eventTriggered = eventWaitHandle.WaitOne(5000); // 5000ms timeout
|
|
||||||
|
|
||||||
if (!eventTriggered)
|
|
||||||
{
|
|
||||||
return Failure("Timed out waiting for ParcelObjectOwnersReply");
|
|
||||||
}
|
|
||||||
return BasicReply("processing request");
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
// Ensure the event handler is removed to avoid memory leaks
|
|
||||||
GetClient().Parcels.ParcelObjectOwnersReply -= OnParcelObjectOwnersReply;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[About("transfers the current parcel ownership to the assigned group")]
|
[About("transfers the current parcel ownership to the assigned group")]
|
||||||
[ReturnHints("ok")]
|
[ReturnHints("ok")]
|
||||||
[ArgHints("group", "The group uuid to assign")]
|
[ArgHints("group", "The group uuid to assign")]
|
||||||
|
|
|
||||||
|
|
@ -175,7 +175,7 @@ namespace SecondBotEvents
|
||||||
RegisterService("TriggerOnEventService");
|
RegisterService("TriggerOnEventService");
|
||||||
RegisterService("RelayService");
|
RegisterService("RelayService");
|
||||||
RegisterService("ChatGptService");
|
RegisterService("ChatGptService");
|
||||||
RegisterService("RecoveryService");
|
//RegisterService("RecoveryService");
|
||||||
RegisterService("SmtpService");
|
RegisterService("SmtpService");
|
||||||
if (BotClient.IsLoaded() == false)
|
if (BotClient.IsLoaded() == false)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue