金币经验掉落
This commit is contained in:
@@ -0,0 +1,421 @@
|
||||
// 装备库存操作模块 (equips)
|
||||
const { getOrCreaterUser } = require('./auth');
|
||||
|
||||
const user_db_name = "cocos_users";
|
||||
const DATA_TYPE = 'equips';
|
||||
|
||||
/**
|
||||
* 获取装备库存数据
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getEquips(db, openid) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: user[DATA_TYPE],
|
||||
msg: `${DATA_TYPE}获取成功`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`获取${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `获取${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个装备数据
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} equipId 装备ID
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getEquip(db, openid, equipId) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
const equipCount = user[DATA_TYPE][equipId];
|
||||
if (equipCount === undefined) {
|
||||
return {
|
||||
code: -6,
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${equipId} 未找到`
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: equipId,
|
||||
count: equipCount
|
||||
},
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${equipId} 获取成功`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`获取${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `获取${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加装备
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} equipId 装备ID
|
||||
* @param {number} count 添加数量
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function addEquip(db, openid, equipId, count) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const currentCount = user[DATA_TYPE][equipId] || 0;
|
||||
const newCount = currentCount + count;
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[`${DATA_TYPE}.${equipId}`]: _.set(newCount),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: equipId,
|
||||
old_count: currentCount,
|
||||
new_count: newCount,
|
||||
added: count
|
||||
},
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${equipId} 添加成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `添加 ${DATA_TYPE.slice(0, -1)} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`添加${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `添加${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 消耗装备
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} equipId 装备ID
|
||||
* @param {number} count 消耗数量
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function consumeEquip(db, openid, equipId, count) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const currentCount = user[DATA_TYPE][equipId] || 0;
|
||||
if (currentCount < count) {
|
||||
return {
|
||||
code: -6,
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${equipId}不足, 当前: ${currentCount}, 需要: ${count}`
|
||||
};
|
||||
}
|
||||
|
||||
return await addEquip(db, openid, equipId, -count);
|
||||
} catch (error) {
|
||||
console.error(`消耗${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `消耗${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置装备数量
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} equipId 装备ID
|
||||
* @param {number} count 新的数量
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function setEquip(db, openid, equipId, count) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const oldCount = user[DATA_TYPE][equipId] || 0;
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[`${DATA_TYPE}.${equipId}`]: _.set(count),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: equipId,
|
||||
old_count: oldCount,
|
||||
new_count: count
|
||||
},
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${equipId} 设置成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `设置 ${DATA_TYPE.slice(0, -1)} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`设置${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `设置${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量更新装备库存
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {Object} updateData 更新数据对象
|
||||
* @param {boolean} merge 是否合并更新(默认true)
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function updateEquips(db, openid, updateData, merge = true) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
// 验证更新数据
|
||||
if (!updateData || typeof updateData !== 'object') {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "无效的更新数据格式"
|
||||
};
|
||||
}
|
||||
|
||||
// 验证所有值都是非负数
|
||||
for (const equipId in updateData) {
|
||||
const count = updateData[equipId];
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `装备 ${equipId} 的数量无效: ${count}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
let newData;
|
||||
if (merge) {
|
||||
// 合并更新
|
||||
newData = { ...user[DATA_TYPE], ...updateData };
|
||||
} else {
|
||||
// 完全替换
|
||||
newData = updateData;
|
||||
}
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[DATA_TYPE]: _.set(newData),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: newData,
|
||||
msg: `${DATA_TYPE} 更新成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `更新 ${DATA_TYPE} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`更新${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `更新${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置装备库存数据
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function resetEquips(db, openid) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
const { getNewUserInitData } = require('../user_init_data');
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
const defaultData = getNewUserInitData();
|
||||
|
||||
let resetRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[DATA_TYPE]: _.set(defaultData[DATA_TYPE]),
|
||||
last_save_time: _.set(Date.now()),
|
||||
reset_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (resetRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: defaultData[DATA_TYPE],
|
||||
msg: `${DATA_TYPE} 重置成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `重置 ${DATA_TYPE} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`重置${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `重置${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取拥有的装备列表(数量大于0的)
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getOwnedEquips(db, openid) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
const ownedEquips = [];
|
||||
for (const equipId in user[DATA_TYPE]) {
|
||||
const count = user[DATA_TYPE][equipId];
|
||||
if (count > 0) {
|
||||
ownedEquips.push({
|
||||
item_id: parseInt(equipId),
|
||||
count: count
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
owned_items: ownedEquips,
|
||||
total_types: ownedEquips.length
|
||||
},
|
||||
msg: `拥有的${DATA_TYPE}获取成功`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`获取拥有的${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `获取拥有的${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getEquips,
|
||||
getEquip,
|
||||
addEquip,
|
||||
consumeEquip,
|
||||
setEquip,
|
||||
updateEquips,
|
||||
resetEquips,
|
||||
getOwnedEquips
|
||||
};
|
||||
Reference in New Issue
Block a user