Управление присутствием в строфе.приложение для чата на базе js


Существует ли какое-либо существующее решение, которое обеспечивает обработку присутствия для приложения чата на основе строфы.js?

У меня есть простое приложение для чата, основанное на строфе.JS. Я хотел бы показать только тех пользователей, которые находятся в сети и динамично изменяют список. Мне было интересно, есть ли какое-либо существующее решение (возможно, плагин Strophe), которое обрабатывает это. Если нет такой вещи, каков лучший/самый простой способ ее реализовать?

2 8

2 ответа:

Используя Strophe, вы можете просто отправить IQ на ваш сервер, который запросит список вашего списка, например:

iq = $iq({type: 'get'}).c('query', {xmlns: 'jabber:iq:roster'});
App.connection.sendIQ(iq, your_roster_callback_function);

Это запросит ваш сервер для ваших реестров и вернет объект, содержащий ваш список реестров. Затем вы можете перебирать свои списки, например:

your_roster_callback_function(iq){
  $(iq).find('item').each(function(){
    var jid = $(this).attr('jid'); // The jabber_id of your contact
    // You can probably put them in a unordered list and and use their jids as ids.
  });
  App.connection.addHandler(App.on_presence, null, "presence");
  App.connection.send($pres());
}
Обратите внимание, что я добавил обратный вызов on_presence и connection.send($pres()). Его цель состоит в том, чтобы вы могли получать обновления от ваших контактов, если когда-либо их присутствие изменится. Ваш обратный вызов присутствия будет выглядеть следующим образом это:
on_presence(presence){
  var presence_type = $(presence).attr('type'); // unavailable, subscribed, etc...
  var from = $(presence).attr('from'); // the jabber_id of the contact
  if (presence_type != 'error'){
    if (presence_type === 'unavailable'){
      // Mark contact as offline
    }else{
      var show = $(presence).find("show").text(); // this is what gives away, dnd, etc.
      if (show === 'chat' || show === ''){
        // Mark contact as online
      }else{
        // etc...
      }
    }
  }
  return true;
}

Вы можете проверить строфу.JS документация для получения дополнительной информации. С помощью sendIQ вы можете добавить дополнительные параметры, такие как обратные вызовы ошибок и т. д.

Надеюсь, это поможет!

Правка:

Простите меня, я совершил ошибку. $(presence).attr('type') не дает вам знать, находится ли контакт в сети или нет, но он дает вам тип присутствия. Тип присутствия-это фактически сигнал, который сообщает вам, если контакт недоступен или если вы подписаны, отписаны и т. д. контакт.

В документации XMPP :

2.2.1. Типы присутствия

Атрибут " тип " строфы присутствия является необязательным. Присутствие строфа, которая не обладает атрибутом "type", используется для подачи сигнала на сервер, на котором отправитель находится в сети и доступен для связи. Если включено, атрибут 'type' указывает на отсутствие доступности, а запрос на Управление Подпиской на присутствие другого субъекта, a запрос на получение текущее присутствие другого объекта или ошибка, связанная с ранее посланная строфа присутствия. Если включено, атрибут 'type' Должно иметь одно из следующих значений:

  • недоступно-сигналы о том, что сущность больше не доступна для связь.
  • subscribe -- отправитель желает подписаться на присутствие получателя.
  • подписано -- отправитель разрешил получатель должен получить их присутствие.
  • отписаться -- отправитель есть отписка от присутствия другого субъекта.
  • отписался -- запрос на подписку был отклонен или ранее удовлетворен. подписка была отменена. и т.д...

Это $(presence).find("show") дает вам статус вашего контакта. Из документов:

2.2.2.1. Показать

Необязательный элемент содержит нечеловеческий XML-символ данные, определяющие конкретный статус доступности объекта или конкретный ресурс. Строфа присутствия не должна содержать более одной строфы присутствия. элемент. Элемент не должен обладать никакими атрибутами. Если указано, значение XML-символьных данных должно быть одним из следующих (дополнительные типы доступности могут быть определены через правильно-дочерний элемент пространства имен строфы присутствия):

  • прочь-сущность или ресурс временно отсутствует.
  • чат - объект или ресурс активно заинтересован в чате.
  • dnd -- Объект или ресурс занят (dnd = "не беспокоить").
  • xa-объект или ресурс отсутствует в течение длительного периода времени (xa = "eXtended Away").

Если элемент show не указан, предполагается, что объект находится в сети и доступный.

Одна важная вещь, чтобы отметить, что как это правильно, что строфа.addHandler считывает только первый узел из ответа? сказал, что если вы хотите прочитать больше, чем просто первый узел присутствия, обязательно верните true в конце, потому что: "обработчик должен вернуть true, если он должен быть вызван снова; возврат false удалит обработчик после его возвращения."

Поэтому решение, которое я использовал, должно выглядеть примерно так:

on_presence(presence){
   var presence_type = $(presence).attr('type'); // unavailable, subscribed, etc...
   var from = $(presence).attr('from'); // the jabber_id of the contact
   if (presence_type != 'error'){
     if (presence_type === 'unavailable'){
        // Mark contact as offline
     }else{
       var show = $(presence).find("show").text(); // this is what gives away, dnd, etc.
       if (show === 'chat' || show === ''){
         // Mark contact as online
       }else{
         // etc...
       }
     }
   }
   //RETURN TRUE!!!!!!!!!
   return true;
}