A work-in-progress chat bot for Streamplace with chat overlay functionality
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Proper lexicons with @atcute/lex-cli

+1019 -13
+3 -1
deno.json
··· 5 5 "dev": "deno run -A --watch=static/,routes/ dev.ts", 6 6 "build": "deno run -A dev.ts build", 7 7 "start": "deno serve -A _fresh/server.js", 8 - "update": "deno run -A -r jsr:@fresh/update ." 8 + "update": "deno run -A -r jsr:@fresh/update .", 9 + "lex": "deno x lex-cli generate" 9 10 }, 10 11 "lint": { "rules": { "tags": ["fresh", "recommended"] } }, 11 12 "exclude": ["**/_fresh/*"], ··· 16 17 "@atcute/client": "npm:@atcute/client@^4.0.3", 17 18 "@atcute/identity": "npm:@atcute/identity@^1.1.3", 18 19 "@atcute/identity-resolver": "npm:@atcute/identity-resolver@^1.1.3", 20 + "@atcute/lex-cli": "npm:@atcute/lex-cli@^2.5.3", 19 21 "@atcute/lexicons": "npm:@atcute/lexicons@^1.1.1", 20 22 "@std/dotenv": "jsr:@std/dotenv@^0.225.5", 21 23 "fresh": "jsr:@fresh/core@^2.2.0",
+133 -12
deno.lock
··· 25 25 "npm:@atcute/bluesky-richtext-builder@^2.0.4": "2.0.4", 26 26 "npm:@atcute/bluesky@^3.2.16": "3.2.16", 27 27 "npm:@atcute/client@^4.0.3": "4.0.3", 28 - "npm:@atcute/identity-resolver@^1.1.3": "1.1.3_@atcute+identity@1.1.3", 28 + "npm:@atcute/identity-resolver@^1.1.3": "1.2.2_@atcute+identity@1.1.3", 29 29 "npm:@atcute/identity@^1.1.3": "1.1.3", 30 - "npm:@atcute/lexicons@^1.1.1": "1.2.7", 30 + "npm:@atcute/lex-cli@^2.5.3": "2.5.3_@atcute+identity@1.1.3_@atcute+identity-resolver@1.2.2__@atcute+identity@1.1.3", 31 + "npm:@atcute/lexicons@^1.1.1": "1.2.9", 31 32 "npm:@opentelemetry/api@^1.9.0": "1.9.0", 32 33 "npm:@preact/signals@^2.2.1": "2.6.2_preact@10.28.3", 33 34 "npm:@preact/signals@^2.5.0": "2.6.2_preact@10.28.3", ··· 160 161 "@atcute/lexicons" 161 162 ] 162 163 }, 164 + "@atcute/car@5.1.1": { 165 + "integrity": "sha512-MeRUJNXYgAHrJZw7mMoZJb9xIqv3LZLQw90rRRAVAo8SGNdICwyqe6Bf2LGesX73QM04MBuYO6Kqhvold3TFfg==", 166 + "dependencies": [ 167 + "@atcute/cbor", 168 + "@atcute/cid", 169 + "@atcute/uint8array", 170 + "@atcute/varint" 171 + ] 172 + }, 173 + "@atcute/cbor@2.3.2": { 174 + "integrity": "sha512-xP2SORSau/VVI00x2V4BjwIkHr6EQ7l/MXEOPaa4LGYtePFc4gnD4L1yN10dT5NEuUnvGEuCh6arLB7gz1smVQ==", 175 + "dependencies": [ 176 + "@atcute/cid", 177 + "@atcute/multibase", 178 + "@atcute/uint8array" 179 + ] 180 + }, 181 + "@atcute/cid@2.4.1": { 182 + "integrity": "sha512-bwhna69RCv7yetXudtj+2qrMPYvhhIQqvJz6YUpUS98v7OdF3X2dnye9Nig2NDrklZcuyOsu7sQo7GOykJXRLQ==", 183 + "dependencies": [ 184 + "@atcute/multibase", 185 + "@atcute/uint8array" 186 + ] 187 + }, 163 188 "@atcute/client@4.0.3": { 164 189 "integrity": "sha512-RIOZWFVLca/HiPAAUDqQPOdOreCxTbL5cb+WUf5yqQOKIu5yEAP3eksinmlLmgIrlr5qVOE7brazUUzaskFCfw==", 165 190 "dependencies": [ ··· 167 192 "@atcute/lexicons" 168 193 ] 169 194 }, 170 - "@atcute/identity-resolver@1.1.3_@atcute+identity@1.1.3": { 171 - "integrity": "sha512-KZgGgg99CWaV7Df3+h3X/WMrDzTPQVfsaoIVbTNLx2B56BvCL2EmaxPSVw/7BFUJMZHlVU4rtoEB4lyvNyMswA==", 195 + "@atcute/crypto@2.4.1": { 196 + "integrity": "sha512-tJ3Pi/XYcAsABKtqSlSOTKfO5YiQ4XdqlTuPS8HiRZSezOPcXBFFzAFWpSIJPURbVPFQL3LLrrK0Ea24wl5qeQ==", 197 + "dependencies": [ 198 + "@atcute/multibase", 199 + "@atcute/uint8array", 200 + "@noble/secp256k1" 201 + ] 202 + }, 203 + "@atcute/identity-resolver@1.2.2_@atcute+identity@1.1.3": { 204 + "integrity": "sha512-eUh/UH4bFvuXS0X7epYCeJC/kj4rbBXfSRumLEH4smMVwNOgTo7cL/0Srty+P/qVPoZEyXdfEbS0PHJyzoXmHw==", 172 205 "dependencies": [ 173 206 "@atcute/identity", 174 207 "@atcute/lexicons", ··· 183 216 "@badrap/valita" 184 217 ] 185 218 }, 186 - "@atcute/lexicons@1.2.7": { 187 - "integrity": "sha512-gCvkSMI1F1zx7xXa59iPiSKMH3L5Hga6iurGqQjaQbE2V/np/2QuDqQzt96TNbWfaFAXE9f9oY+0z3ljf/bweA==", 219 + "@atcute/lex-cli@2.5.3_@atcute+identity@1.1.3_@atcute+identity-resolver@1.2.2__@atcute+identity@1.1.3": { 220 + "integrity": "sha512-829rvezMOfRkJQRKvupNT8TWT/YYffJ2QsB80D9aPjkXSogrETZA7xZcPaMZBXg+mJaVbLO9S4ThPQmlF0L4UQ==", 221 + "dependencies": [ 222 + "@atcute/identity", 223 + "@atcute/identity-resolver", 224 + "@atcute/lexicon-doc", 225 + "@atcute/lexicon-resolver", 226 + "@atcute/lexicons", 227 + "@badrap/valita", 228 + "@optique/core", 229 + "@optique/run", 230 + "picocolors", 231 + "prettier" 232 + ], 233 + "bin": true 234 + }, 235 + "@atcute/lexicon-doc@2.1.2": { 236 + "integrity": "sha512-jTLcOka7b8BIn2SnIZm2m7l6unlJ0gpgW1MnRpSqNbly/AvyRUR/GREduh/QmjT4SGasDm8vdhrM0kOSPFpDLQ==", 237 + "dependencies": [ 238 + "@atcute/identity", 239 + "@atcute/lexicons", 240 + "@atcute/uint8array", 241 + "@atcute/util-text", 242 + "@badrap/valita" 243 + ] 244 + }, 245 + "@atcute/lexicon-resolver@0.1.6_@atcute+identity@1.1.3_@atcute+identity-resolver@1.2.2__@atcute+identity@1.1.3": { 246 + "integrity": "sha512-wJC/ChmpP7k+ywpOd07CMvioXjIGaFpF3bDwXLi/086LYjSWHOvtW6pyC+mqP5wLhjyH2hn4wmi77Buew1l1aw==", 247 + "dependencies": [ 248 + "@atcute/crypto", 249 + "@atcute/identity", 250 + "@atcute/identity-resolver", 251 + "@atcute/lexicon-doc", 252 + "@atcute/lexicons", 253 + "@atcute/repo", 254 + "@atcute/util-fetch", 255 + "@badrap/valita" 256 + ] 257 + }, 258 + "@atcute/lexicons@1.2.9": { 259 + "integrity": "sha512-/RRHm2Cw9o8Mcsrq0eo8fjS9okKYLGfuFwrQ0YoP/6sdSDsXshaTLJsvLlcUcaDaSJ1YFOuHIo3zr2Om2F/16g==", 188 260 "dependencies": [ 189 261 "@atcute/uint8array", 190 262 "@atcute/util-text", ··· 192 264 "esm-env" 193 265 ] 194 266 }, 195 - "@atcute/uint8array@1.1.0": { 196 - "integrity": "sha512-JtHXIVW6LPU9FMWp7SgE4HbUs3uV2WdfkK/2RWdEGjr4EgMV50P3FdU6fPeGlTfDNBJVYMIsuD2wwaKRPV/Aqg==" 267 + "@atcute/mst@1.0.0": { 268 + "integrity": "sha512-pMce2efib+dmKtnGnIvJZitVncJkpr3AmhyfgfYllni8KzsaDGsJmuGavSVpuojAhQe+6jYwHFtpm/beiiH4uw==", 269 + "dependencies": [ 270 + "@atcute/cbor", 271 + "@atcute/cid", 272 + "@atcute/uint8array" 273 + ] 197 274 }, 198 - "@atcute/util-fetch@1.0.2": { 199 - "integrity": "sha512-6kOwQzaoPu7ss0EwvgSOPVg/JIJdozbXva5d/g99bBg8RaSX8se//INOyr/nby/GwrpxCIZU9Wzm+pl7xerI0Q==", 275 + "@atcute/multibase@1.2.0": { 276 + "integrity": "sha512-ZK2GRra+qIYq9nNuQB52m2ul0hOmCQEtPobGfTSUxm7pF0OGEkWGkWHugFhNEDVzHzTwPxHp6VGotdZFue4lYQ==", 277 + "dependencies": [ 278 + "@atcute/uint8array" 279 + ] 280 + }, 281 + "@atcute/repo@0.1.3": { 282 + "integrity": "sha512-kN4gkrkQgJwI5xkVQ9zSdI8ULR47uH48EdJdjMvKAWsSDu8zKYd8ZQ6n778qa6o3WYEq02v9QVf7pzeU+3fYVA==", 283 + "dependencies": [ 284 + "@atcute/car", 285 + "@atcute/cbor", 286 + "@atcute/cid", 287 + "@atcute/crypto", 288 + "@atcute/lexicons", 289 + "@atcute/mst", 290 + "@atcute/uint8array" 291 + ] 292 + }, 293 + "@atcute/uint8array@1.1.1": { 294 + "integrity": "sha512-3LsC8XB8TKe9q/5hOA5sFuzGaIFdJZJNewC5OKa3o/eU6+K7JR6see9Zy2JbQERNVnRl11EzbNov1efgLMAs4g==" 295 + }, 296 + "@atcute/util-fetch@1.0.5": { 297 + "integrity": "sha512-qjHj01BGxjSjIFdPiAjSARnodJIIyKxnCMMEcXMESo9TAyND6XZQqrie5fia+LlYWVXdpsTds8uFQwc9jdKTig==", 200 298 "dependencies": [ 201 299 "@badrap/valita" 202 300 ] 203 301 }, 204 - "@atcute/util-text@1.1.0": { 205 - "integrity": "sha512-34G9KD5Z9f7oEdFpZOmqrMnU86p8ne6LlxJowfZzKNszRcl1GH+FtEPh3N1woelJT2SkPXMK2anwT8DESTluwA==", 302 + "@atcute/util-text@1.2.0": { 303 + "integrity": "sha512-b8WSh+Z7K601eUFFmTFj8QPKDO8Ic0VDDj63sdKzpkm+ySQKsYT5nXekViGqFVKbyKj1V5FyvZvgXad6/aI4QQ==", 206 304 "dependencies": [ 207 305 "unicode-segmenter" 208 306 ] 307 + }, 308 + "@atcute/varint@2.0.0": { 309 + "integrity": "sha512-CEY/oVK/nVpL4e5y3sdenLETDL6/Xu5xsE/0TupK+f0Yv8jcD60t2gD8SHROWSvUwYLdkjczLCSA7YrtnjCzWw==" 209 310 }, 210 311 "@badrap/valita@0.4.6": { 211 312 "integrity": "sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==" ··· 340 441 "os": ["win32"], 341 442 "cpu": ["x64"] 342 443 }, 444 + "@noble/secp256k1@3.0.0": { 445 + "integrity": "sha512-NJBaR352KyIvj3t6sgT/+7xrNyF9Xk9QlLSIqUGVUYlsnDTAUqY8LOmwpcgEx4AMJXRITQ5XEVHD+mMaPfr3mg==" 446 + }, 343 447 "@opentelemetry/api@1.9.0": { 344 448 "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" 449 + }, 450 + "@optique/core@0.6.11": { 451 + "integrity": "sha512-GVLFihzBA1j78NFlkU5N1Lu0jRqET0k6Z66WK8VQKG/a3cxmCInVGSKMIdQG8i6pgC8wD5OizF6Y3QMztmhAxg==" 452 + }, 453 + "@optique/run@0.6.11": { 454 + "integrity": "sha512-tsXBEygGSzNpFK2gjsRlXBn7FiScUeLFWIZNpoAZ8iG85Km0/3K9xgqlQAXoQ+uEZBe4XplnzyCDvmEgbyNT8w==", 455 + "dependencies": [ 456 + "@optique/core" 457 + ] 345 458 }, 346 459 "@preact/signals-core@1.12.2": { 347 460 "integrity": "sha512-5Yf8h1Ke3SMHr15xl630KtwPTW4sYDFkkxS0vQ8UiQLWwZQnrF9IKaVG1mN5VcJz52EcWs2acsc/Npjha/7ysA==" ··· 402 515 "esm-env@1.2.2": { 403 516 "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==" 404 517 }, 518 + "picocolors@1.1.1": { 519 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" 520 + }, 405 521 "preact-render-to-string@6.6.5_preact@10.28.3": { 406 522 "integrity": "sha512-O6MHzYNIKYaiSX3bOw0gGZfEbOmlIDtDfWwN1JJdc/T3ihzRT6tGGSEWE088dWrEDGa1u7101q+6fzQnO9XCPA==", 407 523 "dependencies": [ ··· 410 526 }, 411 527 "preact@10.28.3": { 412 528 "integrity": "sha512-tCmoRkPQLpBeWzpmbhryairGnhW9tKV6c6gr/w+RhoRoKEJwsjzipwp//1oCpGPOchvSLaAPlpcJi9MwMmoPyA==" 529 + }, 530 + "prettier@3.8.1": { 531 + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", 532 + "bin": true 413 533 }, 414 534 "undici-types@6.21.0": { 415 535 "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" ··· 428 548 "npm:@atcute/client@^4.0.3", 429 549 "npm:@atcute/identity-resolver@^1.1.3", 430 550 "npm:@atcute/identity@^1.1.3", 551 + "npm:@atcute/lex-cli@^2.5.3", 431 552 "npm:@atcute/lexicons@^1.1.1", 432 553 "npm:@preact/signals@^2.5.0", 433 554 "npm:preact@^10.27.2"
+7
lex.config.ts
··· 1 + import { defineLexiconConfig } from "@atcute/lex-cli"; 2 + 3 + export default defineLexiconConfig({ 4 + files: ["lexicons/**/*.json"], 5 + outdir: "utils/lexicons/", 6 + imports: ["@atcute/atproto", "@atcute/bluesky"], 7 + });
+52
lexicons/place/stream/badge/defs.json
··· 1 + { 2 + "$type": "com.atproto.lexicon.schema", 3 + "lexicon": 1, 4 + "id": "place.stream.badge.defs", 5 + "defs": { 6 + "badgeView": { 7 + "type": "object", 8 + "required": ["badgeType", "issuer", "recipient"], 9 + "description": "View of a badge record, with fields resolved for display. If the DID in issuer is not the current streamplace node, the signature field shall be required.", 10 + "properties": { 11 + "badgeType": { 12 + "type": "string", 13 + "knownValues": [ 14 + "place.stream.badge.defs#mod", 15 + "place.stream.badge.defs#streamer", 16 + "place.stream.badge.defs#bot" 17 + ] 18 + }, 19 + "issuer": { 20 + "type": "string", 21 + "format": "did", 22 + "description": "DID of the badge issuer." 23 + }, 24 + "recipient": { 25 + "type": "string", 26 + "format": "did", 27 + "description": "DID of the badge recipient." 28 + }, 29 + "signature": { 30 + "type": "string", 31 + "description": "TODO: Cryptographic signature of the badge (of a place.stream.key)." 32 + } 33 + } 34 + }, 35 + "mod": { 36 + "type": "token", 37 + "description": "This user is a moderator. Displayed with a sword icon." 38 + }, 39 + "streamer": { 40 + "type": "token", 41 + "description": "This user is the streamer. Displayed with a star icon." 42 + }, 43 + "vip": { 44 + "type": "token", 45 + "description": "This user is a very important person." 46 + }, 47 + "bot": { 48 + "type": "token", 49 + "description": "This user is a bot. Self-applied via place.stream.chat.profile selfLabels." 50 + } 51 + } 52 + }
+61
lexicons/place/stream/chat/defs.json
··· 1 + { 2 + "$type": "com.atproto.lexicon.schema", 3 + "lexicon": 1, 4 + "id": "place.stream.chat.defs", 5 + "defs": { 6 + "messageView": { 7 + "type": "object", 8 + "required": ["uri", "cid", "author", "record", "indexedAt"], 9 + "properties": { 10 + "uri": { "type": "string", "format": "at-uri" }, 11 + "cid": { "type": "string", "format": "cid" }, 12 + "author": { 13 + "type": "ref", 14 + "ref": "app.bsky.actor.defs#profileViewBasic" 15 + }, 16 + "record": { "type": "unknown" }, 17 + "indexedAt": { "type": "string", "format": "datetime" }, 18 + "chatProfile": { 19 + "type": "ref", 20 + "ref": "place.stream.chat.profile" 21 + }, 22 + "replyTo": { 23 + "type": "union", 24 + "refs": ["#messageView"] 25 + }, 26 + "deleted": { 27 + "type": "boolean", 28 + "description": "If true, this message has been deleted or labeled and should be cleared from the cache" 29 + }, 30 + "badges": { 31 + "type": "array", 32 + "description": "Up to 3 badge tokens to display with the message. First badge is server-controlled, remaining badges are user-settable. Tokens are looked up in badges.json for display info.", 33 + "maxLength": 3, 34 + "items": { 35 + "type": "ref", 36 + "ref": "place.stream.badge.defs#badgeView" 37 + } 38 + } 39 + } 40 + }, 41 + "pinnedRecordView": { 42 + "type": "object", 43 + "description": "View of a pinned chat record with hydrated message data.", 44 + "required": ["uri", "cid", "record", "indexedAt"], 45 + "properties": { 46 + "uri": { "type": "string", "format": "at-uri" }, 47 + "cid": { "type": "string", "format": "cid" }, 48 + "record": { "type": "ref", "ref": "place.stream.chat.pinnedRecord" }, 49 + "indexedAt": { "type": "string", "format": "datetime" }, 50 + "pinnedBy": { 51 + "type": "ref", 52 + "ref": "place.stream.chat.profile" 53 + }, 54 + "message": { 55 + "type": "ref", 56 + "ref": "#messageView" 57 + } 58 + } 59 + } 60 + } 61 + }
+60
lexicons/place/stream/chat/message.json
··· 1 + { 2 + "$type": "com.atproto.lexicon.schema", 3 + "id": "place.stream.chat.message", 4 + "lexicon": 1, 5 + "defs": { 6 + "main": { 7 + "type": "record", 8 + "description": "Record containing a Streamplace chat message.", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": ["text", "createdAt", "streamer"], 13 + "properties": { 14 + "text": { 15 + "type": "string", 16 + "description": "The primary message content. May be an empty string, if there are embeds.", 17 + "maxGraphemes": 300, 18 + "maxLength": 3000 19 + }, 20 + "createdAt": { 21 + "type": "string", 22 + "format": "datetime", 23 + "description": "Client-declared timestamp when this message was originally created." 24 + }, 25 + "streamer": { 26 + "type": "string", 27 + "format": "did", 28 + "description": "The DID of the streamer whose chat this is." 29 + }, 30 + "facets": { 31 + "type": "array", 32 + "description": "Annotations of text (mentions, URLs, etc)", 33 + "items": { 34 + "type": "ref", 35 + "ref": "place.stream.richtext.facet" 36 + } 37 + }, 38 + "reply": { 39 + "type": "ref", 40 + "ref": "#replyRef" 41 + } 42 + } 43 + } 44 + }, 45 + "replyRef": { 46 + "type": "object", 47 + "required": ["root", "parent"], 48 + "properties": { 49 + "root": { 50 + "type": "ref", 51 + "ref": "com.atproto.repo.strongRef" 52 + }, 53 + "parent": { 54 + "type": "ref", 55 + "ref": "com.atproto.repo.strongRef" 56 + } 57 + } 58 + } 59 + } 60 + }
+38
lexicons/place/stream/chat/pinnedRecord.json
··· 1 + { 2 + "$type": "com.atproto.lexicon.schema", 3 + "lexicon": 1, 4 + "id": "place.stream.chat.pinnedRecord", 5 + "defs": { 6 + "main": { 7 + "type": "record", 8 + "key": "tid", 9 + "description": "Record pinning a chat message for prominent display.", 10 + "record": { 11 + "type": "object", 12 + "required": ["pinnedMessage", "createdAt"], 13 + "properties": { 14 + "pinnedMessage": { 15 + "type": "string", 16 + "format": "at-uri", 17 + "description": "AT-URI of the pinned chat message." 18 + }, 19 + "pinnedBy": { 20 + "type": "string", 21 + "format": "did", 22 + "description": "DID of the user who pinned the message." 23 + }, 24 + "createdAt": { 25 + "type": "string", 26 + "format": "datetime", 27 + "description": "When this pin was created." 28 + }, 29 + "expiresAt": { 30 + "type": "string", 31 + "format": "datetime", 32 + "description": "Optional expiration time. If set, the pin is considered inactive after this time." 33 + } 34 + } 35 + } 36 + } 37 + } 38 + }
+58
lexicons/place/stream/chat/profile.json
··· 1 + { 2 + "$type": "com.atproto.lexicon.schema", 3 + "lexicon": 1, 4 + "id": "place.stream.chat.profile", 5 + "defs": { 6 + "main": { 7 + "type": "record", 8 + "description": "Record containing customizations for a user's chat profile.", 9 + "key": "literal:self", 10 + "record": { 11 + "type": "object", 12 + "required": [], 13 + "properties": { 14 + "color": { 15 + "type": "ref", 16 + "ref": "#color" 17 + }, 18 + "selfLabels": { 19 + "type": "array", 20 + "description": "Self-applied labels for this profile, e.g. 'bot'.", 21 + "maxLength": 10, 22 + "items": { 23 + "type": "ref", 24 + "ref": "#selfLabel" 25 + } 26 + } 27 + } 28 + } 29 + }, 30 + "selfLabel": { 31 + "type": "string", 32 + "description": "Label that a user can apply to their own profile.", 33 + "knownValues": ["bot"] 34 + }, 35 + "color": { 36 + "type": "object", 37 + "description": "Customizations for the color of a user's name in chat", 38 + "required": ["red", "green", "blue"], 39 + "properties": { 40 + "red": { 41 + "type": "integer", 42 + "minimum": 0, 43 + "maximum": 255 44 + }, 45 + "green": { 46 + "type": "integer", 47 + "minimum": 0, 48 + "maximum": 255 49 + }, 50 + "blue": { 51 + "type": "integer", 52 + "minimum": 0, 53 + "maximum": 255 54 + } 55 + } 56 + } 57 + } 58 + }
+84
lexicons/place/stream/emote/defs.json
··· 1 + { 2 + "$type": "com.atproto.lexicon.schema", 3 + "id": "place.stream.emote.defs", 4 + "lexicon": 1, 5 + "defs": { 6 + "emoteView": { 7 + "type": "object", 8 + "required": ["uri", "cid", "name", "imageUrl", "indexedAt"], 9 + "properties": { 10 + "uri": { 11 + "type": "string", 12 + "format": "at-uri", 13 + "description": "AT-URI of the place.stream.emote.item record." 14 + }, 15 + "cid": { 16 + "type": "string", 17 + "format": "cid" 18 + }, 19 + "name": { 20 + "type": "string", 21 + "description": "Short name used to reference this emote in chat." 22 + }, 23 + "imageUrl": { 24 + "type": "string", 25 + "format": "uri", 26 + "description": "Resolved URL for the emote image." 27 + }, 28 + "alt": { 29 + "type": "string", 30 + "description": "Alt text for the emote image." 31 + }, 32 + "creator": { 33 + "type": "string", 34 + "format": "did", 35 + "description": "DID of the creator/artist of this emote, if different from the pack author." 36 + }, 37 + "indexedAt": { 38 + "type": "string", 39 + "format": "datetime" 40 + } 41 + } 42 + }, 43 + "packView": { 44 + "type": "object", 45 + "required": ["uri", "cid", "author", "name", "emotes", "indexedAt"], 46 + "properties": { 47 + "uri": { 48 + "type": "string", 49 + "format": "at-uri" 50 + }, 51 + "cid": { 52 + "type": "string", 53 + "format": "cid" 54 + }, 55 + "author": { 56 + "type": "ref", 57 + "ref": "app.bsky.actor.defs#profileViewBasic" 58 + }, 59 + "name": { 60 + "type": "string" 61 + }, 62 + "description": { 63 + "type": "string" 64 + }, 65 + "emotes": { 66 + "type": "array", 67 + "items": { 68 + "type": "ref", 69 + "ref": "#emoteView" 70 + } 71 + }, 72 + "indexedAt": { 73 + "type": "string", 74 + "format": "datetime" 75 + }, 76 + "relationship": { 77 + "type": "string", 78 + "description": "Why this pack is available to the requesting user.", 79 + "knownValues": ["follow"] 80 + } 81 + } 82 + } 83 + } 84 + }
+61
lexicons/place/stream/richtext/facet.json
··· 1 + { 2 + "$type": "com.atproto.lexicon.schema", 3 + "id": "place.stream.richtext.facet", 4 + "lexicon": 1, 5 + "defs": { 6 + "main": { 7 + "type": "object", 8 + "description": "Annotation of a sub-string within rich text.", 9 + "required": ["index", "features"], 10 + "properties": { 11 + "index": { "type": "ref", "ref": "app.bsky.richtext.facet#byteSlice" }, 12 + "features": { 13 + "type": "array", 14 + "items": { 15 + "type": "union", 16 + "refs": [ 17 + "app.bsky.richtext.facet#mention", 18 + "app.bsky.richtext.facet#link", 19 + "#emote", 20 + "#emoteView" 21 + ] 22 + } 23 + } 24 + } 25 + }, 26 + "emote": { 27 + "type": "object", 28 + "required": ["name", "ref"], 29 + "properties": { 30 + "name": { 31 + "type": "string", 32 + "maxLength": 100, 33 + "maxGraphemes": 50, 34 + "description": "Short name of the emote, e.g. 'dan'. Used as fallback text and for display before the ref resolves." 35 + }, 36 + "ref": { 37 + "type": "ref", 38 + "ref": "com.atproto.repo.strongRef", 39 + "description": "Strong reference to the place.stream.emote.item record." 40 + } 41 + } 42 + }, 43 + "emoteView": { 44 + "type": "object", 45 + "description": "Hydrated version of a #emote", 46 + "required": ["name", "record"], 47 + "properties": { 48 + "name": { 49 + "type": "string", 50 + "maxLength": 100, 51 + "maxGraphemes": 50, 52 + "description": "Short name of the emote, e.g. 'dan'. Used as fallback text and for display before the ref resolves." 53 + }, 54 + "record": { 55 + "type": "ref", 56 + "ref": "place.stream.emote.defs#emoteView" 57 + } 58 + } 59 + } 60 + } 61 + }
+7
utils/lexicons/index.ts
··· 1 + export * as PlaceStreamBadgeDefs from "./types/place/stream/badge/defs.ts"; 2 + export * as PlaceStreamChatDefs from "./types/place/stream/chat/defs.ts"; 3 + export * as PlaceStreamChatMessage from "./types/place/stream/chat/message.ts"; 4 + export * as PlaceStreamChatPinnedRecord from "./types/place/stream/chat/pinnedRecord.ts"; 5 + export * as PlaceStreamChatProfile from "./types/place/stream/chat/profile.ts"; 6 + export * as PlaceStreamEmoteDefs from "./types/place/stream/emote/defs.ts"; 7 + export * as PlaceStreamRichtextFacet from "./types/place/stream/richtext/facet.ts";
+56
utils/lexicons/types/place/stream/badge/defs.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + 4 + const _badgeViewSchema = /*#__PURE__*/ v.object({ 5 + $type: /*#__PURE__*/ v.optional( 6 + /*#__PURE__*/ v.literal("place.stream.badge.defs#badgeView"), 7 + ), 8 + badgeType: /*#__PURE__*/ v.string< 9 + | "place.stream.badge.defs#bot" 10 + | "place.stream.badge.defs#mod" 11 + | "place.stream.badge.defs#streamer" 12 + | (string & {}) 13 + >(), 14 + /** 15 + * DID of the badge issuer. 16 + */ 17 + issuer: /*#__PURE__*/ v.didString(), 18 + /** 19 + * DID of the badge recipient. 20 + */ 21 + recipient: /*#__PURE__*/ v.didString(), 22 + /** 23 + * TODO: Cryptographic signature of the badge (of a place.stream.key). 24 + */ 25 + signature: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 26 + }); 27 + const _botSchema = /*#__PURE__*/ v.literal("place.stream.badge.defs#bot"); 28 + const _modSchema = /*#__PURE__*/ v.literal("place.stream.badge.defs#mod"); 29 + const _streamerSchema = /*#__PURE__*/ v.literal( 30 + "place.stream.badge.defs#streamer", 31 + ); 32 + const _vipSchema = /*#__PURE__*/ v.literal("place.stream.badge.defs#vip"); 33 + 34 + type badgeView$schematype = typeof _badgeViewSchema; 35 + type bot$schematype = typeof _botSchema; 36 + type mod$schematype = typeof _modSchema; 37 + type streamer$schematype = typeof _streamerSchema; 38 + type vip$schematype = typeof _vipSchema; 39 + 40 + export interface badgeViewSchema extends badgeView$schematype {} 41 + export interface botSchema extends bot$schematype {} 42 + export interface modSchema extends mod$schematype {} 43 + export interface streamerSchema extends streamer$schematype {} 44 + export interface vipSchema extends vip$schematype {} 45 + 46 + export const badgeViewSchema = _badgeViewSchema as badgeViewSchema; 47 + export const botSchema = _botSchema as botSchema; 48 + export const modSchema = _modSchema as modSchema; 49 + export const streamerSchema = _streamerSchema as streamerSchema; 50 + export const vipSchema = _vipSchema as vipSchema; 51 + 52 + export interface BadgeView extends v.InferInput<typeof badgeViewSchema> {} 53 + export type Bot = v.InferInput<typeof botSchema>; 54 + export type Mod = v.InferInput<typeof modSchema>; 55 + export type Streamer = v.InferInput<typeof streamerSchema>; 56 + export type Vip = v.InferInput<typeof vipSchema>;
+75
utils/lexicons/types/place/stream/chat/defs.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import * as AppBskyActorDefs from "@atcute/bluesky/types/app/actor/defs"; 4 + import * as PlaceStreamBadgeDefs from "../badge/defs.ts"; 5 + import * as PlaceStreamChatPinnedRecord from "./pinnedRecord.ts"; 6 + import * as PlaceStreamChatProfile from "./profile.ts"; 7 + 8 + const _messageViewSchema = /*#__PURE__*/ v.object({ 9 + $type: /*#__PURE__*/ v.optional( 10 + /*#__PURE__*/ v.literal("place.stream.chat.defs#messageView"), 11 + ), 12 + get author() { 13 + return AppBskyActorDefs.profileViewBasicSchema; 14 + }, 15 + /** 16 + * Up to 3 badge tokens to display with the message. First badge is server-controlled, remaining badges are user-settable. Tokens are looked up in badges.json for display info. 17 + * @maxLength 3 18 + */ 19 + get badges() { 20 + return /*#__PURE__*/ v.optional( 21 + /*#__PURE__*/ v.constrain( 22 + /*#__PURE__*/ v.array(PlaceStreamBadgeDefs.badgeViewSchema), 23 + [/*#__PURE__*/ v.arrayLength(0, 3)], 24 + ), 25 + ); 26 + }, 27 + get chatProfile() { 28 + return /*#__PURE__*/ v.optional(PlaceStreamChatProfile.mainSchema); 29 + }, 30 + cid: /*#__PURE__*/ v.cidString(), 31 + /** 32 + * If true, this message has been deleted or labeled and should be cleared from the cache 33 + */ 34 + deleted: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 35 + indexedAt: /*#__PURE__*/ v.datetimeString(), 36 + record: /*#__PURE__*/ v.unknown(), 37 + get replyTo() { 38 + return /*#__PURE__*/ v.optional( 39 + /*#__PURE__*/ v.variant([messageViewSchema]), 40 + ); 41 + }, 42 + uri: /*#__PURE__*/ v.resourceUriString(), 43 + }); 44 + const _pinnedRecordViewSchema = /*#__PURE__*/ v.object({ 45 + $type: /*#__PURE__*/ v.optional( 46 + /*#__PURE__*/ v.literal("place.stream.chat.defs#pinnedRecordView"), 47 + ), 48 + cid: /*#__PURE__*/ v.cidString(), 49 + indexedAt: /*#__PURE__*/ v.datetimeString(), 50 + get message() { 51 + return /*#__PURE__*/ v.optional(messageViewSchema); 52 + }, 53 + get pinnedBy() { 54 + return /*#__PURE__*/ v.optional(PlaceStreamChatProfile.mainSchema); 55 + }, 56 + get record() { 57 + return PlaceStreamChatPinnedRecord.mainSchema; 58 + }, 59 + uri: /*#__PURE__*/ v.resourceUriString(), 60 + }); 61 + 62 + type messageView$schematype = typeof _messageViewSchema; 63 + type pinnedRecordView$schematype = typeof _pinnedRecordViewSchema; 64 + 65 + export interface messageViewSchema extends messageView$schematype {} 66 + export interface pinnedRecordViewSchema extends pinnedRecordView$schematype {} 67 + 68 + export const messageViewSchema = _messageViewSchema as messageViewSchema; 69 + export const pinnedRecordViewSchema = 70 + _pinnedRecordViewSchema as pinnedRecordViewSchema; 71 + 72 + export interface MessageView extends v.InferInput<typeof messageViewSchema> {} 73 + export interface PinnedRecordView extends v.InferInput< 74 + typeof pinnedRecordViewSchema 75 + > {}
+69
utils/lexicons/types/place/stream/chat/message.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 5 + import * as PlaceStreamRichtextFacet from "../richtext/facet.ts"; 6 + 7 + const _mainSchema = /*#__PURE__*/ v.record( 8 + /*#__PURE__*/ v.tidString(), 9 + /*#__PURE__*/ v.object({ 10 + $type: /*#__PURE__*/ v.literal("place.stream.chat.message"), 11 + /** 12 + * Client-declared timestamp when this message was originally created. 13 + */ 14 + createdAt: /*#__PURE__*/ v.datetimeString(), 15 + /** 16 + * Annotations of text (mentions, URLs, etc) 17 + */ 18 + get facets() { 19 + return /*#__PURE__*/ v.optional( 20 + /*#__PURE__*/ v.array(PlaceStreamRichtextFacet.mainSchema), 21 + ); 22 + }, 23 + get reply() { 24 + return /*#__PURE__*/ v.optional(replyRefSchema); 25 + }, 26 + /** 27 + * The DID of the streamer whose chat this is. 28 + */ 29 + streamer: /*#__PURE__*/ v.didString(), 30 + /** 31 + * The primary message content. May be an empty string, if there are embeds. 32 + * @maxLength 3000 33 + * @maxGraphemes 300 34 + */ 35 + text: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 36 + /*#__PURE__*/ v.stringLength(0, 3000), 37 + /*#__PURE__*/ v.stringGraphemes(0, 300), 38 + ]), 39 + }), 40 + ); 41 + const _replyRefSchema = /*#__PURE__*/ v.object({ 42 + $type: /*#__PURE__*/ v.optional( 43 + /*#__PURE__*/ v.literal("place.stream.chat.message#replyRef"), 44 + ), 45 + get parent() { 46 + return ComAtprotoRepoStrongRef.mainSchema; 47 + }, 48 + get root() { 49 + return ComAtprotoRepoStrongRef.mainSchema; 50 + }, 51 + }); 52 + 53 + type main$schematype = typeof _mainSchema; 54 + type replyRef$schematype = typeof _replyRefSchema; 55 + 56 + export interface mainSchema extends main$schematype {} 57 + export interface replyRefSchema extends replyRef$schematype {} 58 + 59 + export const mainSchema = _mainSchema as mainSchema; 60 + export const replyRefSchema = _replyRefSchema as replyRefSchema; 61 + 62 + export interface Main extends v.InferInput<typeof mainSchema> {} 63 + export interface ReplyRef extends v.InferInput<typeof replyRefSchema> {} 64 + 65 + declare module "@atcute/lexicons/ambient" { 66 + interface Records { 67 + "place.stream.chat.message": mainSchema; 68 + } 69 + }
+40
utils/lexicons/types/place/stream/chat/pinnedRecord.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _mainSchema = /*#__PURE__*/ v.record( 6 + /*#__PURE__*/ v.tidString(), 7 + /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.literal("place.stream.chat.pinnedRecord"), 9 + /** 10 + * When this pin was created. 11 + */ 12 + createdAt: /*#__PURE__*/ v.datetimeString(), 13 + /** 14 + * Optional expiration time. If set, the pin is considered inactive after this time. 15 + */ 16 + expiresAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 17 + /** 18 + * DID of the user who pinned the message. 19 + */ 20 + pinnedBy: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.didString()), 21 + /** 22 + * AT-URI of the pinned chat message. 23 + */ 24 + pinnedMessage: /*#__PURE__*/ v.resourceUriString(), 25 + }), 26 + ); 27 + 28 + type main$schematype = typeof _mainSchema; 29 + 30 + export interface mainSchema extends main$schematype {} 31 + 32 + export const mainSchema = _mainSchema as mainSchema; 33 + 34 + export interface Main extends v.InferInput<typeof mainSchema> {} 35 + 36 + declare module "@atcute/lexicons/ambient" { 37 + interface Records { 38 + "place.stream.chat.pinnedRecord": mainSchema; 39 + } 40 + }
+73
utils/lexicons/types/place/stream/chat/profile.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _colorSchema = /*#__PURE__*/ v.object({ 6 + $type: /*#__PURE__*/ v.optional( 7 + /*#__PURE__*/ v.literal("place.stream.chat.profile#color"), 8 + ), 9 + /** 10 + * @minimum 0 11 + * @maximum 255 12 + */ 13 + blue: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 14 + /*#__PURE__*/ v.integerRange(0, 255), 15 + ]), 16 + /** 17 + * @minimum 0 18 + * @maximum 255 19 + */ 20 + green: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 21 + /*#__PURE__*/ v.integerRange(0, 255), 22 + ]), 23 + /** 24 + * @minimum 0 25 + * @maximum 255 26 + */ 27 + red: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 28 + /*#__PURE__*/ v.integerRange(0, 255), 29 + ]), 30 + }); 31 + const _mainSchema = /*#__PURE__*/ v.record( 32 + /*#__PURE__*/ v.literal("self"), 33 + /*#__PURE__*/ v.object({ 34 + $type: /*#__PURE__*/ v.literal("place.stream.chat.profile"), 35 + get color() { 36 + return /*#__PURE__*/ v.optional(colorSchema); 37 + }, 38 + /** 39 + * Self-applied labels for this profile, e.g. 'bot'. 40 + * @maxLength 10 41 + */ 42 + get selfLabels() { 43 + return /*#__PURE__*/ v.optional( 44 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.array(selfLabelSchema), [ 45 + /*#__PURE__*/ v.arrayLength(0, 10), 46 + ]), 47 + ); 48 + }, 49 + }), 50 + ); 51 + const _selfLabelSchema = /*#__PURE__*/ v.string<"bot" | (string & {})>(); 52 + 53 + type color$schematype = typeof _colorSchema; 54 + type main$schematype = typeof _mainSchema; 55 + type selfLabel$schematype = typeof _selfLabelSchema; 56 + 57 + export interface colorSchema extends color$schematype {} 58 + export interface mainSchema extends main$schematype {} 59 + export interface selfLabelSchema extends selfLabel$schematype {} 60 + 61 + export const colorSchema = _colorSchema as colorSchema; 62 + export const mainSchema = _mainSchema as mainSchema; 63 + export const selfLabelSchema = _selfLabelSchema as selfLabelSchema; 64 + 65 + export interface Color extends v.InferInput<typeof colorSchema> {} 66 + export interface Main extends v.InferInput<typeof mainSchema> {} 67 + export type SelfLabel = v.InferInput<typeof selfLabelSchema>; 68 + 69 + declare module "@atcute/lexicons/ambient" { 70 + interface Records { 71 + "place.stream.chat.profile": mainSchema; 72 + } 73 + }
+65
utils/lexicons/types/place/stream/emote/defs.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import * as AppBskyActorDefs from "@atcute/bluesky/types/app/actor/defs"; 4 + 5 + const _emoteViewSchema = /*#__PURE__*/ v.object({ 6 + $type: /*#__PURE__*/ v.optional( 7 + /*#__PURE__*/ v.literal("place.stream.emote.defs#emoteView"), 8 + ), 9 + /** 10 + * Alt text for the emote image. 11 + */ 12 + alt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 13 + cid: /*#__PURE__*/ v.cidString(), 14 + /** 15 + * DID of the creator/artist of this emote, if different from the pack author. 16 + */ 17 + creator: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.didString()), 18 + /** 19 + * Resolved URL for the emote image. 20 + */ 21 + imageUrl: /*#__PURE__*/ v.genericUriString(), 22 + indexedAt: /*#__PURE__*/ v.datetimeString(), 23 + /** 24 + * Short name used to reference this emote in chat. 25 + */ 26 + name: /*#__PURE__*/ v.string(), 27 + /** 28 + * AT-URI of the place.stream.emote.item record. 29 + */ 30 + uri: /*#__PURE__*/ v.resourceUriString(), 31 + }); 32 + const _packViewSchema = /*#__PURE__*/ v.object({ 33 + $type: /*#__PURE__*/ v.optional( 34 + /*#__PURE__*/ v.literal("place.stream.emote.defs#packView"), 35 + ), 36 + get author() { 37 + return AppBskyActorDefs.profileViewBasicSchema; 38 + }, 39 + cid: /*#__PURE__*/ v.cidString(), 40 + description: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 41 + get emotes() { 42 + return /*#__PURE__*/ v.array(emoteViewSchema); 43 + }, 44 + indexedAt: /*#__PURE__*/ v.datetimeString(), 45 + name: /*#__PURE__*/ v.string(), 46 + /** 47 + * Why this pack is available to the requesting user. 48 + */ 49 + relationship: /*#__PURE__*/ v.optional( 50 + /*#__PURE__*/ v.string<"follow" | (string & {})>(), 51 + ), 52 + uri: /*#__PURE__*/ v.resourceUriString(), 53 + }); 54 + 55 + type emoteView$schematype = typeof _emoteViewSchema; 56 + type packView$schematype = typeof _packViewSchema; 57 + 58 + export interface emoteViewSchema extends emoteView$schematype {} 59 + export interface packViewSchema extends packView$schematype {} 60 + 61 + export const emoteViewSchema = _emoteViewSchema as emoteViewSchema; 62 + export const packViewSchema = _packViewSchema as packViewSchema; 63 + 64 + export interface EmoteView extends v.InferInput<typeof emoteViewSchema> {} 65 + export interface PackView extends v.InferInput<typeof packViewSchema> {}
+77
utils/lexicons/types/place/stream/richtext/facet.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import * as AppBskyRichtextFacet from "@atcute/bluesky/types/app/richtext/facet"; 4 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 5 + import * as PlaceStreamEmoteDefs from "../emote/defs.ts"; 6 + 7 + const _emoteSchema = /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.optional( 9 + /*#__PURE__*/ v.literal("place.stream.richtext.facet#emote"), 10 + ), 11 + /** 12 + * Short name of the emote, e.g. 'dan'. Used as fallback text and for display before the ref resolves. 13 + * @maxLength 100 14 + * @maxGraphemes 50 15 + */ 16 + name: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 17 + /*#__PURE__*/ v.stringLength(0, 100), 18 + /*#__PURE__*/ v.stringGraphemes(0, 50), 19 + ]), 20 + /** 21 + * Strong reference to the place.stream.emote.item record. 22 + */ 23 + get ref() { 24 + return ComAtprotoRepoStrongRef.mainSchema; 25 + }, 26 + }); 27 + const _emoteViewSchema = /*#__PURE__*/ v.object({ 28 + $type: /*#__PURE__*/ v.optional( 29 + /*#__PURE__*/ v.literal("place.stream.richtext.facet#emoteView"), 30 + ), 31 + /** 32 + * Short name of the emote, e.g. 'dan'. Used as fallback text and for display before the ref resolves. 33 + * @maxLength 100 34 + * @maxGraphemes 50 35 + */ 36 + name: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 37 + /*#__PURE__*/ v.stringLength(0, 100), 38 + /*#__PURE__*/ v.stringGraphemes(0, 50), 39 + ]), 40 + get record() { 41 + return PlaceStreamEmoteDefs.emoteViewSchema; 42 + }, 43 + }); 44 + const _mainSchema = /*#__PURE__*/ v.object({ 45 + $type: /*#__PURE__*/ v.optional( 46 + /*#__PURE__*/ v.literal("place.stream.richtext.facet"), 47 + ), 48 + get features() { 49 + return /*#__PURE__*/ v.array( 50 + /*#__PURE__*/ v.variant([ 51 + AppBskyRichtextFacet.linkSchema, 52 + AppBskyRichtextFacet.mentionSchema, 53 + emoteSchema, 54 + emoteViewSchema, 55 + ]), 56 + ); 57 + }, 58 + get index() { 59 + return AppBskyRichtextFacet.byteSliceSchema; 60 + }, 61 + }); 62 + 63 + type emote$schematype = typeof _emoteSchema; 64 + type emoteView$schematype = typeof _emoteViewSchema; 65 + type main$schematype = typeof _mainSchema; 66 + 67 + export interface emoteSchema extends emote$schematype {} 68 + export interface emoteViewSchema extends emoteView$schematype {} 69 + export interface mainSchema extends main$schematype {} 70 + 71 + export const emoteSchema = _emoteSchema as emoteSchema; 72 + export const emoteViewSchema = _emoteViewSchema as emoteViewSchema; 73 + export const mainSchema = _mainSchema as mainSchema; 74 + 75 + export interface Emote extends v.InferInput<typeof emoteSchema> {} 76 + export interface EmoteView extends v.InferInput<typeof emoteViewSchema> {} 77 + export interface Main extends v.InferInput<typeof mainSchema> {}