import datetime,os,re,requests from bs4 import BeautifulSoup from collections import Counter import log,variables values = ["red","orange","yellow","green","blue","purple","brown","gray","special"] numbers = ["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20"] print("Getting list of deck colours") deckkey = {} request = requests.get("https://colors-tcg.eu/cards.php?view=alpha") alldecks = open("key.html","w") alldecks.write(request.text) alldecks.close() # need to correct some html issues with open("key.html","r") as file: filedata = file.read() filedata = filedata.replace("","") with open("key.html","w") as file: file.write(filedata) with open("key.html") as decks: decksoup = BeautifulSoup(decks, "html.parser") soupdecks = decksoup.find("table",{"id":"colors"}) souprows = soupdecks.find_all("tr") for row in souprows: soupcells = row.find_all("td") deckname = soupcells[2].text.lower().replace(" ","").replace("'","").replace("ç","c").replace(".","").replace("politetness","politeness") decktype = soupcells[3].text.lower() if decktype in values: deckkey[deckname] = decktype print("Parsing log") cardlist = [] portfolios = [] crayred = 0 crayorange = 0 crayyellow = 0 craygreen = 0 crayblue = 0 craypurple = 0 craybrown = 0 craygrey = 0 tradeout = [] tradein = [] redeemedsketch = 0 coupons = [] datelist = [] logitems = [] pends = [] for event in log.log: logentry = {} logentry["date"] = event["date"] logentry["name"] = event["event"] logentry["url"] = event["url"] logit = False if event["event"] == "portfolio": portfolio = {} thedecks = {} for spacedeck in event["decks"]: deck = spacedeck.replace(" ","") thedecks[spacedeck] = deckkey[deck] portcolours = list(thedecks.values()) portcolours = sorted(list(dict.fromkeys(portcolours))) if len(portcolours) < 3: portfolio["type"] = "monochrome" else: portfolio["type"] = "palette" portfolio["decks"] = thedecks portfolio["url"] = event["url"] portfolios.append(portfolio) else: try: if event["received"]: logit = True receivedcards = [] for card in event["received"]: thecard = {} if card[0:4] != "sig_": thedeck = card[:-2] thecard["name"] = card thecard["received"] = event["date"] thecard["mass"] = [] if card[0:4] != "sig_": for theme in variables.masscollect: try: if thedeck in variables.masscollect[theme]["decks"]: thecard["mass"].append(theme) except KeyError: pass try: if card in variables.masscollect[theme]["singles"]: thecard["mass"].append(theme) except KeyError: pass if card[0:4] == "sig_": thecard["colour"] = "sig" else: try: thecard["colour"] = deckkey[thedeck] except: pass try: if thecard["colour"]: pass except: print("Warning: no colour found for " + thedeck) if thecard["colour"] == "sig": if card[4:] == variables.name.lower(): thecard["priority"] = 5 else: thecard["priority"] = 1 else: if thedeck in variables.highpriority: thecard["priority"] = 1 elif len(thecard["mass"]) > 0: thecard["priority"] = 2 else: thecard["priority"] = 4 cardlist.append(thecard) datelist.append(event["date"]) receivedcards.append(thecard) logentry["received"] = receivedcards except KeyError: pass try: if event["lost"]: logit = True lostcards = [] for card in event["lost"]: checkno = len(cardlist) - 1 deleted = False while checkno >= 0: if cardlist[checkno]["name"] == card: if deleted == False: colour = cardlist[checkno]["colour"] cardlist.remove(cardlist[checkno]) deleted = True checkno -= 1 if deleted == False: print("Warning: trying to remove " + card + " but none found") lostcard = {} lostcard["name"] = card lostcard["colour"] = colour lostcards.append(lostcard) datelist.remove(datelist[-1]) logentry["lost"] = lostcards except KeyError: pass crayons = {} try: crayred += event["crayons"]["red"] logit = True crayons["red"] = event["crayons"]["red"] except: pass try: crayorange += event["crayons"]["orange"] logit = True crayons["orange"] = event["crayons"]["orange"] except: pass try: crayyellow += event["crayons"]["yellow"] logit = True crayons["yellow"] = event["crayons"]["yellow"] except: pass try: craygreen += event["crayons"]["green"] logit = True crayons["green"] = event["crayons"]["green"] except: pass try: crayblue += event["crayons"]["blue"] logit = True crayons["blue"] = event["crayons"]["blue"] except: pass try: craypurple += event["crayons"]["purple"] logit = True crayons["purple"] = event["crayons"]["purple"] except: pass try: craybrown += event["crayons"]["brown"] logit = True crayons["brown"] = event["crayons"]["brown"] except: pass try: craygrey += event["crayons"]["gray"] logit = True crayons["grey"] = event["crayons"]["gray"] except: pass if len(crayons) > 0: logentry["crayons"] = crayons if event["event"][0:11] == "trade with ": try: for card in event["lost"]: tradeout.append(event["event"]) except: pass try: for card in event["received"]: tradein.append(event["event"]) except: pass if len(crayons) > 0: logentry["crayons"] = crayons try: redeemedsketch -= event["sketch"] except: pass try: for newcoupon in event["coupons"]: found = False for oldcoupon in coupons: if found == False: if newcoupon == list(oldcoupon.keys())[0]: found = True oldcoupon[newcoupon] += event["coupons"][newcoupon] if found == False: coupons.append({newcoupon:event["coupons"][newcoupon]}) except: pass try: for card in event["pend"]: pends.append(card) except: pass try: for card in event["unpend"]: pends.remove(card) except: pass if logit == True: logitems.append(logentry) logitems = logitems[::-1] coupons = coupons[::-1] print("Getting list of owned decks") portdecks = [] for portfolio in portfolios: oneportdecks = list(portfolio["decks"].keys()) for deck in oneportdecks: portdecks.append(deck.replace(" ","")) portdecks = sorted(list(dict.fromkeys(portdecks))) decks = [] for card in cardlist: if card["colour"] != "sig": deck = card["name"][:-2] decks.append(deck) decks = sorted(list(dict.fromkeys(decks))) decklist = [] for deck in decks: thedeck = {} thedeck["name"] = deck thedeck["colour"] = deckkey[deck] thedeck["mass"] = [] thedeck["massmaster"] = [] for theme in variables.masscollect: try: if deck in variables.masscollect[theme]["decks"]: thedeck["mass"].append(theme) except KeyError: pass try: if deck in variables.masscollect[theme]["masters"]: thedeck["massmaster"].append(theme) except KeyError: pass count = 0 for number in numbers: thedeck[number] = None for card in cardlist: if card["name"] == deck + number: if thedeck[number] == None: thedeck[number] = card["received"] count += 1 thedeck["count"] = count if count == 20: dates = [] for number in numbers: dates.append(thedeck[number]) dates = sorted(dates) thedeck["mastered"] = dates[-1] else: thedeck["mastered"] = False if deck in variables.highpriority or count >= variables.highthreshold or deck in portdecks: thedeck["priority"] = 1 elif len(thedeck["mass"]) > 0 or count >= variables.mediumthreshold: thedeck["priority"] = 2 elif count >= variables.collectthreshold: thedeck["priority"] = 3 else: thedeck["priority"] = 4 decklist.append(thedeck) print("Checking for new card images") for card in cardlist: if card["colour"] == "sig": if not os.path.exists("build/decks/sigs/" + card["name"][4:] + ".gif"): print("Downloading " + card["name"]) r = requests.get("https://colors-tcg.eu/cards/" + card["name"] + ".gif") open("build/decks/sigs/" + card["name"][4:] + ".gif","wb").write(r.content) for deck in decklist: if not os.path.isdir("build/decks/" + deck["name"]): os.mkdir("build/decks/" + deck["name"]) print("Downloading " + deck["name"]) number = 0 while number < 21: if number < 10: r = requests.get("https://colors-tcg.eu/cards/" + deck["name"] + "0" + str(number) + ".gif") open("build/decks/" + deck["name"] + "/0" + str(number) + ".gif","wb").write(r.content) else: r = requests.get("https://colors-tcg.eu/cards/" + deck["name"] + str(number) + ".gif") open("build/decks/" + deck["name"] + "/" + str(number) + ".gif","wb").write(r.content) number += 1 master = requests.get("https://colors-tcg.eu/cards/" + deck["name"] + "master.gif") open("build/decks/" + deck["name"] + "/master.gif","wb").write(master.content) print("Getting list of wanted cards") wantedlist = [] for deck in decklist: if deck["priority"] < 4: for number in numbers: if deck[number] == None: wantedcard = {} wantedcard["name"] = deck["name"] + number wantedcard["colour"] = deck["colour"] wantedcard["priority"] = deck["priority"] wantedlist.append(wantedcard) decknames = [] for deck in decklist: decknames.append(deck["name"]) for theme in variables.masscollect: if variables.masscollect[theme]["full"] == True: try: for deck in variables.masscollect[theme]["decks"]: if deck not in decknames: for number in numbers: wantedcard = {} wantedcard["name"] = deck + number wantedcard["colour"] = deckkey[deck] wantedcard["priority"] = 3 wantedlist.append(wantedcard) except KeyError: pass try: for card in variables.masscollect[theme]["singles"]: if card[:-2] not in decknames: wantedcard = {} wantedcard["name"] = card wantedcard["colour"] = deckkey[card[:-2]] wantedcard["priority"] = 3 wantedlist.append(wantedcard) except KeyError: pass wantedlist = sorted(wantedlist, key=lambda d: d["name"]) removelist = [] for card in wantedlist: if card["name"] in pends: removelist.append(card) for card in removelist: wantedlist.remove(card) print("Adjusting card priorities") for card in cardlist: for deck in decklist: if card["name"][:-2] == deck["name"]: if card["priority"] > deck["priority"]: card["priority"] = deck["priority"] cardlist = sorted(cardlist, key=lambda d: d["name"]) theindex = 0 for card in cardlist: card["dupe"] = False if card["name"][0:4] != "sig_": if theindex > 0: if card["name"] == cardlist[theindex-1]["name"]: card["priority"] = 4 card["dupe"] = True theindex += 1 theindex = 0 if variables.keepsig == True: for card in cardlist: if card["name"] == "sig_" + variables.name.lower(): card["priority"] = 1 if theindex > 0: if cardlist[theindex-1]["name"] == "sig_" + variables.name.lower(): card["priority"] = 5 theindex += 1 # core functions def headerwrite(thefile,pagename): header = open(thefile,"a") header.write("\n\n \n \n \n \n \n \n " + variables.name + "’s card collection :: " + pagename + "\n \n \n \n \n
\n") header.close() def footerwrite(thefile): footer = open(thefile,"a") footer.write("
\n \n") footer.close() def printcard(card): if type(card) == dict: if card["colour"] == "sig": return "" else: deck = card["name"][:-2] cardid = card["name"][-2:] return "" elif type(card) == str: if card[0:4] == "sig_": return "" else: deck = card[:-2] cardid = card[-2:] return "" def cardtext(card): cardtext = "" if card["colour"] == "sig": cardtext += "" + card["name"] + "" else: if card["colour"] == "red": cardtext += "🔴" elif card["colour"] == "orange": cardtext += "🟠" elif card["colour"] == "yellow": cardtext += "🟡" elif card["colour"] == "green": cardtext += "🟢" elif card["colour"] == "blue": cardtext += "🔵" elif card["colour"] == "purple": cardtext += "🟣" elif card["colour"] == "brown": cardtext += "🟤" elif card["colour"] == "gray": cardtext += "" elif card["colour"] == "special": cardtext += "" cardtext += card["name"] + "" return cardtext def portfoliogen(theportfolio,thetype,portnumber): if thetype == "palette": portstring = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
" + variables.name.lower() + "
" try: reddeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("red")] for deck in decklist: if deck["name"] == reddeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + reddeck except: specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")] for deck in decklist: if deck["name"] == specialdeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + specialdeck portstring += "" try: bluedeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("blue")] for deck in decklist: if deck["name"] == bluedeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + bluedeck except: specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")] for deck in decklist: if deck["name"] == specialdeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + specialdeck portstring += "
" try: orangedeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("orange")] for deck in decklist: if deck["name"] == orangedeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + orangedeck except: specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")] for deck in decklist: if deck["name"] == specialdeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + specialdeck portstring += "" try: purpledeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("purple")] for deck in decklist: if deck["name"] == purpledeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + purpledeck except: specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")] for deck in decklist: if deck["name"] == specialdeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + specialdeck portstring += "
" try: yellowdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("yellow")] for deck in decklist: if deck["name"] == yellowdeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + yellowdeck except: specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")] for deck in decklist: if deck["name"] == specialdeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + specialdeck portstring += "" try: browndeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("brown")] for deck in decklist: if deck["name"] == browndeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + browndeck except: specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")] for deck in decklist: if deck["name"] == specialdeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + specialdeck portstring += "
" try: greendeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("green")] for deck in decklist: if deck["name"] == greendeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + greendeck except: specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")] for deck in decklist: if deck["name"] == specialdeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + specialdeck portstring += "" try: greydeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("gray")] for deck in decklist: if deck["name"] == greydeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + greydeck except: specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")] for deck in decklist: if deck["name"] == specialdeck.replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + specialdeck portstring += "
palette portfolio " if portnumber < 10: portstring += "0" + str(portnumber) else: portstring += str(portnumber) portstring += "
\n" elif thetype == "monochrome": thecolour = list(theportfolio["decks"].values())[0] portstring = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
" + variables.name.lower() + "
" thedecks = sorted(list(theportfolio["decks"].keys())) for deck in decklist: if deck["name"] == thedecks[0].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[0] + "" for deck in decklist: if deck["name"] == thedecks[4].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[4] + "
" for deck in decklist: if deck["name"] == thedecks[1].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[1] + "" for deck in decklist: if deck["name"] == thedecks[5].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[5] + "
" for deck in decklist: if deck["name"] == thedecks[2].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[2] + "" for deck in decklist: if deck["name"] == thedecks[6].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[6] + "
" for deck in decklist: if deck["name"] == thedecks[3].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[3] + "" for deck in decklist: if deck["name"] == thedecks[7].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[7] + "
monochrome portfolio " if portnumber < 10: portstring += "0" + str(portnumber) else: portstring += str(portnumber) portstring += "
\n" return portstring portfoliosearch = len(portfolios) latestpalette = 0 latestmonochrome = 0 palettes = 0 monochromes = 0 while portfoliosearch > 0: if portfolios[portfoliosearch-1]["type"] == "palette": palettes += 1 if latestpalette == 0: latestpalette = portfoliosearch if portfolios[portfoliosearch-1]["type"] == "monochrome": monochromes += 1 if latestmonochrome == 0: latestmonochrome = portfoliosearch portfoliosearch -= 1 def filterwrite(page,colour=False,sigs=False): filterstring = "

