diff --git a/game-server/app/servers/battle/handler/guildHandler.ts b/game-server/app/servers/battle/handler/guildHandler.ts index 9ede19458..29124e64a 100644 --- a/game-server/app/servers/battle/handler/guildHandler.ts +++ b/game-server/app/servers/battle/handler/guildHandler.ts @@ -11,6 +11,7 @@ import { getGoldObject } from '../../../pubUtils/itemUtils'; import { getSeconds, nowSeconds } from '../../../pubUtils/timeUtil'; import { GuildListInfo } from '../../../pubUtils/interface'; import { UserGuildApplyModel } from '../../../db/UserGuildApply'; +import User from '../../../db/User'; export default function (app: Application) { return new GuildHandler(app); @@ -92,6 +93,86 @@ export class GuildHandler { return resResult(STATUS.SUCCESS, { quitTime, list }); } + // 团长修改军团名等信息 + async setGuildInfo(msg: { code: string, name: string, notice: string, introduce: string, ceLimit: number, isAuto: boolean }, session: BackendSession) { + + const roleId = session.get('roleId'); + const { code, name, notice, introduce, ceLimit, isAuto } = msg; + + const checkResult = await checkAuth(GUILD_OPERATE.SET_INFO, roleId, code); + if(!checkResult) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH); + + const select = ['code', 'name', 'notice', 'introduce', 'ceLimit', 'isAuto', 'icon']; + const guild = await GuildModel.updateInfo(code, { name, notice, introduce, ceLimit, isAuto }, {}, select.join(' ')); + // 返回 + return resResult(STATUS.SUCCESS, { ...guild }); + + } + + // 游客查看军团详细信息 + async getGuildInfo(msg: { code: string }, session: BackendSession) { + + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const { code } = msg; + + const checkResult = await checkAuth(GUILD_OPERATE.GET_GUILD_INFO, roleId, code); + if(!checkResult) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH); + + const select = ['code', 'name', 'notice', 'ceLimit', 'isAuto', 'icon', 'lv', 'memberCnt', 'guildCe']; + const guild = await GuildModel.findByCode(code, serverId, select.join(' ')); + let leader = guild.leader; + delete guild.leader; + // 返回 + return resResult(STATUS.SUCCESS, { ...guild, leader: leader.roleName }); + + } + + // 团长授权头衔 + async setAuth(msg: { roleId: string, auth: number }, session: BackendSession) { + + const roleId = session.get('roleId'); + const { roleId: memberRoleId, auth } = msg; + + const myUserGuild = await UserGuildModel.getMyGuild(roleId, 'auth guildCode'); + const hisUserGuild = await UserGuildModel.getMyGuild(memberRoleId, 'auth guildCode'); + + const checkMyResult = await checkAuth(GUILD_OPERATE.SET_AUTH, roleId, null, myUserGuild); + if(!checkMyResult) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH); + + const checkResult = await checkAuth(GUILD_OPERATE.BE_SET_AUTH, memberRoleId, myUserGuild.guildCode, hisUserGuild); + if(!checkResult) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH); + + const { guildCode: code } = myUserGuild; + + if(auth == hisUserGuild.auth) { + return resResult(STATUS.GUILD_AUTH_NOT_CHANGE); + } + + // TODO 管理员最大数 等策划表 + + const userGuild = await UserGuildModel.updateInfo(memberRoleId, { auth }, 'auth'); // 设置权限 + if(!userGuild) { + return resResult(STATUS.GUILD_MEMBER_NOT_FOUND); + } + let managerCntInc = 0; + let updateObject = {}; + if(auth == GUILD_AUTH.LEADER) { // 转让团长 + managerCntInc = hisUserGuild.auth == GUILD_AUTH.MANAGER?-1: 0; + const role = await RoleModel.findByRoleId(memberRoleId); + updateObject['leader'] = role._id; + await UserGuildModel.updateInfo(roleId, { auth: GUILD_AUTH.MEMBER }); // 自己降权限 + } else { + managerCntInc = auth == GUILD_AUTH.MANAGER? 1: -1; + } + const guild = await GuildModel.updateInfo(code, updateObject, { managerCnt: managerCntInc }, 'managerCnt'); // 如果有转让团长设置leader + // 返回 + return resResult(STATUS.SUCCESS, { + roleId: memberRoleId, auth: userGuild.auth, managerCnt: guild.managerCnt + }); + + } + // 团员获取自己军团详细信息 async getMyGuildInfo(msg: { }, session: BackendSession) { @@ -234,13 +315,15 @@ export class GuildHandler { const day = getRefTime(new Date(), 0, -3); const d = getSeconds(day); + const { quitGuildTime: quitTime = 0 } = await RoleModel.findByRoleId(roleId); const allList = await RoleModel.getInviteList(d, serverId); let list = getRandEelm(allList, 10); if(!list.length) list = allList; list = list.map(cur => { return {...cur, ce: reduceCe(cur.ce)} }); - return resResult(STATUS.SUCCESS, { list }); + + return resResult(STATUS.SUCCESS, { quitTime, list }); } @@ -342,13 +425,16 @@ export class GuildHandler { if(checkDetailResult) { select.push('auth', 'honourWeekly'); } - const list = await UserGuildModel.getListByGuild(code, select.join(' ')); - const result = list.map(cur => { + let list = await UserGuildModel.getListByGuild(code, select.join(' ')); + let result = list.map(cur => { let role = cur.role; delete role._id; delete cur.role; return { ...cur, ...role, ce: reduceCe(role.ce) }; - }).sort((a, b) => { + }); + let leader = result.shift(); + + result.sort((a, b) => { if(sort == 'honour') { return b.honourWeekly - a.honourWeekly; } else if (sort == 'loginTime') { @@ -358,6 +444,7 @@ export class GuildHandler { } }); + result.unshift(leader); return resResult(STATUS.SUCCESS, { list: result }); } diff --git a/shared/consts/constModules/guildConst.ts b/shared/consts/constModules/guildConst.ts index 80423c991..9d6f1e805 100644 --- a/shared/consts/constModules/guildConst.ts +++ b/shared/consts/constModules/guildConst.ts @@ -40,7 +40,7 @@ export enum GUILD_OPERATE { RECEIVE_INVITAION = 7, // 接受邀请 GET_MEMBER_LIST_MAIN = 8, // 查看成员主要信息 GET_MEMBER_LIST_DETAIL = 9, // 查看团内成员信息 - GET_MEMBER_LIST_MANAGE = 10, // 管理信息 + SET_AUTH = 10, // 设置权限 SET_INFO = 11, // 修改军团信息 GET_APPLY_LIST = 12, // 查看申请列表 RECEIVE_APPLY = 13, // 接受申请 @@ -57,6 +57,7 @@ export enum GUILD_OPERATE { OPEN_BOSS = 24, // 开启演武台 EQUIP_PRODUCE = 25, // 炼器堂研发 BE_KICKED = 26, // 被踢出军团 + BE_SET_AUTH = 27, // 被授权头衔 } // 军团状态 diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index bc22d9c72..992181ffb 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -134,7 +134,9 @@ export const STATUS = { GUILD_QUIT_ERROR: { code: 20907, simStr: '退出公会失败' }, GUILD_KICK_ERROR: { code: 20908, simStr: '未找到该成员或该成员已退出' }, GUILD_QUIT_TIME: { code: 20909, simStr: '退出军团1小时后才可以申请' }, - GUILD_INVITE_NOT_FOUND: { code: 20910, simStr: '该邀请未找到' }, + GUILD_INVITE_NOT_FOUND: { code: 20910, simStr: '该邀请未找到' }, + GUILD_AUTH_NOT_CHANGE: { code: 20911, simStr: '权限未发生变化' }, + GUILD_MEMBER_NOT_FOUND: { code: 20912, simStr: '未找到该成员' }, // 通用 30000 - 30099 DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' }, diff --git a/shared/db/Guild.ts b/shared/db/Guild.ts index 908593e84..9521cc1de 100644 --- a/shared/db/Guild.ts +++ b/shared/db/Guild.ts @@ -114,8 +114,9 @@ export default class Guild extends BaseModel { return guildList; } - public static async findByCode(code: string, serverId: number) { + public static async findByCode(code: string, serverId: number, select?: string) { const result = await GuildModel.findOne({ code, status: GUILD_STATUS.RUNNING, serverId }) + .select(select) .populate('leader', 'roleName sHid headHid lv loginTime ce', 'Role') .lean(); return result; @@ -131,14 +132,17 @@ export default class Guild extends BaseModel { public static async dismiss(code: string, serverId: number) { const result = await GuildModel.findOneAndUpdate({ code, status: GUILD_STATUS.RUNNING, serverId }, { status: GUILD_STATUS.DISMISSED }, { new: true }) - .select('+members') - .lean(); + .select('+members').lean(); return result; } public static async quit(code: string, roleId: string, serverId: number) { - const result = await GuildModel.findOneAndUpdate({ code, serverId }, { $inc: { memberCnt: -1}, $pull: { members: roleId }, isMemberMax: false }, { new: true }) - .lean(); + const result = await GuildModel.findOneAndUpdate({ code, serverId }, { $inc: { memberCnt: -1}, $pull: { members: roleId }, isMemberMax: false }, { new: true }).lean(); + return result; + } + + public static async updateInfo(code: string, update: GuildUpdateParam, incParam: { managerCnt?: number }, select?: string) { + const result = await GuildModel.findOneAndUpdate({ code }, { $set: update, $inc: incParam }, { new: true }).select(select).lean(); return result; } } diff --git a/shared/db/UserGuild.ts b/shared/db/UserGuild.ts index 7dc0f162d..1030e959d 100644 --- a/shared/db/UserGuild.ts +++ b/shared/db/UserGuild.ts @@ -64,6 +64,7 @@ export default class UserGuild extends BaseModel { public static async getListByGuild(guildCode: string, select?: string) { const userGuilds: UserGuildType[] = await UserGuildModel.find({ guildCode, status: USER_GUILD_STATUS.ON }) .select(select) + .sort({ auth: 1 }) .populate('role', 'roleId roleName ce headHid sHid lv title loginTime', 'Role') .lean(); return userGuilds; @@ -93,6 +94,11 @@ export default class UserGuild extends BaseModel { const result = await UserGuildModel.findOneAndUpdate({ guildCode, roleId, status: USER_GUILD_STATUS.ON }, {status: USER_GUILD_STATUS.QUIT}, {new: true}); return result; } + + public static async updateInfo(roleId: string, update: UserGuildUpdateParam, select?: string) { + const result = await UserGuildModel.findOneAndUpdate({ roleId, status: USER_GUILD_STATUS.ON }, { $set: update }, { new: true }).select(select).lean(); + return result; + } } export const UserGuildModel = getModelForClass(UserGuild); diff --git a/shared/resource/jsons/auth.json b/shared/resource/jsons/auth.json index 038aa8fb8..8283492b0 100644 --- a/shared/resource/jsons/auth.json +++ b/shared/resource/jsons/auth.json @@ -22,5 +22,6 @@ {"id": 21, "auths": "2&3"}, {"id": 22, "auths": "1&2"}, {"id": 23, "auths": "1&2&3"}, - {"id": 26, "auths": "2&3"} + {"id": 26, "auths": "2&3"}, + {"id": 27, "auths": "2&3"} ] \ No newline at end of file