我运行用erlang / exmpp编写的ejabberd和bot。我连接到这个机器人一些jabber客户端。我怎样才能抓住客户端断开连接?
答案 0 :(得分:2)
你的意思是什么? 对于调试,在ejabberd_sm中添加?DEBUG:close_session。 用于跟踪ejabberd_c2s上的dbg:terminate和相同的ejabberd_sm:close_session。 对于应用程序调用,请订阅sm_remove_connection_hook。 也许实现自己的钩子并使用自定义的钩子?
答案 1 :(得分:1)
我真的不知道如果我理解你是对的,但是如果你有能力让客户端向机器人发送直接存在,那么当用户离线时,服务器会向机器人发送断开连接的通知
您可以在RFC 3921中找到一些文档 这是一个痘痘提取物。
5.1.4。定向存在
用户可以将定向存在发送给另一个实体(即,a 存在节带有'to'属性,其值是JID的 其他实体,没有'type'属性或'type'属性 其值为“不可用”)。有三种可能的情况:
- ...
- 如果用户将定向在线状态发送给不在的实体 订阅类型为“from”或“both”之后的用户名单 已发送初始状态并且在发送不可用状态之前 广播,用户的服务器必须路由或提供完整的XML 存在节到entityv(...);但是,如果可用的话 用户发送定向存在的资源变为 不可用,用户的服务器必须广播不可用的 存在于实体(如果用户尚未发送指示 不存在该实体的存在)。
- ...
醇>
希望得到这个帮助。
答案 2 :(得分:0)
我认为您正在尝试检查用户何时关闭c2s连接而不是检查用户何时发送离线节,您可以为此目的编辑和自定义ejabberd_c2s.erl。在ejabber_c2s中,处理断开连接的功能是终止/ 3(第1425行),你可以很容易地找到客户端的jabber id。