import cloud from '@lafjs/cloud' const db = cloud.database(); import Utils from "@/Utils"; const REGION_RANK_LIMIT = 20; export default async function (ctx: FunctionContext) { const uid = ctx.body.uid; if (!uid) { return { code: 0, data: null, msg: "未获取到uid" }; } const address = ctx.body.address; let dbname = "users"; const gameName = ctx.body.gameName; let db1 = "691093093cf0c4532ba4fd9c"; if (gameName == "iaa") { dbname = "usersAd"; db1 = "691097ac3cf0c4532ba4fd9e"; } let ret1 = await db.collection(dbname).where({ _id: uid }).getOne(); let oldAddress = ret1.data.address; if (address == oldAddress) { return; } const token1 = ctx.body.token; if (ret1.data && ret1.data.token) { let istoken = Utils.checkToken(token1, ret1.data.token); if (!istoken) { return { code: 0, data: null, msg: "token校验失败" }; } } let ret = await db.collection(dbname).where({ _id: uid }).update({ address: address }); if (ret1.data.isWhite == false) { let res = await rank(db1, uid, ret1, oldAddress, address); } return { code: 1, data: { address: address }, msg: "ok" } } async function rank(db1, uid, res1, oldaddress, address) { let add = res1.data.addLevel; if (add < 5) { return; } let rankInfo = await db.collection("sRank").where({ _id: db1 }).getOne(); let total = rankInfo.data.total; if (total != null) { total = JSON.parse(total); } else { total = {}; } if (total[oldaddress]) { for (let i = 0; i < total[oldaddress].length; i++) { if (total[oldaddress][i].id == uid) { total[oldaddress].splice(i, 1) } } } if (total[address]) { let isHave = false; for (let i = 0; i < total[address].length; i++) { if (total[address][i].id == uid) { isHave = true; break; } } if (isHave == false) { let length = total[address].length; if (length < REGION_RANK_LIMIT || add > total[address][length - 1].addLevel) { total[address].push({ id: uid, addLevel: add, time: Date.now(), username: res1.data?.username, useravatar: res1.data?.useravatar, useravatarIcon: res1.data?.useravatarIcon, levelAmount: res1.data?.levelAmount }); } } } else { total[address] = [{ id: uid, addLevel: add, time: Date.now(), username: res1.data?.username, useravatar: res1.data?.useravatar, useravatarIcon: res1.data?.useravatarIcon, levelAmount: res1.data?.levelAmount }]; } total[address].sort((a, b) => { if (a.addLevel !== b.addLevel) { return b.addLevel - a.addLevel; } return a.time - b.time; }); if (total[address].length >= REGION_RANK_LIMIT) { total[address] = total[address].slice(0, REGION_RANK_LIMIT); } if (!total["role"]) { total["role"] = {}; } if (total["role"][oldaddress] > 0) { total["role"][oldaddress] -= 1; let length = total[oldaddress]?.length || 0; if (length < REGION_RANK_LIMIT) { total["role"][oldaddress] = length; } } if (!total["role"][address]) { total["role"][address] = 1; } else { total["role"][address] += 1; let length = total[address]?.length || 0; if (length < REGION_RANK_LIMIT) { total["role"][address] = length; }; } //console.log(address); let ret1 = await db.collection("sRank").where({ _id: db1 }).update({ total: JSON.stringify(total) }); let rank = -1; for (let i = 0; i < total[address].length; i++) { if (total[address][i].id == uid) { rank = i + 1; break; } } return rank; }