sunsexsurf

telebot_13_ver

Sep 26th, 2023
957
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.10 KB | None | 0 0
  1. import logging
  2. from telegram import ParseMode
  3.  
  4. # импорт расширений библиотеки
  5. from telegram.ext import (
  6.     Updater,
  7.     CommandHandler,
  8.     PollAnswerHandler,
  9.     PollHandler,
  10.     MessageHandler,
  11.     Filters,
  12. )
  13.  
  14. from config import API_TOKEN
  15.  
  16. # подключение логирования
  17. logging.basicConfig(
  18.     format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO
  19. )
  20. logger = logging.getLogger(__name__)
  21.  
  22. ### ОПРЕДЕЛЕНИЕ ФУНКЦИЙ ОБРАТНОГО ВЫЗОВА ###
  23.  
  24. def start(update, _):
  25.     """Информация о том, что может сделать этот бот"""
  26.     update.message.reply_text(
  27.         'Введите `/poll` для участия в опросе, `/quiz` для участия в викторине или `/preview`'
  28.         ' чтобы создать собственный опрос/викторину'
  29.     )
  30.  
  31. def poll(update, context):
  32.     """Отправка заранее подготовленного опроса"""
  33.     # Вопрос опроса и его ответы.
  34.  
  35.     questions = "Кто лучший?"
  36.     answer = ["Иванов", "Петров", "Сидоров", "Смирнов"]
  37.     total_a = ''
  38.     # Отправляем опрос в чат
  39.     message = context.bot.send_poll(
  40.         update.effective_chat.id, questions, answer,
  41.         is_anonymous=False, allows_multiple_answers=False,
  42.     )
  43.     # Сохраним информацию опроса в `bot_data` для последующего
  44.     # использования в функции `receive_poll_answer`
  45.     payload = { # ключом словаря с данными будет `id` опроса
  46.         message.poll.id: {
  47.             "questions": questions,
  48.             "message_id": message.message_id,
  49.             "chat_id": update.effective_chat.id,
  50.             "answers": 0,
  51.             "ans": answer,
  52.             "total_ans": total_a
  53.         }
  54.     }
  55.     # сохранение промежуточных результатов в `bot_data`
  56.     context.bot_data.update(payload)
  57.  
  58. def receive_poll_answer(update, context):
  59.     """Итоги опроса пользователей"""
  60.     answer = update.poll_answer
  61.     poll_id = answer.poll_id
  62.     try:
  63.         questions = context.bot_data[poll_id]["questions"]
  64.         ans_list = context.bot_data[poll_id]["ans"]
  65.         total_ans = context.bot_data[poll_id]["total_ans"]
  66.     except KeyError:  # Это ответ на старый опрос
  67.         return
  68.  
  69.     selected_options = answer.option_ids
  70.     answer_string = ans_list[selected_options[0]]
  71.  
  72.     total_ans = total_ans + answer_string + ' '
  73.  
  74.     context.bot.send_message(
  75.         context.bot_data[poll_id]["chat_id"],
  76.         f"Вы ответили => {answer_string}!",
  77.         parse_mode=ParseMode.HTML,
  78.     )
  79.     # изменение промежуточных результатов в `bot_data`
  80.     context.bot_data[poll_id]["answers"] += 1
  81.     # Закрываем опрос после того, как проголосовали 1 участник
  82.     if context.bot_data[poll_id]["answers"] == 1:
  83.         context.bot.stop_poll(
  84.             context.bot_data[poll_id]["chat_id"], context.bot_data[poll_id]["message_id"]
  85.         )
  86.  
  87.     a = ans_list
  88.     del a[selected_options[0]]
  89.  
  90.     if len(a) > 1:
  91.         # Отправляем опрос в чат
  92.         message = context.bot.send_poll(
  93.             context.bot_data[poll_id]["chat_id"], questions, a,
  94.             is_anonymous=False, allows_multiple_answers=False,
  95.         )
  96.         # Сохраним информацию опроса в `bot_data` для последующего
  97.         # использования в функции `receive_poll_answer`
  98.         payload = { # ключом словаря с данными будет `id` опроса
  99.             message.poll.id: {
  100.                 "questions": questions,
  101.                 "message_id": message.message_id,
  102.                 "chat_id": context.bot_data[poll_id]["chat_id"],
  103.                 "answers": 0,
  104.                 "ans": a,
  105.                 "total_ans": total_ans
  106.             }
  107.         }
  108.         # сохранение промежуточных результатов в `bot_data`
  109.         context.bot_data.update(payload)
  110.     else:
  111.         total_ans = total_ans + ' ' + a[0]
  112.         context.bot.send_message(
  113.             context.bot_data[poll_id]["chat_id"],
  114.             f"Вы завершили голосование! Результат: {total_ans}!",
  115.             parse_mode=ParseMode.HTML,
  116.         )
  117.  
  118. if __name__ == '__main__':
  119.     updater = Updater(API_TOKEN)
  120.     dispatcher = updater.dispatcher
  121.  
  122.     # определяем соответствующие обработчики
  123.     dispatcher.add_handler(CommandHandler('start', start))
  124.     # команда `/pool`
  125.     dispatcher.add_handler(CommandHandler('poll', poll))
  126.     # обработчик ответа на опрос
  127.     dispatcher.add_handler(PollAnswerHandler(receive_poll_answer))
  128.  
  129.     # Запуск бота
  130.     updater.start_polling()
  131.     updater.idle()
  132.  
Advertisement
Add Comment
Please, Sign In to add comment