如何允许Ejabberd外部XMPP组件代表用户发送在线数据包

时间:2016-02-05 14:02:59

标签: xmpp ejabberd

我为Ejabberd编写了一个外部组件,但在尝试代表用户发送在线节时,我得到400错误。

该组件的名称是bot.domain.com,Ejabberd中的主机名是domain.com,我已经设置了" check_from"我的组件标记为false。

以下是我尝试代表用户从组件发送的状态节的示例:

<presence from="user@domain.com">
    <status>Test status</status>
    <show>dnd</show>
</presence>

这是Ejabberd返回的错误消息:

<presence type="error" to="user@domain.com">
    <status>Test status</status>
    <show>dnd</show>
    <error code="400" type="modify">
         <bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
    </error>
</presence>

如果我添加=&#34; user2@domain.com"在我发送的包裹中,目标用户实际收到包裹。

如果我添加到=&#34; domain.com&#34;,我不会再收到400错误,但不会向用户的名单中的任何人广播此状态。

实际问题似乎是Ejabberd没有向用户名单中的每个人广播在线状态数据包。

任何想法我可能会遗漏或为什么我没有指定&#34;到&#34;场?

1 个答案:

答案 0 :(得分:0)

您无法代表用户从组件广播名册状态。组件服务不会加载用户名单。只有ejabberd_c2s负责加载名册以广播存在。它还负责检查隐私列表和XMPP的许多重要功能。

作为旁注,我不知道您对该方法的期望是什么,但您可以在XMPP中拆分用户会话中的状态。用户首先在线,因为他在XMPP上打开会话,但仅次于因为他发送了存在。通过伪造用户组件的状态发送,您无法保证该用户将打开会话。在这种情况下,整体行为肯定不会是你期望的行为。