Merge branch 'bugfix' of http://git.legu.cc/qixin/HJ_Server into bugfix

This commit is contained in:
ciniao 2023-12-31 16:29:22 +08:00
commit 17ae62472e
35 changed files with 420 additions and 165 deletions

View File

@ -3,16 +3,21 @@ import { ReqUpdateHbzbCrossUser, ResUpdateHbzbCrossUser } from "../../cross/prot
/**更新跨服数据库里,黑帮争霸的玩家数据 */ /**更新跨服数据库里,黑帮争霸的玩家数据 */
export default async function (call: ApiCall<ReqUpdateHbzbCrossUser, ResUpdateHbzbCrossUser>) { export default async function (call: ApiCall<ReqUpdateHbzbCrossUser, ResUpdateHbzbCrossUser>) {
let setData = { let setData: any = {
"data": { "data": {
player: call.req.user.player, player: call.req.user.player,
roles: call.req.user.roles, roles: call.req.user.roles,
uid: call.req.uid uid: call.req.uid
}, },
};
if (call.req.isNew) {
setData = {
...setData,
"jifen": -999999, "jifen": -999999,
"rank": -999999, "rank": -999999,
"zbsgroup": "" "zbsgroup": ""
}; }
}
G.mongodb.collection('hbzb_user_cross').updateOne({uid: setData.data.uid}, {$set: setData}, {upsert: true}); G.mongodb.collection('hbzb_user_cross').updateOne({uid: setData.data.uid}, {$set: setData}, {upsert: true});
call.succ({}); call.succ({});
} }

View File

@ -29,5 +29,5 @@ export default async function (call: ApiCall<ReqReceive, ResReceive>) {
call.succ({}) call.succ({})
HongDianChange.sendChangeKey(call.uid, ['pobinglibao']); HongDianChange.sendChangeKey(call.uid, ['huodonghd']);
} }

View File

@ -21,23 +21,18 @@ export default async function (call: ApiCall<ReqOpen, ResOpen>) {
let limit = _hd.data?.rank?.slice(-1)?.[0]?.rank?.slice(-1)?.[0] || call.req.limit || 100 let limit = _hd.data?.rank?.slice(-1)?.[0]?.rank?.slice(-1)?.[0] || call.req.limit || 100
let rmbuse = await G.crossmongodb.collection('rmbuse').find({ let rmbuse = await G.crossmongodb.collection('rmbuse').find({type: `xfjs_${G.huodong.xfjsId}`}).sort({change: 1}).limit(limit).toArray()
time: {
$gte: _hd.stime,
$lte: _hd.etime + 10
}
}).sort({change: 1}).limit(limit).toArray()
let list: any = rmbuse.map(i => ({...i, total: R.negate(i.change)})) let list: any = rmbuse.map(i => ({...i, total: R.negate(i.change)}))
let rankList = sortRankList(_hd.data.rank, list) let rankList = sortRankList(_hd.data.rank, list)
let users = await G.crossmongodb.collection('huodong_user').find({uid: {$in: rankList.map(i => i._id).filter(i => i._id != 'system')}}).toArray() let users = await G.crossmongodb.collection('huodong_user').find({uid: {$in: rankList.map(i => i._id).filter(i => i != 'system')}}).toArray()
rankList = rankList.map(i => ({...i, player: users.find(v => v.uid == i._id) || {}})) rankList = rankList.map(i => ({...i, player: users.find(v => v.uid == i.uid) || {}}))
// 活动结束前半小时,缓存过期时间改为10 // 活动结束前半小时,缓存过期时间改为5
let exTime = (G.time + 1800) > _hd.etime ? 10 : 60 let exTime = (G.time + 1800) > _hd.etime ? 5 : 10
G.crossioredis.setex(`rank:xiaofeijingsai`, exTime, JSON.stringify(rankList)); G.crossioredis.setex(`rank:xiaofeijingsai`, exTime, JSON.stringify(rankList));
@ -53,14 +48,13 @@ export default async function (call: ApiCall<ReqOpen, ResOpen>) {
*/ */
export function sortRankList(rank, list) { export function sortRankList(rank, list) {
let rankList = [] let rankList = []
let ccc = 0
rank.map(i => { rank.map(i => {
for (let k = i.rank[0] - 1; k < i.rank[1]; k++) { for (let k = i.rank[0] - 1; k < i.rank[1]; k++) {
if (list[k]?.total >= i.need[0].n) { if (list[0]?.total >= i.need[0].n) {
rankList.push({...list[k - ccc], rank: k}) rankList.push({...list[0], rank: k, _id: list[0].uid})
list = R.tail(list)
} else { } else {
rankList.push({_id: 'system', total: i.need[0].n, rank: k, player: {}}) rankList.push({_id: 'system', total: i.need[0].n, rank: k, player: {}})
ccc += 1
} }
} }
}) })
@ -68,18 +62,21 @@ export function sortRankList(rank, list) {
} }
// 获取自己的信息 // 获取自己的信息
async function getMyData(call, rankList) { async function getMyData(call: ApiCall, rankList) {
let myData = rankList.find(i => i._id == call.uid) let myData = rankList.find(i => i._id == call.uid)
if (myData) return myData if (myData) return myData
let myCut: any = await G.crossmongodb.collection('rmbuse').findOne({uid: call.uid}) let myCut: any = await G.crossmongodb.collection('rmbuse').findOne({
uid: call.uid,
type: `xfjs_${G.huodong.xfjsId}`
})
let myUser = await G.mongodb.collection('user').findOne({uid: call.uid}) let myUser = await G.mongodb.collection('user').findOne({uid: call.uid})
G.crossmongodb.collection('huodong_user').updateOne({uid: call.uid}, myUser, {upsert: true}) G.crossmongodb.collection('huodong_user').updateOne({uid: call.uid}, {$set: myUser}, {upsert: true})
if (!myCut) { if (!myCut) {
myCut = {_id: myUser.uid, total: 0} myCut = {_id: myUser.uid, total: 0}
} }
return {player: myUser, ...myCut, total: R.negate(myCut.total), rank: -1} return {player: myUser, ...myCut, total: R.negate(myCut.change) || 0, rank: -1, _id: myUser.uid}
} }

View File

@ -31,5 +31,5 @@ export default async function (call: ApiCall<ReqDMRec, ResDMRec>) {
call.succ({prize}) call.succ({prize})
HongDianChange.sendChangeKey(call.uid, ['yuandan']); HongDianChange.sendChangeKey(call.uid, ['huodonghd']);
} }

View File

@ -32,5 +32,5 @@ export default async function (call: ApiCall<ReqDZRec, ResDZRec>) {
call.succ({[gift.id]: prize}) call.succ({[gift.id]: prize})
HongDianChange.sendChangeKey(call.uid, ['yuandan']); HongDianChange.sendChangeKey(call.uid, ['huodonghd']);
} }

View File

@ -25,5 +25,5 @@ export default async function (call: ApiCall<ReqExchange, ResExchange>) {
call.succ({}) call.succ({})
HongDianChange.sendChangeKey(call.uid, ['yuandan']); HongDianChange.sendChangeKey(call.uid, ['huodonghd']);
} }

