diff --git a/game-server/app/servers/chat/remote/guildRemote.ts b/game-server/app/servers/chat/remote/guildRemote.ts index 6b4bcc953..cfa698fef 100644 --- a/game-server/app/servers/chat/remote/guildRemote.ts +++ b/game-server/app/servers/chat/remote/guildRemote.ts @@ -10,6 +10,7 @@ import { MailParam } from '../../../domain/roleField/mail'; import { pick } from 'underscore'; import { LotType } from '../../../db/Lot'; import { DividendType } from '../../../db/Dividend'; +import { getRoleOnlineInfo } from '../../../services/redisService'; export default function (app: Application) { new HandlerService(app, {}); @@ -66,12 +67,13 @@ export class GuildRemote { * @param message 推送信息 * @param sid 玩家服 */ - private pushMessageByUids(guildCode: string, path: string, roleId: string, message: { code: string, roleId?: string }, sid?: string) { + private async pushMessageByUids(guildCode: string, path: string, roleId: string, message: { code: string, roleId?: string }, sid?: string) { let channel = this.getChannel(guildCode); let uids = []; if (!sid) { - sid = channel && channel.getMember(roleId)['sid']; + let onlineUser = await getRoleOnlineInfo(roleId); + sid = onlineUser.sid; } if (sid) { uids.push({ uid: roleId, sid }); @@ -165,10 +167,14 @@ export class GuildRemote { * @param oldLeaderId 旧团长 */ public changeLeader(guildCode: string, managerCnt: number, newLeader: RoleType, oldLeaderId: string) { - let { roleId, roleName, frame, head, spine, lv, quitTime } = newLeader; - this.updateInfo(guildCode, { managerCnt, leader: { roleId, roleName, frame, head, spine, lv, quitTime } }); - this.demotion(guildCode, oldLeaderId); - this.promotion(guildCode, roleId); + try{ + let { roleId, roleName, frame, head, spine, lv, quitTime } = newLeader; + this.updateInfo(guildCode, { managerCnt, leader: { roleId, roleName, frame, head, spine, lv, quitTime } }); + this.demotion(guildCode, oldLeaderId); + this.promotion(guildCode, roleId); + }catch(e) { + console.log(e.stack) + } } /** diff --git a/game-server/app/servers/gm/handler/gmRoleHandler.ts b/game-server/app/servers/gm/handler/gmRoleHandler.ts index 0db0d7324..4c0580846 100644 --- a/game-server/app/servers/gm/handler/gmRoleHandler.ts +++ b/game-server/app/servers/gm/handler/gmRoleHandler.ts @@ -6,7 +6,7 @@ import { addItems, createHeroes } from '../../../services/rewardService'; import { RewardInter } from '../../../pubUtils/interface'; import { getExpByLv } from '../../../pubUtils/data'; import { RoleModel, RoleType } from '../../../db/Role'; -import { BLOCK_TYPE, GUILD_DISMISS_WAY, GUILD_STRUCTURE, ITEM_CHANGE_REASON, REDIS_KEY, TA_EVENT } from '../../../consts'; +import { BLOCK_TYPE, GUILD_AUTH, GUILD_DISMISS_WAY, GUILD_JOB, GUILD_MASTER_CHANGE_WAY, GUILD_STATUS, GUILD_STRUCTURE, ITEM_CHANGE_REASON, MAIL_TYPE, REDIS_KEY, TA_EVENT } from '../../../consts'; import { GuildFormParam } from '../../../domain/backEndField/params'; import { GuildModel, GuildUpdateParam } from '../../../db/Guild'; import { getGuildChannelSid } from '../../../services/chatService'; @@ -15,6 +15,8 @@ import { Rank } from '../../../services/rankService'; import { UserGuildModel } from '../../../db/UserGuild'; import { UserGuildApplyModel } from '../../../db/UserGuildApply'; import { reportTAEvent } from '../../../services/sdkService'; +import { sendMailByContent } from '../../../services/mailService'; +import { GuildLeader } from '../../../domain/rank'; let timer: NodeJS.Timer; export default function (app: Application) { @@ -130,6 +132,7 @@ export class GmRoleHandler { let guild = await GuildModel.findByCode(code, null, '+serverId'); if(!guild) return resResult(STATUS.GUILD_NOT_FOUND); + if(guild.status == GUILD_STATUS.DISMISSED) return resResult(STATUS.GUILD_DELETE_ERROR); let serverId = guild.serverId; guild = await GuildModel.dismiss(code, serverId); @@ -156,4 +159,43 @@ export class GmRoleHandler { return resResult(STATUS.SUCCESS, { code, status: guild.status }); } + + async setGuildLeader(msg: { code: string, roleId: string }, session: BackendSession) { + + const { code, roleId } = msg; + let guild = await GuildModel.findByCode(code, null, '+serverId'); + if(!guild) return resResult(STATUS.GUILD_NOT_FOUND); + if(guild.status == GUILD_STATUS.DISMISSED) return resResult(STATUS.GUILD_DELETE_ERROR); + + let role = await RoleModel.findByRoleId(roleId); + if(!role) return resResult(STATUS.ROLE_NOT_FOUND); + + let userGuild = await UserGuildModel.getMyGuild(roleId); + if(!userGuild || userGuild.guildCode != code) return resResult(STATUS.GUILD_KICK_ERROR); + if(userGuild.auth == GUILD_AUTH.LEADER) return resResult(STATUS.GUILD_USER_IS_LEADER); + + let leader = guild.leader; + // 交换 + let oldLeaderUserGuild = await UserGuildModel.updateInfo(leader.roleId, { auth: GUILD_AUTH.MEMBER, job: GUILD_JOB.SHIBING }, {}, 'auth'); // 团长撤 + await this.app.rpc.connector.connectorRemote.setOtherUserGuildSession.broadcast([{ roleId: leader.roleId, userGuild: oldLeaderUserGuild }]); // 更新session + + let newLeaderUserGuild = await UserGuildModel.updateInfo(roleId, { auth: GUILD_AUTH.LEADER, job: GUILD_JOB.DAJIANGJUN }, {}, 'auth'); // 最高功勋人升 + await this.app.rpc.connector.connectorRemote.setOtherUserGuildSession.broadcast([{ roleId: roleId, userGuild: newLeaderUserGuild }]); // 更新session + + let managerCntInc = userGuild.auth == GUILD_AUTH.MANAGER ? -1 : 0; // 管理人数 + + guild = await GuildModel.updateInfo(code, { leader: role._id }, { managerCnt: managerCntInc }, 'managerCnt name'); // 如果有转让团长设置leader + + // 添加动态 + let chatSid = await getGuildChannelSid(code); + + this.app.rpc.chat.guildRemote.changeLeader.toServer(chatSid, code, guild.managerCnt, role, leader.roleId); + await sendMailByContent(MAIL_TYPE.GUILD_BE_IMPEACH, leader.roleId, { params: [guild.name] }); + await sendMailByContent(MAIL_TYPE.GUILD_BE_SET_LEADER, roleId, { params: [guild.name] }); + + await updateUserInfo(REDIS_KEY.GUILD_INFO, code, [{ field: 'leader', value: new GuildLeader(role) }]); + reportTAEvent(roleId, TA_EVENT.GUILD_MASTER_CHANGE, { way: GUILD_MASTER_CHANGE_WAY.BACKEND, change_id_after: roleId }) + + return resResult(STATUS.SUCCESS, { code }); + } } \ No newline at end of file diff --git a/game-server/app/servers/guild/handler/guildHandler.ts b/game-server/app/servers/guild/handler/guildHandler.ts index dd17adaa3..601e5912b 100644 --- a/game-server/app/servers/guild/handler/guildHandler.ts +++ b/game-server/app/servers/guild/handler/guildHandler.ts @@ -213,7 +213,7 @@ export class GuildHandler { return resResult(STATUS.GUILD_MANAGER_REACH_MAX); } - const userGuild = await UserGuildModel.updateInfo(memberRoleId, { auth, job: auth == GUILD_AUTH.LEADER ? GUILD_JOB.JIANGJUN : hisUserGuild.job }, {}, 'auth'); // 设置权限 + const userGuild = await UserGuildModel.updateInfo(memberRoleId, { auth, job: auth == GUILD_AUTH.LEADER ? GUILD_JOB.DAJIANGJUN : hisUserGuild.job }, {}, 'auth'); // 设置权限 if (!userGuild) { return resResult(STATUS.GUILD_MEMBER_NOT_FOUND); } @@ -697,7 +697,7 @@ export class GuildHandler { let oldLeaderUserGuild = await UserGuildModel.updateInfo(leaderRoleId, { auth: GUILD_AUTH.MEMBER, job: GUILD_JOB.SHIBING }, {}, 'auth'); // 团长撤 await this.app.rpc.connector.connectorRemote.setOtherUserGuildSession.broadcast([{ roleId: leaderRoleId, userGuild: oldLeaderUserGuild }]); // 更新session - let newLeaderUserGuild = await UserGuildModel.updateInfo(topUserGuild.roleId, { auth: GUILD_AUTH.LEADER, job: GUILD_JOB.JIANGJUN }, {}, 'auth'); // 最高功勋人升 + let newLeaderUserGuild = await UserGuildModel.updateInfo(topUserGuild.roleId, { auth: GUILD_AUTH.LEADER, job: GUILD_JOB.DAJIANGJUN }, {}, 'auth'); // 最高功勋人升 await this.app.rpc.connector.connectorRemote.setOtherUserGuildSession.broadcast([{ roleId: topUserGuild.roleId, userGuild: newLeaderUserGuild }]); // 更新session let managerCntInc = topUserGuild.auth == GUILD_AUTH.MANAGER ? -1 : 0; // 管理人数 diff --git a/game-server/app/services/mailService.ts b/game-server/app/services/mailService.ts index bb8cd5cd3..c07bf631a 100644 --- a/game-server/app/services/mailService.ts +++ b/game-server/app/services/mailService.ts @@ -96,8 +96,8 @@ export class SendMailFun { this.content = this.getContent(dicMail.content, params.params); if(dicMail.title) this.title = dicMail.title; if(dicMail.sendName) this.sendName = dicMail.sendName; - this.hasGoods = params.goods.length > 0; - this.goods = params.goods; + this.hasGoods = params.goods?.length > 0; + this.goods = params.goods||[]; } getContent(content: string, params: string[]) { diff --git a/gm-server/app/controller/users.ts b/gm-server/app/controller/users.ts index 46cd3edb9..383ec0148 100644 --- a/gm-server/app/controller/users.ts +++ b/gm-server/app/controller/users.ts @@ -130,6 +130,12 @@ export default class UserController extends Controller { ctx.body = await ctx.service.users.getGuildList(page, pageSize, sortField, sortOrder, form); } + public async getMembersByGuildCode() { + const { ctx } = this; + const { code } = ctx.request.body; + ctx.body = await ctx.service.users.getMembersByGuildCode(code); + } + public async deleteEquip() { const { ctx } = this; const { selectedRowKeys: roleIdAndSeqIds } = ctx.request.body; diff --git a/gm-server/app/router.ts b/gm-server/app/router.ts index 27d348705..f84f42f2c 100644 --- a/gm-server/app/router.ts +++ b/gm-server/app/router.ts @@ -42,6 +42,7 @@ export default (app: Application) => { router.post('/api/users/getequiplist', tokenParser, controller.users.getEquipList); router.post('/api/users/getitemlist', tokenParser, controller.users.getItemList); router.post('/api/users/getguildlist', controller.users.getGuildList); + router.post('/api/users/getmembersbyguildcode', controller.users.getMembersByGuildCode); router.post('/api/users/deleteequip', tokenParser, controller.users.deleteEquip); router.post('/api/users/deleteitem', tokenParser, controller.users.deleteItem); router.post('/api/users/setitemcount', tokenParser, controller.users.setItemCount); diff --git a/gm-server/app/service/users.ts b/gm-server/app/service/users.ts index 7826d94df..af62431a2 100644 --- a/gm-server/app/service/users.ts +++ b/gm-server/app/service/users.ts @@ -26,6 +26,7 @@ import { CreateGiftCode, UpdateGiftCode } from '@domain/backEndField/params'; import { isNumber } from 'util'; import { GuildModel } from '@db/Guild'; import { RedisClient } from 'redis'; +import { UserGuildModel } from '@db/UserGuild'; // import { resResult } from '@pubUtils/util'; @@ -637,6 +638,16 @@ export default class GMUsers extends Service { return ctx.service.utils.resResult(STATUS.SUCCESS, { list, total }) } + public async getMembersByGuildCode(code: string) { + const { ctx } = this; + let guild = await GuildModel.findByCode(code); + if(!guild) return ctx.service.utils.resResult(STATUS.GUILD_HAS_DISSMISS); + + let userGuilds = await UserGuildModel.getListByGuild(code); + let list = userGuilds.map(userGuild => ({ ...userGuild, env: ctx.app.config.realEnv })) + + return ctx.service.utils.resResult(STATUS.SUCCESS, { list }) + } public async getGiftCodeList(page: number, pageSize: number, sortField: string, sortOrder: string, form: SearchGiftCodeParam = {}) { const { ctx } = this; diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 580cf4682..9bf188630 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -187,6 +187,7 @@ export const STATUS = { HAS_RECEIVE_WISH_GOOD: { code: 20930, simStr: '玩家已经收到许愿物品' }, NOT_WISH_THE_QUALITY_GOODS: { code: 20931, simStr: '不能够许愿该品质的物品' }, GUILD_PAY_CONDITION: { code: 20932, simStr: '充值金额不足' }, + GUILD_USER_IS_LEADER: { code: 20933, simStr: '该成员已经是团长' }, GUILD_SCRIPT_IS_OPENED_TODAY: { code: 20950, simStr: '今日已开启过演武场' }, GUILD_SCRIPT_NOT_OPENED: { code: 20951, simStr: '演武场未开启' }, diff --git a/shared/db/Guild.ts b/shared/db/Guild.ts index 91b3970f1..40feb8f98 100644 --- a/shared/db/Guild.ts +++ b/shared/db/Guild.ts @@ -301,7 +301,7 @@ export default class Guild extends BaseModel { } const result: GuildType[] = await GuildModel .find(searchObj).limit(pageSize).skip((page - 1) * pageSize).sort(sort) - .select('-_id -__v -createdAt -updatedAt +serverId') + .select('-_id -__v -updatedAt +serverId') .populate('leader', { roleId: 1, roleName: 1, _id: 0 }, 'Role') .lean({ getters: true, virtuals: true }); return result;