dev.tsunagite.game

tsunagite.dev

Schema Diff

+14 -3

From

CID
bafyreig5lnq66wb...
Indexed At
2026-02-18 19:14 UTC
View this version

To

CID
bafyreiadgf2wzxy...
Indexed At
2026-04-30 03:21 UTC
View this version

Compatibility Analysis

Backward Compatible

Backward compatible. 4 non-breaking changes.

Non-Breaking Changes (4)
  • AddedVertex AddedVertex { vertex_id: "dev.tsunagite.game:body.createdAt" }
  • AddedVertex AddedVertex { vertex_id: "dev.tsunagite.game:body.updatedAt" }
  • AddedEdge AddedEdge { src: "dev.tsunagite.game:body", tgt: "dev.tsunagite.game:body.createdAt", kind: "prop", name: Some("createdAt") }
  • AddedEdge AddedEdge { src: "dev.tsunagite.game:body", tgt: "dev.tsunagite.game:body.updatedAt", kind: "prop", name: Some("updatedAt") }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "dev.tsunagite.game:body.createdAt" }
  • AddedVertex { vertex_id: "dev.tsunagite.game:body.updatedAt" }

Additional Notes

  • Non-breaking: AddedEdge { src: "dev.tsunagite.game:body", tgt: "dev.tsunagite.game:body.createdAt", kind: "prop", name: Some("createdAt") }
  • Non-breaking: AddedEdge { src: "dev.tsunagite.game:body", tgt: "dev.tsunagite.game:body.updatedAt", kind: "prop", name: Some("updatedAt") }