View File

@ -3,14 +3,18 @@ import {ReqOpen, ResOpen} from "../../../shared/protocols/event/yuandan/PtlOpen"
import {HuoDongFun} from "../../../public/huodongfun"; import {HuoDongFun} from "../../../public/huodongfun";
import {PayFun} from "../../../public/pay"; import {PayFun} from "../../../public/pay";
import {Yuandanfun} from "./fun"; import {Yuandanfun} from "./fun";
import {PublicShared} from "../../../shared/public/public";
export default async function (call: ApiCall<ReqOpen, ResOpen>) { export default async function (call: ApiCall<ReqOpen, ResOpen>) {
let _hd = await Yuandanfun.getCon(call) let _hd = await Yuandanfun.getCon(call)
if (!_hd) return call.errorCode(-1)
let payIds = _hd.data.gift.filter(i => i.payid).map(i => i.payid) let payIds = _hd.data.gift.filter(i => i.payid).map(i => i.payid)
let data = await Yuandanfun.getData(call, _hd.hdid)
call.succ({ call.succ({
data: await Yuandanfun.getData(call, _hd.hdid), data: {...data, isSameDay: PublicShared.chkSameDate(data.qiandaoTime, G.time)},
payLog: await PayFun.getPayLogs(call.uid, payIds) payLog: await PayFun.getPayLogs(call.uid, payIds),
}) })
} }

View File

@ -29,9 +29,9 @@ export default async function (call: ApiCall<ReqTaskRec, ResTaskRec>) {
await PlayerFun.sendPrize(call, _prize); await PlayerFun.sendPrize(call, _prize);
let changedata = { data: _mydata, prize: _prize} let changedata = { data: _mydata, prize: _prize}
// 推送红点
HongDianChange.sendChangeKey(call.uid, ['huodonghd']);
call.succ(changedata); call.succ(changedata);
// 推送红点
HongDianChange.sendChangeKey(call.uid, ['huodonghd']);
} }

View File

@ -40,5 +40,5 @@ export default async function (call: ApiCall<ReqZLRec, ResZLRec>) {
call.succ({[call.req.id]: prize}) call.succ({[call.req.id]: prize})
HongDianChange.sendChangeKey(call.uid, ['yuandan']); HongDianChange.sendChangeKey(call.uid, ['huodonghd']);
} }

View File

