Table of Contents

About

This is the complete documented application programmer interface that can be used to make Corrade perform actions. You can also check the scripting considerations page for various information on scripting with Corrade in general.

Get Corrade Version

The version command can be used to retrieve the current Corrade version.

Command Required Parameters Required Permissions Example
version group, password
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "version",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

Invite an Avatar

21 December 2014

  • Release 7.34 - added group Corrade permissions.

The invite command can be used to invite an agent to a group and optionally to set them to a certain provided role.

Command Required Parameters Required Permissions Example
invite group, password, firstname, lastname (or agent by UUID) group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "invite",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Corrade",
            "lastname", "Resident"
        ]
    )
);
Optional Parameters Examples
role
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "invite",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Corrade",
            "lastname", "Resident",
            "role", "Officers"
        ]
    )
);

Eject a Member

21 December 2014

  • Release 7.34 - added group Corrade permission.

The eject command can be used to eject an agent from a group.

Command Required Parameters Required Permissions Example
eject group, password, firstname, lastname (or agent by UUID) group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "eject",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Corrade",
            "lastname", "Resident",
        ]
    )
);

Join a Group

21 December 2014

  • Release 7.34 - added group and economy Corrade permissions.

The join can be used to make Corrade join a group configured in Corrade.ini.

Command Required Parameters Required Permissions Example
join group, password group, econonmy
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "join",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

The function checks whether joining a group requires a member ship fee, and if that is the case, Corrade checks for economy permission. If the economy permission is granted as well, then Corrade checks whether the current balance is sufficient, pays the fee and joins the group.

Leave a Group

21 December 2014

  • Release 7.34 - added group Corrade permissions.

The leave can be used to make Corrade leave group configured in Corrade.ini.

Command Required Parameters Required Permissions Example
leave group, password group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "leave",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

Update Group Data

21 December 2014

  • Release 7.34 - added group Corrade permission.

The updategroupdata command updates a configured group's parameters.

Command Required Parameters Required Permissions Example
updategroupdata group, password group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "updategroupdata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "data", wasListToCSV([
                "Charter", "My updated group!", 
                "OpenEnrollment", "True", 
                "ShowInList", "True", 
                "MembershipFee", 100
            ])
        ]
    )
);
Optional Parameters Possible Values Description
data Charter Text of Group Charter
ListInProfile Show this group in agent's profile
MembershipFee Cost of group membership
OpenEnrollment Is the group open for enrolment to everyone
ShowInList Will group show up in search

Create a Role

21 December 2014

  • Release 7.34 - added group Corrade permission.

The createrole command can be used to create a new role for a configured group.

Command Required Parameters Required Permissions Example
createrole group, password, role group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "createrole",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "role", "Chatters"
        ]
    )
);
Optional Parameters Possible Values Description Examples
powers InviteCan send invitations to groups default role
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "createrole",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "role", "Chatters",
            "powers", wasListToCSV([
                "invite", 
                "allowfly"
            ])
        ]
    )
);
EjectCan eject members from group
ChangeOptionsCan toggle 'Open Enrollment' and change 'Signup fee'
MemberVisibleMember is visible in the public member list
CreateRoleCan create new roles
DeleteRoleCan delete existing roles
RolePropertiesCan change Role names, titles and descriptions
AssignMemberLimitedCan assign other members to assigners role
AssignMemberCan assign other members to any role
RemoveMemberCan remove members from roles
ChangeActionsCan assign and remove abilities in roles
ChangeIdentityCan change group Charter, Insignia, 'Publish on the web' and which members are publicly visible in group member listings
LandDeedCan buy land or deed land to group
LandReleaseCan abandon group owned land to Governor Linden on mainland, or Estate owner for private estates
LandSetSaleCan set land for-sale information on group owned parcels
LandDivideJoinCan subdivide and join parcels
JoinChatCan join group chat sessions
AllowVoiceChatCan use voice chat in Group Chat sessions
ModerateChatCan moderate group chat sessions
FindPlacesCan toggle “Show in Find Places” and set search category
LandChangeIdentityCan change parcel name, description, and 'Publish on web' settings
SetLandingPointCan set the landing point and teleport routing on group land
ChangeMediaCan change music and media settings
LandEditCan toggle 'Edit Terrain' option in Land settings
LandOptionsCan toggle various About Land > Options settings
AllowEditLandCan always terraform land, even if parcel settings have it turned off
AllowFlyCan always fly while over group owned land
AllowRezCan always rez objects on group owned land
AllowLandmarkCan always create landmarks for group owned parcels
AllowSetHomeCan set home location on any group owned parcel
LandManageAllowedCan modify public access settings for group owned parcels
LandManageBannedCan manager parcel ban lists on group owned land
LandManagePassesCan manage pass list sales information
LandEjectAndFreezeCan eject and freeze other avatars on group owned land
ReturnGroupSetCan return objects set to group
ReturnNonGroupCan return non-group owned/set objects
ReturnGroupOwnedCan return group owned objects
LandGardeningCan landscape using Linden plants
DeedObjectCan deed objects to group
ObjectManipulateCan move group owned objects
ObjectSetForSaleCan set group owned objects for-sale
AccountablePay group liabilities and receive group dividends
HostEventList and Host group events
SendNoticesCan send group notices
ReceiveNoticesCan receive group notices
StartProposalCan create group proposals
VoteOnProposalCan vote on group proposals
title The title of the role
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "createrole",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "role", "Chatters",
            "title", "Smooth Chatter",
            "description", "Group chatters.",
            "powers", wasListToCSV([
                "invite", 
                "allowfly"
            ])
        ]
    )
);
description A description of the role

Delete a Role

21 December 2014

  • Release 7.34 - added group Corrade permission.

The deleterole command can be used to delete a role from a configured group. Note that the Everyone role and the Owner roles cannot be deleted.

Command Required Parameters Required Permissions Example
deleterole group, password, role group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "deleterole",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "role", "Yappers" // or UUID
        ]
    )
);

Get Members

21 December 2014

  • Release 7.34 - added group Corrade permission.

The getmembers command returns a CSV list of agent names by UUID, representing all the members in the group.

Command Required Parameters Required Permissions Example
getmembers group, password group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getmembers",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

Note that the output may be very large and the command may take some time to complete (or even timeout). In which case, Corrade's internal HTTP server can be used to obtain the complete list.

Get Roles Members

21 December 2014

  • Release 7.34 - added group Corrade permission.

The getrolesmembers command returns a CSV list of role names by avatar names by UUID in the group.

Command Required Parameters Required Permissions Example
getrolesmembers group, password group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getrolesmembers",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

The Everyone role is excluded from the output and getmembers command can be used to retrieve all the members of the group and then filter that list with the output from getrolesmembers.

Get Role Members

21 December 2014

  • Release 7.34 - added group Corrade permission.

The getrolemembers command returns a CSV list of avatar names by UUID in the specified role.

Command Required Parameters Required Permissions Example
getrolemembers group, password, role group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // returns the members of the
            // "Officers" role in the group
            "command", "getrolemembers",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "role", "Officers",
            "callback", llEscapeURL(URL)
        ]
    )
);

Get Member Roles

21 December 2014

  • Release 7.34 - added.

The getmemberroles command returns a CSV list of role names that a group member belongs to.

Command Required Parameters Required Permissions Example
getmemberroles group, password, firstname, lastname (or agent by agent UUID) group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // returns the roles that the
            // avatar named "Johnny Bravo"
            // belongs to for the given group
            "command", "getmemberroles",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "firstname", "Johnny",
            "lastname", "Bravo",
            "callback", llEscapeURL(URL)
        ]
    )
);

Get Roles

21 December 2014

  • Release 7.34 - added group Corrade permission.

The getroles command lists all the roles in a group by name.

Command Required Parameters Required Permissions Example
getroles group, password group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getroles",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // send results to this url
            "callback", llEscapeURL(URL) 
        ]
    )
);

Get Role Powers

21 December 2014

  • Release 7.34 - added group Corrade permission.

The getrolepowers gets the role powers of a role as a list.

Command Required Parameters Required Permissions Example
getrolespowers group, password, role group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getrolespowers",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "role", "Yappers", // or UUID
            // send results to this url
            "callback", llEscapeURL(URL) 
        ]
    )
);
Returned Group Powers Description
InviteCan send invitations to groups default role
EjectCan eject members from group
ChangeOptionsCan toggle 'Open Enrollment' and change 'Signup fee'
MemberVisibleMember is visible in the public member list
CreateRoleCan create new roles
DeleteRoleCan delete existing roles
RolePropertiesCan change Role names, titles and descriptions
AssignMemberLimitedCan assign other members to assigners role
AssignMemberCan assign other members to any role
RemoveMemberCan remove members from roles
ChangeActionsCan assign and remove abilities in roles
ChangeIdentityCan change group Charter, Insignia, 'Publish on the web' and which members are publicly visible in group member listings
LandDeedCan buy land or deed land to group
LandReleaseCan abandon group owned land to Governor Linden on mainland, or Estate owner for private estates
LandSetSaleCan set land for-sale information on group owned parcels
LandDivideJoinCan subdivide and join parcels
JoinChatCan join group chat sessions
AllowVoiceChatCan use voice chat in Group Chat sessions
ModerateChatCan moderate group chat sessions
FindPlacesCan toggle “Show in Find Places” and set search category
LandChangeIdentityCan change parcel name, description, and 'Publish on web' settings
SetLandingPointCan set the landing point and teleport routing on group land
ChangeMediaCan change music and media settings
LandEditCan toggle 'Edit Terrain' option in Land settings
LandOptionsCan toggle various About Land > Options settings
AllowEditLandCan always terraform land, even if parcel settings have it turned off
AllowFlyCan always fly while over group owned land
AllowRezCan always rez objects on group owned land
AllowLandmarkCan always create landmarks for group owned parcels
AllowSetHomeCan set home location on any group owned parcel
LandManageAllowedCan modify public access settings for group owned parcels
LandManageBannedCan manager parcel ban lists on group owned land
LandManagePassesCan manage pass list sales information
LandEjectAndFreezeCan eject and freeze other avatars on group owned land
ReturnGroupSetCan return objects set to group
ReturnNonGroupCan return non-group owned/set objects
ReturnGroupOwnedCan return group owned objects
LandGardeningCan landscape using Linden plants
DeedObjectCan deed objects to group
ObjectManipulateCan move group owned objects
ObjectSetForSaleCan set group owned objects for-sale
AccountablePay group liabilities and receive group dividends
HostEventList and Host group events
SendNoticesCan send group notices
ReceiveNoticesCan receive group notices
StartProposalCan create group proposals
VoteOnProposalCan vote on group proposals

Add a Member to a Role

21 December 2014

  • Release 7.34 - added group Corrade permission.

The addtorole command adds a member to a specified role (by name or UUID).

Command Required Parameters Required Permissions Example
addtorole group, password, role, firstname, lastname (or agent by UUID) group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "addtorole",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "role", "Yappers", // or UUID
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Corrade",
            "lastname", "Resident"
        ]
    )
);

Delete a Member From a Role

21 December 2014

  • Release 7.34 - added group Corrade permission.

The deletefromrole deletes a member from a specified role (by name or UUID).

Command Required Parameters Required Permissions Example
deletefromrole group, password, role, firstname, lastname (or agent by UUID) group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "deletefromrole",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "role", "Yappers", // or UUID
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Corrade",
            "lastname", "Resident"
        ]
    )
);

Tell

The tell command can be used to make Corrade talk in local chat, in a group or send an instant message to an avatar.

Command Required Parameters Required Permissions Example
tell group, password, entity talk
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "tell",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "message", "Good day!",
            "entity", "local",
            "type", "Normal"
        ]
    )
);
Parameters Sub-Parameters Sub-Parameters Possible Values Sub-Parameters Description Example
entity local type Normal channel Sends the message on the specified channel (if the channel is not specified, then channel 0 is assumed).
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "tell",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "message", "Good day!",
            "entity", "local",
            "type", "Normal"
        ]
    )
);
Whisper
Shout
group Send to the configured group.
avatar firstname, lastname (or agent for agent by UUID) Sends the message to an avatar.
estate Send the message to the current estate.
region Send the message to the current region.

Artificial Intelligence (AI)

27 February 2015

  • Release 7.74 - added.

The ai command processes messages sent to the bot and sends the response to an installed callback URL.

Command Required Parameters Required Permissions Example
ai group, password, action talk
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Send "Good day!" to Corrade
            // and retrieve the response 
            // via the installed callback
            "command", "ai",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "process",
            "message", llEscapeURL("Good day!"),
            // The answer will be posted to the URL
            "callback", llEscapeURL(URL)
        ]
    )
);
Parameter Possible Values Second Parameter Description
action process message Process the message using the AIML intelligence.
enable Enable the AIML routines.
disable Disable the AIML routines.
rebuild Triggers a rebuild of the AIML bot's brain file (this is a long operation!).

Note that when the action is set to rebuild, Corrade will re-read the AIML files and construct a binary file. This operation can take a long time and the result will be returned to the callback URL once it has finished.

Send a Notice

21 December 2014

  • Release 7.34 - added group Corrade permission.

The notice command sends a notice to a configured group.

Command Required Parameters Required Permissions Example
notice group, password, message group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "notice",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "message", "Store is updated!"
        ]
    )
);
Optional Parameters Possible Values Description Example
subject A subject for the notice.
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "notice",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "message", "Store is updated!",
            "subject", "Updates"
        ]
    )
);
item The name or UUID of an item in Corrade's inventory. Sends an attachment along with the notice.
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "notice",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "message", "A gift for our members!",
            "subject", "Gift",
            "item", "Mesh Hat"
        ]
    )
);

Pay

The pay command can pay a configured group, an avatar or an object.

Command Required Parameters Required Permissions Example
pay group, password, entity economy
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // gives L$1000 to an object
            "command", "pay",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "entity", "object",
            "target", "e69eca36-5b47-47b4-acfc-6ac7f9a97830"
            "amount", "1000" 
        ]
    )
);
Parameters Sub-Parameters Sub-Parameters Description
entity avatar firstname, lastname (or agent by UUID) Pays an avatar.
object target Pays an object.
group Pays a configured group.
reason A reason for the payment.

Get Balance

The getbalance command gets the money balance available in the bot's account.

Command Required Parameters Required Permissions Example
getbalance group, password economy
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getbalance",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // sent to URL
            "callback", llEscapeURL(URL) 
        ]
    )
);

Teleport

The teleport command makes Corrade teleport to a specified region and optionally a position. Note that teleports are subject to region teleport routing such that Corrade may not arrive at the specified position on the destination region.

Command Required Parameters Required Permissions Example
teleport group, password, region movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "teleport",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // teleports to the current region
            // that the script is in
            "region", llEscapeURL(llGetRegionName())
        ]
    )
);
Optional Parameters Possible Values Description
position An LSL Vector3 representing local coordinates in the destination region. Attempt to teleport to the specified local coordinates on the destination region.

Send Teleport Lure

The lure command sends a teleport rule to a specified avatar by name.

Command Required Parameters Required Permissions Example
teleport group, password, firstname, lastname (or agent by UUID) movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "lure",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Sleepy",
            "lastname", "Resident"
        ]
    )
);

Get Region Data

The getregiondata gets information about the current simulator that the bot is on.

Command Required Parameters Required Permissions Example
getregiondata group, password, data land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getregiondata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // returns the last lag and the 
            // agents on the current simulator
            "data", wasListToCSV([
              "LastLag", 
              "Agents"
            ]),
            // sent to URL
            "callback", llEscapeURL(URL) 
        ]
    )
);

The data parameter is supplied a CSV list of fields and properties of a libopenmetaverse Simulator structure, including any sub-structures.

For example, to query the Stats sub-structure of the Simulator structure, one could supply a list of fields to the data parameter:

Parameter Possible Values Description Examples
data ActiveScriptsNumber of Active scripts running in this simulator
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getregiondata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // returns the last lag and the 
            // agents on the current simulator
            "data", wasListToCSV([
              "LastLag", 
              "Agents"
            ]),
            // sent to URL
            "callback", llEscapeURL(URL) 
        ]
    )
);
AgentsNumber of agents currently in this simulator
AgentTime
AgentUpdates
ChildAgentsNumber of agents in neighbor simulators
ConnectTimeTime in seconds agent has been connected to simulator
DilationCurrent time dilation of this simulator
FPSCurrent Frames per second of simulator
FrameTime
ImageTime
IncomingBPSIncoming bytes per second
INPPS
LastLag
LastPingIDID of last Ping sent
LastPingSentTime last ping was sent
LSLIPS
MissedPings
NetTime
ObjectsTotal number of objects Simulator is simulating
OtherTime
OutgoingBPSOutgoing bytes per second
OUTPPS
PendingDownloadsNumber of downloads pending
PendingLocalUploadsNumber of local uploads pending
PendingUploadsNumber of uploads pending
PhysicsFPSCurrent Physics frames per second of simulator
PhysicsTime
ReceivedPongsTotal number of ping replies sent to this agent by this simulator
ReceivedResendsTotal number of resent packets recieved
RecvBytesTotal number of bytes received by this simulator to this agent
RecvPacketsTotal number of packets received by this simulator to this agent
ResentPacketsTotal number of packets that have been resent
ResidentSize
ScriptedObjectsTotal number of Active (Scripted) objects running
ScriptTime
SentBytesTotal number of bytes sent by this simulator to this agent
SentPacketsTotal number of packets sent by this simulator to this agent
SentPingsTotal number of pings sent to this simulator by this agent
UnackedBytesUnacknowledged bytes in queue
VirtualSize

Or one could query the Simulator structure for data such as the Name, SimVersion and the RegionID. Perhaps combined with the Agents field of the Stats sub-structure of the Simulator structure:

llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getregiondata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // returns the name, simversion and regionid from the Simulator structure combined 
            // with the agents field from the Stats sub-structure of the Simulator structure
            "data", wasListToCSV([
              "Name",
              "SimVersion",
              "RegionID" 
              "Agents"
            ]),
            // sent to URL
            "callback", llEscapeURL(URL) 
        ]
    )
);

Get Grid Region Data

18 December 2014

  • Release 7.31 - added.

The getgridregiondata command gets information about any grid region following the libopenmetaverse GridRegion structure.

Command Required Parameters Required Permissions Example
getgridregiondata group, password, data land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getgridregiondata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // get the number of agents and
            // the water height for the region
            // named "Puget Sound" and return
            "region", "Puget Sound",
            "data", wasListToCSV([
              "Agents", 
              "WaterHeight"
            ]),
            // sent to URL
            "callback", llEscapeURL(URL) 
        ]
    )
);

The data parameter is supplied a CSV list of fields and properties of a libopenmetaverse GridRegion structure, including any sub-structures.

Optional Parameters Possible Value Description
region The name of a region on the grid. If this parameter is not specified, Corrade assumes the current region.

Sit

The sit command can be used to make Corrade sit on an object. If the object that Corrade sits on also triggers an animation, then Corrade will accept that animation.

