press-plus
Version:
232 lines (207 loc) • 6.75 kB
text/typescript
import { timeStampFormat } from 't-comm/es/time/time';
import { NUMBER_CHI_MAP } from 't-comm/lib/base/number/number';
import {
SCHEDULE_CARD_STATE_MAP,
GAME_RESULT_UI_MAP,
GAME_STATUS_MAP,
BATTLE_STATUS_MAP,
GAME_RESULT_MAP,
} from './config';
function getCardState({
gameStatus,
battleList,
curBattleNo,
gameStateRemain,
}: Record<string, any>) {
if (gameStatus <= GAME_STATUS_MAP.WILL_START) {
return {
cardState: SCHEDULE_CARD_STATE_MAP.GAME_WILL_START,
countdown: gameStateRemain,
};
}
battleList.forEach((battle: Record<string, any>) => {
if (!battle.battle_status) {
battle.battle_status = 0;
}
// battle.can_enter_game = true;
});
const getBattleCountDown = (battleIndex: number) => {
const battle = battleList[battleIndex];
if (battle.battle_start_remain) {
return battle.battle_start_remain;
}
const countdown = (battle.start_time || 0)
- parseInt(`${Date.now() / 1000}`, 10);
return countdown || 0;
};
if (gameStatus <= GAME_STATUS_MAP.PLAYING) {
if (curBattleNo === 1) {
if (battleList[0].battle_status === BATTLE_STATUS_MAP.PLAYING) {
if (battleList[0].can_enter_game) {
return {
cardState: SCHEDULE_CARD_STATE_MAP.BATTLE_STARTED,
roomId: battleList[0].room_id,
roomPwd: battleList[0].room_pwd,
buttonTip: '第一局已开赛',
};
}
return {
cardState: SCHEDULE_CARD_STATE_MAP.BATTLE_PLAYING,
};
}
if (battleList[0].battle_status < BATTLE_STATUS_MAP.PLAYING) {
return {
cardState: SCHEDULE_CARD_STATE_MAP.GAME_WILL_START,
countdown: getBattleCountDown(0) || gameStateRemain,
};
}
if (battleList[0].battle_status > BATTLE_STATUS_MAP.PLAYING) {
if (battleList.length === 1) {
return {
cardState: SCHEDULE_CARD_STATE_MAP.GAME_END,
};
}
return {
cardState: SCHEDULE_CARD_STATE_MAP.BATTLE_PLAYING,
};
}
} else {
const index = curBattleNo - 1;
if (battleList[index].battle_status === BATTLE_STATUS_MAP.PLAYING) {
if (battleList[index].can_enter_game) {
return {
cardState: SCHEDULE_CARD_STATE_MAP.BATTLE_STARTED,
roomId: battleList[index].room_id,
roomPwd: battleList[index].room_pwd,
buttonTip: `第${NUMBER_CHI_MAP[index + 1 as keyof typeof NUMBER_CHI_MAP]}局已开赛`,
};
}
return {
cardState: SCHEDULE_CARD_STATE_MAP.BATTLE_PLAYING,
};
}
if (battleList[index].battle_status < BATTLE_STATUS_MAP.PLAYING) {
return {
cardState: SCHEDULE_CARD_STATE_MAP.BATTLE_NEXT_WILL_START,
buttonCountDown: getBattleCountDown(index),
};
}
if (battleList[index].battle_status > BATTLE_STATUS_MAP.PLAYING) {
return {
cardState: SCHEDULE_CARD_STATE_MAP.GAME_END,
};
}
}
} else if (gameStatus <= GAME_STATUS_MAP.EMD) {
return {
cardState: SCHEDULE_CARD_STATE_MAP.GAME_END,
};
}
return {
cardState: SCHEDULE_CARD_STATE_MAP.GAME_WILL_START,
countdown: gameStateRemain,
};
}
function getGameAutoStartTime(labels: Record<string, any> = {}) {
const str = labels.battle_mode_confs || '';
let autoStartTime;
try {
const config = JSON.parse(str);
autoStartTime = config[0]?.auto_start_time;
} catch (err) {}
return autoStartTime;
}
export function parseScheduleData(data: Record<string, any> = {}, childInfo: Record<string, any> = {}) {
const {
game_status: gameStatus = 0,
cur_battle_no: curBattleNo,
battle_list: battleList = [],
// game_start_time: gameStartTime,
game_start_remain: gameStateRemain,
game_result: gameResult = GAME_RESULT_MAP.PENDING,
game_rank: gameRank = '-',
battle_user_list: battleUserList = [],
} = data;
let newGameStateRemain = gameStateRemain;
const actStartTime = getGameAutoStartTime(childInfo.labels);
if (actStartTime) {
newGameStateRemain = Math.max(actStartTime - parseInt(`${Date.now() / 1000}`, 10), 0);
}
// if (gameStateRemain === undefined
// && gameStartTime === undefined
// && childInfo.act_start_time
// ) {
// newGameStateRemain = childInfo.act_start_time - parseInt(Date.now() / 1000, 10);
// }
const {
cardState,
countdown = 0,
buttonCountDown = 0,
roomId = '',
roomPwd = '',
buttonTip,
} = getCardState({
gameStatus,
battleList,
curBattleNo,
gameStateRemain: newGameStateRemain,
}) || {};
const parsedBattleList = battleList.map((item: Record<string, any>, index: number) => {
const { start_time: startTime } = item;
return {
title: `第${NUMBER_CHI_MAP[index + 1 as keyof typeof NUMBER_CHI_MAP]}局`,
time: timeStampFormat(startTime, 'hh:mm'),
isCurrent: index === curBattleNo - 1,
};
});
const scoreList = battleList.map((item: Record<string, any>, index: number) => {
if (index > curBattleNo) {
return {
title: `第${NUMBER_CHI_MAP[index + 1 as keyof typeof NUMBER_CHI_MAP]}局`,
score: '--',
isWinner: 3, // 1 胜 2 负 3 --
};
}
return {
title: `第${NUMBER_CHI_MAP[index + 1 as keyof typeof NUMBER_CHI_MAP]}局`,
score: item.score || '-',
isWinner: item.isvictor,
};
});
const battleIndexStr = battleList
.map((_: Record<string, any>, index: number) => NUMBER_CHI_MAP[index + 1 as keyof typeof NUMBER_CHI_MAP])
.join('/');
const battleScoreStr = battleList
.map((item: Record<string, any>) => item.score || '-').join('/');
const resultList = [{
name: '总积分排名',
num: gameRank,
}, {
name: `单局积分(${battleIndexStr})`,
num: battleScoreStr,
}];
return {
// 比赛状态 10未开始 100进行中 200已结束
// 300未被签到(人数不够,队员有黑名单) 400被裁判取消
...data,
cardState,
// cardState: SCHEDULE_CARD_STATE_MAP.BATTLE_STARTED,
countdown: countdown * 1000, // to ms
buttonCountDown: buttonCountDown * 1000,
buttonTip: buttonTip || '',
// failResult: gameResult === GAME_RESULT_MAP.FAIL,
resultType: GAME_RESULT_UI_MAP[gameResult],
// pendingResult: gameResult === GAME_RESULT_MAP.PENDING,
parsedBattleList,
curBattleNo,
stepList: parsedBattleList,
scoreList,
resultList,
roomId,
roomPwd,
siteId: data.site_id || childInfo.site_id || '',
childId: data.child_id || data.game_id || childInfo.child_id || childInfo.game_id || '',
teamList: battleUserList,
actStartTime,
};
}