Реализация бота

Adrenaline_bot (основной класс)

class Adrenaline_bot

Бот для обработки сообщений в личных сообщениях сообщества или страницы вк.

Атрибуты:

self.vk_session(vk_api.VkApi)

Объект сессии авторизации (возможна авторизация как пользователь либо как сообщество).

self.long_poll_server(str)

Адрес LongPoll сервера (используется для обращения к серверу для получения сообщений).

self.long_poll_key(str)

Секретный ключ сессии (используется для обращения к серверу для получения сообщений).

self.long_poll_ts(str)

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

self.auth_code(str)

Код для двухфакторной аутентификации.

self.remember_code(boolean)

Статус запоминания авторизирации (для двухфакторной аутентификации).

self.admins(src.main.user.admin.Admin[])

Список админов (используется для отображения отдельного меню для админов). Список либо загружается из admins.pickle в случае наличия файла, либо пополняется с помощью метода add_new_admin().

self.clients(src.main.user.client.Client[])

Список клиентов (используется для отображения отдельного меню для клиентов). Список либо загружается из clients.pickle в случае наличия файла, либо пополняется новыми клиентами после получения первых сообщений от них.

Методы:

self.auth_handler(self)

Слушатель кода двухфакторной аутентификации. Меняет значение полей auth_code, remember_code.

self.login_as_user(self)

Авторизация в качестве пользователя. Метод используется в случае, если происходит авторизация аккаунта без двухфакторной аутентификации, иначе вызывается метод login_as_user_two_factor(). Меняет значение поля vk_session.

self.login_as_user_two_factor(self)

Авторизация в качестве пользователя (с двухфакторной аутентификацией). Меняет значение поля vk_session.

self.login_as_group(self)

Авторизация в качестве сообщества (используется в актуальной версии). Меняет значение поля vk_session.

self.save_clients(self)

Сохранение списка клиентов в pickle-файл.

self.save_admins(self)

Сохранение списка админов в pickle-файл.

self.load_clients(self)

Загрузка списка клиентов из pickle-файла. Меняет значение поля clients.

self.load_admins(self)

Загрузка списка админов из pickle-файла. Меняет значение поля admins.

self.set_clients_actual_keyboard(self)

Установка последней активной клавиатуры для клиента. Метод отправляет сообщение каждому клиенту, который ранее писал боту, с оповещением о том, что бот был перезапущен, и возвращает последнюю актуальную клавиатуру.

self.set_admins_actual_keyboard(self)

Установка последней активной для админа. Метод отправляет сообщение каждому админу в списке админов, сообщая о том, что бот был перезапущен, если админ уже пользовался ботом ранее, либо с сообщением о том, что нужно запустить бота, если админ добавлен в список, но еще не пользовался ботом.

self.send_message(user_id, message, keyboard='')

Отправка сообщения в чат.

Параметры
  • user_id (str) – индивидуальный номер диалога

  • message (str) – сообщение, которое необходимо отправить

  • keyboard (str) – строковое представление json-клавиатуры

self.get_username(self, user_id)

Определение имени пользователя по его id.

Параметры

user_id (str) – id пользователя вк

Результат

имя пользователя, фамилия пользователя

self.set_long_poll_server_params()

Инициализация LongPoll-сервера для получения сообщений. Меняет значения полей long_poll_server, long_poll_key, long_poll_ts.

self.get_response(self)

Отправка get-запроса к LongPoll-серверу и получение ответа

Результат

ответ LongPoll-сервера

self.fill_admin_list(self)

Заполнение списка id админов в случае перезапуска бота. Метод предназначен для восстановления списка id админов в случае перезапуска бота и последующего восстановления списка админов из pickle-файла. Меняет значение глобальной переменной ADMIN_LIST.

self.new_message(self, user_id, first_name, time, text)

Определение отправителя и дальнейшая обработка входящего сообщения. Метод определяет тип отправителя: клиент или админ, после чего вызывает соответствующий метод (либо new_admin_message(), либо new_client_message()).

Параметры
  • user_id (str) – индивидуальный номер диалога

  • first_name (str) – имя отправителя сообщения

  • time (datetime) – время отправления сообщения

  • text (str) – текст сообщения

self.define_admin_from_message(self, user_id)

Нахождения объекта админа по его id вк.

Параметры

user_id (str) – id пользователя вк

Результат

объект админа либо None

self.define_client_from_message(self, first_name, user_id)

Нахождение существующего объекта клиента по его id вк либо добавление нового.

Параметры
  • first_name (str) – имя клиента (используется для инициализации нового объекта)

  • user_id (str) – id пользователя вк

