【发布时间】:2016-08-01 10:36:54
【问题描述】:
我更改了聊天室的“主题”,但没有得到最新的主题名称。我正在使用“disco#info”来获取房间信息。作为回应,我得到了在创建房间时最初设置的房间标题,但不是最新的房间主题。如何获取最新的房间主题?
【问题讨论】:
标签: xmpp ejabberd xmppframework ejabberd-module ejabberd-api
我更改了聊天室的“主题”,但没有得到最新的主题名称。我正在使用“disco#info”来获取房间信息。作为回应,我得到了在创建房间时最初设置的房间标题,但不是最新的房间主题。如何获取最新的房间主题?
【问题讨论】:
标签: xmpp ejabberd xmppframework ejabberd-module ejabberd-api
必须自定义 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 查询中发回。只有 name 和 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]).
如果您在通过“ejabberdctl debug”调出的 erlang shell 中尝试此操作,那么您还需要提取“state”和“text”的记录定义。为此,请创建一个名为“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”,然后使用shell“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 shell 中执行此操作,请确保在尝试执行代码以获取房间状态和主题之前导入这些记录定义!
此外,请注意在由 muc 房间进程本身执行的回调中执行此操作。对 p1_fsm:sync_send_all_state_event( ) 的调用会向房间进程发送一条消息,如果您将它发送到您自己的进程并阻塞,该消息将超时。从另一个进程查询房间状态!
【讨论】: