Profiles and Pair Requests
Profile summary reads and window actions use different grants.
if (grant.Allows(SnowcloakIpcCapability.ReadProfileData))
{
ProfileSummary? summary = ipc.GetProfileSummary(uid);
}
if (grant.Allows(SnowcloakIpcCapability.OpenProfileWindow))
{
SnowcloakOperationResult result = ipc.OpenProfileWithResult(uid);
}
ProfileSummary contains:
| Property | Meaning |
|---|---|
Uid | UID represented by the profile. |
Overview | Cached profile description when the full profile is available; otherwise the available profile tagline. |
ContentRating | Numeric content rating: 0 General, 1 Mature or 2 Adult. |
Tags | Profile tags encoded as type:value strings. Treat unknown types and values as additive. |
Revision | Cached profile revision. A summary-only result can report zero when no full cached revision is available. |
UpdatedAtUtc | Cached profile update time, when available. |
IsDisabled | Whether the cached profile is disabled. |
It's important to note that a UIDs active profile may change based on the specific in-game character the player is
using currently, if they share UIDs between them. Listen to ProfileUpdated(uid) and re-query as required - this also works
for regular profile changes.
A plugin with OpenPairRequestWindow can ask Snowcloak to open a pair request confirmation for a targeted player:
SnowcloakOperationResult result = ipc.OpenPairRequest(target.ObjectIndex);
Plugins cannot send pair requests directly. Snowcloak validates the selected target if visible, no-actions on existing pairs, and leaves the final confirmation to the user.
MCDF application is intentionally narrow:
SnowcloakOperationResult result =
await ipc.LoadMcdfToObjectWithResultAsync(path, gposeObjectIndex);
It requires ApplyMcdf permissions, an existing local file, GPose mode to be active, a GPose-range object index, and a valid target character.