Command Required Parameters Required Permissions Example
sit group, password, item, range movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "sit",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // closest object named Chair
            // "item", llGetKey() to sit 
            // on this primitive
            "item", "Chair",
            // 5 meters
            "range", "5"
        ]
    )
);

item can be the name of an object or the UUID of an object.

Stand

The stand command makes Corrade stand.

Command Required Parameters Required Permissions Example
stand group, password movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "stand",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

Relax

The relax command makes Corrade sit down anywhere.

Command Required Parameters Required Permissions Example
relax group, password movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "relax",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

Run

The run command can toggle Corrade's “always run” status.

Command Required Parameters Required Permissions Example
run group, password, action movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // enable always run
            "command", "run",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "enable"
        ]
    )
);
Parameter Possible Value Description
run enable Turn on always run.
disable Turn off always run.

Create a Group

Once a group has been configured in Corrade's configuration file, the creategroup command can be used to create that group in-world.

Command Required Parameters Required Permissions Example
creategroup group, password, data economy
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "creategroup",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "data", wasListToCSV([
                "charter", "My new group!", 
                "open", "True", 
                "listed", "True",
                "fee", 100
            ])
        ]
    )
);

The data parameter is supplied a list of fields and properties from the libopenmetaverse Group structure.

Get Region Parcels Bounding Box

17 December 2014

  • Release 7.30 - added.

The parcels on the current region can be retrieved using the getregionparcelsboundingbox which returns pairs of coordinates as a CSV list of the extremities of the parcels to be found on the current region.

Command Required Parameters Required Permissions Example
getregionparcelsboundingbox group, password land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getregionparcelsboundingbox",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

Corrade refers to parcels by a single coordinate that lies within the area of the parcel to refer to. However, in order to find parcels to refer to, the getregionparcelsboundingbox can be used.

What the Coordinates Represent

We teleported to Milkyway Island, a German sandbox in Second Life and used the getregionparcelsboundingbox to retrieve the bounding-boxes of all the parcels on the region. The plots data returned by Corrade was the following:

plots=<0, 0, 0>, <256, 256, 50>, <0, 0, 0>, <20, 44, 50>, <80, 0, 0>, <144, 4, 50>, <200, 0, 0>, <256, 44, 50>, <252, 0, 0>, <256, 4, 50>, <0, 68, 0>, <4, 164, 50>, <0, 180, 0>, <44, 256, 50>

By taking pairs of vectors and plotting the result over the map, we obtain the following representation:

One of the small pairs is the pair of vectors:

<256, 44, 50>, <252, 0, 0>

which we have highlighted and then teleported to those coordinates. There we found the $4m \times 4m$ plot that corresponds to that pair of coordinates.

Determining Parcel Points

In order to get a coordinate that represents the parcel, one which you may want to pass to the position parameter of other Corrade commands, you would retrieve all the parcels bounding boxes with the getregionparcelsboundingbox command and then compute the midpoint of segment going through both points.

In other words, you will take the data returned from Corrade:

plots=<0, 0, 0>, <256, 256, 50>, <0, 0, 0>, <20, 44, 50>, <80, 0, 0>, <144, 4, 50>, <200, 0, 0>, <256, 44, 50>, <252, 0, 0>, <256, 4, 50>, <0, 68, 0>, <4, 164, 50>, <0, 180, 0>, <44, 256, 50>

take pairs of two and calculate the midpoint which will give you the parcel positions:

<128, 128, 0>
<10, 22, 0>
<112, 2, 0>
<228, 22, 0>
<254, 2, 0>
<2, 116, 0>
<22, 218, 0>

Now all these vectors represent one (and only one) of the parcels in the region (a total of 7 parcels in this example) and each of these vectors can be passed to the position parameter of Corrade when you want to refer to a parcel using parcel-related commands.

Eject an Avatar from a Parcel

The parceleject can be used to eject an avatar by name from a parcel and optionally ban them:

Command Required Parameters Required Permissions Example
parceleject group, password, firstname, lastname (or agent by UUID) land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // will eject Sleepy Resident
            "command", "parceleject",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Sleepy",
            "lastname", "Resident" 
        ]
    )
);
Optional Parameters Possible Value Description
ban true, false Also ban the avatar after ejecting them.
position A vector. A position over a parcel, or, if not specified, the affected parcel is the one that Corrade is currently on.

Freeze an Agent

Given estate manager rights, Corrade can freeze an agent by name using the parcelfreeze command.

Command Required Parameters Required Permissions Example
parcelfreeze group, password, firstname, lastname (or agent by UUID), freeze land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "parcelfreeze",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Sleepy",
            "lastname", "Resident",
            /// true or false
            "freeze", "true"
        ]
    )
);
Optional Parameters Possible Value Description
position A vector. A position over a parcel, or, if not specified, the affected parcel is the one that Corrade is currently on.

Set Parcel Music

14 December 2014

  • Release 7.28 - this command has been removed, please use the setparceldata command.

The parcelmusic can be used to set the streaming parcel music on the current parcel that Corrade is standing on.

Command Required Parameters Required Permissions Example
parcelmusic group, password, URL land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "parcelmusic",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "URL", llEscapeURL("http://radio.com/playlist.pls")
        ]
    )
);

Set Home

31 March 2015

  • Release 7.91 - permission changed from movement to grooming since it pertains more to Corrade itself rather than its movement.

Given in-world rights, the sethome command will set Corrade's home to the current spot that it is standing on.

Command Required Parameters Required Permissions Example
sethome group, password grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "sethome",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

Go Home

As a complement to the teleport command, the gohome command is a shortcut that will make Corrade teleport to its set home.

Command Required Parameters Required Permissions Example
gohome group, password movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "gohome",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

Set Profile Data

Command Required Parameters Required Permissions Example
setprofiledata group, password, data grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "setprofiledata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "data", wasListToCSV([
                "AboutText", "Good day!",
                // assuming cat is a texture in the inventory
                "ProfileImage", "cat"
            ])
        ]
    )
);

The data parameter follows the AvatarProperties libopenmetaverse structure and sub-structures.

Parameter Possible Values Description
data AboutTextSecond Life profile text
AllowPublishShould this profile be published on the web
FirstLifeImageFirst Life image ID
FirstLifeTextFirst Life about text
FlagsFlags of the profile
MaturePublishIs this a mature profile
ProfileImageProfile image ID
ProfileURLWeb URL for this profile
LanguagesTextLanguages profile field
SkillsMaskSkills mask
SkillsTextSkills text
WantToMaskWantTo mask
WantToTextWantTo text

The SkillsMask and the SkillsMask are special, they represent a bitfield mask corresponding to the individual tick-boxes on the interests profile tab.

The following table gives the individual values of each tick-box for the I Want To: section:

I Want To: Value
Build 1
Explore 2
Meet 4
Group 8
Buy 16
Sell 32
Be Hired 64
Hire 128

And the following table is for the skills section:

Skills: Value
Textures 1
Architecture 2
Event Planning 4
Modeling 8
Scripting 16
Custom Characters 32

Setting the SkillsMask and the WantToMask is fairly literal and can be done using one single command using the wasSetBitFlags from the LSL FUSS page.

For example, if we wanted to set the tick-boxes of Group and Explore we would send the command to Corrade in the following way:

        llInstantMessage(CORRADE, 
            wasKeyValueEncode(
                [
                    "command", "setprofiledata",
                    "group", llEscapeURL(GROUP),
                    "password", llEscapeURL(PASSWORD),
                    "data", wasListToCSV(
                        [
                            "WantToMask",
                            wasSetBitFlags(
                                [ "Group","Explore" ],
                                [ "Build", "Explore", "Meet", "Group", "Buy", "Sell", "Be Hired", "Hire" ]
                            )
                        ]
                    ),
                    "callback", llEscapeURL(URL)
                ]
            )
        );

The same applies procedure applies to SkillsMask. Suppose we wanted to tick the checkbox of Event Planning and Custom Characters. In that case we would issue:

        llInstantMessage(CORRADE, 
            wasKeyValueEncode(
                [
                    "command", "setprofiledata",
                    "group", llEscapeURL(GROUP),
                    "password", llEscapeURL(PASSWORD),
                    "data", wasListToCSV(
                        [
                            "SkillsMask",
                            wasSetBitFlags(
                                [ "Event Planning", "Custom Characters" ],
                                [ "Textures", "Architecture", "Event Planning", "Modeling", "Scripting", "Custom Characters" ]
                            )
                        ]
                    ),
                    "callback", llEscapeURL(URL)
                ]
            )
        );

Get Profile Data

The getprofiledata gets profile information of a named avatar.

Command Required Parameters Required Permissions Example
getprofiledata group, password, data, firstname, lastname (or agent by UUID) interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getprofiledata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Mark",
            "lastname", "Spree",
            "data", wasListToCSV([
                "BornOn",
                "Flags"
            ])
        ]
    )
);

The data parameter follows the AvatarProperties libopenmetaverse structure and sub-structures.

Parameter Possible Values Description
data AboutTextSecond Life profile text
AllowPublishShould this profile be published on the web
FirstLifeImageFirst Life image ID
FirstLifeTextFirst Life about text
FlagsFlags of the profile
MaturePublishIs this a mature profile
ProfileImageProfile image ID
ProfileURLWeb URL for this profile
LanguagesTextLanguages profile field
SkillsMaskSkills mask
SkillsTextSkills text
WantToMaskWantTo mask
WantToTextWantTo text

The SkillsMask and the SkillsText are special, they represent a bitfield mask corresponding to the individual tick-boxes on the interests profile tab.

The following table gives the individual values of each tick-box for the I Want To: section:

I Want To: Value
Build 1
Explore 2
Meet 4
Group 8
Buy 16
Sell 32
Be Hired 64
Hire 128

And the following table is for the skills section:

Skills: Value
Textures 1
Architecture 2
Event Planning 4
Modeling 8
Scripting 16
Custom Characters 32

Assuming that a request has been sent to Corrade to return the flags for the I Want To: section by setting the data parameter to wanttomask:

        llInstantMessage(CORRADE, 
            wasKeyValueEncode(
                [
                    "command", "getprofiledata",
                    "group", llEscapeURL(GROUP),
                    "password", llEscapeURL(PASSWORD),
                    // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
                    "firstname", "Kira",
                    "lastname", "Komarov",
                    "data", "WantToMask",
                    "callback", llEscapeURL(URL)
                ]
            )
        );

The response will come back the callback URL. We can then process the returned data and obtain the ticked checkboxes:

    http_request(key id, string method, string body) {
        // send OK to corrade's callback request
        llHTTPResponse(id, 200, "Ok");
        // first get the data an unescape it
        list data = wasCSVToList(
            llUnescapeURL(
                wasKeyValueGet("data", body)
            )
        );
        // data comes in as "wanttomask, NUMBER"
        // so we get the NUMBER and store it
        integer wanttomask = llList2Integer(
            data, 
            llListFindList(
                data, 
                ["WantToMask"]
            )+1
        );
        // finally, we get the flags from the mask
        list flags = wasGetBitFlags(
            wanttomask,
            [ "Build", "Explore", "Meet", "Group", "Buy", "Sell", "Be Hired", "Hire" ]
        );
        // and print the list of set flags
        llOwnerSay(wasListToCSV(flags));
    }

The wasGetBitFlags function is a helper function that can be found in the LSL FUSS section.

Inventory Manipulation using Path-Based Commands

28 March 2015

  • Release 7.86 - added the actions cp (copy an item), mv (move an item), ln (create an item link).

25 March 2015

  • Release 7.83 - added.

The inventory commands allows an user to manipulate Corrade's inventory by using a set of commands comparable to UNIX commands for manipulating directory paths. When Corrade is started, each group has its own unique current directory set to My Inventory, which can then be manipulated and altered separately by each group in part.

Command Required Parameters Required Permissions Example
inventory group, password, action inventory
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // show current directory.
            "command", "inventory",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "cwd"
        ]
    )
);
Action Required Parameter Optional Parameter Description
ls path Lists the contents of the current folder with an optional path.
cwd List the current directory.
cd path Changes directory to the folder specified by the path.
mkdir name path Creates a directory specified by name at a given optional path - or, inside the current directory, if the path is not specified.
chmod permissions path Sets the permissions on the items in the current directory, or in a directory specified by path or an item in the path.
rm path Moves everything in the current directory or the item specified by path to the Trash folder.
cp source Copies an item specified by the source path to the target folder.
target
mv source Moves an item specified by the source path to the target folder.
target
ln source Creates a link from the source path to the target folder. Note that the source must be the path to an item and that folders are not supported.
target

Specifying Paths

One of the problems with Linden protocols is that inventory items may carry the same name, which is something that filesystems usually do not support, which makes referring to an item by name ambiguous. To overcome this problem, Corrade allows the path parameter to be built by name or by UUID or a combination thereof.

As an example, consider the following tree:

   + My Inventory (UUID: 7c38c488-5440-46c2-9f14-d5e3fcd0cc16)
   |
   +- Textures (UUID: 56a54ebe-7d4d-4839-a618-42ee3b307717)
         +
         |
         +- Floors (UUID: b13b0890-fac6-4085-975c-c2f760b185e4)
         |    +
         |    |
         |    +- Deck (UUID: 3e51dd70-9cd8-4dcf-9465-58c7036e673d)
         |
         +- Floors (UUID: c590792b-a724-4bb6-9f0c-81b6e733fad5)
              +
              |
              +- Table (UUID: 6eaffc93-df2a-479b-836b-4778bb917619)

If we wanted to list Deck, then supplying /My Inventory/Textures/Floors/Deck to the path parameter would be ambiguous since it is uncertain which Floors folder should be browsed. To get rid of the Linden ambiguity, Corrade allows specifying UUIDs in the paths such that we are able to correctly reference Deck by supplying: /My Inventory/Textures/b13b0890-fac6-4085-975c-c2f760b185e4/Deck to the path parameter. Note that it is also possible to specify any of the other path components as UUIDs rather than by names - yet, in this case, that is not necessary: when you supply a name in the path, you are making a weak reference, when you are supplying an UUID you are making a strong reference.

Permissions

Let us enumerate a notecard called test and placed in the Notecards sub-folder of My Inventory:

llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // show current directory.
            "command", "inventory",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "ls",
            "path", llEscapeURL("/My Inventory/Notecards/test"),
            "callback", llEscapeURL(URL)
        ]
    )
);

the callback will receive a data key with the following CSV:

name, test, item, b815f8e4-0367-b361-9227-f1ab7e036eef, type, notecard, permissions, cdemvt------------cdemvtcdemvt

we can thus observe that the permissions for the test notecard are:

cdemvt------------cdemvtcdemvt

these permissions are similar to UNIX commands and are compatible with Corrade's chmod action of the inventory command. They describe all the permissions governing our test notecard.

To dissect these permissions, you can use the following guide:

  • split that string in segments of 6 characters: cdemvt, ------, ------, cdemvt, cdemvt.
  • each segment means, in order: base permissions, everyone permissions, group permissions, next owner permissions, owner permissions.
  • each character means, in order: c (copy), d (damage), e (export), m (modify), v (move), t (transfer).
    • if any of the previously mentioned characters are missing and have a dash (-) instead, that means that the permissions is missing.

Suppose that we wanted to change the permissions for the next owner and remove the modify permissions. We would then issue the following command:

llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // show current directory.
            "command", "inventory",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "chmod",
            "path", llEscapeURL("/My Inventory/Notecards/test"),
            "permissions", llEscapeURL("cdemvt------------cde-vtcdemvt"),
            "callback", llEscapeURL(URL)
        ]
    )
);

The original permissions for the test notecard were:

cdemvt------------cdemvtcdemvt

and the new permissions are now:

cdemvt------------cde-vtcdemvt

As you can see, the 4th segment which refers to the next owner permissions is missing the m component, meaning that it cannot be modified.

Give Inventory Item

The give command can be used to give an item from inventory to an agent by name.

Command Required Parameters Required Permissions Example
give group, password, item, entity inventory
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "give",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Carrot", // or UUID
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Bugs",
            "lastname", "Bunny"
        ]
    )
);

item can be the name of an object or the UUID of an object.

Parameter Possible Value Additional Parameters Description Example
entity avatar firstname The first name of the avatar to give the item to.
lastname The second name of the avatar to give the item to.
agent The key of the agent if more convenient than firstname and lastname
item An UUID or name of an item in the bot's inventory.
object range The range in which to find the object to give the item to.
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "give",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // an item or UUID in inventory
            "item", "smile",
            // give the item to an object
            // instead of an avatar.
            "entity", "object",
            // object name or uuid to give 
            // the item to.
            "target", "Face",
            // the range in which to find 
            // the object to give the item to.
            "range", 3,
            "callback", llEscapeURL(URL)
        ]
    )
);
target A name or UUID of the object to give the inventory item to.
item An UUID or name of an item in the bot's inventory.

Delete an Item

The deleteitem command moves an item to the Trash folder.

Command Required Parameters Required Permissions Example
deleteitem group, password, item inventory
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "deleteitem",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Carrot" // or UUID
        ]
    )
);

item can be the name of an object or the UUID of an object.

Empty Trash

Using the emptytrash command, Corrade can be made to empty its Trash folder.

Command Required Parameters Required Permissions Example
emptytrash group, password inventory
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "emptytrash",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

Fly

Corrade can be made to fly or stop flying using the fly command.

Command Required Parameters Required Permissions Example
fly group, password, action movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "fly",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // either start or stop
            "action", "start"
        ]
    )
);

Add Pick

Corrade can add a pick by name using the addpick command.

Command Required Parameters Required Permissions Example
addpick group, password, name grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "addpick",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // an unique name
            "name", "Good day!"
        ]
    )
);
Optional Parameter Possible Values Description
description A string. A description for the pick
item Either the name of an item in Corrade's inventory or an UUID The image for the pick

Delete a Pick

Corrade can delete a pick by name.

Command Required Parameters Required Permissions Example
deletepick group, password, name grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "deletepick",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // an unique name
            "name", "Good day!" 
        ]
    )
);

Touch a Primitive

Corrade can be made to touch a primitive in a given range. Note that Corrade does not mind whether the primitive is in a link-set or an attachment. It will touch any primitive regardless of where it is.

Command Required Parameters Required Permissions Example
touch group, password, item, range interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "touch",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // a primitive name or uuid
            "item", "helmet",
            // 5 meters
            "range", "5"
        ]
    )
);

item can be the name of an object or the UUID of an object.

Moderate a Group

21 December 2014

  • Release 7.34 - added group Corrade permission.

Corrade can be made to silence or unsilence an agent within a configured group for both voice and text chat.

Command Required Parameters Required Permissions Example
moderate group, password, firstname, lastname (or agent by UUID), type, silence group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "moderate",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Trumpet",
            "lastname", "Man",
            // can be either voice or text
            "type", "voice", 
            // either true or false
            "silence", "true" 
        ]
    )
);

Rebake

