Проверьте, добавлен ли новый диктант

Я работал над тем, где я хочу уведомлять себя, когда произошли новые изменения в полезной нагрузке. На данный момент я использовал фиктивные данные, чтобы лучше понять, что происходит.

Есть конкретный магазин, в который я звоню BarryThrillчто я хочу проверить, есть ли displayCountDownTimer (Будет отображаться в коде) было изменено с False -> True, и он должен уведомлять только всякий раз, когда он переходит с False на True, а не наоборот.

import random
import time
from threading import Thread
from typing import Dict, List, Union

import pendulum
from loguru import logger
from notification import create_embed


def thread_notification(new_info: Dict[str, Union[str, int, list, bool]]) -> None:
    Thread(
        target=notification.create_embed,  # Function where I send to a notification to my phone
        args=(
            new_info,
        )
    ).start()


def release_date(new_info: Dict[str, Union[str, int, list, bool]]) -> None:
    if new_info.get('releaseDate') and "BarryThrill" not in new_info["store"]:
        delta_seconds = (new_info["releaseDate"].subtract(seconds=10)) - pendulum.now()
        if not delta_seconds.seconds:
            logger.info(
                f'Release date enabled | Will sleep to -> {(new_info["releaseDate"].subtract(seconds=10)).to_datetime_string()}')
            time.sleep(delta_seconds.seconds)
    return

def spam_filter(self, delay: int, requests: List[str]) -> List[str]:
    """
    Filter requests to only those that haven't been made previously within our defined cooldown period.

    Will be worked on later on!
    """

    return "Will be worked on"


def main():
    old_info = {'store': 'BarryThrill SE', 'name': 'Barry Shop', 'sizes': ['1', '2', '3', '4'],
                'releaseDate': pendulum.datetime(2021, 4, 16, tz='Europe/Paris'), 'displayCountDownTimer': False}

    while True:

        new_info = {'store': 'BarryThrill SE', 'name': 'Barry Shop', 'sizes': ['1', '2', '3', '4', '5'],
                    'releaseDate': pendulum.datetime(2021, 4, 16, tz='Europe/Paris'), 'displayCountDownTimer': random.choice([True, False])} #We use random to use it as a Mock data
        
        release_date(new_info)
        
        if "BarryThrill" in new_info["store"] and new_info["displayCountDownTimer"] and new_info["displayCountDownTimer"] != old_info["displayCountDownTimer"]:
            logger.info(
                f'Detected new timer change -> Name: {new_info["name"]} | Display Time: {new_info["displayCountDownTimer"]}')

            new_info["status"] = "Timer change!"
            new_info["keyword"] = True

            thread_notification(new_info)

            new_info["displayCountDownTimer"] = new_info["displayCountDownTimer"]

        if new_info["sizes"] != old_info["sizes"]:
            # A filter where I can add a timestamp to each given sizes so I can skip if it "restocks" too often
            if spam_filter(10, new_info["sizes"]):
                logger.info(f'Detected restock -> Name: {new_info["name"]} | Sizes: {new_info["sizes"]}')

                new_info["status"] = "Restock!"
                new_info["keyword"] = True

                thread_notification(new_info)

                old_info["sizes"] = new_info["sizes"]

        else:
            print("No new changes made")
            time.sleep(random.randint(1, 3))


if __name__ == '__main__':
    main()

Краткое объяснение

  1. первый оператор if — это спящий (функция release_date). В основном, если магазин — это не BarryThrill, тогда мы хотим узнать, есть ли у нас значение releaseDateв диктате и вместе с pendulum Я могу заснуть за 10 секунд до фактического времени

  2. Второй оператор if — это проверка того, displayCountDownTimer был изменен с False -> True, а также мы проверяем, не имеет ли «предыдущий», которым является «old_info» то же значение, что и «new_info», тогда мы знаем, что в слове было изменение, которое перешло с False на True, а затем мы отправляем его в поток, который будет уведомлять мой мобильный телефон (часть потока)

  3. оператор if проверяет, были ли изменены размеры, то есть увеличились или уменьшились в основном. Здесь также я хочу проверить, увеличилось ли оно, а не уменьшилось, и если это так, я прохожу через функцию, которую мы можем вызвать spam.filter (которая ставит метку времени для каждого значения размера и проверяет, был ли размер в обнаружение за последние 10 минут, если есть, то пропускаем), а если обнаружено, то мы также отправляем его на мой мобильный телефон.

  4. Оператор Else, в основном, если все они ложны, мы просто повторяем снова и проверяем снова через 60-120 секунд.

Что меня беспокоит, так это то, что код как бы дублируется (мы используем много обычного кода), который, я считаю, можно сократить, но я не знаю, что это могло быть на самом деле. Мне бы очень хотелось, чтобы мы могли использовать поток один раз вместо того, чтобы разделять его на два оператора if, где оба потока делают одно и то же.

Я с нетерпением жду возможности улучшить код 🙂

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *