了解ejabberd filter_packet挂钩参数

时间:2015-07-28 09:37:32

标签: erlang xmpp ejabberd

我正在尝试使用Smack和ejabberd实现聊天消息传递应用程序。我在我的服务器上的filter_packet挂钩中获得了Packet参数下面的输入:

   {{jid,<<"senderUserName">>,<<"domain.com">>,<<"Smack">>,<<"senderUserName">>,<<"domain.com">>,<<"Smack">>},{jid,<<"receiverUserName">>,<<"domain.com">>,<<>>,<<"receiverUserName">>,<<"domain.com">>,<<>>},{xmlel,<<"message">>,[{<<"xml:lang">>,<<"en">>},{<<"to">>,<<"receiverUserName@domain.com">>},{<<"id">>,<<"4Xd7d-13">>},{<<"type">>,<<"chat">>}],[{xmlel,<<"body">>,[],[{xmlcdata,<<"my message">>}]},{xmlel,<<"thread">>,[],[{xmlcdata,<<"25e5fc87-e57f-4046-9aef-30c569ab9160">>}]},{xmlel,<<"customTag">>,[],[{xmlcdata,<<"Custom extras">>}]}]}}

以下是我的问题:

  1. 为什么我两次获得发件人和收件人用户名?
  2. 如何在Erlang中获取不同元组元素的值?

1 个答案:

答案 0 :(得分:2)

ejabberd filter_packet hook参数是一个包含以下值的元组:{FromJID, ToJID, XMLPacket}

  • FromJID是#jid{}记录。
  • ToJID是#jid{}
  • XMLPacket是#xmlel{}记录,是原始XMPP数据包的已解析表示。

您的第一个问题是关于#jid{}记录结构(From和To)。内部记录不能直接使用,而是通过jlib.erl功能使用。但是,目前,该记录确实已经过优化,以避免在namepreped,nodepreped用户名和域上进行额外的处理和匹配。 namepreped / nodepreped值存储为原始未更改值的附加值。如果处理的值等于原始值,是的,您可能会觉得这是重复的。但是,如果您使用各种大小写和一些特殊的unicode字符,则会有所不同。

我猜你的第二个问题是关于解析的XML元素数据结构。要从#xmlel记录中提取和操作数据,您可以提取记录所需的字段:name,attrs和children。

记录定义为:

-record(xmlel, {
    name = <<"">> :: binary(),
    attrs    = [] :: [attr()],
    children = [] :: [xmlel() | cdata()] }).

您可以使用子列表在XML树中使用该信息。 您还可以在xml.erl模块中找到现成的辅助函数。