Corrade can rebake its own textures using the rebake command.

Command Required Parameters Required Permissions Example
rebake group, password grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "rebake",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

Get Worn Attachments

Using the getattachments command, Corrade will return a list of attachment points and name of the worn objects.

Command Required Parameters Required Permissions Example
getattachments group, password grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getattachments",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);
// will return eg: Skull, Helmet, Mouth, Milk Bottle, Chin, Pierce

Attach a Primitive from Inventory

The attach command allows Corrade to attach multiple (or only one) objects from inventory to their attachment points.

Command Required Parameters Required Permissions Example
attach group, password, attachments grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "attach",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // skull, mouth are attachment points (see documentation)
            // Helmet and Milk Bottle are object names in the inventory
            // ... You can also use UUIDs for primitive names.
            "attachments", wasListToCSV(
                [
                    "Skull", "Helmet", 
                    "Mouth", "Milk Bottle"
                ]
            );
        ]
    )
);

The attachment parameter accepts pairs of attachment points and object in inventory. Here is a full list of attachment points:

Point Description
DefaultRight hand if object was not previously attached
ChestChest
SkullSkull
LeftShoulderLeft shoulder
RightShoulderRight shoulder
LeftHandLeft hand
RightHandRight hand
LeftFootLeft foot
RightFootRight foot
SpineSpine
PelvisPelvis
MouthMouth
ChinChin
LeftEarLeft ear
RightEarRight ear
LeftEyeballLeft eyeball
RightEyeballRight eyeball
NoseNose
RightUpperArmRight upper arm
RightForearmRight forearm
LeftUpperArmLeft upper arm
LeftForearmLeft forearm
RightHipRight hip
RightUpperLegRight upper leg
RightLowerLegRight lower leg
LeftHipLeft hip
LeftUpperLegLeft upper leg
LeftLowerLegLeft lower leg
StomachStomach
LeftPecLeft pectoral
RightPecRight pectoral
HUDCenter2HUD Center position 2
HUDTopRightHUD Top-right
HUDTopHUD Top
HUDTopLeftHUD Top-left
HUDCenterHUD Center
HUDBottomLeftHUD Bottom-left
HUDBottomHUD Bottom
HUDBottomRightHUD Bottom-right
NeckNeck
RootAvatar Center

Detach an Attachment by Name

Corrade can detach attached items using the detach command.

Command Required Parameters Required Permissions Example
detach group, password, attachments grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "detach",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // Helmet and Milk Bottle are object names in the inventory
            // ... You can also use UUIDs for primitive names.
            "attachments", wasListToCSV(
                [
                    "Helmet", 
                    "Milk Bottle"
                ]
            )
        ]
    )
);

Get Primitive Data

Corrade can query primitives using the getprimitvedata command.

Command Required Parameters Required Permissions Example
getprimitivedata group, password, item, data, range interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getprimitivedata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Vendor",
            // searches in a 5m range
            "range", "5",
            // returns the position and primitive text as CSV
            "data", wasListToCSV([
              "Position", 
              "Text"
            ]),
            "callback", llEscapeURL(URL)
        ]
    )
);

The data parameter follows the libopenmetaverse Primitive structure and sub-structures.

the return values are a CSV list of fields or properties to their corresponding values. For example, suppose you wanted to query the rotation and overhead text of a primitive. In that case you would issue:

llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getprimitivedata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Vendor",
            // searches in a 5m range
            "range", "5",
            // returns the rotation and primitive text
            "data", wasListToCSV([
              "Rotation", 
              "Text"
            ]),
            "callback", llEscapeURL(URL)
        ]
    )
);

and Corrade would return the string:

group=MyGroup&success=True&data=Rotation, <0, 0, 0, 1>, text, Good day!

Now to extract the value of the text component “Good day!”, we process the data in http_request:

http_request(key id, string method, string body) {
    // always confirm reception or the request will time-out
    llHttpResponse(id, 200, "Ok");
 
    // de-serialize the value of the "data" key to a list
    list data = wasCSVToList(
        llUnescapeURL(
            wasKeyValueGet(
                "data", 
                body
            )
        )
    );
 
    // now "data" will look like:
    // data = [ "rotation", "<0, 0, 0, 1>", "text", "Good day!" ];
    // and since we want to grab the "text", we search the data
    // list for the string "text" and return the value
    string text = llList2String(
        data,
        llListFindList(
            data, 
            ["Text"]
        )+1
    );
 
    // now we have the text and can do something with it
    llOwnerSay(text);
}

Remarks

The getprimitivesdata command is relatively-speaking slow compared to, say getprimitiveowners that retrieves the owners of all the primitives on a parcel or region. However, contrasted to getprimitiveowners, the getprimitivesdata command can be used without requiring any permissions. In other words, getprimitivesdata would be the only way to account for the owners of primitives on a parcel if land permissions cannot be granted to Corrade. As a very shallow benchmark, for illustrative purposes, the getprimitivesdata command takes about 8 minutes on a region with 1138 primitives - this is due to the fact that getprimitivesdata performs a deep-scan of all objects without help from Linden protocols; whereas getprimitiveowners retrieves that data directly from the grid.

Activate a Group

The activate command activates a configured group.

Command Required Parameters Required Permissions Example
activate group, password grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "activate",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

Move to a Local Position

3 December 2014

  • Release 7.27 - the move command no longer requires a position parameter for the stop action.

The move command makes Corrade use the simulator auto-pilot to move to a specified position. Note that the simulator auto-pilot command will not work properly if the position vector has a set z component higher than the current altitude of the bot.

Command Required Parameters Required Permissions Example
move group, password, position, action movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "move",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // one meter on the positive x axis
            "position", llGetPos() + <1,0,0>,
            "action", "start"
        ]
    )
);
Parameter Possible Value Description
action start Starts moving to the given position.
stop Cancels the movement.

The position parameter is only required if the action parameter has been set to start.

Turn Towards a Position

The turnto command makes Corrade rotate towards a positional vector (an LSL vector in the format <x, y, z> that describes a point in space).

Command Required Parameters Required Permissions Example
turnto group, password, position movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "turnto",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "position", llEscapeURL(<10,10,0>)
        ]
    )
);

Set or Get Current Group Tag or Title

20 February 2015

  • Release 7.71 - renamed the command from settitle to tag.

The tag command can make Corrade get or set the current group tag.

Command Required Parameters Required Permissions Example
tag group, password, action grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "tag",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "set",
            // the title must exist
            "title", llEscapeURL("Good day!")
        ]
    )
);
Parameter Possible Value Second Parameter Possible Value Description
action set title Any title name that is defined for the command group. Set the current group tag.
get Gets the current group tag.

Get Group Titles

20 February 2015

  • Release 7.71 - added.

The gettitles command can be used to enumerate all the titles for a command group.

Command Required Parameters Required Permissions Example
gettitles group, password group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "gettiles",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

Returns a CSV data list of title data, for each group title, in-order:

  1. a string containing the title,
  2. the UUID of the title,
  3. the role name corresponding to the title,
  4. the UUID of the role corresponding to the title.

Start a Proposal

21 December 2014

  • Release 7.34 - added group Corrade permission.

The startproposal can make Corrade start a proposal.

Command Required Parameters Required Permissions Example
startproposal group, password, duration, majority, quorum, text group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "startproposal",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "duration", 5, // days
            "majority", .5,
            "quorum", 2,
            "text", "Sell our land?"
        ]
    )
);

Mute or Unmute an Avatar or Object

The mute command can mute both avatars or objects by a given mute name.

Command Required Parameters Required Permissions Example
mute group, password, action, target, name mute
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "mute",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "mute", // or unmute
            "target", llGetKey(), // mute this object
            // an unique mute name
            "name", llGetObjectName()
        ]
    )
);

Get Primitive Particle System

For any primitive in range with a set particle system, Corrade can serialize the particle system to an LSL-compatible parameter list.

Command Required Parameters Required Permissions Example
getparticlesystem group, password, item, range interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getparticlesystem",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Jet-Engine",
            // 5 meters
            "range", 5,
            "URL", llEscapeURL(URL)
        ]
    )
);

The results will be returned as the particlesystem key.

Notify

The notify command can be used to install notifications for a given configured group. Once an event is raised, Corrade sends the notification to a specified URL. The URL can be the same as the callback URL or a different one.

Command Required Parameters Required Permissions Example
notify group, password, action, type, URL notifications
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "notify",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "set", // or get
            "type", wasListToCSV([
              // in-world system alerts
              "alert",
              // group chat
              "group"
            ]),
            "URL", llEscapeURL(NOTIFICATION_URL),
            "callback", llEscapeURL(CALLBACK_URL)
        ]
    )
);
Parameter Possible Values Description
action set Set a notification.
get Get installed notifications.
clear Remove all installed notifications.

Depending on the type of notification, Corrade will send the notification as key-value pairs to the specified URL. This URL can be different for the different types of notifications or it can be the same as the callback URL. Whenever a notification event occurs, if there exists a binding for the given notification, Corrade will send that notification to the bound URL.

For example, if you bind to the local chat notification with:

        llInstantMessage(CORRADE, 
            wasKeyValueEncode(
                [
                    "command", "notify",
                    "group", llEscapeURL(GROUP),
                    "password", llEscapeURL(PASSWORD),
                    "action", "set",
                    "type", "local",
                    "URL", llEscapeURL(NOTIFICATION_URL),
                    "callback", llEscapeURL(CALLBACK_URL)
                ]
            )
        );

Corrade will first send a confirmation message to CALLBACK_URL that it has bound the local chat notification to the NOTIFICATION_URL.

Now, whenever local chat occurs, Corrade will send the message to NOTIFICATION_URL. For example, if Sneaky Resident writes in local chat “boo” and Corrade is in hearing range, Corrade sends the following snippet:

type=local&message=boo&firstname=Sneaky&lastname=Resident&owner=1ad33407-a792-476d-a5e3-06007c0802bf&item=1ad33407-a792-476d-a5e3-06007c0802bf

to the NOTIFICATION_URL.

Note that Corrade's notification setting is not persistent and that scripts have to set them again in case Corrade restarts.

Database

Corrade bundles an integrated key-value based database. You can effectively use Corrade to store key-value pairs thereby eliminating the need to run a database.

Command Required Parameters Required Permissions Example
database group, password, action, key, value database
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "database",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "set", // or get
            "key", "greeting",
            "value", "Good day!"
        ]
    )
);

Based on the action parameter, Corrade can be made to set or get values in the database:

  • Values are set by providing set to the action parameter along with key and value parameters.
  • Values can be retrieved by providing get to the action parameter along with a key parameter.
Parameter Possible Values Sub-parameters Description
action get key Get the value of key.
set key, value Set the value of key.
delete key Delete a key-value pair from the database.

Search Directory Services

4 February 2015

  • Release 7.62 - The directorysearch now returns the full list of matches based on the supplied criteria - the old behavior is that only the first most relevant (based on a scoring system) match would be returned. This means that the directorysearch command can now be used to return a list of matches instead of a single match. The results are still sorted in the order of relevant with most relevant being returned first. Since the results can now be rather large depending on the search criteria, it is recommended to use sifting to return only partial results.
  • Release 7.62 - The timeout parameter is no longer used.

Corrade is able to search directory services for classifieds, events, groups, land, people and places.

Command Required Parameters Required Permissions Example
directorysearch group, password, type, name1) directory
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "directorysearch",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "type", "event",
            "name", "hunt"
        ]
    )
);
Parameter Possible Values Description
type classified, event, group, land, people, places The directory search type.

The results can be filtered using the optional data parameter which follows the libopenmetaverse data structures of each search type. In order to do so, supply a CSV list to the data parameter containing pairs of fields or properties and the desired value.

Parameter Possible Values Optional Parameter Structure Example
type classified data Classified
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "directorysearch",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "type", "classified",
            "name", "hunt",
            "timeout", 10000,
            "data", wasListToCSV(
                [
                    "Price",
                    73888
                ]
            ),
            "callback", llEscapeURL(URL)
        ]
    )
);
name A string to search the name by.
timeout An integer representing the number of milliseconds after which the search will be aborted and the results returned.
event data Event Search Data
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "directorysearch",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "type", "event",
            "name", "hunt",
            "timeout", 10000,
            "data", wasListToCSV(
                [
                    "Owner",
                    "fc785fe9-f15b-431d-9f2f-3104811095b"
                ]
            ),
            "callback", llEscapeURL(URL)
        ]
    )
);
name A string to search the name by.
timeout An integer representing the number of milliseconds after which the search will be aborted and the results returned.
group data Group Search Data
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "directorysearch",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "type", "group",
            "name", "Wizardry",
            "timeout", 10000,
            "data", wasListToCSV(
                [
                    "Members",
                    17
                ]
            ),
            "callback", llEscapeURL(URL)
        ]
    )
);
timeout An integer representing the number of milliseconds after which the search will be aborted and the results returned.
land data Directory Parcel
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "directorysearch",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "type", "land",
            "timeout", 10000,
            "data", wasListToCSV(
                [
                    "ActualArea",
                    4096,
                    "SalePrice",
                    1
                ]
            ),
            "callback", llEscapeURL(URL)
        ]
    )
);
timeout An integer representing the number of milliseconds after which the search will be aborted and the results returned.
people data Agent Search Data
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "directorysearch",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "type", "people",
            "name", "Roger",
            "timeout", 10000,
            "data", wasListToCSV(
                [
                    "Online",
                    "True"
                ]
            ),
            "callback", llEscapeURL(URL)
        ]
    )
);
timeout An integer representing the number of milliseconds after which the search will be aborted and the results returned.
places data Directory Parcel
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "directorysearch",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "type", "place",
            "name", "love",
            "timeout", 10000,
            "data", wasListToCSV(
                [
                    "ActualArea",
                    4096
                ]
            ),
            "callback", llEscapeURL(URL)
        ]
    )
);

Restart a Region

Command Required Parameters Required Permissions Example
restartregion group, password, action land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "restartregion",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "restart"
        ]
    )
);
Parameter Possible Values Description
action restart Schedules a region restart.
cancel Cancels a pending region restart.
Optional Parameter Possible Value Description
delay An integer. The number of seconds to wait before restarting a region. If this parameter is not specified, then a delay of 120 seconds will be assumed.

Get Region Top Scripts and Colliders

The getregiontop command gets the current region top scripts or colliders.

Command Required Parameters Required Permissions Example
getregiontop group, password, type land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "getregiontop",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "type", "scripts",
            "callback", llEscapeURL(URL)
        ]
    )
);
Parameter Possible Values Description
type scripts Get region top scripts.
colliders Get region top colliders.

The command also supports an optional parameter called amount which represents the amount of top scripts or colliders to return. If the amount parameter is not supplied, then only the first 5 tasks will be returned.

The data returned to the URL is a CSV-list for every top script or collider (also called a task), sorted by its score and the data is returned in the following order:

  1. The name of the task.
  2. UUID of the task.
  3. The score.
  4. The owner name of the task.
  5. A vector representing the position of the task.

The returned data will be serialised in the top return key.

Set Estate Lists (Bans, Groups, Managers, Users)

The setestatelist command can be used to add or remove bans, groups, managers and users from the current estate.

Command Required Parameters Required Permissions Example
setestatelist group, password, type, action land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Ban the resident Spooky Resident
            "command", "setestatelist",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "type", "ban",
            "action", "add",
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Spooky",
            "lastname", "Resident",
            // From all estates
            "all", "True"
        ]
    )
);
Parameter Possible Value Parameter Possible Value Parameter Optional Parameter Possible Value Description
type ban action add firstname, lastname (or agent by UUID) all True, False Adds or removes an agent by name from the estate ban list, optionally banning them from all the estates of the owner.
remove
group action add target Adds or removes a group by name or UUID from the estate allowed list.
remove
manager action add firstname, lastname (or agent by UUID) Adds or removes an agent by name from the estate manager list.
remove
user action add firstname, lastname (or agent by UUID) Adds or removes an agent by name from the estate allowed user list
remove

Get Estate Lists (Bans, Groups, Managers, Users)

4 February 2015

  • Release 7.62 - The timeout parameter has been removed.

The getestatelist command retrieves the bans, allowed groups, managers and allowed users of the current estate.

Command Required Parameters Required Permissions Example
getestatelist group, password, type land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Get the ban list for the current estate.
            "command", "getestatelist",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "type", "ban",
            // 5000ms timeout
            "timeout", 5000,
            "callback", llEscapeURL(URL)
        ]
    )
);
Parameter Possible Values Description
type ban Retrieves the ban-list for the current estate.
group Retrieves the allowed-groups list for the current estate.
manager Retrieves the estate managers for the current estate.
user Retrieves the allowed-users list for the current estate.

Start or Stop an Animation

10 March 2015

  • Release 7.82 - fixed.

The animation command can be used to either start or stop an animation.

Command Required Parameters Required Permissions Example
animation group, password, item, action grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Ban the resident Spooky Resident
            "command", "animation",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "start",
            // the name of an item in Corrade's inventory
            "item", "Dance",
            "callback", llEscapeURL(URL)
        ]
    )
);

Get Currently Running Animations

The getanimations command returns the currently playing animations on Corrade.

Command Required Parameters Required Permissions Example
getanimations group, password grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Ban the resident Spooky Resident
            "command", "getanimations",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

The results will be serialised as CSV in the return key animations as a list of UUIDs to priorities.

Reply To a Group Invite

21 December 2014

  • Release 7.34 - added.

The replytogroupinvite command can be used to accept group invites.

Command Required Parameters Required Permissions Example
replytogroupinvite group, password, action, session group, economy
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Accept a group invite.
            "command", "replytogroupinvite",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "accept",
            "session", "3f1990a5-4842-403f-b750-0e39cdf69687"
        ]
    )
);

The action is by default decline if not specified.

The economy Corrade permission is only needed in case there is a cost to join a group; at which point Corrade will check the current balance, pay the fee and join the group if action is set to accept.

Get Pending Group Invites

21 December 2014

  • Release 7.34 - added.

The getgroupinvites command can be used to list all group invites received by Corrade.

Command Required Parameters Required Permissions Example
getgroupinvites group, password group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // List all pending group invites.
            "command", "getgroupinvites",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

The CSV list of group invites contains, in order:

  1. the first name of the agent sending the group invite.
  2. the last name of the agent sending the group invite
  3. the agent UUID of the agent sending the group invite
  4. the name of the group that Corrade is invited to.
  5. the session UUID of the group invite.
  6. the fee required to join the group.

Some of the returned parameters in the CSV list are the ones needed by the replytogroupinvite command in order to accept or decline the group invite.

Reply To a Script Dialog

21 December 2014

  • Release 7.34 - renamed the command from replytodialog to replytoscriptdialog.

The replytoscriptdialog command can click a button on a dialog pop-up. The dialog data from where the required parameters can be retrieved is given by the dialog notification using the notify command.

