Пишу сервис для общения: отправка сообщений
Был у меня сервер на Golang и простенький клиент для тестирования:
Отправа/прием собщений, команд, доставка событий работают. В общем-то плюс-минус все хорошо, но тестовый консольный клиент - это не то, что я хотел бы использовать в повседневной жизни на телефоне. Да и вы наверно тоже 😂
И вот в последнее время работал над отправкой сообщений. Наметил структуру/логику и реализовал отправку сообщений. В ответ на сообщение сервер кидает уведомление о доставке. Это нужно чтобы клиент понял, что нужно остановиться и не отсылать больше сообщения.
Доставкой сообщений на клиенте занимается мой небольшой доставщик. Кидаешь ему сообщение и он пытается его отправить. Сервер в ответ может отправить много чего, но в данный момент мне важно обработать статусы сообщения. А статусов столько (возможно что-то упустил и добавлю, но склоняюсь что этих хватит):
- в процессе отправки ⏳ (анимированные часики)
- ошибка отправки ❗
- доставлено на сервер ☑️
- доставлено до получателя ☑️☑️
- получатель прочел ✅✅
Визуальную часть реализовал ранее, так что сейчас просто использую ее. А вот про ошибки забыл. Ранее руки не дотягивались, не заострял внимание на ошибках и в ответ просто отправлял строку с ошибкой. Недавно столкнулся с тем, что строка - это лучше чем вообще ничего, но строку неудобно обрабатывать. Так что ввел структуру ошибки и отправляю ошибку в таком виде:
Но это еще не все. Не особо писал тесты и в какой-то момент временно сломал серверный код из-за изменения типов данных в серверной базе данных. Дела... 😂
Сейчас у меня сообщения отправляются, ответ сервер используется для обновления состояния сообщения. Кстати, вот скрин сообщений и их состояний:
А тут видно, что неотправленные сообщения помечаются восклицательным знаком, который расположен слева от сообщения и по центру:
Черновики
Но это еще не все. У нас же есть черновики и как хорошо что с самого начала начал над ними работать. Дело вот в чем. Пользователь может отправить сообщение новому собеседнику или даже будучи не в сети. В нормальном режиме отправка сообщения происходит по ID чата. Персональный чат это или групповой - неважно. Отправляешь сообщение по ID и сервер уже сам разберется нужно его отправить одному собеседнику или рассылать группе.
И вот тут есть небольшая проблема. Если пользователь отправляет сообщение новому пользователю, то происходит следующее: серверу сообщается информация о том какому именно собеседнику (receiverID) нужно доставить сообщение. В результате сервер создает персональный чат (если он не был создан) и отправляет ID чата. После этого отправитель уже шлет сообщение не по receiverID, а по chatID.
Проблема в чем? В том, что chatID не известен до отправки сообщения. После получения ответа от сервера, отправителю нужно найти отправленное сообщение, создать для него чат и закрепить отправленное сообщение за чатом.
На словах, вроде, все понятно. У меня сейчас этот момент реализован совсем плохо. Если не исправить, то будет еще хуже и в итоге сам себе создам ад при жизни.
В общем, исправлю, не любитель заниматься полнейшей ерундой 😂 На данный момент этим и занимаюсь.
После добавлю код для обновления статуса сообщения:
- доставлено до получателя ☑️☑️
- получатель прочел ✅✅
На данный момент работает отображение статуса отправки (⏳) и доставки до сервера (☑️) .
Далее планирую заняться получением и визуализацией принятых сообщений. У полученных сообщений нет статусов, с ними немного проще: нужно просто отобразить их и у меня вроде все для этого уже готово (кроме приема, сохранения в БД и обновления частей интерфейса).
Есть одна давняя и неприятная новость: уведомления о доставке не будут работать без сервисов Apple и Google. Так что чтобы мобильное приложение присылало уведомления, нужно будет плОтить (для Apple около 10к руб в год, для GooglePlay вроде $25 за регистрацию аккаунта, а дальше еще не смотрел).
Голосовые/видео звонки - до них пока не добрался 😅
Сейчас план-минимум - это сделать сервис обмена сообщениями и файлами.
--
По вечерам разрабатываю сервис для общения на Go & Flutter. Кому интересно, можете подписаться куда-нибудь на меня, попробуете его в числе первых.
Постепенно буду продолжать делиться успехами разработки сервиса.












