def take_this_nomber(message): # Если пользователь нажал согласился предоставить свой телефон pn = message.contact.phone_number dbworker.set_order_state(message.chat.id, 'Phone', pn) # Вносит занчение контактной телефона Other_Function.delete_message(config.token, message.chat.id, message.message_id - 1) # удаляет лишнии сообщения бота # Если данная функция срабатывает при редактировании элемента, то пеосле переводит на стадию подтверждения корректности заявки # Понимание работы в режиме редактирования происходит за счет значения Choose Edit словаря if dbworker.get_order_state(message.chat.id, 'Choose Edit') == 'ET_CL': Other_Function.user_current_reply(message) # Переводит на стадию подтверждения корректности заявки с измененным элементом dbworker.set_order_state(message.chat.id, 'Choose Edit', '') # Обнуляет служебное значение return dbworker.set_state(message.chat.id, config.States.S_TICKET.value) # Изменяет стадию работы бота с клиентом msg = bot.send_message(message.chat.id, "Опишите вопрос") bot.register_next_step_handler(msg, user_entering_tiket)
def user_entering_contact_name(message): # Функция обработки контактного лица и выбора типа обратной связи Other_Function.delete_message(config.token, message.chat.id, message.message_id - 1) # удаляет лишнии сообщения бота dbworker.set_order_state(message.chat.id, 'Contact Name', message.text) # Вносит занчение контактного лица # Если данная функция срабатывает при редактировании элемента, то пеосле переводит на стадию подтверждения корректности заявки # Понимание работы в режиме редактирования происходит за счет значения Choose Edit словаря if dbworker.get_order_state(message.chat.id, 'Choose Edit') == 'ET_CoN': Other_Function.user_current_reply(message) # Переводит на стадию подтверждения корректности заявки с измененным элементом dbworker.set_order_state(message.chat.id, 'Choose Edit', '') # Обнуляет служебное значение return keyboard = types.InlineKeyboardMarkup() callback_button_EM = types.InlineKeyboardButton(text="E-mail", callback_data="CCC_Em") # Кнопка обратной связи через электронную почту callback_button_PH = types.InlineKeyboardButton(text="Телефон", callback_data="CCC_Ph") # Кнопка обратной связи по телефону callback_button_TG = types.InlineKeyboardButton(text="Telegram", callback_data="CCC_Tg") # Кнопка обратной связи через Telegram keyboard.add(callback_button_EM, callback_button_PH, callback_button_TG) bot.send_message(message.chat.id, "Как с Вами связаться?", reply_markup=keyboard) dbworker.set_state(message.chat.id, config.States.S_CHOOSE_CONTACT_CHANAL.value) # Изменяет стадию работы бота с клиентом
def user_entering_contact_email(message): Other_Function.delete_message(config.token, message.chat.id, message.message_id - 1) # удаляет лишнии сообщения бота if '@' in message.text and '.' in message.text: # Значение электронной почты подразумевает наличие знаков @ и . dbworker.set_order_state(message.chat.id, 'E-mail', message.text) # Вносит занчение контактной электронной почты bot.send_message(message.chat.id, "Опишите вопрос") dbworker.set_state(message.chat.id, config.States.S_TICKET.value) # Изменяет стадию работы бота с клиентом else: bot.send_message(message.chat.id, "Что-то пошло не так, попробуйте еще раз ввести адресс электронной почты") # Посылает сообщение о не соответсвии введенных данных необходимогу типу return # Если данная функция срабатывает при редактировании элемента, то пеосле переводит на стадию подтверждения корректности заявки # Понимание работы в режиме редактирования происходит за счет значения Choose Edit словаря if dbworker.get_order_state(message.chat.id, 'Choose Edit') == 'ET_CL': Other_Function.user_current_reply(message) # Переводит на стадию подтверждения корректности заявки с измененным элементом dbworker.set_order_state(message.chat.id, 'Choose Edit', '') # Обнуляет служебное значение return
def user_choose_support_line(message, msg_text): Other_Function.delete_message(config.token, message.chat.id, message.message_id) # удаляет лишнии сообщения бота dbworker.set_order_state(message.chat.id, 'SupLine', msg_text) # вносит занчение выбранной линии поддержки keyboard = types.InlineKeyboardMarkup() callback_button_1 = types.InlineKeyboardButton(text="Менее 10", callback_data="CS_1") # Кнопка для значения размера компании < 10 callback_button_2 = types.InlineKeyboardButton(text="От 10 до 100", callback_data="CS_2") # Кнопка для значения размера компании < 100 callback_button_3 = types.InlineKeyboardButton(text="От 100 до 1000", callback_data="CS_3") # Кнопка для значения размера компании < 1000 callback_button_4 = types.InlineKeyboardButton(text="Более 1000", callback_data="CS_4") # Кнопка для значения размера компании > 1000 keyboard.add(callback_button_1, callback_button_2, callback_button_3, callback_button_4) bot.send_message(message.chat.id, "Укажите размер компании", reply_markup=keyboard) # Выводим вопрос и клавиатуру dbworker.set_state(message.chat.id, config.States.S_ENTER_COMPANY_SIZE.value) # Изменяет стадию работы бота с клиентом
def user_choose_company_size(message, msg_text): Other_Function.delete_message(config.token, message.chat.id, message.message_id) # удаляет лишнии сообщения бота dbworker.set_order_state(message.chat.id, 'Company Size', msg_text) # Вносит занчение выбранного размера компании bot.send_message(message.chat.id, "Укажите название компании") dbworker.set_state(message.chat.id, config.States.S_ENTER_COMPANY_NAME.value) # Изменяет стадию работы бота с клиентом
def order_start(message): # По команде /start будем заново начинаться диалог dbworker.set_order_state(message.chat.id, 'ChatID', message.chat.id) # Вносит занчение id чата в котором Клиент формирует заявку keyboard = Other_Function.start_messege() # Кнопки для клавиатуры получаются из функции start_messege bot.send_message(message.chat.id, "Привет! В какой области требуется поддержка?", reply_markup=keyboard) dbworker.set_state(message.chat.id, config.States.S_SUPPORT_LINE.value) # Изменяет стадию работы бота с клиентом
def cmd_reset(message): # По команде /reset будем сбрасывать состояния, возвращаясь к началу диалога Other_Function.delete_message(config.token, message.chat.id, message.message_id) # удаляет лишнии сообщения бота dbworker.set_order_state(message.chat.id, 'ChatID', message.chat.id) # Вносит занчение id чата в котором Клиент формирует заявку keyboard = Other_Function.send_message() # Кнопки для клавиатуры получаются из функции start_messege bot.send_message(message.chat.id, "Что ж, начнём по-новой. В какой области требуется поддержка?", reply_markup=keyboard) dbworker.set_state(message.chat.id, config.States.S_SUPPORT_LINE.value) # Изменяет стадию работы бота с клиентом
def user_entering_tiket(message): # Функция обрабатывет текст заявки и переводит к подтверждению корректности составленной заявки Other_Function.delete_message(config.token, message.chat.id, message.message_id - 1) # удаляет лишнии сообщения бота dbworker.set_order_state(message.chat.id, 'Ticket', message.text) # Вносит занчение теста заявки # Если значение Choose Edit не пустое, то оно обнуляется if not dbworker.get_order_state(message.chat.id, 'Choose Edit') == '': dbworker.set_order_state(message.chat.id, 'Choose Edit', '') Other_Function.user_current_reply(message) # Переводит к подтверждению корректности составленной заявки
def sup_to_client(message): try: main.set_client(message.text) dbworker.set_order_state(message.chat.id, 'client_id', message.text) bot.send_message( message.chat.id, "ВНИМАНИЕ!\n\nВсе отправленные сообщения будут пересылаться клиенту. Будьте внимательны!\nДля завершения используйте комманду /stop" ) dbworker.set_state(message.chat.id, config.States.F_SUPPORT_CLIENT.value) except: print(' === ' + ' ERROR IN sup_to_client' + ' === ' + str(message.chat.id))
def user_entering_company_name(message): # Фукция обработки названия компании и запроса контактного лица Other_Function.delete_message(config.token, message.chat.id, message.message_id - 1) # удаляет лишнии сообщения бота dbworker.set_order_state(message.chat.id, 'Name Company', message.text) # Вносит занчение названия компании # Если данная функция срабатывает при редактировании элемента, то пеосле переводит на стадию подтверждения корректности заявки # Понимание работы в режиме редактирования происходит за счет значения Choose Edit словаря if dbworker.get_order_state(message.chat.id, 'ChatID') == 'ET_CmN': Other_Function.user_current_reply(message) # Переводит на стадию подтверждения корректности заявки с измененным элементом dbworker.set_order_state(message.chat.id, 'Choose Edit', '') # Обнуляет служебное значение return # Обрывает работу функции bot.send_message(message.chat.id, "Укажите контактное лицо") dbworker.set_state(message.chat.id, config.States.S_ENTER_CONTACT_NAME.value) # Изменяет стадию работы бота с клиентом
def user_entering_contact_phone(message): # Функция обрабатывает контактный телефон и переводит к получения текста заявки Other_Function.delete_message(config.token, message.chat.id, message.message_id - 1) # удаляет лишнии сообщения бота # Если перешло сюда, после попатки автоматического получения телефона if message.text == "Использовать другой": bot.send_message(message.chat.id, "Введите номер без '+7'") return if not message.text.isdigit(): # Номер телефона должен состоять только из цифр (!) bot.send_message(message.chat.id, "Что-то не так, попробуй ещё раз!\nНомер телефона должен состоять только из цифр.") return dbworker.set_order_state(message.chat.id, 'Phone', message.text) # Вносит занчение контактной телефона # Если данная функция срабатывает при редактировании элемента, то пеосле переводит на стадию подтверждения корректности заявки # Понимание работы в режиме редактирования происходит за счет значения Choose Edit словаря if dbworker.get_order_state(message.chat.id, 'Choose Edit') == 'ET_CL': Other_Function.user_current_reply(message) # Переводит на стадию подтверждения корректности заявки с измененным элементом dbworker.set_order_state(message.chat.id, 'Choose Edit', '') # Обнуляет служебное значение return bot.send_message(message.chat.id, "Опишите вопрос") dbworker.set_state(message.chat.id, config.States.S_TICKET.value) # Изменяет стадию работы бота с клиентом
def callback_inline(call): # По факту реагирует на inline buttons if call.message: message = call.message # чтобы не заебываться и писать как во всем остальном коде # для входа оператора поддержки if call.data == 'login': bot.send_message(message.chat.id, "Введите личный пароль") dbworker.set_state(message.chat.id, config.States.F_SUPPORT_LOGIN.value) # для выбора кому оператор будет писать elif call.data == 'toClient': if dbworker.get_current_state(message.chat.id) == config.States.F_SUPPORT_ON.value: # проверяем что пишет авторизованный пользователь bot.send_message(message.chat.id, "Введите ID клиента") dbworker.set_state(message.chat.id, config.States.F_SUPPORT_SET.value) else: bot.send_message(message.chat.id, "У Вас нет доступа!") else: if message: # Утверждаемся что словили то что надо if 'ET_' in dbworker.get_order_state(message.chat.id, 'Choose Edit') and not "CCC_" in call.data: # Проверяем редактируется ли сейчас заявка getOrders.Other_Function.delete_message(config.token, message.chat.id, message.message_id) if dbworker.get_order_state(message.chat.id, 'Choose Edit') == "ET_SPL": # Обрабатываем редактирование линии поддержки if call.data == "SPL_IB": msg = "Информационная безопасность" elif call.data == "SPL_BD": msg = "Базы данных" elif call.data == "SPL_C": msg = "Облачные системы" elif call.data == "SPL_O": msg = "Другое" dbworker.set_order_state(message.chat.id, 'SupLine', msg) # Изменяем значение линии поддержки getOrders.Other_Function.user_current_reply(message) # Спрашиваем пользователя все ли теперь верно dbworker.set_order_state(message.chat.id, 'Choose Edit', '') # чистим служебное значение elif dbworker.get_order_state(message.chat.id, 'Choose Edit') == "ET_CS": if call.data == "CS_1": msg = "Менее 10" elif call.data == "CS_2": msg = "От 10 до 100" elif call.data == "CS_3": msg = "От 100 до 1000" elif call.data == "CS_4": msg = "Более 1000" dbworker.set_order_state(message.chat.id, 'Company Size', msg) # Изменяем значение размера компании getOrders.Other_Function.user_current_reply(message) # Спрашиваем пользователя все ли теперь верно dbworker.set_order_state(message.chat.id, 'Choose Edit', '') # чистим служебное значение elif dbworker.get_order_state(message.chat.id, 'Choose Edit') == "ET_CL": # Иключение для изменения линии обратной связи pass elif "SPL_" in str(call.data): # Обрабатываем выбранное значение линии поддержки if call.data == "SPL_IB": msg = "Информационная безопасность" elif call.data == "SPL_BD": msg = "Базы данных" elif call.data == "SPL_C": msg = "Облачные системы" elif call.data == "SPL_O": msg = "Другое" getOrders.Button_Function.user_choose_support_line(message, msg) # Переходим к слудующей стадии elif "CS_" in call.data: # Обрабатываем выбранное значение размера компании if call.data == "CS_1": msg = "Менее 10" elif call.data == "CS_2": msg = "От 10 до 100" elif call.data == "CS_3": msg = "От 100 до 1000" elif call.data == "CS_4": msg = "Более 1000" getOrders.Button_Function.user_choose_company_size(message, msg) # Переходим к слудующей стадии elif "CCC_" in call.data: # Обрабатываем выбранное значение типа обратной связи if call.data == "CCC_Em": msg = "EMAIL" elif call.data == "CCC_Ph": msg = "PHONE" elif call.data == "CCC_Tg": msg = "TG" else: pass getOrders.Button_Function.user_choose_contact_chanal(message, msg) # Переходим к слудующей стадии elif "UC_" in call.data: # Обрабатываем выбранное значение согласия Клиента с составленной заявкий if call.data == "UC_Y": msg = "YES" elif call.data == "UC_N": msg = "NO" getOrders.Button_Function.user_current(message, msg) # Переходим к слудующей стадии elif "CE_" in call.data: # Обрабатываем выбранное значение выбранного элемента для изменения getOrders.Other_Function.delete_message(config.token, message.chat.id, message.message_id + 1) # удаляет лишнии сообщения бота getOrders.Other_Function.delete_message(config.token, message.chat.id, message.message_id) if call.data == "CE_SPL": # Действия для изменения линии поддержки msg = "ET_SPL" keyboard = getOrders.Other_Function.send_message() bot.send_message(message.chat.id, "В какой области требуется поддержка?", reply_markup=keyboard) elif call.data == "CE_CS": # Действия для изменения размера компании msg = "ET_CS" keyboard = types.InlineKeyboardMarkup() callback_button_1 = types.InlineKeyboardButton(text="Менее 10", callback_data="CS_1") # Кнопка для значения размера компании < 10 callback_button_2 = types.InlineKeyboardButton(text="От 10 до 100", callback_data="CS_2") # Кнопка для значения размера компании < 100 callback_button_3 = types.InlineKeyboardButton(text="От 100 до 1000", callback_data="CS_3") # Кнопка для значения размера компании < 1000 callback_button_4 = types.InlineKeyboardButton(text="Более 1000", callback_data="CS_4") # Кнопка для значения размера компании > 1000 keyboard.add(callback_button_1, callback_button_2, callback_button_3, callback_button_4) bot.send_message(message.chat.id, "Укажите размер компании", reply_markup=keyboard) elif call.data == "CE_CmN": # Действия для изменения названия компании msg = "ET_CmN" bot.send_message(message.chat.id, "Укажите название компании") dbworker.set_state(message.chat.id, config.States.S_ENTER_COMPANY_NAME.value) # Изменяет стадию работы бота с клиентом elif call.data == "CE_CoN": # Действия для изменения контактного лица msg = "ET_CoN" bot.send_message(message.chat.id, "Укажите контактное лицо") dbworker.set_state(message.chat.id, config.States.S_ENTER_CONTACT_NAME.value) # Изменяет стадию работы бота с клиентом elif call.data == "CE_CL": # Действия для изменения типа обратной связи msg = "ET_CL" keyboard = types.InlineKeyboardMarkup() callback_button_EM = types.InlineKeyboardButton(text="E-mail", callback_data="CCC_Em") # Кнопка обратной связи через электронную почту callback_button_PH = types.InlineKeyboardButton(text="Телефон", callback_data="CCC_Ph") # Кнопка обратной связи по телефону callback_button_TG = types.InlineKeyboardButton(text="Telegram", callback_data="CCC_Tg") # Кнопка обратной связи через Telegram keyboard.add(callback_button_EM, callback_button_PH, callback_button_TG) bot.send_message(message.chat.id, "Как с Вами связаться?", reply_markup=keyboard) elif call.data == "CE_TK": # Действия для изменения текста заявки msg = "ET_TK" bot.send_message(message.chat.id, "Опишите вопрос") dbworker.set_state(message.chat.id, config.States.S_TICKET.value) dbworker.set_order_state(message.chat.id, 'Choose Edit', msg) # Вносим служебно значение elif "SP_" in call.data: # колбеки от кнопок операторов поддержки if call.data == 'SP_Y': # заявка отправлена оператору по ИБ msg = message.text getOrders.Other_Function.delete_message(config.token, message.chat.id, message.message_id) bot.send_message(config.ulahin, msg) bot.send_message(config.channel_id, msg + '\n\nЗаявка направлена ' + ' Уляхин А.') if call.data == 'SP_D': # заявка отправлена оператору по Cloud msg = message.text getOrders.Other_Function.delete_message(config.token, message.chat.id, message.message_id) bot.send_message(config.dariy, msg) bot.send_message(config.channel_id, msg + '\n\nЗаявка направлена ' + 'Дарий В.') if call.data == 'SP_V': # заявка отправлена оператору по БД msg = message.text getOrders.Other_Function.delete_message(config.token, message.chat.id, message.message_id) bot.send_message(config.volihina, msg) bot.send_message(config.channel_id, msg + '\n\nЗаявка направлена ' + 'Волыхина М.') if call.data == 'SP_CY': # оператор принял заявку msg = message.text getOrders.Other_Function.delete_message(config.token, message.chat.id, message.message_id) bot.send_message(message.chat.id, msg + '\n________\nПринято!') bot.send_message(config.channel_id, msg + '\nЗаявка принял(а) ' + config.support_name(message.chat.id)) # дублируем в общий канал, чтобы все видели и гордились if call.data == 'SP_RE': # оператор отклонил заявку msg = message.text getOrders.Other_Function.delete_message(config.token, message.chat.id, message.message_id) bot.send_message(message.chat.id, 'Заявка отклонена!') keyboard = types.InlineKeyboardMarkup() callback_button_SP = types.InlineKeyboardButton(text="Уляхин А.", callback_data="SP_Y") #Support first yes keyboard.add(callback_button_SP) callback_button_SP = types.InlineKeyboardButton(text="Дарий В.", callback_data="SP_D") #Support first yes keyboard.add(callback_button_SP) callback_button_SP = types.InlineKeyboardButton(text="Волыхина М.", callback_data="SP_V") #Support first yes keyboard.add(callback_button_SP) bot.send_message(config.channel_id, msg, reply_markup=keyboard) # отклоненные заявки уходят в общий канал # к ней прикрепляется кнопка, для каждого оператора поддержки # если ее нажать, то будет считаться что оператор принял заявку # отказаться он не сможет else: print(' === ' + ' ERROR IN callback' + ' === ' + str(message.chat.id))