Command Required Parameters Required Permissions Example
replytoscriptdialog group, password, channel, index, button, item interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Ban the resident Spooky Resident
            "command", "replytoscriptdialog",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "channel", -30,
            "index", 1,
            "button", "Menu",
            "item", "35afb3f-0cf5-4ab6-9364-11a9f3df1148",
            "callback", llEscapeURL(URL)
        ]
    )
);
Parameter Meaning
channel The channel that the dialog was sent on.
index The button index.
button The name of the button to press.
item The UUID of the primitive sending the dialog.

Get Pending Script Dialogs

21 December 2014

  • Release 7.34 - added.

The getscriptdialogs returns a CSV list of pending script dialogs.

Command Required Parameters Required Permissions Example
getscriptdialogs group, password interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Retrieves all pending script dialogs
            "command", "getscriptdialogs",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

The CSV list of retrieved script dialogs contains, in order:

  1. the message of the dialog.
  2. the first name of the sending owner.
  3. the last name of the sending owner.
  4. the channel on which the dialog was sent.
  5. the name of the object.
  6. the item UUID.
  7. the owner UUID.
  8. a list of button names.

Some of the returned parameters in the CSV list are the ones needed by the replytoscriptdialog command in order to reply to a script dialog.

Rez

The rez command can be used to rez objects from Corrade's inventory.

Command Required Parameters Required Permissions Example
rez group, password, position, item inventory
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // rez Chair from inventory at
            // postion <96.778328, 176.192261, 32.832947>
            // with no rotation
            "command", "rez",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "position", <96.778328, 176.192261, 32.832947>,
            "item", llEscapeURL("Chair"),
            "callback", llEscapeURL(URL)
        ]
    )
);
Optional Parameter Possible Value Description
rotation An Euler rotation (in vector form). Rez the object with the specified rotation.

Derez

The derez command attempts to de-rez an object from a parcel, placing it back into Corrade's inventory.

Command Required Parameters Required Permissions Example
derez group, password, item, range inventory
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // attempt to derez a Chair
            "command", "derez",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", llEscapeURL("Chair"),
            "range", 5
            "callback", llEscapeURL(URL)
        ]
    )
);
Optional Parameter Possible Value Description
folder A name or UUID of a folder. Attempts to de-rez the item to the specified folder
type A field name from DeRezDestination. Can take, delete, attach, etc... The specified item as the de-rez action.

Get Script Running State

The getscriptrunning command can be used to query a script inside a primitive and return a running key with the value set to True if the script is running or False otherwise.

Command Required Parameters Required Permissions Example
getscriptrunning group, password, item, range, entity interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // check whether the "sit"
            // script in the "Chair"
            // is currently running
            "command", "getscriptrunning",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", llEscapeURL("Chair"),
            "range", 5,
            "entity", llEscapeURL("sit"),
            "callback", llEscapeURL(URL)
        ]
    )
);
Parameter Description
item The name or UUID of the primitive to search the script for.
entity The name or UUID of the script inside the primitive.

Set Script Running State

The setscriptrunning command can be used to set a script's running state inside a primitive to start or stop depending on the action parameter. Note that scripts that are added to a primitive using the give command have to be started using this command.

Command Required Parameters Required Permissions Example
setscriptrunning group, password, item, range, entity, action interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // starts the script called 
            // "sit" in a "Chair" object
            "command", "setscriptrunning",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", llEscapeURL("Chair"),
            "range", 5,
            "entity", llEscapeURL("sit"),
            "action", "start",
            "callback", llEscapeURL(URL)
        ]
    )
);

Get Primitive Inventory

The getprimitiveinventory command can be used to retrieve the names and UUIDs of items inside a primitive inventory.

Command Required Parameters Required Permissions Example
getprimitiveinventory group, password, item, range interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // gets the inventory of the 
            // object named "Chair"
            "command", "getprimitiveinventory",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", llEscapeURL("Chair"),
            "range", 5,
            "callback", llEscapeURL(URL)
        ]
    )
);

The return value will be stored in the value of the key inventory as a CSV list of names by UUIDs.

Update Primitive Inventory

The updateprimitiveinventory command can be used to manipulate the items in the inventory of a primitive.

Command Required Parameters Required Permissions Example
updateprimitiveinventory group, password, item, range, action interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // deletes an item named "Sit Script"
            // in a primitive called "Chair", that
            // is in a 5 meter range.
            "command", "updateprimitiveinventory",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", llEscapeURL("Chair"),
            "range", 5,
            "action", "remove",
            "entity", llEscapeURL("Sit Script")
        ]
    )
);
Parameter Possible Value Parameter Possible Value Description
action add entity The name or UUID of an item in Corrade's inventory. Adds an inventory item from Corrade's inventory to the primitive's inventory.
remove entity The name or UUID of an item in the primitive's inventory. Removes an item from the primitive's inventory.
take entity The name or UUID of an item in the primitive's inventory. Attempts to take an item (create a copy to the specified folder and remove from the primitive's inventory) from the primitive's inventory.
folder The name or UUID of a folder in Corrade's inventory.

Get Primitive Inventory Data

The getprimitiveinventorydata command can be used to query items inside a primitive's inventory by following the InventoryItem structure.

Command Required Parameters Required Permissions Example
getprimitiveinventorydata group, password, item, range, entity, data interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // gets information about the 
            // "sit" script inside a primitive
            // named "Chair.
            "command", "getprimitiveinventorydata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", llEscapeURL("Chair"),
            "range", 5,
            "entity", llEscapeURL("sit"),
            "data", wasListToCSV(["AssetType", "CreatorID"]),
            "callback", llEscapeURL(URL)
        ]
    )
);

Get Inventory Data

The getinventorydata command can be used to query an item inside Corrade's inventory following the InventoryItem structure.

Command Required Parameters Required Permissions Example
getinventorydata group, password, item, data inventory
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // queries the "InventoryType" and 
            // "CreatorID" of the item named 
            // "gun" in Corrade's inventory
            "command", "getinventorydata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", llEscapeURL("gun"),
            "data", wasListToCSV(["InventoryType", "CreatorID"]),
            "callback", llEscapeURL(URL)
        ]
    )
);

Search Inventory

17 December 2014

  • Release 7.29 - added.

The searchinventory command can be used to search for items in Corrade's inventory.

Command Required Parameters Required Permissions Example
searchinventory group, password, pattern inventory
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // lists all the scripts and
            // notecards found in
            // Corrade's inventory
            "command", "searchinventory",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "pattern", llEscapeURL(".+?"),
            "type", wasListToCSV(["LSLText", "Notecard"]),
            "callback", llEscapeURL(URL)
        ]
    )
);
Optional Parameter Possible Value Description
type A CSV list of member names of the AssetType structure. The type of asset to search. If this parameter is not provided, any asset type is searched.

The pattern parameter is fed a regular expression that can match part or whole asset names.

Get Inventory Path

6 January 2015

  • Release 7.40 - added.

The getinventorypath command can be used to retrieve full path names for inventory items by searching for a criteria.

Command Required Parameters Required Permissions Example
getinventorypath group, password, pattern inventory
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // lists all item full paths in the 
            // inventory that match the given pattern
            "command", "getinventorypath",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "pattern", llEscapeURL("Shoe+?"),
            "callback", llEscapeURL(URL)
        ]
    )
);

The pattern parameter is fed a regular expression that can match part or whole asset names.

Get Parcel Data

The getparceldata command can be used to query a parcel at a certain position inside the simulator (or the current parcel that the bot is on if position is not specified) by following the Parcel structure.

Command Required Parameters Required Permissions Example
getparceldata group, password, data land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // gets the name and the area
            // of the current parcel that
            // the bot is currently over
            "command", "getparceldata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "data", wasListToCSV(["Name", "Area"]),
            "callback", llEscapeURL(URL)
        ]
    )
);
Optional Parameters Description
position A positional vector that falls within a certain parcel.

Get Avatar Data

The getavatardata returns fields or properties specified in data of an avatar on the current simulator that Corrade is on.

Command Required Parameters Required Permissions Example
getavatardata group, password, data, firstname, lastname (or agent by UUID) interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // gets the visual parameters of 
            // the avatar named Fuzzy Resident
            "command", "getavatardata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Fuzzy",
            "lastname", "Resident",
            "data", "VisualParameters",
            "callback", llEscapeURL(URL)
        ]
    )
);

The data parameter can be supplied a CSV list of fields or properties from the libopenmetaverse Avatar structure.

Perhaps, the most interesting field is the VisualParameters field that contains the avatar's visual parameters. Based on the VisualParameters field, we can, for example, determine whether an avatar has a male or a female shape. For example, the following script will determine whether the avatar named Fuzzy Resident has a male or a female shape:

default {
    touch_start(integer num) {
        llInstantMessage(CORRADE, 
            wasKeyValueEncode(
                [
                    "command", "getavatardata",
                    "group", llEscapeURL(GROUP),
                    "password", llEscapeURL(PASSWORD),
                    // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
                    "firstname", "Fuzzy",
                    "lastname", "Resident",
                    "data", "VisualParameters",
                    "callback", llEscapeURL(URL)
                ]
            )
        );
 
    }
    http_request(key id, string method, string body) {
        llHTTPResponse(id, 200, "Ok");
        // Pop off VisualParameters and fetch only the
        // CSV list of visual parameter values.
        list data = llList2List(
            wasCSVToList(
                llUnescapeURL(
                    wasKeyValueGet(
                        "data", 
                        body
                    )
                )
            ), 
        1, -1);
        // The 31st corresponds to the SHAPE_MALE
        // visual parameter. If the value is non-zero
        // then the shape is male, otherwise, female.
        if(llList2Integer(data, 31) != 0) {
            llOwnerSay("The avatar has a male shape!");
            return;
        }
        llOwnerSay("The avatar has a female shape!");
    }
}

Once the command is sent to retrieve the visual parameters:

llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // gets the visual parameters of 
            // the avatar named Fuzzy Resident
            "command", "getavatardata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Fuzzy",
            "lastname", "Resident",
            "data", "VisualParameters",
            "callback", llEscapeURL(URL)
        ]
    )
);

The data returned to the callback will contain a CSV sequence of numbers such as:

VisualParameters, 127, 61, 100, 101, ...

Popping off the VisualParameters, we obtain a sequence of values:

127, 61, 100, 101, ...

These values correspond to certain visual parameters of the avatar, the first 217 values correspond to LibOMv's visual parameter list:

// Extracted from OpenSim
 
#region VPElement
 
