• Обработка команды и callback одновременно в одной функции, как реализовать?

    HarisNvr
    @HarisNvr Автор вопроса
    Начинающий кодер Python
    В итоге забил и создал вторую функцию для обработки callback:

    @admin_router.message(Command('proportions'))
    @check_is_admin
    async def proportions(
            message: Message,
            state: FSMContext,
            keep_last_msg: bool = False
    ):
    
        """
        Handles the 'proportions' command. Receive a str value from admin and
        triggers the calculate_proportion function.
    
        :param state:
        :param keep_last_msg:
        :param message:
        :return: None
        """
    
        if not keep_last_msg:
            await message.delete()
            await sleep(DEL_TIME)
    
        await state.set_state(ProportionStates.waiting_for_proportion_input)
        sent_message = await message.answer(
            text='Введите через пробел: '
                 '\nПропорции компонентов '
                 '<b>A</b> и <b>B</b>, '
                 'и общую массу - <b>C</b>'
        )
    
        await record_message_id_to_db(sent_message)
    
    
    @admin_router.callback_query(F.data == 'another_proportion')
    async def callback_proportion(callback: CallbackQuery, state: FSMContext):
        await callback.answer()
        await proportions(callback.message, state=state, keep_last_msg=True)
    Ответ написан
    Комментировать
  • Как в SQLAlchemy 2 указать время записи в БД как МСК а не UTC?

    HarisNvr
    @HarisNvr Автор вопроса
    Начинающий кодер Python
    Короче сделал вместо DateTime тип данных TIMESTAMP и всё заработало:

    last_tarot_date: Mapped[datetime] = mapped_column(
            TIMESTAMP(timezone=True),
            nullable=True,
            default=None,
        )
    
    ...
    
    message_date: Mapped[datetime] = mapped_column(
            TIMESTAMP(timezone=True),
            default=datetime.now,
            nullable=False,
        )
    Ответ написан
  • Ошибка в коде py. Как написать код?

    HarisNvr
    @HarisNvr
    Начинающий кодер Python
    from telebot import TeleBot
    
    BOT = TeleBot('token')


    По крайней мере на pyTelegramBotAPI 4.16.1 так
    Ответ написан
    Комментировать
  • Какие условия самоликвидации ТГботов?

    HarisNvr
    @HarisNvr
    Начинающий кодер Python
    https://telegram.org/tos/bot-developers - материал по ботам ТГ с офф сайта.

    Пункт 9:

    9. Termination
    Failure to comply with these Terms or the Telegram Terms of Service may result in a temporary or a permanent ban from Bot Platform or Telegram apps. In such instances, your TPA will be removed from Bot Platform and become partially or fully inaccessible to some or all users. Should we have reason to do so, at our sole discretion, the Telegram account tied to your TPA may also be banned from the Telegram platform. You will not be compensated for any direct or indirect losses resulting from your termination.

    9.1. Unilateral Termination
    Telegram can decide to fully or partially discontinue TPA or Bot Platform at any time, including in response to unforeseen circumstances beyond our control. This includes but is not limited to discontinuation in specific regions, for certain users, or removing a subset of services and features. For clarity, we make no guarantee of ongoing or continued support for this program.

    9.2. Survivability
    If any part of these Bot Developer Terms is found to be void, invalid, or unenforceable, that provision will be enforced to the maximum extent allowed under applicable law, and will not impact the rest of the terms herein.

    The following paragraphs will continue to apply and survive the termination of Bot Platform and, by extension, of these Bot Developer Terms: 2.1., 4.2., 4.4., 5, 5.1., 5.2., 6.1., 6.2., 6.3., 6.4., 7., 7.2., 8., 8.1., 11. and 11.2..
    Ответ написан
  • Как создать первые миграции в PostgreSQL, внутри Docker контейнера через Alembic?

    HarisNvr
    @HarisNvr Автор вопроса
    Начинающий кодер Python
    Немного отдохнув пришёл к такому решению:

    def morning_routine():
        """
        Delete old message IDs from the DB. Telegram's policy doesn't allow bots
        to delete messages that are older than 48 hours. Wake's up a little bit
        slow, to give the database time to fully load.
        :return: Nothing
        """
    
        sleep(5)
    
        session = Session(engine)
        threshold = datetime.now() - timedelta(hours=48)
        stmt = delete(Message).where(
            Message.date_added < threshold.strftime('%Y-%m-%d %H:%M:%S')
        )
    
        try:
            session.execute(stmt)
            session.commit()
        except ProgrammingError:
            subprocess.run(
                'alembic revision --autogenerate -m "Initial migration"',
                shell=True
            )
            subprocess.run('alembic upgrade head', shell=True)
        finally:
            session.close()


    Буду рад конструктивной критике!
    Ответ написан
    Комментировать
  • Задача про часы, почему решается именно так?

    HarisNvr
    @HarisNvr
    Начинающий кодер Python
    60 * 24 — это общее количество минут в одном дне (24 часа по 60 минут).

    n % (60 * 24) — это количество минут, оставшееся после деления на полное количество минут в одном дне. Это позволяет нам получить количество минут в пределах одного дня. Вдруг заданное кол-во минут будет больше одного дня, часы сделают полный оборот и встанут на 00:00.

    // 60 — делит количество оставшихся минут на 60, чтобы получить количество часов. Здесь используется целочисленное деление, которое отбрасывает дробную часть.

    minutes = n % 60 вычисляет количество минут, оставшихся после деления на 60. Это будет то количество минут в последнем (неполном) часе.
    Ответ написан
    Комментировать
  • Подключение к Postgre внутри Docker?

    HarisNvr
    @HarisNvr Автор вопроса
    Начинающий кодер Python
    В .env файле указал

    DB_HOST=postgres

    И всё заработало!
    Ответ написан
    Комментировать