4.6 KiB
Estate, experience, marketplace, and reporting services
These services keep protocol decisions and cached state separate from their network boundaries. Folder classification and listing validation are pure inventory operations. Estate access-list codes, restart-day conversion, and experience permission extraction can likewise be evaluated without a live grid. Network methods use the current simulator only when a packet or capability request is required.
Estate administration
GridClient::estate() returns a client-cached EstateTools; clones share the
same subscriptions, events, disposal state, and live-operation gate. Incoming
EstateOwnerMessage, covenant, and land-stat packets are bounded and decoded
into typed access-list, experience-list, estate-info, covenant, top-script, and
top-collider events. Estate owner messages retain their upstream method names,
parameter ordering, access-delta values, invoice UUID, and agent/session IDs.
Region schedules use the RegionSchedule capability. Daily schedules encode
as D; weekly schedules encode as W with SMTWRFA day letters, and times are
whole seconds. Simulator console commands subscribe for
SimConsoleResponse before posting to SimConsoleAsync; the HTTP response body
is intentionally ignored. The event wait observes both the caller's
cancellation token and the requested timeout.
Terrain uploads are staged in AssetManager before the owner message is sent.
The normal transfer-request and transfer-confirmation path then serves the
staged bytes, and a failed owner message removes the pending transfer.
Estate packet mutations and mutating capabilities are disabled by default.
Call EstateTools::enable_live_mutations() only after authenticating the
operator, checking estate-manager authority, showing the exact target and
operation, and obtaining confirmation. This gate covers access changes,
returns, teleports, restarts, terrain changes/uploads, console commands, and
region or estate settings. Test capabilities under the reserved .invalid
domain remain usable by offline fixtures without enabling live mutations.
Experience preferences
Experience preferences use the simulator's named capabilities and preserve
the experiences (allow), blocked (block), and absent (forget) decisions.
Estate experience replies preserve the blocked, trusted, and allowed list
boundaries reported by the owner message. Requests and mutations propagate
cancellation and apply input/body limits before parsing or publishing state.
Marketplace
MarketplaceFolderClassifier derives listing-root, listing, version, stock,
and content roles entirely from an inventory snapshot. It validates missing or
multiple version folders and counts direct stock items without performing
network I/O.
MarketplaceManager keeps listing-ID and inventory-folder indexes in sync and
publishes synchronized, changed, and error events after committing cache
updates. Fetch is read-only. Create, delete, activate, and deactivate use the
MarketplaceListings capability and are disabled for live endpoints until
enable_live_mutations() is called. Applications should confirm price,
quantity, folder identity, and listing state immediately before opting in.
Offline .invalid fixtures exercise the same payload code without contacting
a service.
Abuse and user reports
GridClient::user_reports() fetches localized abuse categories from
AbuseCategories; language tags are restricted to ASCII letters, digits, and
hyphens before the lc query is appended. Reports select
SendUserReportWithScreenshot when a screenshot UUID is present and otherwise
use SendUserReport. Capability payloads preserve the upstream fields and
allow the simulator to infer its own region; failed capability submissions
fall back to the legacy UserReport packet.
Report submission is a privileged, privacy-sensitive action and is disabled
for live endpoints until UserReportService::enable_live_submissions() is
called. Obtain user confirmation, review the summary/details and identifiers,
and avoid logging report bodies. Null report types and oversized text or region
names are rejected. Discovery and submission propagate cancellation; recorded
.invalid fixtures remain available for offline payload verification.
Validation
The focused suite uses synthetic packets and in-memory HTTP handlers. It covers owner-message experience lists, exact console event/timeout behavior, restart schedule conversion, experience permissions, marketplace classifications and CRUD payloads/events, localized abuse categories, report capability selection, exact report LLSD, cancellation, and live-operation gates. No live grid or Internet service is required.