Как оптимизировать по объему исходного кода бота-опросника на aiogram
У меня есть бот, в 500 строк, там 10 вопросов, пока что вопросы не готовы, как можно бы сократить кол-во строк не меняя его функций, и не используя других питон файлов, в основном код - копипаст.
from aiogram import types, Bot, Dispatcher, executor
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup, ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove
from aiogram.dispatcher import FSMContext
from aiogram.types import CallbackQuery
storage = MemoryStorage()
bot = Bot("token")
dp = Dispatcher(bot=bot, storage=storage)
ikb1 = InlineKeyboardMarkup(row_width=2)
ib1 = InlineKeyboardButton(text='1️⃣', callback_data='false')
ib2 = InlineKeyboardButton(text='2️⃣', callback_data='false')
ib3 = InlineKeyboardButton(text='3️⃣', callback_data='true')
ib4 = InlineKeyboardButton(text='4️⃣', callback_data='false')
ikb1.add(ib1, ib2, ib3, ib4)
# 3
ikb2 = InlineKeyboardMarkup(row_width=2)
ib1 = InlineKeyboardButton(text='1️⃣', callback_data='true')
ib2 = InlineKeyboardButton(text='2️⃣', callback_data='false')
ib3 = InlineKeyboardButton(text='3️⃣', callback_data='false')
ib4 = InlineKeyboardButton(text='4️⃣', callback_data='false')
ikb2.add(ib1, ib2, ib3, ib4)
# 1
ikb3 = InlineKeyboardMarkup(row_width=2)
ib1 = InlineKeyboardButton(text='1️⃣', callback_data='false')
ib2 = InlineKeyboardButton(text='2️⃣', callback_data='false')
ib3 = InlineKeyboardButton(text='3️⃣', callback_data='false')
ib4 = InlineKeyboardButton(text='4️⃣', callback_data='true')
ikb3.add(ib1, ib2, ib3, ib4)
# 4
ikb4 = InlineKeyboardMarkup(row_width=2)
ib1 = InlineKeyboardButton(text='1️⃣', callback_data='false')
ib2 = InlineKeyboardButton(text='2️⃣', callback_data='false')
ib3 = InlineKeyboardButton(text='3️⃣', callback_data='false')
ib4 = InlineKeyboardButton(text='4️⃣', callback_data='true')
ikb4.add(ib1, ib2, ib3, ib4)
# 4
ikb5 = InlineKeyboardMarkup(row_width=2)
ib1 = InlineKeyboardButton(text='1️⃣', callback_data='false')
ib2 = InlineKeyboardButton(text='2️⃣', callback_data='true')
ib3 = InlineKeyboardButton(text='3️⃣', callback_data='false')
ib4 = InlineKeyboardButton(text='4️⃣', callback_data='false')
ikb5.add(ib1, ib2, ib3, ib4)
# 2
ikb6 = InlineKeyboardMarkup(row_width=2)
ib1 = InlineKeyboardButton(text='1️⃣', callback_data='true')
ib2 = InlineKeyboardButton(text='2️⃣', callback_data='false')
ib3 = InlineKeyboardButton(text='3️⃣', callback_data='false')
ib4 = InlineKeyboardButton(text='4️⃣', callback_data='false')
ikb6.add(ib1, ib2, ib3, ib4)
# 1
ikb7 = InlineKeyboardMarkup(row_width=2)
ib1 = InlineKeyboardButton(text='1️⃣', callback_data='false')
ib2 = InlineKeyboardButton(text='2️⃣', callback_data='false')
ib3 = InlineKeyboardButton(text='3️⃣', callback_data='true')
ib4 = InlineKeyboardButton(text='4️⃣', callback_data='false')
ikb7.add(ib1, ib2, ib3, ib4)
# 3
ikb8 = InlineKeyboardMarkup(row_width=2)
ib1 = InlineKeyboardButton(text='1️⃣', callback_data='false')
ib2 = InlineKeyboardButton(text='2️⃣', callback_data='false')
ib3 = InlineKeyboardButton(text='3️⃣', callback_data='true')
ib4 = InlineKeyboardButton(text='4️⃣', callback_data='false')
ikb8.add(ib1, ib2, ib3, ib4)
# 3
ikb9 = InlineKeyboardMarkup(row_width=2)
ib1 = InlineKeyboardButton(text='1️⃣', callback_data='false')
ib2 = InlineKeyboardButton(text='2️⃣', callback_data='true')
ib3 = InlineKeyboardButton(text='3️⃣', callback_data='false')
ib4 = InlineKeyboardButton(text='4️⃣', callback_data='false')
ikb9.add(ib1, ib2, ib3, ib4)
# 2
ikb10 = InlineKeyboardMarkup(row_width=2)
ib1 = InlineKeyboardButton(text='1️⃣', callback_data='false')
ib2 = InlineKeyboardButton(text='2️⃣', callback_data='false')
ib3 = InlineKeyboardButton(text='3️⃣', callback_data='false')
ib4 = InlineKeyboardButton(text='4️⃣', callback_data='true')
ikb10.add(ib1, ib2, ib3, ib4)
# 4
qa_one = '''
1) Вопрос
1. Ответ
2. Ответ
3. Ответ
4. Ответ
'''
# 3
qa_two = '''
2) Вопрос
1. Ответ
2. Ответ
3. Ответ
4. Ответ
'''
# 1
qa_three = '''
3) Вопрос
1. Ответ
2. Ответ
3. Ответ
4. Ответ
'''
# 4
qa_four = '''
4) Вопрос
1. Ответ
2. Ответ
3. Ответ
4. Ответ
'''
# 4
qa_five = '''
5) Вопрос
1. Ответ
2. Ответ
3. Ответ
4. Ответ
'''
# 2
qa_six = '''
6) Вопрос
1. Ответ
2. Ответ
3. Ответ
4. Ответ
'''
# 1
qa_seven = '''
7) Вопрос
1. Ответ
2. Ответ
3. Ответ
4. Ответ
'''
# 3
qa_eight = '''
8) Вопрос
1. Ответ
2. Ответ
3. Ответ
4. Ответ
'''
# 3
qa_nine = '''
9) Вопрос
1. Ответ
2. Ответ
3. Ответ
4. Ответ
'''
# 2
qa_ten = '''
10) Вопрос
1. Ответ
2. Ответ
3. Ответ
4. Ответ
'''
# 4
def get_cancel() -> ReplyKeyboardMarkup:
kb = ReplyKeyboardMarkup(resize_keyboard=True)
kb.add(KeyboardButton('/cancel'))
return kb
i = 0
class StateTest(StatesGroup):
name = State()
q_one = State()
q_two = State()
cb = State()
q_three = State()
cb_2 = State()
q_four = State()
cb_3 = State()
q_five = State()
cb_4 = State()
q_six = State()
cb_5 = State()
q_seven = State()
cb_6 = State()
q_eight = State()
cb_7 = State()
q_nine = State()
cb_8 = State()
q_ten = State()
cb_9 = State()
finish = State()
@dp.message_handler(commands=['start'])
async def start_cmd(message: types.Message):
await message.answer('Привет! Напиши в чат "/test" что-бы начать тест.')
@dp.message_handler(commands=['test'])
async def name_cmd(message: types.Message):
await message.answer('Напиши свое имя.', reply_markup=get_cancel())
await StateTest.name.set()
@dp.message_handler(commands=['cancel'], state='*')
async def cmd_cancel(message: types.Message, state: FSMContext):
if state is None:
return
await state.finish()
await message.reply('Тест прерван.',
reply_markup=ReplyKeyboardRemove())
@dp.message_handler(lambda message: not message.text or len(message.text) <= 3, state=StateTest.name)
async def check_name(message: types.Message) -> None:
await message.reply('Не верный формат имени!')
@dp.message_handler(state=StateTest.name)
async def q_one(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['name'] = message.text
await message.answer('Ответь на вопрос:')
await message.answer(qa_one,
reply_markup=ikb1)
await StateTest.next()
@dp.callback_query_handler(state=StateTest.q_one)
async def vote_callback(callback: types.CallbackQuery):
if callback.data == 'true':
global i
await callback.answer(text='Верно!')
i += 1
print(i)
await callback.message.edit_text(callback.message.text+'\n\nЧто-бы продолжить тест, отправьте любую букву')
return await StateTest.next()
await callback.answer(text='Неверно!')
await callback.message.edit_text(callback.message.text+'\n\nЧто-бы продолжить тест, отправьте любую букву')
await StateTest.next()
@dp.message_handler(state=StateTest.q_two)
async def q_two(message: types.Message):
await message.answer('Следующий вопрос:')
await message.answer(qa_two,
reply_markup=ikb2)
await StateTest.next()
@dp.callback_query_handler(state=StateTest.cb)
async def vote_callback_1(callback: types.CallbackQuery):
if callback.data == 'true':
global i
await callback.answer(text='Верно!')
i += 1
await callback.message.edit_text(callback.message.text+'\n\nЧто-бы продолжить тест, отправьте любую букву')
return await StateTest.next()
await callback.answer(text='Неверно!')
await callback.message.edit_text(callback.message.text+'\n\nЧто-бы продолжить тест, отправьте любую букву')
await StateTest.next()
@dp.message_handler(state=StateTest.q_three)
async def q_three(message: types.Message):
await message.answer('Следующий вопрос:')
await message.answer(qa_three,
reply_markup=ikb3)
await StateTest.next()
@dp.callback_query_handler(state=StateTest.cb_2)
async def vote_callback_2(callback: types.CallbackQuery):
if callback.data == 'true':
global i
await callback.answer(text='Верно!')
i += 1
await callback.message.edit_text(callback.message.text+'\n\nЧто-бы продолжить тест, отправьте любую букву')
return await StateTest.next()
await callback.answer(text='Неверно!')
await callback.message.edit_text(callback.message.text+'\n\nЧто-бы продолжить тест, отправьте любую букву')
await StateTest.next()
@dp.message_handler(state=StateTest.q_four)
async def q_four(message: types.Message):
await message.answer('Следующий вопрос:')
await message.answer(qa_four,
reply_markup=ikb4)
await StateTest.next()
@dp.callback_query_handler(state=StateTest.cb_3)
async def vote_callback_3(callback: types.CallbackQuery):
if callback.data == 'true':
global i
await callback.answer(text='Верно!')
i += 1
await callback.message.edit_text(callback.message.text + '\n\nЧто-бы продолжить тест, отправьте любую букву')
return await StateTest.next()
await callback.answer(text='Неверно!')
await callback.message.edit_text(callback.message.text + '\n\nЧто-бы продолжить тест, отправьте любую букву')
await StateTest.next()
@dp.message_handler(state=StateTest.q_five)
async def q_five(message: types.Message):
await message.answer('Следующий вопрос:')
await message.answer(qa_five,
reply_markup=ikb5)
await StateTest.next()
@dp.callback_query_handler(state=StateTest.cb_4)
async def vote_callback_4(callback: types.CallbackQuery):
if callback.data == 'true':
global i
await callback.answer(text='Верно!')
i += 1
await callback.message.edit_text(callback.message.text + '\n\nЧто-бы продолжить тест, отправьте любую букву')
return await StateTest.next()
await callback.answer(text='Неверно!')
await callback.message.edit_text(callback.message.text + '\n\nЧто-бы продолжить тест, отправьте любую букву')
await StateTest.next()
@dp.message_handler(state=StateTest.q_six)
async def q_six(message: types.Message):
await message.answer('Следующий вопрос:')
await message.answer(qa_six,
reply_markup=ikb6)
await StateTest.next()
@dp.callback_query_handler(state=StateTest.cb_5)
async def vote_callback_5(callback: types.CallbackQuery):
if callback.data == 'true':
global i
await callback.answer(text='Верно!')
i += 1
await callback.message.edit_text(callback.message.text + '\n\nЧто-бы продолжить тест, отправьте любую букву')
return await StateTest.next()
await callback.answer(text='Неверно!')
await callback.message.edit_text(callback.message.text + '\n\nЧто-бы продолжить тест, отправьте любую букву')
await StateTest.next()
@dp.message_handler(state=StateTest.q_seven)
async def q_seven(message: types.Message):
await message.answer('Следующий вопрос:')
await message.answer(qa_seven,
reply_markup=ikb7)
await StateTest.next()
@dp.callback_query_handler(state=StateTest.cb_6)
async def vote_callback_6(callback: types.CallbackQuery):
if callback.data == 'true':
global i
await callback.answer(text='Верно!')
i += 1
await callback.message.edit_text(callback.message.text + '\n\nЧто-бы продолжить тест, отправьте любую букву')
return await StateTest.next()
await callback.answer(text='Неверно!')
await callback.message.edit_text(callback.message.text + '\n\nЧто-бы продолжить тест, отправьте любую букву')
await StateTest.next()
@dp.message_handler(state=StateTest.q_eight)
async def q_eight(message: types.Message):
await message.answer('Следующий вопрос:')
await message.answer(qa_eight,
reply_markup=ikb8)
await StateTest.next()
@dp.callback_query_handler(state=StateTest.cb_7)
async def vote_callback_7(callback: types.CallbackQuery):
if callback.data == 'true':
global i
await callback.answer(text='Верно!')
i += 1
await callback.message.edit_text(callback.message.text + '\n\nЧто-бы продолжить тест, отправьте любую букву')
return await StateTest.next()
await callback.answer(text='Неверно!')
await callback.message.edit_text(callback.message.text + '\n\nЧто-бы продолжить тест, отправьте любую букву')
await StateTest.next()
@dp.message_handler(state=StateTest.q_nine)
async def q_nine(message: types.Message):
await message.answer('Следующий вопрос:')
await message.answer(qa_nine,
reply_markup=ikb9)
await StateTest.next()
@dp.callback_query_handler(state=StateTest.cb_8)
async def vote_callback_8(callback: types.CallbackQuery):
if callback.data == 'true':
global i
await callback.answer(text='Верно!')
i += 1
await callback.message.edit_text(callback.message.text + '\n\nЧто-бы продолжить тест, отправьте любую букву')
return await StateTest.next()
await callback.answer(text='Неверно!')
await callback.message.edit_text(callback.message.text + '\n\nЧто-бы продолжить тест, отправьте любую букву')
await StateTest.next()
@dp.message_handler(state=StateTest.q_ten)
async def q_ten(message: types.Message):
await message.answer('Следующий вопрос:')
await message.answer(qa_ten,
reply_markup=ikb10)
await StateTest.next()
@dp.callback_query_handler(state=StateTest.cb_9)
async def vote_callback_9(callback: types.CallbackQuery):
if callback.data == 'true':
global i
await callback.answer(text='Верно!')
i += 1
await callback.message.edit_text(callback.message.text + '\n\nЧто-бы продолжить тест, отправьте любую букву')
return await StateTest.next()
await callback.answer(text='Неверно!')
await callback.message.edit_text(callback.message.text + '\n\nЧто-бы продолжить тест, отправьте любую букву')
await StateTest.next()
@dp.message_handler(state=StateTest.finish)
async def finish_cmd(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['ball'] = i
if i >= 5:
async with state.proxy() as data:
await message.answer(f"Поздравляю {data['name']} ты получил {i} баллов 😊!")
else:
async with state.proxy() as data:
await message.answer(f'{data["name"]} ты получил {i} балл(а) 😔.')
await state.finish()
if __name__ == "__main__":
executor.start_polling(dp, skip_updates=True)
Источник: Stack Overflow на русском