Files
bs-manager/src/shared/models/maps/beat-saver.model.ts
T
2024-07-27 16:06:07 +02:00

333 lines
6.9 KiB
TypeScript

import { ObjectValues } from "shared/helpers/type.helpers";
import { SongDetailDiffCharactertistic, SongDiffName } from "./song-details-cache/song-details-cache.model";
export interface BsvMapDetail {
automapper: boolean;
createdAt: string;
curatedAt: BsvInstant;
curator: BsvUserDetail;
deletedAt: BsvInstant;
description: string;
id: string;
lastPublishedAt: BsvInstant;
metadata: BsvMapDetailMetadata;
name: string;
qualified: boolean;
ranked: boolean;
blQualified: boolean
blRanked: boolean
declaredAi: ObjectValues<typeof BsvDeclaredAi>;
stats: BsvMapStats;
tags: MapTag[];
updatedAt: BsvInstant;
uploaded: BsvInstant;
uploader: BsvUserDetail;
versions: BsvMapVersion[];
}
export interface BsvInstant {
epochSeconds: number;
nanosecondsOfSecond: number;
value: string;
}
export interface BsvUserDetail {
admin: boolean;
avatar: string;
curator: boolean;
description: string;
email: string;
followData: BsvUserFollowData;
hash: string;
id: number;
name: string;
stats: BsvUserStats;
testplay: boolean;
type: string;
uniqueSet: boolean;
uploadLimit: number;
verifiedMapper: boolean;
}
export interface BsvUserFollowData {
followers: number;
following: boolean;
follows: number;
}
export interface BsvUserStats {
avgBpm: number;
avgDuration: number;
avgScore: number;
diffStats: BsvUserDiffStats;
firstUpload: BsvInstant;
lastUpload: BsvInstant;
rankedMaps: number;
totalDownvotes: number;
totalMaps: number;
totalUpvotes: number;
}
export interface BsvUserDiffStats {
easy: number;
expert: number;
expertPlus: number;
hard: number;
normal: number;
total: number;
}
export interface BsvMapDetailMetadata {
bpm: number;
duration: number;
levelAuthorName: string;
songAuthorName: string;
songName: string;
songSubName: string;
}
export interface BsvMapStats {
downloads: number;
downvotes: number;
plays: number;
score: number;
scoreOneDP: number;
upvotes: number;
}
export interface BsvMapVersion {
coverURL: string;
createdAt: BsvInstant;
diffs: BsvMapDifficulty[];
downloadURL: string;
feedback: string;
hash: string;
key: string;
previewURL: string;
sageScore: number;
scheduledAt: BsvInstant;
state: string;
testplayAt: BsvInstant;
testplays: BsvMapTestplay[];
}
export interface BsvMapTestplay {
createdAt: BsvInstant;
feedback: string;
feedbackAt: BsvInstant;
user: BsvUserDetail;
video: string;
}
export interface BsvMapDifficulty {
bombs: number;
characteristic: SongDetailDiffCharactertistic;
chroma: boolean;
cinema: boolean;
difficulty: SongDiffName;
events: number;
length: number;
maxScore: number;
me: boolean;
ne: boolean;
njs: number;
notes: number;
nps: number;
obstacles: number;
offset: number;
paritySummary: BsvMapParitySummary;
seconds: number;
stars: number;
}
export interface BsvMapParitySummary {
errors: number;
resets: number;
warns: number;
}
export enum MapStyle {
Dance = "dance",
Swing = "swing",
Nightcore = "nightcore",
Folk = "folk",
Family = "family",
Ambient = "ambient",
Funk = "funk",
Jazz = "jazz",
Soul = "soul",
Speedcore = "speedcore",
Punk = "punk",
Rb = "rb",
Holiday = "holiday",
Vocaloid = "vocaloid",
JRock = "j-rock",
Trance = "trance",
DrumBass = "drumbass",
Comedy = "comedy",
Instrumental = "instrumental",
Hardcore = "hardcore",
KPop = "k-pop",
Indie = "indie",
Techno = "techno",
House = "house",
Game = "game",
Film = "film",
Alt = "alt",
Dubstep = "dubstep",
Metal = "metal",
Anime = "anime",
Hiphop = "hiphop",
JPop = "j-pop",
Rock = "rock",
Pop = "pop",
Electronic = "electronic",
ClassicalOrchestral = "classical-orchestral"
}
// MapType Enum
export enum MapType {
Accuracy = "accuracy",
Balanced = "balanced",
Challenge = "challenge",
Dancestyle = "dance-style",
Fitness = "fitness",
Speed = "speed",
Tech = "tech"
}
export const MapTags = { ...MapStyle, ...MapType };
export type MapTag = MapStyle | MapType;
export enum MapRequirement {
Chroma = "chroma",
Noodle = "noodle",
Me = "me",
Cinema = "cinema"
}
export enum MapSpecificity {
Automapper = "automapper",
Ranked = "ranked",
Curated = "curated",
Verified = "verified",
FullSpread = "fullSpread"
}
// [ Admin, Uploader, SageScore, None ]
export const BsvDeclaredAi = {
Admin: "Admin",
Uploader: "Uploader",
SageScore: "SageScore",
None: "None"
} as const;
export interface MapFilter {
automapper?: boolean;
chroma?: boolean;
cinema?: boolean;
noodle?: boolean;
me?: boolean;
curated?: boolean;
verified?: boolean;
from?: number;
to?: number;
fullSpread?: boolean;
ranked?: boolean;
installed?: boolean;
minDuration?: number;
maxDuration?: number;
minNps?: number;
maxNps?: number;
enabledTags?: Set<MapTag>;
excludedTags?: Set<MapTag>;
}
export interface SearchResponse {
docs: BsvMapDetail[];
redirect: string;
}
export interface PlaylistSearchResponse {
docs: BsvPlaylist[];
}
export interface SearchParams {
sortOrder: BsvSearchOrder;
filter?: MapFilter;
page?: number;
q?: string;
includeEmpty?: boolean;
}
export enum BsvSearchOrder {
Latest = "Latest",
Relevance = "Relevance",
Rating = "Rating",
Curated = "Curated"
}
export interface BsvMapDetailWithOrder {
map: BsvMapDetail;
order: number;
}
export interface BsvPlaylist {
createdAt: BsvInstant;
curatedAt: BsvInstant;
curator: BsvUserDetail;
deletedAt: BsvInstant;
description: string;
downloadURL: string;
name: string;
owner: BsvUserDetail;
playlistId: number;
playlistImage: string;
playlistImage512: string;
songsChangedAt: BsvInstant;
stats: BsvPlaylistStats;
updatedAt: BsvInstant;
type: BsvPlaylistType;
}
export enum BsvPlaylistType {
Private = "Private",
Public = "Public",
System = "System",
Search = "Search"
}
export interface BsvPlaylistStats {
avgScore: number;
downVotes: number;
mapperCount: number;
maxNps: number;
maxNpsTwoDP: number;
minNps: number;
minNpsTwoDP: number;
scoreOneDP: number;
totalDuration: number;
totalMaps: number;
upVotes: number;
}
export interface BsvPlaylistPage {
maps: BsvMapDetailWithOrder[];
playlist: BsvPlaylist;
}
export interface PlaylistSearchParams {
q?: string;
page?: number;
sortOrder: BsvSearchOrder;
from?: string;
to?: string;
minNps?: number;
maxNps?: number;
curated?: boolean;
verified?: boolean;
includeEmpty?: boolean;
}