server/laf-cloud/functions/signInActivityInfo.ts

83 lines
2.6 KiB
TypeScript

import cloud from '@lafjs/cloud'
import Utils from "@/Utils";
import {
activateSignInActivity,
getActiveSignInConfig,
getChinaDateKey,
getSignInActivityStatus,
getSignInClaims,
getSignInConfig,
getUserSignInLevel,
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 now = Date.now();
let state = normalizeSignInState(user.signInActivity);
let config = state
? await getSignInConfig(state.activityId)
: await getActiveSignInConfig();
if (!config) {
return { code: 0, data: null, msg: "签到活动配置不存在或配置无效" };
}
const triggerReached = getUserSignInLevel(user) >= Number(config.triggerLevel);
if (!state && !triggerReached) {
return { code: 1, data: false, msg: "未达到签到活动开启关卡" };
}
if (!state) {
const activation = await activateSignInActivity(user, now);
state = activation.state;
config = activation.config || config;
if (!state) {
return { code: 0, data: null, msg: "签到活动开启失败" };
}
}
const claims = await getSignInClaims(uid, state.activityId);
const claimedDays = new Set(claims.map(claim => Number(claim.rewardDay)));
const todayClaimed = claims.some(claim => String(claim.dateKey) === getChinaDateKey(now));
const claimedCount = claims.length;
const status = getSignInActivityStatus(state, claimedCount, now);
return {
code: 1,
data: {
serverNow: now,
activityId: config.activityId,
status,
triggerLevel: Number(config.triggerLevel),
triggerReached,
startAt: state.startAt,
endAt: state.endAt,
claimedCount,
todayClaimed,
canClaim: status === "active" && !todayClaimed,
nextRewardDay: status === "active" && !todayClaimed ? claimedCount + 1 : null,
rewards: config.rewards.map(reward => ({
day: Number(reward.day),
items: reward.items,
claimed: claimedDays.has(Number(reward.day)),
})),
},
msg: "成功",
};
}