Как лучше сделать рефакторинг большой функции?

Сделал викторину для бота, пользователь пишет команду и программа попадает в эту функцию:

    def iqmetr(self, chatid, sql, db, botname, last):  # last - время когда была вызвана функция
        points = []
        while True:
            a = random.randint(1, 50)
            b = random.randint(1, 50)
            c = a + b
            subclient.send_message(chatId=chatid, message=f"Сколько будет {a}+{b} ?\nУ тебя 30 секунд!")
            while time() - float(last[0]) < 30:
                    msg = subclient.get_chat_messages(chatId=chatid, size=5)
                    for message, messageId, messageType, mediaType, author, authorid in zip(
                            msg.content, msg.messageId,
                            msg.type, msg.mediaType,
                            msg.author.nickname,
                            msg.author.userId):
                        sql.execute("SELECT COUNT(messageid) FROM stats WHERE messageid=(?)",(messageId,))
                        for i in sql:
                            if i[0] == 0:  # Если сообщения нету в базе данных: добавить его
                                now = datetime.datetime.now()
                                sql.execute("INSERT INTO stats VALUES (?, ?, ?, ?)", (authorid, messageId, author, str(now.strftime("%d-%m-%Y"))))
                                db.commit()
                                if author != botname:
                                    if messageType == 0:
                                        if message.lower() == str(c):
                                            points.append(5)
                                            subclient.send_message(chatId=chatid, message="Правильно. +5 баллов")
                                            break
                                        elif message.lower() != str(c):
                                            subclient.send_message(chatId=chatid, replyTo=messageId, message="Нет")
                        else:
                            continue
                        break
                    else:
                        continue
                    break
            else:
                sum_points = sum((int(points[i]) for i in range(0, int(len(points)))))
                subclient.send_message(chatId=chatid, message=f"Время вышло! Ты заработал +{sum_points} points")
                return

Бот задает вопрос "[рандомное число]+[рандомное число]=?", и если ответ верный, происходит выход со вложенного цикла и вопрос задается по новой с новыми числами. И так на протяжении 30 секунд, после чего происходит выход с функции. Как можно улучшить этот код ?


Ответы (0 шт):