Как зарегистрировать обработчик IQ в модуле Ejabberd elixir? - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь зарегистрировать обработчик 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'

1 Ответ

1 голос
/ 05 июня 2019

Неожиданное предположение: добавьте функцию с именем decode_iq_subel в модуль обработчика, который возвращает его аргумент:

def decode_iq_subel(el) do
   el
end

Я подозреваю, что полученная вами ошибка происходит от здесь -ejabberd вызывает библиотеку xmpp для декодирования подэлемента раздела iq, но поскольку xmpp ничего не знает о вашем пользовательском пространстве имен, он выдает ошибку unknown_tag, которая форматируется в Unknown tag ... qualified by namespace ... здесь .

...