【问题标题】:How to get latest room subject from ejabberd/xmpp?如何从 ejabberd/xmpp 获取最新的房间主题?
【发布时间】:2016-08-01 10:36:54
【问题描述】:

我更改了聊天室的“主题”,但没有得到最新的主题名称。我正在使用“disco#info”来获取房间信息。作为回应,我得到了在创建房间时最初设置的房间标题,但不是最新的房间主题。如何获取最新的房间主题?

【问题讨论】:

    标签: xmpp ejabberd xmppframework ejabberd-module ejabberd-api


    【解决方案1】:

    必须自定义 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 中获取主题名称。

    【讨论】:

      【解决方案2】:

      在 XMPP MUC 协议中,主题和标题是两个不同的东西。标题通过配置表单设置,可以在服务发现中显示。主题是一个动态主题,当他加入房间时发送给参与者。主题未在 disco#info 查询中发回。只有 name 和 room_description 会在发现信息中发回。

      【讨论】:

      • 我同意你的看法。但是如果我改变房间的主题,我不会在迪斯科#info 中得到它。我总是遇到老话题。
      • 如我所说,disco#info 中不显示主题。你得到名字和房间描述,但没有主题。你没有得到老主题,你得到一个描述,这是单独的数据。
      • 正如我所说:“主题是一个动态主题,当他加入房间时发送给参与者。”也就是说,你需要加入房间才能获得主题。
      【解决方案3】:

      如果有人还在寻找这个,这里有一个快速的方法来做到这一点,比如 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( ) 的调用会向房间进程发送一条消息,如果您将它发送到您自己的进程并阻塞,该消息将超时。从另一个进程查询房间状态!

      【讨论】:

        猜你喜欢
        • 2014-10-30
        • 2012-06-01
        • 2016-11-09
        • 2015-08-31
        • 2012-09-13
        • 2015-06-14
        • 1970-01-01
        • 2014-06-25
        • 2021-11-25
        相关资源
        最近更新 更多