Erlang, ejabberd, How to Deal of [{text, <<>>, << "hello" >>}] 格式



所以我的代码中有一个钩子,它说如果收到离线消息,它就会启动这个函数。

offline_msg_received(From, To, Packet) ->

数据包的代码如下所示:

{message,<<"purple2d957668">>,chat,<<>>,undefined,{jid,<<"admin">>,<<"localhost">>,<<"5280">>,<<"admin">>,<<"localhost">>,<<"5280">>},[],[{text,<<>>,<<"Hello">>}],undefined,[{xmlel,<<"active">>,[{<<"xmlns">>,<<"http://jabber.org/protocol/chatstates">>}],[]}],#{}}

我想要的是包含我的信息的部分。即:

[{text,<<>>,<<"Hello">>}]

我可以通过与整个包变量匹配的模式来获得这一部分。然而,当我尝试一个与我的消息匹配的模式时,它说论点不正确。我知道,如果我指定一个只有的变量

{text,<<>>,<<"Hello">>}

那么我就可以和它进行模式匹配了。根据我的理解,看到周围的东西意味着它是一个列表或字符串。

我可以在这里显示一些代码。

{P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11} = Packet, %% P8 is the message I want.
?INFO_MSG("----------------------P8:  ~p~n", P8), %% This shows   {text,<<>>,<<"Hello">>}
{A, B, C} = P8,  %% This gives me a badmatch error.

现在,如果我改为在代码外壳中手动执行此操作:

{text,<<>>,<<"Hello">>} = P8,
{A, B, C} = P8,

然后代码工作,并将<lt;"Hello">>在C变量中。

我的猜测是,"Package"变量中围绕它的[]与我的badmatch错误有关,但由于某种原因,当我打印出P8时,这些符号不会出现。有人有什么好的建议为什么它不起作用吗?我猜这与hidden[]有关,因为除此之外,它看起来与我的shell代码测试完全相同。

谢谢。这是我第一次在这里提问,所以我希望我没有做错什么。

INFO_MSG调用中没有看到值周围的方括号的原因是INFO_MSG需要一个值列表,而不仅仅是一个值。在上面的代码中,由于格式字符串只包含一个指令,并且值是一个元素的列表,所以括号被悄悄地去掉了。

INFO_MSG宏的工作原理与io:format相同,因此您可以在shell中尝试:

%% two arguments
io:format("~p ~pn", [foo, bar]).
%% one argument - we still need square brackets
io:format("~pn", [foo]).

你做这件事很困难:)messagetext是在xmpp_codec.hrl中定义的记录。如果你没有在shell中加载记录定义,记录看起来像一个有很多元素的元组,但如果你加载了记录定义,你的消息看起来是这样的:

1> rr("include/xmpp_codec.hrl").
[address,addresses,adhoc_actions,adhoc_command,adhoc_note,
bind,block,block_list,bob_data,bookmark_conference,
bookmark_storage,bookmark_url,bytestreams,caps,
carbons_disable,carbons_enable,carbons_private,
carbons_received,carbons_sent,chatstate,client_id,compress,
compress_failure,compressed,compression,csi,db_feature,
db_result,db_verify|...]
2> {message,<<"purple2d957668">>,chat,<<>>,undefined,{jid,<<"admin">>,<<"localhost">>,<<"5280">>,<<"admin">>,<<"localhost">>,<<"5280">>},[],[{text,<<>>,<<"Hello">>}],undefined,[{xmlel,<<"active">>,[{<<"xmlns">>,<<"http://jabber.org/protocol/chatstates">>}],[]}],#{}}. 
#message{id = <<"purple2d957668">>,type = chat,lang = <<>>,
from = undefined,
to = {jid,<<"admin">>,<<"localhost">>,<<"5280">>,
<<"admin">>,<<"localhost">>,<<"5280">>},
subject = [],
body = [#text{lang = <<>>,data = <<"Hello">>}],
thread = undefined,
sub_els = [{xmlel,<<"active">>,
[{<<"xmlns">>,
<<"http://jabber.org/protocol/chatstates">>}],
[]}],
meta = #{}}

您要查找的数据位于body字段中。

让我们将此记录分配给变量M,并提取正文字段:

4> Body = M#message.body.
[#text{lang = <<>>,data = <<"Hello">>}]

这是一个包含一个text记录的列表。让我们从中提取data字段:

6> [#text{data = Data}] = Body.
[#text{lang = <<>>,data = <<"Hello">>}]
7> Data.
<<"Hello">>

这就是它在shell中的工作方式-用rr函数加载记录定义。在编写使用记录定义的模块时,需要包含hrl文件:

-include_lib("xmpp/include/xmpp_codec.hrl").

-include_lib目录将在加载路径上查找xmpp应用程序,并在其include目录中搜索文件xmpp_codec.hrl。您可能需要指定编译器的代码路径,类似于erlc -pa path/to/xmpp/ebin my_module.erl——请注意,应用程序中的ebin目录应该在代码路径上。

最新更新