|
|
@@ -0,0 +1,178 @@
|
|
|
+
|
|
|
+const axios = require('axios');
|
|
|
+const Logs = require('../libs/logs');
|
|
|
+
|
|
|
+const GAMES = {
|
|
|
+ Leagues: {},
|
|
|
+ List: {},
|
|
|
+ Baselist: {}
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 精确浮点数字
|
|
|
+ * @param {number} number
|
|
|
+ * @param {number} x
|
|
|
+ * @returns {number}
|
|
|
+ */
|
|
|
+const fixFloat = (number, x=2) => {
|
|
|
+ return parseFloat(number.toFixed(x));
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 获取市场类型
|
|
|
+ */
|
|
|
+const getMarketType = (mk) => {
|
|
|
+ return mk == 0 ? 'early' : 'today';
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 更新联赛列表
|
|
|
+ */
|
|
|
+const syncLeaguesList = ({ mk, leagues }) => {
|
|
|
+ axios.post('https://api.isthe.me/api/p/syncLeague', { mk, leagues })
|
|
|
+ .then(res => {
|
|
|
+ Logs.out('syncLeaguesList', res.data);
|
|
|
+ })
|
|
|
+ .catch(err => {
|
|
|
+ Logs.out('syncLeaguesList', err.message);
|
|
|
+ });
|
|
|
+}
|
|
|
+const updateLeaguesList = ({ mk, leagues }) => {
|
|
|
+ const leaguesList = GAMES.Leagues;
|
|
|
+ if (JSON.stringify(leaguesList[mk]) != JSON.stringify(leagues)) {
|
|
|
+ leaguesList[mk] = leagues;
|
|
|
+ syncLeaguesList({ mk, leagues });
|
|
|
+ return leagues.length;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 获取筛选过的联赛
|
|
|
+ */
|
|
|
+const getFilteredLeagues = async (mk) => {
|
|
|
+ return axios.get(`https://api.isthe.me/api/p/getLeagueTast?mk=${mk}`)
|
|
|
+ .then(res => {
|
|
|
+ if (res.data.code == 0) {
|
|
|
+ return res.data.data;
|
|
|
+ }
|
|
|
+ return Promise.reject(new Error(res.data.message));
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 同步比赛列表到服务器
|
|
|
+ */
|
|
|
+const syncGamesList = ({ platform, mk, games }) => {
|
|
|
+ axios.post('https://api.isthe.me/api/p/syncGames', { platform, mk, games })
|
|
|
+ .then(res => {
|
|
|
+ Logs.out('syncGamesList', res.data);
|
|
|
+ })
|
|
|
+ .catch(err => {
|
|
|
+ Logs.out('syncGamesList', err.message);
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 同步基准比赛列表
|
|
|
+ */
|
|
|
+const syncBaseList = ({ marketType, games }) => {
|
|
|
+ const baseList = GAMES.Baselist;
|
|
|
+ if (!baseList[marketType]) {
|
|
|
+ baseList[marketType] = games;
|
|
|
+ }
|
|
|
+
|
|
|
+ const newMap = new Map(games.map(item => [item.eventId, item]));
|
|
|
+
|
|
|
+ // 删除不存在的项
|
|
|
+ for (let i = baseList[marketType].length - 1; i >= 0; i--) {
|
|
|
+ if (!newMap.has(baseList[marketType][i].eventId)) {
|
|
|
+ baseList[marketType].splice(i, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加或更新
|
|
|
+ const oldIds = new Set(baseList[marketType].map(item => item.eventId));
|
|
|
+ games.forEach(game => {
|
|
|
+ if (!oldIds.has(game.eventId)) {
|
|
|
+ // 添加新项
|
|
|
+ baseList[marketType].push(game);
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 更新比赛列表
|
|
|
+ */
|
|
|
+const updateGamesList = (({ platform, mk, games } = {}) => {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ if (!platform || !games) {
|
|
|
+ return reject(new Error('PLATFORM_GAMES_INVALID'));
|
|
|
+ }
|
|
|
+
|
|
|
+ const marketType = getMarketType(mk);
|
|
|
+
|
|
|
+ syncGamesList({ platform, mk, games });
|
|
|
+
|
|
|
+ if (platform == 'ps') {
|
|
|
+ syncBaseList({ marketType, games });
|
|
|
+ }
|
|
|
+
|
|
|
+ resolve();
|
|
|
+ });
|
|
|
+});
|
|
|
+
|
|
|
+/**
|
|
|
+ * 同步基准盘口
|
|
|
+ */
|
|
|
+const syncBaseEvents = ({ marketType, games, outrights }) => {
|
|
|
+ const baseList = GAMES.Baselist;
|
|
|
+ if (!baseList[marketType]) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const baseMap = new Map(baseList[marketType].map(item => [item.eventId, item]));
|
|
|
+
|
|
|
+ games?.forEach(game => {
|
|
|
+ const { eventId, evtime, events } = game;
|
|
|
+ const baseGame = baseMap.get(eventId);
|
|
|
+ if (baseGame) {
|
|
|
+ baseGame.evtime = evtime;
|
|
|
+ baseGame.events = events;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ outrights?.forEach(outright => {
|
|
|
+ const { parentId, sptime, special } = outright;
|
|
|
+ const baseGame = baseMap.get(parentId);
|
|
|
+ if (baseGame) {
|
|
|
+ baseGame.sptime = sptime;
|
|
|
+ baseGame.special = special;
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 更新比赛盘口
|
|
|
+ */
|
|
|
+const updateGamesEvents = ({ platform, mk, games, outrights }) => {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ if (!platform || (!games && !outrights)) {
|
|
|
+ return reject(new Error('PLATFORM_GAMES_INVALID'));
|
|
|
+ }
|
|
|
+
|
|
|
+ const marketType = getMarketType(mk);
|
|
|
+
|
|
|
+ if (platform == 'ps') {
|
|
|
+ syncBaseEvents({ marketType, games, outrights });
|
|
|
+ }
|
|
|
+
|
|
|
+ resolve();
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+module.exports = {
|
|
|
+ updateLeaguesList, getFilteredLeagues,
|
|
|
+ updateGamesList, updateGamesEvents,
|
|
|
+}
|