Как реализовать создание заявки пользователем в боте ВК Python?

Суть бота такова: пользователь создает заявку, последовательно отвечая на вопросы, которые задает бот. Потом заявка отправляется на рассмотрение модератору и в итоге пользователь получает ответ( пока что это не реализовано). Чтобы это все реализовать была создана функция которая и создает данную заявку. Вопрос таков: есть ли другие способы реализовать заполнение заявки или мой код вполне себе ничего.
P.s. Не судите строго это мой первый проект в плане программирования. Хотелость бы реальных советов и адекватной критики. Заранее спасибо)

import vk_api
from vk_api import keyboard
from vk_api.longpoll import VkLongPoll, VkEventType 
from vk_api import VkUpload
from vk_api.utils import get_random_id
from vk_api.keyboard import VkKeyboard, VkKeyboardColor 

# \\\КЛАВИАТУРЫ
keyboard1 = VkKeyboard(one_time=True)
keyboard1.add_button('Создать заявку', color=VkKeyboardColor.POSITIVE)

keyboard2 = VkKeyboard(one_time=False)
keyboard2.add_button('Назад', color=VkKeyboardColor.SECONDARY)
keyboard2.add_button('Отменить', color=VkKeyboardColor.NEGATIVE)

keyboard3 = VkKeyboard(one_time=True)
keyboard3.add_button('Сохранить', color=VkKeyboardColor.POSITIVE)
keyboard3.add_line()
keyboard3.add_button('Назад', color=VkKeyboardColor.SECONDARY)
keyboard3.add_button('Отменить', color=VkKeyboardColor.NEGATIVE)

# \\\ФУНКЦИЯ ОТПРАВКИ СООБЩЕНИЯ
def write_message (sender, message):
    if i==1: 
        authorize.method('messages.send', {'user_id': sender, 'message':  message, 'random_id': get_random_id(), 'keyboard': keyboard1.get_keyboard()})
    elif i==2:
        authorize.method('messages.send', {'user_id': sender, 'message':  message, 'random_id': get_random_id(), 'keyboard': keyboard2.get_keyboard()})
    elif i==3:
        authorize.method('messages.send', {'user_id': sender, 'message':  message, 'random_id': get_random_id(), 'keyboard': keyboard3.get_keyboard()})

# \\\ФУНКЦИЯ СОЗДАНИЯ АНКЕТЫ 
def reg():
    global i
    questionnaire = []
    for event in longpoll.listen():  
        if event.type == VkEventType.MESSAGE_NEW and event.to_me:
            name_user = event.text
            sender = event.user_id
            if name_user == event.text and name_user != "Назад" and name_user != "Отменить":    
                write_message(sender, "Вы ввели имя: "+ name_user + "\nВведите Ваш возраст")
                questionnaire.append(name_user)
                for event in longpoll.listen():  
                    if event.type == VkEventType.MESSAGE_NEW and event.to_me:
                        year_user = event.text
                        sender = event.user_id
                        if year_user == event.text and year_user != "Назад" and year_user != 'Отменить': 
                            write_message(sender, "Вам "+ year_user + " лет\n С какого Вы города?")
                            questionnaire.append(year_user)
                            for event in longpoll.listen():  
                                if event.type == VkEventType.MESSAGE_NEW and event.to_me:
                                    city = event.text
                                    sender = event.user_id
                                    if city == event.text and city != "Назад" and city != "Отменить":
                                        write_message(sender, "Вы с г. "+ city + "\n" + "Заполните заявку, укажите все нужные Вам критерии")
                                        questionnaire.append(city)
                                        for event in longpoll.listen():
                                            if event.type == VkEventType.MESSAGE_NEW and event.to_me:
                                                text_user = event.text
                                                sender = event.user_id
                                                if text_user == event.text and text_user != "Назад" and text_user != "Отменить":
                                                    i=3
                                                    write_message(sender, "Ваша заявка: \n"+ name_user + " " + year_user + " " + city + "\n" + text_user)
                                                    questionnaire.append(text_user)
                                                    for event in longpoll.listen():
                                                        if event.type == VkEventType.MESSAGE_NEW and event.to_me:
                                                            end_user = event.text
                                                            sender = event.user_id
                                                            if end_user =="Сохранить" and end_user != "Назад" and end_user != "Отменить":
                                                                i=1
                                                                write_message(sender, "Вы успешно создали заявку")
                                                                return questionnaire
                                                            elif end_user =="Назад":
                                                                i=2
                                                                write_message(sender, "Измените текст заявки")
                                                                break
                                                            elif end_user =="Отменить":
                                                                i=1
                                                                write_message(sender, "Заявка отменена")
                                                                questionnaire = []
                                                                return questionnaire
                                                elif text_user == "Назад":
                                                    write_message(sender, "Измени свой город")
                                                    break
                                                elif text_user == "Отменить":
                                                    i=1
                                                    text_user = None
                                                    questionnaire = []
                                                    write_message(sender, "Заявка отменена")
                                                    return questionnaire
                                    elif city == "Назад":
                                        write_message(sender, "Измени свой возраст")
                                        break
                                    elif city == "Отменить":
                                        i=1
                                        city = None
                                        questionnaire = []
                                        write_message(sender, "Заявка отменена")
                                        return questionnaire
                        elif year_user == "Назад":
                            write_message(sender, "Введи имя заново")
                            break
                        elif year_user == "Отменить":
                            i=1
                            year_user = None
                            questionnaire = []
                            write_message(sender, "Заявка отменена")
                            return questionnaire
            elif name_user == "Назад":
                i=1
                name_user = None
                questionnaire = []
                write_message(sender, "Заявка отменена")
                return questionnaire
            elif name_user == "Отменить":
                i=1
                name_user = None
                questionnaire = []
                write_message(sender, "Заявка отменена")
                return questionnaire

