refactor(game): 重构游戏云端数据同步逻辑
1. 新增微信云函数双向同步接口,将时间戳对比逻辑移至云端完成 2. 简化初始化流程,合并云端登录与数据同步步骤 3. 重构GameDataSync类,统一同步流程并改为异步调用 4. 替换旧的getCloudData接口为新的syncFromCloud方法
This commit is contained in:
@@ -48,6 +48,53 @@ exports.main = async (event, context) => {
|
||||
msg: `Save fail, ${JSON.stringify(saveDataRes)}`
|
||||
};
|
||||
}
|
||||
} else if (cmd === "sync") {
|
||||
// 双向同步:比较客户端与云端时间戳,新的一方覆盖另一方
|
||||
let clientData = event.data || {};
|
||||
let user = await getOrCreaterUser(db, wxContext.OPENID);
|
||||
if (!user) {
|
||||
return { code: -1, msg: "Get or create user fail" };
|
||||
}
|
||||
|
||||
let cloudData = user.game_data || {};
|
||||
let clientTs = clientData.timestamp || 0;
|
||||
let cloudTs = cloudData.timestamp || 0;
|
||||
|
||||
if (clientTs > cloudTs) {
|
||||
// 客户端较新:写入云端
|
||||
let saveDataRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
game_data: _.set(clientData)
|
||||
}
|
||||
});
|
||||
console.log("Sync: client newer, saved to cloud:", saveDataRes, clientData);
|
||||
if (saveDataRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
updated: true, // 云端已被客户端数据覆盖
|
||||
data: {
|
||||
openid: wxContext.OPENID,
|
||||
game_data: clientData
|
||||
}
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `Sync save fail, ${JSON.stringify(saveDataRes)}`
|
||||
};
|
||||
}
|
||||
} else {
|
||||
// 云端较新或一致:下发云端数据
|
||||
console.log("Sync: cloud newer, return cloud data");
|
||||
return {
|
||||
code: 200,
|
||||
updated: false, // 客户端应使用云端数据
|
||||
data: {
|
||||
openid: wxContext.OPENID,
|
||||
game_data: cloudData
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user