/// <summary>
/// Viewer Params Array Element for AgentSetAppearance
/// Generated from LibOMV's Visual Params list
/// </summary>
public enum VPElement : int
{
    /// <summary>
    /// Brow Size - Small 0--+255 Large
    /// </summary>
    SHAPE_BIG_BROW = 0,
    /// <summary>
    /// Nose Size - Small 0--+255 Large
    /// </summary>
    SHAPE_NOSE_BIG_OUT = 1,
    /// <summary>
    /// Nostril Width - Narrow 0--+255 Broad
    /// </summary>
    SHAPE_BROAD_NOSTRILS = 2,
    /// <summary>
    /// Chin Cleft - Round 0--+255 Cleft
    /// </summary>
    SHAPE_CLEFT_CHIN = 3,
    /// <summary>
    /// Nose Tip Shape - Pointy 0--+255 Bulbous
    /// </summary>
    SHAPE_BULBOUS_NOSE_TIP = 4,
    /// <summary>
    /// Chin Angle - Chin Out 0--+255 Chin In
    /// </summary>
    SHAPE_WEAK_CHIN = 5,
    /// <summary>
    /// Chin-Neck - Tight Chin 0--+255 Double Chin
    /// </summary>
    SHAPE_DOUBLE_CHIN = 6,
    /// <summary>
    /// Lower Cheeks - Well-Fed 0--+255 Sunken
    /// </summary>
    SHAPE_SUNKEN_CHEEKS = 7,
    /// <summary>
    /// Upper Bridge - Low 0--+255 High
    /// </summary>
    SHAPE_NOBLE_NOSE_BRIDGE = 8,
    /// <summary>
    ///  - Less 0--+255 More
    /// </summary>
    SHAPE_JOWLS = 9,
    /// <summary>
    /// Upper Chin Cleft - Round 0--+255 Cleft
    /// </summary>
    SHAPE_CLEFT_CHIN_UPPER = 10,
    /// <summary>
    /// Cheek Bones - Low 0--+255 High
    /// </summary>
    SHAPE_HIGH_CHEEK_BONES = 11,
    /// <summary>
    /// Ear Angle - In 0--+255 Out
    /// </summary>
    SHAPE_EARS_OUT = 12,
    /// <summary>
    /// Eyebrow Points - Smooth 0--+255 Pointy
    /// </summary>
    HAIR_POINTY_EYEBROWS = 13,
    /// <summary>
    /// Jaw Shape - Pointy 0--+255 Square
    /// </summary>
    SHAPE_SQUARE_JAW = 14,
    /// <summary>
    /// Upper Cheeks - Thin 0--+255 Puffy
    /// </summary>
    SHAPE_PUFFY_UPPER_CHEEKS = 15,
    /// <summary>
    /// Nose Tip Angle - Downturned 0--+255 Upturned
    /// </summary>
    SHAPE_UPTURNED_NOSE_TIP = 16,
    /// <summary>
    /// Nose Thickness - Thin Nose 0--+255 Bulbous Nose
    /// </summary>
    SHAPE_BULBOUS_NOSE = 17,
    /// <summary>
    /// Upper Eyelid Fold - Uncreased 0--+255 Creased
    /// </summary>
    SHAPE_UPPER_EYELID_FOLD = 18,
    /// <summary>
    /// Attached Earlobes - Unattached 0--+255 Attached
    /// </summary>
    SHAPE_ATTACHED_EARLOBES = 19,
    /// <summary>
    /// Eye Bags - Smooth 0--+255 Baggy
    /// </summary>
    SHAPE_BAGGY_EYES = 20,
    /// <summary>
    /// Eye Opening - Narrow 0--+255 Wide
    /// </summary>
    SHAPE_WIDE_EYES = 21,
    /// <summary>
    /// Lip Cleft - Narrow 0--+255 Wide
    /// </summary>
    SHAPE_WIDE_LIP_CLEFT = 22,
    /// <summary>
    /// Bridge Width - Narrow 0--+255 Wide
    /// </summary>
    SHAPE_WIDE_NOSE_BRIDGE = 23,
    /// <summary>
    /// Eyebrow Arc - Flat 0--+255 Arced
    /// </summary>
    HAIR_ARCED_EYEBROWS = 24,
    /// <summary>
    /// Height - Short 0--+255 Tall
    /// </summary>
    SHAPE_HEIGHT = 25,
    /// <summary>
    /// Body Thickness - Body Thin 0--+255 Body Thick
    /// </summary>
    SHAPE_THICKNESS = 26,
    /// <summary>
    /// Ear Size - Small 0--+255 Large
    /// </summary>
    SHAPE_BIG_EARS = 27,
    /// <summary>
    /// Shoulders - Narrow 0--+255 Broad
    /// </summary>
    SHAPE_SHOULDERS = 28,
    /// <summary>
    /// Hip Width - Narrow 0--+255 Wide
    /// </summary>
    SHAPE_HIP_WIDTH = 29,
    /// <summary>
    ///  - Short Torso 0--+255 Long Torso
    /// </summary>
    SHAPE_TORSO_LENGTH = 30,
    SHAPE_MALE = 31,
    /// <summary>
    ///  - Short 0--+255 Long
    /// </summary>
    GLOVES_GLOVE_LENGTH = 32,
    /// <summary>
    ///  - Darker 0--+255 Lighter
    /// </summary>
    EYES_EYE_LIGHTNESS = 33,
    /// <summary>
    ///  - Natural 0--+255 Unnatural
    /// </summary>
    EYES_EYE_COLOR = 34,
    /// <summary>
    ///  - Small 0--+255 Large
    /// </summary>
    SHAPE_BREAST_SIZE = 35,
    /// <summary>
    ///  - None 0--+255 Wild
    /// </summary>
    SKIN_RAINBOW_COLOR = 36,
    /// <summary>
    /// Ruddiness - Pale 0--+255 Ruddy
    /// </summary>
    SKIN_RED_SKIN = 37,
    /// <summary>
    ///  - Light 0--+255 Dark
    /// </summary>
    SKIN_PIGMENT = 38,
    HAIR_RAINBOW_COLOR_39 = 39,
    /// <summary>
    ///  - No Red 0--+255 Very Red
    /// </summary>
    HAIR_RED_HAIR = 40,
    /// <summary>
    ///  - Black 0--+255 Blonde
    /// </summary>
    HAIR_BLONDE_HAIR = 41,
    /// <summary>
    ///  - No White 0--+255 All White
    /// </summary>
    HAIR_WHITE_HAIR = 42,
    /// <summary>
    ///  - Less Rosy 0--+255 More Rosy
    /// </summary>
    SKIN_ROSY_COMPLEXION = 43,
    /// <summary>
    ///  - Darker 0--+255 Pinker
    /// </summary>
    SKIN_LIP_PINKNESS = 44,
    /// <summary>
    ///  - Thin Eyebrows 0--+255 Bushy Eyebrows
    /// </summary>
    HAIR_EYEBROW_SIZE = 45,
    /// <summary>
    ///  - Short 0--+255 Long
    /// </summary>
    HAIR_FRONT_FRINGE = 46,
    /// <summary>
    ///  - Short 0--+255 Long
    /// </summary>
    HAIR_SIDE_FRINGE = 47,
    /// <summary>
    ///  - Short 0--+255 Long
    /// </summary>
    HAIR_BACK_FRINGE = 48,
    /// <summary>
    ///  - Short 0--+255 Long
    /// </summary>
    HAIR_HAIR_FRONT = 49,
    /// <summary>
    ///  - Short 0--+255 Long
    /// </summary>
    HAIR_HAIR_SIDES = 50,
    /// <summary>
    ///  - Short 0--+255 Long
    /// </summary>
    HAIR_HAIR_BACK = 51,
    /// <summary>
    ///  - Sweep Forward 0--+255 Sweep Back
    /// </summary>
    HAIR_HAIR_SWEEP = 52,
    /// <summary>
    ///  - Left 0--+255 Right
    /// </summary>
    HAIR_HAIR_TILT = 53,
    /// <summary>
    /// Middle Part - No Part 0--+255 Part
    /// </summary>
    HAIR_HAIR_PART_MIDDLE = 54,
    /// <summary>
    /// Right Part - No Part 0--+255 Part
    /// </summary>
    HAIR_HAIR_PART_RIGHT = 55,
    /// <summary>
    /// Left Part - No Part 0--+255 Part
    /// </summary>
    HAIR_HAIR_PART_LEFT = 56,
    /// <summary>
    /// Full Hair Sides - Mowhawk 0--+255 Full Sides
    /// </summary>
    HAIR_HAIR_SIDES_FULL = 57,
    /// <summary>
    ///  - Less 0--+255 More
    /// </summary>
    SKIN_BODY_DEFINITION = 58,
    /// <summary>
    /// Lip Width - Narrow Lips 0--+255 Wide Lips
    /// </summary>
    SHAPE_LIP_WIDTH = 59,
    /// <summary>
    ///  - Small 0--+255 Big
    /// </summary>
    SHAPE_BELLY_SIZE = 60,
    /// <summary>
    ///  - Less 0--+255 More
    /// </summary>
    SKIN_FACIAL_DEFINITION = 61,
    /// <summary>
    ///  - Less 0--+255 More
    /// </summary>
    SKIN_WRINKLES = 62,
    /// <summary>
    ///  - Less 0--+255 More
    /// </summary>
    SKIN_FRECKLES = 63,
    /// <summary>
    ///  - Short Sideburns 0--+255 Mutton Chops
    /// </summary>
    HAIR_SIDEBURNS = 64,
    /// <summary>
    ///  - Chaplin 0--+255 Handlebars
    /// </summary>
    HAIR_MOUSTACHE = 65,
    /// <summary>
    ///  - Less soul 0--+255 More soul
    /// </summary>
    HAIR_SOULPATCH = 66,
    /// <summary>
    ///  - Less Curtains 0--+255 More Curtains
    /// </summary>
    HAIR_CHIN_CURTAINS = 67,
    /// <summary>
    /// Rumpled Hair - Smooth Hair 0--+255 Rumpled Hair
    /// </summary>
    HAIR_HAIR_RUMPLED = 68,
    /// <summary>
    /// Big Hair Front - Less 0--+255 More
    /// </summary>
    HAIR_HAIR_BIG_FRONT = 69,
    /// <summary>
    /// Big Hair Top - Less 0--+255 More
    /// </summary>
    HAIR_HAIR_BIG_TOP = 70,
    /// <summary>
    /// Big Hair Back - Less 0--+255 More
    /// </summary>
    HAIR_HAIR_BIG_BACK = 71,
    /// <summary>
    /// Spiked Hair - No Spikes 0--+255 Big Spikes
    /// </summary>
    HAIR_HAIR_SPIKED = 72,
    /// <summary>
    /// Chin Depth - Shallow 0--+255 Deep
    /// </summary>
    SHAPE_DEEP_CHIN = 73,
    /// <summary>
    /// Part Bangs - No Part 0--+255 Part Bangs
    /// </summary>
    HAIR_BANGS_PART_MIDDLE = 74,
    /// <summary>
    /// Head Shape - More Square 0--+255 More Round
    /// </summary>
    SHAPE_HEAD_SHAPE = 75,
    /// <summary>
    /// Eye Spacing - Close Set Eyes 0--+255 Far Set Eyes
    /// </summary>
    SHAPE_EYE_SPACING = 76,
    /// <summary>
    ///  - Low Heels 0--+255 High Heels
    /// </summary>
    SHOES_HEEL_HEIGHT = 77,
    /// <summary>
    ///  - Low Platforms 0--+255 High Platforms
    /// </summary>
    SHOES_PLATFORM_HEIGHT = 78,
    /// <summary>
    ///  - Thin Lips 0--+255 Fat Lips
    /// </summary>
    SHAPE_LIP_THICKNESS = 79,
    /// <summary>
    /// Mouth Position - High 0--+255 Low
    /// </summary>
    SHAPE_MOUTH_HEIGHT = 80,
    /// <summary>
    /// Breast Buoyancy - Less Gravity 0--+255 More Gravity
    /// </summary>
    SHAPE_BREAST_GRAVITY = 81,
    /// <summary>
    /// Platform Width - Narrow 0--+255 Wide
    /// </summary>
    SHOES_SHOE_PLATFORM_WIDTH = 82,
    /// <summary>
    ///  - Pointy Heels 0--+255 Thick Heels
    /// </summary>
    SHOES_HEEL_SHAPE = 83,
    /// <summary>
    ///  - Pointy 0--+255 Square
    /// </summary>
    SHOES_TOE_SHAPE = 84,
    /// <summary>
    /// Foot Size - Small 0--+255 Big
    /// </summary>
    SHAPE_FOOT_SIZE = 85,
    /// <summary>
    /// Nose Width - Narrow 0--+255 Wide
    /// </summary>
    SHAPE_WIDE_NOSE = 86,
    /// <summary>
    /// Eyelash Length - Short 0--+255 Long
    /// </summary>
    SHAPE_EYELASHES_LONG = 87,
    /// <summary>
    ///  - Short 0--+255 Long
    /// </summary>
    UNDERSHIRT_SLEEVE_LENGTH = 88,
    /// <summary>
    ///  - Short 0--+255 Long
    /// </summary>
    UNDERSHIRT_BOTTOM = 89,
    /// <summary>
    ///  - Low 0--+255 High
    /// </summary>
    UNDERSHIRT_COLLAR_FRONT = 90,
    JACKET_SLEEVE_LENGTH_91 = 91,
    JACKET_COLLAR_FRONT_92 = 92,
    /// <summary>
    /// Jacket Length - Short 0--+255 Long
    /// </summary>
    JACKET_BOTTOM_LENGTH_LOWER = 93,
    /// <summary>
    /// Open Front - Open 0--+255 Closed
    /// </summary>
    JACKET_OPEN_JACKET = 94,
    /// <summary>
    ///  - Short 0--+255 Tall
    /// </summary>
    SHOES_SHOE_HEIGHT = 95,
    /// <summary>
    ///  - Short 0--+255 Long
    /// </summary>
    SOCKS_SOCKS_LENGTH = 96,
    /// <summary>
    ///  - Short 0--+255 Long
    /// </summary>
    UNDERPANTS_PANTS_LENGTH = 97,
    /// <summary>
    ///  - Low 0--+255 High
    /// </summary>
    UNDERPANTS_PANTS_WAIST = 98,
    /// <summary>
    /// Cuff Flare - Tight Cuffs 0--+255 Flared Cuffs
    /// </summary>
    PANTS_LEG_PANTFLAIR = 99,
    /// <summary>
    ///  - More Vertical 0--+255 More Sloped
    /// </summary>
    SHAPE_FOREHEAD_ANGLE = 100,
    /// <summary>
    ///  - Less Body Fat 0--+255 More Body Fat
    /// </summary>
    SHAPE_BODY_FAT = 101,
    /// <summary>
    /// Pants Crotch - High and Tight 0--+255 Low and Loose
    /// </summary>
    PANTS_LOW_CROTCH = 102,
    /// <summary>
    /// Egg Head - Chin Heavy 0--+255 Forehead Heavy
    /// </summary>
    SHAPE_EGG_HEAD = 103,
    /// <summary>
    /// Head Stretch - Squash Head 0--+255 Stretch Head
    /// </summary>
    SHAPE_SQUASH_STRETCH_HEAD = 104,
    /// <summary>
    /// Torso Muscles - Less Muscular 0--+255 More Muscular
    /// </summary>
    SHAPE_TORSO_MUSCLES = 105,
    /// <summary>
    /// Outer Eye Corner - Corner Down 0--+255 Corner Up
    /// </summary>
    SHAPE_EYELID_CORNER_UP = 106,
    /// <summary>
    ///  - Less Muscular 0--+255 More Muscular
    /// </summary>
    SHAPE_LEG_MUSCLES = 107,
    /// <summary>
    /// Lip Fullness - Less Full 0--+255 More Full
    /// </summary>
    SHAPE_TALL_LIPS = 108,
    /// <summary>
    /// Toe Thickness - Flat Toe 0--+255 Thick Toe
    /// </summary>
    SHOES_SHOE_TOE_THICK = 109,
    /// <summary>
    /// Crooked Nose - Nose Left 0--+255 Nose Right
    /// </summary>
    SHAPE_CROOKED_NOSE = 110,
    /// <summary>
    ///  - Corner Down 0--+255 Corner Up
    /// </summary>
    SHAPE_MOUTH_CORNER = 111,
    /// <summary>
    ///  - Shear Right Up 0--+255 Shear Left Up
    /// </summary>
    SHAPE_FACE_SHEAR = 112,
    /// <summary>
    /// Shift Mouth - Shift Left 0--+255 Shift Right
    /// </summary>
    SHAPE_SHIFT_MOUTH = 113,
    /// <summary>
    /// Eye Pop - Pop Right Eye 0--+255 Pop Left Eye
    /// </summary>
    SHAPE_POP_EYE = 114,
    /// <summary>
    /// Jaw Jut - Overbite 0--+255 Underbite
    /// </summary>
    SHAPE_JAW_JUT = 115,
    /// <summary>
    /// Shear Back - Full Back 0--+255 Sheared Back
    /// </summary>
    HAIR_HAIR_SHEAR_BACK = 116,
    /// <summary>
    ///  - Small Hands 0--+255 Large Hands
    /// </summary>
    SHAPE_HAND_SIZE = 117,
    /// <summary>
    /// Love Handles - Less Love 0--+255 More Love
    /// </summary>
    SHAPE_LOVE_HANDLES = 118,
    SHAPE_TORSO_MUSCLES_119 = 119,
    /// <summary>
    /// Head Size - Small Head 0--+255 Big Head
    /// </summary>
    SHAPE_HEAD_SIZE = 120,
    /// <summary>
    ///  - Skinny Neck 0--+255 Thick Neck
    /// </summary>
    SHAPE_NECK_THICKNESS = 121,
    /// <summary>
    /// Breast Cleavage - Separate 0--+255 Join
    /// </summary>
    SHAPE_BREAST_FEMALE_CLEAVAGE = 122,
    /// <summary>
    /// Pectorals - Big Pectorals 0--+255 Sunken Chest
    /// </summary>
    SHAPE_CHEST_MALE_NO_PECS = 123,
    /// <summary>
    /// Eye Size - Beady Eyes 0--+255 Anime Eyes
    /// </summary>
    SHAPE_EYE_SIZE = 124,
    /// <summary>
    ///  - Short Legs 0--+255 Long Legs
    /// </summary>
    SHAPE_LEG_LENGTH = 125,
    /// <summary>
    ///  - Short Arms 0--+255 Long arms
    /// </summary>
    SHAPE_ARM_LENGTH = 126,
    /// <summary>
    ///  - Pink 0--+255 Black
    /// </summary>
    SKIN_LIPSTICK_COLOR = 127,
    /// <summary>
    ///  - No Lipstick 0--+255 More Lipstick
    /// </summary>
    SKIN_LIPSTICK = 128,
    /// <summary>
    ///  - No Lipgloss 0--+255 Glossy
    /// </summary>
    SKIN_LIPGLOSS = 129,
    /// <summary>
    ///  - No Eyeliner 0--+255 Full Eyeliner
    /// </summary>
    SKIN_EYELINER = 130,
    /// <summary>
    ///  - No Blush 0--+255 More Blush
    /// </summary>
    SKIN_BLUSH = 131,
    /// <summary>
    ///  - Pink 0--+255 Orange
    /// </summary>
    SKIN_BLUSH_COLOR = 132,
    /// <summary>
    ///  - Clear 0--+255 Opaque
    /// </summary>
    SKIN_OUT_SHDW_OPACITY = 133,
    /// <summary>
    ///  - No Eyeshadow 0--+255 More Eyeshadow
    /// </summary>
    SKIN_OUTER_SHADOW = 134,
    /// <summary>
    ///  - Light 0--+255 Dark
    /// </summary>
    SKIN_OUT_SHDW_COLOR = 135,
    /// <summary>
    ///  - No Eyeshadow 0--+255 More Eyeshadow
    /// </summary>
    SKIN_INNER_SHADOW = 136,
    /// <summary>
    ///  - No Polish 0--+255 Painted Nails
    /// </summary>
    SKIN_NAIL_POLISH = 137,
    /// <summary>
    ///  - Clear 0--+255 Opaque
    /// </summary>
    SKIN_BLUSH_OPACITY = 138,
    /// <summary>
    ///  - Light 0--+255 Dark
    /// </summary>
    SKIN_IN_SHDW_COLOR = 139,
    /// <summary>
    ///  - Clear 0--+255 Opaque
    /// </summary>
    SKIN_IN_SHDW_OPACITY = 140,
    /// <summary>
    ///  - Dark Green 0--+255 Black
    /// </summary>
    SKIN_EYELINER_COLOR = 141,
    /// <summary>
    ///  - Pink 0--+255 Black
    /// </summary>
    SKIN_NAIL_POLISH_COLOR = 142,
    /// <summary>
    ///  - Sparse 0--+255 Dense
    /// </summary>
    HAIR_EYEBROW_DENSITY = 143,
    /// <summary>
    ///  - 5 O'Clock Shadow 0--+255 Bushy Hair
    /// </summary>
    HAIR_HAIR_THICKNESS = 144,
    /// <summary>
    /// Saddle Bags - Less Saddle 0--+255 More Saddle
    /// </summary>
    SHAPE_SADDLEBAGS = 145,
    /// <summary>
    /// Taper Back - Wide Back 0--+255 Narrow Back
    /// </summary>
    HAIR_HAIR_TAPER_BACK = 146,
    /// <summary>
    /// Taper Front - Wide Front 0--+255 Narrow Front
    /// </summary>
    HAIR_HAIR_TAPER_FRONT = 147,
    /// <summary>
    ///  - Short Neck 0--+255 Long Neck
    /// </summary>
    SHAPE_NECK_LENGTH = 148,
    /// <summary>
    /// Eyebrow Height - Higher 0--+255 Lower
    /// </summary>
    HAIR_LOWER_EYEBROWS = 149,
    /// <summary>
    /// Lower Bridge - Low 0--+255 High
    /// </summary>
    SHAPE_LOWER_BRIDGE_NOSE = 150,
    /// <summary>
    /// Nostril Division - High 0--+255 Low
    /// </summary>
    SHAPE_LOW_SEPTUM_NOSE = 151,
    /// <summary>
    /// Jaw Angle - Low Jaw 0--+255 High Jaw
    /// </summary>
    SHAPE_JAW_ANGLE = 152,
    /// <summary>
    /// Shear Front - Full Front 0--+255 Sheared Front
    /// </summary>
    HAIR_HAIR_SHEAR_FRONT = 153,
    /// <summary>
    ///  - Less Volume 0--+255 More Volume
    /// </summary>
    HAIR_HAIR_VOLUME = 154,
    /// <summary>
    /// Lip Cleft Depth - Shallow 0--+255 Deep
    /// </summary>
    SHAPE_LIP_CLEFT_DEEP = 155,
    /// <summary>
    /// Puffy Eyelids - Flat 0--+255 Puffy
    /// </summary>
    SHAPE_PUFFY_LOWER_LIDS = 156,
    /// <summary>
    ///  - Sunken Eyes 0--+255 Bugged Eyes
    /// </summary>
    SHAPE_EYE_DEPTH = 157,
    /// <summary>
    ///  - Flat Head 0--+255 Long Head
    /// </summary>
    SHAPE_HEAD_LENGTH = 158,
    /// <summary>
    ///  - Less Freckles 0--+255 More Freckles
    /// </summary>
    SKIN_BODY_FRECKLES = 159,
    /// <summary>
    ///  - Low 0--+255 High
    /// </summary>
    UNDERSHIRT_COLLAR_BACK = 160,
    JACKET_COLLAR_BACK_161 = 161,
    SHIRT_COLLAR_BACK_162 = 162,
    /// <summary>
    ///  - Short Pigtails 0--+255 Long Pigtails
    /// </summary>
    HAIR_PIGTAILS = 163,
    /// <summary>
    ///  - Short Ponytail 0--+255 Long Ponytail
    /// </summary>
    HAIR_PONYTAIL = 164,
    /// <summary>
    /// Butt Size - Flat Butt 0--+255 Big Butt
    /// </summary>
    SHAPE_BUTT_SIZE = 165,
    /// <summary>
    /// Ear Tips - Flat 0--+255 Pointy
    /// </summary>
    SHAPE_POINTY_EARS = 166,
    /// <summary>
    /// Lip Ratio - More Upper Lip 0--+255 More Lower Lip
    /// </summary>
    SHAPE_LIP_RATIO = 167,
    SHIRT_SLEEVE_LENGTH_168 = 168,
    /// <summary>
    ///  - Short 0--+255 Long
    /// </summary>
    SHIRT_SHIRT_BOTTOM = 169,
    SHIRT_COLLAR_FRONT_170 = 170,
    SHIRT_SHIRT_RED = 171,
    SHIRT_SHIRT_GREEN = 172,
    SHIRT_SHIRT_BLUE = 173,
    PANTS_PANTS_RED = 174,
    PANTS_PANTS_GREEN = 175,
    PANTS_PANTS_BLUE = 176,
    SHOES_SHOES_RED = 177,
    SHOES_SHOES_GREEN = 178,
    /// <summary>
    ///  - Low 0--+255 High
    /// </summary>
    PANTS_WAIST_HEIGHT = 179,
    PANTS_PANTS_LENGTH_180 = 180,
    /// <summary>
    /// Pants Fit - Tight Pants 0--+255 Loose Pants
    /// </summary>
    PANTS_LOOSE_LOWER_CLOTHING = 181,
    SHOES_SHOES_BLUE = 182,
    SOCKS_SOCKS_RED = 183,
    SOCKS_SOCKS_GREEN = 184,
    SOCKS_SOCKS_BLUE = 185,
    UNDERSHIRT_UNDERSHIRT_RED = 186,
    UNDERSHIRT_UNDERSHIRT_GREEN = 187,
    UNDERSHIRT_UNDERSHIRT_BLUE = 188,
    UNDERPANTS_UNDERPANTS_RED = 189,
    UNDERPANTS_UNDERPANTS_GREEN = 190,
    UNDERPANTS_UNDERPANTS_BLUE = 191,
    GLOVES_GLOVES_RED = 192,
    /// <summary>
    /// Shirt Fit - Tight Shirt 0--+255 Loose Shirt
    /// </summary>
    SHIRT_LOOSE_UPPER_CLOTHING = 193,
    GLOVES_GLOVES_GREEN = 194,
    GLOVES_GLOVES_BLUE = 195,
    JACKET_JACKET_RED = 196,
    JACKET_JACKET_GREEN = 197,
    JACKET_JACKET_BLUE = 198,
    /// <summary>
    /// Sleeve Looseness - Tight Sleeves 0--+255 Loose Sleeves
    /// </summary>
    SHIRT_SHIRTSLEEVE_FLAIR = 199,
    /// <summary>
    /// Knee Angle - Knock Kneed 0--+255 Bow Legged
    /// </summary>
    SHAPE_BOWED_LEGS = 200,
    /// <summary>
    ///  - Short hips 0--+255 Long Hips
    /// </summary>
    SHAPE_HIP_LENGTH = 201,
    /// <summary>
    ///  - Fingerless 0--+255 Fingers
    /// </summary>
    GLOVES_GLOVE_FINGERS = 202,
    /// <summary>
    /// bustle skirt - no bustle 0--+255 more bustle
    /// </summary>
    SKIRT_SKIRT_BUSTLE = 203,
    /// <summary>
    ///  - Short 0--+255 Long
    /// </summary>
    SKIRT_SKIRT_LENGTH = 204,
    /// <summary>
    ///  - Open Front 0--+255 Closed Front
    /// </summary>
    SKIRT_SLIT_FRONT = 205,
    /// <summary>
    ///  - Open Back 0--+255 Closed Back
    /// </summary>
    SKIRT_SLIT_BACK = 206,
    /// <summary>
    ///  - Open Left 0--+255 Closed Left
    /// </summary>
    SKIRT_SLIT_LEFT = 207,
    /// <summary>
    ///  - Open Right 0--+255 Closed Right
    /// </summary>
    SKIRT_SLIT_RIGHT = 208,
    /// <summary>
    /// Skirt Fit - Tight Skirt 0--+255 Poofy Skirt
    /// </summary>
    SKIRT_SKIRT_LOOSENESS = 209,
    SHIRT_SHIRT_WRINKLES = 210,
    PANTS_PANTS_WRINKLES = 211,
    /// <summary>
    /// Jacket Wrinkles - No Wrinkles 0--+255 Wrinkles
    /// </summary>
    JACKET_JACKET_WRINKLES = 212,
    /// <summary>
    /// Package - Coin Purse 0--+255 Duffle Bag
    /// </summary>
    SHAPE_MALE_PACKAGE = 213,
    /// <summary>
    /// Inner Eye Corner - Corner Down 0--+255 Corner Up
    /// </summary>
    SHAPE_EYELID_INNER_CORNER_UP = 214,
    SKIRT_SKIRT_RED = 215,
    SKIRT_SKIRT_GREEN = 216,
    SKIRT_SKIRT_BLUE = 217
}
#endregion

