online.timtinkers.bot.command

bot.timtinkers.online

Schema Diff

+39 -108

From

CID
bafyreifldz5spcj...
Indexed At
2026-04-08 07:27 UTC
View this version

To

CID
bafyreib3oa2zwsq...
Indexed At
2026-05-05 14:40 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

43 breaking changes, 28 non-breaking changes.

Breaking Changes (43)
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command#commandType" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command#parameter" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command#parameter.description" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command#parameter.name" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command#parameter.required" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command#parameter.type" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command#parameterizedCommand" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command#rngCommand" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command#simpleCommand" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.commandType" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.parameters" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.parameters:items" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.responseFacets" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.responseFacets:items" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.responseTemplate" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.responseTemplateFacets" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.responseTemplateFacets:items" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.rngMax" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.rngMin" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.rngParameter" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.rngTemplate" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.rngTemplateFacets" }
  • RemovedVertex RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.rngTemplateFacets:items" }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command#parameter", tgt: "online.timtinkers.bot.command#parameter.description", kind: "prop", name: Some("description") }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command#parameter", tgt: "online.timtinkers.bot.command#parameter.name", kind: "prop", name: Some("name") }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command#parameter", tgt: "online.timtinkers.bot.command#parameter.required", kind: "prop", name: Some("required") }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command#parameter", tgt: "online.timtinkers.bot.command#parameter.type", kind: "prop", name: Some("type") }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.commandType", kind: "prop", name: Some("commandType") }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.parameters", kind: "prop", name: Some("parameters") }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.responseFacets", kind: "prop", name: Some("responseFacets") }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.responseTemplate", kind: "prop", name: Some("responseTemplate") }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.responseTemplateFacets", kind: "prop", name: Some("responseTemplateFacets") }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.rngMax", kind: "prop", name: Some("rngMax") }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.rngMin", kind: "prop", name: Some("rngMin") }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.rngParameter", kind: "prop", name: Some("rngParameter") }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.rngTemplate", kind: "prop", name: Some("rngTemplate") }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.rngTemplateFacets", kind: "prop", name: Some("rngTemplateFacets") }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command:body.parameters", tgt: "online.timtinkers.bot.command:body.parameters:items", kind: "items", name: None }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command:body.responseFacets", tgt: "online.timtinkers.bot.command:body.responseFacets:items", kind: "items", name: None }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command:body.responseTemplateFacets", tgt: "online.timtinkers.bot.command:body.responseTemplateFacets:items", kind: "items", name: None }
  • RemovedEdge RemovedEdge { src: "online.timtinkers.bot.command:body.rngTemplateFacets", tgt: "online.timtinkers.bot.command:body.rngTemplateFacets:items", kind: "items", name: None }
  • ConstraintAdded ConstraintAdded { vertex_id: "online.timtinkers.bot.command:body.globalCooldown", sort: "minimum", value: "0" }
  • ConstraintAdded ConstraintAdded { vertex_id: "online.timtinkers.bot.command:body.userCooldown", sort: "minimum", value: "0" }
Non-Breaking Changes (28)
  • AddedVertex AddedVertex { vertex_id: "online.timtinkers.bot.command#default" }
  • AddedVertex AddedVertex { vertex_id: "online.timtinkers.bot.command#moderator" }
  • AddedVertex AddedVertex { vertex_id: "online.timtinkers.bot.command#permissionLevel" }
  • AddedVertex AddedVertex { vertex_id: "online.timtinkers.bot.command#streamer" }
  • AddedVertex AddedVertex { vertex_id: "online.timtinkers.bot.command#vip" }
  • AddedVertex AddedVertex { vertex_id: "online.timtinkers.bot.command:body.globalCooldown" }
  • AddedVertex AddedVertex { vertex_id: "online.timtinkers.bot.command:body.hidden" }
  • AddedVertex AddedVertex { vertex_id: "online.timtinkers.bot.command:body.isReply" }
  • AddedVertex AddedVertex { vertex_id: "online.timtinkers.bot.command:body.permissions" }
  • AddedVertex AddedVertex { vertex_id: "online.timtinkers.bot.command:body.permissions:items" }
  • AddedVertex AddedVertex { vertex_id: "online.timtinkers.bot.command:body.userCooldown" }
  • AddedEdge AddedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.globalCooldown", kind: "prop", name: Some("globalCooldown") }
  • AddedEdge AddedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.hidden", kind: "prop", name: Some("hidden") }
  • AddedEdge AddedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.isReply", kind: "prop", name: Some("isReply") }
  • AddedEdge AddedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.permissions", kind: "prop", name: Some("permissions") }
  • AddedEdge AddedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.userCooldown", kind: "prop", name: Some("userCooldown") }
  • AddedEdge AddedEdge { src: "online.timtinkers.bot.command:body.permissions", tgt: "online.timtinkers.bot.command:body.permissions:items", kind: "items", name: None }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command#parameter.required", sort: "default" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command#parameter.name", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command#parameter.name", sort: "minLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command#parameter.description", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command:body.responseTemplate", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command:body.responseTemplate", sort: "maxGraphemes" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command:body.rngTemplate", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command:body.rngTemplate", sort: "maxGraphemes" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command#parameter.type", sort: "enum" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command:body.response", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command:body.response", sort: "maxGraphemes" }

