dev.tsunagite.game

tsunagite.dev

Schema Diff

+19 -3

From

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

To

CID
bafyreifxzuzd7jd...
Indexed At
2026-05-05 21:58 UTC
View this version

Compatibility Analysis

Backward Compatible

Backward compatible. 6 non-breaking changes.

Non-Breaking Changes (6)
  • AddedVertex AddedVertex { vertex_id: "dev.tsunagite.game:body.createdAt" }
  • AddedVertex AddedVertex { vertex_id: "dev.tsunagite.game:body.nsid" }
  • 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.nsid", kind: "prop", name: Some("nsid") }
  • 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.nsid" }
  • 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.nsid", kind: "prop", name: Some("nsid") }
  • 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 +
          "nsid": {
56 +
            "type": "string",
57 +
            "format": "nsid",
58 +
            "description": "The namespaced ID of the game used for leaderboard and profile keys."
59 +
          },
55 60
          "modes": {
56 61
            "type": "array",
57 62
            "items": {
58 63
              "type": "string",
59 64
              "description": "Can be tokens or raw strings.",
60 65
              "knownValues": [
61 66
                "dev.tsunagite.singles",
62 67
                "dev.tsunagite.doubles"
63 68
              ]
64 69
            },
65 70
            "description": "An array of playable game modes with different gameplay configurations. Optional if the game only has one mode."
66 71
          },
72 +
          "createdAt": {
73 +
            "type": "string",
74 +
            "format": "datetime"
75 +
          },
67 76
          "judgments": {
68 77
            "type": "array",
69 78
            "items": {
70 -
              "ref": "dev.tsunagite.types#indexable",
79 +
              "ref": "dev.tsunagite.defs#indexable",
71 80
              "type": "ref",
72 81
              "description": "Indices will be displayed in ascending order."
73 82
            },
74 83
            "description": "The obtainable judgments during gameplay."
75 84
          },
85 +
          "updatedAt": {
86 +
            "type": "string",
87 +
            "format": "datetime"
88 +
          },
76 89
          "inputMethods": {
77 90
            "type": "array",
78 91
            "items": {
79 92
              "type": "string",
80 93
              "description": "Can be tokens or raw strings.",
81 94
              "knownValues": [
82 95
                "dev.tsunagite.keyboard",
83 96
                "dev.tsunagite.gamepad"
84 97
              ]
85 98
            },
86 99
            "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 100
          },
88 101
          "scoreComponents": {
89 102
            "type": "object",
90 103
            "properties": {
91 104
              "$keyFormat": {
92 105
                "type": "string",
93 106
                "format": "record-key",
94 107
                "maxLength": 32,
95 108
                "minLength": 1
96 109
              },
97 110
              "$valueType": {
98 111
                "refs": [
99 112
                  "#enum",
100 113
                  "#points",
101 114
                  "#percentage",
102 115
                  "#text"
103 116
                ],
104 117
                "type": "union",
105 118
                "description": "If you need a component type that doesn't exist yet, contact @lemmaeof.gay"
106 119
              }
107 120
            },
108 121
            "description": "All the components of a score in the game, including grades, lamps, EX score, and whatever other constructs are used."
109 122
          },
110 123
          "defaultComponent": {
111 124
            "type": "string",
112 125
            "format": "record-key",
113 126
            "description": "The default component for leaderboard sorting."
114 127
          }
115 128
        }
116 129
      },
117 130
      "description": "A record describing a game hosting leaderboards via Tsunagite."
118 131
    },
119 132
    "text": {
120 133
      "type": "object",
121 134
      "required": [
122 135
        "name"
123 136
      ],
124 137
      "properties": {
125 138
        "name": {
126 139
          "ref": "dev.tsunagite.translatable",
127 140
          "type": "ref",
128 141
          "description": "The human-readable name of this component in UI."
129 142
        }
130 143
      },
131 144
      "description": "A fallback component for displaying arbitrary text."
132 145
    },
133 146
    "points": {
134 147
      "type": "object",
135 148
      "required": [
136 149
        "name"
137 150
      ],
138 151
      "properties": {
139 152
        "name": {
140 153
          "ref": "dev.tsunagite.translatable",
141 154
          "type": "ref",
142 155
          "description": "The human-readable name of this component in UI."
143 156
        },
144 157
        "maximum": {
145 158
          "type": "integer",
146 159
          "description": "The maximum allowed value for this score."
147 160
        }
148 161
      },
149 162
      "description": "An integer point score, with or without a cap."
150 163
    },
151 164
    "percentage": {
152 165
      "type": "object",
153 166
      "required": [
154 167
        "name",
155 168
        "maximum",
156 169
        "precision"
157 170
      ],
158 171
      "properties": {
159 172
        "name": {
160 173
          "ref": "dev.tsunagite.translatable",
161 174
          "type": "ref",
162 175
          "description": "The human-readable name of this component in UI."
163 176
        },
164 177
        "maximum": {
165 178
          "type": "integer",
166 179
          "default": 100,
167 180
          "description": "The maximum allowed percentage for this score."
168 181
        },
169 182
        "precision": {
170 183
          "type": "integer",
171 184
          "default": 2,
172 185
          "description": "The number of decimal places to include in the percentage."
173 186
        }
174 187
      },
175 188
      "description": "A percentage score with customizable precision."
176 189
    }
177 190
  },
178 191
  "$type": "com.atproto.lexicon.schema",
179 192
  "lexicon": 1,
180 -
  "description": "Definitions related to games hosting leaderboards via Tunagite."
193 +
  "description": "Definitions related to games hosting leaderboards via Tunagite.",
194 +
  "featureFlags": [
195 +
    "dev.tsunagite.dictionaryObject"
196 +
  ]
181 197
}

Compare Other Versions

Lexicon Garden

@