Erlang 拦截登录/注销ejabberd

Erlang 拦截登录/注销ejabberd,erlang,ejabberd,Erlang,Ejabberd,我想知道用户何时登录自定义模块中的ejabberd会话并从中注销,而不更改ejabberd代码 我需要它,因为我必须在用户登录时执行一些操作,并清理用户注销时执行的操作。此外,我需要能够注销用户给定的一些情况 那么,有没有办法扩展一些模块来获得这些功能呢?我仍在寻找一些可以帮助我的文档。您可以编写自己的代码,并构建一个带有ejabberd提供的行为gen_mod的插件。 一个好地方是从这里开始,然后继续。 这应该足够了,但你会在同一个博客上找到更多 在您对构建自己的模块感到稍微舒服一点之后,我建

我想知道用户何时登录自定义模块中的ejabberd会话并从中注销,而不更改ejabberd代码

我需要它,因为我必须在用户登录时执行一些操作,并清理用户注销时执行的操作。此外,我需要能够注销用户给定的一些情况


那么,有没有办法扩展一些模块来获得这些功能呢?我仍在寻找一些可以帮助我的文档。

您可以编写自己的代码,并构建一个带有ejabberd提供的行为gen_mod的插件。 一个好地方是从这里开始,然后继续。 这应该足够了,但你会在同一个博客上找到更多

在您对构建自己的模块感到稍微舒服一点之后,我建议您看看hook设置状态\u hook取消设置状态\u hook

请注意,每次设置状态时,set_presence_hook都会被激活,不仅是在登录时,如果可以的话,您只需要解决这个问题

长话短说,你最终会得到如下结果

-module(mod_your_mod).

-behavior(gen_mod).
-include("ejabberd.hrl").

-export([start/2, stop/1, on_set/4, on_unset/4]).

start(Host, _Opts) ->
   ejabberd_hooks:add(set_presence_hook, Host, ?MODULE, on_set, 50),
   ejabberd_hooks:add(unset_presence_hook, Host, ?MODULE, on_unset, 50),
   ok.

stop(Host) ->
   ejabberd_hooks:delete(set_presence_hook, Host, ?MODULE, on_set, 50),
   ejabberd_hooks:delete(unset_presence_hook, Host, ?MODULE, on_unset, 50),
   ok.

on_set(User, Server, _Resource, _Packet) ->
<presence code>    

on_unset(User, Server, _Resource, _Packet) ->
<offline code>
-模块(mod\u your\u mod)。
-行为(gen_mod)。
-包括(“ejabberd.hrl”)。
-导出([开始/2,停止/1,在设置/4,在取消设置/4])。
开始(主机,选择)->
ejabberd挂钩:添加(设置挂钩,主机,模块,设置挂钩,50),
ejabberd_钩子:添加(未设置状态钩子,主机,模块,未设置状态,50),
好啊
停止(主机)->
ejabberd挂钩:删除(设置挂钩,主机,模块,设置挂钩,50),
ejabberd_钩子:删除(未设置存在钩子,主机,模块,打开未设置,50),
好啊
在\u集合上(用户、服务器、\u资源、\u数据包)->
在_unset(用户、服务器、_资源、_数据包)->

希望这有助于使用ejabberd钩子。您需要用户可用挂钩、设置状态挂钩和取消设置状态挂钩“用户可用挂钩”的作用是什么?我知道,使用set_presence和unset_presence,我可以在用户登录或注销(以及其他)时获取事件。那么这个用户可用吗?知道为什么set_presence_hook会被触发两次吗?@nuno freitas不是hook用户可用吗?hook是正确的钩子吗?