diff --git a/game-server/app.ts b/game-server/app.ts index e385a21da..9cc8b6505 100644 --- a/game-server/app.ts +++ b/game-server/app.ts @@ -68,6 +68,7 @@ app.configure(function () { console.log('serverName:', app.get('serverName')) initMongodb(app); + initGmMongodb(app); initRedis(app); setupRoutes(app); setupFilters(app); @@ -136,7 +137,14 @@ app.configure(ALL_ENVS, 'chat', function() { app.event.on('start_all', () => { getTire(); }); -}) +}); + +app.configure(ALL_ENVS, 'activity', function () { + app.event.on('start_all', () => { + app.rpc.activity.activityRemote.loadActivities.toServer(app.getServerId()); + }); +}); + function errorHandler(err: Error, msg: any, resp: any, session: FrontendOrBackendSession, cb: HandlerCallback) { @@ -167,11 +175,13 @@ async function initMongodb(app: _pinus.Application) { console.log('mongodb connect suc'); } }); - - let gmconnect = await mongoose.createConnection(app.get('database').gmmongo, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false }); - loadGmDb(gmconnect); } +async function initGmMongodb(app: _pinus.Application) { + let gmconnect = await mongoose.createConnection(app.get('database').gmmongo, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false }); + loadGmDb(gmconnect); + console.log('mongoGmDb connect suc') +} function initRedis(app: _pinus.Application) { const redisClient = connectRedis(app.get('database').redis, app.get('database').redispw); app.set('redis', redisClient); diff --git a/game-server/app/servers/activity/remote/activityRemote.ts b/game-server/app/servers/activity/remote/activityRemote.ts index 97a9ea7f6..e17efc18c 100644 --- a/game-server/app/servers/activity/remote/activityRemote.ts +++ b/game-server/app/servers/activity/remote/activityRemote.ts @@ -14,7 +14,6 @@ export class ActivityRemote { constructor(private app: Application) { this.app = app; this.channelService = app.get('channelService'); - this.loadActivities(); } private channelService: ChannelService; @@ -30,7 +29,7 @@ export class ActivityRemote { reloadResources(); } - private async loadActivities() { + public async loadActivities() { let servers = await ServerlistModel.getAllServerList(); for(let { serverId, activityGroupId } of servers) { for(let groupId of activityGroupId) { @@ -52,6 +51,7 @@ export class ActivityRemote { this.app.set('activityByServer', this.activityByServer); this.app.set('activityByType', this.activityByType); this.app.set('activities', this.activities); + console.log('****** loadActivities') } private setActivityTypeAndServer() { diff --git a/game-server/app/servers/battle/handler/comBattleHandler.ts b/game-server/app/servers/battle/handler/comBattleHandler.ts index babbb1bad..f34d46df3 100644 --- a/game-server/app/servers/battle/handler/comBattleHandler.ts +++ b/game-server/app/servers/battle/handler/comBattleHandler.ts @@ -746,7 +746,7 @@ export class ComBattleHandler { if(r != roleId) roleIdList.push(r); } } - const roles = await RoleModel.findRoleByField('roleId', roleIdList, ROLE_SELECT.SHOW_SIMPLE, true); + const roles = await RoleModel.findByRoleIds(roleIdList, ROLE_SELECT.SHOW_SIMPLE, true); let result = new Array(); for(let role of roles) { if(role.quitTime == role.loginTime) { diff --git a/game-server/app/servers/gm/handler/gmHandler.ts b/game-server/app/servers/gm/handler/gmHandler.ts index efab147c1..dd6034fb3 100644 --- a/game-server/app/servers/gm/handler/gmHandler.ts +++ b/game-server/app/servers/gm/handler/gmHandler.ts @@ -31,58 +31,6 @@ export class GmHandler { constructor(private app: Application) { } - async pushEvent(msg: { uid: number, serverId: number }, session: BackendSession) { - - let { uid, serverId } = msg; - let role = await RoleModel.findByUid(uid, serverId); - if (!role) return resResult(STATUS.GM_ROLE_NOT_FOUND); - let { roleId, roleName, eventStatus } = role; - - let channelService = this.app.get('channelService'); - let event = await getEvent(eventStatus, roleId, roleName); - let hisOnlineInfo = await getRoleOnlineInfo(role.roleId); - if (hisOnlineInfo.isOnline) { - channelService.pushMessageByUids('onSpecialEvent', resResult(STATUS.SUCCESS, { event }), [{ - uid: roleId, - sid: hisOnlineInfo.sid - }]); - } - return resResult(STATUS.SUCCESS, { list: event }); - } - - async clearEvent(msg: {}, session: BackendSession) { - let roleId = session.get('roleId'); - - await EventRecordModel.deleteAccount(roleId); - return resResult(STATUS.SUCCESS); - } - - - async pushMessage(msg: { uid: number, serverId: number, eventName: string, message: string }, session: BackendSession) { - - let { uid, serverId, eventName, message } = msg; - - let content = {}; - try { - content = JSON.parse(message); - } catch (e) { - return resResult(STATUS.GM_JSON_FORMAT_ERR); - } - // console.log(uid, serverId) - let role = await RoleModel.findByUid(uid, serverId); - if (!role) return resResult(STATUS.GM_ROLE_NOT_FOUND); - let { roleId } = role; - - let hisOnlineInfo = await getRoleOnlineInfo(role.roleId); - if (hisOnlineInfo.isOnline) { - let sid = hisOnlineInfo.sid; - if (!!sid) {//下发邮件,对应前端红点提示 - pinus.app.channelService.pushMessageByUids(eventName, resResult(STATUS.SUCCESS, content), [{ uid: roleId, sid }]); - } - } - return resResult(STATUS.SUCCESS, { msg: content }); - } - //对接gm后台,下发邮件 async addMail(msg: { endTime: number, sendName: string, content: string, goods: RewardInter[], sendTime: number }) { let { endTime, content, sendName, sendTime, goods } = msg; diff --git a/game-server/app/servers/gm/handler/gmRoleHandler.ts b/game-server/app/servers/gm/handler/gmRoleHandler.ts new file mode 100644 index 000000000..f0dfb46f6 --- /dev/null +++ b/game-server/app/servers/gm/handler/gmRoleHandler.ts @@ -0,0 +1,45 @@ +import { Application, BackendSession, pinus } from 'pinus'; +import { resResult } from '../../../pubUtils/util'; +import { STATUS } from '../../../consts/statusCode'; +import { getRoleOnlineInfo } from '../../../services/redisService'; +import { addItems, createHeroes } from '../../../services/rewardService'; +import { RewardInter } from '../../../pubUtils/interface'; +import { getExpByLv } from '../../../pubUtils/data'; +import { RoleModel } from '../../../db/Role'; +let timer: NodeJS.Timer; +export default function (app: Application) { + return new GmRoleHandler(app); +} + +export class GmRoleHandler { + constructor(private app: Application) { + } + + async addItems(msg: { roleId: string, roleName: string, serverId: number, values: { reward: RewardInter[], heroes: number[], lv: number }}, session: BackendSession) { + let { roleId, roleName, serverId, values } = msg; + + let { reward, heroes, lv } = values; + if (reward == undefined && heroes == undefined && lv == undefined) { + return resResult(STATUS.WRONG_PARMS); + } + let connect = await getRoleOnlineInfo(roleId); + let sid = connect.isOnline?connect.sid: null; + + if(reward &&reward.length > 0) { + await addItems(roleId, roleName, sid, values.reward); + } + if(heroes && heroes.length > 0) { + await createHeroes(roleId, roleName, sid, serverId, heroes.map(hid => { return { hid, count: 1 }})) + } + if(lv && lv > 0) { + let exp = getExpByLv(lv)?.sum||0; + await RoleModel.updateRoleInfo(roleId, { lv, exp }) + let uids = [{ uid: roleId, sid }]; + pinus.app.get('channelService').pushMessageByUids('onPlayerExpChange', resResult(STATUS.SUCCESS, { + isLvUp: false, lv, exp + }), uids); + } + return resResult(STATUS.SUCCESS); + } + +} \ 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 2d3d7021b..d3211e885 100644 --- a/game-server/app/servers/guild/handler/guildHandler.ts +++ b/game-server/app/servers/guild/handler/guildHandler.ts @@ -418,7 +418,7 @@ export class GuildHandler { const guild = await GuildModel.findByCode(code, serverId, GUILD_SELECT.INVITED_MEMBER); if (guild.isMemberMax) return resResult(STATUS.GUILD_MEMBER_MAX); - const roleList = await RoleModel.findRoleByField('roleId', roleIds); + const roleList = await RoleModel.findByRoleIds(roleIds); let result = new Array(); let uids = []; for (let role of roleList) { diff --git a/game-server/app/services/activity/activityService.ts b/game-server/app/services/activity/activityService.ts index 7a03b8073..9216ab75e 100644 --- a/game-server/app/services/activity/activityService.ts +++ b/game-server/app/services/activity/activityService.ts @@ -31,6 +31,7 @@ import { getRandSingleEelm } from '../../pubUtils/util'; import { SignInData } from '../../domain/activityField/signInField'; import { ActivityGroupModel } from '../../db/ActivityGroup'; import { ActivityGroupTypeModel } from '../../db/ActivityGroupType'; +import { ServerlistModel } from '../../db/Serverlist'; /** * 获取活动数据 diff --git a/game-server/app/services/chatService.ts b/game-server/app/services/chatService.ts index c5ef05ac7..3737f13b1 100644 --- a/game-server/app/services/chatService.ts +++ b/game-server/app/services/chatService.ts @@ -297,7 +297,7 @@ export async function recentPrivateChatInfos(roleId: string, roleName: string) { .splice(CHAT_SYSTEM.RECENT_PRIVATE_CHATS_CNT); if (!recentPrivateChats || !recentPrivateChats.length) return null; - const roleInfos = await RoleModel.findRoleByField('roleId', recentPrivateChats.map(chat => { return chat.targetRoleId })); + const roleInfos = await RoleModel.findByRoleIds(recentPrivateChats.map(chat => { return chat.targetRoleId })); const chatInfos = recentPrivateChats.map( chat => { for (let { roleId: targetRoleId, quitTime, loginTime, roleName: targetRoleName, title, guildName, head, frame, spine, lv } of roleInfos) { if (targetRoleId === chat.targetRoleId) { diff --git a/game-server/app/services/roleService.ts b/game-server/app/services/roleService.ts index 43ceafa19..d41bfa1a4 100644 --- a/game-server/app/services/roleService.ts +++ b/game-server/app/services/roleService.ts @@ -84,7 +84,7 @@ export async function getSimpleRoleInfo(roleId: string) { export async function getSimpleRoleInfos(roleIds: string[]) { if (!roleIds || !roleIds.length) return null; - let roles = await RoleModel.findRoleByField('roleId', roleIds, ROLE_SELECT.SHOW_SIMPLE, true); + let roles = await RoleModel.findByRoleIds(roleIds, ROLE_SELECT.SHOW_SIMPLE, true); return roles; } diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index 08f88a465..2d6110c0e 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -51,7 +51,7 @@ export async function init() { await setPvpSeason(); // 周功勋结算任务 - guildWeeklyJobId = scheduleJob('settleGuildWeekly', '0 0 0 * * 1', settleGuildWeekly); + guildWeeklyJobId = scheduleJob('settleGuildWeekly', '0 0 ? * * 1', settleGuildWeekly); // 每5分钟汇报在线玩家在线情况 scheduleJob('reportOnline', '0 0/5 * * * *', reportOnlineSchedule); diff --git a/gm-server/app/controller/users.ts b/gm-server/app/controller/users.ts index 26bd60ce7..1ee629b8d 100644 --- a/gm-server/app/controller/users.ts +++ b/gm-server/app/controller/users.ts @@ -15,11 +15,11 @@ export default class UserController extends Controller { ctx.body = await ctx.service.users.createRole(uid, serverId, roleName); } - public async addAuth() { - const { ctx } = this; - const { uid, auth } = ctx.request.body; - ctx.body = await ctx.service.users.addAuth(uid, auth); - } + // public async addAuth() { + // const { ctx } = this; + // const { uid, auth } = ctx.request.body; + // ctx.body = await ctx.service.users.addAuth(uid, auth); + // } public async fixSms() { const { ctx } = this; @@ -35,8 +35,8 @@ export default class UserController extends Controller { public async getrolelist() { const { ctx } = this; - const { field, value } = ctx.request.body; - ctx.body = await ctx.service.users.getrolelist(field, value); + const { page, pageSize, sortField, sortOrder, form } = ctx.request.body; + ctx.body = await ctx.service.users.getrolelist(page, pageSize, sortField, sortOrder, form); } public async createRoleData() { diff --git a/gm-server/app/router.ts b/gm-server/app/router.ts index f91c01f76..d0ac4d612 100644 --- a/gm-server/app/router.ts +++ b/gm-server/app/router.ts @@ -28,8 +28,8 @@ export default (app: Application) => { // router.post('/api/users/createrole',tokenParser, controller.users.createRole); // router.post('/api/users/addauth', tokenParser, controller.users.addAuth); router.post('/api/users/fixsms', tokenParser, controller.users.fixSms); - router.post('/api/users/deleterole',tokenParser, controller.users.deleteRole); router.post('/api/users/getrolelist',tokenParser, controller.users.getrolelist); + router.post('/api/users/deleterole',tokenParser, controller.users.deleteRole); router.post('/api/users/createroledata',tokenParser, controller.users.createRoleData); router.post('/api/users/getpvpdefense',tokenParser, controller.users.getPveDefense); router.post('/api/users/getherolist',tokenParser, controller.users.getHeroList); diff --git a/gm-server/app/service/users.ts b/gm-server/app/service/users.ts index c1ce3e817..f323bdc6a 100644 --- a/gm-server/app/service/users.ts +++ b/gm-server/app/service/users.ts @@ -69,18 +69,18 @@ export default class GMUsers extends Service { } } - public async addAuth(uid: number, auth: number) { - console.log('enter Auth addAuth'); - const ctx = this.ctx; + // public async addAuth(uid: number, auth: number) { + // console.log('enter Auth addAuth'); + // const ctx = this.ctx; - const user = await UserModel.addAuth(uid, auth); - if (user) { - return ctx.service.utils.resResult(STATUS.SUCCESS); - } else { - console.error('add auth error'); - return ctx.service.utils.resResult(STATUS.INTERNAL_ERR); - } - } + // const user = await UserModel.addAuth(uid, auth); + // if (user) { + // return ctx.service.utils.resResult(STATUS.SUCCESS); + // } else { + // console.error('add auth error'); + // return ctx.service.utils.resResult(STATUS.INTERNAL_ERR); + // } + // } public checkTelNo(telNo: string) { if (!isString(telNo)) { @@ -121,60 +121,27 @@ export default class GMUsers extends Service { /** * 根据类型等搜索玩家 */ - public async getrolelist(field: string = 'all', value: string = '') { + public async getrolelist(page: number, pageSize: number, sortField: string, sortOrder: string, form: SearchUserParam) { const { ctx } = this; - let arr = new Array(), flag = 0; - let valueArr = value.split(','); - if (value == '') field = 'all'; - for (let i of valueArr) { - if (field == 'uid') { - let d = parseInt(i); - if (isNaN(d)) { - flag = 1; break; - } else { - arr.push(d); - } - field = 'userInfo.uid'; - } else if (field == 'roleName') { - arr.push(i); - } else if (field == 'tel') { - arr.push(i); - field = 'userInfo.tel'; - } else if (field == 'all') { - break; - } else { - flag = 1; break; - } + const roles = await RoleModel.findByCondition(page, pageSize, sortField, sortOrder, form); + const total = await RoleModel.countByCondition( form ) + + let list = []; + for (let role of roles) { + let heroCount = await HeroModel.count({ roleId: role.roleId }).lean(); + let equipCount = await EquipModel.count({ roleId: role.roleId }).lean(); + let itemCount = await ItemModel.count({ roleId: role.roleId }).lean(); + + let { roleId, roleName, serverId, lv, vLv, gold, coin, ce } = role; + let { uid, tel } = role.userInfo; + list.push({ + key: roleId, roleId, roleName, serverId, lv, vLv, uid, tel, heroCount, equipCount, itemCount, gold, coin, ce, + env: ctx.app.config.realEnv + }); } - if (flag) { - return ctx.service.utils.resResult(STATUS.WRONG_PARMS); - } - - let roles = await RoleModel.findRoleByField(field, valueArr); - - if (roles) { - - let result = new Array(); - for (let role of roles) { - let heroCount = await HeroModel.count({ roleId: role.roleId }).lean(); - let equipCount = await EquipModel.count({ roleId: role.roleId }).lean(); - let itemCount = await ItemModel.count({ roleId: role.roleId }).lean(); - let defense = await PvpDefenseModel.findByRoleId(role.roleId); - - let { roleId, roleName, serverId, lv, vLv, gold, coin } = role; - let { uid, tel } = role.userInfo; - result.push({ - key: roleId, roleId, roleName, serverId, lv, vLv, uid, tel, heroCount, equipCount, itemCount, gold, coin, - hasDefense: defense ? '是' : '否', defCe: 0 - }); - } - return ctx.service.utils.resResult(STATUS.SUCCESS, { list: result }); - } else { - console.error('role list not found'); - return ctx.service.utils.resResult(STATUS.INTERNAL_ERR); - } + return ctx.service.utils.resResult(STATUS.SUCCESS, { list, total }) } public async createHero(uids: Array, _hid: string, _hlv: string) { diff --git a/shared/db/Role.ts b/shared/db/Role.ts index a7d35a3ba..e9aaa7580 100644 --- a/shared/db/Role.ts +++ b/shared/db/Role.ts @@ -7,6 +7,7 @@ import { nowSeconds, getTimeFunD } from '../pubUtils/timeUtil'; import { Figure } from '../domain/dbGeneral'; import * as dicParam from '../pubUtils/dicParam'; import Hero from './Hero'; +import { SearchRoleParam } from '../domain/backEndField/search'; type CeAttrUpdate = Partial; // role表属性格式 @@ -360,6 +361,11 @@ export default class Role extends BaseModel { return role; } + public static async findByRoleIds(roleIds: string[], select?: string, getters = false, virtuals = true) { + const role: RoleType[] = await RoleModel.find({ roleId: { $in: roleIds } }).select(select).lean({ getters, virtuals }); + return role; + } + public static async createRole(uid: number, serverId: number, roleInfo: { roleId: string; roleName: string; seqId: number; code: string, lv?: number, exp?: number }, lean = true) { const user = await User.findUserByUid(uid); if (!user) return null; @@ -370,19 +376,6 @@ export default class Role extends BaseModel { return role; } - public static async findRoleByField(field: string, value?: Array, select?: string, getters = false) { - let searchObj = {}; - if (field != 'all') { - searchObj[field] = { - $in: value - }; - } - - const user: RoleType[] = await RoleModel.find(searchObj).select(select).lean({ getters, virtuals: true }); - return user; - } - - public static async setEventStatus(roleId: string, eventStatus: number, lean = true) { let role: RoleType = await RoleModel.findOneAndUpdate({ roleId }, { eventStatus }, { new: true }).lean(lean); return role; @@ -742,6 +735,38 @@ export default class Role extends BaseModel { return role; } + + private static getSearchObj(form: SearchRoleParam) { + let searchObj = {}; + if(form.uid) searchObj['userInfo.uid'] = form.uid; + if(form.roleId) searchObj['roleId'] = form.roleId; + if(form.roleName) searchObj['roleName'] = { $regex: new RegExp(form.roleName.toString(), 'i') }; + return searchObj + } + + public static async findByCondition(page: number, pageSize: number, sortField: string = 'updatedAt', sortOrder: string = 'descend', form: SearchRoleParam = {}) { + + let searchObj = this.getSearchObj(form); + let sort = {}; + if(sortField && sortOrder) { + if(sortOrder == 'ascend') { + sort[sortField] = 1; + } else if (sortOrder == 'descend') { + sort[sortField] = -1; + } + } + const result: RoleType[] = await RoleModel.find(searchObj).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true }); + return result; + + } + + public static async countByCondition(form: SearchRoleParam = {}) { + + let searchObj = this.getSearchObj(form); + const result = await RoleModel.count(searchObj); + return result; + } + } export const RoleModel = getModelForClass(Role); diff --git a/shared/db/User.ts b/shared/db/User.ts index c400664f4..da911217b 100644 --- a/shared/db/User.ts +++ b/shared/db/User.ts @@ -4,7 +4,7 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; import { genCode, aesEncryptcfb, aesDecryptcfb } from '../pubUtils/util'; import { LoginValidateData37, ChannelInfo } from '../domain/sdk'; -import { SearchUserParam } from '@domain/backEndField/search'; +import { SearchUserParam } from '../domain/backEndField/search'; const bcrypt = require('bcrypt'); const SALT_WORK_FACTOR = 5 diff --git a/shared/domain/backEndField/search.ts b/shared/domain/backEndField/search.ts index 7c6847b8b..f10893b60 100644 --- a/shared/domain/backEndField/search.ts +++ b/shared/domain/backEndField/search.ts @@ -2,4 +2,10 @@ export interface SearchUserParam { uid?: number; tel?: string; channelType?: string; +} + +export interface SearchRoleParam { + uid?: number; // 玩家id + roleId?: string; // 角色id + roleName?: string; // 昵称 } \ No newline at end of file diff --git a/web-server/app/middleware/checkMainten.ts b/web-server/app/middleware/checkMainten.ts index 70801bea7..03a95f6c6 100644 --- a/web-server/app/middleware/checkMainten.ts +++ b/web-server/app/middleware/checkMainten.ts @@ -7,7 +7,7 @@ module.exports = () => { if (serverId) { let maintenServers = await ctx.service.game.getServerMainten(); if (maintenServers.indexOf(serverId) != -1) { - let isWhiteList = await checkWhiteList(ctx.tel, ctx.request.ip, ctx.auth); + let isWhiteList = await checkWhiteList(ctx.tel, ctx.request.ip); if (isWhiteList) { await next(); } else { diff --git a/web-server/app/middleware/tokenParser.ts b/web-server/app/middleware/tokenParser.ts index ba96712f8..3b0aa1120 100644 --- a/web-server/app/middleware/tokenParser.ts +++ b/web-server/app/middleware/tokenParser.ts @@ -16,7 +16,6 @@ module.exports = () => { } ctx.uid = user.uid; ctx.serverType = ctx.request.body.serverType||user.serverType; - ctx.auth = user.auth; ctx.userCode = user.userCode; ctx.pkgName = user.pkgName; ctx.tel = user.tel;