За последние 24 часа нас посетили 16473 программиста и 1677 роботов. Сейчас ищут 855 программистов ...

Логика чата php+mysql+ajax не прочитанные сообщения

Тема в разделе "PHP для новичков", создана пользователем Ivanov_Sania, 18 фев 2017.

  1. Ivanov_Sania

    Ivanov_Sania Новичок

    С нами с:
    2 дек 2016
    Сообщения:
    14
    Симпатии:
    6
    Здравствуйте.

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

    Есть таблица dialog, в ней содержатся уникальные идентификаторы начатых диалогов между пользователями и мной, структура:
    id[​IMG], from_user_id, to_user_id.
    1, 111, 222

    Есть таблица messages, в ней содержатся соответственно сами сообщения, структура:
    id, dialog_id, message, from_user_id, to_user_id, flag, pubdate (from_user_id, to_user_id наверно лишние, но не уверен)
    1, 1, сообщение, 111, 222, 1/0, дата


    При заходе пользователем в его кабинете на страницу чата со мной, проверяется есть ли идентификатор свидетельствующий о нашем диалоге в таблице dialog, если есть, то без ajax подгружаются все сообщения нашей переписки прям на этой странице, после этого ajax каждые 3 секунды проверяет есть ли новые сообщения по этому идентификатору диалога с флагом flag=1, и если есть, то добавляет их с помощью jquery append ко всей переписке, перематывает скролл вниз, и обновляет flag на 0 - сообщения прочитаны.

    Сообщения по умолчанию добавляются с флагом flag = 1 - те, которые должен обрабатывать скрипт вызывающийся аяксом, он же после проверки аяксом и jquery append обновляет запись flag на 0, но тогда если у меня в админке открыт диалог с этим пользователем, сообщение не приходит ко мне без обновления страницы, так как flag уже 0, а не 1, и скрипт чекающий новые сообщения аяксом не видит соответственно его, увидеть можно только перезагрузив страницу на которой чат, в которой не аяксом выводится вся переписка найденная по dialog_id и flag = 0.

    То же самое происходит, если все эти действия совершаю я, у меня всё уходит в чат без перезагрузки, но у пользователя сообщения не обновляются аяксом, так как flag и в моём случае обновляется на flag = 0 после jquery append.

    Всю голову уже сломал, 2-й день не могу понять, как реализовать похожий функционал на чат вк с возможностью видеть не прочитанные сообщения мной, и пользователем, в случае если отправка сообщений производилась, когда кто-то из собеседников не был на сайте.

    Надеюсь понятно объяснил нюансы. :)
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Отлично объяснил. А догадаться не догадался. Если у тебя админ отправил сообщение - на кой черт отмечать сообщение прочитанным для самого админа? Он сообщение не просто прочитал. Он его написал. Та же хрень и в обратную сторону. Вывод: флаг должен работать только с одной стороной - принимающей послание.
    Далее. Если вдруг мультичат будет то автор сообщения не повлияет на "прочтение" своего сообщения, но оно "прочитается" первым прочитавшим. Вывод: флаг должен быть связан с парой сообщение-получатель.
    Далее. Откроешь ты в нескольких окнах чатик и пипец - в каких-то обновляется а в каких-то не хочет. Потому что у тебя окно дергает "не прочитаны" а должно дергать "с последнего известного мне". Ибо и ты сам тоже можешь в соседнем окне в чатик нагадить и в других вкладках оно должно подсосаться. Вывод: обновление должно быть привязано к уникальному атрибуту сообщения. Например, ко времени.
     
    Ivanov_Sania нравится это.
  3. Ivanov_Sania

    Ivanov_Sania Новичок

    С нами с:
    2 дек 2016
    Сообщения:
    14
    Симпатии:
    6
    Благодарю за отклик!
    Теоретически всё правильно, но как же быть тогда с тем, что сообщения будут дублироваться у админа в чате каждые 3 сек. если им не задать флаг 0? append будет добавлять в чат уже имеющиеся сообщения, до тех пор пока принимающий послание не прочтёт и не произойдёт обновление флага на 0. Может много уже сижу за компом, а может и лыжи не едут, но никак не могу понять до конца логику. :(
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Да, лыжи у тебя явно не едут. Сегодня или всегда - это уже тебе только известно :cool:
    Еще разок по логике. У сообщения есть дата размещения. Чат знает в какую дату отправлено последнее сообщение из него, или какую дату оно последнюю втянуло из инбокса. После втягивания естественно нужно переменную в чатике обновить чтоб потом за следующей пачкой лазить. А в эту пачку попадают все сообщения - и наши и чужие. Этот момент понятен?
     
    Ivanov_Sania нравится это.
  5. Ivanov_Sania

    Ivanov_Sania Новичок

    С нами с:
    2 дек 2016
    Сообщения:
    14
    Симпатии:
    6
    Получается нужно в самом js хранить переменную с датой последнего сообщения или в куках? :) И сравнивать её с подтянутыми, и в случае равенства просто не выводить сообщение в чат? Надо поспать видимо, уже 20 часов не сплю и жёстко туплю по всей видимости, но и лыжи тоже не едут. :)
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Давай я тебя забаню на 9 часов здорового сна? Ну реально ты выступаешь как деревянный. Если дело в недосыпе, то тебе срочно надо перестать себя калечить. Чат от тебя никуда не денется. А я пока вместо тебя над ним поработаю.
     
    Andy_W и Ivanov_Sania нравится это.
  7. Ivanov_Sania

    Ivanov_Sania Новичок

    С нами с:
    2 дек 2016
    Сообщения:
    14
    Симпатии:
    6
    Давай! Благодарю! :) Надо проспаться действительно.
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @Ivanov_Sania сорян. У нас оказывается минимальная размерность бана - день. Не хочу тебя на сутки банить. Так что давай ты своей силой воли проконтролируй что пошел спать :rolleyes:
     
    Ivanov_Sania нравится это.
  9. Ivanov_Sania

    Ivanov_Sania Новичок

    С нами с:
    2 дек 2016
    Сообщения:
    14
    Симпатии:
    6
    поспал немного, проснулся пришла идея о двух флажках)) всё сделал, вот тупица блин, надо было просто 2 флага заюзать, один админский флажок, другой пользовательский) Правда ограничение - в одной вкладке у каждого должен быть запущен чат, иначе только в одну из вкладок будет приходить аяксом новые сообщение, но мне подходит такой вариант. Благодарю за содействие и помощь! :)
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Да не надо там двух флагов... Эх. Ну сделал как сделал. Скил поднимешь - сделаешь иначе.