Matrix: stickers and locations can be read but not sent #123

Closed
opened 2026-09-06 12:04:32 -04:00 by Salastil · 1 comment
Owner

moho renders both - m.sticker is a known event type and m.location a known msgtype
(backend/matrix/protocol.rs) - and can send neither. There is no sticker picker and
no way to share a location, so both are things that arrive and can only be looked at.

What is needed

  • Stickers: read the account's sticker packs (im.vector.setting.sticker_picker
    account data, or the packs in m.image_pack room state), a picker beside the emoji
    one that already exists (components/EmojiPicker.tsx), and sending as an
    m.sticker event rather than an image.
  • Location: m.location with a geo: URI. The gesture is worth thinking about on
    a desktop client - a picked point rather than "where I am now" - and live location
    sharing (MSC3489) is a separate thing that should not be assumed into this.

Done looks like: a sticker somebody sends can be sent back, and a place can be
put in a room.

Reference: Element.

moho renders both - `m.sticker` is a known event type and `m.location` a known msgtype (`backend/matrix/protocol.rs`) - and can send neither. There is no sticker picker and no way to share a location, so both are things that arrive and can only be looked at. **What is needed** - **Stickers**: read the account's sticker packs (`im.vector.setting.sticker_picker` account data, or the packs in `m.image_pack` room state), a picker beside the emoji one that already exists (`components/EmojiPicker.tsx`), and sending as an `m.sticker` event rather than an image. - **Location**: `m.location` with a `geo:` URI. The gesture is worth thinking about on a desktop client - a picked point rather than "where I am now" - and live location sharing (MSC3489) is a separate thing that should not be assumed into this. **Done looks like:** a sticker somebody sends can be sent back, and a place can be put in a room. Reference: Element.
Salastil added the featureprotocol labels 2026-09-06 12:04:32 -04:00
Salastil removed the protocol label 2026-09-06 12:49:15 -04:00
Author
Owner

Finished — https://git.salastil.com/Salastil/nobilis/commit/5ddd786 and https://git.salastil.com/Salastil/moho/commit/8608c8d

Stickers come from MSC2545 image packs, which is the convention Element's own picker ends up reading: im.ponies.user_emotes in the account's data and im.ponies.room_emotes in a room's state, both read. Only the images a pack calls stickers are offered — sending an emoticon as a sticker posts a 20-pixel image as a message of its own.

They get their own button beside the emoji one rather than a section inside it: an emoji goes into the line being written, a sticker is the message, so mixing them would make half the cells type and half of them send.

Locations ship as a pin, not live sharing — that is a different feature with different promises. /location takes what people actually paste: 51.5, -0.12, a geo: URI, an OpenStreetMap or Google Maps link, with an optional name after it. What is not a place is refused rather than said aloud in the room.

Verified live on poa.st: a real im.ponies.room_emotes pack written into a test room was read back by the daemon, drawn in the stickers-only picker under its pack name, and one press sent it — the message arrived as an m.sticker with the image on it. /location 51.5074, -0.1278 the pub and an OSM link both landed and rendered; /location where are you was refused.

Finished — https://git.salastil.com/Salastil/nobilis/commit/5ddd786 and https://git.salastil.com/Salastil/moho/commit/8608c8d **Stickers** come from MSC2545 image packs, which is the convention Element's own picker ends up reading: `im.ponies.user_emotes` in the account's data and `im.ponies.room_emotes` in a room's state, both read. Only the images a pack calls stickers are offered — sending an emoticon as a sticker posts a 20-pixel image as a message of its own. They get **their own button beside the emoji one** rather than a section inside it: an emoji goes into the line being written, a sticker *is* the message, so mixing them would make half the cells type and half of them send. **Locations** ship as a pin, not live sharing — that is a different feature with different promises. `/location` takes what people actually paste: `51.5, -0.12`, a `geo:` URI, an OpenStreetMap or Google Maps link, with an optional name after it. What is not a place is refused rather than said aloud in the room. Verified live on poa.st: a real `im.ponies.room_emotes` pack written into a test room was read back by the daemon, drawn in the stickers-only picker under its pack name, and one press sent it — the message arrived as an `m.sticker` with the image on it. `/location 51.5074, -0.1278 the pub` and an OSM link both landed and rendered; `/location where are you` was refused.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Salastil/moho#123