Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Онлайн чат
N0ob  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 790
Пользователь №: 37078
На форуме: 3 года, 8 месяцев, 6 дней
Карма: 13




Всем привет! Пишу онлайн чат. Примерно такой код:
function getMessages ()
{
$.ajax({
url : "messages.php",
type : "POST",
async : true,
dataType : "json",
success : function(data)
{
//Выводим сообщение
setTimeout(getMessages, 1000);
},
error : function (jq, a)
{
log("Ошибка при выборке сообщений: "+jq.responseText);
}
}
);
}

setTimeout(getMessages, 1000);

Обработчик выдает непрочитанные письма. Структура таблицы с сообщениями такая:
Цитата
id | from | to | text | date | dialog_id | view | notified

То есть обработчик выбирает сообщение, у которых view и notified равно нулю. Поле view это индикатор того, что сообщение прочитали, а notified индикатор того, что пользователя уведомили о сообщении. Как в ВК. Если ты не на странице переписки или не открыт диалог с перепиской, то в нижнем левом углу вылезет оповещение о новом сообщении с его содержимым. Со всем этим у меня проблем нет. Проблема вот в чем. Вот я выбрал сообщение. Поле notified можно обновлять на 1(то есть уведомил) сразу в обработчике, т.к. даже если пользователь не на странице переписки ему все равно выдадут алерт о сообщении ну а если на странице, то этого алерта не будет а просто вставим сообщение от юезра. Но как обновить поле view грамотна? В обработчике не получиться, т.к. пользователь может его не прочитать а отправителю покажет, что он его прочитал. Был вариант прям в функции выборке(в самом верху которая) при удачном выборе сообщения, посылать еще один запрос на сервер, но уже с обновлением поля view на 1(прочитано), если это страница переписки, открыть диалог с автором сообщения. Но будет ли это разумным решением в данном случае? Есть другие варианты?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Zuenf  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 48
Пользователь №: 40831
На форуме: 1 год, 10 месяцев, 12 дней
Карма: 3




Твой вариант вполне рационален.
Примерно так:
function getMessages ()
{
$.ajax({
url : "messages.php",
type : "POST",
async : true,
dataType : "json",
success : function(data)
{
if(isChat) messagesViewed(data.messages);
//Выводим сообщение
setTimeout(getMessages, 1000);
},
error : function (jq, a)
{
log("Ошибка при выборке сообщений: "+jq.responseText);
}
}
);
}

function messagesViewed(messages)
{
var viewedMessages = getKeys(messages);
$.ajax({
url : "messages.php",
type : "POST",
async : true,
dataType : "json",
data : {
action: 'viewed',
messages: viewedMessages
}
}
);
return viewedMessages;
}

function getKeys(obj)
{
var keys = [];
for(var key in obj)
keys.push(key);
return keys;
}

setTimeout(getMessages, 1000);


Это сообщение отредактировал Zuenf - 29.01.2015 - 22:11
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
N0ob  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 790
Пользователь №: 37078
На форуме: 3 года, 8 месяцев, 6 дней
Карма: 13




Zuenf спасибо)
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1357
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 10 дней
Карма: 77




можно на пальцах . Как это работает и куда пишется ?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
N0ob  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 790
Пользователь №: 37078
На форуме: 3 года, 8 месяцев, 6 дней
Карма: 13




PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
volter9  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Местный хипстер
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 566
Пользователь №: 38946
На форуме: 2 года, 9 месяцев, 18 дней
Карма: 64




N0ob
Думаю мне поздно говорить, но может быть пригодится:
Вместо того что бы посылать все сообщения которые были прочитаны (после захода в сам чат), можно брать id последнего сообщения и все сообщения до него и само сообщение метить как просмотренное (viewed).

Приблизительный SQL:
UPDATE messages SET view = 1 WHERE from = %user_1% AND to = %user_2% AND id <= %last_id%

Где %user_1% и %user_2% пользователи последнего сообщения и %last_id% это ID последнего сообщения.

Приблизительный JS:
function getMessages () {
$.ajax({
url: 'messages.php',
type: 'POST',
async: true,
dataType: 'json',
success: function(data) {
var messages = data.messages

if(isChat) viewMessages(messages.slice(-1).pop());

setTimeout(getMessages, 1000);
},
error: function (jq, a) {
log('Ошибка при выборке сообщений: ' + jq.responseText);
}
}
);
}

function viewMessages (lastMessage) {
$.ajax({
url: 'messages.php',
type: 'POST',
async: true,
dataType: 'json',
data: {
action: 'viewed',
message: lastMessage
}
}
);
}

setTimeout(getMessages, 1000);


Как то так.


--------------------
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
inpost  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Помагите Здесь живу!!!
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 22694
Пользователь №: 20039
На форуме: 7 лет, 2 дня
Карма: 599




N0ob
У тебя ошибка в коде. А если интернет упадёт на 1 секунду? wink.gif
Вторая проблема. Если в момент перехода между страницами придет уведомление. То есть отметится, что он видел, но при этом физически он не заметил.


--------------------
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
N0ob  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 790
Пользователь №: 37078
На форуме: 3 года, 8 месяцев, 6 дней
Карма: 13




volter9 да, так будет гораздо логичнее. Переделаю
Цитата
У тебя ошибка в коде. А если интернет упадёт на 1 секунду?  wink.gif

То есть на стороне клиента нужно еще и проверят соединение с интернетом? Я правильно понял суть ошибки?
Цитата
Вторая проблема. Если в момент перехода между страницами придет уведомление. То есть отметится, что он видел, но при этом физически он не заметил.

Такого не произойдет, т.к. сайт на html5history
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
N0ob  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 790
Пользователь №: 37078
На форуме: 3 года, 8 месяцев, 6 дней
Карма: 13




user posted image
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
inpost  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Помагите Здесь живу!!!
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 22694
Пользователь №: 20039
На форуме: 7 лет, 2 дня
Карма: 599




N0ob
error: function (jq, a) {
log('Ошибка при выборке сообщений: ' + jq.responseText);
}

Зачем логировать? Лучше уж продолжи вызывать с интервалом, тогда после восстановления новые запросы пойдут.


--------------------
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
PMПисьмо на e-mail пользователюICQ
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
N0ob  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 790
Пользователь №: 37078
На форуме: 3 года, 8 месяцев, 6 дней
Карма: 13




inpost вот тут да, ошибочка вышла. Уже подправил. Спасибо!
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Гость_Олег  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









День добрый, что прямо можно вопросы задавать?
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса