erlang - 在 ejabberd 中读取和格式化消息节
问题描述
我一直在 ejabberd 中开发一个自定义模块。我需要提取消息的正文内容并检查节是否有消息文本。这是我的代码片段
-module(mod_push_generate).
-behaviour(gen_mod).
-include("logger.hrl").
-include("ejabberd_sql_pt.hrl").
-include("ejabberd_http.hrl").
-include("xmpp.hrl").
%-include("jlib.hrl").
%% gen_mod API callbacks
-export([start/2, stop/1, depends/2, mod_options/1, fetch_token/2, on_user_send_packet/1]).
start(Host,_Opts) ->
?INFO_MSG("Mod PUSH GENARATOR has been started",[]),
inets:start(),
ejabberd_hooks:add(user_send_packet, Host, ?MODULE, on_user_send_packet, 50),
ok.
stop(Host) ->
?INFO_MSG("Module has been stopped",[]),
ejabberd_hooks:delete(user_send_packet, Host, ?MODULE, on_user_send_packet, 50),
ok.
depends(_Host, _Opts) ->
[].
mod_options(_Host) ->
[].
%-spec on_user_send_packet({stanza(), ejabberd_c2s:state()}) -> {stanza(), ejabberd_c2s:state()}.
%on_user_send_packet({From, To, XML} = Pkt) ->
on_user_send_packet({#message{to = Peer} = Pkt, #{jid := JID} = C2SState}) ->
?INFO_MSG("on user send packet called from ",[Pkt]),
Els = xmpp:get_els(Pkt),
?INFO_MSG("Body: ",[Els]),
{Pkt, C2SState};
on_user_send_packet(Acc) ->
?INFO_MSG("Inside nothing box.",[]),
Acc.
记录 Pkt 正在给予
12:41:17.956 [info] FORMAT ERROR: "on user send packet called from " [{message,<<"2fe6c6a3-e89e-4f05-ac4d-b096b75f0f32">>,chat,<<"en">>,{jid,<<"sagar">>,<<"192.168.4.69">>,<<"sagar.webApp">>,<<"sagar">>,<<"192.168.4.69">>,<<"sagar.webApp">>},{jid,<<"tony">>,<<"192.168.4.69">>,<<>>,<<"tony">>,<<"192.168.4.69">>,<<>>},[],[{text,<<>>,<<"xasXASXAS">>}],undefined,[{xmlel,<<"request">>,[{<<"xmlns">>,<<"urn:xmpp:receipts">>}],[]}],#{ip => {0,0,0,0,0,65535,49320,1093}}}]
并且记录 Els 正在给予
14:04:25.906 [info] FORMAT ERROR: "Body: " [[{xmlel,<<"request">>,[{<<"xmlns">>,<<"urn:xmpp:receipts">>}],[]}]]
第二行显示我取出消息节的组件,唯一检测到的 xml 元素是“请求”元素。为什么消息节中没有“正文元素”。
还请告诉我如何取出(或检查是否存在)该节中的消息文本。
谢谢
解决方案
为什么消息节中没有“正文元素”。
#message结构将正文内容保存在# message.body中,而不是#message.sub_els中。请参阅https://docs.ejabberd.im/developer/guide/#xmpp-codec中的示例
我需要提取消息的正文内容
试试这条线:
?INFO_MSG("Body: ~p", [ xmpp:get_text(Pkt#message.body) ]),
它将记录以下内容:
17:08:12.897 [info] Body: <<"hey, are you there?">>
17:08:12.926 [info] Body: <<>>
并检查节是否有消息文本。
当 Body 为 <<>> 时,表示它没有 body。
推荐阅读
- linux-kernel - 为什么系统调用返回 -1 而不是实际的错误代码
- javascript - Magento 2. 动态添加 ui-form 元素(在管理区域)
- azure - 依赖注入容器是否在一个包中的 azure 函数之间共享?
- c# - 移交新代码库时安装所有正确版本的软件包?
- db2 - 如何删除 DB2 on Cloud 中的锁定表?
- java - 比较方法违反了它的总合同!(排序期间集合中重复的元素)
- python - 从向量中查找最接近的数字索引
- networking - 在某些网络上访问端口 4001 上的 api 时出现问题
- python - 无法在 Python2.7 中安装 pylint 并且即使使用本地 setup.py 安装也会出现不匹配的错误
- c++ - Win32 API - HWND“{unused = ???} 无法读取内存”错误