So, in the 31st position we will find a value that corresponds to SHAPE_MALE. If this value is non-zero, then the shape of the avatar is male, otherwise the shape of the avatar is female. The same applies to the other positions and their corresponding values.

A full list of parameter IDs can be found by cross-referencing with the avatar_lad.xml file which is found in the character sub-directory of any Second Life-compatible viewer.

Get Group Data

21 December 2014

  • Release 7.34 - added group Corrade permission.

The getgroupdata command allows you to query the current configured group for data in a libopenmetaverse Group structure.

Command Required Parameters Required Permissions Example
getgroupdata group, password, data group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // retrieve the group charter
            "command", "getgroupdata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "data", "Charter",
            "callback", llEscapeURL(URL)
        ]
    )
);

Get Primitive Owners

The getprimitiveowners command allows you to query the number of primitives and the avatars that own them on the current parcel or the entire region. To query a specific parcel, you supply a vector to the position parameter which is a position within the parcel to query. Otherwise, if the position parameter is not supplied, Corrade assumes that you are querying the entire region.

Command Required Parameters Required Permissions Example
getprimitiveowners group, password land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // retrieve the owners of primitives
            // on the current region (all parcels)
            "command", "getprimitiveowners",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);
Optional Parameters Description
position A vector within the bounds of the parcel to query for owners and their primitives.

Corrade will return a CSV list of owners by total primitive count.

Return Primitives

The returnprimitives can return the primitives of an avatar on a parcel, an entire region or an entire estate depending on the entity parameter and the position sub-parameter.

Command Required Parameters Required Permissions Example
returnprimitives group, password, firstname, lastname (or agent by UUID), entity, type land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // return Jolly Roger's primitives
            // on the current region
            "command", "returnprimitives",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Jolly",
            "lastname", "Roger",
            "entity", "parcel",
            "type", "other",
            "callback", llEscapeURL(URL)
        ]
    )
);
Parameter Possible Value Sub-Parameter Sub-Parameter Value Optional Sub-Parameter Possible Values Description
entity parcel type Owner position vector A vector within the bounds of a parcel that Corrade should return the primitives from. If no position parameter is supplied, Corrade returns the primitives from the entire region.
Group
Other
Sell
estate ReturnScripted all true If all is set to true, then Corrade returns the objects from all the estates. If all is not supplied (or supplied as false), Corrade returns the objects only from the current estate.
ReturnOnOthersLand false
ReturnScriptedAndOnOthers

Execute

18 December 2014

  • Release 7.32 - added.

The execute command can be used to execute a command on Corrade's host operating system. After the command is executed, Corrade returns the standard output in the key output and the standard error in the key error.

Note that this command is protected by the separate execute permission and you should be very careful to what group you grant this permission because they will have full-access to the entire file-system where Corrade is hosted.

Command Required Parameters Required Permissions Example
execute group, password, file execute
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Show ipconfig information under Windows
            "command", "execute",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "file", "cmd.exe",
            "parameter", "/C ipconfig",
            "callback", llEscapeURL(URL)
        ]
    )
);
Optional Parameter Description
parameter The parameters passed to the command in file.

If you are seeking to execute a shell command, you must pass the shell (for example, cmd.exe or /usr/bin/bash on Unix) to the file parameter and any other parameters to the parameter key.

Cache Control

8 January 2015

  • Release 7.42 - added the load and save action.

18 December 2014

  • Release 7.31 - added.

Whenever Corrade looks-up an agent UUID or a group name, etc... More generally, when Corrade uses directory services to fetch some data for you, Corrade also caches the response. You may however want to manipulate the cache and the cache command allows an authenticated group that has the system permission to manipulate Corrade's caches.

Command Required Parameters Required Permissions Example
cache group, password, action system
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // purge all caches
            "command", "cache",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "purge"
        ]
    )
);
Parameter Possible Value Description
action purge Purges in-memory caches.
load Loads the caches from disk.
save Saves the caches to disk.

Logout

The logout command allows an authenticated group that has the system permission to shutdown Corrade.

Command Required Parameters Required Permissions Example
logout group, password system
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // shutdown Corrade
            "command", "logout",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

Change Configuration File

2 April 2014

  • Release 7.93 - added the set and get options and removed the Base64 requirement.

14 December 2014

  • Release 7.28 - added.

The configuration command allows an authenticated group that has the system permission to read and write Corrade's configuration file. Note that when the configuration file is written to, Corrade reloads its configuration file automatically such that this command can be used to configure Corrade dynamically.

Command Required Parameters Required Permissions Example
configuration group, password, action system
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // read and return Corrade's configuration
            // file as part of the "data" return key
            "command", "configuration",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "read",
            "callback", llEscapeURL(URL)
        ]
    )
);
Parameter Value Secondary Parameters Description
action read Read the entire configuration file and pass it to the data key.
write data Write all the data passed through the data key to the configuration file.
get path Get the inner XML of a node specified by the XPath path.
set path, data Write the inner XML in data of a node specified by the XPath path to the configuration file.

The get and set actions allow you to manipulate the XML nodes individually which eases the configuration of Corrade under size constraints (such as LSL). Both of them require a secondary parameter path that is an XPath to a node whose inner XML you wish to modify. set additionally takes an XML snippet and will replace the node specified by path with data.

For example, suppose that we want to query whether AIML is enabled in the configuration file. We would send the command:

        llInstantMessage(CORRADE, 
            wasKeyValueEncode(
                [
                    "command", "configuration",
                    "group", GROUP,
                    "password", PASSWORD,
                    "action", "get",
                    "path", llEscapeURL("/config/aiml/enable"),
                    "callback", llEscapeURL(URL)
                ]
            )
        );

Corrade will then browse config->aiml->enable and return its inner-most XML - in this case, either true or false. Supposing that it is false, it means that AIML is disabled. So, in order to enable AIML, we use the set parameter to action and issue:

        llInstantMessage(CORRADE, 
            wasKeyValueEncode(
                [
                    "command", "configuration",
                    "group", GROUP,
                    "password", PASSWORD,
                    "action", "set",
                    "path", llEscapeURL("/config/aiml/enable"),
                    "data", "true",
                    "callback", llEscapeURL(URL)
                ]
            )
        );

which will modify the configuration file and set config->aiml->enable to true.

This feature is particularly useful due to the fact that Corrade dynamically reload its configuration file. In this example, by enabling the AIML feature, Corrade will start compiling the AIML brain and making the feature available without requiring a restart.

Get or Set Display Name

The displayname command allows an authenticated group that has the grooming permission to get or set Corrade's display name.

Command Required Parameters Required Permissions Example
displayname group, password, action grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // shutdown Corrade
            "command", "displayname",
            "group", llEscapeURL(GROUP),
            "action", "set",
            "name", llEscapeURL("Big Betty"),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);
Required Parameters Required Sub-Parameters Required Sub-Parameters
action get
set name

Add or Update Classified

The addclassified command can add or update a classified by name.

Command Required Parameters Required Permissions Example
addclassified group, password, name, type, price grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "addclassified",
            "group", llEscapeURL(GROUP),
            "name", llEscapeURL("Visit me!"),
            "type", "SpecialAttraction",
            "price", 100,
            "password", llEscapeURL(PASSWORD)
        ]
    )
);
Optional Parameter Possible Value Description
renew True Whether the classified should auto-renew every week.
False
description The description text of a classified.
item UUID or name The name or UUID of a texture.
type Any The classified type. If item is not specified, then Corrade assumes that the type is Any
Shopping
LandRental
PropertyRental
SpecialAttraction
NewProducts
Employment
Wanted
Service
Personal

Delete a Classified

The deleteclassified command can be used to delete a classified by name.

Command Required Parameters Required Permissions Example
deleteclassified group, password, name grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "deleteclassified",
            "group", llEscapeURL(GROUP),
            "name", llEscapeURL("Visit me!"),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

Get Self Data

The getselfdata queries the AgentManager class for the current Corrade bot. In other words, it can be used to query things such as the bot's health, velocity, rotation, etc...

Command Required Parameters Required Permissions Example
getselfdata group, password, data grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // get the health and
            // velocity of the bot
            "command", "getselfdata",
            "group", llEscapeURL(GROUP),
            "data", wasListToCSV([
                "Health",
                "Velocity"
            ]),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

Get Group Account Summary Data

21 December 2014

  • Release 7.34 - added group Corrade permission.

The getgroupaccountsummarydata command can be used to retrieve field and property values from the GroupAccountSummary structure for a given number of days and interval (0 for current, 1 for last).

Command Required Parameters Required Permissions Example
getgroupaccountsummarydata group, password, data, days, interval group
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // get the group balance
            // and the group tax estimate
            "command", "getgroupaccountsummarydata",
            "group", llEscapeURL(GROUP),
            "data", wasListToCSV([
                "Balance",
                "GroupTaxEstimate"
            ]),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

Get Map Avatar Positions

The getmapavatarpositions allows the user to query a remote simulator (supplied as a region name) for the current avatar positions. Note that this command is a map-feature which returns clusters of avatars and their positions as a CSV list of avatar numbers by positions.

Command Required Parameters Required Permissions Example
getmapavatarpositions group, password, region interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // get the avatar clusters
            // in the current region
            "command", "getmapavatarpositions",
            "group", llEscapeURL(GROUP),
            "region", llEscapeURL(llGetRegionName()),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

Set Region Debug

Given estate rights, and Corrade land permissions, the setregiondebug command allows the user to toggle scripts, collisions and physics for the current region.

Command Required Parameters Required Permissions Example
setregiondebug group, password, scripts, collisions, physics land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "setregiondebug",
            "group", llEscapeURL(GROUP),
            // enable scripts
            "scripts", "true",
            // disable collisions
            "collisions", "false",
            // disable physics
            "physics", "false",
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

Get Friends List

The getfriendslist command returns a CSV list of avatar names and avatar UUIDs that are the current bot's friends.

Command Required Parameters Required Permissions Example
getfriendslist group, password friendship
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // get the avatar clusters
            // in the current region
            "command", "getfriendslist",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

Get Friend Data

The getfrienddata command can be used to retrieve field and property values from the FriendInfo structure for an avatar specified by firstname and lastname that is currently a friend in the bot's friends list.

Command Required Parameters Required Permissions Example
getfrienddata group, password, firstname, lastname (or agent by UUID), data friendship
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // get the online status
            // and UUID of a friend
            "command", "getfrienddata",
            "group", llEscapeURL(GROUP),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Stuart",
            "lastname", "Little",
            "data", wasListToCSV([
                "IsOnline",
                "UUID"
            ]),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

Offer Friendship

The offerfriendship command offers friendship to an avatar specified by firstname and lastname (or agent by UUID).

Command Required Parameters Required Permissions Example
offerfriendship group, password, firstname, lastname (or agent by UUID) friendship
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // offer friendship
            // to Big Betty
            "command", "offerfriendship",
            "group", llEscapeURL(GROUP),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Big",
            "lastname", "Betty",
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

Terminate Friendship

The terminatefriendship command terminates a friendship with an avatar specified by firstname and lastname (or agent by UUID).

Command Required Parameters Required Permissions Example
terminatefriendship group, password, firstname, lastname (or agent by UUID) friendship
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // termiante friendship
            // with Big Betty
            "command", "terminatefriendship",
            "group", llEscapeURL(GROUP),
            "firstname", "Big",
            "lastname", "Betty",
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

Grant Friend Rights

The grantfriendrights command grants friendship-rights such as the ability to see the online status, the ability to be tracked on the map and the ability to modify the bot's objects to a friend specified by firstname and lastname (or agent by UUID).

Command Required Parameters Required Permissions Example
grantfriendrights group, password, firstname, lastname (or agent by UUID), rights friendship
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // allow Big Betty to see the
            // bot's online status and to
            // be able to map the bot.
            "command", "grantfriendrights",
            "group", llEscapeURL(GROUP),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Big",
            "lastname", "Betty",
            "rights", wasListToCSV([
                "CanSeeOnline",
                "CanSeeOnMap"
            ]),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);

The rights parameter takes a CSV list of FriendRights. Note that the full set of rights have to specified and in order to remove a right, the same command has to be sent with the rights parameter set to the rights that should be enabled.

Get Friendship Requests

The getfriendshiprequests command lists the pending friendship requests as a CSV list of avatar names by avatar UUIDs.

Command Required Parameters Required Permissions Example
getfriendshiprequests group, password friendship
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // termiante friendship
            // with Big Betty
            "command", "getfriendshiprequests",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

Reply to Friendship Requests

The replytofriendshiprequest command can be used to manipulate the list of pending friendship requests by either accepting or declining friendship requests from an avatar specified by firstname and lastname (or agent by UUID). Note that in order for this command to work, there has to be a pending friendship request. In order to check whether a friendship request for a given avatar is pending, you can use the getfriendshiprequests command can be used.

replytofriendshiprequest group, password, firstname, lastname (or agent by UUID), action friendship
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // accept friendship request with 
            // the avatar named Mr Handsome
            "command", "replytofriendshiprequest",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Mr",
            "lastname", "Handsome",
            // or decline
            "action", "accept",
            "callback", llEscapeURL(URL)
        ]
    )
);

Map Friend

Given map-tracking permissions from a friend that is currently online and friendship Corrade permissions, the mapfriend command will return a CSV list of region name and region position of the friend to be mapped.

Command Required Parameters Required Permissions Example
mapfriend group, password, firstname, lastname (or agent by UUID) friendship
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // return the current region
            // and position within the region
            // of the friend named Taz Whirlwind
            "command", "mapfriend",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Taz",
            "lastname", "Whirlwind",
            "callback", llEscapeURL(URL)
        ]
    )
);

Get Avatar Positions

The getavatarpositions returns a CSV list of avatar names by UUIDs by positions within the current region that the bot is on.

Command Required Parameters Required Permissions Example
getavatarpositions group, password, entity interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // returns the avatar positions
            // in the current region
            "command", "getavatarpositions",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "entity", "region",
            "callback", llEscapeURL(URL)
        ]
    )
);
Parameter Possible Value Sub-Parameter Sub-Parameter Value Description
entity region Gets the avatar positions in the current region.
parcel position A positional vector within the parcel to examine. Gets the avatar positions in the current parcel.

Get Primitives

The getprimitives returns a CSV list of primitive names by UUIDs.

Command Required Parameters Required Permissions Example
getprimitives group, password, entity interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // get the primitives on 
            // the parcel that the 
            // calling script is on
            "command", "getprimitives",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "entity", "parcel",
            "position", llGetPos(),
            "callback", llEscapeURL(URL)
        ]
    )
);
Parameter Possible Value Sub-Parameter Sub-Parameter Value Description
entity region Gets the primitives in the current region.
parcel position A positional vector within the parcel to examine. Gets the primitives in the current parcel or the parcel specified by position.
avatar firstname Firstname and lastname of an avatar (or agent by UUID). Gets the primitives attached to the avatar specified by firstname and lastname
lastname

Set Object Rotation

The setobjectrotation command can be used to set the rotation of an object.

Command Required Parameters Required Permissions Example
setobjectrotation group, password, range, item, rotation interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // sets the rotation of the
            // primitive or object chair
            // to 90 deg. on the X axis
            "command", "setobjectrotation",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Chair",
            "range", 5,
            "rotation", llEuler2Rot(<90, 0, 0>*DEG_TO_RAD)
        ]
    )
);

Set Object Name

The setobjectname command can be used to set the name of an object.

Command Required Parameters Required Permissions Example
setobjectname group, password, range, item, name interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // set the name of an object
            "command", "setobjectrotation",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Chair",
            "range", 5,
            "name", llEscapeURL("Cool Chair")
        ]
    )
);

Set Object Description

The setobjectdescription command can be used to set the description of an object.

Command Required Parameters Required Permissions Example
setobjectdescription group, password, range, item, description interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // set the name of an object
            "command", "setobjectdescription",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Chair",
            "range", 5,
            "description", llEscapeURL("Cool Chair")
        ]
    )
);

Set Object Position

The setobjectposition command can be used to set the position of an object (in a regional frame).

Command Required Parameters Required Permissions Example
setobjectposition group, password, range, item, position interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // set the position of the 
            // object Chair, 5m above the 
            // current object
            "command", "setobjectposition",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Chair",
            "range", 5,
            "position", llGetPos() + <0, 0, 1>
        ]
    )
);

Set Sale Information

The setobjectsaleinfo allows to set an object for sale with a specific SaleType.

Command Required Parameters Required Permissions Example
setobjectsaleinfo group, password, range, item, price, type interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // set the Chair for sale
            // to L$100 and sell copies
            // of this chair
            "command", "setobjectposition",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Chair",
            "range", 5,
            "price", 100,
            "type", "Copy"
        ]
    )
);

Set Object Group

The setobjectgroup command can be used to set the group of an object.

Command Required Parameters Required Permissions Example
setobjectgroup group, password, range, item interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // set the group of the 
            // object to the current
            // calling GROUP
            "command", "setobjectgroup",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Chair",
            "range", 5
        ]
    )
);

Deed an Object to a Group

The objectdeed command can be used to deed an object to the calling group.

Command Required Parameters Required Permissions Example
objectdeed group, password, range, item interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // deed the object to the 
            // calling GROUP
            "command", "objectdeed",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Chair",
            "range", 5
        ]
    )
);

