Как оптимизировать по объему исходного кода бота-опросника на aiogram

Рейтинг: 0Ответов: 0Опубликовано: 20.04.2023

У меня есть бот, в 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)

Ответы

Ответов пока нет.