feat(battle): 添加录像上传接口

This commit is contained in:
liangtongchuan
2023-01-02 21:45:10 +08:00
parent 5d87ac9666
commit 4f5d9b77ed
10 changed files with 183 additions and 9 deletions

View File

@@ -62,6 +62,9 @@ export const STATUS = {
BATTLE_END_WRONG_TYPE: { code: 20008, simStr: '此类型无法使用通用结算' },
BATTLE_GOLD_NOT_ENOUGH: { code: 20009, simStr: '元宝不足' },
BATTLE_REGRET_MAX: { code: 20010, simStr: '悔棋步数达上限' },
BATTLE_NOT_FOUND: { code: 20011, simStr: '未找到对应关卡'},
BATTLE_RPL_UPDATE_ERR: { code: 20012, simStr: '录像状态更新失败'},
BATTLE_RPL_NOT_SUPPORT: { code: 20013, simStr: '暂不支持保存此类战斗的录像'},
// 主线 20100 - 20199
BATTLE_INFO_VALIDATE_ERR: { code: 20101, simStr: '关卡信息不同' },

View File

@@ -33,6 +33,9 @@ export default class LadderMatchRec extends BaseModel {
@prop({ required: true, type: () => LadderDefense, default: {}, _id: false })
defense: LadderDefense; // 守方信息
@prop({ required: true, default: false })
hasRpl: boolean; // 是否存在对应录像
public static async findByRoleId(roleId: string, getters = false) {
const result: LadderMatchRecType = await LadderMatchRecModel.findOne({ roleId1: roleId }).lean({ getters});
return result;
@@ -94,7 +97,7 @@ export default class LadderMatchRec extends BaseModel {
let recs: LadderMatchRecType[] = await LadderMatchRecModel.find({
$or: [{roleId1: roleId}, { roleId2: roleId }],
status: LADDER_STATUS.COMPLETE
}).select({ battleCode: 1, roleId1: 1, roleId2: 1, _id: -1, endTime: 1, attackInfo: 1, defenseInfo: 1 }).limit(1000).lean();
}).select({ battleCode: 1, roleId1: 1, roleId2: 1, _id: -1, endTime: 1, attackInfo: 1, defenseInfo: 1, hasRpl: 1 }).limit(1000).lean();
return recs;
}
@@ -120,6 +123,11 @@ export default class LadderMatchRec extends BaseModel {
}, { $set: { status: LADDER_STATUS.COMPLETE, timeout: true, endTime: Date.now() } });
}
public static async updateRplStatus(battleCode: string, hasRpl: boolean) {
let result = await LadderMatchRecModel.findOneAndUpdate({ battleCode }, { hasRpl }, { new: true }).lean();
return result;
}
}
export const LadderMatchRecModel = getModelForClass(LadderMatchRec);

View File

@@ -114,6 +114,7 @@ export class PvpRecordPlayerInfo {
}
@index({ code: 1 })
@index({ battleCode: 1 })
@index({ roleId1: 1, updatedAt: -1 })
@index({ roleId2: 1, updatedAt: -1 })
@@ -123,6 +124,8 @@ export default class PvpRecord extends BaseModel {
@prop({ required: true })
roleId2: string; // 角色 id
@prop({ required: false, default: '' })
battleCode: string;
@prop({ required: true, default: 0 })
code: string; // code
@prop({ required: true, default: 0 })
@@ -132,12 +135,15 @@ export default class PvpRecord extends BaseModel {
@prop({ required: true, type: PvpRecordPlayerInfo, default: {}, _id: false })
defenseInfo: PvpRecordPlayerInfo; // 守方信息
@prop({ required: true, default: false })
hasRpl: boolean; // 是否存在对应录像
@prop({ required: true, default: 0 })
createTime: number;
@prop({ required: true, default: 0 })
timeout: boolean;
public static async createRec(param: { roleId1: string, roleId2: string, warId: number, attackInfo: PvpRecordPlayerInfo, defenseInfo: PvpRecordPlayerInfo, createTime: number, timeout?: boolean }) {
public static async createRec(param: { roleId1: string, roleId2: string, battleCode: string, warId: number, attackInfo: PvpRecordPlayerInfo, defenseInfo: PvpRecordPlayerInfo, createTime: number, timeout?: boolean }) {
await this.delPvpRecords();
let code = genCode(6);
const result = await PvpRecordModel.findOneAndUpdate({ code }, param, { new: true, upsert: true }).lean();
@@ -155,6 +161,11 @@ export default class PvpRecord extends BaseModel {
let result = await PvpRecordModel.deleteMany({ createTime: {$lt: t}});//删除小于三天的战报
return result;
}
public static async updateRplStatus(battleCode: string, hasRpl: boolean) {
let result = await PvpRecordModel.findOneAndUpdate({ battleCode }, { hasRpl }, { new: true }).lean();
return result;
}
}
export const PvpRecordModel = getModelForClass(PvpRecord);

View File

@@ -0,0 +1,49 @@
import * as crc from 'crc';
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'; // 公司下载服务器地址前缀
// 将字符串 crc32 处理后取模,以将随机字符串分组
function modStr(str: string, mod: number) {
if (typeof(str) !== 'string' || typeof(mod) !== 'number') return undefined;
return crc.crc32(str) % mod;
}
function getPrefixByEnv(env: string) {
switch (env) {
case 'dev':
case 'monitor':
case 'alpha':
case 'stable':
return CDN_URL_PREFIX_ZYZ;
case 'sq1':
case 'sq4':
default:
return CDN_URL_PREFIX_SQ;
}
}
export function getLocalRplUrl(roleId: string, warType: number, battleCode: string) {
const battleClass = modStr(battleCode, BATTLE_CLASS_MOD); // 将存档文件按一定规则分批保存
const writePath = `/zyz_logs/rpls/${roleId}/${warType}/${battleClass}`;
return writePath;
}
export function getRemoteRplUrl(env: 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}`;
return rplUrl;
}
export function getRemoteRplPrefix(env: string) {
const rplUrl = `${getPrefixByEnv(env)}/rpls/${md5(env).substring(0, 4)}`;
return rplUrl;
}
export function getRemoteRplFilePath(roleId: string, warType: number, battleCode: string) {
const battleClass = modStr(battleCode, BATTLE_CLASS_MOD); // 将存档文件按一定规则分批保存
const rplUrl = `/${roleId}/${warType}/${battleClass}/${battleCode}.bin`;
return rplUrl;
}