如何在 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 中获取所有在线用户的列表?

如何允许 Ejabberd 外部 XMPP 组件代表用户发送存在数据包

在 ejabberd 中过滤消息包的正文

如何将FCM与Ejabberd集成?