Как получить последнюю тему комнаты из ejabberd/xmpp?

Я изменил «Тему» чата, но я не получаю это последнее название темы. Я использую «disco#info», чтобы получить информацию о комнате. В ответ я получаю название комнаты, которое было задано изначально при создании комнаты, но не последнюю тему комнаты. Как я могу получить последнюю тему комнаты?


person akhileshnair    schedule 11.04.2016    source источник


Ответы (3)


Пришлось настроить модуль Erlang mod_muc_room.erl.

Были ли эти изменения в iq_disco_info_extras:

  1. Создал новую функцию get_subject, которая получает тему комнаты от StateData.
  2. Добавлен новый параметр в iq_disco_info_extras для получения предмета комнаты и вызвана функция RoomSubject = get_subject(StateData).
  3. Добавлен новый RFIELD как ?RFIELD(<<"Room subject">>, <<"muc#roominfo_subject">>, RoomSubject),
  4. Скомпилировал модуль mod_muc_room.erl, который обновил файл mod_muc_room.beam.

Тада... это сработало как кусок пирога!

Теперь получаем имя субъекта в roominfo.

person akhileshnair    schedule 04.05.2016

В протоколе XMPP MUC тема и заголовок — это две разные вещи. Название задается через форму конфигурации и может отображаться в сервисном обнаружении. Тема — это динамическая тема, которая отправляется участнику, когда он присоединяется к комнате. Тема не возвращается в запросе disco#info. Только имя и room_description отправляются обратно в информации об обнаружении.

person Mickaël Rémond    schedule 11.04.2016
comment
Я с тобой согласен. Но если я сменю тему для комнаты, я не получу ее в disco#info. Я всегда получаю старую тему. - person akhileshnair; 11.04.2016
comment
Как я уже сказал, тема не отображается в disco#info. Вы получаете name и room_description, но не тему. Вы не устареваете, вы получаете описание, которое является отдельными данными. - person Mickaël Rémond; 11.04.2016
comment
Как я уже сказал: Тема — это динамическая тема, которая отправляется участнику, когда он присоединяется к комнате. Другими словами, вам нужно присоединиться к комнате, чтобы получить предмет. - person Mickaël Rémond; 12.04.2016

Если кто-то все еще ищет это, вот быстрый способ сделать это из чего-то вроде плагина/модуля ejabberd:

{ok,Room_PID} = mod_muc:find_online_room(<<"my_muc_room_name">>, <<"conference.my.server.com">>),    
{ok,Room_State} = p1_fsm:sync_send_all_state_event(Room_PID, get_state),    
Room_Subject_List = Room_State#state.subject,    
Room_Subject = hd(Room_Subject_List),    
Subject = Room_Subject#text.data,    
io:format("~ts~n", [Subject]).

Если вы пытаетесь сделать это из оболочки erlang, которую вы запустили с помощью «ejabberdctl debug», вам также потребуется получить определения записей для «состояния» и «текста». Для этого создайте текстовый файл с именем, например, "my_record_includes.hrl" с содержимым примерно следующего содержания (конечно, вам придется настроить пути к файлам в зависимости от вашей установки ejabberd).

-include("/opt/ejabberd-19.05/lib/xmpp-1.3.4/include/jid.hrl").
-include("/opt/ejabberd-19.05/lib/xmpp-1.3.4/include/xmpp_codec.hrl").
-include("/opt/ejabberd-19.05/lib/ejabberd-19.05/include/mod_muc_room.hrl").

После того, как вы создали «my_record_includes.hrl», используйте команду оболочки «rr», чтобы импортировать его следующим образом:

> rr("my_record_includes.hrl").

[activity,address,addresses,adhoc_actions,adhoc_command,
 adhoc_note,avatar_data,avatar_info,avatar_meta,
 avatar_pointer,bind,block,block_item,block_list,bob_data,
 bookmark_conference,bookmark_storage,bookmark_url,
 bytestreams,caps,carbons_disable,carbons_enable,
 carbons_private,carbons_received,carbons_sent,chatstate,
 compress,compress_failure,compressed|...]

Если вы делаете это в оболочке erlang, убедитесь, что вы импортируете определения этих записей ДО того, как попытаетесь выполнить код для захвата состояния и темы комнаты!

Кроме того, будьте осторожны, выполняя это из обратного вызова, который выполняется самим процессом muc room. Вызов p1_fsm:sync_send_all_state_event() отправляет сообщение процессу комнаты, и время ожидания истекает, если вы отправляете его своему собственному процессу и блокируете. Сделайте запрос состояния комнаты из другого процесса!

person Roy Wood    schedule 31.10.2019