193 lines
6.0 KiB
TypeScript
193 lines
6.0 KiB
TypeScript
import type { JumpHopSessionSnapshotResponse, JumpHopWorkSummaryResponse } from '../../../packages/shared/src/contracts/jumpHop';
|
|
import type { PuzzleAgentSessionSnapshot } from '../../../packages/shared/src/contracts/puzzleAgentSession';
|
|
import type { PuzzleWorkSummary } from '../../../packages/shared/src/contracts/puzzleWorkSummary';
|
|
import type { SquareHoleSessionSnapshot } from '../../../packages/shared/src/contracts/squareHoleAgent';
|
|
import type { SquareHoleWorkProfile } from '../../../packages/shared/src/contracts/squareHoleWorks';
|
|
import type {
|
|
VisualNovelAgentSessionSnapshot,
|
|
VisualNovelWorkDetail,
|
|
} from '../../../packages/shared/src/contracts/visualNovel';
|
|
import type {
|
|
WoodenFishSessionSnapshotResponse,
|
|
WoodenFishWorkProfileResponse,
|
|
WoodenFishWorkSummaryResponse,
|
|
} from '../../../packages/shared/src/contracts/woodenFish';
|
|
import { normalizeCreationUrlValue } from './platformCreationUrlStateModel';
|
|
import {
|
|
buildPuzzleResultProfileId,
|
|
buildPuzzleResultWorkId,
|
|
} from './platformPuzzleIdentityModel';
|
|
|
|
export type PlatformMiniGameSessionOwner = {
|
|
userId?: string | null;
|
|
displayName?: string | null;
|
|
};
|
|
|
|
export function buildPuzzleRuntimeWorkFromSession(
|
|
session: PuzzleAgentSessionSnapshot,
|
|
owner: PlatformMiniGameSessionOwner,
|
|
): PuzzleWorkSummary | null {
|
|
const draft = session.draft;
|
|
const profileId =
|
|
session.publishedProfileId ?? buildPuzzleResultProfileId(session.sessionId);
|
|
if (!draft || !profileId || !draft.coverImageSrc?.trim()) {
|
|
return null;
|
|
}
|
|
|
|
return {
|
|
workId: buildPuzzleResultWorkId(session.sessionId) ?? profileId,
|
|
profileId,
|
|
ownerUserId: owner.userId ?? 'current-user',
|
|
sourceSessionId: session.sessionId,
|
|
authorDisplayName: owner.displayName ?? '玩家',
|
|
workTitle: draft.workTitle,
|
|
workDescription: draft.workDescription,
|
|
levelName: draft.levelName,
|
|
summary: draft.summary,
|
|
themeTags: draft.themeTags,
|
|
coverImageSrc: draft.coverImageSrc,
|
|
coverAssetId: draft.coverAssetId,
|
|
publicationStatus: 'draft',
|
|
updatedAt: session.updatedAt,
|
|
publishedAt: null,
|
|
playCount: 0,
|
|
remixCount: 0,
|
|
likeCount: 0,
|
|
publishReady: Boolean(session.resultPreview?.publishReady),
|
|
levels: draft.levels,
|
|
};
|
|
}
|
|
|
|
export function buildSquareHoleProfileFromSession(
|
|
session: SquareHoleSessionSnapshot | null,
|
|
): SquareHoleWorkProfile | null {
|
|
const draft = session?.draft;
|
|
if (!session || !draft?.profileId) {
|
|
return null;
|
|
}
|
|
|
|
const now = session.updatedAt || new Date().toISOString();
|
|
return {
|
|
workId: draft.profileId,
|
|
profileId: draft.profileId,
|
|
ownerUserId: 'current-user',
|
|
sourceSessionId: session.sessionId,
|
|
gameName: draft.gameName,
|
|
themeText: draft.themeText,
|
|
twistRule: draft.twistRule,
|
|
summary: draft.summary,
|
|
tags: draft.tags,
|
|
coverImageSrc: draft.coverImageSrc ?? null,
|
|
backgroundPrompt: draft.backgroundPrompt,
|
|
backgroundImageSrc: draft.backgroundImageSrc ?? null,
|
|
shapeOptions: draft.shapeOptions,
|
|
holeOptions: draft.holeOptions,
|
|
shapeCount: draft.shapeCount,
|
|
difficulty: draft.difficulty,
|
|
publicationStatus: 'draft',
|
|
playCount: 0,
|
|
updatedAt: now,
|
|
publishedAt: null,
|
|
publishReady: Boolean(draft.publishReady),
|
|
};
|
|
}
|
|
|
|
export function buildVisualNovelSessionFromWorkDetail(
|
|
work: VisualNovelWorkDetail,
|
|
): VisualNovelAgentSessionSnapshot {
|
|
return {
|
|
sessionId: normalizeCreationUrlValue(work.sourceSessionId) ?? work.workId,
|
|
ownerUserId: work.summary.ownerUserId,
|
|
sourceMode: work.draft.sourceMode,
|
|
status: 'ready',
|
|
messages: [],
|
|
draft: work.draft,
|
|
pendingAction: null,
|
|
createdAt: work.createdAt,
|
|
updatedAt: work.summary.updatedAt,
|
|
};
|
|
}
|
|
|
|
export function buildJumpHopPendingSession(
|
|
item: JumpHopWorkSummaryResponse,
|
|
): JumpHopSessionSnapshotResponse {
|
|
const sessionId =
|
|
normalizeCreationUrlValue(item.sourceSessionId) ?? item.profileId;
|
|
return {
|
|
sessionId,
|
|
ownerUserId: item.ownerUserId,
|
|
status: item.generationStatus,
|
|
draft: {
|
|
templateId: 'jump-hop',
|
|
templateName: '跳一跳',
|
|
profileId: item.profileId,
|
|
workTitle: item.workTitle,
|
|
workDescription: item.workDescription,
|
|
themeTags: item.themeTags,
|
|
difficulty: item.difficulty,
|
|
stylePreset: item.stylePreset,
|
|
characterPrompt: '',
|
|
tilePrompt: '',
|
|
endMoodPrompt: null,
|
|
characterAsset: null,
|
|
tileAtlasAsset: null,
|
|
tileAssets: [],
|
|
path: null,
|
|
coverComposite: item.coverImageSrc,
|
|
generationStatus: item.generationStatus,
|
|
},
|
|
createdAt: item.updatedAt,
|
|
updatedAt: item.updatedAt,
|
|
};
|
|
}
|
|
|
|
export function buildWoodenFishSessionFromWorkDetail(
|
|
work: WoodenFishWorkProfileResponse,
|
|
fallbackItem?: WoodenFishWorkSummaryResponse | null,
|
|
): WoodenFishSessionSnapshotResponse {
|
|
const sessionId =
|
|
normalizeCreationUrlValue(work.summary.sourceSessionId) ??
|
|
normalizeCreationUrlValue(fallbackItem?.sourceSessionId) ??
|
|
work.summary.profileId;
|
|
return {
|
|
sessionId,
|
|
ownerUserId: work.summary.ownerUserId,
|
|
status: work.summary.generationStatus,
|
|
draft: work.draft,
|
|
createdAt: work.summary.updatedAt,
|
|
updatedAt: work.summary.updatedAt,
|
|
};
|
|
}
|
|
|
|
export function buildWoodenFishPendingSession(
|
|
item: WoodenFishWorkSummaryResponse,
|
|
): WoodenFishSessionSnapshotResponse {
|
|
const sessionId =
|
|
normalizeCreationUrlValue(item.sourceSessionId) ?? item.profileId;
|
|
return {
|
|
sessionId,
|
|
ownerUserId: item.ownerUserId,
|
|
status: item.generationStatus,
|
|
draft: {
|
|
templateId: 'wooden-fish',
|
|
templateName: '敲木鱼',
|
|
profileId: item.profileId,
|
|
workTitle: item.workTitle,
|
|
workDescription: item.workDescription,
|
|
themeTags: item.themeTags,
|
|
hitObjectPrompt: '',
|
|
hitObjectReferenceImageSrc: null,
|
|
hitSoundPrompt: null,
|
|
floatingWords: ['功德 +1'],
|
|
hitObjectAsset: null,
|
|
backgroundAsset: null,
|
|
backButtonAsset: null,
|
|
hitSoundAsset: null,
|
|
coverImageSrc: item.coverImageSrc,
|
|
generationStatus: item.generationStatus,
|
|
},
|
|
createdAt: item.updatedAt,
|
|
updatedAt: item.updatedAt,
|
|
};
|
|
}
|