#!/usr/bin/python3 # # fetch chest codes for Idle Champions from: # https://incendar.com/idlechampions_codes.php # import requests import bs4 import subprocess import yaml URL = 'https://incendar.com/idlechampions_codes.php' STATE = '/home/gstein/.ic_state' CMD = '/home/gstein/bin/cclip' def extract(html): soup = bs4.BeautifulSoup(html, features='html.parser') def parse_codes(id): return set(soup.find(id=id).get_text().splitlines()) recent = parse_codes('i11') long_term = parse_codes('i22') permanent = parse_codes('i33') expired = parse_codes('i44') return recent, long_term, permanent, expired def fetch_html(): return requests.get(URL).text def load_state(): fp = open(STATE) _ = fp.readline() # skip the comment return set(yaml.safe_load(fp)) def save_state(seen): open(STATE, 'w').write('# see gstein/python/ic_codes.py\n' + yaml.dump(sorted(seen))) def interact(codes, seen): for c in sorted(codes): # Push to clipboard subprocess.run((CMD, c), check=True) # Wait for ACK that it was used. input(f'Pushed "{c}" to clipboard. Press when used.') # Used. Record this fact. seen.add(c) save_state(seen) def handle_all_codes(recent, long_term, permanent, expired): seen = load_state() if codes := recent - seen: print(f'RECENT CODES ({len(codes)}):') interact(codes, seen) if codes := long_term - seen: print(f'LONG TERM CODES ({len(codes)}):') interact(codes, seen) if codes := permanent - seen: print(f'PERMANENT CODES ({len(codes)}):') interact(codes, seen) if codes := expired - seen: print(f'EXPIRED CODES ({len(codes)}):') interact(codes, seen) if __name__ == '__main__': codes = extract(fetch_html()) handle_all_codes(*codes)