Groups Extension
Groups are a way to organize users and notes into communities. They can be used for any purpose, such as forums, blogs, image galleries, video sharing, audio sharing, and messaging. They are similar to Discord's channels or Matrix's rooms.
Refer to Note's group property for how notes can be associated with groups.
Entity Definition
- Name
type- Required
- Required
- Type
- string
- Description
Must be
pub.versia:groups/Group.
- Name
name- Type
- ContentFormat
- Description
Group name/title.
Text only (
text/plain,text/html, etc).
- Name
description- Type
- ContentFormat
- Description
Short description of the group's contents and purpose.
Text only (
text/plain,text/html, etc).
- Name
open- Required
- Required
- Type
- boolean
- Description
Whether the group is open to all users or requires approval to join.
This is meant as a UI hint and does not guarantee that group subscriptions will be accepted or rejected.
It is similar to a User's
manually_approves_followersfield.
Example Group
{
"type": "pub.versia:groups/Group",
"id": "ed480922-b095-4f09-9da5-c995be8f5960",
"name": {
"text/html": {
"content": "The <strong>Woozy</strong> fan club"
}
},
"description": {
"text/plain": {
"content": "A group for fans of the Woozy emoji."
}
},
"open": false
}
Collections
The following Collections are available:
members: URI Collection of Users that are members of the group.notes: URI Collection of Notes that are associated with the group.
These can be fetched using the Federation API
Subscribing to Groups
Users may "subscribe" to a Group in order to receive all Notes posted to it. The mechanism by which federation is handled is described at the end of this document.
First, a User must send a GroupSubscribe activity to the group. The group will then respond with either a GroupSubscribeAccept or a GroupSubscribeReject activity.
If the group accepts the subscription, the user will receive all notes posted to the group. If the group rejects the subscription, the user will not receive any notes posted to the group.
GroupSubscribe
Indicates that a User wishes to subscribe to a group.
This entity is a Transient Entity.
Example GroupSubscribe
{
"type": "pub.versia:groups/Subscribe",
"subscriber": "e9277471-8aa1-4d40-a3d0-0878e818ccdc",
"group": "example.com:ed480922-b095-4f09-9da5-c995be8f5960",
"created_at": "2021-01-01T00:00:00Z"
}
GroupUnsubscribe
Indicates that a User wishes to unsubscribe from a group.
This entity is a Transient Entity.
Example GroupUnsubscribe
{
"type": "pub.versia:groups/Unsubscribe",
"subscriber": "e9277471-8aa1-4d40-a3d0-0878e818ccdc",
"group": "example.com:ed480922-b095-4f09-9da5-c995be8f5960",
"created_at": "2021-01-01T00:00:00Z"
}
GroupSubscribeAccept
Indicates that a Group has accepted a User's subscription request. Should be sent by the instance hosting the group.
This entity is a Transient Entity.
Example GroupSubscribeAccept
{
"type": "pub.versia:groups/SubscribeAccept",
"subscriber": "e9277471-8aa1-4d40-a3d0-0878e818ccdc",
"group": "example.com:ed480922-b095-4f09-9da5-c995be8f5960",
"created_at": "2021-01-01T00:00:00Z"
}
GroupSubscribeReject
Indicates that a Group has rejected a User's subscription request. Should be sent by the instance hosting the group.
This entity is a Transient Entity.
Example GroupSubscribeReject
{
"type": "pub.versia:groups/SubscribeReject",
"subscriber": "e9277471-8aa1-4d40-a3d0-0878e818ccdc",
"group": "example.com:ed480922-b095-4f09-9da5-c995be8f5960",
"created_at": "2021-01-01T00:00:00Z"
}
Federation
Group federation represents a particularly challenging problem, as it requires a way to make sure every single Note posted to it is delivered to every single member of the group.
All Notes posted to a group (using the group field) must be sent to its instance's inbox.
Once this is done, the group's instance must then federate this Note to every member of the group. However, this cannot be done the "normal way", as the group's instance does not have the private key to sign the Note.
GroupFederate
The GroupFederate entity allows a group to federate a note to all of its members, without needing to sign the note itself. It contains a URI to the note being federated, which must be fetched by the receiving instances. This entity is sent by the group's instance.
This entity is a Transient Entity.
Example GroupFederate
{
"type": "pub.versia:groups/Federate",
"note": "c5aa65fa-0356-4029-b61c-6b237e5d1393",
"group": "example.com:ed480922-b095-4f09-9da5-c995be8f5960",
"created_at": "2021-01-01T00:00:00Z"
}