当我触发 send_message api 时,无论客户端离线还是在线,api 的响应都是 0 表示成功。所以发送的消息就是响应告诉我们的正确内容!.
但是如果客户端离线并且我现在触发send_message api,客户端将不会收到消息,那么为什么api的响应显示0-成功。如何从 ejabberd 获得由于用户离线而未发送消息的响应
它总是返回0,即肯定响应,为什么?
是的,该命令返回的结果几乎无关紧要。
该命令返回 ejabberd_router:route 返回的结果。该函数总是返回成功,除非构建节出现问题。
该节已发送,即使它发送到离线帐户或不存在的帐户。如果该节被发送到远程服务器,我们如何知道他是否收到了它?这不是节路由的问题...这是节接收确认的问题,并且该命令不关注于此。
如何从 ejabberd 获得由于用户离线而未发送消息的响应
如果目标帐户是本地帐户,并且由 ejabberd 托管,您可以检查该帐户是否有一些具有积极优先级的在线会话。如果优先级为负,则仅当您将消息发送到正确的资源时才会传递该消息。
例如:
用户在线且优先级为正(零也是正):
$ ejabberdctl user_sessions_info admin localhost
c2s_tls ::ffff:127.0.0.1 33517 0 ejabberd@localhost 67 away tka1
$ ejabberdctl send_message chat user@localhost admin@localhost "" HiZero1
$ ejabberdctl send_message chat user@localhost admin@localhost/tka1 "" HiZero2
用户收到这两条消息。
如果账户在线且优先级为负:
$ ejabberdctl user_sessions_info admin localhost
c2s_tls ::ffff:127.0.0.1 33517 -2 ejabberd@localhost 67 away tka1
此消息将不会被发送:
$ ejabberdctl send_message chat user@localhost admin@localhost "" Hiii344
此消息将被传递,因为它被发送到特定资源(tka1):
$ ejabberdctl send_message chat user@localhost admin@localhost/tka1 "" Hiii344