diff --git a/game-server/app/servers/role/handler/friendHandler.ts b/game-server/app/servers/role/handler/friendHandler.ts index a9510aa93..7daab56c1 100644 --- a/game-server/app/servers/role/handler/friendHandler.ts +++ b/game-server/app/servers/role/handler/friendHandler.ts @@ -1,10 +1,10 @@ import { Application, BackendSession } from "pinus"; import { resResult, getRandEelm, getResStr } from "../../../pubUtils/util"; -import { STATUS, ROLE, FRIEND_DROP_TYPE, FRIEND_RELATION_TYPE } from "../../../consts"; +import { STATUS, ROLE, FRIEND_DROP_TYPE, FRIEND_RELATION_TYPE, POPULATE_TYPE, BLOCK_OPEATE } from "../../../consts"; import { RoleModel, RoleType } from "../../../db/Role"; import { getBeforeDaySeconds } from "../../../pubUtils/timeUtil"; import { FriendApplyModel } from "../../../db/FriendApply"; -import { FriendApplyParams, FriendListParam, FriendRecommendParams } from "../../../domain/roleField/friend"; +import { FriendApplyParams, FriendListParam, FriendRecommendParams, BlackListParam } from "../../../domain/roleField/friend"; import { FriendShipModel, FriendShipType } from "../../../db/FriendShip"; import { FriendRelationModel } from "../../../db/FriendRelation"; import { isRoleOnline } from "../../../services/redisService"; @@ -29,7 +29,7 @@ export class FriendHandler { const { lv } = await RoleModel.findByRoleId(roleId, ROLE.GET_LV); let allList = await RoleModel.getRecommedList(lv - 5, lv + 5, day); - let myFriendRelation = await FriendRelationModel.findFriendByRole(roleId, false); + let myFriendRelation = await FriendRelationModel.findFriendByRole(roleId, POPULATE_TYPE.NOT); let paramAllList = new Array(); for(let role of allList) { @@ -53,7 +53,7 @@ export class FriendHandler { let { value } = msg; let allList = await RoleModel.searchByNameOrId(value); - let myFriendRelation = await FriendRelationModel.findFriendByRole(roleId, false); + let myFriendRelation = await FriendRelationModel.findFriendByRole(roleId, POPULATE_TYPE.NOT); let list = new Array(); for(let role of allList) { @@ -73,7 +73,7 @@ export class FriendHandler { let roleIds = msg.roleIds; const role = await RoleModel.findByRoleId(roleId, ROLE.GET_ROLE_ID); - let myFriendRelation = await FriendRelationModel.findFriendByRole(roleId, false); + let myFriendRelation = await FriendRelationModel.findFriendByRole(roleId, POPULATE_TYPE.NOT); let str = '', resultRoleIds = new Array(); for(let hisRoleId of roleIds) { @@ -128,7 +128,7 @@ export class FriendHandler { let role = await RoleModel.findByRoleId(roleId); let friendCnt = role.friendCnt; - let myFriendRelation = await FriendRelationModel.findFriendByRole(roleId, false); + let myFriendRelation = await FriendRelationModel.findFriendByRole(roleId, POPULATE_TYPE.NOT); let applyList = await FriendApplyModel.getApplyListByCode(applyCodeList); let list = new Array(); @@ -187,7 +187,7 @@ export class FriendHandler { let role = await RoleModel.findByRoleId(roleId); let list = new Array(); - let myRelation = await FriendRelationModel.findFriendByRole(roleId); + let myRelation = await FriendRelationModel.findFriendByRole(roleId, POPULATE_TYPE.FRIEND); let friendList = myRelation?myRelation.friends: []; for(let friend of friendList) { let role = friend.role; @@ -221,4 +221,112 @@ export class FriendHandler { friendCnt, blockCnt }); } + + // 获取黑名单 + public async getBlackList(msg: { }, session: BackendSession) { + let roleId: string = session.get('roleId'); + + let role = await RoleModel.findByRoleId(roleId); + let list = new Array(); + let myRelation = await FriendRelationModel.findFriendByRole(roleId, POPULATE_TYPE.BLACKLIST); + let blacklist = myRelation?myRelation.blacklist: []; + for(let bl of blacklist) { + let role = bl.role; + if(!role) continue; + let param = new BlackListParam(role); + let isOnline = await isRoleOnline(role.roleId); + param.setOnline(isOnline); + + list.push(param); + + } + + let { friendCnt = 0, blockCnt = 0 } = role; + + return resResult(STATUS.SUCCESS, { + list, + friendCnt, blockCnt + }); + } + + + // 拉黑/移除 + public async setBlackList(msg: { roleId: string, type: number }, session: BackendSession) { + let roleId: string = session.get('roleId'); + let { roleId: hisRoleId, type } = msg; + + let role = await RoleModel.findByRoleId(roleId); + + let str = '', list = new Array(); + if(type == BLOCK_OPEATE.ADD) { + let myRelation = await FriendRelationModel.findFriendByRole(roleId, POPULATE_TYPE.FRIEND); + let friends = myRelation?myRelation.friends: []; + let blacklist = myRelation?myRelation.blacklist: []; + let curFriend = friends.find(cur => cur.roleId == hisRoleId); + let curBlack = blacklist.find(cur => cur.roleId == hisRoleId); + if(curBlack) { + return resResult(STATUS.FRIEND_BLACK_HAS_ADD); + } + + role = await RoleModel.increaseBlockCnt(roleId, 1, curFriend? -1: 0, 100); // 增加黑名单人数 + if(!role) { + return resResult(STATUS.FRIEND_BLACK_MAX) + } + await RoleModel.increaseFriendCnt(hisRoleId, curFriend? -1: 0); // 对方好友减少 + + let friend: RoleType, friendShip: FriendShipType; + if(!!curFriend) { + await FriendShipModel.clearValue([roleId, hisRoleId]); + friend = curFriend.role; + friendShip = curFriend.friendShip; + } else { + friend = await RoleModel.findByRoleId(hisRoleId); + } + + await FriendRelationModel.moveFromFriend(hisRoleId, role, friendShip, false); //从对方好友删除 + await FriendRelationModel.moveFromFriend(roleId, friend, friendShip, true); // 删除好友关系并拉黑 + + let param = new BlackListParam(friend); + let isOnline = await isRoleOnline(role.roleId); + param.setOnline(isOnline); + list.push(param); + + } else if(type == BLOCK_OPEATE.REMOVE || type == BLOCK_OPEATE.REMOVE_AND_APPLY){ + let myRelation = await FriendRelationModel.findFriendByRole(roleId, POPULATE_TYPE.BLACKLIST); + let blacklist = myRelation?myRelation.blacklist: []; + + let curFriend = blacklist.find(cur => cur.roleId == hisRoleId); + if(!curFriend) { + return resResult(STATUS.FRIEND_BLACK_NOT_FOUND); + } + + role = await RoleModel.increaseBlockCnt(roleId, -1, 0, 100); // 黑名单人数减 + if(!role) { + return resResult(STATUS.FRIEND_BLACK_MAX) + } + await FriendRelationModel.removeFromBlack(roleId, hisRoleId); + + if(type == BLOCK_OPEATE.REMOVE_AND_APPLY) { + // 申请好友 + let applyResult = await RoleModel.increaseFriendApplyCnt(hisRoleId, 1, 50); + if(!applyResult) { + str = getResStr(STATUS.FRIEND_HIS_APPLY_MAX); + } + + await FriendApplyModel.createApply(hisRoleId, role); + } + + } else { + return resResult(STATUS.WRONG_PARMS); + } + + let { friendCnt = 0, blockCnt = 0 } = role; + + return resResult(STATUS.SUCCESS, { + isSuccess: str == '', + msg: str, + list, + friendCnt, blockCnt + }); + } } \ No newline at end of file diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 6d0962ec7..faca6ff70 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -369,4 +369,16 @@ export enum FRIEND_RELATION_TYPE { HAS_FRIEND = 2, HAS_BLOCKED = 3, MYSELF = 4 +} + +export enum POPULATE_TYPE { + NOT = 0, + FRIEND = 1, + BLACKLIST = 2 +} + +export enum BLOCK_OPEATE { + ADD = 1, + REMOVE = 2, + REMOVE_AND_APPLY = 3 } \ No newline at end of file diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 3fe99942e..ffcd54e14 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -251,7 +251,9 @@ export const STATUS = { FRIEND_YOURSELF: { code: 30704, simStr: '不能添加自己为好友' }, FRIEND_HIS_APPLY_MAX: { code: 30705, simStr: '该玩家申请达上限' }, FRIEND_SHIP_CREATE_ERROR: { code: 30706, simStr: '创建失败' }, - + FRIEND_BLACK_MAX: { code: 30707, simStr: '黑名单数量已达上限' }, + FRIEND_BLACK_NOT_FOUND: { code: 30709, simStr: '该玩家不在黑名单' }, + FRIEND_BLACK_HAS_ADD: { code: 30710, simStr: '该玩家已在黑名单' }, // 社交相关状态 40000 - 49999 // 运营模块相关状态 50000 - 59999 diff --git a/shared/db/FriendRelation.ts b/shared/db/FriendRelation.ts index 0f50506e3..fbd8eb0e3 100644 --- a/shared/db/FriendRelation.ts +++ b/shared/db/FriendRelation.ts @@ -41,20 +41,42 @@ export default class FriendRelation extends BaseModel { // 获取列表 - public static async findFriendByRole(roleId: string, populate = true) { + public static async findFriendByRole(roleId: string, populateType: number) { let document = FriendRelationModel.findOne({ roleId }) .lean({ getters: true, virtuals: true }); - if (populate) { + if (populateType == 1) { document .populate('friends.role', ROLE.SHOW_SIMPLE, 'Role') .populate('friends.friendShip', null, 'FriendShip'); + } else if (populateType == 2) { + document + .populate('blacklist.role', ROLE.SHOW_SIMPLE, 'Role') } let result: FriendRelationType = await document; return result; } + public static async moveFromFriend(roleId: string, friend: RoleType, friendShip: FriendShipType, toBlack: boolean ) { + let update = { + $pull: { friends: { roleId: friend.roleId } } + } + if(toBlack) { + update['$push'] = { blacklist: { roleId: friend.roleId, role: friend._id, friendShip: friendShip? friendShip._id: null } }; + } + + let result: FriendRelationType = await FriendRelationModel.findOneAndUpdate({ roleId }, update, { new: true }); + return result + } + + public static async removeFromBlack(roleId: string, frdRoleId: string ) { + let result: FriendRelationType = await FriendRelationModel.findOneAndUpdate({ roleId }, { + $pull: { blacklist: { roleId: frdRoleId } } + }, { new: true }); + return result + } + public static async deleteAccount(roleId: string) { let result = await FriendRelationModel.deleteMany({ roleId }); await FriendRelationModel.updateMany({}, { $pull: { friends: { roleId }, blacklist: { roleId } }}); diff --git a/shared/db/FriendShip.ts b/shared/db/FriendShip.ts index 763b3c2a7..0eb93a33a 100644 --- a/shared/db/FriendShip.ts +++ b/shared/db/FriendShip.ts @@ -69,16 +69,24 @@ export default class FriendShip extends BaseModel { public static async createFriendShip(roleIdList: string[]) { if (roleIdList.length != 2) return false; let { roleIdA, roleIdB, roleIds } = this.getRoleIds(roleIdList); - console.log(roleIdA, roleIdB, roleIds) const doc = new FriendShipModel(); const update = Object.assign(doc.toJSON(), { roleIdA, roleIdB, roleIds }); - const result: FriendShipType = await FriendShipModel.findOneAndUpdate({ roleIds }, update, { upsert: true, new: true }).lean(); + const result: FriendShipType = await FriendShipModel.findOneAndUpdate({ roleIds }, { $setOnInsert: update }, { upsert: true, new: true }).lean(); return result; } + // 清空亲密度 + public static async clearValue(roleIdList: string[]) { + if (roleIdList.length != 2) return false; + let { roleIds } = this.getRoleIds(roleIdList); + + const result: FriendShipType = await FriendShipModel.findOneAndUpdate({ roleIds }, { $set: { friendValue: 0 } }, { new: true }).lean(); + return result; + } + // 查询关系 public static async deleteAccount(roleId: string) { let result = await FriendShipModel.deleteMany({ $or: [{ roleIdA: roleId }, { roleIdB: roleId }] }); diff --git a/shared/db/Role.ts b/shared/db/Role.ts index 702bc9a40..b10364485 100644 --- a/shared/db/Role.ts +++ b/shared/db/Role.ts @@ -353,6 +353,7 @@ export default class Role extends BaseModel { const role: RoleType = await RoleModel.findOneAndUpdate({roleId}, {$inc: {towerTaskCnt: num}}, {new: true}).lean(lean); return role; } + // 派遣任务增加刷新次数 public static async increaseTowerRefCnt(roleId: string, num: number, lean = true) { const role: RoleType = await RoleModel.findOneAndUpdate({roleId}, {$inc: {towerTaskReCnt: num}}, {new: true}).lean(lean); @@ -482,8 +483,12 @@ export default class Role extends BaseModel { } // 增加好友数量 - public static async increaseFriendCnt(roleId: string, inc: number, max: number) { - const result = await RoleModel.findOneAndUpdate({ roleId, friendCnt: {$lte: max - inc}}, {$inc: { friendCnt: inc }}, {new: true}).lean(); + public static async increaseFriendCnt(roleId: string, inc: number, max?: number) { + let condition = { roleId }; + if(max) { + condition['friendCnt'] = {$lte: max - inc}; + } + const result = await RoleModel.findOneAndUpdate(condition, {$inc: { friendCnt: inc }}, {new: true}).lean(); return result; } @@ -492,6 +497,12 @@ export default class Role extends BaseModel { const result = await RoleModel.findOneAndUpdate({ roleId, recFrdApplyCnt: {$lte: max - inc}}, {$inc: { recFrdApplyCnt: inc }}, {new: true}).lean(); return result; } + + // 增加黑名单数量 + public static async increaseBlockCnt(roleId: string, blockCnt: number, friendCnt: number, maxBlockCnt: number) { + const result = await RoleModel.findOneAndUpdate({ roleId, blockCnt: {$lte: maxBlockCnt - blockCnt}}, {$inc: { blockCnt, friendCnt }}, {new: true}).lean(); + return result; + } } export const RoleModel = getModelForClass(Role); diff --git a/shared/domain/roleField/friend.ts b/shared/domain/roleField/friend.ts index f22bb0156..752bf6a2d 100644 --- a/shared/domain/roleField/friend.ts +++ b/shared/domain/roleField/friend.ts @@ -77,4 +77,21 @@ export class FriendListParam extends FriendParams { setCanSend(canSend: boolean) { this.canSend = canSend; } +} + + +export class BlackListParam extends FriendParams { + guildName: string = ""; + isOnline: boolean = false; + quitTime: number = 0; + + constructor(role: RoleType) { + super(role); + if(role.guildName) this.guildName = role.guildName; + this.quitTime = role.quitTime; + } + + setOnline(isOnline: boolean) { + this.isOnline = isOnline; + } } \ No newline at end of file