dev.tsunagite.score

tsunagite.dev

Schema Diff

+11 -3

From

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

To

CID
bafyreicscnfo45a...
Indexed At
2026-08-07 18:08 UTC
View this version

Compatibility Analysis

Backward Compatible

Backward compatible. 4 non-breaking changes.

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

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "dev.tsunagite.score:body.totalEarly" }
  • AddedVertex { vertex_id: "dev.tsunagite.score:body.totalLate" }

Additional Notes

  • Non-breaking: AddedEdge { src: "dev.tsunagite.score:body", tgt: "dev.tsunagite.score:body.totalEarly", kind: "prop", name: Some("totalEarly") }
  • Non-breaking: AddedEdge { src: "dev.tsunagite.score:body", tgt: "dev.tsunagite.score:body.totalLate", kind: "prop", name: Some("totalLate") }
1 1
{
2 2
  "id": "dev.tsunagite.score",
3 3
  "defs": {
4 4
    "enum": {
5 5
      "type": "object",
6 6
      "required": [
7 7
        "value"
8 8
      ],
9 9
      "properties": {
10 10
        "value": {
11 11
          "type": "string",
12 12
          "format": "record-key",
13 13
          "description": "The internal ID of the value, matching with an allowed enum value defined by the game record."
14 14
        }
15 15
      },
16 16
      "description": "An indexable named score component."
17 17
    },
18 18
    "main": {
19 19
      "key": "tid",
20 20
      "type": "record",
21 21
      "record": {
22 22
        "type": "object",
23 23
        "required": [
24 24
          "game",
25 25
          "song",
26 26
          "chart",
27 27
          "judgments",
28 28
          "scoreComponents"
29 29
        ],
30 30
        "properties": {
31 31
          "game": {
32 32
            "type": "string",
33 33
            "format": "at-uri",
34 34
            "description": "The game this score was earned in. URI must point to a record of type `dev.tsunagite.game`."
35 35
          },
36 36
          "mode": {
37 37
            "type": "string",
38 38
            "description": "The game mode this score was earned on. Must be a mode defined by the game record if present."
39 39
          },
40 40
          "song": {
41 41
            "type": "string",
42 42
            "format": "at-uri",
43 43
            "description": "The song this score was earned on. URI must point to a record of type `dev.tsunagite.song`."
44 44
          },
45 45
          "chart": {
46 46
            "type": "string",
47 47
            "format": "at-uri",
48 48
            "description": "The chart this score was earned on. URI must point to a record of type `dev.tsunagite.chart`."
49 49
          },
50 50
          "version": {
51 51
            "type": "bytes",
52 52
            "maxLength": 16,
53 53
            "minLength": 16,
54 54
            "description": "The md5 hash of the chart version this score was earned on. Optional if you will not perform leaderboard resets upon any chart changes."
55 55
          },
56 56
          "scoredAt": {
57 57
            "type": "string",
58 58
            "format": "datetime",
59 59
            "description": "The time this score was originally earned."
60 60
          },
61 61
          "judgments": {
62 62
            "type": "object",
63 63
            "properties": {
64 64
              "$keyFormat": {
65 65
                "type": "string",
66 66
                "format": "record-key",
67 67
                "maxLength": 32,
68 68
                "minLength": 1,
69 69
                "description": "Must match a judgment defined by the game record."
70 70
              },
71 71
              "$valueType": {
72 72
                "type": "object",
73 73
                "required": [
74 74
                  "total"
75 75
                ],
76 76
                "properties": {
77 77
                  "late": {
78 78
                    "type": "integer",
79 -
                    "description": "The number of total judgments of this type earned when hitting late."
79 +
                    "description": "The number of judgments of this type earned when hitting late."
80 80
                  },
81 81
                  "early": {
82 82
                    "type": "integer",
83 -
                    "description": "The number of total judgments of this type earned when hitting early."
83 +
                    "description": "The number of judgments of this type earned when hitting early."
84 84
                  },
85 85
                  "total": {
86 86
                    "type": "integer",
87 -
                    "description": "The number of total judgments of this type earned."
87 +
                    "description": "The total number of judgments of this type earned."
88 88
                  }
89 89
                }
90 90
              }
91 91
            },
92 92
            "description": "A map of judgment names to the integer judgment amounts earned during play."
93 93
          },
94 +
          "totalLate": {
95 +
            "type": "integer",
96 +
            "description": "The total number of judgments earned when hitting late."
97 +
          },
98 +
          "totalEarly": {
99 +
            "type": "integer",
100 +
            "description": "The total number of judgments earned when hitting early."
101 +
          },
94 102
          "inputMethod": {
95 103
            "type": "string",
96 104
            "description": "The input method this score was earned using. Must be an input method defined by the game record if present."
97 105
          },
98 106
          "scoreComponents": {
99 107
            "type": "object",
100 108
            "properties": {
101 109
              "$keyFormat": {
102 110
                "type": "string",
103 111
                "format": "record-key",
104 112
                "maxLength": 32,
105 113
                "minLength": 1,
106 114
                "description": "Must match an ID defined by the game record, as well as using the same type."
107 115
              },
108 116
              "$valueType": {
109 117
                "refs": [
110 118
                  "#enum",
111 119
                  "#points",
112 120
                  "#percentage",
113 121
                  "#text"
114 122
                ],
115 123
                "type": "union",
116 124
                "description": "If you need a component type that doesn't exist yet, contact @lemmaeof.gay"
117 125
              }
118 126
            },
119 127
            "description": "The components that make up this score, as defined by the game record."
120 128
          }
121 129
        }
122 130
      },
123 131
      "description": "A score in a game hosting leaderboards via Tsunagite."
124 132
    },
125 133
    "text": {
126 134
      "type": "object",
127 135
      "required": [
128 136
        "id",
129 137
        "value"
130 138
      ],
131 139
      "properties": {
132 140
        "id": {
133 141
          "type": "string",
134 142
          "format": "record-key",
135 143
          "maxLength": 32,
136 144
          "minLength": 1,
137 145
          "description": "The internal ID of this component, matching with a text score defined by the game record."
138 146
        },
139 147
        "value": {
140 148
          "type": "string",
141 149
          "description": "The text value of this score."
142 150
        }
143 151
      },
144 152
      "description": "A fallback score component."
145 153
    },
146 154
    "points": {
147 155
      "type": "object",
148 156
      "required": [
149 157
        "value"
150 158
      ],
151 159
      "properties": {
152 160
        "value": {
153 161
          "type": "integer",
154 162
          "description": "The number of points earned, capped by the limit defined by the game record if present."
155 163
        }
156 164
      },
157 165
      "description": "An integer point score component."
158 166
    },
159 167
    "percentage": {
160 168
      "type": "object",
161 169
      "required": [
162 170
        "value"
163 171
      ],
164 172
      "properties": {
165 173
        "value": {
166 174
          "type": "string",
167 175
          "description": "The percentage score earned, capped and formatted by the limits defined by the game record. Stored as a decimal number without a percent sign."
168 176
        }
169 177
      },
170 178
      "description": "A percentage score component."
171 179
    }
172 180
  },
173 181
  "$type": "com.atproto.lexicon.schema",
174 182
  "lexicon": 1,
175 183
  "description": "Definitions related to scores in games hosting leaderboards via Tsunagite.",
176 184
  "featureFlags": [
177 185
    "dev.tsunagite.dictionaryObject"
178 186
  ]
179 187
}

Compare Other Versions

Lexicon Garden

@