如何在 ejabberd 中的 xmpp 消息正文中附加自定义数据
Posted
技术标签:
【中文标题】如何在 ejabberd 中的 xmpp 消息正文中附加自定义数据【英文标题】:How do I append custom data in the body of a xmpp message in ejabberd 【发布时间】:2017-08-02 08:23:11 【问题描述】:我已经使用 Pidgin 和 Ejabberd 设置了聊天设置。我已经使用 user_send_packet
在 ejabberd 中编写了一个自定义模块:
ejabberd_hooks:add(user_send_packet, _Host, ?MODULE,
myMessage, 95),
myMessage函数如下:
myMessage(Packet, C2SState)->
PacketType=xmpp:get_name(Packet),
case PacketType of
<<"iq">>->
ok;
<<"presence">>->
ok;
<<"message">>->
Sum=2+2,
?INFO_MSG("Sum is ~p~n",[Sum])
end,
Packet,C2SState.
这个函数的基本作用是,每当有人发送聊天消息说“你好”,Sum
的值就会被计算并打印在服务器及其日志上,并且消息““你好”被发送到第二个用户。
但现在我想将Sum
的值连同消息"hello there"
发送给第二个用户,例如:
"hello there Sum is 4"
谁能帮我解决这个问题?
提前致谢。
【问题讨论】:
【参考方案1】:这里是:
process_message(#messagebody = Body = Msg, C2SState)->
Sum = calc_sum_and_return_as_binary(),
NewBody = lists:map(
fun(#textdata = Data = Txt) ->
Txt#textdata = <<Data/binary, Sum/binary>>
end, Body),
Msg#messagebody = NewBody, C2SState;
process_message(Acc) ->
Acc.
注意,#text
记录包含 lang
字段,如果您想支持所附加文本的国际化,可以使用该字段。
【讨论】:
先谢谢您的回复。我使用了您提供的代码 sn-p 并观察到以下情况:首先 Sum=4 没有被转换为二进制,因为 Sum 是一个变量,然后我使用 Sum=[4] 但是收到此消息的用户已关闭连接并使用消息“对等方重置连接”重新启动它。然后我尝试了 Sum="4", Sum=["4"] 和 Sum ="[4]" 都成功并分别以 4,4 和 [4] 发送消息。然后我在 erlang 字符串中了解到只不过是一个列表,所以我认为我使用了 Sum=[[4]] 但它再次重置了连接。 所以我想问两件事:(1)我怎样才能只发送 Sum=[4] 作为要作为 [4] 接收的消息? (2) 是否需要将每条发送消息用双引号“”括起来作为消息发送? 看,这些都是简单的 Erlang 问题,你最好花几个小时学习简单的 Erlang 教程来澄清这些事情。 简单地说,如果你想追加“[4]”文本,你应该这样做:Sum = list_to_binary([$[, integer_to_list(2+2), $]])跨度>以上是关于如何在 ejabberd 中的 xmpp 消息正文中附加自定义数据的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 XMPPHP 客户端创建 XMPP(ejabberd) 用户
Ejabberd:如果在客户端的 resume_timeout 之前发送 Xmpp 消息将被丢弃
如何在 ejabberd/XMPP 中获取所有在线用户的列表?