HJ_Server/src/public/user.ts
2024-01-12 23:10:39 +08:00

407 lines
14 KiB
TypeScript

import CryptoJS from 'crypto-js';
import {ObjectId, OptionalId, WithId} from 'mongodb';
import {BaseConnection} from 'tsrpc';
import {Wjjl} from '../module/collection_wjjl';
import {ServiceType} from '../shared/protocols/serviceProto';
import {ReqLogin, ResLogin, playerAppend, playerAttr, playerInfo} from '../shared/protocols/user/PtlLogin';
import {player} from '../shared/protocols/user/type';
import {PublicShared} from '../shared/public/public';
import {PlayerFun} from './player';
import {ZhanLingTasks} from './zhanling';
import {getGud, setGud} from './gud';
export const defaultUserInfo: playerInfo = {
lv: 1,
vip: 0,
uid: '',
bindUid: '',
power: 0
};
export const defaultUserAttr: playerAttr = {
nexp: 0,
jinbi: 100,
rmbmoney: 100,
rongyu: 0,
payExp: 0,
guijinshu: 0
};
export const defaultUserAppend: playerAppend = {
name: '',
tujianLv: 0,
head: {id: "1", time: -1},
headFrame: {id: "1", time: -1},
chatFrame: {id: "1", time: -1},
upModel: {id: "1", time: -1},
model: {
1: {id: "1", time: -1},
2: {id: "2", time: -1}
},
renown: 0,
wxcLv: {
lv: 0,
ids: []
},
mapId: 0,
shoucangping: {},
useTujianLvPoint: 0,
skills: {},
fightSkills: {},
heroPos: {
1: '',
2: '',
3: '',
4: '',
5: '',
6: ''
},
ghId: '',
ghName: '',
ghLevel: 0,
ghwz: {1: 0, 2: 0, 3: 0, 4: 0}
};
export class UserFun {
static create(bUid: string) {
let {bindUid, ...userInfo} = defaultUserInfo;
return {
bindUid: bUid,
...userInfo,
...defaultUserAttr
};
}
static async check(gud: ResLogin['gud'], req: ReqLogin) {
let obj: k_v<any> = {};
let add: k_v<any> = {};
for (let k in defaultUserAppend) {
if (gud[k] == undefined) {
let val = defaultUserAppend[k];
switch (k as keyof playerAppend) {
// case 'name':
// let b64 = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(gud.bindUid + gud.sid));
// val = `temp_${b64}`.toLocaleLowerCase();
// break;
}
gud[k] = val;
add[k] = val;
}
}
for (let k in G.gc.attr) {
if (gud[k] == undefined) {
gud[k] = defaultUserAttr[k];
add[k] = defaultUserAttr[k] || 0;
}
}
if (!gud.cTime) {
gud.cTime = G.time;
add.cTime = G.time;
}
if (!gud.sid) {
gud.sid = req.sid;
add.sid = req.sid;
}
if (!gud.serverName) {
gud.serverName = req.serverName;
add.serverName = req.serverName;
}
if (!gud.matrix) {
gud.matrix = Object.fromEntries(Object.keys(G.gc.fightPlan).map(t => [t, 0]));
gud.selectMatrix = '';
add.matrix = gud.matrix;
add.selectMatrix = gud.selectMatrix;
}
if (!gud.fightHeros) {
let h_ids = Object.values(gud.heroPos).filter(_id => _id != '');
if (h_ids.length < 1) {
gud.fightHeros = [];
} else {
let dHeros = await G.mongodb.collection('hero').find({_id: {$in: h_ids.map(id => G.mongodb.conversionId(id))}}).toArray();
gud.fightHeros = dHeros.map(h => h.heroId.toString());
}
add.fightHeros = gud.fightHeros;
}
if (!gud.matrixPos) {
gud.matrixPos = Object.fromEntries(Object.keys(G.gc.fightPlan).map(pos => [pos, {...gud.heroPos}]));
add.matrixPos = gud.matrixPos;
}
if (!gud.helpHeros) {
gud.helpHeros = [];
add.helpHeros = [];
}
if (!gud.headFrames) {
gud.headFrames = {};
for (let [id, conf] of Object.entries(G.gc.playerHeadFrame)) {
if (typeof gud[conf.cond[0]] == 'number' && gud[conf.cond[0]] >= conf.cond[1]) {
gud.headFrames[id] = -1;
} else {
switch (conf.cond[0]) {
case 'wxcLv':
if (gud.wxcLv.lv >= conf.cond[1]) gud.headFrames[id] = -1;
break;
}
}
}
add.headFrames = gud.headFrames;
}
if (!gud.chatFrames) {
gud.chatFrames = {};
for (let [id, conf] of Object.entries(G.gc.playerChatFrame)) {
if (typeof gud[conf.cond[0]] == 'number' && gud[conf.cond[0]] >= conf.cond[1]) {
gud.chatFrames[id] = -1;
} else {
switch (conf.cond[0]) {
case 'wxcLv':
if (gud.wxcLv.lv >= conf.cond[1]) gud.chatFrames[id] = -1;
break;
}
}
}
add.chatFrames = gud.chatFrames;
}
if (gud.onlineTime == undefined) {
gud.onlineTime = 0;
add.onlineTime = 0;
}
//每天首次登陆
if (!gud.loginTime || PublicShared.getToDayZeroTime(gud.loginTime) != PublicShared.getToDayZeroTime(G.time)) {
gud.loginDays = gud.loginDays ? gud.loginDays + 1 : 1;
add.loginDays = gud.loginDays;
Wjjl.setVal(gud.uid, `toDayLogin_${PublicShared.getOpenServerDay(gud.cTime, G.time)}`, 1);
if (gud.logoutTime && PublicShared.getToWeekMondayZeroTime(gud.logoutTime) < PublicShared.getToWeekMondayZeroTime(G.time)) {
ZhanLingTasks.clearLog(gud.uid, 'week');
}
obj.todayFirstLogin = true;
}
gud.loginTime = G.time;
add.loginTime = G.time;
if (Object.keys(add).length > 0) {
G.mongodb.collection('user').updateOne({bindUid: gud.bindUid, sid: gud.sid}, {
$set: {
...add
}
});
setGud(gud.uid, add);
}
return obj;
}
// 检查空数据并修复
static async checkUidOrName() {
let users = await G.mongodb.collection('user').findOne({$or: [{uid: {$in: ['', null]}}, {name: {$in: ['', null]}}]})
if (users) {
let {bindUid, sid, _id} = users
let uid = users.uid || (sid + '_' + _id)
// 随机创建name
let b64 = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(bindUid + sid));
let name = users.name || `temp_${b64}`.toLocaleLowerCase();
await G.mongodb.collection('user').updateOne({bindUid, sid}, {
$set: {
uid, name
}
});
}
return
}
/**创建账号数据 */
static async createUser(client: BaseConnection<ServiceType>, bindUid: string, sid: number): Promise<WithId<OptionalId<ResLogin['gud']>>> {
// 开启事务
// let session = G.mongodbClient.startSession()
// session.startTransaction() // 开启事务
let gud: ResLogin['gud'] = this.create(bindUid);
gud.sid = sid
gud._id = new ObjectId()
gud.uid = sid + '_' + gud._id.toHexString();
// 随机创建name
let b64 = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(gud.bindUid + gud.sid));
gud.name = `temp_${b64}`.toLocaleLowerCase();
gud.logoutTime = 0 // 设置默认值
gud.status = 0 // 设置默认值
gud.status_chat = 0 // 设置默认值
await G.mongodb.collection('user').insertOne(gud);
// await G.mongodb.collection('user').updateOne({ bindUid,sid }, {
// $set: {
// uid: gud.uid,
// name: gud.name
// }
// });
// 暂不做错误预处理,提交事务
// session.abortTransaction() // 回滚
// session.commitTransaction() // 提交
// session.endSession() // 结束事务
return gud as WithId<OptionalId<ResLogin['gud']>>;
}
/**获取玩家附带的buff加成 */
static getOtherBuff(gud: ResLogin['gud']) {
return gud;
}
static async getGud(uid: string) {
return await getGud(uid);
}
/**激活头像框 */
static async activeHeadFrame(uid: string, k: string, v: number) {
let gud: player;
gud = await getGud(uid);
let change = false;
let headFrame = G.gc.playerHeadFrame;
let checks = Object.values(headFrame).filter(v => v.cond[0] == k);
if (checks.length > 0) {
checks.forEach(conf => {
let val = v;
if (k == 'wxcLv') val = gud.wxcLv.lv;
else if (gud[k] != undefined) val = gud[k];
if (k == 'jjc_rank') {
if (!gud.headFrames[conf.id] && val <= conf.cond[1]) {
gud.headFrames[conf.id] = -1;
change = true;
} else return
} else if (!gud.headFrames[conf.id] && val >= conf.cond[1]) {
gud.headFrames[conf.id] = -1;
change = true;
}
});
} else {
let conf = headFrame[k];
if (conf?.cond?.[0] == 'time') {
let val = conf.cond[1];
if (val == -1 && !gud.headFrames[conf.id]) {
change = true;
gud.headFrames[conf.id] = -1;
} else if (val > 0 && gud.headFrames[conf.id] != -1) {
change = true;
gud.headFrames[conf.id] = G.time + val * v;
}
}
else if(conf?.cond?.[0] == "jjc_rank") {
change = true;
gud.headFrames[conf.id] = -1;
}
}
if (change) {
PlayerFun.changeAttr(uid, {headFrames: gud.headFrames});
G.server.sendMsgByUid(uid, 'msg_s2c/PlayerChange', {headFrames: gud.headFrames});
G.server.uid_connections[uid]?.refreshPower();
}
}
/**激活聊天框 */
static async activeChatFrame(uid: string, k: string, v: number) {
let gud: player;
gud = await getGud(uid);
let change = false;
let chatFrame = G.gc.playerChatFrame;
let checks = Object.values(chatFrame).filter(v => v.cond[0] == k);
if (checks.length > 0) {
checks.forEach(conf => {
let val = v;
if (k == 'wxcLv') val = gud.wxcLv.lv;
else if (gud[k] != undefined) val = gud[k];
if (k == 'jjc_rank' && !gud.chatFrames[conf.id] && val <= conf.cond[1]) {
gud.chatFrames[conf.id] = -1;
change = true;
} else if (!gud.chatFrames[conf.id] && val >= conf.cond[1]) {
gud.chatFrames[conf.id] = -1;
change = true;
}
});
} else {
let conf = chatFrame[k];
if (conf?.cond?.[0] == 'time') {
let val = conf.cond[1];
if (val == -1 && !gud.chatFrames[conf.id]) {
change = true;
gud.chatFrames[conf.id] = -1;
} else if (val > 0 && gud.chatFrames[conf.id] != -1) {
change = true;
gud.chatFrames[conf.id] = G.time + val * v;
}
}
}
if (change) {
PlayerFun.changeAttr(uid, {chatFrames: gud.chatFrames});
G.server.sendMsgByUid(uid, 'msg_s2c/PlayerChange', {chatFrames: gud.chatFrames});
G.server.uid_connections[uid]?.refreshPower();
}
}
/**激活造型 */
static async activeModel(uid: string, k: string, v: number) {
let gud: player;
gud = await getGud(uid);
let change = false;
let model = G.gc.playerModel;
let checks = Object.values(model).filter(v => v.cond[0] == k);
if (checks.length > 0) {
checks.forEach(conf => {
let val = v;
if (k == 'wxcLv') val = gud.wxcLv.lv;
else if (gud[k] != undefined) val = gud[k];
if (k == 'jjc_rank' && !gud.model[conf.id] && val <= conf.cond[1]) {
gud.model[conf.id] = {id: conf.id + '', time: -1};
change = true;
} else if (!gud.model[conf.id] && val >= conf.cond[1]) {
gud.model[conf.id] = {id: conf.id + '', time: -1};
change = true;
}
});
} else {
let conf = model[k];
if (conf?.cond?.[0] == 'time') {
let val = conf.cond[1];
if (val == -1) {
change = true;
gud.model[conf.id] = {id: conf.id + '', time: -1};
} else if (gud.model[conf.id].time < G.time) {
change = true;
gud.model[conf.id] = {id: conf.id + '', time: G.time + val * v};
} else {
change = true;
gud.model[conf.id] = {id: conf.id + '', time: gud.model[conf.id].time += val * v}
}
}
}
if (change) {
PlayerFun.changeAttr(uid, {model: gud.model});
G.server.sendMsgByUid(uid, 'msg_s2c/PlayerChange', {model: gud.model});
G.server.uid_connections[uid]?.refreshPower();
}
}
}