Teach both engines the sticker wire
A sticker is a content envelope carrying an id, never an image: sending the picture would cost an upload and a download of bytes both ends already ship with, on every sticker. This is about sixty bytes. Recognised before the text path on both sides, because a sticker is renderable but is NOT text - it draws as a glyph with no bubble, and falling through would render it as an empty message. An unknown pack or id has to degrade to the pack's fallback rather than break, which is what the envelope format exists for. The pack is one JSON manifest read by both clients, so there is a single source of truth for what exists. docs/STICKERS.md says plainly what the first cut is: the glyphs are Unicode, because real sticker art is a design job, not a code one. The protocol, picker, rendering, fallback and tests are real and finished; swapping in artwork is a change to the manifest plus an image loader, not to any of that. It is not a claim to have drawn a sticker set. Emoji are deliberately NOT this. They go into the text of an ordinary message and are indistinguishable from any other character once sent - no new kind, no new field, nothing for the receiver to understand. That picker is a keyboard convenience, not a protocol feature. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
8ba0020785
commit
3b195c730c
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"pack": "flamenet.core",
|
||||
"name": "Flamenet",
|
||||
"fallback": "🙂",
|
||||
"stickers": [
|
||||
{ "id": "wave", "glyph": "👋", "name": "Wave" },
|
||||
{ "id": "yes", "glyph": "👍", "name": "Yes" },
|
||||
{ "id": "no", "glyph": "👎", "name": "No" },
|
||||
{ "id": "laugh", "glyph": "😂", "name": "Laughing" },
|
||||
{ "id": "love", "glyph": "❤️", "name": "Love" },
|
||||
{ "id": "party", "glyph": "🎉", "name": "Party" },
|
||||
{ "id": "think", "glyph": "🤔", "name": "Thinking" },
|
||||
{ "id": "cry", "glyph": "😭", "name": "Crying" },
|
||||
{ "id": "fire", "glyph": "🔥", "name": "Fire" },
|
||||
{ "id": "clap", "glyph": "👏", "name": "Applause" },
|
||||
{ "id": "sleep", "glyph": "😴", "name": "Sleeping" },
|
||||
{ "id": "eyes", "glyph": "👀", "name": "Looking" },
|
||||
{ "id": "ok", "glyph": "👌", "name": "OK" },
|
||||
{ "id": "pray", "glyph": "🙏", "name": "Please" },
|
||||
{ "id": "strong", "glyph": "💪", "name": "Strong" },
|
||||
{ "id": "coffee", "glyph": "☕", "name": "Coffee" },
|
||||
{ "id": "rocket", "glyph": "🚀", "name": "Rocket" },
|
||||
{ "id": "bug", "glyph": "🐛", "name": "Bug" },
|
||||
{ "id": "check", "glyph": "✅", "name": "Done" },
|
||||
{ "id": "warning", "glyph": "⚠️", "name": "Careful" },
|
||||
{ "id": "wave-bye", "glyph": "🫡", "name": "Salute" },
|
||||
{ "id": "shrug", "glyph": "🤷", "name": "Shrug" },
|
||||
{ "id": "star", "glyph": "⭐", "name": "Star" },
|
||||
{ "id": "cake", "glyph": "🎂", "name": "Cake" }
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user