From 81260bb6954fe0aa01bcf109d80981e43060dcdd Mon Sep 17 00:00:00 2001 From: luying Date: Tue, 18 Apr 2023 11:35:34 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(=E5=BD=95=E5=83=8F):=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BD=95=E5=83=8F=E4=B8=8A=E4=BC=A0=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.js | 5 ++++- .../app/servers/battle/handler/ladderHandler.ts | 4 ++-- game-server/app/servers/battle/handler/pvpHandler.ts | 4 ++-- .../app/servers/guild/handler/gvgFightHandler.ts | 4 ++-- pushdocker.sh | 3 ++- shared/db/GVGBattleRec.ts | 7 +++++-- shared/db/GVGVestigeRec.ts | 7 +++++-- shared/db/LadderMatchRec.ts | 6 ++++-- shared/db/PvpRecord.ts | 6 ++++-- shared/pubUtils/battleUtils.ts | 12 ++++++++---- web-server/app/controller/game.ts | 10 +++++----- web-server/config/config.local.ts | 2 ++ web-server/config/sshHost.ts | 1 + 13 files changed, 46 insertions(+), 25 deletions(-) create mode 100644 web-server/config/sshHost.ts diff --git a/config.js b/config.js index 59b624a33..24d548b9a 100644 --- a/config.js +++ b/config.js @@ -1,19 +1,22 @@ var fs = require('fs'); function main (){ var args = process.argv.splice(2) - if (args.length !== 1) { + if (args.length !== 2) { return console.log('参数请填写环境变量'); } let env = args[0]; + let sshHost = args[1]; let configObject = { env: env }; let result = JSON.stringify(configObject); + let sshHostResult = `export const sshHost = "${sshHost}";` fs.writeFileSync(__dirname + '/game-server/config.json', result, 'utf8'); fs.writeFileSync(__dirname + '/gm-server/config/env', env, 'utf8'); fs.writeFileSync(__dirname + '/web-server/config/env', env, 'utf8'); + fs.writeFileSync(__dirname + '/web-server/config/sshHost.ts', sshHostResult, 'utf8'); } main(); diff --git a/game-server/app/servers/battle/handler/ladderHandler.ts b/game-server/app/servers/battle/handler/ladderHandler.ts index 0f4930101..09c7a18fd 100644 --- a/game-server/app/servers/battle/handler/ladderHandler.ts +++ b/game-server/app/servers/battle/handler/ladderHandler.ts @@ -360,8 +360,8 @@ export class LadderHandler { let list = await LadderMatchRecModel.findRecentRec(roleId, getTimeFunM().getBeforeDay(2)); return resResult(STATUS.SUCCESS, { list: list.map(rec => { - const { roleId1, battleCode, hasRpl } = rec; - const rplFileUrl = battleCode && hasRpl ? getRemoteRplFilePath(roleId1, WAR_TYPE.LADDER, battleCode) : ''; + const { roleId1, battleCode, hasRpl, remoteUrl } = rec; + const rplFileUrl = battleCode && hasRpl ? getRemoteRplFilePath(remoteUrl, roleId1, WAR_TYPE.LADDER, battleCode) : ''; return { ...rec, rplFileUrl }; }), rplPrefixUrl: getRemoteRplPrefix(pinus.app.get('env')) diff --git a/game-server/app/servers/battle/handler/pvpHandler.ts b/game-server/app/servers/battle/handler/pvpHandler.ts index 2e806cc2e..4e631e66d 100644 --- a/game-server/app/servers/battle/handler/pvpHandler.ts +++ b/game-server/app/servers/battle/handler/pvpHandler.ts @@ -618,8 +618,8 @@ export class PvpHandler { return resResult(STATUS.SUCCESS, { list: pvpRecords.map(rec => { - const { roleId1, battleCode, hasRpl } = rec; - const rplFileUrl = battleCode && hasRpl ? getRemoteRplFilePath(roleId1, WAR_TYPE.PVP, battleCode) : ''; + const { roleId1, battleCode, hasRpl, remoteUrl } = rec; + const rplFileUrl = battleCode && hasRpl ? getRemoteRplFilePath(remoteUrl, roleId1, WAR_TYPE.PVP, battleCode) : ''; return { ...rec, rplFileUrl }; }), rplPrefixUrl: getRemoteRplPrefix(pinus.app.get('env')) diff --git a/game-server/app/servers/guild/handler/gvgFightHandler.ts b/game-server/app/servers/guild/handler/gvgFightHandler.ts index 65a6816b9..334cb3f5b 100644 --- a/game-server/app/servers/guild/handler/gvgFightHandler.ts +++ b/game-server/app/servers/guild/handler/gvgFightHandler.ts @@ -395,8 +395,8 @@ export class GVGProduceHandler { let list = await GVGVestigeRecModel.findRec(roleId, vestigeId); let result: (GVGVestigeRecUpdate & {rplFileUrl: string})[] = []; for(let rec of list) { - const { attackRoleId, battleCode, hasRpl } = rec; - const rplFileUrl = battleCode && hasRpl ? getRemoteRplFilePath(attackRoleId, WAR_TYPE.GVG_VESTIGE, battleCode) : ''; + const { attackRoleId, battleCode, hasRpl, remoteUrl } = rec; + const rplFileUrl = battleCode && hasRpl ? getRemoteRplFilePath(remoteUrl, attackRoleId, WAR_TYPE.GVG_VESTIGE, battleCode) : ''; const obj = getVestigeRecStatus(rec); if(obj.status == VESTIGE_STATUS.COMPLETE) result.push({ ...rec, endTime: obj.time, rplFileUrl }); } diff --git a/pushdocker.sh b/pushdocker.sh index 957297401..0f88b9bac 100755 --- a/pushdocker.sh +++ b/pushdocker.sh @@ -125,7 +125,7 @@ fi echo "|*********************|\n" echo "and config.json is: \n" -node ./config.js ${env} +node ./config.js ${env} ${1} cat './game-server/config.json' echo "\n" echo "|*********************|\n" @@ -157,3 +157,4 @@ esac git checkout ./game-server/config.json git checkout ./gm-server/config/env git checkout ./web-server/config/env +git checkout ./web-server/config/sshHost diff --git a/shared/db/GVGBattleRec.ts b/shared/db/GVGBattleRec.ts index bdaf9a5a6..42bd1a08b 100644 --- a/shared/db/GVGBattleRec.ts +++ b/shared/db/GVGBattleRec.ts @@ -97,6 +97,9 @@ export default class GVGBattleRec extends BaseModel { @prop({ required: true, default: false }) hasRpl: boolean; // 是否存在对应录像 + @prop({ required: true, default: false }) + remoteUrl: string; // 录像地址 + public static async createRec(configId: number, groupKey: string, warId: number, attackTeam: GVGTeamType, defenseTeam: GVGTeamType) { const battleCode = genCode(8); const result: GVGBattleRecType = await GVGBattleRecModel.findOneAndUpdate({ battleCode }, { $set: { configId, groupKey, warId, attackTeam, defenseTeam, isSuccess: false } }, { new: true, upsert: true }).lean(); @@ -113,8 +116,8 @@ export default class GVGBattleRec extends BaseModel { return result; } - public static async updateRplStatus(battleCode: string, hasRpl: boolean) { - let result = await GVGBattleRecModel.findOneAndUpdate({ battleCode }, { hasRpl }, { new: true }).lean(); + public static async updateRplStatus(battleCode: string, hasRpl: boolean, remoteUrl: string) { + let result = await GVGBattleRecModel.findOneAndUpdate({ battleCode }, { hasRpl, remoteUrl }, { new: true }).lean(); return result; } } diff --git a/shared/db/GVGVestigeRec.ts b/shared/db/GVGVestigeRec.ts index 7a539bc55..53ef2f525 100644 --- a/shared/db/GVGVestigeRec.ts +++ b/shared/db/GVGVestigeRec.ts @@ -65,6 +65,9 @@ export default class GVGVestigeRec extends BaseModel { @prop({ required: true, default: false }) hasRpl: boolean; // 是否存在对应录像 + @prop({ required: true, default: false }) + remoteUrl: string; // 录像文件 + public static async createRec(configId: number, vestigeId: number, groupKey: string, warId: number, attackInfo: OppPlayerInfo, defenseInfo: OppPlayerInfo, leagueGoods: LeagueGood[]) { const battleCode = genCode(10); const result: GVGVestigeRecType = await GVGVestigeRecModel.findOneAndUpdate({ battleCode }, { @@ -110,8 +113,8 @@ export default class GVGVestigeRec extends BaseModel { } - public static async updateRplStatus(battleCode: string, hasRpl: boolean) { - let result: GVGVestigeRecType = await GVGVestigeRecModel.findOneAndUpdate({ battleCode }, { hasRpl }, { new: true }).lean(); + public static async updateRplStatus(battleCode: string, hasRpl: boolean, remoteUrl: string) { + let result: GVGVestigeRecType = await GVGVestigeRecModel.findOneAndUpdate({ battleCode }, { hasRpl, remoteUrl }, { new: true }).lean(); return result; } diff --git a/shared/db/LadderMatchRec.ts b/shared/db/LadderMatchRec.ts index 2e5e2fde0..74916bae2 100644 --- a/shared/db/LadderMatchRec.ts +++ b/shared/db/LadderMatchRec.ts @@ -37,6 +37,8 @@ export default class LadderMatchRec extends BaseModel { @prop({ required: true, default: false }) hasRpl: boolean; // 是否存在对应录像 + @prop({ required: true, default: false }) + remoteUrl: string; // 录像地址 public static async findByRoleId(roleId: string, getters = false) { const result: LadderMatchRecType = await LadderMatchRecModel.findOne({ roleId1: roleId }).lean({ getters}); @@ -143,8 +145,8 @@ export default class LadderMatchRec extends BaseModel { } - public static async updateRplStatus(battleCode: string, hasRpl: boolean) { - let result = await LadderMatchRecModel.findOneAndUpdate({ battleCode }, { hasRpl }, { new: true }).lean(); + public static async updateRplStatus(battleCode: string, hasRpl: boolean, remoteUrl: string) { + let result = await LadderMatchRecModel.findOneAndUpdate({ battleCode }, { hasRpl, remoteUrl }, { new: true }).lean(); return result; } } diff --git a/shared/db/PvpRecord.ts b/shared/db/PvpRecord.ts index d572677c5..2a6030642 100644 --- a/shared/db/PvpRecord.ts +++ b/shared/db/PvpRecord.ts @@ -137,6 +137,8 @@ export default class PvpRecord extends BaseModel { @prop({ required: true, default: false }) hasRpl: boolean; // 是否存在对应录像 + @prop({ required: true, default: false }) + remoteUrl: string; // 远程地址 @prop({ required: true, default: 0 }) createTime: number; @@ -167,8 +169,8 @@ export default class PvpRecord extends BaseModel { return result; } - public static async updateRplStatus(battleCode: string, hasRpl: boolean) { - let result = await PvpRecordModel.findOneAndUpdate({ battleCode }, { hasRpl }, { new: true }).lean(); + public static async updateRplStatus(battleCode: string, hasRpl: boolean, remoteUrl: string) { + let result = await PvpRecordModel.findOneAndUpdate({ battleCode }, { hasRpl, remoteUrl }, { new: true }).lean(); return result; } } diff --git a/shared/pubUtils/battleUtils.ts b/shared/pubUtils/battleUtils.ts index 2386c52cb..239521f78 100644 --- a/shared/pubUtils/battleUtils.ts +++ b/shared/pubUtils/battleUtils.ts @@ -4,6 +4,7 @@ import { md5 } from './sdkUtil'; const BATTLE_CLASS_MOD = 100; // 存档分类模数 const CDN_URL_PREFIX_SQ = 'https://download-sgzzyz.yev242.com'; // sq cdn 服务器地址前缀 const CDN_URL_PREFIX_ZYZ = 'http://zyz-download.trgame.cn'; // 公司下载服务器地址前缀 +const CDN_URL_PREFIX_YJZ = 'https://yjz-cdn.yev242.com'; // 公司下载服务器地址前缀 // 将字符串 crc32 处理后取模,以将随机字符串分组 function modStr(str: string, mod: number) { @@ -23,8 +24,10 @@ function getPrefixByEnv(env: string) { case 'sq4': case 'sq7': case 'sq9': - default: return CDN_URL_PREFIX_SQ; + case 'zy1': + return CDN_URL_PREFIX_YJZ; + default: } } @@ -34,9 +37,9 @@ export function getLocalRplUrl(roleId: string, warType: number, battleCode: stri return writePath; } -export function getRemoteRplUrl(env: string, roleId: string, warType: number, battleCode: string) { +export function getRemoteRplUrl(env: string, sshHost: string, roleId: string, warType: number, battleCode: string) { const battleClass = modStr(battleCode, BATTLE_CLASS_MOD); // 将存档文件按一定规则分批保存 - const rplUrl = `${getPrefixByEnv(env)}/rpls/${md5(env).substring(0, 4)}/${roleId}/${warType}/${battleClass}`; + const rplUrl = `${getPrefixByEnv(env)}/rpls/${md5(sshHost).substring(0, 4)}/${roleId}/${warType}/${battleClass}`; return rplUrl; } @@ -45,7 +48,8 @@ export function getRemoteRplPrefix(env: string) { return rplUrl; } -export function getRemoteRplFilePath(roleId: string, warType: number, battleCode: string) { +export function getRemoteRplFilePath(remoteUrl: string, roleId: string, warType: number, battleCode: string) { + if(remoteUrl) return remoteUrl; const battleClass = modStr(battleCode, BATTLE_CLASS_MOD); // 将存档文件按一定规则分批保存 const rplUrl = `/${roleId}/${warType}/${battleClass}/${battleCode}.bin`; return rplUrl; diff --git a/web-server/app/controller/game.ts b/web-server/app/controller/game.ts index ab0fe4df6..c5e0b0c23 100644 --- a/web-server/app/controller/game.ts +++ b/web-server/app/controller/game.ts @@ -267,18 +267,18 @@ export default class GameController extends Controller { const writeStream = fs.createWriteStream(fullPath); await pump(part, writeStream); + remoteUrl = `${getRemoteRplUrl(ctx.app.config.realEnv, ctx.app.config.sshHost,roleId, warType, battleCode)}/${battleCode}.bin`; let updateDBRes; if (warType === WAR_TYPE.PVP) { - updateDBRes = await PvpRecordModel.updateRplStatus(battleCode, true); + updateDBRes = await PvpRecordModel.updateRplStatus(battleCode, true, remoteUrl); } else if (warType === WAR_TYPE.LADDER) { - updateDBRes = await LadderMatchRecModel.updateRplStatus(battleCode, true); + updateDBRes = await LadderMatchRecModel.updateRplStatus(battleCode, true, remoteUrl); } else if (warType == WAR_TYPE.GVG_VESTIGE) { - updateDBRes = await GVGVestigeRecModel.updateRplStatus(battleCode, true); + updateDBRes = await GVGVestigeRecModel.updateRplStatus(battleCode, true, remoteUrl); } else if (warType == WAR_TYPE.GVG_BATTLE) { - updateDBRes = await GVGBattleRecModel.updateRplStatus(battleCode, true); + updateDBRes = await GVGBattleRecModel.updateRplStatus(battleCode, true, remoteUrl); } if (!updateDBRes) return ctx.body = ctx.service.utils.resResult(STATUS.BATTLE_RPL_UPDATE_ERR); - remoteUrl = `${getRemoteRplUrl(ctx.app.config.realEnv, roleId, warType, battleCode)}/${battleCode}.bin`; } else { await sendToWormhole(part); } diff --git a/web-server/config/config.local.ts b/web-server/config/config.local.ts index 9a543f208..a4fdefd59 100644 --- a/web-server/config/config.local.ts +++ b/web-server/config/config.local.ts @@ -1,5 +1,6 @@ import { EggAppConfig, EggAppInfo, PowerPartial } from 'egg'; import defaultConfig from './config.default'; +import { sshHost } from './sshHost'; export default (appInfo: EggAppInfo) => { const config = {} as PowerPartial; @@ -18,6 +19,7 @@ export default (appInfo: EggAppInfo) => { }; config.decodeParm = true; + config.sshHost = sshHost; // the return config will combines to EggAppConfig return { diff --git a/web-server/config/sshHost.ts b/web-server/config/sshHost.ts new file mode 100644 index 000000000..8a424bba2 --- /dev/null +++ b/web-server/config/sshHost.ts @@ -0,0 +1 @@ +export const sshHost = "local"; \ No newline at end of file