Strophe.js MUC: создание комнаты и объединение нескольких комнат

Я создаю веб-сайт чата и использую Strophe.js и плагин Strophe.muc.js. Функции одиночного чата работают нормально, но я также не хочу реализовывать функцию группового чата, где пользователи могут создавать комнаты и приглашать других пользователей в свою комнату. Используя плагин muc, я могу создать комнату, но проблема в том, что пока я ее не настрою (наверное), другие пользователи не смогут присоединиться, и комната не будет постоянной. Я знаю, что у плагина muc есть методы настройки, но я не знаю, как создать объект формы конфигурации, я понятия не имею, как он должен выглядеть. Это будет моя первая проблема. Во-вторых: возможно ли, что я присоединяюсь более чем к одной комнате и получаю сообщения от всех комнат, в которых я нахожусь? Если нет, то нет нужды давать мне ответ на мой первый вопрос...


person Hampel Előd    schedule 16.12.2013    source источник


Ответы (2)


  1. Вы можете сделать комнаты постоянными по умолчанию на вашем jabber-сервере.
  2. Создание комнат — это двухэтапный процесс. Сначала создайте комнату, затем настройте комнату.
  3. Вы можете присоединиться к любому количеству комнат.

Конфигурация комнаты похожа (вы получите форму на первом шаге доступных полей, если вы проверите ответ от сервера).

2-й шаг выглядит так:

var iq, stanza;
iq = $iq({
    to: newroomjid,
    type: "set"
}).c("query", {
    xmlns: Strophe.NS.MUC_OWNER
});
iq.c("x", {
    xmlns: "jabber:x:data",
    type: "submit"
});
iq.c('field', { 'var': 'FORM_TYPE' }).c('value').t('http://jabber.org/protocol/muc#roomconfig').up().up();
iq.c('field', { 'var': 'muc#roomconfig_roomname' }).c('value').t(roomName).up().up();
stanza = iq.tree();
person Mark S    schedule 16.12.2013
comment
Спасибо за ваш ответ, но это не сработало, а также я хотел бы использовать методы, предоставленные Strophe.muc.js: настроить, сохранить конфигурацию. - person Hampel Előd; 16.12.2013
comment
Они не работали для меня, поэтому выше. Я ходил вокруг них некоторое время. Вы получили сообщение об ошибке? - person Mark S; 16.12.2013
comment
О, и вы можете создать комнату, просто присоединившись к ней. Конфигурация сложная. - person Mark S; 16.12.2013
comment
Да, я получил сообщение об ошибке: ReferenceError: Форма не определена. Эта форма находится внутри метода saveConfiguration: if (config instanceof Form) - person Hampel Előd; 16.12.2013
comment
Та же проблема была, поэтому я создал свою собственную строфу. Вы получили ошибку, когда попробовали приведенный мной пример строфы? - person Mark S; 16.12.2013
comment
Спасибо, я попробовал еще раз, и теперь он работает с вашей строфой: D - person Hampel Előd; 17.12.2013
comment
Теперь у меня есть еще один вопрос: как мне отправлять и обрабатывать входящие сообщения группового чата? Прежде всего, правильно ли выглядит следующая последовательность действий: я создаю комнату, используя метод соединения strophe.muc (connection.muc.join(roomname, псевдоним, onGroupMessage, onGroupPresence)) -> я создаю предоставленную вами строфу -> я пришлите IQ -> я приглашаю несколько человек. Когда они принимают приглашение, они отправляют обратно сообщение группового чата (используя функцию сообщения strophe.muc), информируя меня о том, что они сейчас в комнате, но моя функция onGroupMessage не срабатывает. - person Hampel Előd; 17.12.2013
comment
Если я правильно понял ваш вопрос, попробуйте этот обработчик: connection.addHandler(onInvite, 'jabber:x:conference'). Сообщение, отправленное обратно, не имеет типа. - person Mark S; 17.12.2013
comment
Нет, это у меня уже есть. Это обработчик приглашения. Мне нужен отправитель и получатель сообщений группового чата (обработчик сообщений группового чата). - person Hampel Előd; 17.12.2013
comment
для отправки: connection.send($msg({ to: toJid, from: connection.jid, type: 'groupchat' }).c('body').t(txt)), для обработки: addHandler(onMsg, null , «сообщение», «групповой чат») - person Mark S; 17.12.2013

Попробовав решение Mark S, я обнаружил, что для создания комнаты мне нужно сначала отправить присутствие. Я перечисляю весь код ниже и надеюсь, что это поможет.

//before executing the code below, you need to connect to IM server (var conn is Strophe.Connection)
var userName = "steve",
    serverName = "example.com",
    userJid = userName + '@' + serverName,
    roomJid = 'testRoom' + '@conference.' + serverName,
    iq;

//send presence first for creating room
var d = $pres({'from': userJid, 'to': roomJid + '/' + userName})
conn.send(d.tree());

iq = $iq({
    to: roomJid,
    type: 'set'
}).c("query", {
    xmlns: Strophe.NS.MUC_OWNER
});
iq.c("x", {
    xmlns: "jabber:x:data",
    type: "submit"
});

//send configuration you want
iq.c('field', { 'var': 'FORM_TYPE' }).c('value').t('http://jabber.org/protocol/muc#roomconfig').up().up();
iq.c('field', { 'var': 'muc#roomconfig_publicroom' }).c('value').t('1').up().up();

conn.sendIQ(iq.tree(), function () { console.log('success'); }, function (err) { console.log('error', err); });

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

person gunblues    schedule 08.08.2014