old backend core lib
This commit is contained in:
+67
-1
@@ -14,8 +14,13 @@ import type {
|
||||
Invitation,
|
||||
OverlaySettings,
|
||||
Session,
|
||||
SongRequestItem,
|
||||
SongRequestPage,
|
||||
SongRequestSettings,
|
||||
TotpEnrollment,
|
||||
} from './types'
|
||||
import { normalizeThemeId } from './themes'
|
||||
import { defaultOverlaySettings, defaultSongRequestSettings } from './types'
|
||||
|
||||
export class ApiError extends Error {
|
||||
readonly status: number
|
||||
@@ -172,7 +177,68 @@ export function normalizeComponents(value: unknown): ComponentSummary[] {
|
||||
|
||||
export function normalizeSettings(value: unknown): OverlaySettings {
|
||||
const root = object(value)
|
||||
return (root.settings ?? value) as OverlaySettings
|
||||
const settings = object(root.settings ?? value)
|
||||
return {
|
||||
...defaultOverlaySettings,
|
||||
...(settings as Partial<OverlaySettings>),
|
||||
themeId: normalizeThemeId(settings.themeId),
|
||||
}
|
||||
}
|
||||
|
||||
export function normalizeSongRequestSettings(value: unknown): SongRequestSettings {
|
||||
const root = object(value)
|
||||
const settings = object(root.settings ?? value)
|
||||
return {
|
||||
...defaultSongRequestSettings,
|
||||
...(settings as Partial<SongRequestSettings>),
|
||||
themeId: normalizeThemeId(settings.themeId),
|
||||
}
|
||||
}
|
||||
|
||||
export function normalizeSongRequestItem(value: unknown): SongRequestItem | undefined {
|
||||
const item = object(value)
|
||||
const requester = object(item.requester)
|
||||
if (typeof item.id !== 'string' || typeof item.title !== 'string') return undefined
|
||||
const status = String(item.status)
|
||||
if (!['current', 'queued', 'completed', 'cancelled'].includes(status)) return undefined
|
||||
return {
|
||||
id: item.id,
|
||||
title: item.title,
|
||||
requester: { uid: String(requester.uid ?? ''), name: String(requester.name ?? '直播间观众') },
|
||||
status: status as SongRequestItem['status'],
|
||||
queuePosition: Number(item.queuePosition ?? 0),
|
||||
requestedAt: String(item.requestedAt ?? ''),
|
||||
startedAt:
|
||||
typeof item.startedAt === 'string' || item.startedAt === null ? item.startedAt : undefined,
|
||||
finishedAt:
|
||||
typeof item.finishedAt === 'string' || item.finishedAt === null ? item.finishedAt : undefined,
|
||||
averageScore:
|
||||
typeof item.averageScore === 'number' || item.averageScore === null
|
||||
? item.averageScore
|
||||
: undefined,
|
||||
ratingCount: Number(item.ratingCount ?? 0),
|
||||
}
|
||||
}
|
||||
|
||||
export function normalizeSongRequestPage(value: unknown): SongRequestPage {
|
||||
const root = object(value)
|
||||
const current = normalizeSongRequestItem(root.current)
|
||||
const summary = object(root.summary)
|
||||
return {
|
||||
revision: Number(root.revision ?? 0),
|
||||
current: current ?? null,
|
||||
items: (Array.isArray(root.items) ? root.items : [])
|
||||
.map(normalizeSongRequestItem)
|
||||
.filter((item): item is SongRequestItem => Boolean(item)),
|
||||
nextCursor: typeof root.nextCursor === 'number' ? root.nextCursor : null,
|
||||
summary: {
|
||||
activeCount: Number(summary.activeCount ?? 0),
|
||||
queuedCount: Number(summary.queuedCount ?? 0),
|
||||
completedCount: Number(summary.completedCount ?? 0),
|
||||
cancelledCount: Number(summary.cancelledCount ?? 0),
|
||||
ratingCount: Number(summary.ratingCount ?? 0),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
export function normalizeSource(value: unknown): CookieCloudSource {
|
||||
|
||||
Reference in New Issue
Block a user