dev.tsunagite.score

tsunagite.dev

Schema Diff

+9 -1

From

CID
bafyreifl3pzitvt...
Indexed At
2026-02-18 19:15 UTC
View this version

To

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

Compatibility Analysis

Backward Compatible

Backward compatible. 2 non-breaking changes.

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

Migration Guidance

Added Elements

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

Additional Notes

  • Non-breaking: AddedEdge { src: "dev.tsunagite.score:body", tgt: "dev.tsunagite.score:body.scoredAt", kind: "prop", name: Some("scoredAt") }
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 +
          "scoredAt": {
57 +
            "type": "string",
58 +
            "format": "datetime",
59 +
            "description": "The time this score was originally earned."
60 +
          },
56 61
          "judgments": {
57 62
            "type": "object",
58 63
            "properties": {
59 64
              "$keyFormat": {
60 65
                "type": "string",
61 66
                "format": "record-key",
62 67
                "maxLength": 32,
63 68
                "minLength": 1,
64 69
                "description": "Must match a judgment defined by the game record."
65 70
              },
66 71
              "$valueType": {
67 72
                "type": "object",
68 73
                "required": [
69 74
                  "total"
70 75
                ],
71 76
                "properties": {
72 77
                  "late": {
73 78
                    "type": "integer",
74 79
                    "description": "The number of total judgments of this type earned when hitting late."
75 80
                  },
76 81
                  "early": {
77 82
                    "type": "integer",
78 83
                    "description": "The number of total judgments of this type earned when hitting early."
79 84
                  },
80 85
                  "total": {
81 86
                    "type": "integer",
82 87
                    "description": "The number of total judgments of this type earned."
83 88
                  }
84 89
                }
85 90
              }
86 91
            },
87 92
            "description": "A map of judgment names to the integer judgment amounts earned during play."
88 93
          },
89 94
          "inputMethod": {
90 95
            "type": "string",
91 96
            "description": "The input method this score was earned using. Must be an input method defined by the game record if present."
92 97
          },
93 98
          "scoreComponents": {
94 99
            "type": "object",
95 100
            "properties": {
96 101
              "$keyFormat": {
97 102
                "type": "string",
98 103
                "format": "record-key",
99 104
                "maxLength": 32,
100 105
                "minLength": 1,
101 106
                "description": "Must match an ID defined by the game record, as well as using the same type."
102 107
              },
103 108
              "$valueType": {
104 109
                "refs": [
105 110
                  "#enum",
106 111
                  "#points",
107 112
                  "#percentage",
108 113
                  "#text"
109 114
                ],
110 115
                "type": "union",
111 116
                "description": "If you need a component type that doesn't exist yet, contact @lemmaeof.gay"
112 117
              }
113 118
            },
114 119
            "description": "The components that make up this score, as defined by the game record."
115 120
          }
116 121
        }
117 122
      },
118 123
      "description": "A score in a game hosting leaderboards via Tsunagite."
119 124
    },
120 125
    "text": {
121 126
      "type": "object",
122 127
      "required": [
123 128
        "id",
124 129
        "value"
125 130
      ],
126 131
      "properties": {
127 132
        "id": {
128 133
          "type": "string",
129 134
          "format": "record-key",
130 135
          "maxLength": 32,
131 136
          "minLength": 1,
132 137
          "description": "The internal ID of this component, matching with a text score defined by the game record."
133 138
        },
134 139
        "value": {
135 140
          "type": "string",
136 141
          "description": "The text value of this score."
137 142
        }
138 143
      },
139 144
      "description": "A fallback score component."
140 145
    },
141 146
    "points": {
142 147
      "type": "object",
143 148
      "required": [
144 149
        "value"
145 150
      ],
146 151
      "properties": {
147 152
        "value": {
148 153
          "type": "integer",
149 154
          "description": "The number of points earned, capped by the limit defined by the game record if present."
150 155
        }
151 156
      },
152 157
      "description": "An integer point score component."
153 158
    },
154 159
    "percentage": {
155 160
      "type": "object",
156 161
      "required": [
157 162
        "value"
158 163
      ],
159 164
      "properties": {
160 165
        "value": {
161 166
          "type": "string",
162 167
          "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."
163 168
        }
164 169
      },
165 170
      "description": "A percentage score component."
166 171
    }
167 172
  },
168 173
  "$type": "com.atproto.lexicon.schema",
169 174
  "lexicon": 1,
170 -
  "description": "Definitions related to scores in games hosting leaderboards via Tsunagite."
175 +
  "description": "Definitions related to scores in games hosting leaderboards via Tsunagite.",
176 +
  "featureFlags": [
177 +
    "dev.tsunagite.dictionaryObject"
178 +
  ]
171 179
}

Compare Other Versions

Lexicon Garden

@