2015-10-11 48 views
2

以下是被挂钩的函数中记录的数据包之一filter_packet hook。Ejabberd只打印“消息”数据包

I(<0.10945.0>:my_module:46) : in_filter_packet: {xmlelement,"message", 
               [{"type","headline"}], 
               [{xmlelement,"event", 
                [{"xmlns", 
                "http://jabber.org/protocol/pubsub#event"}], 
                [{xmlelement,"items", 
                [{"node", 
                 "http://jabber.org/protocol/tune"}], 
                [{xmlelement,"item", 
                 [{"id", 
                 "5A487A38503FE"}], 
                 [{xmlelement,"tune", 
                 [{"xmlns", 
                  "http://jabber.org/protocol/tune"}], 
                 []}]}]}]}, 
                {xmlelement,"addresses", 
                [{"xmlns", 
                "http://jabber.org/protocol/address"}], 
                [{xmlelement,"address", 
                [{"type","replyto"}, 
                 {"jid", 
                 "[email protected]/10042049171444555575238273"}], 
                []}]}]} 

如何筛选出只有“消息”, “类型”包?即目前挂钩功能看起来像

on_filter_packet({From, To, Packet} = Input) -> 
     ?INFO_MSG("in_filter_packet: ~p ", [Packet]), %[gen_mod:get_module_opt(global, ?MODULE, debug, false)]), 
     Input. 

如何写代码** if(packet.type == message)only then print **?

回答

1

type是一个XML属性,因此您需要使用函数xml:get_tag_attr_s来获取该值。然后,使用case根据值进行切换:

on_filter_packet({From, To, Packet} = Input) -> 
    ?INFO_MSG("in_filter_packet: ~p ", [Packet]), %[gen_mod:get_module_opt(global, ?MODULE, debug, false)]), 
    case xml:get_tag_attr_s("type", Packet) of 
     "message" -> 
      %% Do something with "message" packets, 
      %% and finally return a value. 
      Input; 
     _ -> 
      %% Something other than "message". 
      %% Ignore it and return the original packet. 
      Input 
    end.