好友:赠送领取爱心

This commit is contained in:
luying
2021-02-03 19:12:36 +08:00
parent 0046dc2afa
commit fe85f0e247
11 changed files with 449 additions and 66 deletions

View File

@@ -28,10 +28,17 @@ export default class FriendPoint extends BaseModel {
* @param {boolean} [lean=true]
* @memberof FriendPoint
*/
public static async updatePointToday(roleId: string, roleName: string, cntInc: number, maxPerDay: number, lean = true) {
public static async updatePointToday(roleId: string, roleName: string, cntInc: number, maxPerDay: number, type: number, lean = true) {
const curTime = new Date((new Date()).setHours(0, 0, 0, 0));
// 当 oldCnt + cntInc > maxPerDay 时需计算实际可以获得的点数cntInc - (newCnt - maxPerDay)
const rec: FriendPointType = await FriendPointModel.findOneAndUpdate({roleId, roleName, createdAt: {$gte: curTime}, cnt: {$lt: maxPerDay}}, {$inc: {cnt: cntInc}}, {upsert: true, new: true}).lean(lean);
const rec: FriendPointType = await FriendPointModel.findOneAndUpdate({roleId, roleName, createdAt: {$gte: curTime}, cnt: {$lt: maxPerDay}, type}, {$inc: {cnt: cntInc}}, {upsert: true, new: true}).lean(lean);
return rec;
}
public static async updateSendCntToday(roleId: string, roleName: string, cntInc: number, maxPerDay: number, type: number, lean = true) {
const curTime = new Date((new Date()).setHours(0, 0, 0, 0));
// 当 oldCnt + cntInc > maxPerDay 时需计算实际可以获得的点数cntInc - (newCnt - maxPerDay)
const rec: FriendPointType = await FriendPointModel.findOneAndUpdate({roleId, roleName, createdAt: {$gte: curTime}, sendCnt: {$lt: maxPerDay}, type}, {$inc: {sendCnt: cntInc}}, {upsert: true, new: true}).lean(lean);
return rec;
}

View File

@@ -2,9 +2,9 @@ import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, mongoose, Ref } from '@typegoose/typegoose';
import Role, { RoleType } from './Role';
import FriendShip, { FriendShipType } from './FriendShip';
import { ROLE } from '../consts';
import { ROLE, POPULATE_TYPE } from '../consts';
class Relation {
export class Relation {
@prop({ required: true, default: '' })
roleId: string; // 对方玩家id
@prop({ required: true, ref: 'Role', type: mongoose.Schema.Types.ObjectId })
@@ -45,13 +45,15 @@ export default class FriendRelation extends BaseModel {
let document = FriendRelationModel.findOne({ roleId })
.lean({ getters: true, virtuals: true });
if (populateType == 1) {
if (populateType == POPULATE_TYPE.FRIEND) {
document
.populate('friends.role', ROLE.SHOW_SIMPLE, 'Role')
.populate('friends.friendShip', null, 'FriendShip');
} else if (populateType == 2) {
} else if (populateType == POPULATE_TYPE.BLACKLIST) {
document
.populate('blacklist.role', ROLE.SHOW_SIMPLE, 'Role')
} else if (populateType == POPULATE_TYPE.FRIENDSHIP) {
document.populate('friends.friendShip', null, 'FriendShip');
}
let result: FriendRelationType = await document;

View File

@@ -1,6 +1,8 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { getFriendLvByExp } from '../pubUtils/data';
import * as util from '../pubUtils/friendUtil';
import { nowSeconds } from '../pubUtils/timeUtil';
/**
* 好友直接的亲密值
@@ -19,12 +21,24 @@ export default class FriendShip extends BaseModel {
@prop({ required: true, default: 0 })
sendHeartCntA: number; // 玩家A给玩家B送的心
@prop({ required: true, default: 0 })
sendHeartCntATime: number; // 玩家A给玩家B赠送时间
@prop({ required: true, default: 0 })
sendHeartCntB: number; // 玩家B给玩家A送的心
@prop({ required: true, default: 0 })
sendHeartCntBTime: number; // 玩家B给玩家A送的心赠送时间
@prop({ required: true, default: 0 })
receiveHeartCntA: number; // 玩家B领取玩家A送的心
@prop({ required: true, default: 0 })
receiveHeartCntATime: number; // 玩家B领取玩家A送的心时间
@prop({ required: true, default: 0 })
receiveHeartCntB: number; // 玩家A领取玩家B送的心
@prop({ required: true, default: 0 })
receiveHeartCntBTime: number; // 玩家A领取玩家B送的心时间
@prop({ required: true, default: new Date() })
refTime: Date;
@@ -35,40 +49,10 @@ export default class FriendShip extends BaseModel {
return getFriendLvByExp(this.friendValue);
}
private static getRoleIds(roleIds: string[]) {
roleIds.sort();
return {
roleIdA: roleIds[0],
roleIdB: roleIds[1],
roleIds: roleIds.join('|')
}
}
public static getRoleSendAndReceive(myRoleId: string, roleIds: string[], friendShip: FriendShipType) {
let { roleIdA, roleIdB } = this.getRoleIds(roleIds);
if (roleIdA == myRoleId) {
return {
sendHeart: friendShip.sendHeartCntA,
beSentHeart: friendShip.sendHeartCntB,
recieveHeart: friendShip.receiveHeartCntA,
beReceivedHeart: friendShip.receiveHeartCntB
}
} else if (roleIdB == myRoleId) {
return {
sendHeart: friendShip.sendHeartCntB,
beSentHeart: friendShip.sendHeartCntA,
receiveHeart: friendShip.receiveHeartCntB,
beReceivedHeart: friendShip.receiveHeartCntA
}
} else {
return false
}
}
// 创建
public static async createFriendShip(roleIdList: string[]) {
if (roleIdList.length != 2) return false;
let { roleIdA, roleIdB, roleIds } = this.getRoleIds(roleIdList);
let { roleIdA, roleIdB, roleIds } = util.getRoleIds(roleIdList);
const doc = new FriendShipModel();
const update = Object.assign(doc.toJSON(), { roleIdA, roleIdB, roleIds });
@@ -81,7 +65,7 @@ export default class FriendShip extends BaseModel {
// 清空亲密度
public static async clearValue(roleIdList: string[]) {
if (roleIdList.length != 2) return false;
let { roleIds } = this.getRoleIds(roleIdList);
let { roleIds } = util.getRoleIds(roleIdList);
const result: FriendShipType = await FriendShipModel.findOneAndUpdate({ roleIds }, { $set: { friendValue: 0 } }, { new: true }).lean();
return result;
@@ -93,6 +77,73 @@ export default class FriendShip extends BaseModel {
return result;
}
public static async refreshSendAndReceive(roleId: string, hisRoleId: string) {
let { roleIds } = util.getRoleIds([roleId, hisRoleId]);
let obj = this.getRefData();
const result: FriendShipType = await FriendShipModel.findOneAndUpdate({ roleIds }, {
$set: { ...obj }
}, { new: true }).lean();
return result;
}
private static getRefData() {
return {
sendHeartCntA: 0, sendHeartCntB: 0, receiveHeartCntA: 0, receiveHeartCntB: 0, refTime: new Date()
}
}
// 赠送爱心
public static async sendHeart(roleId: string, hisRoleId: string, inc: number, max: number, shouldRefresh: boolean) {
let { roleIds } = util.getRoleIds([roleId, hisRoleId]);
let params = util.inputSendCnt(roleId, hisRoleId, {
inc: { sendHeart: inc },
set: { sendHeartTime: nowSeconds() },
lt: { sendHeart: max - inc }
});
console.log(JSON.stringify(params))
if (!params) return false;
let result: FriendShipType;
if(shouldRefresh) {
let obj = this.getRefData();
result = await FriendShipModel.findOneAndUpdate({ roleIds }, {
$inc: { friendValue: 5},
$set: { ...obj, ...params.inc, ...params.set }
}, { new: true }).lean({ virtuals: true });
} else {
result = await FriendShipModel.findOneAndUpdate({ roleIds, ...params.lt }, {
$inc: { ...params.inc, friendValue: 5},
$set: params.set
}, { new: true }).lean({ virtuals: true });
}
return result;
}
// 领取爱心
public static async receiveHeart(roleId: string, hisRoleId: string, inc: number, max: number, shouldRefresh: boolean) {
let { roleIds } = util.getRoleIds([roleId, hisRoleId]);
let params = util.inputReceiveCnt(roleId, hisRoleId, {
inc: { receiveHeart: inc },
set: { receiveHeartTime: nowSeconds() },
lt: { receiveHeart: max - inc }
});
if (!params) return false;
let result: FriendShipType;
if(shouldRefresh) {
let obj = this.getRefData();
result = await FriendShipModel.findOneAndUpdate({ roleIds }, {
$inc: { friendValue: 5},
$set: { ...obj, ...params.inc, ...params.set }
}, { new: true }).lean({ virtuals: true });
} else {
result = await FriendShipModel.findOneAndUpdate({ roleIds, ...params.lt }, {
$inc: { ...params.inc, friendValue: 5},
$set: params.set
}, { new: true }).lean({ virtuals: true });
}
return result;
}
}
export const FriendShipModel = getModelForClass(FriendShip);