Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 让ejabberd在客户端状态更改时通知外部模块_Python_Xmpp_Ejabberd - Fatal编程技术网

Python 让ejabberd在客户端状态更改时通知外部模块

Python 让ejabberd在客户端状态更改时通知外部模块,python,xmpp,ejabberd,Python,Xmpp,Ejabberd,我在jabber.domain.com上有一个ejabberd服务器,在presence.domain.com上有一个用python编写的xmpp组件(使用sleekxmpp) 我希望组件在每次客户端将其状态从可用更改为不可用时收到通知,反之亦然 客户本身没有任何联系人 目前,我已设置我的客户将他们可用的状态节发送到admin@presence.domain.com,我会收到他们的在线/离线状态通知。但我觉得这不是正确的方法 我希望客户端不会注意到presence.domain.com上的组件,

我在jabber.domain.com上有一个ejabberd服务器,在presence.domain.com上有一个用python编写的xmpp组件(使用sleekxmpp)

我希望组件在每次客户端将其状态从可用更改为不可用时收到通知,反之亦然

客户本身没有任何联系人

目前,我已设置我的客户将他们可用的状态节发送到admin@presence.domain.com,我会收到他们的在线/离线状态通知。但我觉得这不是正确的方法

我希望客户端不会注意到presence.domain.com上的组件,他们只需连接到jabber.domain.com,服务器会以某种方式通知该组件客户端的存在

有办法吗? 我的组件设置正确吗?或者我应该考虑使用xmpp插件/模块/等等


谢谢

为此编写自定义ejabberd模块并不困难。它需要注册到ejabberd中的状态更改挂钩,并在每个状态数据包上向您的外部组件发送通知

有一对钩子“set\u presence\u hook”和“unset\u presence\u hook”,您的模块可以向其注册,以便在用户启动/结束会话时得到通知

如果您需要跟踪其他状态,还有一个钩子“c2s\u update\u presence”,可以在用户发送的状态数据包上触发


不使用自定义模块的另一种可能性是使用共享名册。添加admin@presence.domain.com到所有用户的共享名册,但在这种情况下,他们将看到此项目反映在他们的名册上。

为此编写自定义ejabberd模块并不困难。它需要注册到ejabberd中的状态更改挂钩,并在每个状态数据包上向您的外部组件发送通知

有一对钩子“set\u presence\u hook”和“unset\u presence\u hook”,您的模块可以向其注册,以便在用户启动/结束会话时得到通知

如果您需要跟踪其他状态,还有一个钩子“c2s\u update\u presence”,可以在用户发送的状态数据包上触发


不使用自定义模块的另一种可能性是使用共享名册。添加admin@presence.domain.com到所有用户的共享名册,但在这种情况下,他们将看到此项目反映在他们的名册上。

组件可以完全按照用户的方式订阅用户的状态。用户也可以订阅组件的存在。您只需遵循通常的模式,即组件/用户发送类型为
subscribe
,用户/组件可以通过发送类型为
subscribed
来接受

您还可以让用户直接向组件发送状态信息


无需编写自定义挂钩或创建代理用户。

组件可以像用户一样订阅用户的状态。用户也可以订阅组件的存在。您只需遵循通常的模式,即组件/用户发送类型为
subscribe
,用户/组件可以通过发送类型为
subscribed
来接受

您还可以让用户直接向组件发送状态信息


无需编写自定义挂钩或创建代理用户。

谢谢,这就是我现在正在做的,但感觉这种设置将客户端(用户)与服务器实现高度耦合。这三个选项中的哪一个是“This”?抱歉,这是“订阅组件存在的用户”。如果不需要,您不必同时订阅。但是,如果您的组件变得可用/不可用,这将为您提供所需的最小耦合。谢谢,这是我现在正在做的,但感觉此设置将客户端(用户)与服务器实现高度耦合。这三个选项中的哪一个是“this”?抱歉,这是“用户订阅组件的状态”。如果不需要,您不必同时订阅。但是,如果您的组件变得可用/不可用,这将为您提供所需的最小耦合。谢谢,我将尝试您的解决方案。当我找到它时,我会在这里再次发布。使用了您的自定义模块建议。这对我们的用户来说是最透明的,也是问题最少的(到目前为止;)@DoodyP:我们可以在聊天中扩展讨论吗谢谢,我将尝试你的解决方案。当我找到它时,我会在这里再次发布。使用了您的自定义模块建议。这对我们的用户来说是最透明的,也是问题最少的(到目前为止;)@DoodyP:我们可以在这个聊天中扩展讨论吗?据我所知,sleekxmpp是一个同步/阻塞库,它将阻塞通信,直到完成当前任务处理,这意味着当下一条消息到达您的ejabberd并转发到您的sleekxmpp时,它将不得不等待消息完成,从而降低您使用ejabberd的总体性能。。你是如何解决这个问题的?我放弃了光滑的XMPP组件配置,设置了@ppolv在回答中描述的ejabberd模块。现在,每当客户端连接/断开连接时,xmpp服务器都会向外部服务发送一条消息。外部服务跟踪客户的状态。据我所知,sleekxmpp是一个同步/阻塞库,它将阻塞通信,直到完成当前任务处理,这意味着当下一条消息到达您的ejabberd并转发到您的sleekxmpp时,它将不得不等到它完成,因此,降低使用ejabberd的总体性能。。您是如何解决这个问题的?我放弃了光滑的xmpp组件配置,设置了@ppolv descripi的ejabberd模块