Set Object Permissions

The setobjectpermissions command can be used to set the permissions of an object.

Command Required Parameters Required Permissions Example
setobjectpermissions group, password, range, item, who, permissions interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // set the next owner
            // permission on the chair
            // to modify and copy
            "command", "setobjectpermissions",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Chair",
            "range", 5,
            "who", "NextOwner",
            "permissions", wasListToCSV(["Modify", "Copy"]) 
        ]
    )
);

The who-key is one or more of the PermissionWho fields and the permissions-key is one or more of the PermissionMask fields.

Get Wearables

The getwearables command returns a CSV list of wearable types by names that are currently worn.

Command Required Parameters Required Permissions Example
getwearables group, password grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // returns all the wearable
            // types and names currently
            // being worn by the bot
            "command", "getwearables",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

Change Appearance

The changeappearance command performs the following steps:

  • takes as input a folder name.
  • removes all the items being worn or attached to the avatar provided they are not body-parts that will not be replaced by the items int the input folder.
  • wears all the resulting items.

Informally, the changeappearance command can be used to wear all items in a folder by replacing all the currently worn items.

Command Required Parameters Required Permissions Example
changeappearance group, password, folder grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // wears all the items in 
            // the CoolOutfit folder
            "command", "changeappearance",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "folder", "CoolOutfit"
        ]
    )
);

This command is particularly useful to model bots that must change outfits: you will need to create folders containing the outfit and then issue this command with the folder name as parameter in order to change between outfits.

Wear an Item from Inventory

The wear command is given a CSV list of wearables by name and the bot will wear them.

Command Required Parameters Required Permissions Example
wear group, password, wearables grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // wear "Dragon Tattoo"
            // from inventory
            "command", "wear",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "wearables", wasListToCSV([
                "Dragon Tattoo"
            ])
        ]
    )
);
Optional Parameter Possible Value Description
replace true Replace with the new item.
false Add the new item.

Unwear

The unwear command takes as parameter a CSV list of wearables and un-wears them.

Command Required Parameters Required Permissions Example
unwear group, password, wearables grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Un-wear "Dragon Tattoo"
            // and "Grey Skirt"
            "command", "unwear",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "wearables", wasListToCSV([
                "Dragon Tattoo",
                "Grey Skirt"
            ])
        ]
    )
);

Please note that this function is an aggressive function which allows un-wearing body-parts which may result in the avatar not being able to be rendered provided that the removed body-part is not replaced.

Reclaim a Parcel

The unwear command takes as parameter a CSV list of wearables and un-wears them.

Command Required Parameters Required Permissions Example
parcelreclaim group, password land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Reclaim the current parcel
            // that Corrade is on
            "command", "parcelreclaim",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);
Optional Parameters Possible Value Description
position A vector. A position over a parcel, or, if not specified, the affected parcel is the one that Corrade is currently on.

Deed a Parcel

The parceldeed command can be used to deed a parcel to a group.

Command Required Parameters Required Permissions Example
parceldeed group, password land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Deed the parcel at
            // <128,128,0>
            "command", "parceldeed",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "position", <128,128,0>
        ]
    )
);
Optional Parameters Possible Value Description
position A vector. A position over a parcel, or, if not specified, the affected parcel is the one that Corrade is currently on.

Buy a Parcel

The parcelbuy command can be used to buy a parcel.

Command Required Parameters Required Permissions Example
parcelbuy group, password land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Buy the parcel at
            // <128,128,0> for the group
            // and do not remove the 
            // contribution.
            "command", "parcelbuy",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "position", <128,128,0>,
            "forGroup", "True",
            "removecontribution", "False"
        ]
    )
);
Optional Parameters Possible Value Description
position A vector. A position over a parcel, or, if not specified, the affected parcel is the one that Corrade is currently on.
forGroup A boolean. Whether to buy the parcel for a group (needs group deed rights).
removecontribution A boolean. Whether to remove the land contribution from the group after buying a parcel.

Abandon a Parcel

The parcelrelease can be used to abandon land.

Command Required Parameters Required Permissions Example
parcelrelease group, password land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Abandon the parcel at
            // <128,128,0>
            "command", "parcelrelease",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "position", <128,128,0>
        ]
    )
);
Optional Parameters Possible Value Description
position A vector. A position over a parcel, or, if not specified, the affected parcel is the one that Corrade is currently on.

Get Parcel List

The getparcellist command can be used to retrieve the allowed and banned avatars for a parcel.

Command Required Parameters Required Permissions Example
getparcellist group, password, type land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Get the banned users
            // for the parcel at
            // <128,128,0>
            "command", "getparcellist",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "type", "Ban",
            "position", <128,128,0>
        ]
    )
);
Optional Parameters Possible Value Description
position A vector. A position over a parcel, or, if not specified, the affected parcel is the one that Corrade is currently on.

Set Parcel Data

14 December 2014

  • Release 7.28 - added.

The setparceldata command can be used to set various parcel properties by following the Parcel class of libopenmetaverse.

Command Required Parameters Required Permissions Example
setparceldata group, password land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Set the music URL for the parcel
            // on the current sim at <128,128,0>
            "command", "setparceldata",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "data", wasListToCSV(
                [
                   "MusicURL", 
                   "http://streamradio.tk/playlist.pls"
                ]
            ),
            "position", <128,128,0>
        ]
    )
);
Optional Parameters Possible Value Description
position A vector. A position over a parcel, or, if not specified, the affected parcel is the one that Corrade is currently on.

Reply To a Script Permission Request

21 December 2014

  • Release 7.34 - renamed the command from replytopermission to replytoscriptpermissionrequest.

The replytoscriptpermissionrequest command can be used to reply to a script that requests permissions from Corrade. All the required parameters for the command can be retrieved from the permission notification using the notify command.

Command Required Parameters Required Permissions Example
replytoscriptpermissionrequest group, password, task, item, permissions interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            "command", "replytoscriptpermissionrequest",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // the parameters for task and item can be 
            // obtained through the permission notification
            "task", "6df81d1b-26c4-49af-9fda-bd8d7f8832bc",
            "item", "f59a5870-4393-4d41-bf6a-658f7770dd3e",
            "permissions", 
                wasListToCSV(
                    [ 
                        // allow the script to pay on behalf of the bot
                        "Debit", 
                        // allow the script to trigger an animation
                        "TriggerAnimation"
                    ]
                )
        ]
    )
);

The permissions parameter takes a comma-separated list of permissions to grant a script.

Get Pending Script Permissions Requests

21 December 2014

  • Release 7.34 - added.

The getscriptpermissionrequests command can be used to retrieve a CSV list of pending script permission requests.

Command Required Parameters Required Permissions Example
getscriptpermissionrequests group, password interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // get all pending script permission requests
            "command", "getscriptpermissionrequests",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

The CSV list of returned script permission requests contains, in order:

  1. the object name.
  2. the owner name.
  3. the item UUID.
  4. the task UUID.
  5. the permissions as CSV list of permissions to grant a script.

Some of the returned parameters in the CSV list are the ones needed by the replytoscriptpermissionrequest command in order to reply to the script permission request.

Reply To a Teleport Lure

21 December 2014

  • Release 7.34 - renamed the command from replytolure to replytoteleportlure.

The replytoteleportlure command can be used to reply to a teleport lure sent to Corrade. All the required parameters for the command can be retrieved from the lure notification using the notify command.

Command Required Parameters Required Permissions Example
replytoteleportlure group, password, firstname, lastname (or agent by UUID), session, action movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Decline the teleport lure from
            // the avatar Batman Robin
            "command", "replytoteleportlure",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // obtained through the lure notification
            "session", "77cc39ca-7ecd-4ca4-acf9-b760c0ee90b3",
            // or "agent", "69ce412b-dffc-436d-86ff-d788bfa66d9d"
            "firstname", "Batman",
            "lastname", "Robin",
            "action", "decline"
        ]
    )
);

The action parameter can be either accept or decline and defaults to decline if it is not specified.

Get Pending Teleport Lures

21 December 2014

  • Release 7.34 - added.

The getteleportlures command shows a CSV list of all pending teleport lures.

Command Required Parameters Required Permissions Example
getteleportlures group, password movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Show all pending teleport lures.
            "command", "getteleportlures",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "callback", llEscapeURL(URL)
        ]
    )
);

The CSV list of pending teleport lures contains, in order:

  1. the first name of the agent sending the teleport lure.
  2. the last name of the agent sending the teleport lure.
  3. the agent UUID of the agent sending the teleport lure.
  4. the session UUID of the teleport lure.

Some of the returned parameters in the CSV list are the ones needed by the replytoteleportlure command in order to accept or decline a teleport lure.

Play a Sound

The playsound command is able to play a sound asset, either from inventory or referenced by an UUID at the current or specified location.

Command Required Parameters Required Permissions Example
playsound group, password, item interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Play the sound asset
            // named "Boo!" from 
            // the bot's inventory
            "command", "playsound",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Boo!"
        ]
    )
);
Optional Parameters Possible Values Description
gain Any float in the interval $[0, 1]$. The volume at which the sound is played with $0$ being totally silent and $1$ representing full volume.
position A vector as a region position. Plays the sound at the given position.

Update a Primitive's Inventory

14 December 2014

  • Release 7.28 - added the take action.

The updateprimitiveinventory command can add or remove items from a primitive's inventory.

Command Required Parameters Required Permissions Example
updateprimitiveinventory group, password, item, range, entity, action interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Add a "README" notecard from the bot's
            // inventory to a primitive named "Package".
            "command", "updateprimitiveinventory",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Package",
            "range", 5,
            "entity", "README",
            "action", "add"
        ]
    )
);
Parameter Possible Value Optional Parameter Description
action add Add an entity to the primitive.
remove Remove an entity from the primitive.
take Remove an entity from the primitive and place it in Corrade's inventory.
folder The UUID of the folder where Corrade should take the item.

Depending on context, entity can be:

  • In the context of the add action, entity can be a name or UUID representing an item in the bot's inventory.
  • In the context of the remove action, entity can be the name or UUID representing an item in the primitive's inventory.

Upload and Download Terrain

14 December 2014

  • Release 7.28 - Corrade now returns or takes the terrain as a Base64 encoded string passed to the data key.

The terrain command can download and upload terrains for a region:

  • it can upload a terrain by sending the raw terrain file as a Base64 string passed to the data key when the command's action is set.
  • it can download a terrain by returning a Base64 encoded raw terrain file as the value of the data key.
Command Required Parameters Required Permissions Example
terrain group, password, action land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // fetch the terrain for the current region
            // that Corrade is currently on
            "command", "terrain",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "get",
            // get the raw terrain for the current region
            // and send it as a Base64 encoded string in 
            // the "data" key of the callback string
            "callback", llEscapeURL(URL)
        ]
    )
);

Reply to an Inventory Offer

The replytoinventoryoffer command can be used to reply to an inventory offer provided that the session UUID is known (for example, by installing the inventory notification using the notify command).

Command Required Parameters Required Permissions Example
replytoinventoryoffer group, password, action, session inventory
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // fetch the current terrain and send it
            // to the URL http://my-server.me/terrain.php
            "command", "replytoinventoryoffer",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "accept", // or decline
            // can be retrieved from the inventory notification
            "session", "41f8742f-0099-47d4-91b5-d5833500ac08",
            "callback", llEscapeURL(URL)
        ]
    )
);
Optional Parameter Possible Value Description
folder The name or UUID of a folder in Corrade's inventory. Accepts the inventory offer and places the asset in the specified folder instead of the default folder for the given asset type.

Note that if items are sent to Corrade by a master specified in Corrade.ini, Corrade will always accept the item. In order to receive items from non-registered masters, the notify command can be used to install an inventory notification and, when receiving that notification, the replytoinventoryoffer command can be used to accept or decline the offered inventory item. Alternatively, the getinventoryoffers command can be used to retrieve the full list of pending inventory offers and to reply to them.

Get Pending Inventory Offers

The getinventoryoffers command lists all pending inventory offers as as CSV list of sequential elements of:

  • the agent name offering the item
  • the type of item that the avatar is offering
  • the message (usually, the item name)
  • the session UUID (which can be used with the replytoinventoryoffer command to accept or decline the offered item).
Command Required Parameters Required Permissions Example
getinventoryoffers group, password inventory
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // fetch the current terrain and send it
            // to the URL http://my-server.me/terrain.php
            "command", "replytoinventoryoffer",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "accept", // or decline
            // can be retrieved from the inventory notification
            "session", "41f8742f-0099-47d4-91b5-d5833500ac08",
            "callback", llEscapeURL(URL)
        ]
    )
);

Play Gesture

The playgesture command can be used to trigger a gesture in Corrade's inventory.

Command Required Parameters Required Permissions Example
playgesture group, password, item grooming
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // plays the gesture "Happy Dance"
            // from Corrade's inventory
            "command", "playgesture",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "item", "Happy Dance"
        ]
    )
);

Jump

The jump command can make Corrade start jumping and stop jumping.

Command Required Parameters Required Permissions Example
jump group, password, action movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // makes Corrade jump
            "command", "jump",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or stop
            "action", "start"
        ]
    )
);

Crouch

The crouch command can make Corrade start crouching and stop crouching.

Command Required Parameters Required Permissions Example
crouch group, password, action movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // makes Corrade crouch
            "command", "crouch",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or stop
            "action", "start"
        ]
    )
);

Nudge

The nudge command is meant to slightly move Corrade along a direction.

Command Required Parameters Required Permissions Example
nudge group, password, direction movement
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // nudges Corrade left
            "command", "nudge",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "direction", "left"
        ]
    )
);
Parameter Possible Value Description
direction left Direction on which to move (in a local frame).
right
up
down
back
forward

Get Terrain Height

17 December 2014

  • Release 7.29 - added.

The getterrainheight command can be used to get the height at a certain point, the height map of an encompassing rectangle or the height map of the entire region.

Command Required Parameters Required Permissions Example
getterrainheight group, password land
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // get the height map of the 
            // entire region that Corrade
            // is currently standing on
            "command", "getterrainheight",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD)
        ]
    )
);
Optional Parameter Possible Value Description
southwest An LSL vector (only $x$ and $y$ components are considered). The bottom left point of a rectangle area (default <255, 255, 0>).
northeast An LSL vector (only $x$ and $y$ components are considered). The top right point of a rectangle area (default <0, 0, 0>).

Every region ranges locally from $0$ to $255$ on both $x$ and $y$ positive senses of the axes and the height-map generated by this command is generated in $1m$ steps - fractional values of $x$ and $y$ components are automatically truncated to the integer. The southwest and northeast parameters, if supplied, allow you to encompass a rectangle for which you want to generate a height map for.

Suppose you have a parcel that looks like the following, where every star denotes an offset from the origin $O(0,0)$, then the bottom-left coordinate is what you should supply to the southwest parameter and northeast is the top-right coordinate:

* * * * B <--- top-right (northeast)
* * * * *
* * * * *
A * * * *
^
|
|
bottom-left (southwest)

In case southwest and northeast parameters are omitted then the command assumes you want to generate a height map for the entire region (ie: $A$ becomes the origin at <0,0,0> and $B$ becomes the top-right coordinate of the region <255,255,0>).

Change Input/Output Filters

5 February 2015

  • Release 7.63 - added.

The filter command can be used to change Corrade's IO filters dynamically, thereby overriding the settings in Corrade's configuration file Corrade.ini, as well as to retrieve the current filters.

Command Required Parameters Required Permissions Example
filter group, password, action filter
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Get the current set input filters.
            "command", "filters",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "get",
            "type", "input",
            "callback", llEscapeURL(URL)
        ]
    )
);
Parameter Possible Value Additional Parameter Possible Value Description
action get type input Retrieves the currently set input filters.
output Retrieves the currently set output filters.
set input A CSV list of input filters. Sets the input filters.
output A CSV list of output filters. Sets the output filters.

When you want to set the filters, you can set both input and output filters at the same time by specifying both input and output parameters. For example, the following command will set RFC3986 and VIGENERE encryption for both input and output filters:

llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Get the current set input filters.
            "command", "filters",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "set",
            "input", wasListToCSV(["rfc3986", "vigenere"]),
            "outout", wasListToCSV(["vigenere", "rfc3986"]),
            "callback", llEscapeURL(URL)
        ]
    )
);

For more information on Corrade's IO filters, please see the filters tutorial and you can find a list of implemented filters on the API page.

Create Notecard

The createnotecard command can be used to create a new notecard in Corrade's inventory.

Command Required Parameters Required Permissions Example
createnotecard group, password, name inventory
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // creates a notecard called
            // "Hello" containing the
            // text "Good day!"
            "command", "createnotecard",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "name", "Hello",
            "text", "Good day!"
        ]
    )
);
Optional Parameter Description
text The text contained in the notecard.
description The description text of the notecard.

Upload Assets

4 May 2015

  • Release 7.82 - Corrade now supports uploading multiple image formats for the Texture asset type.

14 December 2014

  • Release 7.28 - added.

The upload command can be used upload assets onto the grid.

Command Required Parameters Required Permissions Example
upload group, password, name, type, data inventory, economy
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Create a script called "Good day!" and 
            // set the permissions to MODIFY COPY.
            "command", "upload",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "name", "Good day!",
            "type", "LSLText",
            "data", llEscapeURL(llStringToBase64("
                default { 
                    state_entry() { 
                        llOwnerSay(\"Good day!\");
                    }
                }
            ")),
            // "Copy" and "Modify" permissions.
            "permissions", wasListToCSV(
                [
                    "Copy",
                    "Modify"
                ]
            ),
            "callback", llEscapeURL(URL)
        ]
    )
);
Optional Parameter Description
description The description of the asset.
permissions The permissions for the next owner (this option is ignored for Landmarks which always have full permission).

The possible and currently supported uploadable assets are the following:

Parameter Possible Value Parameter Description
type Texture Uploads a texture that is encoded in either: JPEG2000, Bmp, Emf, Exif, Gif, Icon, Jpeg, MemoryBmp, Png, Tiff or Wmf.
Sound Uploads a sound in OGG Vorbis format.
Animation Uploads an animation in .animatn format.
Clothing wear Uploads wearables for a certain clothing slot (wear) set to one of the values of the WearableType enumeration.
Bodypart wear Uploads body parts for a certain slot (wear) set to one of the values of the WearableType enumeration.
Landmark Uploads landmarks.
Gesture Uploads gestures.
Notecard Uploads notecards.
LSLText Uploads scripts.

and the data passed to the data parameter is compatible with the data retrieved by the download command.

Encoding Assets for Upload

For example, to upload a texture, you would have to have an image encoded in either JPEG2000, Bmp, Emf, Exif, Gif, Icon, Jpeg, MemoryBmp, Png, Tiff or Wmf. For this example, let's assume you have a JPEG2000 image. You would Base64-encode the JPEG2000 code-stream image. After that, you send the upload command to Corrade with the value of the data key set to an URL-encoded string of the Base64-encoded JPEG2000 code-stream image.

