228 lines
8.0 KiB
TypeScript
228 lines
8.0 KiB
TypeScript
import { gameData } from "../pubUtils/data";
|
|
import { GuildModel, GuildType } from "../db/Guild";
|
|
import { resResult, shouldRefreshWeek, shouldRefresh } from "../pubUtils/util";
|
|
import { STATUS, GUILD_OPERATE, MAIL_TYPE } from "../consts";
|
|
import { RoleModel, RoleType } from "../db/Role";
|
|
import { UserGuildModel, UserGuildType } from "../db/UserGuild";
|
|
import { UserGuildApplyModel } from "../db/UserGuildApply";
|
|
import { SystemConfigModel } from "../db/SystemConfig";
|
|
import { nowSeconds } from "../pubUtils/timeUtil";
|
|
import { pinus } from "pinus";
|
|
import { GuildRecType } from "../db/GuildRec";
|
|
import { MailModel } from "../db/Mail";
|
|
import { RewardInter } from "../pubUtils/interface";
|
|
import { getRedis } from "./redisService";
|
|
|
|
/**
|
|
* @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, memberCnt: guild.memberCnt }
|
|
}
|
|
|
|
/**
|
|
* 刷新军团活跃
|
|
* @param guildCode 军团唯一code
|
|
* @param serverId 区
|
|
*/
|
|
export async function getGuildWithRefActive(guildCode: string, serverId: number) {
|
|
|
|
// TODO 加写锁
|
|
let guild = await GuildModel.findByCode(guildCode, serverId, '+refTimeDaily');
|
|
if(!guild) return false;
|
|
|
|
console.log(JSON.stringify(guild));
|
|
const now = new Date();
|
|
let { activeDaily, refTimeDaily} = guild;
|
|
|
|
let isRefDaily = shouldRefresh(refTimeDaily, now, 0);
|
|
if(isRefDaily) {
|
|
activeDaily = 0; refTimeDaily = now;
|
|
guild = await GuildModel.updateInfo(guildCode, { activeDaily, refTimeDaily }, {});
|
|
}
|
|
|
|
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');
|
|
if(!guild) return false;
|
|
|
|
const now = new Date();
|
|
let { activeDaily, activeWeekly, refTimeDaily} = guild;
|
|
|
|
let isRefDaily = shouldRefresh(refTimeDaily, now, 0);
|
|
if(isRefDaily) {
|
|
activeDaily = 0; refTimeDaily = now;
|
|
}
|
|
|
|
activeWeekly += active; activeDaily += active;
|
|
|
|
guild = await GuildModel.updateInfo(guildCode, { activeDaily, activeWeekly, refTimeDaily }, {});
|
|
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;
|
|
}
|
|
|
|
/**
|
|
* 每周结算上周公会周功勋和 活跃并发奖励(未完)
|
|
*
|
|
*/
|
|
export async function settleGuildWeekly() {
|
|
console.log('————— settleGuildWeekly —————');
|
|
const guildList = await GuildModel.findAllGuild('code activeWeekly');
|
|
|
|
for(let { code, activeWeekly } of guildList) {
|
|
// 转换周活跃奖励
|
|
const userGuildList = await UserGuildModel.getListByGuild(code, 'honourWeekly', { honourWeekly: -1, honourUpdateTime: 1 });
|
|
|
|
}
|
|
|
|
await SystemConfigModel.updateSystemConfig({settleGuildWeeklyTime: nowSeconds()}); // 记录一下
|
|
}
|
|
|
|
export const message = {
|
|
getChannel: function(name: string, create: boolean = false) {
|
|
let channel = pinus.app.get('channelService').getChannel(name, create);
|
|
return channel
|
|
},
|
|
enterChannel: function (guildCode: string, roleId: string, sid: string) {
|
|
// 加入channel
|
|
let channel = this.getChannel(`guild${guildCode}`, true);
|
|
let users = channel.getMembers();
|
|
if (users.indexOf(roleId) === -1) {
|
|
channel.add(roleId, sid);
|
|
}
|
|
return channel
|
|
},
|
|
memberQuit: function (guildCode: string, roleId: string, guild: GuildType,sid?: string) {
|
|
// 被踢出公会
|
|
this.pushMessageByUids(`guild${guildCode}`, 'onMemberQuit', roleId, {
|
|
code: guildCode,
|
|
roleId
|
|
}, sid);
|
|
// 更新人数减少
|
|
this.updateInfo(guildCode, { memberCnt: guild.memberCnt });
|
|
},
|
|
dismiss: function(guildCode: string) {
|
|
let channel = this.getChannel(`guild${guildCode}`);
|
|
if(!!channel) {
|
|
channel.pushMessage('onDismiss', resResult(STATUS.SUCCESS, { code: guildCode }));
|
|
channel.destroy();
|
|
}
|
|
},
|
|
updateInfo: function(guildCode: string, info: any) {
|
|
let channel = this.getChannel(`guild${guildCode}`);
|
|
if(!!channel) {
|
|
channel.pushMessage('onGuildInfoUpdate', resResult(STATUS.SUCCESS, {code: guildCode, ...info}));
|
|
}
|
|
},
|
|
changeLeader: function(guildCode: string, managerCnt: number, newLeader: RoleType, oldLeaderId: string) {
|
|
let { roleId, roleName, sHid, headHid, lv, loginTime } = newLeader;
|
|
this.updateInfo(guildCode, {managerCnt, leader: { roleId, roleName, sHid, headHid, lv, loginTime }});
|
|
this.demotion(guildCode, oldLeaderId);
|
|
this.promotion(guildCode, roleId);
|
|
},
|
|
demotion: function(guildCode: string, roleId: string) {
|
|
this.pushMessageByUids(`guild${guildCode}`, 'onDemotion', roleId, {
|
|
code: guildCode
|
|
});
|
|
},
|
|
promotion: function(guildCode: string, roleId: string) {
|
|
this.pushMessageByUids(`guild${guildCode}`, 'onPromotion', roleId, {
|
|
code: guildCode
|
|
});
|
|
},
|
|
addRec: function(guildRecType: GuildRecType) {
|
|
let { guildCode, type, params, createTime } = guildRecType;
|
|
let channel = this.getChannel(`guild${guildCode}`);
|
|
if(!!channel) {
|
|
channel.pushMessage('onGuildRecAdd', resResult(STATUS.SUCCESS, {type, params, createTime}));
|
|
}
|
|
},
|
|
pushMessageByUids: function (name: string, path: string, roleId: string, message: {code: string, roleId?: string}, sid?: string) {
|
|
|
|
let channel = this.getChannel(name);
|
|
let uids = [];
|
|
if(!sid) {
|
|
sid = channel && channel.getMember(roleId)['sid'];
|
|
}
|
|
if(sid) {
|
|
uids.push({roleId, sid});
|
|
pinus.app.get('channelService').pushMessageByUids(path, resResult(STATUS.SUCCESS, message), uids);
|
|
}
|
|
}
|
|
|
|
}
|