我更改了聊天室的“主题”,但没有得到最新的主题名称。我正在使用“disco#info”来获取房间信息。作为回应,我得到了在创建房间时最初设置的房间标题,但不是最新的房间主题。如何获取最新的房间主题?
3 回答
不得不自定义 Erlang 模块mod_muc_room.erl
。
这些变化是否发生在iq_disco_info_extras
:
- 创建了一个新函数
get_subject
,该函数从StateData
. - 在中添加了一个新参数
iq_disco_info_extras
以获取房间主题并调用该函数RoomSubject = get_subject(StateData)
。 - 添加了一个新
RFIELD
的 as?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( ) 的调用会向房间进程发送一条消息,如果您将它发送到您自己的进程并阻塞,该消息将超时。从另一个进程查询房间状态!