Exemplo n.º 1
0
    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"]
Exemplo n.º 2
0
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")
Exemplo n.º 3
0
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)