Перехватить вход / выход из ejabberd - PullRequest
3 голосов
/ 06 декабря 2011

Я хочу знать, когда пользователь вошел в систему и вышел из сеанса ejabberd в пользовательском модуле, без изменения кода ejabberd.

Мне это нужно, потому что я должен выполнить некоторые действия, когда пользователь входит в систему, и очистить действия, которые я делал, когда пользователь выходит из системы. Кроме того, мне нужно иметь возможность выйти из системы пользователя при определенных обстоятельствах.

Итак, есть ли способ расширить какой-нибудь модуль, чтобы получить эту функцию? Я все еще ищу некоторую документацию, которая могла бы помочь мне в этом.

1 Ответ

9 голосов
/ 06 декабря 2011

Вы можете написать свой собственный код и собрать его с плагином с поведением gen_mod, которое дает вам ejabberd. Хорошее место для начала - это блог / учебник и следуйте до следующая часть . Этого должно быть достаточно, но вы найдете больше в том же блоге.

После того, как вы освоитесь с созданием собственного модуля, я предлагаю вам взглянуть на хуки set_presence_hook и unset_presence_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>

Надеюсь, эта помощь

...