Загрузка...

Как заблокировать выполнение функции кнопки при каком то условии?

Тема в разделе Python создана пользователем beta 29 мар 2025. 217 просмотров

  1. beta
    beta Автор темы 29 мар 2025 475 6 янв 2019
    Python
    @dp.callback_query_handler(lambda c: c.data == 'profile')
    async def process_profile(callback_query: types.CallbackQuery):
    user_id = callback_query.from_user.id
    chat_id = callback_query.message.chat.id
    first_name = callback_query.from_user.first_name
    language_code = callback_query.from_user.language_code
    premium = callback_query.from_user.is_premium

    # тут запрашиваем массив ссылок
    status, code, links = await request_op(
    user_id, chat_id,
    first_name=first_name,
    language_code=language_code,
    premium=premium
    )

    if links:
    # тут формируется блок подписок если ссылки есть
    subscription_text = "<b>Для доступа к профилю подпишитесь на следующие ресурсы:</b>\n"
    for link in links:
    subscription_text += f"• {link}\n"
    keyboard = InlineKeyboardMarkup(row_width=1)
    keyboard.add(InlineKeyboardButton("Главное меню", callback_data="no_action"))
    await bot.edit_message_text(
    subscription_text,
    chat_id,
    callback_query.message.message_id,
    parse_mode="HTML",
    reply_markup=keyboard
    )
    # если массив ссылок не пустой формируется блок подписок и останавливается дальнейшее выполнение
    return

    # тут если при запросе массив ссылок пустой мы выводим сам профиль
    await bot.delete_message(chat_id, callback_query.message.message_id)
    await show_profile(callback_query)
    Мне надо что бы при нажатии запрашивался массив ссылок у сервиса, если массив ссылок не пустой тогда формируется блок подписок как в коде и по идее выполнение на этом должно закончится, но оно почему то продолжает и выводит сам профиль хотя этого происходить не должно, в чем проблема
    Надо что бы если массив ссылок был не пустой формировался только блок подписок и ничего не происходило, если массив ссылок пустой тогда блок подписок не выводится и появляется сам профиль
     
  2. Нинтендо
    Нинтендо 29 мар 2025 I was tryna beat a case 5955 12 сен 2021
    в питоне после return ноль не ставится?
     
    1. beta Автор темы
  3. doublepurpose
    doublepurpose 29 мар 2025 117 27 мар 2025
    await bot.answer_callback_query(callback_query.id) воткни перед return, также залогируй то что лежит в векторе links, проверь точно ли отсюда вызывается show_profile, тож можешь логнуть ну или принтами обложить хотяб
     
  4. gcc_machine
    output этого можно?
    status, code, links = await request_op( user_id, chat_id, first_name=first_name, language_code=language_code, premium=premium )
     
  5. beta
    beta Автор темы 29 мар 2025 475 6 янв 2019
    Попробовал логировать массив ссылок полученный
    [IMG]
    [] в нём должны быть links то есть ссылки, но там нихуя нету, а блок подписок формируется, массив пустой но ссылки есть
    тут вообще хуй знает что куда
     
    1. Посмотреть предыдущие комментарии (6)
    2. beta Автор темы
      doublepurpose, короче посмотрел я и понял что тут всё нахуй не надо и вызвать блок подписок можно только await request_op без всякой хуйни, и это я еблан в итоге
    3. gcc_machine
      beta, используй лучше более человеческий вид возвращения ответа от функции, а не tuple, и обращаться к объекту будет куда проще, и лучше использоваться if len(links)
      Python
      async def request_op(user_id, chat_id, gender=None, first_name=None, language_code=None, premium=None):
      try:
      headers = {
      'Content-Type': 'application/json',
      'Auth': API_KEY,
      'Accept': 'application/json',
      }
      data = {
      'UserId': user_id,
      'ChatId': chat_id,
      'first_name': first_name,
      'language_code': language_code,
      'Premium': premium
      }
      if gender:
      data['Gender'] = gender
      async with aiohttp.ClientSession() as session:
      async with session.post('https://api.subgram.ru/request-op/', headers=headers, json=data) as response:
      if not response.ok:
      logging.error('SubGram: %s' % str(await response.json()))
      return 'ok', 400, []
      response_json = await response.json()
      links = response_json.get("links") or []
      return {
      "status": response_json.get("status"),
      "code": response_json.get("code"),
      "links": links
      }
      except Exception as e:
      logging.error('SubGram: %s' % str(e))
      return {
      "status": 'ok',
      "code": 400,
      "links": []
      }
  6. APT29388
    У тебя `return` стоит, должно работать. Проверь `request_op` и данные, которые он возвращает
     
  7. n1s_01
    Попробуй. Поправил.

    Python
    @dp.callback_query_handler(lambda c: c.data == 'profile')
    async def process_profile(callback_query: types.CallbackQuery):
    user_id = callback_query.from_user.id
    chat_id = callback_query.message.chat.id
    first_name = callback_query.from_user.first_name
    language_code = callback_query.from_user.language_code
    premium = callback_query.from_user.is_premium

    status, code, links = await request_op(
    user_id, chat_id,
    first_name=first_name,
    language_code=language_code,
    premium=premium
    )

    if links and isinstance(links, (list, tuple)) and len(links) > 0:
    subscription_text = "<b>Для доступа к профилю подпишитесь на следующие ресурсы:</b>\n"
    for link in links:
    subscription_text += f"• {link}\n"
    keyboard = InlineKeyboardMarkup(row_width=1)
    keyboard.add(InlineKeyboardButton("Главное меню", callback_data="no_action"))
    await bot.edit_message_text(
    subscription_text,
    chat_id,
    callback_query.message.message_id,
    parse_mode="HTML",
    reply_markup=keyboard
    )
    return

    await bot.delete_message(chat_id, callback_query.message.message_id)
    await show_profile(callback_query)
     
    1. beta Автор темы
      n1s_01, ай брад спасибо но там проблема была в том что эта часть кода вообще не использовалась а блок подписок выводил subgram сервис а не мой код
Top
Загрузка...