Advertisement
xxeell

Check dungeon posts sales

Jun 3rd, 2023 (edited)
698
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function writeJsonConsole(text) {
  2.     console.log(JSON.stringify({
  3.         data: text
  4.     }));
  5. }
  6.  
  7. function readPostsText() {
  8.     return [...document.getElementsByClassName(['wall_post_text'])]
  9.         .map(v => v.innerHTML)
  10.         .filter(v => {
  11.             const openGameIndex = v.indexOf('Открытая игра');
  12.             const companyIndex = v.indexOf('Набор кампании');
  13.             return (openGameIndex >= 0 && openGameIndex < 100)
  14.                 || (companyIndex >= 0 && companyIndex < 100);
  15.         })
  16.         .map(text => text.replaceAll('<br>', '|NEW_LINE|')
  17.             .replaceAll(/<img[^>]*>/g, '|IMG|')
  18.             .replaceAll(/<a[^>]*>/g, '|START_LINK|')
  19.             .replaceAll(/<\/a[^>]*>/g, '|END_LINK|')
  20.             .replaceAll(/<button[^а-яА-я]*>Показать ещё[^а-яА-я]*">/g, '')
  21.             .replaceAll('</span>', ''))
  22. }
  23.  
  24. function parsePostsParts(postsText) {
  25.     return postsText
  26.         .map(value => {
  27.             const dates = value.match(/[А-ЯA-Z]{2} \d+(\/|\.)\d+ \d+:\d+/) ?? [];
  28.             const masters = (value.match(/Мастер игры: \|START_LINK\|[^|]+/) ?? [])
  29.                 .map(v => v.replace(/[^|]+\|START_LINK\|/, '')) ?? [];
  30.             const prices = (value.match(/стоимость участия - \d+/) ?? [])
  31.                 .flatMap(v => v.match(/\d+/) ?? []);
  32.             const gamers = (value.match(/участников - \d+ человек/) ?? [])
  33.                 .flatMap(v => v.match(/\d+/) ?? []);
  34.             const duration = (value.match(/Длительность [^-]+- \d+/) ?? [])
  35.                 .flatMap(v => v.match(/\d+/) ?? []);
  36.             return {
  37.                 date: dates[0],
  38.                 master: masters[0],
  39.                 price: +prices[0],
  40.                 gamers: +gamers[0],
  41.                 duration: +duration[0]
  42.             }
  43.         });
  44. }
  45.  
  46. function parsePostDates(posts) {
  47.     return posts.map(post => {
  48.         const dateValues = post.date.split(' ');
  49.         const timeValues = dateValues[2]?.split(':')
  50.         return {
  51.             day: dateValues[0],
  52.             time: {
  53.                 hour: +timeValues[0],
  54.                 minute: +timeValues[1],
  55.             }
  56.         };
  57.     });
  58. }
  59.  
  60. function calculateDates(dates) {
  61.     const notSalesDays = ['ПТ', 'СБ', 'ВС',]
  62.     const notSalesTime = 18;
  63.     return dates.reduce((acc, cur) => {
  64.         if (notSalesDays.includes(cur.day) || cur.time.hour >= notSalesTime) {
  65.             acc.full++;
  66.         } else {
  67.             acc.sales++;
  68.         }
  69.         return acc;
  70.     }, { sales: 0, full: 0 });
  71. }
  72.  
  73. const input = readPostsText()
  74. const partsOfPosts = parsePostsParts(input);
  75. const gameTimes = parsePostDates(partsOfPosts);
  76. const result = calculateDates(gameTimes);
  77. console.log(result);
  78.  
  79.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement