import logging
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import StatesGroup, State
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, ReplyKeyboardMarkup, KeyboardButton
from aiogram.contrib.fsm_storage.files import JSONStorage
from settings import API_TOKEN
logging.basicConfig(level=logging.DEBUG)
bot = Bot(token=API_TOKEN)
# storage = JSONStorage("states.json")
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
class StateMachine(StatesGroup):
questions_started = State()
questions = [
{
"text": "Вопрос1",
"answers": ["Вопрос1Ответ1", "Вопрос1Ответ2", "Вопрос1Ответ3", "Вопрос1Ответ4"]
},
{
"text": "Вопрос2",
"answers": ["Вопрос2Ответ1", "Вопрос2Ответ2", "Вопрос2Ответ3", "Вопрос2Ответ4"]
},
{
"text": "Вопрос3",
"answers": ["Вопрос3Ответ1", "Вопрос3Ответ2", "Вопрос3Ответ3", "Вопрос3Ответ4"]
},
]
def get_question_text_by_id(id):
return questions[id].get("text")
def generate_answers_markup_by_id(id):
markup = InlineKeyboardMarkup()
for i in range(len(questions[id].get("answers"))):
answer_text = questions[id].get("answers")[i]
markup.add(InlineKeyboardButton(answer_text, callback_data=f"answer_{i}"))
return markup
@dp.message_handler(commands=['start', 'help'], state="*")
async def send_welcome(message: types.Message):
markup = ReplyKeyboardMarkup().add(
KeyboardButton("Начать"),
KeyboardButton("Позже"),
)
await message.reply("Здравствуйте! Я предлагаю вам пройти опрос!", reply_markup=markup)
logging.info(f"{message.from_user.username}: {message.text}")
@dp.message_handler(text='Начать', state="*")
async def start_questions(message: types.Message, state: FSMContext):
await StateMachine.questions_started.set()
async with state.proxy() as data:
data["current_question"] = 0
data["answers"] = []
await message.answer(get_question_text_by_id(0), reply_markup=generate_answers_markup_by_id(0))
@dp.callback_query_handler(text_startswith="answer_", state=StateMachine.questions_started)
async def but_pressed(call: types.CallbackQuery, state: FSMContext):
answer = int(call.data.split('_')[1])
await call.message.edit_reply_markup(InlineKeyboardMarkup())
async with state.proxy() as data:
data["current_question"] += 1
current_question = data["current_question"]
data["answers"].append(answer)
await call.message.answer(get_question_text_by_id(current_question), reply_markup=generate_answers_markup_by_id(current_question))
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Comments