Я пытаюсь зарегистрировать обработчик IQ в модуле elixir (используя модуль Ejabberds gen_iq_handler), но не могу заставить его работать. Кажется, что он регистрирует обработчик, но функция не вызывается.
Регистрация хуков работает должным образом (вызывая функцию on_presence), но обработчик не обнаружен.
:gen_iq_handler.add_iq_handler
возврат :ok
Я попытался передать полностью определенное имя (атом) для функции (например, :"Elixir.ModPresenceDemo.on_iq_received"
) без успеха и передать параметр пространства имен в виде списка символов также без успеха
Вот функции start и on_iq_received:
def start(host, _opts) do
info("Starting ejabberd module Presence Demo #{host}")
Ejabberd.Hooks.add(:set_presence_hook, host, __MODULE__, :on_presence, 50)
result = :gen_iq_handler.add_iq_handler(:ejabberd_sm, host, "module:test", __MODULE__, :on_iq_received)
info(host)
info(__MODULE__)
info(result)
:ok
end
...
def on_iq_received(iq) do
info('Received data for IQ handler')
IO.inspect(iq)
iq
end
при вызове обработчика с помощью iq stanza:
<iq type="set" id="test" to="<user>@<host>">
<query xmlns="module:test"/>
</iq>
Я получаю раздел IQ с кодом ошибки 400:
Unknown tag <query/> qualified by namespace 'module:test'