dev.tsunagite.score
Schema Diff
+9 -1
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
}