GamesPs.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. const axios = require('axios');
  2. const Logs = require('../libs/logs');
  3. const GAMES = {
  4. Leagues: {},
  5. List: {},
  6. Baselist: {}
  7. };
  8. /**
  9. * 精确浮点数字
  10. * @param {number} number
  11. * @param {number} x
  12. * @returns {number}
  13. */
  14. const fixFloat = (number, x=2) => {
  15. return parseFloat(number.toFixed(x));
  16. }
  17. /**
  18. * 获取市场类型
  19. */
  20. const getMarketType = (mk) => {
  21. return mk == 0 ? 'early' : 'today';
  22. }
  23. /**
  24. * 更新联赛列表
  25. */
  26. const syncLeaguesList = ({ mk, leagues }) => {
  27. axios.post('https://api.isthe.me/api/p/syncLeague', { mk, leagues })
  28. .then(res => {
  29. Logs.out('syncLeaguesList', res.data);
  30. })
  31. .catch(err => {
  32. Logs.out('syncLeaguesList', err.message);
  33. });
  34. }
  35. const updateLeaguesList = ({ mk, leagues }) => {
  36. const leaguesList = GAMES.Leagues;
  37. if (JSON.stringify(leaguesList[mk]) != JSON.stringify(leagues)) {
  38. leaguesList[mk] = leagues;
  39. syncLeaguesList({ mk, leagues });
  40. return leagues.length;
  41. }
  42. return 0;
  43. }
  44. /**
  45. * 获取筛选过的联赛
  46. */
  47. const getFilteredLeagues = async (mk) => {
  48. return axios.get(`https://api.isthe.me/api/p/getLeagueTast?mk=${mk}`)
  49. .then(res => {
  50. if (res.data.code == 0) {
  51. return res.data.data;
  52. }
  53. return Promise.reject(new Error(res.data.message));
  54. });
  55. }
  56. /**
  57. * 同步比赛列表到服务器
  58. */
  59. const syncGamesList = ({ platform, mk, games }) => {
  60. axios.post('https://api.isthe.me/api/p/syncGames', { platform, mk, games })
  61. .then(res => {
  62. Logs.out('syncGamesList', res.data);
  63. })
  64. .catch(err => {
  65. Logs.out('syncGamesList', err.message);
  66. });
  67. }
  68. /**
  69. * 同步基准比赛列表
  70. */
  71. const syncBaseList = ({ marketType, games }) => {
  72. const baseList = GAMES.Baselist;
  73. if (!baseList[marketType]) {
  74. baseList[marketType] = games;
  75. }
  76. const newMap = new Map(games.map(item => [item.eventId, item]));
  77. // 删除不存在的项
  78. for (let i = baseList[marketType].length - 1; i >= 0; i--) {
  79. if (!newMap.has(baseList[marketType][i].eventId)) {
  80. baseList[marketType].splice(i, 1);
  81. }
  82. }
  83. // 添加或更新
  84. const oldIds = new Set(baseList[marketType].map(item => item.eventId));
  85. games.forEach(game => {
  86. if (!oldIds.has(game.eventId)) {
  87. // 添加新项
  88. baseList[marketType].push(game);
  89. }
  90. });
  91. }
  92. /**
  93. * 更新比赛列表
  94. */
  95. const updateGamesList = (({ platform, mk, games } = {}) => {
  96. return new Promise((resolve, reject) => {
  97. if (!platform || !games) {
  98. return reject(new Error('PLATFORM_GAMES_INVALID'));
  99. }
  100. const marketType = getMarketType(mk);
  101. syncGamesList({ platform, mk, games });
  102. if (platform == 'ps') {
  103. syncBaseList({ marketType, games });
  104. }
  105. resolve();
  106. });
  107. });
  108. /**
  109. * 同步基准盘口
  110. */
  111. const syncBaseEvents = ({ marketType, games, outrights }) => {
  112. const baseList = GAMES.Baselist;
  113. if (!baseList[marketType]) {
  114. return;
  115. }
  116. const baseMap = new Map(baseList[marketType].map(item => [item.eventId, item]));
  117. games?.forEach(game => {
  118. const { eventId, evtime, events } = game;
  119. const baseGame = baseMap.get(eventId);
  120. if (baseGame) {
  121. baseGame.evtime = evtime;
  122. baseGame.events = events;
  123. }
  124. });
  125. outrights?.forEach(outright => {
  126. const { parentId, sptime, special } = outright;
  127. const baseGame = baseMap.get(parentId);
  128. if (baseGame) {
  129. baseGame.sptime = sptime;
  130. baseGame.special = special;
  131. }
  132. });
  133. }
  134. /**
  135. * 更新比赛盘口
  136. */
  137. const updateGamesEvents = ({ platform, mk, games, outrights }) => {
  138. return new Promise((resolve, reject) => {
  139. if (!platform || (!games && !outrights)) {
  140. return reject(new Error('PLATFORM_GAMES_INVALID'));
  141. }
  142. const marketType = getMarketType(mk);
  143. if (platform == 'ps') {
  144. syncBaseEvents({ marketType, games, outrights });
  145. }
  146. resolve();
  147. });
  148. }
  149. module.exports = {
  150. updateLeaguesList, getFilteredLeagues,
  151. updateGamesList, updateGamesEvents,
  152. }