Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/edit menu confirm stage #35

Merged
merged 11 commits into from
Feb 4, 2024
Merged
41 changes: 30 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# Чат-бот для официальной группы ВКонтакте Свердловской региональной благотворительной общественной организации помощи онкологическим больным "Вместе ради жизни" (https://vk.com/vmesteradizhizni)

### Назначение
Продукт призван частично автоматизировать работу администратора группы ВКонтакте, ускорить отклик на типовые запросы пользователей, собирать обратную связь.
Продукт призван частично автоматизировать работу администратора группы ВКонтакте, ускорить отклик на типовые запросы пользователей, собирать обратную связь и вопросы пользователей.

### Разработчики:

Expand All @@ -13,16 +13,25 @@
- Кирилл Чураков: https://github.com/kirill-chu

### Технологии
- Python 3
floks41 marked this conversation as resolved.
Show resolved Hide resolved

### Планируемые функции
- Приветствие пользователей в чате
- Предоставление ответов на типовые, наиболее часто встречающиеся вопросы пользователей (вопросы и ответы (источники информации) заранее задаются при настройке бота)
- Перевод диалога на администратора группы ВК
- В диалоге для ответов использует заранее заготовленные эмодзи, фото-, аудио-, видео- материалы
- Принимает в диалоге от пользователей текст, эмодзи, фото-, аудио-, видео- материалы, передает их администратору.
- Сбор обратной связи (отзывы и впечатления) по результатам общения с чат-ботом и администратором, в целом о сообществе.
- Python 3.9
- vk-api 11.9.9

### Функции
- Приветствие пользователей в чате.
- Предоставление ответов на типовые, наиболее часто встречающиеся вопросы пользователей (вопросы и ответы (источники информации) заранее задаются при настройке бота в файле menu.csv, пункты 1-5).
- Направление сообщений обратной связи (отзывы и впечатления о деятельности фонда) от пользователей администратору (пункт 6 меню).
- Направление сообщений пользователя с вопросами специалисту (пункт 7 меню).
- Редактирование меню. Администратору по ключевому слову доступен режим редактирования меню, в котором можно изменить заголовок и информацию по имеющимся пунктам меню, в том числе приветствия.
- Логирование работы бота осуществляется в файл 'logs/logfile.txt'. Настройки и описание параметров логирования хранятся в constants.py в каталоге проекта.
### Планируемые функции (направления развития)
- В диалоге для ответов использование заранее заготовленных эмодзи, фото-, аудио-, видео- материалов.
- Приём в диалоге от пользователей (кроме текста) эмодзи, фото-, аудио-, видео- материалов, передача их администратору.
- Сбор обратной связи (отзывы и впечатления) по результатам общения с чат-ботом и администратором, в целом о сообществе (оценка работы чат-бота).
- Разнообразие сообщений приветствия и реакций бота на действия пользователей (более одного варианта на один вид реакции).
### Настройка
- Меню бота (заранее заготовленные пункты меню и информация, предоставляемая по этим пунктам, включая приветствие) хранится в файле 'data/menu.csv' в каталоге проекта.
- В переменных окружения хранятся токен-сообщества, user id пользователя ВК - администратора чат-бота (которому приходят сообщения пользователей с обратной связью и вопросами), от которого бот принимает команды редактирования меню. (См. файл env.example).
- При заданных переменных окружения после запуска main.py бот готов к работе и принимает команды от пользователей.
### Pre-commit
Для минимизации трудностей во время разработки и поддержании высокого качества кода в разработке мы используем `pre-commit`. Данный фреймворк позволяет проверить код на соответствие `PEP8`, защитить ветки master и develop от непреднамеренного коммита, проверить корректность импортов и наличие trailing spaces.
`Pre-commit` конфигурируется с помощью специального файл `.pre-commit-config.yaml`. Для использования фреймворка его необходимо установить, выполнив команду из активированного виртуального окружения:
Expand All @@ -44,4 +53,14 @@
Для автоматической проверки всех файлов необходимо инициализировать фреймворк командой:
```bash
(venv)$ pre-commit install
```
```
### Установка и запуск
В каталоге проекта при включенном виртуальном окружении обновить менеджер пакетов Package installer for Python, установить зависимости
```bash
(venv)$ python -m pip install --upgrade pip
(venv)$ pip install -r requirements.txt
```
Запустить исполнение основного модуля
```bash
(venv)$ python main.py
```
21 changes: 18 additions & 3 deletions constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,25 @@
START_BUTTON_LABEL = "Начать"
CANCEL_BUTTON_LABEL = "Отмена"
BACKWARD_BUTTON_LABEL = "Назад"
MENU_BUTTON_LABEL = "Меню"
NEW_VALUE_QUESTION_TEMPLATE = "".join(
("Введите новое значение для {} ", "или нажмите кнопку Отмена")
QUESTION_FOR_NEW_VALUE_TEMPLATE = "".join(
(
'Введите новое значение для "{}" пункта меню № {} ',
'или нажмите кнопку "Отмена"',
)
)
CONFIRM_NEW_VALUE_TEMPLATE = "".join(
(
"Для редактирования выбраны:\n{} пункта меню № {}.\n",
'Сохранить изменение значения "{}" на "{}"?',
)
)
MENU_BUTTON_LABEL = "Меню"
EDIT_SUCCESS_MESSAGE = "Пункт меню успешно обновлен."
EMPTY_VALUE_MESSAGE = "Значение меню не может быть пустым."
ABORT_MESSAGE = "Операция отменена."
CONFIRM_BUTTON_LABEL = "Сохранить изменения"
START_BUTTON_LABEL = "Начать"
MENU_EDIT_ENV_KEY = "MENU_EDIT_KEY_WORD"
# Регулярное выражение для проверки нового значения для пункта меню
# Должно содержать как минимум одну букву.
NEW_VALUE_REGEXP = r"[a-zA-Zа-яА-Я]+"
17 changes: 14 additions & 3 deletions utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,16 @@ def get_message(self, label: str) -> Optional[str]:
return row.get(self.key_message, None)
return None

def get_label_by_index(self, index: str) -> Optional[str]:
"""
Возвращает заголовок пункта меню по индексу.
Если нет пункта с нужным индекс, возвращает None.
"""
for row in self.__menu:
if index.isdigit() and self.__menu.index(row) == int(index):
return row.get(self.key_label, None)
return None

def get_message_by_index(self, label: str) -> Optional[str]:
"""
Возвращает сообщение для заданной кнопки по индексу.
Expand All @@ -82,10 +92,11 @@ def get_message_by_index(self, label: str) -> Optional[str]:
return row.get(self.key_message, None)
return None

def get_preview_menu_labels(self) -> str:
"""Возвращает строку с описанием меню для кнопок"""
def get_preview_menu_labels(self, start_index: int = 1) -> str:
"""Возвращает строку с описанием меню для кнопок.
Не обязательный аргумент start_index = 1."""
preview = ""
for label in self.get_menu_labels()[1::]:
for label in self.get_menu_labels()[start_index::]:
preview += f"{self.get_menu_labels().index(label)}. {label}\n"
preview += PREVIEW_MENU_MESSAGE
return preview
Expand Down
Loading
Loading