cb/server/laf-cloud/functions/userLevel.ts
2026-07-02 11:22:24 +08:00

278 lines
8.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import cloud from '@lafjs/cloud';
const db = cloud.database();
import Utils from "@/Utils";
import Ip2region from 'ip2region';
const query = new Ip2region();
export default async function (ctx: FunctionContext) {
const action = ctx.body.action;
const uid = ctx.body.uid;
let dbname = "users";
const gameName = ctx.body.gameName;
const isWuXian=ctx.body.isWuXian;
let db1 = "691093093cf0c4532ba4fd9c";
if (gameName == "iaa") {
dbname = "usersAd";
db1 ="691097ac3cf0c4532ba4fd9e";
}
if (!action) {
return { code: 0, data: null, msg: "未获取到action" };
}
if (!uid) {
return { code: 0, data: null, msg: "未获取到uid" };
}
let res1 = await db.collection(dbname).where({ _id: uid }).getOne();
const token = ctx.body.token;
if (res1.data&&res1.data.token) {
let istoken=Utils.checkToken(token,res1.data.token);
if (!istoken) {
return { code: 0, data: null, msg: "token校验失败" };;
}
}
let address=res1.data?.address;
const ip = ctx.headers['x-forwarded-for'] || ctx.headers['x-real-ip'] || '';
let address1 = getProvinceByIP(ip);
if(!address||address=="其他"){
address=address1;
}
if (["香港", "澳门", "台湾省"].includes(address)) {
address = "港澳台";
}
switch (action) {
case 'save':
let levelAmount = Number(ctx.body.levelAmount);
if (!levelAmount) {
return { code: 0, data: null, msg: "未获取到levelAmount" };
}
let oldlevelAmount = res1.data?.levelAmount ||0;
let oldAdd=res1.data?.addLevel||0;
let levelTJ=res1.data?.levelTJ||0;
let count=levelAmount-oldlevelAmount;
if(count>10||count<-10){
count=1;
return;
}
let add=oldAdd+count;
let isWhite=res1.data?.isWhite;
let careerAmount = res1.data?.careerAmount||0;
if(isWuXian=="true"){
add +=1;
//console.log("无线增加值:"+(add-oldAdd));
}else{
//console.log("非无线增加值:"+(add-oldAdd));
}
add=Math.floor(add);
// if (uid =="686513c8a173b1b78d21f881"){
// console.error(add);
// console.log(isWhite);
// console.log(typeof isWhite);
// console.log(isWhite==false);
// console.error(levelAmount);
// }
let rankNum=-1;
if(add>=5&&isWhite==false){
rankNum=await rank(db1, uid, add, levelAmount, res1, address,levelTJ);
levelTJ=1;
careerAmount+=1;
}
let film = res1.data.film;
if (!film && film != 0) {
film = res1.data.levelAmount;
}
film += count;
if (uid =="6866ac24a173b1b78d21f8c2"){
console.log("通关:"+levelAmount);
}
// console.error(add);
// console.log(oldAdd);
// console.log(levelAmount);
// console.log(oldlevelAmount);
// console.error("----------------------------------");
let ret = await db.collection(dbname).where({ _id: uid }).update({address:address,film:film, careerAmount:careerAmount,levelTJ:levelTJ, levelAmount: levelAmount,addLevel:add,timestamp:Date.now()});
return { code: 1, data: {IP:ip,address:address,rank:rankNum,levelAmount: levelAmount,timestamp: Date.now() }, msg: "用户数据更新成功" }
case 'read':
return {
code: 1, data: { levelAmount: res1.data?.levelAmount||0, timestamp: res1.data?.timestamp||0 }, msg: "成功"
}
default:
return {
code: 400,
message: '无效的操作类型,请使用 save 或 read'
}
}
}
function isSameDayUTC(timestamp1, timestamp2) {
const date1 = new Date(timestamp1);
const date2 = new Date(timestamp2);
return date1.getUTCFullYear() === date2.getUTCFullYear() &&
date1.getUTCMonth() === date2.getUTCMonth() &&
date1.getUTCDate() === date2.getUTCDate();
}
async function rank(db1,uid,add,levelAmount,res1,address,levelTJ){
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["all"]) {
let isHave = false;
for (let i = 0; i < total["all"].length; i++) {
if (total["all"][i].id == uid) {
isHave = true;
total["all"][i].useravatar = res1.data?.useravatar,
total["all"][i].username=res1.data?.username,
total["all"][i].useravatarIcon=res1.data?.useravatarIcon,
total["all"][i].addLevel = add;
total["all"][i].time = Date.now();
break;
}
}
if (isHave == false) {
let length = total["all"].length;
if (length < 10 || add > total["all"][length - 1].addLevel) {
total["all"].push({
id: uid,
addLevel: add,
time: Date.now(),
username: res1.data?.username,
useravatar: res1.data?.useravatar,
useravatarIcon: res1.data?.useravatarIcon,
levelAmount: levelAmount
});
}
}
} else {
total["all"] = [{
id: uid,
addLevel: add,
time: Date.now(),
username: res1.data?.username,
useravatar: res1.data?.useravatar,
useravatarIcon: res1.data?.useravatarIcon,
levelAmount: levelAmount
}];
}
total["all"].sort((a, b) => {
if (a.addLevel !== b.addLevel) {
return b.addLevel - a.addLevel;
}
return a.time - b.time;
});
if (total["all"].length >= 10) {
total["all"] = total["all"].slice(0, 10);
}
if (total[address]) {
let isHave = false;
for (let i = 0; i < total[address].length; i++) {
if (total[address][i].id == uid) {
isHave = true;
total[address][i].useravatar = res1.data?.useravatar,
total[address][i].username = res1.data?.username,
total[address][i].useravatarIcon = res1.data?.useravatarIcon,
total[address][i].addLevel = add;
total[address][i].time = Date.now();
break;
}
}
if (isHave == false) {
let length = total[address].length;
if (length < 10 || 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: levelAmount
});
}
}
} else {
total[address] = [{
id: uid,
addLevel: add,
time: Date.now(),
username: res1.data?.username,
useravatar: res1.data?.useravatar,
useravatarIcon: res1.data?.useravatarIcon,
levelAmount: 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 >= 10) {
total[address] = total[address].slice(0, 10);
}
if(!total["role"]){
total["role"]={};
}
if(levelTJ==0){
if (!total["role"][address]) {
total["role"][address] = 1;
} else {
total["role"][address] += 1;
//console.log(address+"真实:"+total[address].length+"----"+total["role"][address]);
let length=total[address].length;
if(length<10){
total["role"][address]=length;
}
//console.error(address + "真实" + total[address].length + "----" + total["role"][address])
// const res3 = await db.collection("sRank").where({ name: address }).getOne();
// let length1=res3.data.totoal.length;
// if(length1<100&&total["role"][address]>length1){
// total["role"][address]=length1;
// }
//console.error(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;
}
/**
* 根据 IP 获取省份名称
* @param {string} ip - 用户 IP 地址
* @returns {string} 省份名称(如 "广东省"),未知时返回 "未知"
*/
function getProvinceByIP(ip) {
try {
const result = query.search(ip);
//console.log(result);
if (!result || !result.country.includes('中国')) {
return '其他';
}
// ip2region 返回的格式示例:"中国|0|广东省|深圳市|电信"
const parts = result.province;
const provinceCode = parts[2]; // 省份代码在第三部分
// 检查是否是已知的省份代码
// if (PROVCE_CODE_MAP[provinceCode]) {
// return PROVINCE_CODE_MAP[provinceCode];
// }
// 如果未映射,返回原始代码(可能是数据库更新后的新代码)
return parts || '其他';
} catch (error) {
console.error('IP 解析失败:', error);
return '其他';
}
}