278 lines
8.7 KiB
TypeScript
278 lines
8.7 KiB
TypeScript
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 '其他';
|
||
}
|
||
} |