In other words:

  • you have an initial JPEG2000 code-stream image file.
  • you encode the image file as a Base64 string.
  • you encode the Base64 string in an URL-encoded string.

The reason for multiple levels of encoding is that Base64 uses the equal sign (=) as a padding element which interferes with key-value data syntax.

Since Base64 encoding may produce large strings, a reliable way to upload assets is to use Corrade's internal HTTP server.

Assets such as clothing, landmarks, gestures, notecards and scripts can be uploaded (created) as the reverse operation of the download command. Each of these assets are Linden-based formats which, some of them, can be reconstructed intuitively in plain-text. For example, scripts as LSLText requires the encoded data to be just a plain-text LSL script. Landmarks, clothing, gestures and notecards also have their own specific Linden-based format. If you are curious to see what that format may be, use the download command on some clothing and then Base64 decode the data returned by Corrade.

Download Assets

4 May 2014

  • Release 7.82 - added the optional format parameter for the Texture asset-type that will allow downloading to a different format other than JPEG2000.

14 December 2014

  • Release 7.28 - added.

The download command can be used to download assets from the grid.

Command Required Parameters Required Permissions Example
download group, password, item, type interact, inventory
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Download a texture by UUID
            "command", "download",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            // or an item name from Corrade's inventory
            "item", "742c887b-a8ed-ba7b-6e7f-8ba8e9d1d76a",
            "type", "Texture",
            "callback", llEscapeURL(URL)
        ]
    )
);

The possible and currently supported downloadable assets are the following: Bmp Emf Exif Gif Icon Jpeg MemoryBmp Png Tiff Wmf

Parameter Possible Value Optional Parameter Possible Value Description Download from
type Texture format Bmp Downloads a texture in the specified format or in JPEG2000 format in case format was not specified. Asset server
Emf
Exif
Gif
Icon
Jpeg
Png
Tiff
Wmf
Sound Downloads a sound in OGG Vorbis format. Asset server
Animation Downloads an animation in .animatn format. Asset server
Clothing Downloads wearables. Asset server
Bodypart Downloads body parts. Asset server
Landmark Downloads landmarks. Asset server
Gesture Downloads gestures. Asset server
Notecard Downloads notecards. Inventory
LSLText Downloads scripts. Inventory

and the data retrieved is compatible with the data supplied to the upload command.

The asset will be downloaded, encoded as a Bas64 string and then places as the value to the data key from the callback.

Notes on Formats

Textures, sounds and animations are well-known formats that, once received, can be easily reused and converted to something else. On the other hand, clothing, landmarks, gestures, notecards and scripts (LSLText) are Linden-based formats that cannot be converted directly.

Some of these formats, for example Clothing, include references to images which will have to be pulled separately by first retrieving the clothing, going through the file and gathering UUIDs and then issuing another download to fetch the textures.

Notes on Permissions

Except for notecards and scripts (LSLText) all the other assets can be grabbed by Corrade's download command in case the UUID of the item is known.

Set Viewer Effect

28 February 2015

  • Release 7.78 - finalised.

28 February 2015

  • Release 7.75 - initial add.

The setviewereffect updates or creates a viewer effect (either LookAt, PointAt, Beam or Sphere).

Command Required Parameters Required Permissions Example
setviewereffect group, password, effect interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Start a beam effect to the 
            // primitive in which this
            // script is placed.
            "command", "setviewereffect",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "effect", "Beam",
            "item", llEscapeURL(llGetKey()),
            "range", 5,
            "callback", llEscapeURL(URL)
        ]
    )
);

With the possible parameter tree:

Parameter Possible Value Sub-Parameter Possible Value Description
effect Look item, range or agent by UUID (agent) or by firstname and lastname Sets a LookAt on either an item in range or an avatar by agent UUID or by firstname and lastname.
offset A vector describing an offset from Corrade.
type A LookAt type.
Point item, range or agent by UUID (agent) or by firstname and lastname Sets a PointAt on either an item in range or an avatar by agent UUID or by firstname and lastname.
offset A vector describing an offset from Corrade.
type A PointAt type.
Beam item, range or agent by UUID (agent) or by firstname and lastname Sets a Beam on either an item in range or an avatar by agent UUID or by firstname and lastname.
color An LSL color vector.
alpha A value in the interval $[0, 1]$ describing the color alpha.
duration The duration (in seconds) for the effect.
offset A vector describing an offset from Corrade.
Sphere color An LSL color vector. Creates a particle swirl effect.
alpha A value in the interval $[0, 1]$ describing the color alpha.
duration The duration (in seconds) for the effect.
offset A vector describing an offset from Corrade.

The command takes an optional parameter id, an UUID corresponding to an effect:

Optional Parameter Description
id The UUID of the effect to set.

and in case id is not specified, then Corrade will generate a random UUID.

Notes

  • For LookAt and PointAt effects, setting LookAtType respectively PointAtType to None will remove the effect. This is the equivalent of issuing a deleteviewereffect command.
  • The command will return an UUID referenced by the data key via the callback which represents the UUID of the effect created or modified. This UUID can be used as a reference for both ulterior setviewereffect or deteleviewereffect calls. You most likely want to track the viewer effects for LookAt and PointAt in order to be able to change them.

Delete Viewer Effect

28 February 2015

  • Release 7.78 - finalised.

28 February 2015

  • Release 7.75 - initial add.

The deleteviewereffect deletes a viewer effect by ID.

Command Required Parameters Required Permissions Example
deleteviewereffect group, password, effect, id interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Deletes a viewer effect.
            "command", "deleteviewereffect",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "effect", "Look",
            "id", llEscapeURL("3d5a56af-70f2-4de0-82c5-3a4fa048233b"),
            "callback", llEscapeURL(URL)
        ]
    )
);
Parameter Possible Value
effect Look
Point

Notes

  • Calling deleteviewereffect on an existing effect UUID as parameter to id is equivalent to calling setviewereffect with LookAtType respectively PointAtType set to None - both of which will remove the effect from tracking and replace it by a dead beacon.
  • Sphere and Beam effects cannot be removed and they will expire after their duration has elapsed.

Get Viewer Effects

28 February 2015

  • Release 7.78 - finalised.

28 February 2015

  • Release 7.75 - initial add.

The getviewereffects lists all the currently tracked viewer effects.

Command Required Parameters Required Permissions Example
getviewereffects group, password, effect interact
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // Gets all active LookAt viewer effect.
            "command", "getviewereffects",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "effect", "Look",
            "callback", llEscapeURL(URL)
        ]
    )
);

With the possible values for the parameter effect:

Parameter Possible Value
effect Look
Point
Sphere
Beam

The currently tracked viewer effects will be returned via the callback as a CSV list referenced by the data key:

Effect Return Description
Look effect An UUID referencing the effect that can be used with the setviewereffect and deleteviewereffect command.
source The UUID of the source.
target The UUID of the target.
offset An LSL positional vector describing an offset.
type The LookAt type.
Point effect An UUID referencing the effect that can be used with the setviewereffect and deleteviewereffect command.
source The UUID of the source.
target The UUID of the target.
offset An LSL positional vector describing an offset.
type The PointAt type.
Sphere effect The UUID of the effect.
offset An LSL positional vector describing an offset.
color An LSL vector representing a color.
alpha An value in the interval $[0, 1]$ representing the color alpha.
duration The duration that the original effect was set with.
termination A date and time when the effect is expected to terminate.
Beam effect The UUID of the effect.
offset An LSL positional vector describing an offset.
source The UUID of the source.
target The UUID of the target.
color An LSL vector representing a color.
alpha An value in the interval $[0, 1]$ representing the color alpha.
duration The duration that the original effect was set with.
termination A date and time when the effect is expected to terminate.

Notifications

29 April 2015

  • Release 7.114 - split the radar notification into avatars and primitives notifications.

29 April 2015

  • Release 7.113 - added the radar notification.

21 April 2015

  • Release 7.105 - the local notification has been upgraded to include the source type, the audible level and the volume.

4 April 2015

  • Release 7.94
  • The local notification no longer passes script errors from the debug channel as part of local chat. Instead, the new debug notification has been introduced for that purpose.

27 March 2015

  • Release 7.84
  • The inventory offer and reply system has been overhauled. As a consequence, the inventory notification has been changed: in case an inventory offer comes from an agent, then the firstname, lastname will be present in the return keys. Otherwise, the name of the object will be passed to the name key. Furthermore, the item name is passed along for inventory offers in the key item.

5 March 2015

  • Release 7.80
  • Added the position parameter for the local notification.
  • Added the ownersay, regionsayto, objectim and rlv notifications.

20 February 2015

  • Release 7.71 - added url notification.

3 January 2015

  • Release 7.36 - added membership notification.

1 January 2015

  • Release 7.35 - added economy notification.

21 December 2014

  • Release 7.34.
  • The cross notification now also sends notifications on region changed (such as teleports) and sets action to crossed in case a region-cross occurred or sets action to changed in case of a teleport.
  • The effect notification now passes the value generic to the action key, point on point-at and lookat on lookat effects.
  • The group notice notification has been extended to also send inventory accepted / declined messages when Corrade is sending a notification with an attachment.
  • The friendship notification now passes the action key set to update on information events such as online / offline status changes and permissions being granted or revoked.
  • The inventory notification has been extended to send accept and decline responses as well as inventory offers.
  • Added typing notification.
  • Added invite notification.

18 December 2014

  • Release 7.31 - added the terse notification.

14 December 2014

  • Release 7.28 - the collision notification returns entity instead of collision as the key for the collision type.
Notification Key Parameter Description Description Related Command
alert type The type of the notification. Simulator and Second Life alert messages.
message The alert message.
region type The type of the notification. Region messages sent by estate managers.
message The region message.
agent The UUID of the person sending the region message.
group type The type of the notification. Messages sent to a group.
group The group name that the message was sent to.
firstname The first name of the person sending the message.
lastname The last name of the person sending the message.
agent The UUID of the person sending the group message.
message The message that was sent.
balance type The type of the notification. Money balance changed - currency received or sent.
balance The amount of the currency available.
local type The type of the notification. Messages on local chat.
firstname The first name of the person sending the message.
lastname The last name of the person sending the message.
agent The UUID of the person sending the message.
owner The owner UUID of the person sending the message.
item The item UUID of the object sending the message.
position An LSL vector representing the position of the originating chat.
message The message sent.
entity Either System, Agent or Object.
audible Either Not, Barely or Full.
volume Either Normal, Whisper or Shout.
message type The type of the notification. Instant messages received.
firstname The first name of the person sending the message.
lastname The last name of the person sending the message.
agent The UUID of the person sending the message.
message The message sent.
notice type The type of the notification. Group notices received.
firstname The first name of the person sending the message.
lastname The last name of the person sending the message.
message The message sent.
subject The subject of the message.
agent The UUID of the person sending the notice.
action Set to either accept or decline depending on whether the notice attachment sent by Corrade has been accepted or declined by the destination or to received in case Corrade has received the notification.
dialog type The type of the notification. Dialog boxes sent by scripts replytoscriptdialog
firstname The first name of the person sending the dialog.
lastname The last name of the person sending the dialog.
message The message sent.
channel The channel on which the dialog was sent.
name The name of the object sending the dialog.
item The UUID of the item sending the dialog.
owner The owner UUID of the item sending the dialog.
button The button labels sent by the dialog.
friendship type The type of the notification. Friendship offered, received, friends going online or offline and rights being added or removed. replytofriendshiprequest
action Set to either request or response depending on whether Corrade received a request or the avatar to whom friendship was offered responds or update in case friends go online / offline or rights have been changed.
firstname The first name of the avatar involved in the friendship action.
lastname The last name of the avatar involved in the friendship action.
agent The UUID of the person sending the message.
status online or offline
rights A CSV string of rights currently active.
inventory type The type of the notification. Inventory items being offered to Corrade or accepted or declined by Corrade. replytoinventoryoffer
firstname In case an agent is sending the asset: the first name of the avatar sending the asset.
lastname In case an agent is sending the asset: the last name of the avatar sending the asset.
agent The UUID of the avatar sending the asset or the UUID of the owner of the object sending the asset.
name In case an object is sending the asset: the name of the object sending the asset.
asset The asset type being offered.
item The name of the item being offered or accepted or declined.
session The session UUID of the inventory offer.
action Set to either reply in case this is reply to inventory offered by Corrade or offer in case this an inventory offer that Corrade receives.
permission type The type of the notification. Scripts asking for permissions. replytoscriptpermissionrequest
item The UUID of the item requesting permission.
task The task (script) UUID of the item requesting permission.
permissions A CSV list of requested permissions.
lure type The type of the notification. Teleport lures being received by Corrade. replytoteleportlure
firstname The first name of the avatar sending the teleport lure.
lastname The last name of the avatar sending the teleport lure.
agent The UUID of the avatar sending the teleport lure.
session The session UUID of the teleport lure.
effect type The type of the notification. Viewer effects that Corrade senses.
effect The viewer effect type.
source The source of the effect.
target The target of the effect.
position The target position of the effect.
duration The duration of the effect.
id The effect UUID.
action Set to either generic for generic viewer effects, point for point-at effects and look for look-at effects.
collision type The type of the notification. Avatars or objects colliding with Corrade.
aggressor The avatar or object UUID that collided with Corrade.
magnitude The magnitude of the collision.
time A long formatted date-time when the collision occurred.
entity The type of the collision.
victim The agent UUID that the object or avatar collided with.
crossing type The type of the notification. Corrade crossing region boundaries.
old The old simulator name.
new The new simulator name.
terse type The type of the notification. Avatar and object updates.
id The UUID of the avatar or object.
entity The type of update, can be one of the PCode enumeration fields.
position The new position.
rotation The new rotation.
typing type The type of the notification. Avatars starting and stopping to type.
firstname The first name of the avatar.
lastname The last name of the avatar.
agent The UUID of the avatar.
action Either start or stop depending on whether the avatar started or stopped typing.
invite type The type of the notification. Group invites received by Corrade. replytogroupinvite
firstname The first name of the avatar.
lastname The last name of the avatar.
agent The UUID of the avatar.
group The group name that Corrade was invited to.
session The session UUID of the group invite.
economy type The type of the notification. Money balance events (when money is paid in or paid out).
balance The current balance.
description The description for the transaction.
committed The meters committed.
credit The meters credited.
success Whether the transaction was successful.
id The transaction ID.
amount The amount of money transacted.
target The target of the transaction.
source The source of the transaction.
transaction The type of the transaction. Can be any one of the money transaction types in libomv.
membership type The type of the notification. Group membership events (agents joining and leaving groups).
firstname The first name of the avatar.
lastname The last name of the avatar.
agent The UUID of the avatar.
group The group name that the avatar left or joined.
action Either joined or parted depending on whether the avatar joined or left the group.
url type The type of the notification. Requests to navigate to an URL commonly sent by scripts using the llLoadURL LSL function.
name The name of the object containing the script that sent the request.
item The UUID of the object sending the request.
owner The UUID of the avatar to whom the object belongs that sent the request.
group True or False depending on whether the object is owned by a group.
message The message sent along with the request to open the URL.
url The URL that should be visited or opened.
ownersay type The type of the notification. llOwnerSay messages that are not RLV commands.
name The name of the object containing the script that sent the request.
item The UUID of the object sending the request.
message The message sent along with the request to open the URL.
position An LSL vector representing the position of the originating chat.
regionsayto type The type of the notification. llRegionSayTo messages that are not Corrade commands.
name The name of the object containing the script that sent the request.
item The UUID of the object sending the request.
owner The UUID of the avatar to whom the object belongs that sent the request.
message The message sent along with the request to open the URL.
position An LSL vector representing the position of the originating chat.
objectim type The type of the notification. llInstantMessage messages from objects that are not RLV commands.
name The name of the object containing the script that sent the request.
item The UUID of the object sending the request.
owner The UUID of the avatar to whom the object belongs that sent the request.
message The message sent.
rlv type The type of the notification. RLV commands that Corrade processes (useful for debugging RLV).
name The name of the object containing the script that sent the request.
item The UUID of the object sending the request.
position An LSL vector representing the position of the originating chat.
rlv A list of CSV commands representing in-order: behaviours, options, parameters.
debug type The type of the notification. Script errors on the debug channel.
name The name of the object containing the script that thew an error.
item The item UUID of the object containing a script that threw an error.
position An LSL vector representing the position of the object containing a script that threw an error.
message The LSL error message.
avatars type The type of the notification. Avatars appearing and disappearing in Corrade's range.
id The UUID of the avatar.
entity The type of update, can be one of the PCode enumeration fields.
position The avatar's position.
rotation The avatar's rotation.
action Either appear in case the avatar appeared in-range or vanish in case the avatar disappeared from Corrade's range.
primitives type The type of the notification. Primitives appearing and disappearing in Corrade's range.
id The UUID of the primitive.
entity The type of update, can be one of the PCode enumeration fields.
position The primitive's position.
rotation The primitive's rotation.
action Either appear in case the primitive appeared in-range or vanish in case the primitive disappeared from Corrade's range.

Enable and Disable RLV Dynamically

The rlv command can be used to enable or disable Corrade's RLV subsystem dynamically.

Command Required Parameters Required Permissions Example
rlv group, password, action system
llInstantMessage(CORRADE, 
    wasKeyValueEncode(
        [
            // enable RLV
            "command", "rlv",
            "group", llEscapeURL(GROUP),
            "password", llEscapeURL(PASSWORD),
            "action", "enable"
        ]
    )
);
Parameter Possible Value Description
action enable Enable RLV.
disable Disable RLV.

RestrainedLife / RestrainedLove / RLV

5 January 2015

  • Release 7.39 - added.

Corrade supports processing RLV commands when it receives a message through llOwnerSay just like a viewer. In its current state, based on RestrainedLife protocol version 1.23, Corrade implements the following set of RLV commands:

  • version
  • versionnew
  • versionnum
  • getgroup
  • setgroup
  • getsitid
  • sit
  • unsit
  • setrot
  • tpto
  • getoutfit
  • getattach
  • remattach
  • detach
  • remoutfit
  • attach
  • attachoverorreplace
  • attachover
  • getinv
  • detachme
  • getpathnew
  • findfolder
  • getinvworn
  • clear
  • accepttp
  • acceptpermission
  • getstatusall
  • getstatus

Note that Corrade does track restrictions from RLV commands but that RLV commands do not take precedence over Corrade's commands such that many of the restrictions of RLV, although tracked, are not enforced.

Corrade Input/Output Filters

Encoders / Decoders:

  • URI (RFC3986) - implemented by most languages
  • Base64 - implemented by most languages

Encryption / Decryption:

Index

1)
The name parameter is optional for classified and event search type but required for all other search types.

secondlife/scripted_agents/corrade/api/conservative.txt · Last modified: 2017/02/22 18:26 (external edit)

Access website using Tor


For the copyright, license, warranty and privacy terms for the usage of this website please see the license and privacy pages.