Результат

объект клиента

self.new_admin_message(self, user_id, time, text)

Обработка сообщения от админа. Метод определяет объект отправителя сообщения, после чего обрабатывает входящее сообщение в зависимости от его фактического положения в меню клавиатур. Меняет значения полей menu_mode, is_online, energy amount, deals экземпляра current_user класса src.main.user.Admin.

Параметры
  • user_id (str) – индивидуальный номер диалога

  • time (datetime) – время отправки сообщения

  • text (str) – текст сообщения

self.note_new_client_action(self, current_client, current_admin=None)

Отправка сообщений админам о ключевых действиях клиента.

Параметры
  • current_client (src.main.user.client.Client) – объект клиента

  • current_admin (src.main.user.admin.Admin) – объект админа (если он уже привязан к клиенту)

self.new_client_message(self, user_id, first_name, text)

Обработка сообщения от клиента. Метод определяет объект отправителя сообщения, после чего обрабатывает входящее сообщение в зависимости от его фактического положения в меню клавиатур. Меняет значения полей menu_mode, energy amount, deals, current_order экземпляра current_user класса src.main.user.client.Client.

Параметры
  • user_id (str) – индивидуальный номер диалога

  • first_name (str) – имя отправителя

  • text (str) – текст сообщения

self.client_order_done(self, current_user)

Переход к стадии получения заказа в случае оплаты наличными. Меняет значение поля menu_mode экземпляра current_user класса src.main.user.client.Client.

Параметры

current_user (src.main.user.client.Client) – объект клиента

self.get_free_admin(self, current_client)

Поиск свободного админа с нужным количеством энергетиков.

Параметры

current_client (src.main.user.client.Client) – объект клиента

Результат

объект искомого админа

self.find_free_admin_and_continue(self, current_user)

Проверка на наличие свободных админов и оповещение клиента о дальнейших дейсвтиях. Метод совершает поиск свободного админа. В случае положительного результата, клиенту отправляется инструкция о дальнейших действиях (куда подойти и забрать свой заказ), в противном случае отправляется сообщение о том, что можно подождать, пока кто-то из админов освободится, либо отменить свой заказ. Меняет поле menu_mode экземпляра current_user класса src.main.user.client.Client.

Параметры

current_user (src.main.user.client.Client) – объект клиента

self.note_admins_about_new_delay(self, current_user)

Оповещение админов об ожидании обработки нового заказа. Меняет значение поле menu_mode экземляров класса src.main.user.admin.Admins из списка админов - поля admins.

Параметры

current_user (src.main.user.client.Client) – объект клиента

self.add_new_admin(self, admin_obj)

Добавление админа в список. Меняет значение поля admins.

Параметры

admin_obj (src.main.user.admin.Admin) – объект админа

self.add_new_admins(self, admins_list)

Добавление админов в список. Меняет значение поля admins.

Параметры

admins_list (src.main.user.admin.Admin[]) – массив объектов админов

self.start_bot(self)

Инициализация и запуск бота.

Функции-обработчики

handle_admin_delivery_and_get_energy_amount(current_user, text)

Выделение количества энергетиков на завозе. Меняет значения полей menu_mode, energy_amount экземпляра current_user класса src.main.user.admin.Admin.

Параметры
  • current_user (src.main.user.admin.Admin) – объект админа

  • text (str) – текст сообщения

Исключение

src.main.bot.errors.AmountError – в случае если число введено некорректно

Результат

количество энерегтиков после завоза

handle_admin_new_deal_and_get_energy_amount(current_user, text, time)

Выделение количества энергетиков после сделки. Меняет значения полей menu_mode, energy_amount, deals экземпляра current_user класса src.main.user.admin.Admin.

Параметры
  • current_user (src.main.user.admin.Admin) – объект админа

  • text (str) – текст сообщения

  • time (datetime) – время отправки сообщения

Исключение

src.main.bot.errors.AmountError – в случае если число введено некорректно

Результат

количество энергетиков после совершения сделки

check_and_create_backup_directory():

Проверка на наличие и в случае необходимости создание директории с файлами бэкапа.

Вспомогательные функции

read_json(file_name)

Чтение json-клавиатуры из файла.

Параметры

file_name (str) – путь к файлу

Результат

строковое представление клавиатуры

format_input(answer)

Удаление пробелов из строки и приведение её к нижнему регистру.

Параметры

answer (str) – исходная строка

Результат

итоговая строка

Форматированный вывод ошибки.

Параметры

error_message (str) – текст ошибки