rhythia-api 209.0.0 → 210.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/getBadgeLeaders.ts +72 -0
- package/api/getUserScores.ts +22 -121
- package/api/submitScore.ts +21 -0
- package/index.ts +30 -4
- package/package.json +1 -1
- package/types/database.ts +233 -260
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import z from "zod";
|
|
3
|
+
import { supabase } from "../utils/supabase";
|
|
4
|
+
|
|
5
|
+
export const Schema = {
|
|
6
|
+
input: z.strictObject({
|
|
7
|
+
limit: z.number().min(1).max(100).optional().default(100),
|
|
8
|
+
}),
|
|
9
|
+
output: z.object({
|
|
10
|
+
leaderboard: z.array(
|
|
11
|
+
z.object({
|
|
12
|
+
id: z.number(),
|
|
13
|
+
display_name: z.string(),
|
|
14
|
+
avatar_url: z.string().nullable(),
|
|
15
|
+
special_badge_count: z.number(),
|
|
16
|
+
earned_badges: z.array(z.string()),
|
|
17
|
+
all_badges: z.any(), // JSON type
|
|
18
|
+
})
|
|
19
|
+
),
|
|
20
|
+
total_count: z.number(),
|
|
21
|
+
error: z.string().optional(),
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export async function GET(request: Request): Promise<NextResponse> {
|
|
26
|
+
const url = new URL(request.url);
|
|
27
|
+
const limit = Math.min(parseInt(url.searchParams.get("limit") || "100"), 100);
|
|
28
|
+
|
|
29
|
+
return handler({ limit });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export async function handler({
|
|
33
|
+
limit = 100,
|
|
34
|
+
}: {
|
|
35
|
+
limit?: number;
|
|
36
|
+
}): Promise<NextResponse<(typeof Schema)["output"]["_type"]>> {
|
|
37
|
+
try {
|
|
38
|
+
const { data: leaderboard, error } = await supabase.rpc(
|
|
39
|
+
"get_badge_leaderboard",
|
|
40
|
+
{
|
|
41
|
+
p_limit: limit,
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
if (error) {
|
|
46
|
+
console.error("Badge leaderboard error:", error);
|
|
47
|
+
return NextResponse.json(
|
|
48
|
+
{
|
|
49
|
+
leaderboard: [],
|
|
50
|
+
total_count: 0,
|
|
51
|
+
error: "Failed to fetch badge leaderboard",
|
|
52
|
+
},
|
|
53
|
+
{ status: 500 }
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return NextResponse.json({
|
|
58
|
+
leaderboard: leaderboard || [],
|
|
59
|
+
total_count: leaderboard?.length || 0,
|
|
60
|
+
});
|
|
61
|
+
} catch (error) {
|
|
62
|
+
console.error("Badge leaderboard exception:", error);
|
|
63
|
+
return NextResponse.json(
|
|
64
|
+
{
|
|
65
|
+
leaderboard: [],
|
|
66
|
+
total_count: 0,
|
|
67
|
+
error: "Internal server error",
|
|
68
|
+
},
|
|
69
|
+
{ status: 500 }
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
}
|
package/api/getUserScores.ts
CHANGED
|
@@ -33,16 +33,16 @@ export const Schema = {
|
|
|
33
33
|
reign: z
|
|
34
34
|
.array(
|
|
35
35
|
z.object({
|
|
36
|
-
id: z.number(),
|
|
37
|
-
awarded_sp: z.number().nullable(),
|
|
38
|
-
created_at: z.string(),
|
|
36
|
+
id: z.number(),
|
|
37
|
+
awarded_sp: z.number().nullable(),
|
|
38
|
+
created_at: z.string(),
|
|
39
39
|
misses: z.number().nullable(),
|
|
40
40
|
mods: z.record(z.unknown()),
|
|
41
41
|
passed: z.boolean().nullable(),
|
|
42
42
|
songId: z.string().nullable(),
|
|
43
43
|
speed: z.number().nullable(),
|
|
44
44
|
spin: z.boolean(),
|
|
45
|
-
beatmapHash: z.string().nullable(),
|
|
45
|
+
beatmapHash: z.string().nullable(),
|
|
46
46
|
beatmapTitle: z.string().nullable(),
|
|
47
47
|
difficulty: z.number().nullable(),
|
|
48
48
|
beatmapNotes: z.number().optional().nullable(),
|
|
@@ -91,128 +91,29 @@ export async function handler(
|
|
|
91
91
|
data: (typeof Schema)["input"]["_type"],
|
|
92
92
|
req: Request
|
|
93
93
|
): Promise<NextResponse<(typeof Schema)["output"]["_type"]>> {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
`
|
|
101
|
-
*,
|
|
102
|
-
beatmaps (
|
|
103
|
-
difficulty,
|
|
104
|
-
noteCount,
|
|
105
|
-
title
|
|
106
|
-
)
|
|
107
|
-
`
|
|
108
|
-
)
|
|
109
|
-
.eq("userId", data.id)
|
|
110
|
-
.eq("passed", true)
|
|
111
|
-
.order("created_at", { ascending: false })
|
|
112
|
-
.limit(data.limit);
|
|
113
|
-
|
|
114
|
-
let { data: scores2, error: errorsp } = await supabase
|
|
115
|
-
.from("scores")
|
|
116
|
-
.select(
|
|
117
|
-
`
|
|
118
|
-
*,
|
|
119
|
-
beatmaps (
|
|
120
|
-
difficulty,
|
|
121
|
-
noteCount,
|
|
122
|
-
title
|
|
123
|
-
)
|
|
124
|
-
`
|
|
125
|
-
)
|
|
126
|
-
.eq("userId", data.id)
|
|
127
|
-
.neq("awarded_sp", 0)
|
|
128
|
-
.eq("passed", true)
|
|
129
|
-
.order("awarded_sp", { ascending: false });
|
|
130
|
-
|
|
131
|
-
if (scores2 == null) return NextResponse.json({ error: "No scores" });
|
|
132
|
-
|
|
133
|
-
let spinScores = 0;
|
|
134
|
-
let totalScores = scores2.length;
|
|
135
|
-
let hashMap: Record<string, { awarded_sp: number; score: any }> = {};
|
|
136
|
-
|
|
137
|
-
for (const score of scores2) {
|
|
138
|
-
const { beatmapHash, awarded_sp, spin } = score;
|
|
139
|
-
|
|
140
|
-
if (!beatmapHash || !awarded_sp) continue;
|
|
141
|
-
|
|
142
|
-
if (score.spin) {
|
|
143
|
-
spinScores++;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (!hashMap[beatmapHash] || hashMap[beatmapHash].awarded_sp < awarded_sp) {
|
|
147
|
-
hashMap[beatmapHash] = { awarded_sp, score };
|
|
94
|
+
// Call the RPC created earlier
|
|
95
|
+
const { data: result, error } = await supabase.rpc(
|
|
96
|
+
"get_user_scores_summary",
|
|
97
|
+
{
|
|
98
|
+
userid: data.id,
|
|
99
|
+
limit_param: data.limit,
|
|
148
100
|
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const values = Object.values(hashMap);
|
|
152
|
-
let vals = values
|
|
153
|
-
.sort((a, b) => b.awarded_sp - a.awarded_sp)
|
|
154
|
-
.slice(0, data.limit)
|
|
155
|
-
.map((e) => e.score);
|
|
156
|
-
|
|
157
|
-
const { data: reignScores, error } = await supabase.rpc(
|
|
158
|
-
"get_user_reigning_scores",
|
|
159
|
-
{ userid: data.id, page_size: 10 }
|
|
160
101
|
);
|
|
161
102
|
|
|
162
103
|
if (error) {
|
|
163
104
|
return NextResponse.json({ error: JSON.stringify(error) });
|
|
164
105
|
}
|
|
165
106
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
beatmapTitle: s.beatmaps?.title,
|
|
179
|
-
speed: s.speed,
|
|
180
|
-
spin: s.spin,
|
|
181
|
-
})),
|
|
182
|
-
reign: reignScores?.map((s) => ({
|
|
183
|
-
id: s.id,
|
|
184
|
-
awarded_sp: s.awarded_sp,
|
|
185
|
-
created_at: s.created_at,
|
|
186
|
-
misses: s.misses,
|
|
187
|
-
mods: s.mods as any,
|
|
188
|
-
passed: s.passed,
|
|
189
|
-
songId: s.songid,
|
|
190
|
-
speed: s.speed,
|
|
191
|
-
spin: s.spin,
|
|
192
|
-
beatmapHash: s.beatmaphash,
|
|
193
|
-
beatmapTitle: s.beatmaptitle,
|
|
194
|
-
beatmapNotes: s.notes,
|
|
195
|
-
difficulty: s.difficulty,
|
|
196
|
-
})),
|
|
197
|
-
top: vals?.map((s) => ({
|
|
198
|
-
created_at: s.created_at,
|
|
199
|
-
id: s.id,
|
|
200
|
-
passed: s.passed,
|
|
201
|
-
userId: s.userId,
|
|
202
|
-
awarded_sp: s.awarded_sp,
|
|
203
|
-
beatmapHash: s.beatmapHash,
|
|
204
|
-
misses: s.misses,
|
|
205
|
-
rank: s.rank,
|
|
206
|
-
songId: s.songId,
|
|
207
|
-
beatmapDifficulty: s.beatmaps?.difficulty,
|
|
208
|
-
beatmapNotes: s.beatmaps?.noteCount,
|
|
209
|
-
beatmapTitle: s.beatmaps?.title,
|
|
210
|
-
speed: s.speed,
|
|
211
|
-
spin: s.spin,
|
|
212
|
-
})),
|
|
213
|
-
stats: {
|
|
214
|
-
totalScores,
|
|
215
|
-
spinScores,
|
|
216
|
-
},
|
|
217
|
-
});
|
|
107
|
+
if (!result) {
|
|
108
|
+
return NextResponse.json({ error: "No data returned" });
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// The RPC may return { error: "..." } as a JSON object
|
|
112
|
+
if (typeof result === "object" && result !== null && "error" in result) {
|
|
113
|
+
return NextResponse.json({ error: String((result as any).error) });
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Trust the RPC's JSON shape to match Schema.output
|
|
117
|
+
const typedResult = result as (typeof Schema)["output"]["_type"];
|
|
118
|
+
return NextResponse.json(typedResult);
|
|
218
119
|
}
|
package/api/submitScore.ts
CHANGED
|
@@ -279,6 +279,27 @@ export async function handler({
|
|
|
279
279
|
squares_hit: (userData.squares_hit || 0) + data.hits,
|
|
280
280
|
});
|
|
281
281
|
console.log("p3");
|
|
282
|
+
// Grant special badges if applicable
|
|
283
|
+
if (passed && beatmapPages && !data.mods.includes("mod_nofail")) {
|
|
284
|
+
try {
|
|
285
|
+
const { data: badgeResult, error: badgeError } = await supabase.rpc(
|
|
286
|
+
"grant_special_badges",
|
|
287
|
+
{
|
|
288
|
+
p_user_id: userData.id,
|
|
289
|
+
p_beatmap_id: beatmapPages.id,
|
|
290
|
+
p_spin: data.spin || false,
|
|
291
|
+
p_passed: passed,
|
|
292
|
+
}
|
|
293
|
+
);
|
|
294
|
+
|
|
295
|
+
const result = badgeResult as { granted: boolean; badge: string | null };
|
|
296
|
+
if (result && result.granted) {
|
|
297
|
+
console.log(`Badge granted: ${result.badge} to user ${userData.id}`);
|
|
298
|
+
}
|
|
299
|
+
} catch (error) {
|
|
300
|
+
console.error("Error granting badge:", error);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
282
303
|
|
|
283
304
|
if (awarded_sp > 99 && userData.ban == "cool") {
|
|
284
305
|
await postToWebhooks({
|
package/index.ts
CHANGED
|
@@ -370,6 +370,32 @@ import { Schema as GetBadgedUsers } from "./api/getBadgedUsers"
|
|
|
370
370
|
export { Schema as SchemaGetBadgedUsers } from "./api/getBadgedUsers"
|
|
371
371
|
export const getBadgedUsers = handleApi({url:"/api/getBadgedUsers",...GetBadgedUsers})
|
|
372
372
|
|
|
373
|
+
// ./api/getBadgeLeaders.ts API
|
|
374
|
+
|
|
375
|
+
/*
|
|
376
|
+
export const Schema = {
|
|
377
|
+
input: z.strictObject({
|
|
378
|
+
limit: z.number().min(1).max(100).optional().default(100),
|
|
379
|
+
}),
|
|
380
|
+
output: z.object({
|
|
381
|
+
leaderboard: z.array(
|
|
382
|
+
z.object({
|
|
383
|
+
id: z.number(),
|
|
384
|
+
display_name: z.string(),
|
|
385
|
+
avatar_url: z.string().nullable(),
|
|
386
|
+
special_badge_count: z.number(),
|
|
387
|
+
earned_badges: z.array(z.string()),
|
|
388
|
+
all_badges: z.any(), // JSON type
|
|
389
|
+
})
|
|
390
|
+
),
|
|
391
|
+
total_count: z.number(),
|
|
392
|
+
error: z.string().optional(),
|
|
393
|
+
}),
|
|
394
|
+
};*/
|
|
395
|
+
import { Schema as GetBadgeLeaders } from "./api/getBadgeLeaders"
|
|
396
|
+
export { Schema as SchemaGetBadgeLeaders } from "./api/getBadgeLeaders"
|
|
397
|
+
export const getBadgeLeaders = handleApi({url:"/api/getBadgeLeaders",...GetBadgeLeaders})
|
|
398
|
+
|
|
373
399
|
// ./api/getBeatmapComments.ts API
|
|
374
400
|
|
|
375
401
|
/*
|
|
@@ -1079,16 +1105,16 @@ export const Schema = {
|
|
|
1079
1105
|
reign: z
|
|
1080
1106
|
.array(
|
|
1081
1107
|
z.object({
|
|
1082
|
-
id: z.number(),
|
|
1083
|
-
awarded_sp: z.number().nullable(),
|
|
1084
|
-
created_at: z.string(),
|
|
1108
|
+
id: z.number(),
|
|
1109
|
+
awarded_sp: z.number().nullable(),
|
|
1110
|
+
created_at: z.string(),
|
|
1085
1111
|
misses: z.number().nullable(),
|
|
1086
1112
|
mods: z.record(z.unknown()),
|
|
1087
1113
|
passed: z.boolean().nullable(),
|
|
1088
1114
|
songId: z.string().nullable(),
|
|
1089
1115
|
speed: z.number().nullable(),
|
|
1090
1116
|
spin: z.boolean(),
|
|
1091
|
-
beatmapHash: z.string().nullable(),
|
|
1117
|
+
beatmapHash: z.string().nullable(),
|
|
1092
1118
|
beatmapTitle: z.string().nullable(),
|
|
1093
1119
|
difficulty: z.number().nullable(),
|
|
1094
1120
|
beatmapNotes: z.number().optional().nullable(),
|
package/package.json
CHANGED
package/types/database.ts
CHANGED
|
@@ -7,6 +7,11 @@ export type Json =
|
|
|
7
7
|
| Json[]
|
|
8
8
|
|
|
9
9
|
export type Database = {
|
|
10
|
+
// Allows to automatically instantiate createClient with right options
|
|
11
|
+
// instead of createClient<Database, { PostgrestVersion: 'XX' }>(URL, KEY)
|
|
12
|
+
__InternalSupabase: {
|
|
13
|
+
PostgrestVersion: "12.2.3 (519615d)"
|
|
14
|
+
}
|
|
10
15
|
public: {
|
|
11
16
|
Tables: {
|
|
12
17
|
admin_actions: {
|
|
@@ -621,64 +626,47 @@ export type Database = {
|
|
|
621
626
|
}
|
|
622
627
|
Functions: {
|
|
623
628
|
admin_delete_user: {
|
|
624
|
-
Args: {
|
|
625
|
-
user_id: number
|
|
626
|
-
}
|
|
629
|
+
Args: { user_id: number }
|
|
627
630
|
Returns: boolean
|
|
628
631
|
}
|
|
629
632
|
admin_exclude_user: {
|
|
630
|
-
Args: {
|
|
631
|
-
user_id: number
|
|
632
|
-
}
|
|
633
|
+
Args: { user_id: number }
|
|
633
634
|
Returns: boolean
|
|
634
635
|
}
|
|
635
636
|
admin_invalidate_ranked_scores: {
|
|
636
|
-
Args: {
|
|
637
|
-
user_id: number
|
|
638
|
-
}
|
|
637
|
+
Args: { user_id: number }
|
|
639
638
|
Returns: number
|
|
640
639
|
}
|
|
641
|
-
admin_log_action:
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
admin_id: number
|
|
640
|
+
admin_log_action: {
|
|
641
|
+
Args:
|
|
642
|
+
| {
|
|
645
643
|
action_type: string
|
|
646
|
-
|
|
644
|
+
admin_id: number
|
|
647
645
|
details?: Json
|
|
646
|
+
target_id: number
|
|
648
647
|
}
|
|
649
|
-
|
|
650
|
-
}
|
|
651
|
-
| {
|
|
652
|
-
Args: {
|
|
653
|
-
admin_id: number
|
|
648
|
+
| {
|
|
654
649
|
action_type: string
|
|
655
|
-
|
|
650
|
+
admin_id: number
|
|
656
651
|
details?: Json
|
|
652
|
+
target_id: string
|
|
657
653
|
}
|
|
658
|
-
|
|
659
|
-
|
|
654
|
+
Returns: undefined
|
|
655
|
+
}
|
|
660
656
|
admin_profanity_clear: {
|
|
661
|
-
Args: {
|
|
662
|
-
user_id: number
|
|
663
|
-
}
|
|
657
|
+
Args: { user_id: number }
|
|
664
658
|
Returns: boolean
|
|
665
659
|
}
|
|
666
660
|
admin_remove_all_scores: {
|
|
667
|
-
Args: {
|
|
668
|
-
user_id: number
|
|
669
|
-
}
|
|
661
|
+
Args: { user_id: number }
|
|
670
662
|
Returns: number
|
|
671
663
|
}
|
|
672
664
|
admin_restrict_user: {
|
|
673
|
-
Args: {
|
|
674
|
-
user_id: number
|
|
675
|
-
}
|
|
665
|
+
Args: { user_id: number }
|
|
676
666
|
Returns: boolean
|
|
677
667
|
}
|
|
678
668
|
admin_search_users: {
|
|
679
|
-
Args: {
|
|
680
|
-
search_text: string
|
|
681
|
-
}
|
|
669
|
+
Args: { search_text: string }
|
|
682
670
|
Returns: {
|
|
683
671
|
about_me: string | null
|
|
684
672
|
avatar_url: string | null
|
|
@@ -705,46 +693,55 @@ export type Database = {
|
|
|
705
693
|
}[]
|
|
706
694
|
}
|
|
707
695
|
admin_silence_user: {
|
|
708
|
-
Args: {
|
|
709
|
-
user_id: number
|
|
710
|
-
}
|
|
696
|
+
Args: { user_id: number }
|
|
711
697
|
Returns: boolean
|
|
712
698
|
}
|
|
713
699
|
admin_unban_user: {
|
|
714
|
-
Args: {
|
|
715
|
-
user_id: number
|
|
716
|
-
}
|
|
700
|
+
Args: { user_id: number }
|
|
717
701
|
Returns: boolean
|
|
718
702
|
}
|
|
719
|
-
|
|
720
|
-
Args: {
|
|
721
|
-
page_number?: number
|
|
722
|
-
items_per_page?: number
|
|
723
|
-
}
|
|
703
|
+
get_badge_leaderboard: {
|
|
704
|
+
Args: { p_limit?: number }
|
|
724
705
|
Returns: {
|
|
706
|
+
all_badges: Json
|
|
707
|
+
avatar_url: string
|
|
708
|
+
display_name: string
|
|
709
|
+
earned_badges: string[]
|
|
725
710
|
id: number
|
|
726
|
-
|
|
711
|
+
special_badge_count: number
|
|
712
|
+
}[]
|
|
713
|
+
}
|
|
714
|
+
get_clan_leaderboard: {
|
|
715
|
+
Args: { items_per_page?: number; page_number?: number }
|
|
716
|
+
Returns: {
|
|
727
717
|
acronym: string
|
|
728
718
|
avatar_url: string
|
|
729
719
|
description: string
|
|
720
|
+
id: number
|
|
730
721
|
member_count: number
|
|
731
|
-
|
|
722
|
+
name: string
|
|
732
723
|
total_pages: number
|
|
724
|
+
total_skill_points: number
|
|
733
725
|
}[]
|
|
734
726
|
}
|
|
735
727
|
get_collections_v1: {
|
|
736
|
-
Args: {
|
|
737
|
-
page_number?: number
|
|
738
|
-
items_per_page?: number
|
|
739
|
-
}
|
|
728
|
+
Args: { items_per_page?: number; page_number?: number }
|
|
740
729
|
Returns: {
|
|
741
|
-
|
|
742
|
-
title: string
|
|
743
|
-
description: string
|
|
730
|
+
beatmap_count: number
|
|
744
731
|
created_at: string
|
|
732
|
+
description: string
|
|
733
|
+
id: number
|
|
745
734
|
owner: number
|
|
746
|
-
beatmap_count: number
|
|
747
735
|
star1: number
|
|
736
|
+
star10: number
|
|
737
|
+
star11: number
|
|
738
|
+
star12: number
|
|
739
|
+
star13: number
|
|
740
|
+
star14: number
|
|
741
|
+
star15: number
|
|
742
|
+
star16: number
|
|
743
|
+
star17: number
|
|
744
|
+
star18: number
|
|
748
745
|
star2: number
|
|
749
746
|
star3: number
|
|
750
747
|
star4: number
|
|
@@ -753,6 +750,27 @@ export type Database = {
|
|
|
753
750
|
star7: number
|
|
754
751
|
star8: number
|
|
755
752
|
star9: number
|
|
753
|
+
title: string
|
|
754
|
+
total_pages: number
|
|
755
|
+
}[]
|
|
756
|
+
}
|
|
757
|
+
get_collections_v2: {
|
|
758
|
+
Args:
|
|
759
|
+
| {
|
|
760
|
+
items_per_page?: number
|
|
761
|
+
owner_filter?: number
|
|
762
|
+
page_number?: number
|
|
763
|
+
}
|
|
764
|
+
| { items_per_page?: number; page_number?: number }
|
|
765
|
+
Returns: {
|
|
766
|
+
beatmap_count: number
|
|
767
|
+
created_at: string
|
|
768
|
+
description: string
|
|
769
|
+
id: number
|
|
770
|
+
owner: number
|
|
771
|
+
owner_avatar_url: string
|
|
772
|
+
owner_username: string
|
|
773
|
+
star1: number
|
|
756
774
|
star10: number
|
|
757
775
|
star11: number
|
|
758
776
|
star12: number
|
|
@@ -762,105 +780,33 @@ export type Database = {
|
|
|
762
780
|
star16: number
|
|
763
781
|
star17: number
|
|
764
782
|
star18: number
|
|
783
|
+
star2: number
|
|
784
|
+
star3: number
|
|
785
|
+
star4: number
|
|
786
|
+
star5: number
|
|
787
|
+
star6: number
|
|
788
|
+
star7: number
|
|
789
|
+
star8: number
|
|
790
|
+
star9: number
|
|
791
|
+
title: string
|
|
765
792
|
total_pages: number
|
|
766
793
|
}[]
|
|
767
794
|
}
|
|
768
|
-
get_collections_v2:
|
|
769
|
-
| {
|
|
770
|
-
Args: {
|
|
771
|
-
page_number?: number
|
|
772
|
-
items_per_page?: number
|
|
773
|
-
}
|
|
774
|
-
Returns: {
|
|
775
|
-
id: number
|
|
776
|
-
title: string
|
|
777
|
-
description: string
|
|
778
|
-
created_at: string
|
|
779
|
-
owner: number
|
|
780
|
-
owner_username: string
|
|
781
|
-
owner_avatar_url: string
|
|
782
|
-
beatmap_count: number
|
|
783
|
-
star1: number
|
|
784
|
-
star2: number
|
|
785
|
-
star3: number
|
|
786
|
-
star4: number
|
|
787
|
-
star5: number
|
|
788
|
-
star6: number
|
|
789
|
-
star7: number
|
|
790
|
-
star8: number
|
|
791
|
-
star9: number
|
|
792
|
-
star10: number
|
|
793
|
-
star11: number
|
|
794
|
-
star12: number
|
|
795
|
-
star13: number
|
|
796
|
-
star14: number
|
|
797
|
-
star15: number
|
|
798
|
-
star16: number
|
|
799
|
-
star17: number
|
|
800
|
-
star18: number
|
|
801
|
-
total_pages: number
|
|
802
|
-
}[]
|
|
803
|
-
}
|
|
804
|
-
| {
|
|
805
|
-
Args: {
|
|
806
|
-
page_number?: number
|
|
807
|
-
items_per_page?: number
|
|
808
|
-
owner_filter?: number
|
|
809
|
-
}
|
|
810
|
-
Returns: {
|
|
811
|
-
id: number
|
|
812
|
-
title: string
|
|
813
|
-
description: string
|
|
814
|
-
created_at: string
|
|
815
|
-
owner: number
|
|
816
|
-
owner_username: string
|
|
817
|
-
owner_avatar_url: string
|
|
818
|
-
beatmap_count: number
|
|
819
|
-
star1: number
|
|
820
|
-
star2: number
|
|
821
|
-
star3: number
|
|
822
|
-
star4: number
|
|
823
|
-
star5: number
|
|
824
|
-
star6: number
|
|
825
|
-
star7: number
|
|
826
|
-
star8: number
|
|
827
|
-
star9: number
|
|
828
|
-
star10: number
|
|
829
|
-
star11: number
|
|
830
|
-
star12: number
|
|
831
|
-
star13: number
|
|
832
|
-
star14: number
|
|
833
|
-
star15: number
|
|
834
|
-
star16: number
|
|
835
|
-
star17: number
|
|
836
|
-
star18: number
|
|
837
|
-
total_pages: number
|
|
838
|
-
}[]
|
|
839
|
-
}
|
|
840
795
|
get_collections_v3: {
|
|
841
796
|
Args: {
|
|
842
|
-
page_number?: number
|
|
843
797
|
items_per_page?: number
|
|
844
798
|
owner_filter?: number
|
|
799
|
+
page_number?: number
|
|
845
800
|
}
|
|
846
801
|
Returns: {
|
|
847
|
-
|
|
848
|
-
title: string
|
|
849
|
-
description: string
|
|
802
|
+
beatmap_count: number
|
|
850
803
|
created_at: string
|
|
804
|
+
description: string
|
|
805
|
+
id: number
|
|
851
806
|
owner: number
|
|
852
|
-
owner_username: string
|
|
853
807
|
owner_avatar_url: string
|
|
854
|
-
|
|
808
|
+
owner_username: string
|
|
855
809
|
star1: number
|
|
856
|
-
star2: number
|
|
857
|
-
star3: number
|
|
858
|
-
star4: number
|
|
859
|
-
star5: number
|
|
860
|
-
star6: number
|
|
861
|
-
star7: number
|
|
862
|
-
star8: number
|
|
863
|
-
star9: number
|
|
864
810
|
star10: number
|
|
865
811
|
star11: number
|
|
866
812
|
star12: number
|
|
@@ -870,36 +816,36 @@ export type Database = {
|
|
|
870
816
|
star16: number
|
|
871
817
|
star17: number
|
|
872
818
|
star18: number
|
|
819
|
+
star2: number
|
|
820
|
+
star3: number
|
|
821
|
+
star4: number
|
|
822
|
+
star5: number
|
|
823
|
+
star6: number
|
|
824
|
+
star7: number
|
|
825
|
+
star8: number
|
|
826
|
+
star9: number
|
|
827
|
+
title: string
|
|
873
828
|
total_pages: number
|
|
874
829
|
}[]
|
|
875
830
|
}
|
|
876
831
|
get_collections_v4: {
|
|
877
832
|
Args: {
|
|
878
|
-
|
|
833
|
+
author_filter?: string
|
|
879
834
|
items_per_page?: number
|
|
835
|
+
min_beatmaps?: number
|
|
880
836
|
owner_filter?: number
|
|
837
|
+
page_number?: number
|
|
881
838
|
search_query?: string
|
|
882
|
-
author_filter?: string
|
|
883
|
-
min_beatmaps?: number
|
|
884
839
|
}
|
|
885
840
|
Returns: {
|
|
886
|
-
|
|
887
|
-
title: string
|
|
888
|
-
description: string
|
|
841
|
+
beatmap_count: number
|
|
889
842
|
created_at: string
|
|
843
|
+
description: string
|
|
844
|
+
id: number
|
|
890
845
|
owner: number
|
|
891
|
-
owner_username: string
|
|
892
846
|
owner_avatar_url: string
|
|
893
|
-
|
|
847
|
+
owner_username: string
|
|
894
848
|
star1: number
|
|
895
|
-
star2: number
|
|
896
|
-
star3: number
|
|
897
|
-
star4: number
|
|
898
|
-
star5: number
|
|
899
|
-
star6: number
|
|
900
|
-
star7: number
|
|
901
|
-
star8: number
|
|
902
|
-
star9: number
|
|
903
849
|
star10: number
|
|
904
850
|
star11: number
|
|
905
851
|
star12: number
|
|
@@ -909,17 +855,26 @@ export type Database = {
|
|
|
909
855
|
star16: number
|
|
910
856
|
star17: number
|
|
911
857
|
star18: number
|
|
858
|
+
star2: number
|
|
859
|
+
star3: number
|
|
860
|
+
star4: number
|
|
861
|
+
star5: number
|
|
862
|
+
star6: number
|
|
863
|
+
star7: number
|
|
864
|
+
star8: number
|
|
865
|
+
star9: number
|
|
866
|
+
title: string
|
|
912
867
|
total_pages: number
|
|
913
868
|
}[]
|
|
914
869
|
}
|
|
915
870
|
get_top_scores_for_beatmap: {
|
|
916
|
-
Args: {
|
|
917
|
-
beatmap_hash: string
|
|
918
|
-
}
|
|
871
|
+
Args: { beatmap_hash: string }
|
|
919
872
|
Returns: {
|
|
920
|
-
|
|
873
|
+
accuracy: number
|
|
874
|
+
avatar_url: string
|
|
921
875
|
awarded_sp: number
|
|
922
876
|
created_at: string
|
|
877
|
+
id: number
|
|
923
878
|
misses: number
|
|
924
879
|
mods: Json
|
|
925
880
|
passed: boolean
|
|
@@ -929,18 +884,16 @@ export type Database = {
|
|
|
929
884
|
spin: boolean
|
|
930
885
|
userid: number
|
|
931
886
|
username: string
|
|
932
|
-
avatar_url: string
|
|
933
|
-
accuracy: number
|
|
934
887
|
}[]
|
|
935
888
|
}
|
|
936
889
|
get_top_scores_for_beatmap2: {
|
|
937
|
-
Args: {
|
|
938
|
-
beatmap_hash: string
|
|
939
|
-
}
|
|
890
|
+
Args: { beatmap_hash: string }
|
|
940
891
|
Returns: {
|
|
941
|
-
|
|
892
|
+
accuracy: number
|
|
893
|
+
avatar_url: string
|
|
942
894
|
awarded_sp: number
|
|
943
895
|
created_at: string
|
|
896
|
+
id: number
|
|
944
897
|
misses: number
|
|
945
898
|
mods: Json
|
|
946
899
|
passed: boolean
|
|
@@ -950,57 +903,48 @@ export type Database = {
|
|
|
950
903
|
spin: boolean
|
|
951
904
|
userid: number
|
|
952
905
|
username: string
|
|
953
|
-
avatar_url: string
|
|
954
|
-
accuracy: number
|
|
955
906
|
}[]
|
|
956
907
|
}
|
|
908
|
+
get_user_activity: {
|
|
909
|
+
Args: { score_limit?: number; user_id: number }
|
|
910
|
+
Returns: Json
|
|
911
|
+
}
|
|
957
912
|
get_user_by_email: {
|
|
913
|
+
Args: { email_address: string }
|
|
914
|
+
Returns: Json
|
|
915
|
+
}
|
|
916
|
+
get_user_reigning_scores: {
|
|
917
|
+
Args: { page_size: number; userid: number } | { userid: number }
|
|
918
|
+
Returns: {
|
|
919
|
+
awarded_sp: number
|
|
920
|
+
beatmaphash: string
|
|
921
|
+
beatmaptitle: string
|
|
922
|
+
created_at: string
|
|
923
|
+
difficulty: number
|
|
924
|
+
id: number
|
|
925
|
+
misses: number
|
|
926
|
+
mods: Json
|
|
927
|
+
notes: number
|
|
928
|
+
passed: boolean
|
|
929
|
+
replayhwid: string
|
|
930
|
+
songid: string
|
|
931
|
+
speed: number
|
|
932
|
+
spin: boolean
|
|
933
|
+
}[]
|
|
934
|
+
}
|
|
935
|
+
get_user_scores_summary: {
|
|
936
|
+
Args: { limit_param?: number; userid: number }
|
|
937
|
+
Returns: Json
|
|
938
|
+
}
|
|
939
|
+
grant_special_badges: {
|
|
958
940
|
Args: {
|
|
959
|
-
|
|
941
|
+
p_beatmap_id: number
|
|
942
|
+
p_passed?: boolean
|
|
943
|
+
p_spin?: boolean
|
|
944
|
+
p_user_id: number
|
|
960
945
|
}
|
|
961
946
|
Returns: Json
|
|
962
947
|
}
|
|
963
|
-
get_user_reigning_scores:
|
|
964
|
-
| {
|
|
965
|
-
Args: {
|
|
966
|
-
userid: number
|
|
967
|
-
}
|
|
968
|
-
Returns: {
|
|
969
|
-
id: number
|
|
970
|
-
awarded_sp: number
|
|
971
|
-
created_at: string
|
|
972
|
-
misses: number
|
|
973
|
-
mods: Json
|
|
974
|
-
passed: boolean
|
|
975
|
-
replayhwid: string
|
|
976
|
-
songid: string
|
|
977
|
-
speed: number
|
|
978
|
-
spin: boolean
|
|
979
|
-
beatmaphash: string
|
|
980
|
-
}[]
|
|
981
|
-
}
|
|
982
|
-
| {
|
|
983
|
-
Args: {
|
|
984
|
-
userid: number
|
|
985
|
-
page_size: number
|
|
986
|
-
}
|
|
987
|
-
Returns: {
|
|
988
|
-
id: number
|
|
989
|
-
awarded_sp: number
|
|
990
|
-
created_at: string
|
|
991
|
-
misses: number
|
|
992
|
-
mods: Json
|
|
993
|
-
passed: boolean
|
|
994
|
-
replayhwid: string
|
|
995
|
-
songid: string
|
|
996
|
-
speed: number
|
|
997
|
-
spin: boolean
|
|
998
|
-
beatmaphash: string
|
|
999
|
-
beatmaptitle: string
|
|
1000
|
-
difficulty: number
|
|
1001
|
-
notes: number
|
|
1002
|
-
}[]
|
|
1003
|
-
}
|
|
1004
948
|
}
|
|
1005
949
|
Enums: {
|
|
1006
950
|
banTypes: "cool" | "silenced" | "restricted" | "excluded"
|
|
@@ -1012,27 +956,33 @@ export type Database = {
|
|
|
1012
956
|
}
|
|
1013
957
|
}
|
|
1014
958
|
|
|
1015
|
-
type
|
|
959
|
+
type DatabaseWithoutInternals = Omit<Database, "__InternalSupabase">
|
|
960
|
+
|
|
961
|
+
type DefaultSchema = DatabaseWithoutInternals[Extract<keyof Database, "public">]
|
|
1016
962
|
|
|
1017
963
|
export type Tables<
|
|
1018
|
-
|
|
1019
|
-
| keyof (
|
|
1020
|
-
| { schema: keyof
|
|
1021
|
-
TableName extends
|
|
1022
|
-
|
|
1023
|
-
|
|
964
|
+
DefaultSchemaTableNameOrOptions extends
|
|
965
|
+
| keyof (DefaultSchema["Tables"] & DefaultSchema["Views"])
|
|
966
|
+
| { schema: keyof DatabaseWithoutInternals },
|
|
967
|
+
TableName extends DefaultSchemaTableNameOrOptions extends {
|
|
968
|
+
schema: keyof DatabaseWithoutInternals
|
|
969
|
+
}
|
|
970
|
+
? keyof (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] &
|
|
971
|
+
DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Views"])
|
|
1024
972
|
: never = never,
|
|
1025
|
-
> =
|
|
1026
|
-
|
|
1027
|
-
|
|
973
|
+
> = DefaultSchemaTableNameOrOptions extends {
|
|
974
|
+
schema: keyof DatabaseWithoutInternals
|
|
975
|
+
}
|
|
976
|
+
? (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] &
|
|
977
|
+
DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Views"])[TableName] extends {
|
|
1028
978
|
Row: infer R
|
|
1029
979
|
}
|
|
1030
980
|
? R
|
|
1031
981
|
: never
|
|
1032
|
-
:
|
|
1033
|
-
|
|
1034
|
-
? (
|
|
1035
|
-
|
|
982
|
+
: DefaultSchemaTableNameOrOptions extends keyof (DefaultSchema["Tables"] &
|
|
983
|
+
DefaultSchema["Views"])
|
|
984
|
+
? (DefaultSchema["Tables"] &
|
|
985
|
+
DefaultSchema["Views"])[DefaultSchemaTableNameOrOptions] extends {
|
|
1036
986
|
Row: infer R
|
|
1037
987
|
}
|
|
1038
988
|
? R
|
|
@@ -1040,20 +990,24 @@ export type Tables<
|
|
|
1040
990
|
: never
|
|
1041
991
|
|
|
1042
992
|
export type TablesInsert<
|
|
1043
|
-
|
|
1044
|
-
| keyof
|
|
1045
|
-
| { schema: keyof
|
|
1046
|
-
TableName extends
|
|
1047
|
-
|
|
993
|
+
DefaultSchemaTableNameOrOptions extends
|
|
994
|
+
| keyof DefaultSchema["Tables"]
|
|
995
|
+
| { schema: keyof DatabaseWithoutInternals },
|
|
996
|
+
TableName extends DefaultSchemaTableNameOrOptions extends {
|
|
997
|
+
schema: keyof DatabaseWithoutInternals
|
|
998
|
+
}
|
|
999
|
+
? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"]
|
|
1048
1000
|
: never = never,
|
|
1049
|
-
> =
|
|
1050
|
-
|
|
1001
|
+
> = DefaultSchemaTableNameOrOptions extends {
|
|
1002
|
+
schema: keyof DatabaseWithoutInternals
|
|
1003
|
+
}
|
|
1004
|
+
? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends {
|
|
1051
1005
|
Insert: infer I
|
|
1052
1006
|
}
|
|
1053
1007
|
? I
|
|
1054
1008
|
: never
|
|
1055
|
-
:
|
|
1056
|
-
?
|
|
1009
|
+
: DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"]
|
|
1010
|
+
? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends {
|
|
1057
1011
|
Insert: infer I
|
|
1058
1012
|
}
|
|
1059
1013
|
? I
|
|
@@ -1061,20 +1015,24 @@ export type TablesInsert<
|
|
|
1061
1015
|
: never
|
|
1062
1016
|
|
|
1063
1017
|
export type TablesUpdate<
|
|
1064
|
-
|
|
1065
|
-
| keyof
|
|
1066
|
-
| { schema: keyof
|
|
1067
|
-
TableName extends
|
|
1068
|
-
|
|
1018
|
+
DefaultSchemaTableNameOrOptions extends
|
|
1019
|
+
| keyof DefaultSchema["Tables"]
|
|
1020
|
+
| { schema: keyof DatabaseWithoutInternals },
|
|
1021
|
+
TableName extends DefaultSchemaTableNameOrOptions extends {
|
|
1022
|
+
schema: keyof DatabaseWithoutInternals
|
|
1023
|
+
}
|
|
1024
|
+
? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"]
|
|
1069
1025
|
: never = never,
|
|
1070
|
-
> =
|
|
1071
|
-
|
|
1026
|
+
> = DefaultSchemaTableNameOrOptions extends {
|
|
1027
|
+
schema: keyof DatabaseWithoutInternals
|
|
1028
|
+
}
|
|
1029
|
+
? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends {
|
|
1072
1030
|
Update: infer U
|
|
1073
1031
|
}
|
|
1074
1032
|
? U
|
|
1075
1033
|
: never
|
|
1076
|
-
:
|
|
1077
|
-
?
|
|
1034
|
+
: DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"]
|
|
1035
|
+
? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends {
|
|
1078
1036
|
Update: infer U
|
|
1079
1037
|
}
|
|
1080
1038
|
? U
|
|
@@ -1082,29 +1040,44 @@ export type TablesUpdate<
|
|
|
1082
1040
|
: never
|
|
1083
1041
|
|
|
1084
1042
|
export type Enums<
|
|
1085
|
-
|
|
1086
|
-
| keyof
|
|
1087
|
-
| { schema: keyof
|
|
1088
|
-
EnumName extends
|
|
1089
|
-
|
|
1043
|
+
DefaultSchemaEnumNameOrOptions extends
|
|
1044
|
+
| keyof DefaultSchema["Enums"]
|
|
1045
|
+
| { schema: keyof DatabaseWithoutInternals },
|
|
1046
|
+
EnumName extends DefaultSchemaEnumNameOrOptions extends {
|
|
1047
|
+
schema: keyof DatabaseWithoutInternals
|
|
1048
|
+
}
|
|
1049
|
+
? keyof DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"]
|
|
1090
1050
|
: never = never,
|
|
1091
|
-
> =
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1051
|
+
> = DefaultSchemaEnumNameOrOptions extends {
|
|
1052
|
+
schema: keyof DatabaseWithoutInternals
|
|
1053
|
+
}
|
|
1054
|
+
? DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"][EnumName]
|
|
1055
|
+
: DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema["Enums"]
|
|
1056
|
+
? DefaultSchema["Enums"][DefaultSchemaEnumNameOrOptions]
|
|
1095
1057
|
: never
|
|
1096
1058
|
|
|
1097
1059
|
export type CompositeTypes<
|
|
1098
1060
|
PublicCompositeTypeNameOrOptions extends
|
|
1099
|
-
| keyof
|
|
1100
|
-
| { schema: keyof
|
|
1061
|
+
| keyof DefaultSchema["CompositeTypes"]
|
|
1062
|
+
| { schema: keyof DatabaseWithoutInternals },
|
|
1101
1063
|
CompositeTypeName extends PublicCompositeTypeNameOrOptions extends {
|
|
1102
|
-
schema: keyof
|
|
1064
|
+
schema: keyof DatabaseWithoutInternals
|
|
1103
1065
|
}
|
|
1104
|
-
? keyof
|
|
1066
|
+
? keyof DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"]
|
|
1105
1067
|
: never = never,
|
|
1106
|
-
> = PublicCompositeTypeNameOrOptions extends {
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1068
|
+
> = PublicCompositeTypeNameOrOptions extends {
|
|
1069
|
+
schema: keyof DatabaseWithoutInternals
|
|
1070
|
+
}
|
|
1071
|
+
? DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName]
|
|
1072
|
+
: PublicCompositeTypeNameOrOptions extends keyof DefaultSchema["CompositeTypes"]
|
|
1073
|
+
? DefaultSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions]
|
|
1110
1074
|
: never
|
|
1075
|
+
|
|
1076
|
+
export const Constants = {
|
|
1077
|
+
public: {
|
|
1078
|
+
Enums: {
|
|
1079
|
+
banTypes: ["cool", "silenced", "restricted", "excluded"],
|
|
1080
|
+
discordWebhookType: ["maps", "scores"],
|
|
1081
|
+
},
|
|
1082
|
+
},
|
|
1083
|
+
} as const
|