market.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. from dataclasses import dataclass, field
  2. from typing import List, Dict
  3. from selenium import webdriver
  4. from selenium.webdriver.common.keys import Keys
  5. from selenium.webdriver.common.by import By
  6. from datetime import datetime
  7. import pandas as pd
  8. from tinydb import Query
  9. import json
  10. import sys
  11. from player import Player
  12. from config import Config
  13. from db import MarketDB
  14. import logging
  15. logger = logging.getLogger(__name__)
  16. stdout = logging.StreamHandler(stream=sys.stdout)
  17. fmt = logging.Formatter(
  18. "%(asctime)s | %(levelname)s | %(message)s"
  19. )
  20. stdout.setFormatter(fmt)
  21. logger.addHandler(stdout)
  22. logger.setLevel(logging.INFO)
  23. @dataclass
  24. class Market():
  25. url:str = 'https://play.boobylegends.com/market/'
  26. driver:webdriver = None
  27. Cards:List[dict] = field(default_factory=list)
  28. asOf:datetime = datetime.utcnow()
  29. df:pd.DataFrame = field(default_factory=pd.DataFrame)
  30. player:Player = None
  31. def fetchData(self):
  32. logger.debug("Market Fetching Data.")
  33. self.loadPage()
  34. self.Cards=[]
  35. cards=self.driver.find_elements(By.CLASS_NAME, 'wrapper-market-card')
  36. for card in cards:
  37. Card={}
  38. IDs=card.find_element(By.CLASS_NAME,'titre-card').text.split('\n')
  39. Card['card-num']=int(IDs[1])
  40. Card['name']=IDs[0]
  41. link=card.find_element(By.TAG_NAME,'a')
  42. Card['card-id'] = int(link.get_attribute('card-id'))
  43. Card['phid'] = link.get_attribute('phid')
  44. Card['level'] = link.get_attribute('level')
  45. Card['link'] = link.get_attribute('href')
  46. Card['val']= int(card.find_element(By.CLASS_NAME,'score-card').text)
  47. Card['qty']= int(card.find_element(By.CLASS_NAME,'qty').text)
  48. Card['cost']= int(card.find_element(By.CLASS_NAME,'cost').text)
  49. self.Cards.append(Card)
  50. self.loadDF()
  51. def initPage(self):
  52. logger.debug("Market Init Page.")
  53. self.driver = webdriver.Chrome()
  54. self.driver.get(self.url)
  55. self.driver.add_cookie(Config["cookie"])
  56. def loadPage(self):
  57. logger.debug("Market Load Page.")
  58. if self.driver is None: self.initPage()
  59. self.driver.get(self.url)
  60. self.asOf=datetime.utcnow()
  61. def closePage(self):
  62. logger.debug("Market Close Page.")
  63. self.driver.close()
  64. def getPlayerInfo(self):
  65. logger.debug("Market Get Player Info")
  66. if self.player is None: self.player = Player()
  67. self.player.fetchData()
  68. self.player.closePage()
  69. def filterMarketCards(self):
  70. logger.debug("Market Filter Cards.")
  71. self.getPlayerInfo()
  72. clist=[None]*152
  73. for card in self.player.Cards: clist[card['card-num']]=card['stock']
  74. js="clist={clist}\n".format(clist=json.dumps(clist))
  75. js+="""
  76. cards=document.getElementsByClassName('wrapper-market-card')
  77. for (var i = 0; i < cards.length; i++) {
  78. cardNum = cards.item(i).getElementsByClassName('pornstar-number')[0].outerText;
  79. innerCard = cards.item(i).getElementsByClassName('inner-market-card')[0]
  80. let qty = document.createElement('div');
  81. qty.innerText = "Stock: " + clist[cardNum]
  82. innerCard.appendChild(qty)
  83. if (clist[cardNum] == 'CRYSTAL'){
  84. cards.item(i).style.setProperty('Display','None');
  85. }
  86. }
  87. """
  88. print(js)
  89. self.driver.execute_script(js)
  90. def loadDF(self):
  91. logger.debug("Market Load DF.")
  92. self.df=pd.DataFrame(self.Cards)
  93. self.df.sort_values(by='card-num', ascending=True, inplace=True)
  94. def show(self,fields=['card-num','name','level','qty','cost'],filter=''):
  95. logger.debug("Market Show Data.")
  96. if filter != '':
  97. pdf=self.df.query(filter)
  98. else:
  99. pdf=self.df
  100. print(pdf[fields].to_string(index=False))
  101. def commit(self):
  102. logger.debug("Market Commit.")
  103. today=self.asOf.strftime('%Y-%m-%d')
  104. current=MarketDB.search(Query()['date']==today)
  105. if len(current)==0:
  106. for Card in self.Cards:
  107. thisCard={}
  108. thisCard['date'] = today
  109. thisCard['count'] = 1
  110. thisCard['card-num'] = Card['card-num']
  111. thisCard['name'] = Card['name']
  112. thisCard['qty'] = Card['qty']
  113. thisCard['cost'] = Card['cost']
  114. MarketDB.insert(thisCard)
  115. else:
  116. for Card in self.Cards:
  117. thisCard=MarketDB.search(Query().fragment({'date':today,'card-num':Card['card-num']}))[0]
  118. newData={}
  119. newData['count']=thisCard['count']+1
  120. newData['cost']=(thisCard['count']*thisCard['cost']+Card['cost'])/(thisCard['count']+1)
  121. newData['qty']=(thisCard['count']*thisCard['qty']+Card['qty'])/(thisCard['count']+1)
  122. MarketDB.update(newData,Query().fragment({'date':today,'card-num':Card['card-num']}))