---
# System prepended metadata

title: Чаты

---

# Чаты

## Основные репозитории
* Бэкенд чатов [chatd-nodejs](http://git.rn/projects/N1/repos/chatd-nodejs/browse)
* Фронтенд чатов [chat](http://git.rn/projects/N1/repos/chat/browse)
* Десктопный контейнер для чатов [n1-bundle-cabinet](http://git.rn/projects/N1/repos/n1-bundle-cabinet/browse)
* Контейнер с мобильной версией чатов [n1-mobile-bundle-offera](http://git.rn/projects/N1/repos/n1-mobile-bundle-offers/browse) 
* Кроны, для выполнения отложенных операций по чатам [api](http://git.rn/projects/N1/repos/api/browse)
* Логи для отравки в clickhouse [frontend](http://git.rn/projects/N1/repos/frontend/browse)
* Сервис для сбора и отправки аналитики в clickhouse [view-stats-parser](https://gitlab.n1.org.ru/bi/view-stats-parser)

## Dashboard чатов
https://dash.pusher.com/chatkit
g.fokin@n1.ru
000000
(но лучше привяжи свой аккаунт, попроси у Лёши Мышко инвайт)

## Мониторинг

* Основные метрики чатов мы отслеживаем в [графане ](http://grafana.n1.org.ru/d/VjJ61NRWk/chatd-nodejs?orgId=1&refresh=1m)
* Баги смотрим в [Sentry](http://sentry.n1.s/n1/chatd-nodejs/)
* Критовые баги дублируются к нам в канал в mattermost: https://chat.n1.org.ru/n1ru/channels/notify-team-buyer
* Баги по работе кронов на php смотрим [тут](http://sentry.n1.s/n1/n1-api/?query=is%3Aunresolved+team%3ABuyer)

### Настройка оповещений о багах через mattermost
Чтобы оперативно реагировать на критовые баги, мы настроили их дублирование из sentry в mattermost, делаем мы это посредством [Zappier](https://zapier.com/app/zaps)

Логин: g.fokin@n1.ru
Пароль: q12345

После авторизации выбираем вкладку My Zaps и ищем `Sentry to mattermost: notify-team-buyer`

### Метрики на мониторе

На мониторах у нас дублируются графики из графаны. Чтобы запустить/перезапустить мониторинг нужно:
1. `ssh monitor@192.168.10.84` pass: monitor
2. Запустить скрипт `./start-monitoring`

### Как узнать ip-шник mongoDB, Rabbit или чего-либо ещё
1. Зайди на [https://deployer.n1.s/](https://deployer.n1.s/)
2. Выбери свою среду, появится таблица со всеми ресурсами ![](https://i.imgur.com/XmqmSIe.png)
3. Ищи нужный тебе Unit (например БД для чатов называется `mongo-chatd`)



## Отправка писем о непрочитанных сообщениях

### Отладка событий
Во время отправки сообщения чаты эмитят событие message.sent. Событие отправляется в RabbitMQ. Если есть необходимость подебажить эти события, нужно открыть веб морду рэббита:
1. Узнай ip своего рэббита, как это сделать описано [тут](#Как-узнать-ip-шник-mongoDB-Rabbit-или-чего-либо-ещё) (тебя интересует Unit `rabbitmq-realty`)
2. Открой браузер и введи этот ip, добавив порт 15672 `твой_ip:15672`
4. Введи логин и пароль (`guest`, `guest`)
5. Выбери вкладку **Exchanges** и ищи `chat`, жмякни на него и увидишь все очереди, которые мы используем для работы с чатами
![](https://i.imgur.com/VnqsRBh.png)

7. Ищи нужную очередь (в нашем случае это `unread_messages < chat`)
8. Далее выбери вкладку **Queues** и жмякни по нужной очереди

### Логика работы
Есть [скрипт](http://git.rn/projects/N1/repos/api/browse/scripts/services/subscriptions_rpc/Realty/SubscriptionsTypes/ChatUnreadMessages/Cli/UnreadMessagesListener.php), который слушает очередь `unread_messages < chat` и создаёт таски в mongoDB(коллекция `unread_chat_messages`). Далее специальный [крон](http://git.rn/projects/N1/repos/api/browse/scripts/services/subscriptions_rpc/Realty/SubscriptionsTypes/ChatUnreadMessages/Cli/UnreadMessagesHandler.php) разгребает эти таски и раз в 7 минут триггерит событие в Emarsys о том что нужно отправить уведомление о непрочитанных сообщениях.

#### Emarsys
Попасть в Emarsys можно по ссылке https://suite16.emarsys.net/.
Account - n1_ru, логин и пароль проси у Булгаковой Натальи
После авторизации нужно выбрать Campaigns -> Email campaigns и вбить в поиск чаты, там есть вся информация о шаблоне и логике отправки

### Как протестировать отправку письма
1. Отправить сообщение в чате
2. Убедиться что в очереди `unread_messages < chat` появилось сообщение (см. пункт Отладка событий)
3. Зайти в монгу и в коллекции `unread_chat_messages` отредактировать дату на 10 минут назад (адрес монги смотри в [тут](https://deployer.n1.s), ищи mongo-n1 )
4. Далее нужно зайти на php-ноду: `ssh root@phpnode7-bionic.твоя.среда` и запустить 2 крона
    4.1. `/data/projects/n1.ru/scripts/cli.php subscriptions_rpc SubscriptionsTypes_ChatUnreadMessages UnreadMessagesListener process`
    4.2. `/data/projects/n1.ru/scripts/cli.php subscriptions_rpc SubscriptionsTypes_ChatUnreadMessages UnreadMessagesHandler run`
Если что-то не выходит, обратись к Наташе Булгаковой, она поможет с тестированием

## Отправка хита в статистику просмотров по карточке объявления
Создание канала в чате равносильно открытию контакта в карточке, такие действия мы трекаем и отправляем в специальный сервис стастики, чтобы продавец видел у себя в личном кабинете в том числе и статистику по открытию чатов.
Во время создания канала в RabbitMQ в очередь `offers_hits < chat.new_channel` отправляется соответсвующее событие
Далее cli-скрипт на php `/data/projects/n1.ru/scripts/cli.php offers Offers_HitsCount NewChatChannelsListener process` отправит это в сервис статистики просмотров. (Как запускать cli-скрипты смотри в 'Отправка писем о непрочитанных сообщениях').
За подробностями работы сервиса стастики обращайся к команде продавцов.

## Отключение возможности писать сообщения
Пользователи могут отключать у себя чаты из личного кабинета, также чаты могут отключать модераторы из админки.
Апишка для отключения чатов:
```
curl -X POST \
  http://api.n1.ru.b.dobrovolskiy.n1/api/v1/chat/user-rpc/ \
  -H 'Authorization: Bearer f64ab47dfc5c8d2df499e46886bdc43a5ae0dea2' \
  -H 'Content-Type: application/json' \
  -H 'Postman-Token: 6b2d2e20-ad1b-4862-95c8-31045d6cbded' \
  -H 'cache-control: no-cache' \
  -d '{
	"jsonrpc": "2.0", 
	"method": "disableChat", 
	"params": {}, 
	"id": 1
	
}'
```
***Реализация этого эндпоинта и других связанных с включением/отключением чатов и их проверкой лежит [тут](http://git.rn/projects/N1/repos/chatd-nodejs/browse/src/handlers/createUserJsonRpc.js)***

После отключения чатов происходит 2 вещи:
1. В коллекцию `'users_settings'` в бд чатов записывается информация о том что пользователь отключил у себя чаты (как узнать ip MongoDB смотри [тут](#Как-узнать-ip-шник-mongoDB-Rabbit-или-чего-либо-ещё), тебя интересует Unit `mongo-chatd`)
2. Эмитится событие в RabbitMQ в очередь `users < chat.change_is_chat_enabled` (как отлаживать события смотри [тут](#Отладка-событий)
3. Событие слушает [PHP-й крон](http://git.rn/projects/N1/repos/api/browse/scripts/services/elastic_indexer/Realty/ElasticIndexer/Cli/ChatEnabledChangesListener.php), по userID он получает все объявления и инициирует их реиндексацию.
### Реиндексация объявлений
Если упрощённо, то объявления, которые ты получаешь из апишки, возвращаются тебе из эластика.
Для подключения к эластику удобней всего пользоваться плагином хрома elasticsearch-head. IP эластика можешь посмотреть [тут](#Как-узнать-ip-шник-mongoDB-Rabbit-или-чего-либо-ещё) (тебя интересует Unit `n1_elastic`). Ищи коллекцию с алиасом `offers`. Информацию о состоянии чатов у оффера мы храним в поле `chat.enabled`
Каждый раз когда происходит процесс реиндексации, мы ходим в апи чатов за настройками пользователя и проверяем не отключил ли он у себя чаты и если это так проставляем `chat.enabled = false` (чуть выше я давал ссылку на реализацию эндпоинтов для работы с настройками пользователя чатов)
Если у объявления, которое вернет тебе api, этот флаг будет установлен в `false` то кнопка **Написать сообщение** скрывается в карточке объявлений.

## Отправка аналитики в Clickhouse
Каждую отправку нового сообщения мы фиксируем в clickhouse. Делается это в 2 этапа
1. Ходим на специальный урл [(логика начинается тут)](http://git.rn/projects/N1/repos/chatd-nodejs/browse/src/services/sendMessage.js#98), по которому nginx складирует логи [ссылка на пул реквест](http://git.rn/projects/N1/repos/frontend/pull-requests/323/overview)
2. Go-й [демон](https://gitlab.n1.org.ru/bi/view-stats-parser) скачивает файл с этими логами, парсит их и отправляет в clickhouse.
### Подключение к clickhouse
Веб интерфейс: [http://clickhouse.n1.org.ru/](http://clickhouse.n1.org.ru/)
dev сервер кликхаус: `http://clickhouse-dev.n1.s:80`
user: `default`
tcp порт dev сервера: `clickhouse-dev.n1.s:32007`
### Логи ошибок
Ошибки смотри в mattermost, канал `notify-team-buyer`, выглядят они так:
![](https://i.imgur.com/C1s7i9Y.png)
