feat: support changing quest language

This commit is contained in:
neilchen0812 committed 2026-10-08 02:46:44 +10:30
1 parent 9b8d7109cf
commit 66b0b7ba68
18 files changed
+313 -109

No files matched your search

+28 -20
View File
@@ -2,26 +2,34 @@ import { TRPCError } from '@trpc/server'
import { z } from 'zod'
import { router, publicProcedure } from '../trpc.js'
import { questManager } from '../models/quest.js'
import { SUPPORTED_LOCALES } from '../../../packages/constants'
export const questRouter = router({
getQuests: publicProcedure.query(async () => {
const quests = questManager.getAll()
return quests.map(({ title, id, requirements }) => ({
id,
title,
requirements,
}))
}),
getQuestDetail: publicProcedure.input(z.string()).query(async (opts) => {
const questId = opts.input
const quest = questManager.get(questId)
if (!quest) {
throw new TRPCError({
code: 'NOT_FOUND',
message: 'Quest not found.',
})
}
const { id, title, instruction, requirements } = quest
return { id, title, instruction, requirements }
}),
getQuests: publicProcedure
.input(z.object({ locale: z.enum(SUPPORTED_LOCALES) }))
.query(async ({ input }) => {
const quests = questManager.getAll(input.locale)
return quests.map(({ title, id, requirements }) => ({
id,
title,
requirements,
}))
}),
getQuestDetail: publicProcedure
.input(z.object({ questId: z.string(), locale: z.enum(SUPPORTED_LOCALES) }))
.query(async ({ input }) => {
const { questId, locale } = input
const quest = questManager.get(questId, locale)
if (!quest) {
throw new TRPCError({
code: 'NOT_FOUND',
message: 'Quest not found.',
})
}
const { id, title, instruction, requirements } = quest
return { id, title, instruction, requirements }
}),
})
+15 -5
View File
@@ -1,5 +1,6 @@
import { TRPCError } from '@trpc/server'
import { z } from 'zod'
import { SUPPORTED_LOCALES } from '../../../packages/constants'
import { ISession, Session } from '../../../packages/models'
import { GameSession, VoidFileExistenceChecker } from '../../../packages/game'
import { createNewSession, isQuestUnlocked } from '../models/sessionManager.js'
@@ -11,7 +12,7 @@ import { genJWT } from '../utils/auth'
export type SessionDetail = Awaited<ReturnType<typeof sessionDetail>>
async function sessionDetail(session: ISession) {
const quest = questManager.get(session.quest)
const quest = questManager.get(session.quest, session.locale)
if (!quest) {
throw new TRPCError({
code: 'NOT_FOUND',
@@ -31,6 +32,7 @@ async function sessionDetail(session: ISession) {
_id: session._id.toString(),
user: session.user.toString(),
quest: session.quest,
locale: session.locale,
status: session.status,
createdAt: session.createdAt.toISOString(),
lastActivityAt: session.lastActivityAt.toISOString(),
@@ -45,12 +47,20 @@ async function sessionDetail(session: ISession) {
export const sessionRouter = router({
createSession: protectedProcedure
.input(z.object({ questId: z.string() }))
.input(
z.object({
questId: z.string(),
locale: z.enum(SUPPORTED_LOCALES),
})
)
.mutation(async (opts) => {
const { questId } = opts.input
const { questId, locale } = opts.input
const { user } = opts.ctx
if ((await isQuestUnlocked(user.id, questId)) || config.testing.enabled) {
const session = await createNewSession(user.id, questId)
if (
(await isQuestUnlocked(user.id, questId, locale)) ||
config.testing.enabled
) {
const session = await createNewSession(user.id, questId, locale)
return sessionDetail(session)
}
throw new TRPCError({