Migration Guidance

Removed Elements

  • RemovedVertex { vertex_id: "online.timtinkers.bot.command#commandType" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command#parameter" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command#parameter.description" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command#parameter.name" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command#parameter.required" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command#parameter.type" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command#parameterizedCommand" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command#rngCommand" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command#simpleCommand" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.commandType" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.parameters" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.parameters:items" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.responseFacets" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.responseFacets:items" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.responseTemplate" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.responseTemplateFacets" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.responseTemplateFacets:items" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.rngMax" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.rngMin" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.rngParameter" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.rngTemplate" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.rngTemplateFacets" }
  • RemovedVertex { vertex_id: "online.timtinkers.bot.command:body.rngTemplateFacets:items" }

Added Elements

  • AddedVertex { vertex_id: "online.timtinkers.bot.command#default" }
  • AddedVertex { vertex_id: "online.timtinkers.bot.command#moderator" }
  • AddedVertex { vertex_id: "online.timtinkers.bot.command#permissionLevel" }
  • AddedVertex { vertex_id: "online.timtinkers.bot.command#streamer" }
  • AddedVertex { vertex_id: "online.timtinkers.bot.command#vip" }
  • AddedVertex { vertex_id: "online.timtinkers.bot.command:body.globalCooldown" }
  • AddedVertex { vertex_id: "online.timtinkers.bot.command:body.hidden" }
  • AddedVertex { vertex_id: "online.timtinkers.bot.command:body.isReply" }
  • AddedVertex { vertex_id: "online.timtinkers.bot.command:body.permissions" }
  • AddedVertex { vertex_id: "online.timtinkers.bot.command:body.permissions:items" }
  • AddedVertex { vertex_id: "online.timtinkers.bot.command:body.userCooldown" }

Constraint Changes

  • ConstraintAdded ConstraintAdded { vertex_id: "online.timtinkers.bot.command:body.globalCooldown", sort: "minimum", value: "0" }
  • ConstraintAdded ConstraintAdded { vertex_id: "online.timtinkers.bot.command:body.userCooldown", sort: "minimum", value: "0" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command:body.response", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command:body.response", sort: "maxGraphemes" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command#parameter.required", sort: "default" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command:body.responseTemplate", sort: "maxGraphemes" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command:body.responseTemplate", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command#parameter.name", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command#parameter.name", sort: "minLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command#parameter.type", sort: "enum" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command#parameter.description", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command:body.rngTemplate", sort: "maxGraphemes" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "online.timtinkers.bot.command:body.rngTemplate", sort: "maxLength" }

Additional Notes

  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command#parameter", tgt: "online.timtinkers.bot.command#parameter.description", kind: "prop", name: Some("description") }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command#parameter", tgt: "online.timtinkers.bot.command#parameter.name", kind: "prop", name: Some("name") }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command#parameter", tgt: "online.timtinkers.bot.command#parameter.required", kind: "prop", name: Some("required") }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command#parameter", tgt: "online.timtinkers.bot.command#parameter.type", kind: "prop", name: Some("type") }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.commandType", kind: "prop", name: Some("commandType") }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.parameters", kind: "prop", name: Some("parameters") }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.responseFacets", kind: "prop", name: Some("responseFacets") }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.responseTemplate", kind: "prop", name: Some("responseTemplate") }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.responseTemplateFacets", kind: "prop", name: Some("responseTemplateFacets") }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.rngMax", kind: "prop", name: Some("rngMax") }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.rngMin", kind: "prop", name: Some("rngMin") }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.rngParameter", kind: "prop", name: Some("rngParameter") }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.rngTemplate", kind: "prop", name: Some("rngTemplate") }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.rngTemplateFacets", kind: "prop", name: Some("rngTemplateFacets") }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command:body.parameters", tgt: "online.timtinkers.bot.command:body.parameters:items", kind: "items", name: None }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command:body.responseFacets", tgt: "online.timtinkers.bot.command:body.responseFacets:items", kind: "items", name: None }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command:body.responseTemplateFacets", tgt: "online.timtinkers.bot.command:body.responseTemplateFacets:items", kind: "items", name: None }
  • Breaking: RemovedEdge { src: "online.timtinkers.bot.command:body.rngTemplateFacets", tgt: "online.timtinkers.bot.command:body.rngTemplateFacets:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.globalCooldown", kind: "prop", name: Some("globalCooldown") }
  • Non-breaking: AddedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.hidden", kind: "prop", name: Some("hidden") }
  • Non-breaking: AddedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.isReply", kind: "prop", name: Some("isReply") }
  • Non-breaking: AddedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.permissions", kind: "prop", name: Some("permissions") }
  • Non-breaking: AddedEdge { src: "online.timtinkers.bot.command:body", tgt: "online.timtinkers.bot.command:body.userCooldown", kind: "prop", name: Some("userCooldown") }
  • Non-breaking: AddedEdge { src: "online.timtinkers.bot.command:body.permissions", tgt: "online.timtinkers.bot.command:body.permissions:items", kind: "items", name: None }
1 1
{
2 2
  "id": "online.timtinkers.bot.command",
3 3
  "defs": {
4 +
    "vip": {
5 +
      "type": "token",
6 +
      "description": "A VIP viewer"
7 +
    },
4 8
    "main": {
5 9
      "key": "tid",
6 10
      "type": "record",
7 11
      "record": {
8 12
        "type": "object",
9 13
        "required": [
10 14
          "trigger",
11 -
          "commandType",
15 +
          "response",
12 16
          "createdAt"
13 17
        ],
14 18
        "properties": {
15 -
          "rngMax": {
16 -
            "type": "integer",
17 -
            "description": "Maximum value for RNG (inclusive, required for rngCommand type)"
19 +
          "hidden": {
20 +
            "type": "boolean",
21 +
            "description": "Whether the command is hidden from the !commands list"
18 22
          },
19 -
          "rngMin": {
20 -
            "type": "integer",
21 -
            "description": "Minimum value for RNG (inclusive, required for rngCommand type)"
23 +
          "isReply": {
24 +
            "type": "boolean",
25 +
            "description": "Whether the bot should reply to the triggering message rather than posting standalone"
22 26
          },
23 27
          "trigger": {
24 28
            "type": "string",
25 29
            "maxLength": 50,
26 30
            "minLength": 1,
27 31
            "description": "The command trigger without prefix (e.g., 'socials', 'hug', 'd6')"
28 32
          },
29 33
          "response": {
30 34
            "type": "string",
31 -
            "maxLength": 3000,
32 -
            "description": "Static response text (required for simpleCommand type)",
33 -
            "maxGraphemes": 300
35 +
            "description": "Response text supporting variable substitution ($user, $target, $arg[n], $randomNumber[min,max], etc.). Length is validated at runtime after substitution."
34 36
          },
35 37
          "createdAt": {
36 38
            "type": "string",
37 39
            "format": "datetime"
38 40
          },
39 -
          "parameters": {
40 -
            "type": "array",
41 -
            "items": {
42 -
              "ref": "#parameter",
43 -
              "type": "ref"
44 -
            },
45 -
            "maxLength": 10,
46 -
            "minLength": 1,
47 -
            "description": "Parameter definitions (required for parameterizedCommand type)"
48 -
          },
49 -
          "commandType": {
50 -
            "ref": "#commandType",
51 -
            "type": "ref",
52 -
            "description": "The type of command (simple, parameterized, or rng)"
53 -
          },
54 41
          "description": {
55 42
            "type": "string",
56 43
            "maxLength": 300,
57 44
            "description": "Optional help text describing what the command does"
58 45
          },
59 -
          "rngTemplate": {
60 -
            "type": "string",
61 -
            "maxLength": 3000,
62 -
            "description": "Template with {result} placeholder for RNG result and optional {paramName} for input (required for rngCommand type)",
63 -
            "maxGraphemes": 300
64 -
          },
65 -
          "rngParameter": {
66 -
            "ref": "#parameter",
67 -
            "type": "ref",
68 -
            "description": "Optional parameter definition for rngCommand type (e.g., target user for 'stinky' command)"
69 -
          },
70 -
          "responseFacets": {
46 +
          "permissions": {
71 47
            "type": "array",
72 48
            "items": {
73 -
              "ref": "place.stream.richtext.facet",
49 +
              "ref": "#permissionLevel",
74 50
              "type": "ref"
75 51
            },
76 -
            "description": "Annotations of response text (mentions, URLs, etc)"
77 -
          },
78 -
          "responseTemplate": {
79 -
            "type": "string",
80 -
            "maxLength": 3000,
81 -
            "description": "Template with {paramName} placeholders (required for parameterizedCommand type)",
82 -
            "maxGraphemes": 300
52 +
            "maxLength": 10,
53 +
            "description": "Roles that are allowed to use this command. If omitted, the command is available to everyone."
83 54
          },
84 -
          "rngTemplateFacets": {
85 -
            "type": "array",
86 -
            "items": {
87 -
              "ref": "place.stream.richtext.facet",
88 -
              "type": "ref"
89 -
            },
90 -
            "description": "Annotations for RNG template text"
55 +
          "userCooldown": {
56 +
            "type": "integer",
57 +
            "minimum": 0,
58 +
            "description": "Per-user cooldown in seconds. 0 means no cooldown."
91 59
          },
92 -
          "responseTemplateFacets": {
93 -
            "type": "array",
94 -
            "items": {
95 -
              "ref": "place.stream.richtext.facet",
96 -
              "type": "ref"
97 -
            },
98 -
            "description": "Annotations for template text (mentions, URLs, etc). Indices should reference the template string before substitution."
60 +
          "globalCooldown": {
61 +
            "type": "integer",
62 +
            "minimum": 0,
63 +
            "description": "Global cooldown in seconds shared across all users. 0 means no cooldown."
99 64
          }
100 65
        }
101 66
      },
102 -
      "description": "Record representing a chat bot command. Commands can be simple (static response), parameterized (template-based with arguments), or RNG-based (random number generation)."
67 +
      "description": "Record representing a chat bot command. The response field supports variable substitution (e.g. $user, $target, $randomNumber[min,max]) which is resolved at runtime."
103 68
    },
104 -
    "parameter": {
105 -
      "type": "object",
106 -
      "required": [
107 -
        "name",
108 -
        "type"
109 -
      ],
110 -
      "properties": {
111 -
        "name": {
112 -
          "type": "string",
113 -
          "maxLength": 30,
114 -
          "minLength": 1,
115 -
          "description": "Parameter name used in template (e.g., 'target' for {target})"
116 -
        },
117 -
        "type": {
118 -
          "enum": [
119 -
            "string",
120 -
            "handle",
121 -
            "number"
122 -
          ],
123 -
          "type": "string",
124 -
          "description": "Expected parameter type for validation"
125 -
        },
126 -
        "required": {
127 -
          "type": "boolean",
128 -
          "default": true,
129 -
          "description": "Whether this parameter must be provided"
130 -
        },
131 -
        "description": {
132 -
          "type": "string",
133 -
          "maxLength": 200,
134 -
          "description": "Help text for this parameter"
135 -
        }
136 -
      },
137 -
      "description": "Definition of a command parameter"
69 +
    "default": {
70 +
      "type": "token",
71 +
      "description": "Any viewer (default permission level)"
72 +
    },
73 +
    "streamer": {
74 +
      "type": "token",
75 +
      "description": "The channel owner / streamer"
138 76
    },
139 -
    "rngCommand": {
77 +
    "moderator": {
140 78
      "type": "token",
141 -
      "description": "A command that generates a random number within a specified range and formats it using a template"
79 +
      "description": "A channel moderator"
142 80
    },
143 -
    "commandType": {
81 +
    "permissionLevel": {
144 82
      "type": "string",
145 83
      "knownValues": [
146 -
        "online.timtinkers.bot.command#simpleCommand",
147 -
        "online.timtinkers.bot.command#parameterizedCommand",
148 -
        "online.timtinkers.bot.command#rngCommand"
84 +
        "online.timtinkers.bot.command#streamer",
85 +
        "online.timtinkers.bot.command#moderator",
86 +
        "online.timtinkers.bot.command#vip",
87 +
        "online.timtinkers.bot.command#default"
149 88
      ]
150 -
    },
151 -
    "simpleCommand": {
152 -
      "type": "token",
153 -
      "description": "A command that returns a static response with no parameters"
154 -
    },
155 -
    "parameterizedCommand": {
156 -
      "type": "token",
157 -
      "description": "A command that accepts one or more parameters and uses a response template"
158 89
    }
159 90
  },
160 91
  "$type": "com.atproto.lexicon.schema",
161 92
  "lexicon": 1
162 93
}

Compare Other Versions

Lexicon Garden

@