import { gameData } from "../pubUtils/data"; import { GuildModel, GuildType } from "../db/Guild"; import { resResult, shouldRefreshWeek, shouldRefresh } from "../pubUtils/util"; import { STATUS } from "../consts"; import { RoleModel } from "../db/Role"; import { UserGuildModel, UserGuildType } from "../db/UserGuild"; import { UserGuildApplyModel } from "../db/UserGuildApply"; /** * @description 检查该玩家是否有权限做操作 * @param func 操作id * @param auth 权限 */ export async function checkAuth(func: number, roleId: string, code?: string, userGuild?: UserGuildType) { const auth = await UserGuildModel.getMyAuth(roleId, code, userGuild); const dicGuildAuth = gameData.guildAuth.get(func); console.log(auth, dicGuildAuth) if(!dicGuildAuth) return false; return dicGuildAuth.includes(auth); } /** * @description 加入公会 * @param code 公会code * @param lv 公会当前等级,判断人数用 * @param roleId 加入的玩家 */ export async function joinGuild(code: string, lv: number, roleId: string, serverId: number) { // TODO 加redlock const result = await RoleModel.joinGuild(roleId); if(!result) { return { status: 0, resResult: resResult(STATUS.GUILD_HAS_JOIN) }; } const dicCenterBase = gameData.centerBase.get(lv); if(!dicCenterBase) { return { status: 0, resResult: resResult(STATUS.DIC_DATA_NOT_FOUND) }; } const maxMemberCnt = dicCenterBase.peopleNum; const guild = await GuildModel.addGuild(code, roleId, maxMemberCnt, serverId); if(!guild) { return { status: 0, resResult: resResult(STATUS.GUILD_MEMBER_MAX) }; } const role = await RoleModel.findByRoleId(roleId); const userGuild = await UserGuildModel.createUserGuild(guild.code, role, false); if(!userGuild) { return { status: 0, resResult: resResult(STATUS.GUILD_CREATE_ERROR) }; } await UserGuildApplyModel.deleteApply(roleId); // 删除玩家所有对其他公会的申请 return { status: 1, guild, userGuild, roleName: role.roleName } } /** * 消耗军团资金 * @param code 军团唯一code * @param cost 消耗值 * @param sid 推送channel */ export async function costFund(code: string, cost: number, sid: string) { const guild = await GuildModel.costFund(code, cost); // TODO 推送 return guild; } /** * 刷新军团活跃 * @param guildCode 军团唯一code * @param serverId 区 */ export async function getGuildWithRefActive(guildCode: string, serverId: number) { // TODO 加写锁 let guild = await GuildModel.findByCode(guildCode, serverId, '+refTimeDaily +refTimeWeekly'); if(!guild) return false; console.log(JSON.stringify(guild)); const now = new Date(); let { activeDaily, activeWeekly, refTimeDaily, refTimeWeekly} = guild; let isRefWeek = shouldRefreshWeek(refTimeWeekly, now, 1, 0); if(isRefWeek) { activeWeekly = 0; refTimeWeekly = now; } let isRefDaily = shouldRefresh(refTimeDaily, now, 0); if(isRefDaily) { activeDaily = 0; refTimeDaily = now; } if(isRefWeek || isRefDaily) { guild = await GuildModel.updateInfo(guildCode, { activeDaily, activeWeekly, refTimeDaily, refTimeWeekly }, {}); } return guild; } /** * 增加活跃 * @param guildCode 军团唯一code * @param serverId 区 * @param active 增加的活跃 */ export async function addGuildActive(guildCode: string, serverId: number, active: number) { // TODO 加写锁 let guild = await GuildModel.findByCode(guildCode, serverId, '+refTimeDaily +refTimeWeekly'); if(!guild) return false; const now = new Date(); let { activeDaily, activeWeekly, refTimeDaily, refTimeWeekly} = guild; let isRefWeek = shouldRefreshWeek(refTimeWeekly, now, 1, 0); if(isRefWeek) { activeWeekly = 0; refTimeWeekly = now; } let isRefDaily = shouldRefresh(refTimeDaily, now, 0); if(isRefDaily) { activeDaily = 0; refTimeDaily = now; } activeWeekly += active; activeDaily += active; guild = await GuildModel.updateInfo(guildCode, { activeDaily, activeWeekly, refTimeDaily, refTimeWeekly }, {}); return guild; } /** * 获取用户公会表并刷新活跃 * @param roleId 用户id * @param select 筛选字段 */ export async function getUserGuildWithRefActive(roleId: string, select: string) { let userGuild = await UserGuildModel.getMyGuild(roleId, select? select + ' +refTimeDaily': '+refTimeDaily'); if(!userGuild) return false; let { receivedActive, refTimeDaily } = userGuild; const now = new Date(); let isRefDaily = shouldRefresh(refTimeDaily, now, 0); if(isRefDaily) { receivedActive = 0; refTimeDaily = now; userGuild = await UserGuildModel.updateInfo(roleId, { receivedActive, refTimeDaily }, select); if(!userGuild) return false; } return userGuild; }