1 1
{
2 2
  "id": "dev.tsunagite.game",
3 3
  "defs": {
4 4
    "enum": {
5 5
      "type": "object",
6 6
      "required": [
7 7
        "name",
8 8
        "values"
9 9
      ],
10 10
      "properties": {
11 11
        "name": {
12 12
          "ref": "dev.tsunagite.translatable",
13 13
          "type": "ref",
14 14
          "description": "The human-readable name of this component in UI."
15 15
        },
16 16
        "values": {
17 17
          "type": "array",
18 18
          "items": {
19 -
            "ref": "dev.tsunagite.types#indexable",
19 +
            "ref": "dev.tsunagite.defs#indexable",
20 20
            "type": "ref"
21 21
          },
22 22
          "description": "The allowed values for this enum to take."
23 23
        }
24 24
      },
25 25
      "description": "A closed set of indexable named values."
26 26
    },
27 27
    "main": {
28 28
      "key": "any",
29 29
      "type": "record",
30 30
      "record": {
31 31
        "type": "object",
32 32
        "required": [
33 33
          "name",
34 34
          "judgments",
35 35
          "scoreComponents",
36 36
          "defaultComponent"
37 37
        ],
38 38
        "properties": {
39 39
          "logo": {
40 40
            "type": "blob",
41 41
            "accept": [
42 42
              "image/png",
43 43
              "image/jpeg",
44 44
              "image/jxl",
45 45
              "image/webp"
46 46
            ],
47 47
            "maxSize": 8000000,
48 48
            "description": "The logo of the game, for display in UI."
49 49
          },
50 50
          "name": {
51 51
            "ref": "dev.tsunagite.translatable",
52 52
            "type": "ref",
53 53
            "description": "The human-readable name of the game, for display in UI."
54 54
          },
55 55
          "modes": {
56 56
            "type": "array",
57 57
            "items": {
58 58
              "type": "string",
59 59
              "description": "Can be tokens or raw strings.",
60 60
              "knownValues": [
61 61
                "dev.tsunagite.singles",
62 62
                "dev.tsunagite.doubles"
63 63
              ]
64 64
            },
65 65
            "description": "An array of playable game modes with different gameplay configurations. Optional if the game only has one mode."
66 66
          },
67 +
          "createdAt": {
68 +
            "type": "string",
69 +
            "format": "datetime"
70 +
          },
67 71
          "judgments": {
68 72
            "type": "array",
69 73
            "items": {
70 -
              "ref": "dev.tsunagite.types#indexable",
74 +
              "ref": "dev.tsunagite.defs#indexable",
71 75
              "type": "ref",
72 76
              "description": "Indices will be displayed in ascending order."
73 77
            },
74 78
            "description": "The obtainable judgments during gameplay."
75 79
          },
80 +
          "updatedAt": {
81 +
            "type": "string",
82 +
            "format": "datetime"
83 +
          },
76 84
          "inputMethods": {
77 85
            "type": "array",
78 86
            "items": {
79 87
              "type": "string",
80 88
              "description": "Can be tokens or raw strings.",
81 89
              "knownValues": [
82 90
                "dev.tsunagite.keyboard",
83 91
                "dev.tsunagite.gamepad"
84 92
              ]
85 93
            },
86 94
            "description": "An array of usable input methods for the game. Optional if the game only has one input method or doesn't separate leaderboards by method."
87 95
          },
88 96
          "scoreComponents": {
89 97
            "type": "object",
90 98
            "properties": {
91 99
              "$keyFormat": {
92 100
                "type": "string",
93 101
                "format": "record-key",
94 102
                "maxLength": 32,
95 103
                "minLength": 1
96 104
              },
97 105
              "$valueType": {
98 106
                "refs": [
99 107
                  "#enum",
100 108
                  "#points",
101 109
                  "#percentage",
102 110
                  "#text"
103 111
                ],
104 112
                "type": "union",
105 113
                "description": "If you need a component type that doesn't exist yet, contact @lemmaeof.gay"
106 114
              }
107 115
            },
108 116
            "description": "All the components of a score in the game, including grades, lamps, EX score, and whatever other constructs are used."
109 117
          },
110 118
          "defaultComponent": {
111 119
            "type": "string",
112 120
            "format": "record-key",
113 121
            "description": "The default component for leaderboard sorting."
114 122
          }
115 123
        }
116 124
      },
117 125
      "description": "A record describing a game hosting leaderboards via Tsunagite."
118 126
    },
119 127
    "text": {
120 128
      "type": "object",
121 129
      "required": [
122 130
        "name"
123 131
      ],
124 132
      "properties": {
125 133
        "name": {
126 134
          "ref": "dev.tsunagite.translatable",
127 135
          "type": "ref",
128 136
          "description": "The human-readable name of this component in UI."
129 137
        }
130 138
      },
131 139
      "description": "A fallback component for displaying arbitrary text."
132 140
    },
133 141
    "points": {
134 142
      "type": "object",
135 143
      "required": [
136 144
        "name"
137 145
      ],
138 146
      "properties": {
139 147
        "name": {
140 148
          "ref": "dev.tsunagite.translatable",
141 149
          "type": "ref",
142 150
          "description": "The human-readable name of this component in UI."
143 151
        },
144 152
        "maximum": {
145 153
          "type": "integer",
146 154
          "description": "The maximum allowed value for this score."
147 155
        }
148 156
      },
149 157
      "description": "An integer point score, with or without a cap."
150 158
    },
151 159
    "percentage": {
152 160
      "type": "object",
153 161
      "required": [
154 162
        "name",
155 163
        "maximum",
156 164
        "precision"
157 165
      ],
158 166
      "properties": {
159 167
        "name": {
160 168
          "ref": "dev.tsunagite.translatable",
161 169
          "type": "ref",
162 170
          "description": "The human-readable name of this component in UI."
163 171
        },
164 172
        "maximum": {
165 173
          "type": "integer",
166 174
          "default": 100,
167 175
          "description": "The maximum allowed percentage for this score."
168 176
        },
169 177
        "precision": {
170 178
          "type": "integer",
171 179
          "default": 2,
172 180
          "description": "The number of decimal places to include in the percentage."
173 181
        }
174 182
      },
175 183
      "description": "A percentage score with customizable precision."
176 184
    }
177 185
  },
178 186
  "$type": "com.atproto.lexicon.schema",
179 187
  "lexicon": 1,
180 -
  "description": "Definitions related to games hosting leaderboards via Tunagite."
188 +
  "description": "Definitions related to games hosting leaderboards via Tunagite.",
189 +
  "featureFlags": [
190 +
    "dev.tsunagite.dictionaryObject"
191 +
  ]
181 192
}

Compare Other Versions

Lexicon Garden

@