818 lines
26 KiB
TypeScript
818 lines
26 KiB
TypeScript
import Signal from "../../core/Signal";
|
||
import Http from "../../utils/Http";
|
||
import PlayerMgr from "../../object/PlayerMgr";
|
||
import GMMgr from "../../core/GMMgr";
|
||
import NoticeMgr from "../../core/NoticeMgr";
|
||
import ChargeSum from "../../core/ChargeSum";
|
||
import DB from "../../utils/DB";
|
||
import Player from "../../object/Player";
|
||
// 网络请求
|
||
import bodyParser from "body-parser";
|
||
import express from "express";
|
||
import {Request, Response } from "express";
|
||
import Launch from "../../core/Launch";
|
||
import GameUtil from "../../core/GameUtil";
|
||
import SKDataUtil from "../../gear/SKDataUtil";
|
||
import SKLogger from "../../gear/SKLogger";
|
||
import DugMgr from "../../role/DugMgr";
|
||
import { MsgCode } from "../../role/EEnum";
|
||
import GameConf from "../../../conf/GameConf";
|
||
import MailData from "../../mail/MailData";
|
||
import MailMgr from "../../mail/MailMgr";
|
||
import JingJiChang from "../../activity/JingJiChang";
|
||
import LotteryMgr from "../../core/LotteryMgr";
|
||
import SignInMgr from "../../core/SignInMgr";
|
||
import MallMgr from "../../core/MallMgr";
|
||
import ZhenbukuiMgr from "../../activity/ZhenbukuiMgr";
|
||
import RobotMgr from "../../core/RobotMgr";
|
||
import SKRedisUtil from "../../gear/SKRedisUtil";
|
||
import DialMgr from "../../core/DialMgr";
|
||
import DebrisMall from "../../core/DebrisMall";
|
||
import OnlineRewards from "../../activity/OnlineRewards";
|
||
import Currency from "../../activity/Currency";
|
||
import Ofuda from "../../object/Ofuda";
|
||
import { nextTick } from "process";
|
||
|
||
export default class HttpGame {
|
||
static shared = new HttpGame();
|
||
app: any;
|
||
constructor() {
|
||
this.app = express();
|
||
this.app.use(function (req: Request, res: Response, next: any) {
|
||
res.header("Access-Control-Allow-Origin", "*");
|
||
res.header("Access-Control-Expose-Headers", "'Content-Type,Access-Control-Allow-Headers,Authorization,X-Requested-With");
|
||
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
|
||
res.header("X-Powered-By", ' 3.2.1');
|
||
res.header("Content-Type", "application/json;charset=utf-8");
|
||
next();
|
||
});
|
||
this.app.use(bodyParser.json({ limit: "1mb" }));
|
||
this.app.use(bodyParser.urlencoded({ limit: "1mb", extended: true }));
|
||
}
|
||
|
||
loginToken(req: any, res: any) {
|
||
SKLogger.info("login token")
|
||
let accountid = req.query.accountid;
|
||
let roleid = req.query.roleid;
|
||
let login_token = req.query.token;
|
||
Signal.shared.addLoginToken(accountid, login_token);
|
||
Http.reply(res, {
|
||
result: MsgCode.SUCCESS,
|
||
});
|
||
}
|
||
|
||
getClientIP(req: any, res: any): string {
|
||
var ip = req.headers['x-forwarded-for'] ||
|
||
req.ip ||
|
||
req.connection.remoteAddress ||
|
||
req.socket.remoteAddress ||
|
||
req.connection.socket.remoteAddress || '';
|
||
if (ip.split(',').length > 0) {
|
||
ip = ip.split(',')[0];
|
||
}
|
||
return ip;
|
||
}
|
||
// 充值回调
|
||
chargeCallback(req: any, res: any) {
|
||
let roleid = req.query.roleid;
|
||
let jade = SKDataUtil.numberBy(req.query.jade);
|
||
let sdorderno = req.query.sdorderno;
|
||
let sdpayno = req.query.sdpayno;
|
||
let sd_money: number = SKDataUtil.numberBy(req.query.sd_money);
|
||
let total_fee: number = SKDataUtil.numberBy(req.query.total_fee);
|
||
let msg: string = "";
|
||
if (sd_money != total_fee) {
|
||
// 支付调试模式下不验证金额是否匹配
|
||
if (GameConf.debugPay.length < 0) {
|
||
msg = `支付:在线玩家[${roleid}]订单金额${sd_money}元与实充金额${total_fee}元不匹配,游戏订单${sdorderno},支付订单${sdpayno}无效!`
|
||
SKLogger.warn(msg);
|
||
}
|
||
}
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(roleid);
|
||
if (player) {
|
||
let msg = `支付:在线玩家[${player.roleid}:${player.name}]充值${jade}仙玉成功,游戏订单${sdorderno},支付订单${sdpayno}!`
|
||
SKLogger.info(msg);
|
||
player.send('s2c_notice', {
|
||
strRichText: `您充值${total_fee}元成功!`,
|
||
});
|
||
// 充值奖励凤羽道具
|
||
this.addGoods(roleid,50019, Math.ceil(total_fee/2))
|
||
ChargeSum.shared.playerCharge(roleid, total_fee, jade);
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: msg });
|
||
} else {
|
||
msg = `支付:离线玩家${roleid}充值${jade}仙玉成功,游戏订单:${sdorderno},支付订单:${sdpayno}!`
|
||
SKLogger.info(msg);
|
||
// 充值奖励凤羽道具
|
||
this.addGoods(roleid,50019, Math.ceil(total_fee/2))
|
||
ChargeSum.shared.playerCharge(roleid, total_fee, jade);
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: msg });
|
||
}
|
||
}
|
||
// 系统通知
|
||
sysNotice(req: any, res: any) {
|
||
let text = req.query.text;
|
||
let type = req.query.type; // 1 走马灯 2 聊天框 3 走马灯 + 聊天框
|
||
let serverid = req.query.servre_id; // 0 则全服公告
|
||
let times = req.query.times; // -1 则永久公告 需入库
|
||
let interval = req.query.interval; // 单位 秒
|
||
let id = req.query.id; // 消息id
|
||
if (!id) {
|
||
id = 0;
|
||
}
|
||
let notice = {
|
||
id: id,
|
||
text: text,
|
||
type: type,
|
||
times: times,
|
||
interval: interval,
|
||
};
|
||
NoticeMgr.shared.addNewNotice(notice);
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: `发送系统通知:${text}成功` });
|
||
}
|
||
|
||
// 同步风雨同舟数据
|
||
syncDial(req: any, res: any) {
|
||
DialMgr.shared.init();
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: `同步宝图数据成功` });
|
||
}
|
||
|
||
// 同步宝图数据
|
||
syncTreasure(req: any, res: any) {
|
||
LotteryMgr.shared.init();
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: `同步宝图数据成功` });
|
||
}
|
||
|
||
// 同步签到数据
|
||
syncSignIn(req: any, res: any) {
|
||
SignInMgr.shared.readDB();
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: `同步签到数据成功` });
|
||
}
|
||
|
||
// 同步新鲜玩意数据
|
||
syncFresh(req: any, res: any) {
|
||
MallMgr.shared.syncFresh();
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: `同步新鲜玩意数据成功` });
|
||
}
|
||
|
||
// 同步强化材料数据
|
||
syncIntensify(req: any, res: any) {
|
||
MallMgr.shared.syncIntensify();
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: `同步强化材料数据成功` });
|
||
}
|
||
|
||
// 同步限购商店
|
||
syncQuota(req: any, res: any) {
|
||
MallMgr.shared.syncQuota();
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: `同步限购数据成功` });
|
||
}
|
||
|
||
// 同步每日推荐
|
||
syncRecommend(req: any, res: any) {
|
||
MallMgr.shared.syncRecommend();
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: `同步每日推荐数据成功` });
|
||
}
|
||
|
||
// 同步积分商店
|
||
syncIntegral(req: any, res: any) {
|
||
MallMgr.shared.syncIntegral();
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: `同步积分商店数据成功` });
|
||
}
|
||
|
||
// 同步绑定商店
|
||
syncBindJade(req: any, res: any) {
|
||
MallMgr.shared.syncBindJade();
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: `同步绑定商店数据成功` });
|
||
}
|
||
|
||
// 同步碎片商店
|
||
syncDebris(req: any, res: any) {
|
||
DebrisMall.shared.init();
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: `同步碎片商店数据成功` });
|
||
}
|
||
|
||
// 同步在线奖励
|
||
syncOnlineRewards(req: any, res: any) {
|
||
OnlineRewards.shared.init();
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: `同步在线奖励数据成功` });
|
||
}
|
||
|
||
// 同步限购商店
|
||
syncKuiNot(req: any, res: any) {
|
||
ZhenbukuiMgr.shared.init();
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: `同步甄不亏数据成功` });
|
||
}
|
||
|
||
deleteNotice(req: any, res: any) {
|
||
let id = req.query.id;
|
||
NoticeMgr.shared.delNotice(id);
|
||
Http.reply(res, { errcode: MsgCode.SUCCESS });
|
||
}
|
||
|
||
can_speak(req: any, res: any) {
|
||
let roleid = req.query.roleid;
|
||
let state = req.query.state;
|
||
GMMgr.shared.can_speak(roleid, state);
|
||
Http.reply(res, { code: MsgCode.SUCCESS });
|
||
}
|
||
|
||
clearPCache(req: any, res: any) {
|
||
let ip = this.getClientIP(req, res);
|
||
if (ip != GameConf.gate_ip) {
|
||
return;
|
||
}
|
||
let roleid = req.query.roleid;
|
||
PlayerMgr.shared.clearPlayerCache(roleid);
|
||
res.end(SKDataUtil.toJson({
|
||
ret: `操作完成`,
|
||
}, "{}"));
|
||
}
|
||
|
||
kickedOut(req: any, res: any) {
|
||
let roleids = req.query.roleids;
|
||
let sign = req.query.sign; // 签名
|
||
if (sign != GameConf.sign) {
|
||
Http.reply(res, {
|
||
code: MsgCode.FAILED,
|
||
msg: `你是傻逼吗!`
|
||
});
|
||
return;
|
||
}
|
||
PlayerMgr.shared.kickedOutPlayer(roleids);
|
||
}
|
||
|
||
/*
|
||
* 设置充值活动时间
|
||
*/
|
||
setChargeActivity(req: any, res: any) {
|
||
let start = parseInt(req.query.start);
|
||
let end = parseInt(req.query.end);
|
||
GMMgr.shared.setChargeActivity(start, end);
|
||
Http.reply(res, { errcode: 0, });
|
||
}
|
||
/*
|
||
* 关闭充值活动
|
||
*/
|
||
closeChargeActivity(req: any, res: any) {
|
||
GMMgr.shared.closeChargeActivity();
|
||
Http.reply(res, { errcode: 0, });
|
||
}
|
||
// 加仙玉
|
||
addJade(req: any, res: any) {
|
||
let roleId = req.query.roleId;
|
||
let jade: number = parseInt(req.query.jade);
|
||
jade = Math.min(100000000, jade);
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(roleId);
|
||
if (player) {
|
||
player.addMoney(GameUtil.goldKind.Jade, jade, "系统加仙玉");
|
||
let info = `玩家[${player.roleid}:${player.name}]加${jade}仙玉成功`;
|
||
SKLogger.debug(info);
|
||
Http.reply(res, {
|
||
code: MsgCode.SUCCESS,
|
||
msg: info
|
||
});
|
||
return;
|
||
}
|
||
let info = `玩家[${roleId}}]加${jade}仙玉失败`;
|
||
Http.reply(res, {
|
||
code: MsgCode.FAILED,
|
||
msg: info
|
||
});
|
||
}
|
||
// 加经验
|
||
addExp(req: any, res: any) {
|
||
let roleId = req.query.roleId;
|
||
let exp: number = parseInt(req.query.exp);
|
||
exp = Math.min(999999999999, exp);
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(roleId);
|
||
if (player) {
|
||
player.addExp(exp);
|
||
let info = `玩家[${player.roleid}:${player.name}]增加${exp}经验成功`;
|
||
Http.reply(res, {
|
||
code: MsgCode.SUCCESS,
|
||
msg: info
|
||
});
|
||
return;
|
||
}
|
||
DB.addExp(roleId, exp, (code: any) => {
|
||
Http.reply(res, {
|
||
code: code
|
||
});
|
||
});
|
||
}
|
||
//模拟战斗
|
||
testBattle(req: any, res: any){
|
||
let roleId = req.query.roleId;
|
||
let eroleId = req.query.eroleid;
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(roleId);
|
||
if(player){
|
||
JingJiChang.shared.battleStart(roleId,eroleId);
|
||
Http.reply(res, { code: MsgCode.SUCCESS });
|
||
return;
|
||
}
|
||
Http.reply(res, { code: MsgCode.FAILED });
|
||
}
|
||
|
||
//测试http线程锁死情况下, http链接能否处理,
|
||
testSleep(){
|
||
SKLogger.info("test slerrp...............")
|
||
var start = (new Date()).getTime();
|
||
while ((new Date()).getTime() - start < 5 * 60* 1000) { //卡死5分钟
|
||
// 使用 continue 实现;
|
||
continue;
|
||
}
|
||
SKLogger.info("test slerrp...............success")
|
||
}
|
||
|
||
|
||
// 加道具
|
||
addItem(req: any, res: any) {
|
||
let roleId = req.query.roleId;
|
||
let item: number = parseInt(req.query.item);
|
||
let num: number = parseInt(req.query.num);
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(roleId);
|
||
// 在线玩家发放道具
|
||
if (player != null) {
|
||
if (player.addItem(item, num, true, "")) {
|
||
Http.reply(res, { code: MsgCode.SUCCESS });
|
||
} else {
|
||
Http.reply(res, { code: MsgCode.FAILED });
|
||
}
|
||
return;
|
||
}
|
||
// 离线玩家道具发放
|
||
DB.loginByRoleid(roleId, (code: number, data: any) => {
|
||
if (code != MsgCode.SUCCESS || data == null) {
|
||
Http.reply(res, { code: MsgCode.FAILED });
|
||
return;
|
||
}
|
||
let player = new Player();
|
||
player.loaded = true;
|
||
player.setDB(data);
|
||
if (player.addItem(item, num, true, "")) {
|
||
player.offline = false;
|
||
player.saveAll((failed: string[]) => {
|
||
player.offline = true;
|
||
if (failed.length > 0) {
|
||
SKLogger.warn(`玩家[${player.roleid}:${player.name}]加入存档道具失败!`);
|
||
Http.reply(res, { code: MsgCode.FAILED });
|
||
} else {
|
||
SKLogger.warn(`玩家[${player.roleid}:${player.name}]加入存档道具成功!`);
|
||
Http.reply(res, { code: MsgCode.SUCCESS });
|
||
}
|
||
});
|
||
return;
|
||
}
|
||
SKLogger.warn(`玩家[${player.roleid}:${player.name}]加入道具失败!`);
|
||
Http.reply(res, { code: MsgCode.FAILED });
|
||
});
|
||
}
|
||
|
||
//发送天策符
|
||
addOfuda(req: any, res: any){
|
||
let roleId = req.query.roleId;
|
||
let name = req.query.name;
|
||
let grade = req.query.grade;
|
||
let addition = req.query.addition;
|
||
let ofudaobj = Ofuda.shared.createOfuda({
|
||
roleid: parseInt(roleId),
|
||
name: name,
|
||
grade: grade,
|
||
addition: addition
|
||
});
|
||
if(ofudaobj == null){
|
||
Http.reply(res, { code: MsgCode.FAILED });
|
||
return;
|
||
}
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(roleId);
|
||
// 在线玩家发放道具
|
||
if (player) {
|
||
if (Ofuda.shared.pofuda_map.has(player.roleid)) {//map里有没有这个key值
|
||
Ofuda.shared.pofuda_map.get(player.roleid).push(ofudaobj)
|
||
} else {
|
||
let list = [];
|
||
list.push(ofudaobj)
|
||
Ofuda.shared.pofuda_map.set(player.roleid, list);
|
||
}
|
||
Http.reply(res, { code: MsgCode.SUCCESS });
|
||
return;
|
||
}else {
|
||
Http.reply(res, { code: MsgCode.FAILED });
|
||
return;
|
||
}
|
||
}
|
||
|
||
// 充值发送道具
|
||
addGoods(roleId: any,item: number,num:number){
|
||
if (GameConf.integral){
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(roleId);
|
||
// 在线玩家发放道具
|
||
if (player != null) {
|
||
player.addItem(item, num, true, "")
|
||
return;
|
||
}
|
||
// 离线玩家道具发放
|
||
DB.loginByRoleid(roleId, (code: number, data: any) => {
|
||
if (code != MsgCode.SUCCESS || data == null) {
|
||
return;
|
||
}
|
||
let player = new Player();
|
||
player.loaded = true;
|
||
player.setDB(data);
|
||
if (player.addItem(item, num, true, "")) {
|
||
player.offline = false;
|
||
player.saveAll((failed: string[]) => {
|
||
player.offline = true;
|
||
if (failed.length > 0) {
|
||
SKLogger.warn(`玩家[${player.roleid}:${player.name}]加入存档道具失败!`);
|
||
} else {
|
||
SKLogger.warn(`玩家[${player.roleid}:${player.name}]加入存档道具成功!`);
|
||
}
|
||
});
|
||
return;
|
||
}
|
||
SKLogger.warn(`玩家[${player.roleid}:${player.name}]加入道具失败!`);
|
||
});
|
||
}
|
||
}
|
||
|
||
// 加称谓
|
||
addTitle(req: any, res: any) {
|
||
let role_id = req.query.role_id;
|
||
let type = req.query.type;
|
||
let title_id = req.query.title_id;
|
||
let value = req.query.value;
|
||
let onload = req.query.onload;
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(role_id);
|
||
if (player) {
|
||
player.addTitle(type, title_id, value, onload);
|
||
} else {
|
||
DB.addTitle(role_id, type, title_id, (code: number, msg: string) => {
|
||
});
|
||
}
|
||
Http.reply(res, { code: MsgCode.SUCCESS });
|
||
}
|
||
|
||
// 提现更改
|
||
withdrawState(req: any, res: any) {
|
||
let state = req.query.state;
|
||
let serial = req.query.serial;
|
||
let role_id = req.query.role_id;
|
||
let flag: boolean = Currency.shared.update_withdraw_state(role_id,{state:state,serial:serial});
|
||
if (flag){
|
||
Http.reply(res, { code: MsgCode.SUCCESS });
|
||
return;
|
||
}
|
||
Http.reply(res, { code: MsgCode.FAILED });
|
||
return;
|
||
|
||
}
|
||
|
||
// 获得现金
|
||
obtainCurrency(req: any, res: any) {
|
||
let msg = req.query.msg;
|
||
let role_id = req.query.role_id;
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(role_id);
|
||
if (player) {
|
||
Currency.shared.gm_obtain_currency(player,msg);
|
||
Http.reply(res, { code: MsgCode.SUCCESS });
|
||
return;
|
||
}
|
||
Http.reply(res, { code: MsgCode.FAILED });
|
||
return;
|
||
|
||
}
|
||
|
||
// 清理玩家任务
|
||
closeTask(req: any, res: any) {
|
||
let role_id = req.query.roleId;
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(role_id);
|
||
if (player) {
|
||
player.F5_Task();
|
||
}
|
||
Http.reply(res, { code: MsgCode.SUCCESS });
|
||
}
|
||
|
||
// 恢复数据
|
||
async rollbackPlayer(req: any, res: any) {
|
||
|
||
let role_id = req.query.roleId;
|
||
let msg = "";
|
||
// 先进行清理角色
|
||
let player = PlayerMgr.shared.player_role_list[role_id];
|
||
if (player){
|
||
player.destroy();
|
||
delete PlayerMgr.shared.player_role_list[player.roleid];
|
||
delete PlayerMgr.shared.player_only_list[player.onlyid];
|
||
}
|
||
// 获取角色缓存
|
||
let role = await SKRedisUtil.getValue(role_id.toString());
|
||
let pet = await SKRedisUtil.getValue(role_id + "pet");
|
||
let scheme = await SKRedisUtil.getValue(role_id + "scheme");
|
||
let hourse = await SKRedisUtil.getValue(role_id + "hourse");
|
||
let hourseskill = await SKRedisUtil.getValue(role_id + "hourseskill");
|
||
// 数据不为undefined
|
||
if (role != undefined){
|
||
let callback = (ret: any, item: any) => {
|
||
if (ret == MsgCode.SUCCESS) {
|
||
msg = "成功";
|
||
Http.reply(res, {code: MsgCode.SUCCESS, msg: msg});
|
||
} else {
|
||
msg = "失败";
|
||
Http.reply(res, {code: MsgCode.SUCCESS, msg: msg});
|
||
}
|
||
DB.saveSignIn(SKDataUtil.toJson(role.daySignIn,"{}"), role_id, role.mendDate,(code: number, msg: string) => {
|
||
let info = `存档:[${role_id}:${role.dbinfo.name}]签到数据存档`;
|
||
if (code == MsgCode.SUCCESS) {
|
||
info += `成功!`;
|
||
SKLogger.debug(info);
|
||
} else {
|
||
info += `失败[${msg}]!`;
|
||
SKLogger.warn(info);
|
||
}
|
||
});
|
||
DB.saveDial(role_id, role.dial_num,role.dial_count,role.dial_date,(code: number, msg: string) => {
|
||
let info = `存档:[${role_id}:${role.dbinfo.name}]风雨转盘数据存档`;
|
||
if (code == MsgCode.SUCCESS) {
|
||
info += `成功!`;
|
||
SKLogger.debug(info);
|
||
} else {
|
||
info += `失败[${msg}]!`;
|
||
SKLogger.warn(info);
|
||
}
|
||
});
|
||
DB.savePetsRedis(pet, role_id, (code: number, msg: string) => {
|
||
let info = `存档:[${role_id}:${role.dbinfo.name}]召唤兽存档`;
|
||
if (code == MsgCode.SUCCESS) {
|
||
info += `成功!`;
|
||
SKLogger.debug(info);
|
||
} else {
|
||
info += `失败[${msg}]!`;
|
||
SKLogger.warn(info);
|
||
}
|
||
});
|
||
// 保存套装
|
||
DB.saveSchemeRedis(scheme, (code: number, msg: string) => {
|
||
});
|
||
DB.saveHorseList(role_id, hourse, (error: any, rows: any[]) => {
|
||
if (error != null) {
|
||
SKLogger.warn(`存档:玩家[${role_id}:坐骑列表存档失败[${DB.errorInfo(error)}]!`);
|
||
} else {
|
||
SKLogger.debug(`存档:玩家[${role_id}:坐骑列表存档成功!`);
|
||
}
|
||
});
|
||
DB.saveHorseSkillList(role_id, hourseskill, (error: any, rows: any[]) => {
|
||
if (error != null) {
|
||
SKLogger.warn(`存档:玩家[${role_id}:坐骑技能存档失败[${DB.errorInfo(error)}]!`);
|
||
} else {
|
||
SKLogger.debug(`存档:玩家[${role_id}:坐骑技能存档完成!`);
|
||
}
|
||
});
|
||
callback = null;
|
||
}
|
||
DB.savePlayerInfo(role_id, role.dbinfo, callback);
|
||
}else {
|
||
Http.reply(res, {code: MsgCode.FAILED, msg: "缓存数据中没有该玩家信息"});
|
||
}
|
||
}
|
||
|
||
|
||
// 创建机器人
|
||
createRobot(req: any, res: any) {
|
||
RobotMgr.shared.createRobotOn(req.query.num,(code,count) => {
|
||
let msg = `以创建机器人:${count}!`;
|
||
Http.reply(res, { code: code, msg: msg });
|
||
});
|
||
}
|
||
|
||
// 清理机器人
|
||
clearRobot(req: any, res: any) {
|
||
RobotMgr.shared.remoteAllRobot(req.query.num,(code,count) => {
|
||
let msg = `以清理机器人:${count}!`;
|
||
Http.reply(res, { code: code, msg: msg });
|
||
});
|
||
}
|
||
|
||
// 清除玩家每日存档
|
||
clearDay(req: any, res: any) {
|
||
let roleId = req.query.roleId;
|
||
let type: number = parseInt(req.query.type);
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(roleId);
|
||
if (player != null) {
|
||
player.clearDayMap();
|
||
Http.reply(res, { code: MsgCode.SUCCESS });
|
||
return;
|
||
}
|
||
DB.loginByRoleid(roleId, (code: number, data: any) => {
|
||
if (code != MsgCode.SUCCESS || data == null) {
|
||
Http.reply(res, { code: MsgCode.FAILED });
|
||
return;
|
||
}
|
||
let player = new Player();
|
||
player.offline = false;
|
||
player.setDB(data);
|
||
player.clearDayMap();
|
||
player.saveAll((failed: string[]) => {
|
||
player.offline = true;
|
||
if (failed.length > 0) {
|
||
SKLogger.warn(`玩家[${player.roleid}:${player.name}]清除每日存档失败!`);
|
||
Http.reply(res, { code: MsgCode.FAILED });
|
||
} else {
|
||
SKLogger.debug(`玩家[${player.roleid}:${player.name}]清除每日存档成功!`);
|
||
Http.reply(res, { code: MsgCode.SUCCESS });
|
||
}
|
||
});
|
||
})
|
||
}
|
||
// 清理所有的玩家每日存档
|
||
clearAllDay(req: any, res: any) {
|
||
PlayerMgr.shared.clearAllDayCount();
|
||
let msg = `服务器[${GameUtil.serverName}][在线玩家数:${GameUtil.online}]已清空所有玩家每日存档!`;
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: msg });
|
||
}
|
||
// 控制
|
||
control(req: any, res: any) {
|
||
let type = (req.query.type ? req.query.type : 0);
|
||
let open = (req.query.open ? req.query.open : 1);
|
||
let msg = `控制完成`;
|
||
if (type == 1) {
|
||
let enabled = (open == 1);
|
||
if (DugMgr.enabled != enabled) {
|
||
DugMgr.enabled = enabled;
|
||
msg = `${DugMgr.enabled ? `开启` : `关闭`}今日挖宝!`
|
||
SKLogger.info(msg);
|
||
}
|
||
}
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: msg });
|
||
}
|
||
// 全部存档
|
||
saveAll(req: any, res: any) {
|
||
SKLogger.info(`服务器[${GameUtil.serverName}]正在存档!`);
|
||
Launch.shared.saveAll(() => {
|
||
let msg = `服务器[${GameUtil.serverName}]存档完成:机器人数[${GameUtil.robotCount}]在线玩家数[${GameUtil.online}]失败总数[${GameUtil.saveFailed.length}]存档总数[${GameUtil.saveTotal}]`;
|
||
SKLogger.info(msg)
|
||
let data = {
|
||
server_id: GameUtil.serverId,
|
||
server_name: GameUtil.serverName,
|
||
online: GameUtil.online,
|
||
saveCount: GameUtil.saveCount,
|
||
saveTotal: GameUtil.saveTotal,
|
||
saveFailed: GameUtil.saveFailed
|
||
}
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: msg, data: data });
|
||
});
|
||
}
|
||
|
||
// 备用存档
|
||
saveAllReserve(req: any, res: any){
|
||
let player_role_list: any = PlayerMgr.shared.player_role_list
|
||
for (let roleId in player_role_list) {
|
||
let player = player_role_list[roleId];
|
||
if (player != null) {
|
||
player.saveAllReserve();
|
||
}
|
||
}
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: "备用存档已经在执行中"});
|
||
}
|
||
|
||
// 关服
|
||
close(req: any, res: any) {
|
||
if (GameUtil.isClose) {
|
||
let data = {
|
||
server_id: GameUtil.serverId,
|
||
server_name: GameUtil.serverName,
|
||
online: GameUtil.online,
|
||
saveCount: GameUtil.saveCount,
|
||
saveTotal: GameUtil.saveTotal,
|
||
saveFailed: GameUtil.saveFailed
|
||
}
|
||
if (Launch.shared.isClose) {
|
||
let msg = `服务器[${GameUtil.serverName}]已关服:机器人数[${GameUtil.robotCount}]在线玩家数[${GameUtil.online}]失败总数[${GameUtil.saveFailed.length}]存档总数[${GameUtil.saveTotal}]`;
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: msg, data: data });
|
||
} else {
|
||
let msg = `服务器[${GameUtil.serverName}]正在关服:机器人数[${GameUtil.robotCount}]在线玩家数[${GameUtil.online}]存档进度[${GameUtil.saveCount}/${GameUtil.saveTotal}]`;
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: msg, data: data });
|
||
}
|
||
return;
|
||
}
|
||
GameUtil.isClose = true;
|
||
SKLogger.info(`正在关闭服务器[${GameUtil.serverName}]!`);
|
||
Launch.shared.close(() => {
|
||
let msg = `服务器[${GameUtil.serverName}]关服完成:机器人数[${GameUtil.robotCount}]在线玩家数[${GameUtil.online}]失败总数[${GameUtil.saveFailed.length}]存档总数[${GameUtil.saveTotal}]`;
|
||
SKLogger.info(msg);
|
||
let data = {
|
||
server_id: GameUtil.serverId,
|
||
server_name: GameUtil.serverName,
|
||
online: GameUtil.online,
|
||
saveCount: GameUtil.saveCount,
|
||
saveTotal: GameUtil.saveTotal,
|
||
saveFailed: GameUtil.saveFailed
|
||
}
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: msg, data });
|
||
});
|
||
}
|
||
// 发送邮件
|
||
sendMail(req: any, res: any) {
|
||
if(!GameConf.mailEnabled){
|
||
Http.reply(res, { code: MsgCode.FAILED, msg: `发送邮件:邮件功能未开启`});
|
||
return;
|
||
}
|
||
let mail = new MailData();
|
||
let info = mail.parseReq(req);
|
||
if (info.length < 1) {
|
||
MailMgr.shared.addSystemMail(mail);
|
||
let msg = `发送邮件:服务器[${GameUtil.serverName}]发送邮件[${mail.mail_id}:${mail.title}]成功`;
|
||
Http.reply(res, { code: MsgCode.SUCCESS, msg: msg });
|
||
|
||
if(mail.role_id == 0){
|
||
PlayerMgr.shared.broadcastEmail()
|
||
}else{
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(mail.role_id)
|
||
if(player){
|
||
player.send("s2c_friend_apply", {});
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
Http.reply(res, { code: MsgCode.FAILED, msg: info });
|
||
}
|
||
|
||
//设置中间件, 判断卡死在哪条消息上
|
||
beforeRecv(req: any, res: any, next: any){
|
||
SKLogger.info(req.baseUrl)
|
||
SKLogger.info(req.originalUrl)
|
||
next();
|
||
}
|
||
|
||
// 启动Http服务
|
||
start(port: number) {
|
||
// 游戏服务器路由
|
||
let list: { [key: string]: (req: any, res: any) => void } = {
|
||
['login_token']: this.loginToken.bind(this),
|
||
['charge_callback']: this.chargeCallback.bind(this),
|
||
['sys_notice']: this.sysNotice.bind(this),
|
||
['can_speak']: this.can_speak.bind(this),
|
||
['delete_notice']: this.deleteNotice.bind(this),
|
||
['clear_pcache']: this.clearPCache.bind(this),
|
||
['kicked_out']: this.kickedOut.bind(this),
|
||
['set_charge_activity']: this.setChargeActivity.bind(this),
|
||
['close_charge_activity']: this.closeChargeActivity.bind(this),
|
||
['add_jade']: this.addJade.bind(this),
|
||
['add_exp']: this.addExp.bind(this),
|
||
['add_item']: this.addItem.bind(this),
|
||
['add_ofuda']: this.addOfuda.bind(this),
|
||
['add_title']: this.addTitle.bind(this),
|
||
["clear_day"]: this.clearDay.bind(this),
|
||
["clear_all_day"]: this.clearAllDay.bind(this),
|
||
// 全部存档
|
||
["save_all"]: this.saveAll.bind(this),
|
||
// 备用存档
|
||
["save_all_reserve"]: this.saveAllReserve.bind(this),
|
||
["control"]: this.control.bind(this),
|
||
// 恢复数据
|
||
["roll_back_player"]: this.rollbackPlayer.bind(this),
|
||
// 清理玩家任务
|
||
["close_task"]: this.closeTask.bind(this),
|
||
// 关服
|
||
["close"]: this.close.bind(this),
|
||
["send_mail"]: this.sendMail.bind(this),
|
||
// 同步风雨同舟数据
|
||
["sync_dial"]: this.syncDial.bind(this),
|
||
// 同步宝图数据
|
||
["sync_treasure"]: this.syncTreasure.bind(this),
|
||
// 同步签到数据
|
||
["sync_signIn"]: this.syncSignIn.bind(this),
|
||
// 同步新鲜玩意数据
|
||
["sync_fresh"]: this.syncFresh.bind(this),
|
||
// 同步强化材料数据
|
||
["sync_intensify"]: this.syncIntensify.bind(this),
|
||
// 同步限购商店数据
|
||
["sync_quota"]: this.syncQuota.bind(this),
|
||
// 同步限购商店数据
|
||
["sync_recommend"]: this.syncRecommend.bind(this),
|
||
// 同步限购商店数据
|
||
["sync_integral"]: this.syncIntegral.bind(this),
|
||
// 同步绑定商店数据
|
||
["sync_bindjade"]: this.syncBindJade.bind(this),
|
||
// 同步甄不亏商店数据
|
||
["sync_kui_not"]: this.syncKuiNot.bind(this),
|
||
// 同步碎片商城配置
|
||
["sync_debris"]: this.syncDebris.bind(this),
|
||
// 同步在线奖励配置
|
||
["sync_online_rewards"]: this.syncOnlineRewards.bind(this),
|
||
// 更改提现状态
|
||
["withdraw_state"]: this.withdrawState.bind(this),
|
||
// 获得现金
|
||
["obtain_currency"]: this.obtainCurrency.bind(this),
|
||
// 创建机器人数据
|
||
["create_robot"]: this.createRobot.bind(this),
|
||
// 清理机器人数据
|
||
["clear_robot"]: this.clearRobot.bind(this),
|
||
["test_battle"]: this.testBattle.bind(this),
|
||
["test"]: this.testSleep.bind(this)
|
||
};
|
||
for (let key in list) {
|
||
this.app.get('/' + key, [this.beforeRecv.bind(this)], list[key]);
|
||
}
|
||
this.app.listen(port);
|
||
}
|
||
} |