" if colour: filterstring += "Filtered to " if colour == "gray": if variables.british: filterstring += "grey" else: filterstring += "gray" else: filterstring += colour filterstring += ". Show all" else: filterstring += "Filter: 🔴 🟠 🟡 🟢 🔵 🟣 🟤 " if sigs: filterstring += " " filterstring += "

\n" return filterstring def printdeck(deck,fold=True): if fold: deckstring = "
\n" + deck["name"] + " [" if deck["mastered"]: deckstring += deck["mastered"].strftime("%Y-%m-%d") else: deckstring += str(deck["count"]) + "/20" deckstring += "]\n" else: deckstring = "" deckstring += "\n" if not fold: deckstring += "\n \n \n \n\n" deckstring += "\n" test = 1 while test < 21: if test % 5 == 1: deckstring += " \n" deckstring += " \n" if test % 5 == 0: deckstring += " \n" test += 1 if deck["mastered"]: deckstring += " \n \n" deckstring += "\n
" + deck["name"] + " [" if deck["mastered"]: deckstring += deck["mastered"].strftime("%Y-%m-%d") else: deckstring += str(deck["count"]) + "/20" deckstring += "]
" if test < 10: teststring = "0" + str(test) else: teststring = str(test) found = False for card in cardlist: if card["name"] == deck["name"] + teststring: deckstring += printcard(card) found = True break if found == False: deckstring += "" if deck["name"] + teststring in pends: deckstring += "

