Я изменил «Тему» чата, но я не получаю это последнее название темы. Я использую «disco#info», чтобы получить информацию о комнате. В ответ я получаю название комнаты, которое было задано изначально при создании комнаты, но не последнюю тему комнаты. Как я могу получить последнюю тему комнаты?
Как получить последнюю тему комнаты из ejabberd/xmpp?
Ответы (3)
Пришлось настроить модуль Erlang mod_muc_room.erl
.
Были ли эти изменения в iq_disco_info_extras
:
- Создал новую функцию
get_subject
, которая получает тему комнаты отStateData
. - Добавлен новый параметр в
iq_disco_info_extras
для получения предмета комнаты и вызвана функцияRoomSubject = get_subject(StateData)
. - Добавлен новый
RFIELD
как?RFIELD(<<"Room subject">>, <<"muc#roominfo_subject">>, RoomSubject)
, - Скомпилировал модуль
mod_muc_room.erl
, который обновил файлmod_muc_room.beam
.
Тада... это сработало как кусок пирога!
Теперь получаем имя субъекта в roominfo
.
В протоколе XMPP MUC тема и заголовок — это две разные вещи. Название задается через форму конфигурации и может отображаться в сервисном обнаружении. Тема — это динамическая тема, которая отправляется участнику, когда он присоединяется к комнате. Тема не возвращается в запросе disco#info. Только имя и room_description отправляются обратно в информации об обнаружении.
Если кто-то все еще ищет это, вот быстрый способ сделать это из чего-то вроде плагина/модуля 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() отправляет сообщение процессу комнаты, и время ожидания истекает, если вы отправляете его своему собственному процессу и блокируете. Сделайте запрос состояния комнаты из другого процесса!