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

如何允许Ejabberd外部XMPP组件代表用户发送状态数据包,xmpp,ejabberd,Xmpp,Ejabberd,我为Ejabberd编写了一个外部组件,但是当试图代表用户发送状态节时,我得到了一个400错误 组件的名称是bot.domain.com,Ejabberd中的主机名是domain.com,我已将我的组件的“check_from”标志设置为false 下面是我试图代表用户从组件发送的状态节示例: <presence from="user@domain.com"> <status>Test status</status> <show>d

我为Ejabberd编写了一个外部组件,但是当试图代表用户发送状态节时,我得到了一个400错误

组件的名称是bot.domain.com,Ejabberd中的主机名是domain.com,我已将我的组件的“check_from”标志设置为false

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

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

测试状态
dnd
这是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>

测试状态
dnd
如果我加上=”user2@domain.com“在我发送的包中,目标用户实际上收到了包

如果我添加到=“domain.com”,我不会再收到400错误,但不会向用户名册中的任何人广播该状态

实际问题似乎是Ejabberd没有向用户名册中的每个人广播状态信息包。


您知道我可能遗漏了什么,或者为什么在未指定“to”字段时出现400错误吗?

您不能从组件代表用户广播花名册状态。组件服务不加载用户花名册。只有
ejabberd_c2s
负责将花名册加载到广播状态。它还负责检查隐私列表和XMPP的许多重要特性


顺便说一句,我不知道您希望用这种方法做什么,但您可以在XMPP中从用户会话中分离状态。用户首先在线是因为他在XMPP上打开了一个会话,其次是因为他发送了状态信息。通过假装从组件向用户发送状态信息,您不能保证该用户将打开会话。在这种情况下,整体行为肯定不是您所期望的。

感谢Mickeel,其目的是在用户浏览我们网站的特定部分时,仅使用组件更新用户的状态消息。如上所述,标准Ejabberd安装无法做到这一点,因此唯一的方法是修改Ejabberd_服务模块,以广播我们的组件代表用户发送的状态数据包。