# \\\АВТОРИЗАЦИЯ            
token = 'TOKEN'
authorize = vk_api.VkApi(token = token) 
longpoll = VkLongPoll(authorize)

# \\\ОСНОВНАЯ ЛОГИКА
for event in longpoll.listen():  
    if event.type == VkEventType.MESSAGE_NEW and event.to_me:
        reseived_message = event.text
        sender = event.user_id
        if reseived_message == "Создать заявку":
            i=2
            write_message(sender, "Как тебя зовут?")
            reg()
        elif reseived_message == event.text:
            i=1
            write_message(sender, "Напиши 'Создать заявку'")
  • Вопрос задан
  • 189 просмотров
Пригласить эксперта
Ответы на вопрос 2
SoreMix
@SoreMix Куратор тега Python
yellow
Хотелость бы реальных советов и адекватной критики


Зачем столько longpoll.listen ?
Среди диалога с одним пользователем, напишите от имени другого в ЛС группы.

Глобальные переменные, тем более в многопользовательском приложении, плохо

Сначала reseived_message = event.text, потом elif reseived_message == event.text. Зачем?

Клавиатуры растянуты имхо

Нейминг переменных странный. name_user != "Назад" Почему имя проверяется на "Назад"?. Нет таких имен, либо переменная может содержать что-то другое, вместо имени.

Бесполезная проверка, условие же будет выполняться всегда.
text_user = event.text
if text_user == event.text


Используйте для работы базы данных. На сколько я помню, в vk_api нет поддежки FSM, так что руками.
Ответ написан
HemulGM
@HemulGM Куратор тега Python
Delphi Developer, сис. админ
У вас проблемы с логикой. Всё в мгновение пойдёт по вульве как только напишет второй человек. А если будет больше, то каша будет просто у всех.

Для таких чат-ботов используется база данных. В которой хранится состояние каждого пользователя и для каждого отдельного пользователя будет по-разному происходить проверка условий в зависимости от последнего состояния (текущего шага).

Как только кто-то пишет. Идете в базу, забираете состояние текущего пользователя (текущий шаг) и реагируйте на его сообщение относительно текущего шага. И так для каждого сообщения.

Критика:
У вас ужасный, не понятный код. Куча вложенных условий. Магические строки, магические числа. Переменная city сравнивается со строкой "Назад". Как это логически вообще обосновать?
Глобальные переменные, ошибочное использование принципа работы бота: longpoll.listen() - это метод для одного глобального цикла
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы