def test_get_items(self): passkey = environ.get('REPO_ACCESS_TOKEN') username = environ.get("TGTG_USERNAME", None) env_file = environ.get('GITHUB_ENV', None) timeout = environ.get('TGTG_TIMEOUT', 60) if passkey: encrypted_access_token = environ.get("TGTG_ACCESS_TOKEN", None) encrypted_refresh_token = environ.get("TGTG_REFRESH_TOKEN", None) encrypted_user_id = environ.get("TGTG_USER_ID", None) access_token = cryptocode.decrypt( encrypted_access_token, passkey) if encrypted_access_token else None refresh_token = cryptocode.decrypt( encrypted_refresh_token, passkey) if encrypted_refresh_token else None user_id = cryptocode.decrypt( encrypted_user_id, passkey) if encrypted_user_id else None else: access_token = environ.get("TGTG_ACCESS_TOKEN", None) refresh_token = environ.get("TGTG_REFRESH_TOKEN", None) user_id = environ.get("TGTG_USER_ID", None) client = TgtgClient( email=username, timeout=timeout, access_token=access_token, refresh_token=refresh_token, user_id=user_id, ) # get credentials and safe tokens to GITHUB_ENV file # this enables github workflow to reuse the access_token on sheduled runs # the credentials are encrypted with the REPO_ACCESS_TOKEN credentials = client.get_credentials() if env_file: with open(env_file, "a") as file: file.write("TGTG_ACCESS_TOKEN={}\n".format( cryptocode.encrypt(credentials["access_token"], passkey))) file.write("TGTG_REFRESH_TOKEN={}\n".format( cryptocode.encrypt(credentials["refresh_token"], passkey))) file.write("TGTG_USER_ID={}\n".format( cryptocode.encrypt(credentials["user_id"], passkey))) # Tests data = client.get_items(favorites_only=True) assert len(data) > 0 for prop in GLOBAL_PROPERTIES: assert prop in data[0] for prop in ITEM_PROPERTIES: assert prop in data[0]["item"] for prop in PRICE_PROPERTIES: assert prop in data[0]["item"]["price_including_taxes"]
def login(): username = environ.get("TGTG_USERNAME", None) env_file = environ.get("GITHUB_ENV", None) timeout = environ.get("TGTG_TIMEOUT", 60) access_token = environ.get("TGTG_ACCESS_TOKEN", None) refresh_token = environ.get("TGTG_REFRESH_TOKEN", None) user_id = environ.get("TGTG_USER_ID", None) client = TgtgClient( email=username, timeout=timeout, access_token=access_token, refresh_token=refresh_token, user_id=user_id, ) # get credentials and safe tokens to GITHUB_ENV file # this enables github workflow to reuse the access_token on sheduled runs credentials = client.get_credentials() if env_file: with open(env_file, "a", encoding="utf-8") as file: file.write(f"TGTG_ACCESS_TOKEN={credentials['access_token']}\n") file.write(f"TGTG_REFRESH_TOKEN={credentials['refresh_token']}\n") file.write(f"TGTG_USER_ID={credentials['user_id']}\n")
def main(): """Main entry point of the app""" parser = argparse.ArgumentParser() parser.add_argument("-e", "--email", default=os.environ.get("TGTG_EMAIL")) parser.add_argument("-cid", "--chat-id", default=os.environ.get("CHAT_ID")) parser.add_argument("-cto", "--chat-token", default=os.environ.get("CHAT_TOKEN")) parser.add_argument("-U", "--url", default=os.environ.get("URL")) # Optional verbosity counter (eg. -v, -vv, -vvv, etc.) parser.add_argument( "-v", "--verbose", action="count", default=0, help="Verbosity (-v, -vv, etc)" ) # Specify output of "--version" parser.add_argument( "--version", action="version", version="%(prog)s (version {version})".format(version=VERSION), ) args = parser.parse_args() level = getLoggingLevel(args.verbose) logging.basicConfig(level=level) logging.debug("Logging level set to DEBUG") bot = telegram.Bot(args.chat_token) logging.debug("Reading credentials from JSON file") try: with open("credentials.json") as f: credentials = json.load(f) except FileNotFoundError: credentials = None logging.debug("No token file exists") if not credentials: bot.send_message( chat_id=args.chat_id, text="Please open email to authenticate", parse_mode="Markdown", ) client = TgtgClient(email=args.email) credentials = client.get_credentials() with open("credentials.json", "w") as f: json.dump(credentials, f) kwargs = credentials if args.url: kwargs["url"] = args.url client = TgtgClient( **kwargs, ) previous_stock = set() while True: messages = [] current_stock = client.get_items(page_size=400) for store in current_stock: item_id = store["item"]["item_id"] if store["items_available"] < 1: # drop from list if no more items if item_id in previous_stock: logging.debug(f"removed item {item_id} from stock list") previous_stock.remove(item_id) continue if item_id in previous_stock: logging.debug( f"item {item_id} already in stock list, user already notified" ) continue message = f"*{store['display_name']}*\n→ {store['items_available']} item(s) available" messages.append(message) logging.info(message) logging.debug(f"(re)adding {item_id} to stock list") previous_stock.add(item_id) if messages: bot.send_message( chat_id=args.chat_id, text="\n\n".join(messages), parse_mode="Markdown" ) time.sleep(60)