#!/usr/bin/env python3 from pprint import pprint from requests.auth import HTTPBasicAuth import json import os import requests import xmltodict MY_COLLECTION = "Fjompens fjomperi" MY_ID = "26" AUTH = None CARD_STYLE = 6 # Fjompens's card style def get_card_ids(): resp = requests.get("http://pvv.org/~andreasd/cards/command.php?cmd=get_all_cards", auth=AUTH) for collection in resp.json(): if collection["name"] == MY_COLLECTION and collection["id"] == MY_ID: return collection["cards"] def get_card_xml(card_id:int): resp = requests.get(f"http://pvv.org/~andreasd/cards/command.php?cmd=get_card_xml&id={card_id}", auth=AUTH) return resp.text def get_card_style_id(card_id:int): resp = requests.get(f"http://pvv.org/~andreasd/cards/command.php?cmd=get_card_style&id={card_id}", auth=AUTH) return resp.text def set_card_xml(card_id:int, xml_data): resp = requests.post(f"http://pvv.org/~andreasd/cards/command.php", auth=AUTH, data={ "cmd" : "update_card_text", "id" : str(card_id), "data" :xml_data, }) if resp.ok and resp.text == "Card Updated": return True else: print(resp.text) return False def set_card_style_id(card_id:int, style_id:int): resp = requests.post(f"http://pvv.org/~andreasd/cards/command.php", auth=AUTH, data={ "cmd" : "update_card_style", "id" : str(card_id), "style" : str(style_id), }) if resp.ok and resp.text == "Card Updated": # lol return True else: print(resp.text) return False def pull_all(): card_ids = get_card_ids() for card_id in card_ids: print(f"pulling card {card_id}... ", end="") data = get_card_xml(card_id) style_id = get_card_style_id(card_id) if style_id not in map(str, (0, CARD_STYLE)): print("Error! style id was",style_id) continue try: xml = xmltodict.parse(data) except: xml = None if xml and "ability_card" in xml: if "yaml_data" in xml["ability_card"]: if len(xml["ability_card"].keys()) == 1: yaml_data = xml["ability_card"]["yaml_data"] with open(f"cards/{card_id}.yaml", "w") as f: f.write(yaml_data + "\n") print(f"./cards/{card_id}.yaml written!") continue ftype = "xml" if data.strip() else "yaml" with open(f"cards/{card_id}.{ftype}", "w") as f: f.write(data + "\n") print(f"./cards/{card_id}.{ftype} written!") def push_all(): existing_card_ids = get_card_ids() for card_id in existing_card_ids: if os.path.isfile(f"cards/{card_id}.yaml"): fname = f"cards/{card_id}.yaml" with open(fname) as f: yaml_data = f.read() xml_data = f"\n{yaml_data.strip()}\n\n\n\n" elif os.path.isfile(f"cards/{card_id}.xml"): fname = f"cards/{card_id}.xml" with open(fname) as f: xml_data = f.read() else: continue if xml_data: print(f"POSTing {fname} to site... ", end="") if set_card_xml(card_id, xml_data) == True: print("OK!") else: print("FAILED!") style_id = get_card_style_id(card_id) if style_id == "0": print("Setting card", card_id, "style to", CARD_STYLE, "...", end=" ") if set_card_style_id(card_id, CARD_STYLE): print("OK!") else: print("FAILED!") if __name__ == "__main__": import sys if len(sys.argv) < 4: print(__file__, " \n\n\taction: either 'push' or 'pull'\n") elif sys.argv[1].strip().lower() == "pull": AUTH = HTTPBasicAuth(sys.argv[2], sys.argv[3]) pull_all() elif sys.argv[1].strip().lower() == "push": AUTH = HTTPBasicAuth(sys.argv[2], sys.argv[3]) push_all()