matrix-doc/proposals/1959-integrations-stickerpi...

3.9 KiB

MSC1959: Sticker picker API

MSC1951 - Custom sticker packs and emojis adds a way for pack authors to share their creations with other users, however the interaction between them and the sticker/emoji pickers themselves are not defined. Although this proposal does not include an emoji picker definition, the API it proposes can easily and transparently be extended to such a widget.

Proposal

Some clients may wish to not embed the sticker picker widget into their application and instead get the sticker packs and render them as one common picker. To do this, the client would use the api_url specified in the widget's data. If the api_url is a trusted integration manager, the client should make requests to the API endpoints defined in this proposal using MSC1961 - Integration manager authentication. If the URL is not trusted, the user should be prompted for approval or the sticker picker skipped by the client.

GET /_matrix/integrations/v1/widgets/{widgetId}/packs

Retrieves the packs (as defined by MSC1951) for the sticker picker. In future, this API could be used by an emoji picker widget if it were to exist. No additional information is required to make the request, besides authorization tokens. The token should belong to the user which also owns the picker widget.

An example response is:

{
    "packs": [
        {
            "kind": "m.stickers",
            "name": "My Cool Stickerpack",
            "description": "This is the topic from the pack's room",
            "thumbnail": "mxc://example.org/media_id",
            "sharable_url": "https://packs.example.org/1234/my-cool-stickerpack",
            "creator": "https://matrix.to/#/%40alice%3Aexample.org",
            "author": "https://matrix.to/#/%40alice%3Aexample.org",
            "license": "CC-BY-NC-SA-4.0",
            "active_items": [
                {
                    "id": "ThisIsTheItemIdToDistinguishItFromAnotherItem-1",
                    "uri": "mxc://example.org/media_id",
                    "description": "This is where a short sentence explaining the sticker goes",
                    "shortcodes": [
                        ":sample:",
                        ":cool_sticker:"
                    ]
                },
                {
                    "id": "ThisIsTheItemIdToDistinguishItFromAnotherItem-2",
                    "uri": "mxc://example.org/media_id_2",
                    "description": "Words go here",
                    "shortcodes": [
                        ":words:",
                        ":example:"
                    ]
                }
            ]
        }
    ]
}

Note that the pack object in the response is very similar to that of a m.pack.metadata event containing m.pack.item events. The additional fields are name (required), description (optional), thumbnail (optional - use first item's uri if not present), and sharable_url (required). The active_items array has also been modified to be m.pack.item event contents with an added id field for tracking purposes.

PUT /_matrix/integrations/v1/widgets/{widgetId}/packs

Adds a new pack to the picker. The picker is responsible for resolving the sharable URL provided and tracking changes to it. The response is 200 OK with a pack object (see GET version of this API above).

An example request body would be:

{
    "sharable_url": "https://packs.example.org/1234/my-cool-stickerpack"
}

DELETE /_matrix/integrations/v1/widgets/{widgetId}/packs

Similar to the PUT version, this deletes a pack from the picker. The picker is expected to resolve the sharable URL provided to determine which pack needs to be removed. If the pack was removed, an empty JSON object with 200 OK is returned. The request body is the same as the PUT version of this endpoint.