96 lines
2.7 KiB
TypeScript
96 lines
2.7 KiB
TypeScript
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: "领取成功",
|
|
};
|
|
}
|