- described by vocabulary inventors here Potential Actions attached to objects
Identifies one or more entities to which this object is attributed. The attributed entities might not be Actors. For instance, an object might be attributed to the completion of another activity.
Describes the result of the activity. For instance, if a particular action results in the creation of a new resource, the result property can be used to describe that new resource.
...
Based on Example 3 and discussion by the Vocabulary inventors about Potential Actions attached to objects
// ActivityHandler
is a subClassOf Profile
which is Object
…
Just the scope covered by the example but it goes to infinity and beyond: User story Alyssa wants to create an awesome Event in her ActivityPub Client. She directly would like to offer some tickets which people can accept or reject. Alyssa needs to know what food the attendees prefer and if they have requirements. Attendees should get the ability to RSVP, check-in or propose talks for the CFP.
Since Alyssa expects around 20.000 visitors to the event, the ticket system is based on vouchers. Different audiences can redeem vouchers in different time periods and get a ticket. This should be done by a human interaction to make the process fair.
Alyssa CREATES (Event) Client to Server Interactions
If an Activity is submitted with a value in the id property, servers MUST ignore this and generate a new id for the Activity. Servers MUST return a 201 Created HTTP code, and unless the activity is transient, MUST include the new id in the Location header. [ff.] For non-transient objects, the server MUST attach an id to both the wrapping Create and its wrapped Object.
- A redaktor server MUST recursively loop the
result
property of an Activity: If the entry has typeBrowserView
orEmbeddedView
then this id MUST also be added to thecontext
property of the handlers described object otherwise it MUST also be added to thecontext
property of the object and this object must beCreate
d as if it would come from a Client. If an Activity is submitted with a value in the id property of the entry, servers MUST ignore this and generate a new id for the Activity. The parentid
MUST be copied to theinReplyTo
property. If a transitive Activity is submitted in aresult
without anobject
property, the parentobject
MUST be copied to the result. Finally the server MUST trigger the result and replace its object by theid
… TODO - capabilities, e.g. https://github.com/gobengo/activitypub-lab
A redaktor server MUST recursively loop the objectOf
property of an Activity:
The nameMap
(or name
for single-language-implementations) property of the Activity supplies the label to use for the button, the icon
property supplies an icon and the summaryMap
/summary
supplies a description.
If any of these Actions appear without an object
property, the parent object
is the value for the object
property:
Add
, Announce
, Follow
, Join
, Like
, Listen
, Offer
, Read
, View
If any of these Actions appear without a target
property, the parent object
is the value for the target
property:
Invite
, Travel
- A redaktor client MUST include “Potential Actions attached to objects” as possible responses to the Object with the common semantics of ActivityPub and semantics described in Potential Actions attached to objects.
NOTE:
using
is nowinstrument
. If a redaktor client sees any Action with theinstrument
property and it has typeBrowserView
orEmbeddedView
orHttpRequest
orHtmlForm
, the client MUST trigger it. So, if any other client or system decides to offer the same reactions as aninReplyTo
it will not matter.
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Create",
"to": ["https://www.w3.org/ns/activitystreams#Public"],
"actor": "https://social.example/u/alyssa/",
"object": {
"type": "Event",
"id": "https://social.example/u/alyssa/events/1",
"attributedTo": "https://social.example/u/alyssa/",
"to": ["https://www.w3.org/ns/activitystreams#Public"],
"name": "37F3",
"content": "The annual four-day conference on the Fediverse organised by volunteers.",
"objectOf": [
"https://www.w3.org/ns/activitystreams#Like",
"https://www.w3.org/ns/activitystreams#Announce",
"https://www.w3.org/ns/activitystreams#Arrive",
{
"type": "Offer",
"name": "Ticket Vouchers",
"icon": {
"type": "Image",
"name": "Voucher Icon",
"url": "http://example.org/voucher.png",
"width": 16,
"height": 16
},
"instrument": {
"type": "BrowserView",
"href": "http://www.example.org/37F3/ticket",
"browserContext": "_new"
}
}
]
},
"result": [
{
"type": "Invite",
"name": "37F3: Free Ticket from “monopolies give back”-campaign",
"summary": "Hey Ben, please accept your reward for the Fediverse Freedom Freaks 2022 :)",
"content": "You will also get a nice Gin at the bar for free.",
"objectOf": [
{
"type": "Accept",
"name": "Want it",
"icon": {
"type": "Image",
"name": "OK",
"url": "http://example.org/accept.png",
"width": 16,
"height": 16
},
"result": [
{
"type": ["Note", "f3:Voucher"],
"name": "ANGELXXXXXXXXXX",
"to": "https://chatty.example/ben/",
"result": "https://www.w3.org/ns/activitystreams#Announce"
},
{
"type": "Note",
"to": "@monopoly@hyper.com",
"name": "Reward accepted by volunteer",
"content": "Hey monopoly with an annual revenue of $100,000,000,000, your 1 voucher was accepted and you made 1 person happy.",
"result": "https://www.w3.org/ns/activitystreams#Announce"
}
]
},
{
"type": "Reject",
"name": "Sorry, no.",
"icon": {
"type": "Image",
"name": "No",
"url": "http://example.org/reject.png",
"width": 16,
"height": 16
},
"result": [
{
"type": "Question",
"name": "Optional excuse",
"content": "Hey Ben, I guess it is cause family Christmas but feel free to justify yourself ;)"
"icon": {
"type": "Image",
"url": "http://example.org/question.png",
"width": 16,
"height": 16
},
"result": "https://www.w3.org/ns/activitystreams#Announce"
}
]
},
],
"result": [
"https://www.w3.org/ns/activitystreams#Announce",
{
"type": "Note",
"to": "@monopoly@hyper.com",
"name": "Reward offered to F3 volunteer",
"content": "Hey monopoly with an annual revenue of $100,000,000,000, your 1 voucher was offered."
"result": "https://www.w3.org/ns/activitystreams#Announce"
}
]
}
]
}
TODO Assign Template, ActivityHandler Template - Draft - Work Event-Offer-Accept/Reject-Question Example + RSVP + ask organizer
- serves as a default Object “to describe that new resource”.
- SHOULD be presented to the user as a “post interface”
- If it is presented to the user it MUST accept ActivityPub conformant editing of “the entirety of the protocol” and it SHOULD provide form components for extensions:
If no
@type
is defined (by looking up the JSON-LD@context
) provide a text input otherwise provide the best matching form component or widget, webcomponent etc.