LINUX.ORG.RU

chat one to one как реализовать доставлено и прочитано?

 , ,


0

3

Как это лучше сделать? Допустим, юзер забирает сообщения(все) или >какой-то даты или по флагу «непрочитано». Далее(что первое приходит на ум) - это сделать апишку, в которую юзер будет после получения отдавать список ids всех полученных сообщений


список ids всех полученных сообщений

Или передавать одну дату. Сообщения ведь обычно по дате сортируются и читаются в том же порядке. Но это при условии, что твой клиент не будет прокручивать до самого последнего сообщения автоматически.

dsxl ()
Ответ на: комментарий от gnunixon

Сервер-то формирует данные, но коим образом он может знать, что данные клиент забрал?

В моем понимании клиент может точно знать, например при post, что данные сервер получил и обработал(сервер вернет статус код), а сервер откуда знает, долетели до клиента данные или нет?

Xwo ()
Ответ на: комментарий от Goury

А веб сокет не накладно по ресурсам? Все же клиенты поддерживают соединения с сервером, т.е подсаживаются на вебсокет. Не поплохеет инстансу, если на нём будут висеть 1000-10000 соединений?

Xwo ()
Ответ на: комментарий от Xwo

даже в этом случае отсылать обратно все id это излишне. Достаточно послать обратно условный флажок «получил». В респонзе зафигачиваешь request_id, и пускай клиент его шлет, а ты уже маркируешь отосланные данные как полученые. Но вообще, товарищи выше абсолютно правы на счет websocket - его как раз для таких вот вещей и придумывали

gnunixon ★★★ ()
Ответ на: комментарий от gnunixon
Достаточно послать обратно условный флажок «получил». В респонзе зафигачиваешь request_id, и пускай клиент его шлет, а ты уже маркируешь отосланные данные как полученые.

Бррр, ничего не понял. Можешь детализировать?

Но вообще, товарищи выше абсолютно правы на счет websocket - его как раз для таких вот вещей и придумывали

Последний раз, когда я пытался использовать django-channels - у меня это всё восторга не вызвало

Xwo ()
Последнее исправление: Xwo (всего исправлений: 2)
Ответ на: комментарий от rach_linux

Вопрос нотификации клиента о новых сообщениях - это совершенно другой вопрос. Тут вопрос в том, что если клиент забирает сообщения, то сервер не может их самостоятельно пометить как «доставлено», потому как не вижу механизма, при котором сервер может узнать о том, доставлены ли данные клиенту или нет. Если это не верно - то объясните, какой у этого есть механизм

Xwo ()
Последнее исправление: Xwo (всего исправлений: 3)
Ответ на: комментарий от Xwo

потому как не вижу механизма, при котором сервер может узнать о том, доставлены ли данные клиенту или нет

после получения отдавать список ids всех полученных сообщений

Сам же ответил, ещё в ОП.

так и использование xmpp

Никто не заставляет использовать что-то. Просто, можно посмотреть, как это реализовано в открытых протоколах, в том числе и xmpp, XEP-0184 нам рассказывает о «квитанциях».

В телеге, тоже самое, квитанции.

vvn_black ★★★★★ ()
Ответ на: комментарий от Xwo

надо смотреть как реализовано получение сообщений.

клиент подключается и спрашивает «есть новые сообщения?» > сервер отвечает есть или нет. > если сообщения есть, то клиент говорит «дай их сюда и пометь как доставлено». и не важно читал он их или нет. достаточно того, что был запрос на новые сообщения.

по моему как только клиент подключается к чату/появляется «в сети», все сообщения автоматически должны быть помечены как «доставлено». а вот с «прочитано» уже другой разговор. как только клиент открывает чат с этими сообщениями «доставлено» меняется на «прочитано»

rach_linux ()
Ответ на: комментарий от rach_linux

Правильно отметили. Можно сделать на уровне транспорта:

  • если long polling, то сам факт забора сообщений с сервера - это «получено клиентом» (одна галочка)
  • если хуки, то ответ клиента 200 на апдейт - факт доставки сообщения.

А отметку о прочтении без отправки клиентом списка id уже не сделать.

vvn_black ★★★★★ ()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от vvn_black

а зачем слать id обратно?

есть 3 состояния у сообщения: «новое», «доставлено», «прочитано».

в базу говоришь «дай все новые». и помечаешь их «доставленными». заходишь в чат и говоришь «пометь все доставленные как прочитанные»

rach_linux ()
Ответ на: комментарий от rach_linux

а зачем слать id обратно?

Чтобы потом было что ответить на претензию одного из собеседников «у меня помечено, что сообщение доставлено, а он негодяй, говорит, что не получал ничего».

vvn_black ★★★★★ ()