import cloud from '@lafjs/cloud' import Utils from "@/Utils"; import { SIGN_IN_REWARD_DAYS, addSignInClaim, buildClaimId, getChinaDateKey, getSignInActivityStatus, getSignInClaims, getSignInConfig, markSignInCompleted, normalizeSignInState, } from "@/SignInActivity"; const db = cloud.database(); export default async function (ctx: FunctionContext) { const uid = ctx.body?.uid; if (!uid) { return { code: 0, data: null, msg: "未获取到uid" }; } if (ctx.body?.gameName === "iaa") { return { code: 0, data: null, msg: "七日签到仅支持主游戏" }; } const userResult = await db.collection("users").where({ _id: uid }).getOne(); const user = userResult.data; if (!user) { return { code: 0, data: null, msg: "未获取到用户信息" }; } if (user.token && !Utils.checkToken(ctx.body?.token, user.token)) { return { code: 0, data: null, msg: "token校验失败" }; } const state = normalizeSignInState(user.signInActivity); if (!state) { return { code: 0, data: null, msg: "签到活动尚未开启" }; } const config = await getSignInConfig(state.activityId); if (!config) { return { code: 0, data: null, msg: "签到活动配置不存在或配置无效" }; } const now = Date.now(); let claims = await getSignInClaims(uid, state.activityId); const status = getSignInActivityStatus(state, claims.length, now); if (status === "completed") { return { code: 0, data: null, msg: "七日签到奖励已全部领取" }; } if (status === "expired") { return { code: 0, data: null, msg: "七日签到活动已结束" }; } const dateKey = getChinaDateKey(now); if (claims.some(claim => String(claim.dateKey) === dateKey)) { return { code: 0, data: null, msg: "今天已经领取" }; } const rewardDay = claims.length + 1; const reward = config.rewards[rewardDay - 1]; if (!reward || rewardDay > SIGN_IN_REWARD_DAYS) { return { code: 0, data: null, msg: "签到奖励配置异常" }; } const claimId = buildClaimId(uid, state.activityId, dateKey); const payload = { _id: claimId, claimId, uid, activityId: state.activityId, dateKey, rewardDay, rewards: reward.items, claimedAt: now, }; try { await addSignInClaim(payload); } catch { return { code: 0, data: null, msg: "今天已经领取" }; } claims = claims.concat(payload); const completed = claims.length >= SIGN_IN_REWARD_DAYS; if (completed) { await markSignInCompleted(uid, state, now); } return { code: 1, data: { claimId, rewardDay, rewards: reward.items, claimedCount: claims.length, todayClaimed: true, completed, }, msg: "领取成功", }; }