pending

" deckstring += "
\n
\n" if fold: deckstring += "
\n" return deckstring def crayonlog(colour,event): crayonno = event["crayons"][colour] if variables.british: if colour == "grey": crayonrend = "grey" else: crayonrend = colour else: crayonrend = colour if crayonno > 0: crayonstring = "+" + str(crayonno) + " " + crayonrend else: crayonstring = str(crayonno) + " " + crayonrend return crayonstring def showdupes(): dupeslist = [] previouscard = "" for card in cardlist: try: if card["name"] == previouscard["name"]: dupeslist.append(card["name"]) except: pass previouscard = card return dupeslist if __name__ == "__main__": print("Building index page") def indexgen(): if os.path.exists("build/index.html"): os.remove("build/index.html") thefile = "build/index.html" headerwrite(thefile,"index") content = open(thefile,"a") firstdate = log.log[0]["date"] if len(cardlist) > 14400: rankcode = "rainbow" extra = len(cardlist) - 14400 plusranks = int(extra / 300) if plusranks > 0: rank = "rainbow + " + str(plusranks) else: rank = "rainbow" else: if len(cardlist) > 14100: rank = "himalayan" elif len(cardlist) > 13800: rank = "puma" elif len(cardlist) > 13500: rank = "chartreux" elif len(cardlist) > 13500: rank = "russian blue" elif len(cardlist) > 12900: rank = "panther" elif len(cardlist) > 12600: rank = "cheetah" elif len(cardlist) > 12300: rank = "tiger" elif len(cardlist) > 12000: rank = "lion" elif len(cardlist) > 11700: rank = "metal" elif len(cardlist) > 11400: rank = "ground" elif len(cardlist) > 11100: rank = "darkness" elif len(cardlist) > 10800: rank = "water" elif len(cardlist) > 10500: rank = "nature" elif len(cardlist) > 10200: rank = "light" elif len(cardlist) > 9900: rank = "wind" elif len(cardlist) > 9600: rank = "fire" elif len(cardlist) > 9300: rank = "mercury" elif len(cardlist) > 9000: rank = "jupiter" elif len(cardlist) > 8700: rank = "uranus" elif len(cardlist) > 8400: rank = "neptune" elif len(cardlist) > 8100: rank = "earth" elif len(cardlist) > 7800: rank = "venus" elif len(cardlist) > 7500: rank = "saturn" elif len(cardlist) > 7200: rank = "mars" elif len(cardlist) > 6900: rank = "magnolia" elif len(cardlist) > 6600: rank = "chocolate cosmos" elif len(cardlist) > 6300: rank = "lilac" elif len(cardlist) > 6000: rank = "hydrangea" elif len(cardlist) > 5700: rank = "clover" elif len(cardlist) > 5400: rank = "daffodil" elif len(cardlist) > 5100: rank = "tiger lily" elif len(cardlist) > 4800: rank = "sakura" elif len(cardlist) > 4500: rank = "silver" elif len(cardlist) > 4200: rank = "bronze" elif len(cardlist) > 3900: rank = "amethyst" elif len(cardlist) > 3600: rank = "sapphire" elif len(cardlist) > 3300: rank = "emerald" elif len(cardlist) > 3000: rank = "gold" elif len(cardlist) > 2700: rank = "amber" elif len(cardlist) > 2400: rank = "ruby" elif len(cardlist) > 2200: rank = "dragon fruit" elif len(cardlist) > 2000: rank = "apricot" elif len(cardlist) > 1800: rank = "grape" elif len(cardlist) > 1600: rank = "blueberry" elif len(cardlist) > 1400: rank = "lime" elif len(cardlist) > 1200: rank = "lemon" elif len(cardlist) > 1000: rank = "tangerine" elif len(cardlist) > 800: rank = "strawberry" elif len(cardlist) > 700: rank = "gray" elif len(cardlist) > 600: rank = "brown" elif len(cardlist) > 500: rank = "purple" elif len(cardlist) > 400: rank = "blue" elif len(cardlist) > 300: rank = "green" elif len(cardlist) > 200: rank = "yellow" elif len(cardlist) > 100: rank = "orange" else: rank = "red" rankcode = re.sub(" ","",rank) content.write("\n\n") if crayred + crayorange + crayyellow + craygreen + crayblue + craypurple + craybrown + craygrey > 0: content.write("\n\n\n") if crayred > 0: content.write("\n") if crayorange > 0: content.write("\n") if crayyellow > 0: content.write("\n") if craygreen > 0: content.write("\n") if crayblue > 0: content.write("\n") if craypurple > 0: content.write("\n") if craybrown > 0: content.write("\n") if craygrey > 0: content.write("\n") content.write("\n\n
× " + str(crayred) + " × " + str(crayorange) + " × " + str(crayyellow) + " × " + str(craygreen) + " × " + str(crayblue) + " × " + str(craypurple) + " × " + str(craybrown) + " × " + str(craygrey) + "
\n") tradecommon = list((Counter(tradeout) & Counter(tradein)).elements()) sketch = len(tradecommon) if sketch > 0: content.write("\n\n\n\n") if sketch > 19: content.write("\n") content.write("\n\n\n") if sketch > 19: content.write("\n") content.write("\n\n
0: content.write(str(sketchdifference) + " to turn in") else: content.write("all turned in") content.write("\">
" + str(sketch % 20) + "/20" + str(int(sketch / 20)) + " completed
") if latestpalette + latestmonochrome > 0: content.write("\n
\n") if latestpalette > 0: content.write(portfoliogen(portfolios[latestpalette-1],"palette",palettes)) if latestmonochrome > 0: content.write(portfoliogen(portfolios[latestmonochrome-1],"monochrome",monochromes)) content.write("
\n
\n") decksofinterest = [] mastereddecks = [] for deck in decklist: if deck["mastered"]: mastereddecks.append(deck) mastereddecks = sorted(mastereddecks,key=lambda d: d["mastered"],reverse=True) if len(mastereddecks) > 0: content.write("

mastered decks

\n

") masteredcount = 0 for deck in mastereddecks: if masteredcount < variables.maxmastered: content.write("") masteredcount += 1 if len(mastereddecks) > variables.maxmastered: content.write(" see all") content.write("

\n") sigs = [] for card in cardlist: if card["name"][0:4] == "sig_": sigs.append(card) if len(sigs) > 0: content.write("

signatures

\n

") for card in sigs: content.write(printcard(card)) content.write("

\n") if len(variables.faves) > 0: content.write("

faves

\n

") faveslist = sorted(variables.faves) for card in faveslist: content.write(printcard(card)) content.write("

\n") if len(coupons) > 0: content.write("

coupons

\n

") for coupon in coupons: for key,value in coupon.items(): content.write("") content.write("

\n") donations = [] try: for donatedeck in variables.donations["decks"]: donation = {} donation["name"] = donatedeck for deck in decklist: if deck["name"] == donatedeck: if deck["mastered"]: donation["type"] = "mastered" else: donation["type"] = "deck" break donations.append(donation) except: pass try: for card in variables.donations["scrapbook"]: donation = {} donation["name"] = card donation["type"] = "single" donations.append(donation) except: pass if len(donations) > 0: donations = sorted(donations, key=lambda d: d["name"]) content.write("

donations

\n

") for donation in donations: if donation["type"] == "deck": content.write("") elif donation["type"] == "mastered": content.write("") elif donation["type"] == "single": content.write(printcard(donation["name"])) content.write("

\n") content.close() footerwrite(thefile) if __name__ == "__main__": indexgen() print("Building levels page") def levelsgen(): if not os.path.isdir("build/levels"): os.mkdir("build/levels") if os.path.exists("build/levels/index.html"): os.remove("build/levels/index.html") thefile = "build/levels/index.html" headerwrite(thefile,"levels") content = open(thefile,"a") content.write("

levels

\n\n\n\n\n\n\n\n\n\n
" + datelist[0].strftime("%Y-%m-%d") + "
\n") try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[100].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[200].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[300].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[400].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[500].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[600].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[700].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[800].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[1000].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[1200].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[1400].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[1600].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[1800].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[2000].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[2200].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[2400].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[2700].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[3000].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[3300].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[3600].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[3900].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[4200].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[4500].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[4800].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[5100].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[5400].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[5700].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[6000].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[6300].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[6600].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[6900].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[7200].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[7500].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[7800].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[8100].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[8400].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[8700].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[9000].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[9300].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[9600].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[9900].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[10200].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[10500].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[10800].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[11100].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[11400].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[11700].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[12000].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[12300].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[12600].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[12900].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[13200].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[13500].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[13800].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[14100].strftime("%Y-%m-%d") + "
\n") except: pass try: content.write("\n\n\n\n\n\n\n\n\n
" + datelist[14400].strftime("%Y-%m-%d") + "
\n") except: pass content.close() footerwrite(thefile) if __name__ == "__main__": levelsgen() print("Building portfolios page") def portfoliosgen(colour=False): if not os.path.isdir("build/portfolios"): os.mkdir("build/portfolios") if colour: if not os.path.isdir("build/portfolios/" + colour): os.mkdir("build/portfolios/" + colour) thefile = "build/portfolios/" + colour + "/index.html" else: thefile = "build/portfolios/index.html" if os.path.exists(thefile): os.remove(thefile) headerwrite(thefile,"portfolios") content = open(thefile,"a") content.write("

portfolios

\n") if latestpalette + latestmonochrome > 0: if latestpalette > 0: content.write("
\n") portnumber = 1 for portfolio in portfolios: if portfolio["type"] == "palette": content.write(portfoliogen(portfolio,"palette",portnumber)) portnumber += 1 content.write("
\n") if latestmonochrome > 0: content.write("
\n") portnumber = 1 for portfolio in portfolios: if portfolio["type"] == "monochrome": content.write(portfoliogen(portfolio,"monochrome",portnumber)) portnumber += 1 content.write("
\n") content.close() footerwrite(thefile) if __name__ == "__main__": portfoliosgen() print("Building collecting page") def collectinggen(colour=False): if not os.path.isdir("build/collecting"): os.mkdir("build/collecting") if colour: if not os.path.isdir("build/collecting/" + colour): os.mkdir("build/collecting/" + colour) thefile = "build/collecting/" + colour + "/index.html" else: thefile = "build/collecting/index.html" if os.path.exists(thefile): os.remove(thefile) headerwrite(thefile,"collecting") content = open(thefile,"a") content.write("

decks in progress

\n" + filterwrite("collecting",colour) + "
\n

High priority

\n") for deck in decklist: if deck["priority"] == 1 and deck["mastered"] == False: if colour: if deck["colour"] == colour: content.write(printdeck(deck,False)) else: content.write(printdeck(deck,False)) content.write("
\n
\n

Medium priority

\n") for deck in decklist: if deck["priority"] == 2 and deck["mastered"] == False: if colour: if deck["colour"] == colour: content.write(printdeck(deck)) else: content.write(printdeck(deck)) content.write("
\n
\n

Low priority

\n") for deck in decklist: if deck["priority"] == 3 and deck["mastered"] == False: if colour: if deck["colour"] == colour: content.write(printdeck(deck)) else: content.write(printdeck(deck)) content.write("
\n") content.close() footerwrite(thefile) def collectingall(): collectinggen() for thevalue in values: collectinggen(thevalue) if __name__ == "__main__": collectingall() print("Building mass collecting pages") masslist = sorted(list(variables.masscollect.keys())) def massindexgen(): if not os.path.isdir("build/mass"): os.mkdir("build/mass") thefile = "build/mass/index.html" if os.path.exists(thefile): os.remove(thefile) headerwrite(thefile,"mass") content = open(thefile,"a") content.write("

mass collecting/keeping

\n\n") content.close() footerwrite(thefile) def massseriesgen(series,massindex): if not os.path.isdir("build/mass/" + str(massindex)): os.mkdir("build/mass/" + str(massindex)) thefile = "build/mass/" + str(massindex) + "/index.html" if os.path.exists(thefile): os.remove(thefile) headerwrite(thefile,"mass") content = open(thefile,"a") content.write("

" + series + "

\n

back to mass decks page

\n

") for deck in decklist: if deck["mastered"]: if series in deck["mass"] or series in deck["massmaster"]: content.write("") content.write("

") for card in cardlist: if series in card["mass"]: if card["dupe"] == False: content.write(printcard(card)) content.write("

\n") content.close() footerwrite(thefile) def massall(): massindexgen() massindex = 1 for series in masslist: massseriesgen(series,massindex) massindex += 1 if __name__ == "__main__": massall() print("Building mastered page") def masteredgen(colour=False): if not os.path.isdir("build/mastered"): os.mkdir("build/mastered") if colour: if not os.path.isdir("build/mastered/" + colour): os.mkdir("build/mastered/" + colour) thefile = "build/mastered/" + colour + "/index.html" else: thefile = "build/mastered/index.html" if os.path.exists(thefile): os.remove(thefile) headerwrite(thefile,"mastered") content = open(thefile,"a") content.write("

mastered decks

\n") content.write(filterwrite("mastered",colour)) for deck in decklist: if deck["mastered"]: if colour: if deck["colour"] == colour: content.write(printdeck(deck)) else: content.write(printdeck(deck)) content.close() footerwrite(thefile) def masteredall(): masteredgen() for thevalue in values: masteredgen(thevalue) if __name__ == "__main__": masteredall() print("Building trading page") tradelist = [] sigtradelist = [] for card in cardlist: if card["priority"] == 4: tradelist.append(card) elif card["priority"] == 5: sigtradelist.append(card) alltradelist = tradelist + sigtradelist def tradegen(colour=False): if not os.path.isdir("build/trade"): os.mkdir("build/trade") if colour: if not os.path.isdir("build/trade/" + colour): os.mkdir("build/trade/" + colour) thefile = "build/trade/" + colour + "/index.html" else: thefile = "build/trade/index.html" if os.path.exists(thefile): os.remove(thefile) headerwrite(thefile,"trade") content = open(thefile,"a") content.write("

available for trade

\n" + filterwrite("trade",colour,True) + "

") if len(variables.tradestatement) > 0: content.write(variables.tradestatement + " ") content.write("Trade cards here

\n

\n

") for card in alltradelist: if colour: if card["colour"] == colour: content.write(printcard(card)) else: content.write(printcard(card)) content.write("

\n") content.close() footerwrite(thefile) def tradeall(): tradegen() for thevalue in values: tradegen(thevalue) tradegen("sig") if __name__ == "__main__": tradeall() print("Building wanted page") def wantedgen(): if not os.path.isdir("build/wanted"): os.mkdir("build/wanted") if os.path.exists("build/wanted/index.html"): os.remove("build/wanted/index.html") thefile = "build/wanted/index.html" headerwrite(thefile,"wanted") content = open(thefile,"a") content.write("

wanted cards

\n

High priority

\n\n

") for card in wantedlist: if card["priority"] == 1: if precomma: content.write(", ") content.write(cardtext(card)) precomma = True precomma = False content.write("

\n

Medium priority

\n\n

") for card in wantedlist: if card["priority"] == 2: if precomma: content.write(", ") content.write(cardtext(card)) precomma = True precomma = False content.write("

\n

Low priority

\n\n

") for card in wantedlist: if card["priority"] == 3: if precomma: content.write(", ") content.write(cardtext(card)) precomma = True content.write("

\n") content.close() footerwrite(thefile) if __name__ == "__main__": wantedgen() print("Building search page") def searchgen(): if not os.path.isdir("build/search"): os.mkdir("build/search") thefile = "build/search/index.html" if os.path.exists(thefile): os.remove(thefile) headerwrite(thefile,"search") content = open(thefile,"a") content.write("

card search

\n
\n \n \n \n
\n

\n

\n

\n

\n

\n

\n

\n\n \n \n") content.close() if __name__ == "__main__": searchgen() print("Building log page") def loggen(month=False): if month: if not os.path.isdir("build/log/month"): os.mkdir("build/log/month") if os.path.exists("build/log/month/index.html"): os.remove("build/log/month/index.html") thefile = "build/log/month/index.html" else: if not os.path.isdir("build/log"): os.mkdir("build/log") if os.path.exists("build/log/index.html"): os.remove("build/log/index.html") thefile = "build/log/index.html" headerwrite(thefile,"log") content = open(thefile,"a") content.write("

log

\n

") if month: content.write("Show all") else: content.write("Show current month only") content.write("

\n") for event in logitems: if month: if event["date"].month == datetime.datetime.now().month and event["date"].year == datetime.datetime.now().year: admit = True else: admit = False else: admit = True if admit == True: content.write("

" + event["date"].strftime("%Y-%m-%d") + " [" + event["name"] + "]: ") try: if event["received"]: content.write("Received ") receivedlist = sorted(event["received"], key=lambda d: d["name"]) position = 1 for card in receivedlist: content.write(cardtext(card)) if len(receivedlist) != position: content.write(", ") position += 1 content.write(".") try: if event["lost"]: content.write(" ") except: try: if event["crayons"]: content.write(" ") except: pass except: pass try: if event["lost"]: content.write("Lost ") lostlist = sorted(event["lost"], key=lambda d: d["name"]) position = 1 for card in lostlist: content.write(cardtext(card)) if len(lostlist) != position: content.write(", ") position += 1 content.write(".") try: if event["crayons"]: content.write(" ") except: pass except: pass try: if event["crayons"]: content.write("Crayons: ") try: content.write(crayonlog("red",event)) if list(event["crayons"])[-1] != "red": content.write(", ") except: pass try: content.write(crayonlog("orange",event)) if list(event["crayons"])[-1] != "orange": content.write(", ") except: pass try: content.write(crayonlog("yellow",event)) if list(event["crayons"])[-1] != "yellow": content.write(", ") except: pass try: content.write(crayonlog("green",event)) if list(event["crayons"])[-1] != "green": content.write(", ") except: pass try: content.write(crayonlog("blue",event)) if list(event["crayons"])[-1] != "blue": content.write(", ") except: pass try: content.write(crayonlog("purple",event)) if list(event["crayons"])[-1] != "purple": content.write(", ") except: pass try: content.write(crayonlog("brown",event)) if list(event["crayons"])[-1] != "brown": content.write(", ") except: pass try: content.write(crayonlog("grey",event)) except: pass content.write(".") except: pass content.write("

\n") content.close() footerwrite(thefile) def logall(): loggen(False) loggen(True) if __name__ == "__main__": logall()