# BoobyLegends Economic Helper This is intended as a helper to find trends in the Booby Legends game. I intend to built a [Discord Bot Interface](DiscordBot.md) to let us share in our guild. ## Running Executables ### Gather Marketing Data This will gather marketing data every 15 minutes, and build an average for each day in UTC timezone. ```bash python3 gatherMarket.py ``` ## Classes There are some main components written as python classes. ### Market Loads the current Market values for cards. You can initialize the Market List like this: ```python from market import Market m=Market() m.fetchData() m.show() ``` Show a filtered Market Page with cards you alreqady have Crystalized removed. ```python from market import Market m=Market() m.fetchData() m.filterMarketCards(False) #After doing stuff... m.closePage() ``` ### Player Loads the current Player values for cards. To get stock values, a "config.json" file must be in the folder with a "cookie" defined to have the player's login. I got my cookie by using the "EditThisCookie" plugin for Chrome. The config file should looks omething like this. ```json { "cookie": { "name":"wordpress_logged_in_f129834928365fbaer348384348y23423uy2323", "value":"keymasterofgozer%8ksojhelFM88efn98709cvaSneOVWEUVn9dvs9eVASEvjSEv8ksojhelFM88efn98709cvaSneOVWEUVn9dvs9eVASEvjSEv8ksojhelFM88efn98709cvaSneOVW" } } ``` You can initialize your Player list like this: ```python from player import Player p=Player() p.fetchData() p.show() ``` Get a List of non-crystal remaining Cards to collect ```python from player import Player p=Player() p.fetchData() p.show(fields=['name','level','stock'],filter='stock != "CRYSTAL"') ``` ### Market Data ```python from db import MarketDB, hist, plot hist(2) plot(2) ``` ### javascript to filter Market for uncrystalized cards ```javascript clist=[]; for (var i = 0; i < 153; i++) {clist.push(0);} let player = document.createElement('div'); player.id = 'player'; player.innerHTML=await (await fetch('https://play.boobylegends.com/player/')).text(); playerCards=player.getElementsByClassName('wrapper-card'); for (var i = 0; i < playerCards.length; i++) { try{ cardNum = parseInt(playerCards.item(i).getElementsByClassName('pornstar-number')[0].innerText); stock = playerCards.item(i).getElementsByClassName('card-nb')[0].innerText.trim(); clist[cardNum]=stock; }catch(err){console.log('hi');} }; cards=document.getElementsByClassName('wrapper-market-card'); for (var i = 0; i < cards.length; i++) { cardNum = cards.item(i).getElementsByClassName('pornstar-number')[0].outerText; innerCard = cards.item(i).getElementsByClassName('inner-market-card')[0]; var stock = innerCard.getElementsByClassName('Stock')[0]; if (stock){stock.innerText = "Stock: " + clist[cardNum]} else { let qty = document.createElement('div'); qty.classList.add('Stock'); qty.innerText = "Stock: " + clist[cardNum]; innerCard.appendChild(qty); } if (clist[cardNum].toString().includes('CRYSTAL')){ cards.item(i).style.setProperty('Display','None'); } } ``` ### javascript to filter Market for good value cards ```javascript cards=document.getElementsByClassName('wrapper-market-card'); for (var i = 0; i < cards.length; i++) { cardNum = cards.item(i).getElementsByClassName('pornstar-number')[0].outerText; cardVal = parseInt(cards.item(i).getElementsByClassName('score-card')[0].outerText); cardCost = parseInt(cards.item(i).getElementsByClassName('cost')[0].outerText); cardPPG = cardVal/cardCost; innerCard = cards.item(i).getElementsByClassName('inner-market-card')[0]; var PPG = innerCard.getElementsByClassName('PPG')[0]; if (PPG){PPG.innerHTML = "Points/:
" + cardPPG.toFixed(2);} else { let qty = document.createElement('div'); qty.classList.add('PPG'); qty.innerHTML = "Points/:
" + cardPPG.toFixed(2); qty.setAttribute("align", "center"); innerCard.appendChild(qty); } if (cardPPG < 2){ cards.item(i).style.setProperty('Display','None'); } } ``` ### javascript to filter Player Page for salable cards ```javascript clist=[]; for (var i = 0; i < 153; i++) {clist.push(0);} let market = document.createElement('div'); market.id = 'market'; market.innerHTML=await (await fetch('https://play.boobylegends.com/market/')).text(); marketCards=market.getElementsByClassName('wrapper-market-card'); for (var i = 0; i < marketCards.length; i++) { try{ cardNum = parseInt(marketCards.item(i).getElementsByClassName('pornstar-number')[0].innerText); price = parseInt(marketCards.item(i).getElementsByClassName('cost')[0].innerText.trim()); clist[cardNum]=price; }catch(err){console.log('error on '+cardNum.toString());} }; cards=document.getElementsByClassName('wrapper-card'); for (var i = 0; i < cards.length; i++) { cardNum = parseInt(cards.item(i).getElementsByClassName('pornstar-number')[0].outerText); var cardNB = cards.item(i).getElementsByClassName('card-nb')[0]; if (cardNB){ stock = parseInt(cards.item(i).getElementsByClassName('nb-label')[0].outerText.trim()); var price = cardNB.getElementsByClassName('Price')[0]; if (price){price.innerText = "Price: " + clist[cardNum]} else{ let qty = document.createElement('div'); qty.classList.add('Price'); qty.innerText = "Price: " + clist[cardNum]; cardNB.appendChild(qty); } }else{ stock=0; } if (stock<2){ cards.item(i).style.setProperty('Display','None'); } } ```