如何允许Ejabberd外部XMPP组件代表用户发送状态数据包
我为Ejabberd编写了一个外部组件,但是当试图代表用户发送状态节时,我得到了一个400错误 组件的名称是bot.domain.com,Ejabberd中的主机名是domain.com,我已将我的组件的“check_from”标志设置为false 下面是我试图代表用户从组件发送的状态节示例:如何允许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
<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_服务模块,以广播我们的组件代表用户发送的状态数据包。