繁体   English   中英

如何在Ejabberd elixir模块中注册IQ处理程序?

[英]How to register IQ handler in Ejabberd elixir module?

我正在尝试在elixir模块中注册IQ处理程序(使用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节调用处理程序时:

<iq type="set" id="test" to="<user>@<host>">
  <query xmlns="module:test"/>
</iq>

我收到错误代码为400的IQ错误节: Unknown tag <query/> qualified by namespace 'module:test'

decode_iq_subel猜测:在处理程序模块中添加一个名为decode_iq_subel的函数,该函数返回其参数:

def decode_iq_subel(el) do
   el
end

我怀疑您收到的错误来自此处 -ejabberd调用xmpp库来解码iq节的子元素,但是由于xmpp对您的自定义命名空间一无所知,因此它引发了unknown_tag错误,该错误被格式化为Unknown tag ... qualified by namespace ... 在这里

我赞成Legocia的。 要添加到像@legoscia这样的聪明人的脑海中,这是因为这里需要一个模块(您的包含自定义逻辑的模块)应该具有encode_iq函数...查看周围的代码,并尝试了解其作用。

如果你想了解流动..从启动功能

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM