【问题标题】:Understanding ejabberd filter_packet hook parameters了解 ejabberd filter_packet 挂钩参数
【发布时间】:2015-10-18 18:57:17
【问题描述】:

我正在尝试使用 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 中获取不同元组元素的值?

【问题讨论】:

    标签: erlang xmpp ejabberd


    【解决方案1】:

    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 记录中提取和操作数据,您可以提取记录的所需字段:名称、属性和子项。

    记录定义为:

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-30
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多