diff --git a/game-server/app/servers/battle/handler/guildHandler.ts b/game-server/app/servers/battle/handler/guildHandler.ts index 458f27096..b6914f2a9 100644 --- a/game-server/app/servers/battle/handler/guildHandler.ts +++ b/game-server/app/servers/battle/handler/guildHandler.ts @@ -1,6 +1,6 @@ import { Application, BackendSession, pinus } from 'pinus'; import { resResult, getRandEelm, reduceCe } from '../../../pubUtils/util'; -import { STATUS, GUILD_OPERATE, GUILD_AUTH, GUILD_JOB, GUILD_APPLY_TYPE, GUILD_STRUCTURE } from '../../../consts'; +import { STATUS, GUILD_OPERATE, GUILD_AUTH, GUILD_JOB, GUILD_APPLY_TYPE, GUILD_STRUCTURE, GUILD_REC_TYPE, GUILD_STRUCTURE_NAME } from '../../../consts'; import { UserGuildModel } from '../../../db/UserGuild'; import { checkAuth, joinGuild, costFund } from '../../../services/guildService'; import { GuildModel, GuildType } from '../../../db/Guild'; @@ -12,6 +12,7 @@ import { nowSeconds, getBeforeDaySeconds } from '../../../pubUtils/timeUtil'; import { GuildListInfo } from '../../../pubUtils/interface'; import { UserGuildApplyModel } from '../../../db/UserGuildApply'; import { hasStructureConsume, getStructureConsume, gameData } from '../../../pubUtils/data'; +import { GuildRecModel } from '../../../db/GuildRec'; export default function (app: Application) { return new GuildHandler(app); @@ -25,6 +26,7 @@ export class GuildHandler { async createGuild(msg: { name: string, icon: number, notice: string }, session: BackendSession) { const roleId = session.get('roleId'); + const roleName = session.get('roleName'); const sid = session.get('sid'); const serverId = session.get('serverId'); const { name, icon, notice } = msg; @@ -56,11 +58,15 @@ export class GuildHandler { if(!userGuild) return resResult(STATUS.GUILD_CREATE_ERROR); await RoleModel.joinGuild(roleId); + await UserGuildApplyModel.deleteApply(roleId); // 删除玩家所有对其他公会的申请 // TODO 加入排行 const rank = 0; // TODO 加入channel + // 添加动态 + await GuildRecModel.createGuildRec(roleId, guild.code, GUILD_REC_TYPE.JOIN_GUILD, [roleName]); + // 返回 const result = { ...guild, rank, myInfo: userGuild}; return resResult(STATUS.SUCCESS, result); @@ -132,6 +138,7 @@ export class GuildHandler { async setAuth(msg: { roleId: string, auth: number }, session: BackendSession) { const roleId = session.get('roleId'); + const roleName = session.get('roleName'); const serverId = session.get('serverId'); const { roleId: memberRoleId, auth } = msg; @@ -174,15 +181,23 @@ export class GuildHandler { if(!userGuild) { return resResult(STATUS.GUILD_MEMBER_NOT_FOUND); } - + + const role = await RoleModel.findByRoleId(memberRoleId); let updateObject = {}; if(auth == GUILD_AUTH.LEADER) { // 转让团长 - const role = await RoleModel.findByRoleId(memberRoleId); updateObject['leader'] = role._id; await UserGuildModel.updateInfo(roleId, { auth: GUILD_AUTH.MEMBER }); // 自己降权限 } guild = await GuildModel.updateInfo(code, updateObject, { managerCnt: managerCntInc }, 'managerCnt'); // 如果有转让团长设置leader + + // 添加动态 + if(auth == GUILD_AUTH.MANAGER) { + await GuildRecModel.createGuildRec(roleId, code, GUILD_REC_TYPE.SET_MANAGER, [role.roleName]); + } else if (auth == GUILD_AUTH.LEADER) { + await GuildRecModel.createGuildRec(roleId, code, GUILD_REC_TYPE.SET_LEADER, [roleName, role.roleName]); + } + // 返回 return resResult(STATUS.SUCCESS, { roleId: memberRoleId, auth: userGuild.auth, managerCnt: guild.managerCnt @@ -225,6 +240,7 @@ export class GuildHandler { async applyGuild(msg: { code: string }, session: BackendSession) { const roleId = session.get('roleId'); + const roleName = session.get('roleName'); const serverId = session.get('serverId'); const { code } = msg; @@ -256,6 +272,9 @@ export class GuildHandler { return joinResult.resResult; } + // 添加动态 + await GuildRecModel.createGuildRec(roleId, code, GUILD_REC_TYPE.JOIN_GUILD, [roleName]); + hasGuild = true; } else { // 不自动加入,插入申请表 await UserGuildApplyModel.createUserGuildApply(role, guild, GUILD_APPLY_TYPE.APPLY); @@ -305,6 +324,10 @@ export class GuildHandler { for(let { roleId } of applyList) { const joinResult = await joinGuild(code, guild.lv, roleId, serverId); if(joinResult.status == 0) continue; + + // 添加动态 + await GuildRecModel.createGuildRec(roleId, code, GUILD_REC_TYPE.JOIN_GUILD, [joinResult.roleName]); + roleIds.push(roleId); } } else { // 拒绝申请,删除申请 @@ -418,6 +441,9 @@ export class GuildHandler { return joinResult.resResult; } + // 添加动态 + await GuildRecModel.createGuildRec(roleId, code, GUILD_REC_TYPE.JOIN_GUILD, [joinResult.roleName]); + code = guild.code; } await UserGuildApplyModel.deleteApplyByApplyCode([applyCode]); // 删除这条邀请 @@ -496,6 +522,7 @@ export class GuildHandler { async quit(msg: { code: string }, session: BackendSession) { const roleId = session.get('roleId'); + const roleName = session.get('roleName'); const serverId = session.get('serverId'); const { code } = msg; @@ -512,6 +539,9 @@ export class GuildHandler { const guild = await GuildModel.quit(code, roleId, serverId); if(!guild) return resResult(STATUS.GUILD_QUIT_ERROR); + // 添加动态 + await GuildRecModel.createGuildRec(roleId, code, GUILD_REC_TYPE.QUIT_GUILD, [roleName]); + return resResult(STATUS.SUCCESS, { hasGuild: role.hasGuild }); } @@ -542,6 +572,10 @@ export class GuildHandler { // TODO 发送邮件,发送推送 + + // 添加动态 + await GuildRecModel.createGuildRec(roleId, code, GUILD_REC_TYPE.QUIT_GUILD, [role.roleName]); + return resResult(STATUS.SUCCESS, { memberCnt: guild.memberCnt }); } @@ -561,7 +595,7 @@ export class GuildHandler { if (!checkHisAuth) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH); // 离线72小时 - const { loginTime } = await RoleModel.findByRoleId(leaderRoleId); + const { roleName: oldRoleName, loginTime } = await RoleModel.findByRoleId(leaderRoleId); if (loginTime > getBeforeDaySeconds(3)) { return resResult(STATUS.GUILD_LEADER_LOGIN); } @@ -580,6 +614,10 @@ export class GuildHandler { const guild = await GuildModel.updateInfo(code, { leader: topUser._id }, { managerCnt: managerCntInc }, 'managerCnt'); // 如果有转让团长设置leader + // 添加动态 + await GuildRecModel.createGuildRec(roleId, code, GUILD_REC_TYPE.IMPEACH, [ oldRoleName, topUser.roleName]); + + const leader = { ...topUser, ce: reduceCe(topUser.ce) } return resResult(STATUS.SUCCESS, { code, managerCnt: guild.managerCnt, leader @@ -627,7 +665,27 @@ export class GuildHandler { if(!result) { return resResult(STATUS.GUILD_STRUCTURE_NOT_FOUND); } + const resultStructure = result.structure.find(cur => cur.id == id); + + // 添加动态 + const structureName = GUILD_STRUCTURE_NAME.get(id); + await GuildRecModel.createGuildRec(roleId, code, GUILD_REC_TYPE.STRUCTURE_UP, [structureName, resultStructure.lv.toString()]); return resResult(STATUS.SUCCESS, result); } + + + // 获取动态 + async getRec(msg: { code: string }, session: BackendSession) { + + const roleId = session.get('roleId'); + const { code } = msg; + + const checkResult = await checkAuth(GUILD_OPERATE.GET_REC, roleId, code); + if (!checkResult) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH); + + const list = await GuildRecModel.getGuildRec(code); + + return resResult(STATUS.SUCCESS, { list }); + } } \ No newline at end of file diff --git a/game-server/app/services/guildService.ts b/game-server/app/services/guildService.ts index 0eae3b64a..19f90e75f 100644 --- a/game-server/app/services/guildService.ts +++ b/game-server/app/services/guildService.ts @@ -5,6 +5,7 @@ import { STATUS } from "../consts"; import { RoleModel } from "../db/Role"; import { UserGuildModel, UserGuildType } from "../db/UserGuild"; import { UserGuildApplyModel } from "../db/UserGuildApply"; +import { GuildRecModel } from "../db/GuildRec"; /** * @description 检查该玩家是否有权限做操作 @@ -52,7 +53,7 @@ export async function joinGuild(code: string, lv: number, roleId: string, server await UserGuildApplyModel.deleteApply(roleId); // 删除玩家所有对其他公会的申请 - return { status: 1, guild, userGuild } + return { status: 1, guild, userGuild, roleName: role.roleName } } export async function costFund(code: string, cost: number, sid: string) { diff --git a/shared/consts/constModules/guildConst.ts b/shared/consts/constModules/guildConst.ts index 559d815b6..42c30d954 100644 --- a/shared/consts/constModules/guildConst.ts +++ b/shared/consts/constModules/guildConst.ts @@ -7,10 +7,21 @@ export enum GUILD_STRUCTURE { TRAIN = 4, // 练兵场 DONATE = 5, // 捐献所 WISH_POOL = 6, // 许愿池 - SHOP = 7, // 商店 + STORE = 7, // 商店 END } +// 建筑名 +export const GUILD_STRUCTURE_NAME = new Map([ + [ GUILD_STRUCTURE.ARMY_CENTER, '中军大帐'], + [ GUILD_STRUCTURE.EQUIP_PRODUCE, '炼器堂'], + [ GUILD_STRUCTURE.BOSS, '演武台'], + [ GUILD_STRUCTURE.TRAIN, '练兵场'], + [ GUILD_STRUCTURE.DONATE, '捐献所'], + [ GUILD_STRUCTURE.WISH_POOL, '许愿池'], + [ GUILD_STRUCTURE.STORE, '商店'] +]) + // 权限 export enum GUILD_AUTH { LEADER = 1, // 团长 @@ -88,4 +99,19 @@ export enum GUILD_APPLY_STATUS { export enum GUILD_APPLY_TYPE { APPLY = 1, // 申请 INVITE = 2 // 邀请 +} + +// 公会动态id +export enum GUILD_REC_TYPE { + JOIN_GUILD = 1, // 加入军团 roleName + QUIT_GUILD = 2, // 离开军团 roleName + SET_MANAGER = 3, // 提升管理 roleName + STRUCTURE_UP = 4, // 建筑物升级 structureName lv + EQUIP_PRODUCE = 5, // 装备碎片研发 lvmin lvmax quality + BOSS_END = 6, // 演武台击杀boss bossName + BOSS_START = 7, // 演武台boss 开启 bossName + TRAIN_END = 8, // 练兵场压制 warName + TRAIN_START = 9, // 练兵场开启 warName + SET_LEADER = 10, // 转让团长 guildName roleName + IMPEACH = 11, // 弹劾 roleName roleName } \ No newline at end of file diff --git a/shared/db/GuildRec.ts b/shared/db/GuildRec.ts new file mode 100644 index 000000000..89b8fe047 --- /dev/null +++ b/shared/db/GuildRec.ts @@ -0,0 +1,45 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; +import { genCode } from '../pubUtils/util'; +import { GUILD_REC_TYPE } from '../consts'; +import { nowSeconds } from '../pubUtils/timeUtil'; + +@index({ guildCode: 1 }) +export default class GuildRec extends BaseModel { + + @prop({ required: true }) + recCode: string; + + @prop({ required: true, select: false }) + roleId: string; + + @prop({ required: true, select: false }) + guildCode: string; + + @prop({ required: true, default: GUILD_REC_TYPE.JOIN_GUILD, enum: GUILD_REC_TYPE }) + type: number; + + @prop({ required: true, type: String, default: [] }) + params: string[]; + + @prop({ required: true, default: nowSeconds() }) + createTime: number; + + public static async createGuildRec(roleId: string, guildCode: string, type: number, params: string[]) { + const doc = new GuildRecModel(); + const update = Object.assign(doc.toJSON(), { roleId, guildCode, type, params }); + delete update._id; + const recCode = genCode(10); + const result: GuildRecType = await GuildRecModel.findOneAndUpdate({ recCode }, params, { upsert: true, new: true }).lean(); + return result; + } + + public static async getGuildRec(guildCode: string) { + const result: GuildRecType[] = await GuildRecModel.find({ guildCode }).lean(); + return result; + } +} + +export const GuildRecModel = getModelForClass(GuildRec); + +export interface GuildRecType extends Pick, keyof GuildRec> { }; \ No newline at end of file