Система живого чата на основе XMPP в Джанго - PullRequest
4 голосов
/ 05 июля 2011

Мне нужно внедрить систему живого чата на основе XMPP в Django.После долгих раздумий и идей коллеги мы пришли к следующему.


Метод с использованием бота:

  • Когда посетитель посещает сайт.Клиент XMPP посетителя, в данном случае это Strophe.JS, начинает соединение XMPP-over-BOSH с сервером XMPP и подключается к комнате с именем <visitor_id>@conference.demo.com.В настоящее время в комнате больше никого нет.
  • Посетитель делает запрос на аналитику с пользовательским идентификатором посетителя к Django
  • Представление Django сохраняет идентификатор посетителя в таблице с именем ActiveUsers,Эта таблица также содержит новое поле с именем status.Он устанавливает status в INACTIVE.
  • . Эта модель отправляет сигнал по методу save.
  • Этот сигнал принимается ботом, который подключается к серверу XMPP иприсоединяется к комнате <visitor_id>@conference.demo.com.Теперь у нас есть пользователь и бот в комнате.
  • Пользователи службы поддержки сайта зарегистрированы в своем веб-интерфейсе.
  • У них есть JS-код, который постоянно опрашивает сайт Django, чтобы проверитьActiveUsers.Он выбирает строки из таблицы и отображает их.(Я подумал об использовании django-pubsub для этого)
  • Когда посетитель набирает сообщение, оно отправляется через XMPP-over-BOSH на сервер XMPP, бот jabber вroom видит это сообщение и обновляет статус записи в таблице ActiveUsers до ACTIVE.
  • Как сказано: у людей, поддерживающих сайт, есть JS, который продолжает опрашивать эту таблицу.Он начинает мигать, показывая, что пользователь сейчас общается.
  • Персонал службы поддержки теперь может дважды щелкнуть по этой строке, после чего начинается соединение XMPP-over-BOSH с комнатой посетителя.Он знает, что комната - <visitor_id>@conference.demo.com.
  • Бот, увидев, что сотрудник службы поддержки присоединился к комнате, обновляет запись ActiveUsers, чтобы показать CHATTING.Это гарантирует, что в комнате может находиться только вспомогательный персонал, т. Е. Комната занята.
  • Бот записывает сообщения на стол Django
  • Когда оба видят, что оба пользователя покинули комнату,удаляет запись.

ejabberd или openfire будет сервером XMPP.Apache - это веб-сервер, который запускает mod_wsgi для обслуживания Django и mod_proxy для передачи запросов XMPP-over-BOSh на сервер XMPP.

Похоже ли это на пользу?Какие-либо предложения?Я беспокоюсь о загрузке системы Django.

(Это долго. Извините, но я не знаю.)


Метод с использованием Stanzas Presence:

Нана стороне клиента, я использую библиотеку Strophe JS, которая поддерживает присутствие, и я добавил методы обратного вызова.Я гибко использую ejabberd или openfire в качестве моего сервера XMPP.На сервере XMPP много посетителей - некоторые с сайта A, а некоторые с сайта B, но все они подключены к одному и тому же XMPP-серверу.Когда посетитель посещает сайт, он подключается к XMPP-серверу как <visitor_id>_<site_id>@demo.com, и каждый из них попадает в комнату под названием <visitor_id>@conference.demo.com.Персонал отдела продаж / поддержки также подключен к серверу XMPP как <supportsale_id>_<site_id>@demo.com.Они не связаны ни с одной из комнат чата.У них нет ни одного посетителя в их списке.

Хороший способ показать, что пользователь подключился к сайту, - передать раздел присутствия продавцам / специалистам службы поддержки.Только посетители и сотрудники отдела продаж / поддержки с одного и того же сайта общаются друг с другом, и поэтому у меня есть <site_id> в имени пользователя, чтобы показать, к какому сайту принадлежит этот человек.

Кажется, что вы не можете подписатьсяналичие строф для пользователя, если у вас его нет в списке.(Вполне логично).Можно ли автоматически добавлять каждого нового пользователя сайта, подключенного к системе, в список сотрудников отдела продаж / поддержки этого сайта?Не будет ли это автоматически сигнализировать о присутствии сотрудникам отдела продаж / поддержки?Как я могу реализовать это - любая помощь?

Ответы [ 3 ]

2 голосов
/ 06 июля 2011

Я написал именно это.Он называется Seshat и использует бот-брокера между веб-сайтом и сервером Jabber (я использую ejabberd).Сейчас он находится в бета-версии, главным образом потому, что он не был тщательно протестирован за пределами моей компании.

Примечание: хотя README специально упоминает веб-каркас Pyramid, базовая система будет работать так же хорошо с Django, TurboGears,или система командной строки.Просто я только упаковываю пример кода, показывающего, как интегрировать его с Pyramid.

Seshat активно разрабатывается.Если у вас есть какие-либо пожелания, дайте мне знать.: -)

1 голос
/ 05 июля 2011

Я не уверен, что вам нужно использовать MUC для реализации этого.Ваш бот может поддерживать свой собственный узел pubsub, на который он подписан.Когда новый пользователь начинает печатать, он может отправить уведомление узлу pubsub, которое бот увидит.Оттуда бот может уведомить службу поддержки через XMPP, что устраняет необходимость длительного опроса таблицы базы данных.Затем специалист службы поддержки может начать стандартный сеанс чата с конечным пользователем.Кроме того, их присутствие может быть установлено как «na», чтобы показать, что они находятся в сеансе с пользователем.

1 голос
/ 05 июля 2011

Я думаю, что лучше использовать строфы присутствия, чтобы «сигнализировать» о любой (не) активности. В базе данных нужно хранить только постоянные данные, необходимые для дальнейшего анализа. В противном случае, я думаю, вы отлично проведете время, кодируя приложение:).

EDIT:

function onConnect(status) {
  if (status == Strophe.Status.CONNECTED) {
    var joined = false;
    var participants = {};
    $('#events').html('<text class="textmainleft">XMPP connection established. Ready to rock n roll!</text>');
    connection.send($pres().c('priority').t('-1'));
    connection.addHandler(notifyUser, null, 'message', 'groupchat', null, null);
    connection.send($pres({to: 'groupchatroom@conference.demo.com/' + nickname}).c('x', {xmlns: 'http://jabber.org/protocol/muc'}));
  } else if (status == Strophe.Status.AUTHFAIL) {
    $(location).attr('href', AUTHFAIL_URL);
  } else if (status == Strophe.Status.CONNFAIL) {
    $(location).attr('href', AUTHFAIL_URL);
  }
}

$(document).ready(function () {
  connection = new Strophe.Connection(BOSH_SERVICE);
  connection.connect(jid, password, onConnect);
});

notifyUser - это еще одна функция (просто ссылка onConnect), которая будет обрабатывать принятые разделы сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...