后台添加推送奇遇事件功能

This commit is contained in:
luying
2020-10-19 17:31:45 +08:00
parent 99e50c9c36
commit 0da6b7c169
10 changed files with 227 additions and 9 deletions

View File

@@ -149,6 +149,7 @@ app.configure('production|development|local', function () {
// route configures
app.route('chat', routeUtil.chat);
app.route('battle', routeUtil.battle);
app.route('gm', routeUtil.gm);
// filter configures
app.filter(new pinus.filters.timeout());

View File

@@ -207,6 +207,7 @@ export class NormalBattleHandler {
if(!warInfo) {
return resResult(STATUS.BATTLE_MISS_INFO);
}
console.log(warInfo)
// 校验是否三星通关过
let condition1 = await BattleRecordModel.getBattleRecordByIdAndStar(roleId, battleId, 3);
if(!condition1) {

View File

@@ -2,6 +2,7 @@ import { STATUS } from './../../../consts/statusCode';
import { EquipModel } from './../../../db/Equip';
import { RoleModel } from './../../../db/Role';
import { UserModel } from '../../../db/User';
import { GMUserModel } from '../../../db/GMUser';
import { Application, Session } from 'pinus';
import {FrontendSession} from 'pinus';
import { HeroModel } from './../../../db/Hero';
@@ -22,6 +23,7 @@ export class EntryHandler {
* @param {Object} session current session object
*/
async enter(msg: { token: string, serverId: number }, session: FrontendSession) {
console.log('******enter')
let self = this;
let serverId = msg.serverId;
let sessionService = self.app.get('sessionService');
@@ -97,4 +99,43 @@ export class EntryHandler {
this.app.rpc.battle.eventBattleRemote.kick.route(session)(roleId, this.app.get('serverId'));
// this.app.rpc.chat.chatRemote.kick.route(session, true)(session.uid, this.app.get('serverId'), session.get('rid'));
}
/**
* New client entry chat server.
*
* @param {Object} msg request message
* @param {Object} session current session object
*/
async gmEnter(msg: { token: string, serverId: number }, session: FrontendSession) {
let self = this;
let user = await GMUserModel.getGmAccountByToken(msg.token);
if (!user) {
console.log('user token not found');
return resResult(STATUS.TOKEN_ERR);
}
console.log(self.app.get('serverId'));
await session.abind(user.username);
session.set('uid', user.uid);
session.set('roleId', user.username);
session.set('roleName', user.name);
session.set('eventStatus', 0);
session.set('sid', self.app.get('serverId'));
session.push('sid', () => {});
session.push('roleId', () => {});
session.push('roleName', () => {});
session.push('eventStatus', () => {});
// session.push('rid', function (err) {
// if (err) {
// console.error('set rid for session service failed! error is : %j', err.stack);
// }
// });
session.on('closed', this.onUserLeave.bind(this));
// put user into channel
return resResult(STATUS.SUCCESS);
}
}

View File

@@ -25,6 +25,7 @@ export class GateHandler {
}
// get all connectors
let connectors = this.app.getServersByType('connector');
console.log(connectors);
if (!connectors || connectors.length === 0) {
return resResult(STATUS.CONNECTOR_ERR);
}

View File

@@ -0,0 +1,61 @@
import {Application, BackendSession} from 'pinus';
import { RoleModel } from '../../../db/Role';
import { getEventTime, refreshEvent } from '../../../services/eventSercive';
import EventRecord, { EventRecordModel } from '../../../db/EventRecord';
import { EVENT_STATUS, EVENT_RECORD_STATUS } from '../../../consts/consts';
import { resResult } from '../../../pubUtils/util';
import { STATUS } from '../../../consts/statusCode';
export default function(app: Application) {
return new GmHandler(app);
}
export class GmHandler {
constructor(private app: Application) {
}
async pushEvent(msg: { uid: number, serverId: number }, session: BackendSession) {
let sid = session.get('sid');
let { uid, serverId } = msg;
console.log(uid, serverId)
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 channel = channelService.getChannel(roleId, true);
let users = channel.getMembers();
if (users.indexOf(roleId) === -1) {
channel.add(roleId, sid);
}
let now = new Date();
let t = getEventTime(now);
let event: Array<EventRecord>;
if (eventStatus == EVENT_STATUS.STARTING) {
event = await EventRecordModel.getEventRecordByTime(roleId, 0);
} else if( eventStatus == EVENT_STATUS.OPEN ) {
event = await EventRecordModel.getEventRecordByTime(roleId, t);
if(event.length == 0) { // 刷新
const num = 3; // 每次刷3个
event = await refreshEvent(num, roleId, roleName, t);
}
}
let tsid = channel.getMember(roleId)['sid'];
channelService.pushMessageByUids('onSpecialEvent', {
msg: { event }
}, [{
uid: roleId,
sid: tsid
}]);
return resResult(STATUS.SUCCESS, { list: event });
}
}

View File

@@ -0,0 +1,92 @@
import { Application, ChannelService, FrontendSession, RemoterClass } from 'pinus';
export default function (app: Application) {
return new ChatRemote(app);
}
// rpc 定义挪到单独的定义文件(user.rpc.define.ts)。解决ts-node 有可能找不到定义的问题。
// 你也可以用其它方法解决,或者没有遇到过这个问题的话,定义还是可以放在这里。
// UserRpc的命名空间自动合并
// declare global {
// interface UserRpc {
// chat: {
// chatRemote: RemoterClass<FrontendSession, ChatRemote>;
// };
// }
// }
export class ChatRemote {
constructor(private app: Application) {
this.app = app;
this.channelService = app.get('channelService');
}
private channelService: ChannelService;
/**
* Add user into chat channel.
*
* @param {String} uid unique id for user
* @param {String} sid server id
* @param {String} name channel name
* @param {boolean} flag channel parameter
*
*/
public async add(uid: string, sid: string, name: string, flag: boolean) {
let channel = this.channelService.getChannel(name, flag);
let username = uid.split('*')[0];
let param = {
user: username
};
channel.pushMessage('onAdd', param);
if (!!channel) {
channel.add(uid, sid);
}
return this.get(name, flag);
}
/**
* Get user from chat channel.
*
* @param {Object} opts parameters for request
* @param {String} name channel name
* @param {boolean} flag channel parameter
* @return {Array} users uids in channel
*
*/
private get(name: string, flag: boolean) {
let users: string[] = [];
let channel = this.channelService.getChannel(name, flag);
if (!!channel) {
users = channel.getMembers();
}
for (let i = 0; i < users.length; i++) {
users[i] = users[i].split('*')[0];
}
return users;
}
/**
* Kick user out chat channel.
*
* @param {String} uid unique id for user
* @param {String} sid server id
* @param {String} name channel name
*
*/
public async kick(uid: string, sid: string, name: string) {
let channel = this.channelService.getChannel(name, false);
// leave channel
if (!!channel) {
channel.leave(uid, sid);
}
let username = uid.split('*')[0];
let param = {
user: username
};
channel.pushMessage('onLeave', param);
}
}

View File

@@ -25,3 +25,15 @@ export function battle(session: Session, msg: any, app: Application, cb: (err: E
let res = dispatch(session.get('roleId'), battleServers);
cb(null, res.id);
}
export function gm(session: Session, msg: any, app: Application, cb: (err: Error , serverId ?: string) => void) {
let gmServers = app.getServersByType('gm');
if(!gmServers || gmServers.length === 0) {
cb(new Error('can not find gm servers.'));
return;
}
let res = dispatch(session.get('roleId'), gmServers);
cb(null, res.id);
}

View File

@@ -10,5 +10,8 @@ module.exports = [{
}, {
'type': 'battle',
'token': 'agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn'
}, {
'type': 'gm',
'token': 'agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn'
}
];

View File

@@ -22,6 +22,9 @@ module.exports = {
'battle': [
{'id': 'battle-server-1', 'host': '127.0.0.1', 'port': 6054, 'args': '--inspect=10007'}
],
'gm': [
{'id': 'gm-server-1', 'host': '127.0.0.1', 'port': 6055, 'args': '--inspect=10009'}
],
'gate': [
{
'id': 'gate-server-1',
@@ -67,6 +70,9 @@ module.exports = {
'clientPort': 3015,
'frontend': true
}
],
'gm': [
{'id': 'gm-server-1', 'host': '127.0.0.1', 'port': 6055}
]
},
'local': {
@@ -82,15 +88,16 @@ module.exports = {
}
],
'chat': [
{'id': 'chat-server-1', 'host': '127.0.0.1', 'port': 6050, 'args': '--inspect=10002'},
{'id': 'chat-server-2', 'host': '127.0.0.1', 'port': 6051, 'args': '--inspect=10004'},
{'id': 'chat-server-3', 'host': '127.0.0.1', 'port': 6052, 'args': '--inspect=10005'}
{'id': 'chat-server-1', 'host': '127.0.0.1', 'port': 6050}
],
'role': [
{'id': 'role-server-1', 'host': '127.0.0.1', 'port': 6053, 'args': '--inspect=10006'}
{'id': 'role-server-1', 'host': '127.0.0.1', 'port': 6053}
],
'battle': [
{'id': 'battle-server-1', 'host': '127.0.0.1', 'port': 6054, 'args': '--inspect=10007'}
{'id': 'battle-server-1', 'host': '127.0.0.1', 'port': 6054}
],
'gm': [
{'id': 'gm-server-1', 'host': '127.0.0.1', 'port': 6055}
],
'gate': [
{
@@ -98,16 +105,14 @@ module.exports = {
'host': '127.0.0.1',
'clientHost': '127.0.0.1',
'clientPort': 3014,
'frontend': true,
'args': '--inspect=10003'
'frontend': true
},
{
'id': 'gate-server-2',
'host': '127.0.0.1',
'clientHost': '127.0.0.1',
'clientPort': 3015,
'frontend': true,
'args': '--inspect=10008'
'frontend': true
}
]
}

View File

@@ -44,6 +44,7 @@ export default class GMUser extends BaseModel {
}
public static async getGmAccountByToken(token: string, lean = true) {
console.log(token)
const user = await GMUserModel.findOne({token}).select('uid username name token').lean(lean);
return user;
}