@ -24,7 +24,7 @@ export class Yuandanfun {
exchange: {}, exchange: {},
taskfinish: [], taskfinish: [],
taskval: await this.getTaskVal(call), taskval: await this.getTaskVal(call),
qiandaoTime: data?.qiandaoTime || 0, qiandaoTime: data?.qiandaoTime || 1,
refreshTime: G.time refreshTime: G.time
}, },
}, {upsert: true, returnDocument: 'after'})).value }, {upsert: true, returnDocument: 'after'})).value
@ -74,7 +74,8 @@ export class Yuandanfun {
let _hd = await this.getCon(call) let _hd = await this.getCon(call)
if (!_hd) return if (!_hd) return
// let _mydata = await Christmasfun.getMyData(call, hdid) await this.getData(call, _hd.hdid)
let _tasks = _hd.data.task let _tasks = _hd.data.task
let _setData = { let _setData = {
@ -88,7 +89,6 @@ export class Yuandanfun {
let _taskCon = _tasks[ele] let _taskCon = _tasks[ele]
if (_taskCon.stype != stype) continue if (_taskCon.stype != stype) continue
let _pval = _taskCon.pval
// 不符合任务要求 // 不符合任务要求
if (!(await chkCall(_taskCon["cond"], chkval, arg))) continue if (!(await chkCall(_taskCon["cond"], chkval, arg))) continue
@ -105,10 +105,10 @@ export class Yuandanfun {
// 设置任务 // 设置任务
if (isset == 1) { if (isset == 1) {
await G.mongodb.collection('event').updateOne( await G.mongodb.collection('event').updateOne({
{uid: call.uid, type: `yuandan${_hd.hdid}`}, uid: call.uid,
_setData type: `yuandan${_hd.hdid}`
) }, _setData)
} }
} }

View File

@ -12,6 +12,7 @@ export default async function (call: ApiCall<ReqhdGetList, ReshdGetList>) {
// 消费竞赛是跨服活动,活动开启时,同步当前用户信息到跨服数据库 // 消费竞赛是跨服活动,活动开启时,同步当前用户信息到跨服数据库
G.huodong.xfjs = !!_hdList.find(i => i.htype == 11); G.huodong.xfjs = !!_hdList.find(i => i.htype == 11);
if (G.huodong.xfjs) { if (G.huodong.xfjs) {
G.huodong.xfjsId = _hdList.find(i => i.htype == 11).hdid
let myUser = await G.mongodb.collection('user').findOne({uid: call.uid}) let myUser = await G.mongodb.collection('user').findOne({uid: call.uid})
G.crossmongodb.collection('huodong_user').updateOne({uid: call.uid}, {$set: myUser}, {upsert: true}) G.crossmongodb.collection('huodong_user').updateOne({uid: call.uid}, {$set: myUser}, {upsert: true})
} }

View File

@ -62,7 +62,7 @@ export default async function (call: ApiCall<ReqRepair, ResRepair>) {
} else { } else {
cutItem = R.find(R.whereEq({a: "item", t: "21"}))(need) cutItem = R.find(R.whereEq({a: "item", t: "21"}))(need)
} }
let rankKfjs = new RankKfjs(6) let rankKfjs = RankKfjs(6)
rankKfjs.setDataAndCheck({ rankKfjs.setDataAndCheck({
player: call.conn.gud, player: call.conn.gud,
valArr: [await rankKfjs.getRankScore(call.uid) + cutItem.n] valArr: [await rankKfjs.getRankScore(call.uid) + cutItem.n]

View File

@ -9,10 +9,8 @@ export default async function (call: ApiCall<ReqOpen, ResOpen>) {
let dbData = await getHbzbData(call.uid); let dbData = await getHbzbData(call.uid);
let data: typeof dbData.data = dbData?.data || {} as any; let data: typeof dbData.data = dbData?.data || {} as any;
if (dbData == null) {
//如果没有,则同步到跨服 //如果没有,则同步到跨服
await updateHbzbCrossUser(await call.conn.getDefaultFightData(), true); await updateHbzbCrossUser(await call.conn.getDefaultFightData(), dbData == null);
}
if (!data.refreshTime || data.refreshTime < PublicShared.getToDayZeroTime()) { if (!data.refreshTime || data.refreshTime < PublicShared.getToDayZeroTime()) {
data.winNum = 0; data.winNum = 0;
@ -32,7 +30,9 @@ export default async function (call: ApiCall<ReqOpen, ResOpen>) {
return call.errorCode(-4) return call.errorCode(-4)
} }
if (callRes.res.enemy.length) if (callRes.res.enemy.length)
data.enemy = callRes.res.enemy.map(e => { return { ...e, result: null }; }); data.enemy = callRes.res.enemy.map(e => {
return {...e, result: null};
});
} }
G.mongodb.cPlayerInfo('hbzb').updateOne( G.mongodb.cPlayerInfo('hbzb').updateOne(

View File

@ -21,34 +21,7 @@ export default async function (call: ApiCall<ReqGetList, ResGetList>) {
color[heroCon[v.heroId].colour] += 1; color[heroCon[v.heroId].colour] += 1;
}); });
// 修复配件数据 await checkDataAndFix(call, list)
let peijianids = [];
Object.values(list).map(hero => {
hero.peijian && Object.values(hero.peijian).map(
i => peijianids.push(G.mongodb.conversionId(PeijianShared.fmt(i)._id))
)
});
let peijians = (await G.mongodb.collection("peijian").find(
{uid: call.uid, _id: {$in: peijianids}}, {projection: {_id: 1}}
).toArray()).map(temp => G.mongodb.conversionId(temp._id));
let changes = {};
Object.values(list).map(hero => {
for (let pos in hero.peijian) {
if (!peijians.includes(PeijianShared.fmt(hero.peijian[pos])._id)) {
hero.peijian[pos] = "";
changes[hero._id] = hero.peijian;
}
}
})
for (let oid in changes) {
// 修复数据
G.mongodb.collection("hero").updateOne(
G.mongodb.conversionIdObj({_id: oid}), {$set: {peijian: changes[oid]}}
)
}
// 记录玩家最大等级,颜色相关数据 注册任务用 // 记录玩家最大等级,颜色相关数据 注册任务用
await G.mongodb.collection('playerInfo', 'usertasklog').updateOne({uid: call.conn.uid, type: 'usertasklog'}, await G.mongodb.collection('playerInfo', 'usertasklog').updateOne({uid: call.conn.uid, type: 'usertasklog'},
@ -69,3 +42,63 @@ export default async function (call: ApiCall<ReqGetList, ResGetList>) {
gbzj: (await G.mongodb.cPlayerInfo('gbzj').findOne({uid: call.uid, type: 'gbzj'}))?.rec || {} gbzj: (await G.mongodb.cPlayerInfo('gbzj').findOne({uid: call.uid, type: 'gbzj'}))?.rec || {}
}); });
} }
/**
*
* @param call
* @param list
*/
async function checkDataAndFix(call: ApiCall, list: ResGetList['list']) {
try {
// 修复配件数据
let peijianids = [];
Object.values(list).map(hero => {
hero.peijian && Object.values(hero.peijian).map(
i => peijianids.push(G.mongodb.conversionId(PeijianShared.fmt(i)._id))
)
});
let peijians = (await G.mongodb.collection("peijian").find(
{uid: call.uid, _id: {$in: peijianids}}, {projection: {_id: 1}}
).toArray()).map(temp => G.mongodb.conversionId(temp._id));
let shiwuIds = R.flatten(R.values(list).map(hero => R.values(hero.shiwu).map(i => G.mongodb.conversionId(i._id))))
let shiwus = (await G.mongodb.collection("shiwu").find(
{uid: call.uid, _id: {$in: shiwuIds}}, {projection: {_id: 1}}
).toArray()).map(i => G.mongodb.conversionId(i._id));
let peijianChanges = {};
let shiwuChanges = {};
Object.values(list).map(hero => {
for (let pos in hero.peijian) {
if (!peijians.includes(PeijianShared.fmt(hero.peijian[pos])._id)) {
hero.peijian[pos] = "";
peijianChanges[hero._id] = hero.peijian;
}
}
for (let pos in hero.shiwu) {
if (!shiwus.includes(hero.shiwu[pos]._id)) {
hero.shiwu = R.omit([pos], hero.shiwu)
shiwuChanges[hero._id] = hero.shiwu;
}
}
})
for (let oid in peijianChanges) {
// 修复数据
G.mongodb.collection("hero").updateOne(
G.mongodb.conversionIdObj({_id: oid}), {$set: {peijian: peijianChanges[oid]}}
)
}
for (let oid in shiwuChanges) {
// 修复数据
G.mongodb.collection("hero").updateOne(
G.mongodb.conversionIdObj({_id: oid}), {$set: {shiwu: shiwuChanges[oid]}}
)
}
} catch (e) {
console.log('======修复英雄配件和饰物报错====',e)
}
}

View File

@ -269,7 +269,7 @@ export class HongDianFun {
for (let i = 1; i <= 7; i++) { for (let i = 1; i <= 7; i++) {
let prize = kfjsFun.getStatus(i) let prize = kfjsFun.getStatus(i)
if (PublicShared.getOpenServerDay() <= prize.conf.showDay[1]) continue if (PublicShared.getOpenServerDay() <= prize.conf.showDay[1]) continue
let rankKfjs = new RankKfjs(i) let rankKfjs = RankKfjs(i)
let myRank = await rankKfjs.getRankSortByOne(call.uid) let myRank = await rankKfjs.getRankSortByOne(call.uid)
if (prize.type > 0 && !data?.record?.[i] && myRank >= 0) { if (prize.type > 0 && !data?.record?.[i] && myRank >= 0) {
canGet[i] = true canGet[i] = true
@ -349,7 +349,7 @@ export class HuoDongHongDianFun {
ishd = await this.pobinglibao(call, element) ishd = await this.pobinglibao(call, element)
} }
if (element.htype == 14) { if (element.htype == 14) {
// 检测 htype 10 破冰活动红点 // 检测 htype 10 元旦活动红点
ishd = await this.yuandan(call, element) ishd = await this.yuandan(call, element)
} }
@ -367,17 +367,21 @@ export class HuoDongHongDianFun {
/**破冰礼包红点 */ /**破冰礼包红点 */
static async pobinglibao(call: ApiCall, _hd: ReqAddHuoDong): Promise<hongdianVal> { static async pobinglibao(call: ApiCall, _hd: ReqAddHuoDong): Promise<hongdianVal> {
let gift = _hd?.data?.gift?.find(i => i.free == true && !i.payId) let gift = _hd?.data?.gift?.find(i => i.free == true && !i.payId)
if (!gift) return {show: false} if (gift) return {show: true}
let payLog = await PayFun.getPayLog(call.uid, gift.payId) let payIds = _hd?.data?.gift?.filter(i=>i.payId).map(i=>i.payId)
payLog = payLog?.filter(i => i.time >= _hd.stime && i.time <= _hd.etime) || [] let payLogs = await PayFun.getPayLogs(call.uid, payIds)
if (!payLog || !payLog.length) return {show: false}
// 取奖励列表,判断是否有可领取奖励 // 取奖励列表,判断是否有可领取奖励
let data = await G.mongodb.cEvent('pobinglibao').findOne({uid: call.uid, type: 'pobinglibao'}) let data = await G.mongodb.cEvent('pobinglibao').findOne({uid: call.uid, type: 'pobinglibao'})
let rec = data?.record?.[call.req.id].length
if (rec && (rec >= 3 || data?.record?.[gift.id] == call.req.recId)) return {show: false} for (let item of _hd?.data?.gift){
return {show: true} let rec = data?.record?.[item.id]?.length
if (item.free== true && !item.payId) return {show: true}
if (payLogs[item.payId]?.length && (!rec || rec < PublicShared.getDiff(payLogs[item.payId][0].time))) return {show: true}
}
return {show:false}
} }
/**元旦活动红点 */ /**元旦活动红点 */
@ -392,16 +396,15 @@ export class HuoDongHongDianFun {
if (data?.gameNum < _hd.data.gamefree) return {show: true} if (data?.gameNum < _hd.data.gamefree) return {show: true}
if (!PublicShared.chkSameDate(data?.qiandaoTime || 0, G.time)) { if (!PublicShared.chkSameDate(data?.qiandaoTime || 1, G.time)) {
return {show: true} return {show: true}
} }
for (let i = 1; i++; i <= data.taskval.length) { for (const i in data.taskval) {
if (data?.taskval[i] >= _hd?.data?.task?.[i]?.pval && !data?.taskfinish.find(v => v == i + '')) { if (data?.taskval[i] >= _hd?.data?.task?.[i]?.pval && !data?.taskfinish.find(v => v == i)) {
return {show: true} return {show: true}
} }
} }
return {show: false} return {show: false}
} }

View File

@ -137,7 +137,7 @@ export default async function (call: ApiCall<ReqLottery, ResLottery>) {
changeData: changeData changeData: changeData
}); });
let rankKfjs = new RankKfjs(1) let rankKfjs = RankKfjs(1)
rankKfjs.setDataAndCheck({ rankKfjs.setDataAndCheck({
player: call.conn.gud, player: call.conn.gud,
valArr: [await rankKfjs.getRankScore(call.uid) + call.req.type] valArr: [await rankKfjs.getRankScore(call.uid) + call.req.type]

View File

@ -2,6 +2,7 @@ import {ApiCall} from "tsrpc";
import {JJCFun} from '../../public/jjc'; import {JJCFun} from '../../public/jjc';
import {ReqOpen, ResOpen} from "../../shared/protocols/jjc/PtlOpen"; import {ReqOpen, ResOpen} from "../../shared/protocols/jjc/PtlOpen";
import {PublicShared} from '../../shared/public/public'; import {PublicShared} from '../../shared/public/public';
import {UserFun} from "../../public/user";
export default async function (call: ApiCall<ReqOpen, ResOpen>) { export default async function (call: ApiCall<ReqOpen, ResOpen>) {
const dbData = await JJCFun.getMyData(call.uid); const dbData = await JJCFun.getMyData(call.uid);
@ -28,6 +29,7 @@ export default async function (call: ApiCall<ReqOpen, ResOpen>) {
...enemy ...enemy
}); });
UserFun.activeHeadFrame(call.uid, 'jjc_rank', data["rank"] + 1);
JJCFun.checkUpdatePlayer() JJCFun.checkUpdatePlayer()
} }

View File

@ -12,7 +12,7 @@ export default async function (call: ApiCall<ReqOpen, ResOpen>) {
const {min, max} = Rank.pageToMin(call.req.page, call.req.offset) const {min, max} = Rank.pageToMin(call.req.page, call.req.offset)
let rankKfjs = new RankKfjs(status.type) let rankKfjs = RankKfjs(status.type)
let endTime = PublicShared.getToDayZeroTime(PublicShared.getToDayZeroTime(G.openTime) + status.conf.showDay[1] * 86400) let endTime = PublicShared.getToDayZeroTime(PublicShared.getToDayZeroTime(G.openTime) + status.conf.showDay[1] * 86400)

View File

@ -15,7 +15,7 @@ export default async function (call: ApiCall<ReqReceive, ResReceive>) {
if (data?.record?.[call.req.type]) return call.errorCode(-2) if (data?.record?.[call.req.type]) return call.errorCode(-2)
// 查询自己排名,发奖 // 查询自己排名,发奖
let rankKfjs = new RankKfjs(call.req.type) let rankKfjs = RankKfjs(call.req.type)
let myRank = await rankKfjs.getRankSortByOne(call.uid) let myRank = await rankKfjs.getRankSortByOne(call.uid)
let conf = R.find(i => i.rank[0] <= myRank + 1 && i.rank[1] >= myRank + 1)(prize) let conf = R.find(i => i.rank[0] <= myRank + 1 && i.rank[1] >= myRank + 1)(prize)

View File

@ -43,7 +43,7 @@ export default async function (call: ApiCall<ReqFight, ResFight>) {
valArr: [changeInfo.lv] valArr: [changeInfo.lv]
}); });
let rankKfjs = new RankKfjs(5) let rankKfjs = RankKfjs(5)
rankKfjs.setDataAndCheck({ rankKfjs.setDataAndCheck({
player: call.conn.gud, player: call.conn.gud,
valArr: [changeInfo.lv-1] valArr: [changeInfo.lv-1]

View File

@ -16,6 +16,13 @@ export default async function (call: ApiCall<ReqGetList, ResGetList>) {
return ops; return ops;
}); });
// 修复配件穿戴在不存在的英雄身上
let heroIds = R.values(call.conn.gud.heroPos)
let fixIds = dbList.filter(i => i.wearId && !heroIds.includes(i.wearId)).map(i => G.mongodb.conversionId(i._id))
if (fixIds.length) {
await G.mongodb.collection('peijian').updateMany({_id: {$in: fixIds}}, {$set: {wearId: ''}})
}
// 记录玩家最大等级,颜色相关数据 注册任务用 // 记录玩家最大等级,颜色相关数据 注册任务用
await G.mongodb.collection('playerInfo', 'usertasklog').updateOne({uid: call.conn.uid, type: 'usertasklog'}, await G.mongodb.collection('playerInfo', 'usertasklog').updateOne({uid: call.conn.uid, type: 'usertasklog'},
{$set: {maxpeijianlv: _maxLv, peijiancolor: color}}, {upsert: true}) {$set: {maxpeijianlv: _maxLv, peijiancolor: color}}, {upsert: true})
@ -23,7 +30,10 @@ export default async function (call: ApiCall<ReqGetList, ResGetList>) {
let list = Object.fromEntries(dbList.map(p => [G.formatRedisKey(p._id), p])); let list = Object.fromEntries(dbList.map(p => [G.formatRedisKey(p._id), p]));
G.redis.set('peijian', call.uid, list); G.redis.set('peijian', call.uid, list);
let recLshd = await G.mongodb.collection('playerInfo', 'lshd_peijian').findOne({ uid: call.conn.uid, type: 'lshd_peijian' }); let recLshd = await G.mongodb.collection('playerInfo', 'lshd_peijian').findOne({
uid: call.conn.uid,
type: 'lshd_peijian'
});
let {uid, _id, type, ...peijians} = (recLshd || {}); let {uid, _id, type, ...peijians} = (recLshd || {});
call.conn.lshd.peijian = peijians || {}; call.conn.lshd.peijian = peijians || {};

View File

@ -38,7 +38,7 @@ export default async function (call: ApiCall<ReqFight, ResFight>) {
// (await call.conn.gonghui)?.addExp(20, call.uid); // (await call.conn.gonghui)?.addExp(20, call.uid);
let rankKfjs = new RankKfjs(4) let rankKfjs = RankKfjs(4)
rankKfjs.setDataAndCheck({ rankKfjs.setDataAndCheck({
player: call.conn.gud, player: call.conn.gud,
valArr: [call.conn.gud.mapId] valArr: [call.conn.gud.mapId]

View File

@ -21,8 +21,9 @@ export default async function (call: ApiCall<ReqPing, ResPing>) {
openDay: PublicShared.getOpenServerDay() openDay: PublicShared.getOpenServerDay()
}); });
let gud = call.conn?.gud
G.server.sendMsgByUid(call.uid, 'msg_s2c/PlayerChange', { G.server.sendMsgByUid(call.uid, 'msg_s2c/PlayerChange', {
jinbi: call.conn.gud.jinbi, jinbi: gud?.jinbi,
rmbmoney: call.conn.gud.rmbmoney rmbmoney: gud?.rmbmoney
}); });
} }

View File

@ -250,7 +250,7 @@ BaseConnection.prototype.refreshPower = async function (this: BaseConnection<Ser
G.mongodb.collection('user').updateOne({ uid: this.uid }, { $set: dbUpdate }); G.mongodb.collection('user').updateOne({ uid: this.uid }, { $set: dbUpdate });
this.sendMsg('msg_s2c/PlayerChange', dbUpdate); this.sendMsg('msg_s2c/PlayerChange', dbUpdate);
let rankKfjs = new RankKfjs(7) let rankKfjs = RankKfjs(7)
rankKfjs.setDataAndCheck({ rankKfjs.setDataAndCheck({
player: this.gud, player: this.gud,
valArr: [power] valArr: [power]

View File

@ -0,0 +1,155 @@
import { log } from "console";
import { patchFun, patchInit } from "../patch";
import { TanXianFun } from "../public/tanxian";
import { PublicShared } from "../shared/public/public";
class Path {
async fun1(a: any) {
let hdid = 1703860546; // 正式服活动id
// let hdid = 1703917224; // 测试服活动id
let today_zero_time = PublicShared.getToDayZeroTime();
// 查询今天登录的用户
let today_login_users = await G.mongodb.collection("user").find(
{ loginTime: { $gte: today_zero_time } },
{ projection: { uid: 1 } }
).toArray();
for (let i = 0; i < today_login_users.length; i++) {
let uid = today_login_users[i].uid;
let init: boolean = false;
let hdata: any = await G.mongodb.cEvent(`yuandan${hdid}`).findOne({
uid: uid, type: `yuandan${hdid}`
});
if (!hdata) {
init = true;
hdata = {
uid: uid,
gift: {},
qiandao: {},
gameNum: 0,
exchange: {},
taskfinish: [],
taskval: {
"1": 1,
"2": 0,
"3": 0,
"4": 0,
"5": 0,
"6": 0,
"7": 0,
"8": 0,
"9": 0
},
qiandaoTime: 1,
refreshTime: G.time,
type: `yuandan${hdid}`,
}
}
let taskval = {};
// taskid=1, stype=123 今日登录
taskval["1"] = 1;
// taskid=2, stype=158 今日参与抓娃娃次数
taskval["2"] = hdata.gameNum;
// taskid=3, stype=127 挑战 n 次清缴真主党
let myData = await G.mongodb.cPlayerInfo('qjzzd').findOne({ uid: uid, type: 'qjzzd' });
if (myData?.refreFightTime > PublicShared.getToDayZeroTime()) {
taskval["3"] = myData?.useFightNum || 0;
} else {
taskval["3"] = 0;
}
// taskid=4, stype=155 领取每日任务最终宝箱
let task = await G.mongodb.collection('task').findOne({ uid: uid, taskid: 25 });
if (task && task.lasttime >= today_zero_time && task.finish == 1) {
taskval["4"] = 1;
} else {
taskval["4"] = 0;
}
// taskid=5, stype=142 势力 配置xx 捐献进行 n 次捐献
let jxdata = await G.mongodb.collection('gonghuiUser').findOne({ uid: uid });
if (jxdata && jxdata.jx?.refreshTime > today_zero_time) {
if (jxdata.jx?.record) {
taskval["5"] = jxdata.jx.record["2"] || 0
}else{
taskval["5"] = 0
}
} else {
taskval["5"] = 0;
}
// taskid=6, stype=156 每日钻石消耗
taskval["6"] = 0;
let uselogs = (await G.mongodb.collection('rmbuse').find(
{ uid: uid, cTime: { $gte: today_zero_time }, isAdd: false },
{ projection: { change: 1 } }
).toArray()).forEach(e => { taskval["6"] += -e.change; });
// taskid=7, stype=122 进行 n 次快速探险
taskval["7"] = 0;
const data = await G.mongodb.collection('tanxian').findOne({ uid: uid });
if (data?.resetTime > PublicShared.getToDayZeroTime()) {
taskval["7"] = data.useFastGuaJiNum || 0
}
// taskid=8, stype=157 获得vip经验
let orde_logs = await G.mongodb.collection('payOrderLog' as any).find(
{ uid: uid, ctime: { $gte: today_zero_time * 1000 } },
).toArray();
taskval["8"] = 0;
orde_logs.forEach(e => {
let pay = G.gc.pay[e.payId];
if (pay) taskval["8"] += pay.payExp[0].n;
})
// taskid=9, stype=157 获得vip经验
taskval["9"] = 0;
orde_logs.forEach(e => {
let pay = G.gc.pay[e.payId];
if (pay) taskval["9"] += pay.payExp[0].n;
})
if (!init) {
await G.mongodb.cEvent(`yuandan${hdid}`).updateOne(
{ uid: uid, type: `yuandan${hdid}` },
{ $set: { taskval: taskval } }
)
} else {
hdata.taskval = taskval;
await G.mongodb.cEvent(`yuandan${hdid}`).updateOne({ uid: uid, type: `yuandan${hdid}` }, { $set: hdata }, { upsert: true })
}
console.log("玩家执行完成:", uid, taskval);
}
return "sucess!!!"
}
async run() {
await this.fun1(1);
}
}
async function main() {
await patchInit()
let patch = new Path();
await patch.run();
console.log("逻辑执行完成,等待退出");
setTimeout(function () {
console.log('结束程序');
process.exit();
}, 3000);
}
main();

View File

@ -106,7 +106,8 @@ class _G {
/**跨服活动——消费竞赛的开启状态 */ /**跨服活动——消费竞赛的开启状态 */
huodong = { huodong = {
xfjs: false xfjs: false,
xfjsId: ''
}; };
private event = new EventEmitter(); private event = new EventEmitter();

View File

@ -54,8 +54,8 @@
"undefined": "游轮竞技第1名获得解锁后攻击加成+1%", "undefined": "游轮竞技第1名获得解锁后攻击加成+1%",
"img": "txk_016", "img": "txk_016",
"cond": [ "cond": [
"time", "jjc_rank",
-1 1
], ],
"intr": "playerheadFrame_des_4", "intr": "playerheadFrame_des_4",
"sort": 4, "sort": 4,

View File

@ -27,7 +27,7 @@ async function setHeroLvCount(call) {
let score = R.sum(arrList.map(i => i.lv)) let score = R.sum(arrList.map(i => i.lv))
let rankKfjs = new RankKfjs(2) let rankKfjs = RankKfjs(2)
rankKfjs.setDataAndCheck({ rankKfjs.setDataAndCheck({
player: call.conn.gud, player: call.conn.gud,
valArr: [score] valArr: [score]
@ -37,7 +37,7 @@ async function setHeroLvCount(call) {
async function setEquipLvCount(call) { async function setEquipLvCount(call) {
let status = getStatus() let status = getStatus()
if (status.type != 3) return if (status.type != 3) return
let rankKfjs = new RankKfjs(3) let rankKfjs = RankKfjs(3)
let equips = await G.mongodb.collection('equip').find({ let equips = await G.mongodb.collection('equip').find({
uid: call.uid, uid: call.uid,
wearaId: {$in: R.values(call.conn.gud.heroPos)} wearaId: {$in: R.values(call.conn.gud.heroPos)}

View File

@ -225,9 +225,9 @@ export class PlayerFun {
} }
G.mongodb.collection('rmbuse').insertOne(data); G.mongodb.collection('rmbuse').insertOne(data);
// 消费竞赛开启时写入跨服数据库 // 消费竞赛开启时写入跨服数据库
if (G.huodong.xfjs && !data.isAdd) { if (G.huodong.xfjs && !data.isAdd && typeof data.change == 'number') {
G.crossmongodb.collection('rmbuse').updateOne({uid: data.uid}, { G.crossmongodb.collection('rmbuse').updateOne({uid: data.uid, type: `xfjs_${G.huodong.xfjsId}`}, {
time: G.time, $set: {time: G.time},
$inc: {change: data.change} $inc: {change: data.change}
}, {upsert: true}); }, {upsert: true});
} }

View File

@ -12,8 +12,9 @@ import { RankWzryCross } from './rank_wzry';
import { RankXszm } from './rank_xszm'; import { RankXszm } from './rank_xszm';
import { RankZccg } from './rank_zccg'; import { RankZccg } from './rank_zccg';
import * as util from 'util' import * as util from 'util'
import { RankKfjs } from "./rank_kfjs"; import { RankKfjs_1 } from "./rank_kfjs";
import { clusterRunOnce } from '../../clusterUtils'; import { clusterRunOnce } from '../../clusterUtils';
import { number } from 'mathjs';
@ -33,8 +34,7 @@ export abstract class Rank {
zccg: RankZccg; zccg: RankZccg;
tujian: RankTujian; tujian: RankTujian;
wzryCross: RankWzryCross; wzryCross: RankWzryCross;
kfjs: RankKfjs }> & k_v<Rank> = {};
}> = {};
queue = new Queue(); queue = new Queue();
findKey = 'uid'; findKey = 'uid';
@ -109,7 +109,7 @@ export abstract class Rank {
} }
constructor() { constructor() {
Rank.list[this.getType()] = this; Rank.list[this.getType() as string] = this;
this.cotr(); this.cotr();
} }
@ -135,6 +135,10 @@ export abstract class Rank {
//将db里的数据写入到 rank:xxx:sort里 //将db里的数据写入到 rank:xxx:sort里
//写入的单条数据为: {uid:score} //写入的单条数据为: {uid:score}
// 首先清理redis中sort数据 在从数据库中初始化
await G.ioredis.del(this.getRedisKeySort);
this.db.find({ type: this.type }, { this.db.find({ type: this.type }, {
projection: { projection: {
"idKey": 1, "idKey": 1,
@ -302,7 +306,8 @@ export abstract class Rank {
}) })
} }
return res.map(ele => ele.data).sort(this.compareSort) as any; // 按照redis uids 排序顺序排序
return res.sort((a,b)=>uids.indexOf(a.idKey)-uids.indexOf(b.idKey)).map(ele => ele.data);
} }
return [] return []
} }

View File

@ -4,20 +4,15 @@ import {Rank} from './rank';
import kfjsFun from "../kaifujingsai"; import kfjsFun from "../kaifujingsai";
export class RankKfjs extends Rank { export class RankKfjs_1 extends Rank {
ctype: string;
ortype: string get ortype() {
ctype: string return `kfjs${kfjsFun.getStatus().type}`
constructor(ctype) {
super();
this.ctype = ctype
this.ortype = `kfjs${kfjsFun.getStatus().type}`
} }
getType(): rankType { getType(): rankType {
let status = kfjsFun.getStatus(this.ctype) return <rankType>`kfjs1`;
return <rankType>`kfjs${status.type}`;
} }
async setDataAndCheck(info: rankInfo) { async setDataAndCheck(info: rankInfo) {
@ -27,3 +22,46 @@ export class RankKfjs extends Rank {
this.addNew(info) this.addNew(info)
} }
} }
export class RankKfjs_2 extends RankKfjs_1 {
getType(): rankType {
return <rankType>`kfjs2`;
}
}
export class RankKfjs_3 extends RankKfjs_1 {
getType(): rankType {
return <rankType>`kfjs3`;
}
}
export class RankKfjs_4 extends RankKfjs_1 {
getType(): rankType {
return <rankType>`kfjs4`;
}
}
export class RankKfjs_5 extends RankKfjs_1 {
getType(): rankType {
return <rankType>`kfjs5`;
}
}
export class RankKfjs_6 extends RankKfjs_1 {
getType(): rankType {
return <rankType>`kfjs6`;
}
}
export class RankKfjs_7 extends RankKfjs_1 {
getType(): rankType {
return <rankType>`kfjs7`;
}
}
export function RankKfjs(type: number) {
return <RankKfjs_1>Rank.list[`kfjs${type}`]
}

View File

@ -39,22 +39,20 @@ export class Scheduler_xfjs_Local_Ctor extends Scheduler {
let limit = _hd.data?.rank?.slice(-1)?.[0]?.rank?.slice(-1)?.[0] || 100 let limit = _hd.data?.rank?.slice(-1)?.[0]?.rank?.slice(-1)?.[0] || 100
let rmbuse = await G.crossmongodb.collection('rmbuse').find({ let rmbuse = await G.crossmongodb.collection('rmbuse').find({type: `xfjs_${_hd.hdid}`}).sort({change: 1}).limit(limit).toArray()
time: {
$gte: _hd.stime,
$lte: _hd.etime + 10
}
}).sort({change: 1}).limit(limit).toArray()
let list: any = rmbuse.map(i => ({...i, total: R.negate(i.change)})) let list: any = rmbuse.map(i => ({...i, total: R.negate(i.change)}))
let ranklist = sortRankList(_hd.data.rank, list) let rankList = sortRankList(_hd.data.rank, list)
let userList = await G.crossmongodb.collection('huodong_user').find({uid: {$in: rankList.map(i => i._id).filter(i => i != 'system')}}).toArray()
rankList = rankList.map(i => ({...i, player: userList.find(v => v.uid == i.uid) || {}}))
R.forEach(i => { R.forEach(i => {
let users = R.slice(i.rank[0] - 1, i.rank[1])(ranklist) let users = R.slice(i.rank[0] - 1, i.rank[1])(rankList).filter(i => i._id != 'system')
users.map(v => { users.map(v => {
if (v._id == 'system') return if (G.config.serverId != v.player?.sid) return;
if (G.config.serverId != users.sid) return;
EmailFun.addEmail({ EmailFun.addEmail({
uid: v._id, uid: v._id,
type: 'system', type: 'system',

View File

@ -28,6 +28,7 @@ import { addListener } from './globalListener';
import { SchedulerManage } from './public/scheduler/scheduler'; import { SchedulerManage } from './public/scheduler/scheduler';
import {CrossEmailPull} from "./public/scheduler/scheduler_cross_email_pull"; import {CrossEmailPull} from "./public/scheduler/scheduler_cross_email_pull";
import {Scheduler_xfjs_Local_Ctor} from "./public/scheduler/scheduler_xiaofeijingsai"; import {Scheduler_xfjs_Local_Ctor} from "./public/scheduler/scheduler_xiaofeijingsai";
import { RankKfjs_1, RankKfjs_2, RankKfjs_3, RankKfjs_4, RankKfjs_5, RankKfjs_6, RankKfjs_7 } from './public/rank/rank_kfjs';
export async function startAfter() { export async function startAfter() {
//事件监听和定时器初始化 //事件监听和定时器初始化
@ -58,6 +59,14 @@ export async function startAfter() {
new RankSlzd5(); new RankSlzd5();
new RankSlzd6(); new RankSlzd6();
new RankKfjs_1();
new RankKfjs_2();
new RankKfjs_3();
new RankKfjs_4();
new RankKfjs_5();
new RankKfjs_6();
new RankKfjs_7();
new RankZccg(); new RankZccg();
new RankTujian(); new RankTujian();

View File

@ -55,7 +55,7 @@ export type hongdianKey =
| 'pobinglibao' | 'pobinglibao'
| 'payForDiamond' | 'payForDiamond'
| 'leichonglibao' | 'leichonglibao'
| 'yuandan';
export type hongdianVal = { export type hongdianVal = {
show?: boolean; show?: boolean;
// 看功能需要 // 看功能需要

View File

@ -15608,13 +15608,6 @@ export const serviceProto: ServiceProto<ServiceType> = {
"type": "Literal", "type": "Literal",
"literal": "leichonglibao" "literal": "leichonglibao"
} }
},
{
"id": 40,
"type": {
"type": "Literal",
"literal": "yuandan"
}
} }
] ]
}, },