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("</td></td>","</td>") 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"]) cardnames = [] for card in cardlist: cardnames.append(card["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 not in cardnames: 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("<!DOCTYPE html>\n<html lang=\"en\" style=\"--headbg:" + variables.headerbackground + ";\">\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <link rel=\"stylesheet\" href=\"/style.css\">\n <link rel=\"stylesheet\" href=\"/user.css\">\n <meta name=\"theme-color\" content=\"" + variables.headerbackground + "\">\n <title>" + variables.name + "’s card collection :: " + pagename + "</title>\n </head>\n <body class=\"" + pagename + "\">\n <aside>\n \n </aside>\n <nav>\n <ul>\n <li>") if pagename == "index": header.write("home") else: header.write("<a href=\"/\">home</a>") header.write("</li>\n <li>") if pagename == "collecting": header.write("collecting") else: header.write("<a href=\"/collecting\">collecting</a>") header.write("</li>\n <li>") if pagename == "mass": header.write("mass collecting") else: header.write("<a href=\"/mass\">mass collecting</a>") header.write("</li>\n <li>") if pagename == "mastered": header.write("mastered") else: header.write("<a href=\"/mastered\">mastered</a>") header.write("</li>\n") if variables.ownedpage: header.write(" <li>") if pagename == "owned": header.write("owned") else: header.write("<a href=\"/owned\">owned</a>") header.write("</li>\n") header.write(" <li>") if pagename == "trade": header.write("trading") else: header.write("<a href=\"/trade\">trading</a>") header.write("</li>\n <li>") if pagename == "wanted": header.write("wanted") else: header.write("<a href=\"/wanted\">wanted</a>") header.write("</li>\n <li>") if pagename == "search": header.write("search") else: header.write("<a href=\"/search\">search</a>") header.write("</li>\n <li>") if pagename == "log": header.write("log") else: header.write("<a href=\"/log\">log</a>") header.write("</li>\n <li><a href=\"" + variables.tradepost + "\" target=\"_blank\">trade post @ dw</a></li>\n <li><a href=\"https://colors-tcg.eu/services.php\" target=\"_blank\">service links</a></li>\n </ul>\n </nav>\n <main>\n") header.close() def footerwrite(thefile): footer = open(thefile,"a") footer.write(" </main>\n </body>\n</html>") footer.close() def printcard(card): if type(card) == dict: if card["colour"] == "sig": return "<img src=\"/decks/sigs/" + card["name"][4:] + ".gif\" title=\"" + card["name"] + "\" loading=\"lazy\">" else: deck = card["name"][:-2] cardid = card["name"][-2:] return "<img src=\"/decks/" + deck + "/" + cardid + ".gif\" title=\"" + card["name"] + "\" loading=\"lazy\">" elif type(card) == str: if card[0:4] == "sig_": return "<img src=\"/decks/sigs/" + card[4:] + ".gif\" title=\"" + card + "\" loading=\"lazy\">" else: deck = card[:-2] cardid = card[-2:] return "<img src=\"/decks/" + deck + "/" + cardid + ".gif\" title=\"" + card + "\" loading=\"lazy\">" def cardtext(card): cardtext = "<span class=\"cardname\">" if card["colour"] == "sig": cardtext += "<span title=\"signature\">✍</span>" + card["name"] + "</span>" else: if card["colour"] == "red": cardtext += "<span title=\"red\">🔴</span>" elif card["colour"] == "orange": cardtext += "<span title=\"orange\">🟠</span>" elif card["colour"] == "yellow": cardtext += "<span title=\"yellow\">🟡</span>" elif card["colour"] == "green": cardtext += "<span title=\"green\">🟢</span>" elif card["colour"] == "blue": cardtext += "<span title=\"blue\">🔵</span>" elif card["colour"] == "purple": cardtext += "<span title=\"purple\">🟣</span>" elif card["colour"] == "brown": cardtext += "<span title=\"brown\">🟤</span>" elif card["colour"] == "gray": cardtext += "<span title=\"" if variables.british: cardtext += "grey" else: cardtext += "gray" cardtext += "\">⚪</span>" elif card["colour"] == "special": cardtext += "<span title=\"special\">✨</span>" cardtext += card["name"] + "</span>" return cardtext def portfoliogen(theportfolio,thetype,portnumber): if thetype == "palette": portstring = "<table class=\"palette portfolio\">\n<tbody>\n<tr>\n<td colspan=\"2\">" + variables.name.lower() + "</td>\n</tr>\n<tr>\n<td class=\"deck1\">" 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 += "</td>\n<td class=\"deck5\">" 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 += "</td>\n</tr>\n<tr>\n<td class=\"deck2\">" 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 += "</td>\n<td class=\"deck6\">" 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 += "</td>\n</tr>\n<tr>\n<td class=\"deck3\">" 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 += "</td>\n<td class=\"deck7\">" 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 += "</td>\n</tr>\n<tr>\n<td class=\"deck4\">" 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 += "</td>\n<td class=\"deck8\">" 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 += "</td>\n</tr>\n<tr>\n<td colspan=\"2\"><a href=\"" + theportfolio["url"] + "\">palette portfolio " if portnumber < 10: portstring += "0" + str(portnumber) else: portstring += str(portnumber) portstring += "</a></td>\n</tr>\n</tbody>\n</table>\n" elif thetype == "monochrome": thecolour = list(theportfolio["decks"].values())[0] portstring = "<table class=\"" + thecolour + " portfolio\">\n<tbody>\n<tr>\n<td colspan=\"2\">" + variables.name.lower() + "</td>\n</tr>\n<tr>\n<td class=\"deck1\">" 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] + "</td>\n<td class=\"deck5\">" for deck in decklist: if deck["name"] == thedecks[4].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[4] + "</td>\n</tr>\n<tr>\n<td class=\"deck2\">" for deck in decklist: if deck["name"] == thedecks[1].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[1] + "</td>\n<td class=\"deck6\">" for deck in decklist: if deck["name"] == thedecks[5].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[5] + "</td>\n</tr>\n<tr>\n<td class=\"deck3\">" for deck in decklist: if deck["name"] == thedecks[2].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[2] + "</td>\n<td class=\"deck7\">" for deck in decklist: if deck["name"] == thedecks[6].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[6] + "</td>\n</tr>\n<tr>\n<td class=\"deck4\">" for deck in decklist: if deck["name"] == thedecks[3].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[3] + "</td>\n<td class=\"deck8\">" for deck in decklist: if deck["name"] == thedecks[7].replace(" ",""): if deck["mastered"]: portstring += "■" else: portstring += "□" break portstring += " " + thedecks[7] + "</td>\n</tr>\n<tr>\n<td colspan=\"2\"><a href=\"" + theportfolio["url"] + "\">monochrome portfolio " if portnumber < 10: portstring += "0" + str(portnumber) else: portstring += str(portnumber) portstring += "</a></td>\n</tr>\n</tbody>\n</table>\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 = "<p class=\"typefilter\">" if colour: filterstring += "Filtered to <span class=\"" + colour + "\"><b>" if colour == "gray": if variables.british: filterstring += "grey" else: filterstring += "gray" else: filterstring += colour filterstring += "</b></span>. <a href=\"/" + page + "\">Show all</a>" else: filterstring += "Filter: <a href=\"/" + page + "/red\" title=\"red\">🔴</a> <a href=\"/" + page + "/orange\" title=\"orange\">🟠</a> <a href=\"/" + page + "/yellow\" title=\"yellow\">🟡</a> <a href=\"/" + page + "/green\" title=\"green\">🟢</a> <a href=\"/" + page + "/blue\" title=\"blue\">🔵</a> <a href=\"/" + page + "/purple\" title=\"purple\">🟣</a> <a href=\"/" + page + "/brown\" title=\"brown\">🟤</a> <a href=\"/" + page + "/gray\" title=\"" if variables.british: filterstring += "grey" else: filterstring += "gray" filterstring += "\">⚪</a> <a href=\"/" + page + "/special\" title=\"special\">✨</a>" if sigs: filterstring += " <a href=\"/" + page + "/sig\" title=\"sig\">✍</a>" filterstring += "</p>\n" return filterstring def printdeck(deck,fold=True): if fold: deckstring = "<details class=\"deckwrap\">\n<summary>" + deck["name"] + " [" if deck["mastered"]: deckstring += deck["mastered"].strftime("%Y-%m-%d") else: deckstring += str(deck["count"]) + "/20" deckstring += "]</summary>\n" else: deckstring = "" deckstring += "<table class=\"decktable " + deck["colour"] + "\">\n" if not fold: deckstring += "<thead>\n <tr>\n <th colspan=\"5\">" + deck["name"] + " [" if deck["mastered"]: deckstring += deck["mastered"].strftime("%Y-%m-%d") else: deckstring += str(deck["count"]) + "/20" deckstring += "]</th>\n </tr>\n</thead>\n" deckstring += "<tbody>\n" test = 1 while test < 21: if test % 5 == 1: deckstring += " <tr>\n" deckstring += " <td>" 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 += "<img src=\"/decks/" + deck["name"] + "/00.gif\" loading=\"lazy\">" if deck["name"] + teststring in pends: deckstring += "<p class=\"pending\">pending</p>" deckstring += "</td>\n" if test % 5 == 0: deckstring += " </tr>\n" test += 1 if deck["mastered"]: deckstring += " <tr>\n <td colspan=\"5\" align=\"center\"><img src=\"/decks/" + deck["name"] + "/master.gif\" title=\"mastered " + deck["name"] try: if deck["name"] in variables.firstmasteries: deckstring += " (first)\" class=\"first" except: pass deckstring += "\"><td>\n</tr>\n" deckstring += "</tbody>\n</table>\n" if fold: deckstring += "</details>\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("<a href=\"/levels\"><img src=\"/assets/levels/" + rankcode + ".gif\"></a><img src=\"/decks/sigs/" + variables.name.lower() + ".gif\" loading=\"lazy\">\n<ul>\n<li>player name: <span class=\"name\">" + variables.name + "</span></li>\n<li>" + str(len(cardlist)) + " cards held <span class=\"rank " + rank + "\">(" + rank + ")</span></li>\n<li>started <code>" + firstdate.strftime("%Y-%m-%d") + "</code></li>\n<li>last updated <code>" + datetime.datetime.today().strftime("%Y-%m-%d") + "</code></li>\n<li><a href=\"https://git.praze.net/tre/tcg\" target=\"_blank\">code</a> under construction</li>\n") if len(variables.misclink["text"]) > 0: content.write("<li><a href=\"" + variables.misclink["link"] + "\">" + variables.misclink["text"] + "</a></li>\n") content.write("</ul>\n") if crayred + crayorange + crayyellow + craygreen + crayblue + craypurple + craybrown + craygrey > 0: content.write("<table id=\"crayontable\">\n<tbody>\n<tr>\n") if crayred > 0: content.write("<td class=\"red\"><img src=\"/assets/crayons/crayon1.gif\" class=\"crayon\" title=\"red\"> × " + str(crayred) + "</td>\n") if crayorange > 0: content.write("<td class=\"orange\"><img src=\"/assets/crayons/crayon2.gif\" class=\"crayon\" title=\"orange\"> × " + str(crayorange) + "</td>\n") if crayyellow > 0: content.write("<td class=\"yellow\"><img src=\"/assets/crayons/crayon3.gif\" class=\"crayon\" title=\"yellow\"> × " + str(crayyellow) + "</td>\n") if craygreen > 0: content.write("<td class=\"green\"><img src=\"/assets/crayons/crayon4.gif\" class=\"crayon\" title=\"green\"> × " + str(craygreen) + "</td>\n") if crayblue > 0: content.write("<td class=\"blue\"><img src=\"/assets/crayons/crayon5.gif\" class=\"crayon\" title=\"blue\"> × " + str(crayblue) + "</td>\n") if craypurple > 0: content.write("<td class=\"purple\"><img src=\"/assets/crayons/crayon6.gif\" class=\"crayon\" title=\"purple\"> × " + str(craypurple) + "</td>\n") if craybrown > 0: content.write("<td class=\"brown\"><img src=\"/assets/crayons/crayon7.gif\" class=\"crayon\" title=\"brown\"> × " + str(craybrown) + "</td>\n") if craygrey > 0: content.write("<td class=\"grey\"><img src=\"/assets/crayons/crayon8.gif\" class=\"crayon\" title=\"") if variables.british: content.write("grey") else: content.write("gray") content.write("\"> × " + str(craygrey) + "</td>\n") content.write("</tr>\n</tbody>\n</table>\n") tradecommon = list((Counter(tradeout) & Counter(tradein)).elements()) sketch = len(tradecommon) if sketch > 0: content.write("<table class=\"sketchpads\">\n<tbody>\n<tr>\n<td><img src=\"/assets/sketch/") if sketch % 20 < 10: content.write("0" + str(sketch % 20)) else: content.write(str(sketch % 20)) content.write(".gif\"></td>\n") if sketch > 19: content.write("<td><img src=\"/assets/sketch/20.gif\" title=\"") sketchdifference = int(sketch / 20) - redeemedsketch if sketchdifference > 0: content.write(str(sketchdifference) + " to turn in") else: content.write("all turned in") content.write("\"></td>\n") content.write("</tr>\n<tr>\n<td align=\"center\">" + str(sketch % 20) + "/20</td>\n") if sketch > 19: content.write("<td align=\"center\">" + str(int(sketch / 20)) + " completed</td>\n") content.write("</tr>\n</tbody>\n</table>") if latestpalette + latestmonochrome > 0: content.write("<a href=\"/portfolios\">\n<div class=\"foliocase\">\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("</div>\n</a>\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("<h2>mastered decks</h2>\n<p id=\"masteredcarousel\">") masteredcount = 0 for deck in mastereddecks: if masteredcount < variables.maxmastered: content.write("<img src=\"/decks/" + deck["name"] + "/master.gif\" title=\"mastered " + deck["name"]) try: if deck["name"] in variables.firstmasteries: content.write(" (first)\" class=\"first") except: pass content.write("\">") masteredcount += 1 if len(mastereddecks) > variables.maxmastered: content.write(" <a href=\"mastered\">see all</a>") content.write("</p>\n") sigs = [] for card in cardlist: if card["name"][0:4] == "sig_": sigs.append(card) if len(sigs) > 0: content.write("<h2>signatures</h2>\n<p>") for card in sigs: content.write(printcard(card)) content.write("</p>\n") if len(variables.faves) > 0: content.write("<h2>faves</h2>\n<p>") faveslist = sorted(variables.faves) for card in faveslist: content.write(printcard(card)) content.write("</p>\n") if len(coupons) > 0: content.write("<h2>coupons</h2>\n<p>") for coupon in coupons: for key,value in coupon.items(): content.write("<img src=\"/assets/coupons/" + key + ".png\" class=\"coupon") if value == 0: content.write(" expired\" title=\"expired\"") else: content.write("\" title=\"" + str(value) + " left\"") content.write(" loading=\"lazy\">") content.write("</p>\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("<h2>donations</h2>\n<p>") for donation in donations: if donation["type"] == "deck": content.write("<img src=\"/decks/" + donation["name"] + "/00.gif\" loading=\"lazy\">") elif donation["type"] == "mastered": content.write("<img src=\"/decks/" + donation["name"] + "/master.gif\" title=\"mastered " + donation["name"]) try: if donation["name"] in variables.firstmasteries: content.write(" (first)\" class=\"first") except: pass content.write("\">") elif donation["type"] == "single": content.write(printcard(donation["name"])) content.write("</p>\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("<h1>levels</h1>\n<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/red.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[0].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/orange.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[100].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/yellow.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[200].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/green.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[300].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/blue.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[400].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/purple.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[500].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/brown.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[600].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/gray.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[700].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/strawberry.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[800].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/tangerine.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[1000].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/lemon.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[1200].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/lime.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[1400].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/blueberry.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[1600].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/grape.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[1800].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/apricot.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[2000].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/dragonfruit.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[2200].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/ruby.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[2400].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/amber.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[2700].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/gold.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[3000].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/emerald.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[3300].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/sapphire.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[3600].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/amethyst.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[3900].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/bronze.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[4200].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/silver.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[4500].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/sakura.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[4800].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/tigerlily.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[5100].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/daffodil.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[5400].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/clover.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[5700].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/hydrangea.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[6000].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/lilac.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[6300].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/chocolatecosmos.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[6600].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/magnolia.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[6900].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/mars.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[7200].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/saturn.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[7500].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/venus.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[7800].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/earth.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[8100].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/neptune.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[8400].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/uranus.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[8700].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/jupiter.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[9000].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/mercury.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[9300].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/fire.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[9600].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/wind.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[9900].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/light.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[10200].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/nature.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[10500].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/water.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[10800].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/darkness.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[11100].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/ground.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[11400].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/metal.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[11700].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/lion.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[12000].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/tiger.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[12300].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/cheetah.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[12600].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/panther.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[12900].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/russianblue.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[13200].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/chartreux.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[13500].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/puma.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[13800].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/himalayan.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[14100].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n") except: pass try: content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/rainbow.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[14400].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\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("<h1>portfolios</h1>\n") if latestpalette + latestmonochrome > 0: if latestpalette > 0: content.write("<div class=\"foliocase\">\n") portnumber = 1 for portfolio in portfolios: if portfolio["type"] == "palette": content.write(portfoliogen(portfolio,"palette",portnumber)) portnumber += 1 content.write("</div>\n") if latestmonochrome > 0: content.write("<div class=\"foliocase\">\n") portnumber = 1 for portfolio in portfolios: if portfolio["type"] == "monochrome": content.write(portfoliogen(portfolio,"monochrome",portnumber)) portnumber += 1 content.write("</div>\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("<h1>decks in progress</h1>\n" + filterwrite("collecting",colour) + "<div>\n<h2 class=\"collectingheader\">High priority</h2>\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("</div>\n<div>\n<h2 class=\"collectingheader\">Medium priority</h2>\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("</div>\n<div>\n<h2 class=\"collectingheader\">Low priority</h2>\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("</div>\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("<h1>mass collecting/keeping</h1>\n<ul>\n") massindex = 1 for series in masslist: content.write("<li><a href=\"/mass/" + str(massindex) + "\">" + series + "</a>") content.write("</li>\n") massindex += 1 content.write("</ul>\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("<h1>" + series + "</h1>\n<p><a href=\"/mass\">back to mass decks page</a></p>\n<p>") for deck in decklist: if deck["mastered"]: if series in deck["mass"] or series in deck["massmaster"]: content.write("<img src=\"/decks/" + deck["name"] + "/master.gif\" title=\"mastered " + deck["name"]) try: if deck["name"] in variables.firstmasteries: content.write(" (first)\" class=\"first") except: pass content.write("\">") content.write("</p><p>") for card in cardlist: if series in card["mass"]: if card["dupe"] == False: content.write(printcard(card)) content.write("</p>\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("<h1>mastered decks</h1>\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("<h1>available for trade</h1>\n" + filterwrite("trade",colour,True) + "<p class=\"tradeterms\">") if len(variables.tradestatement) > 0: content.write(variables.tradestatement + " ") content.write("Trade cards <a href=\"" + variables.tradepost + "\">here</a></p>\n<p><textarea readonly>") precomma = False for card in alltradelist: if colour: if card["colour"] == colour: if precomma: content.write(", ") content.write(card["name"]) precomma = True else: if precomma: content.write(", ") content.write(card["name"]) precomma = True content.write("</textarea>\n<p>") for card in alltradelist: if colour: if card["colour"] == colour: content.write(printcard(card)) else: content.write(printcard(card)) content.write("</p>\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("<h1>wanted cards</h1>\n<h2>High priority</h2>\n<textarea readonly>") precomma = False for card in wantedlist: if card["priority"] == 1: if precomma: content.write(", ") content.write(card["name"]) precomma = True precomma = False content.write("</textarea>\n<p>") for card in wantedlist: if card["priority"] == 1: if precomma: content.write(", ") content.write(cardtext(card)) precomma = True precomma = False content.write("</p>\n<h2>Medium priority</h2>\n<textarea readonly>") for card in wantedlist: if card["priority"] == 2: if precomma: content.write(", ") content.write(card["name"]) precomma = True precomma = False content.write("</textarea>\n<p>") for card in wantedlist: if card["priority"] == 2: if precomma: content.write(", ") content.write(cardtext(card)) precomma = True precomma = False content.write("</p>\n<h2>Low priority</h2>\n<textarea readonly>") for card in wantedlist: if card["priority"] == 3: if precomma: content.write(", ") content.write(card["name"]) precomma = True precomma = False content.write("</textarea>\n<p>") for card in wantedlist: if card["priority"] == 3: if precomma: content.write(", ") content.write(cardtext(card)) precomma = True content.write("</p>\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("<h1>card search</h1>\n<form>\n <label for=\"cardinput\">Enter a list of cards and/or decks here:</label>\n <textarea id=\"cardinput\" name=\"cardinput\"></textarea>\n <input type=\"button\" value=\"Search\" onclick=\"searchcards()\">\n</form>\n<p id=\"hpwfound\"></p>\n<p id=\"mpwfound\"></p>\n<p id=\"lpwfound\"></p>\n<p id=\"hptfound\"></p>\n<p id=\"mptfound\"></p>\n<p id=\"lptfound\"></p>\n<p id=\"nothing\"></p>\n<script>\n function searchcards() {\n const thecards = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20'];\n const hpw = [") precomma = False for card in wantedlist: if card["priority"] == 1: if precomma: content.write(", ") content.write("'" + card["name"] + "'") precomma = True content.write("];\n const mpw = [") precomma = False for card in wantedlist: if card["priority"] == 2: if precomma: content.write(", ") content.write("'" + card["name"] + "'") precomma = True content.write("];\n const lpw = [") precomma = False for card in wantedlist: if card["priority"] == 3: if precomma: content.write(", ") content.write("'" + card["name"] + "'") precomma = True content.write("];\n const hpt = [") precomma = False for card in cardlist: if card["priority"] == 2: if precomma: content.write(", ") content.write("'" + card["name"] + "'") precomma = True content.write("];\n const mpt = [") precomma = False for card in cardlist: if card["priority"] == 3: if precomma: content.write(", ") content.write("'" + card["name"] + "'") precomma = True content.write("];\n const lpt = [") precomma = False for card in cardlist: if card["priority"] == 4: if precomma: content.write(", ") content.write("'" + card["name"] + "'") precomma = True content.write("];\n const searchstring = document.getElementById('cardinput').value;\n const searcharray = searchstring.replaceAll(' ','').replaceAll('\\n',',').replaceAll('\\r',',').toLowerCase().split(',');\n const hpwfound = [];\n const mpwfound = [];\n const lpwfound = [];\n const hptfound = [];\n const mptfound = [];\n const lptfound = [];\n for (const element of searcharray) {\n let cardend = element.substring(element.length, element.length - 2);\n if (!(thecards.includes(cardend))) {\n for (const ending of thecards) {\n searcharray.push(element + ending);\n };\n };\n };\n for (const element of searcharray) {\n if (hpw.includes(element)) {\n hpwfound.push(element);\n } else if (mpw.includes(element)) {\n mpwfound.push(element);\n } else if (lpw.includes(element)) {\n lpwfound.push(element);\n } else if (hpt.includes(element)) {\n hptfound.push(element);\n } else if (mpt.includes(element)) {\n mptfound.push(element);\n } else if (lpt.includes(element)) {\n lptfound.push(element);\n };\n };\n if ((hpwfound.length) > 0) {\n document.getElementById('hpwfound').innerHTML = '<span class=\"sorttitle\">Wanted (high priority):</span> <span class=\"searchresults\">' + hpwfound.join(', ') + '</span>';\n } else {\n document.getElementById('hpwfound').innerHTML = '';\n };\n if ((mpwfound.length) > 0) {\n document.getElementById('mpwfound').innerHTML = '<span class=\"sorttitle\">Wanted (medium priority):</span> <span class=\"searchresults\">' + mpwfound.join(', ') + '</span>';\n } else {\n document.getElementById('mpwfound').innerHTML = '';\n };\n if ((lpwfound.length) > 0) {\n document.getElementById('lpwfound').innerHTML = '<span class=\"sorttitle\">Wanted (low priority):</span> <span class=\"searchresults\">' + lpwfound.join(', ') + '</span>';\n } else {\n document.getElementById('lpwfound').innerHTML = '';\n };\n if ((hptfound.length) > 0) {\n document.getElementById('hptfound').innerHTML = '<span class=\"sorttitle\">Will trade out for <a href=\"/wanted\">high priority cards</a> only:</span> <span class=\"searchresults\">' + hptfound.join(', ') + '</span>';\n } else {\n document.getElementById('hptfound').innerHTML = '';\n };\n if ((mptfound.length) > 0) {\n document.getElementById('mptfound').innerHTML = '<span class=\"sorttitle\">Will trade out for <a href=\"/wanted\">high or medium priority cards</a>:</span> <span class=\"searchresults\">' + mptfound.join(', ') + '</span>';\n } else {\n document.getElementById('mptfound').innerHTML = '';\n };\n if ((lptfound.length) > 0) {\n document.getElementById('lptfound').innerHTML = '<span class=\"sorttitle\">Will trade out for <a href=\"/wanted\">any wanted card</a>:</span> <span class=\"searchresults\">' + lptfound.join(', ') + '</span>';\n } else {\n document.getElementById('lptfound').innerHTML = '';\n };\n if ((hpwfound.length) + (mpwfound.length) + (lpwfound.length) + (hptfound.length) + (mptfound.length) + (lptfound.length) == 0) {\n document.getElementById('nothing').innerHTML = 'No results';\n } else {\n document.getElementById('nothing').innerHTML = '';\n }\n }\n</script>\n </main>\n </body>\n</html>") 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("<h1>log</h1>\n<p class=\"typefilter\">") if month: content.write("<a href=\"/log\">Show all</a>") else: content.write("<a href=\"/log/month\">Show current month only</a>") content.write("</p>\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("<p><code>" + event["date"].strftime("%Y-%m-%d") + "</code> <a href=\"" + event["url"] + "\">[" + event["name"] + "]</a>: ") 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("</p>\n") content.close() footerwrite(thefile) def logall(): loggen(False) loggen(True) if __name__ == "__main__": logall()