如何使用Ejabberd mod_mam(消息归档管理,XEP-0313)在归档表中保存额外的字段?

时间:2016-10-14 21:15:03

标签: ejabberd strophe ejabberd-module ejabberd-hooks

我正在使用Ejabberd服务器进行聊天应用程序。它可以在arhieve表中保存消息,但我希望在发送消息时在表中保存其他字段。该字段将按消息发送。

2 个答案:

答案 0 :(得分:0)

有一些方法可以实现这一目标。 第一种也是最简单的方式(但它只影响'存档'表中的' xml'字段)是' store_mam_message'的实现。钩在自定义模块中。您可以修改该挂钩内的数据包并返回应保存在数据库中的新数据包。此挂钩自v16.09起可用

如果您修改了'存档' table(已添加一个新列),然后第二种方式有帮助:

  1. 创建自定义模块并将其命名为" mod_mam _sql2"

  2. 复制" src / mod_mam_sql.erl"的内容进入您的自定义模块

  3. 找到函数存储/ 7。

        store(Pkt, LServer, {LUser, LHost}, Type, Peer, Nick, _Dir) ->
        TSinteger = p1_time_compat:system_time(micro_seconds),
        ID = jlib:integer_to_binary(TSinteger),
        SUser = case Type of
            chat -> LUser;
            groupchat -> jid:to_string({LUser, LHost, >})
            end,
        BarePeer = jid:to_string(
             jid:tolower(
               jid:remove_resource(Peer))),
        LPeer = jid:to_string(
              jid:tolower(Peer)),
        XML = fxml:element_to_binary(Pkt),
        Body = fxml:get_subtag_cdata(Pkt, >),
        SType = jlib:atom_to_binary(Type),
        case ejabberd_sql:sql_query(
               LServer,
               ?SQL("insert into archive (username, timestamp,"
                    " peer, bare_peer, xml, txt, kind, nick) values ("
            "%(SUser)s, "
            "%(TSinteger)d, "
            "%(LPeer)s, "
            "%(BarePeer)s, "
            "%(XML)s, "
            "%(Body)s, "
            "%(SType)s, "
            "%(Nick)s)")) of
        {updated, _} ->
            {ok, ID};
        Err ->
            Err
        end.
    
  4. 根据需要更改SQL查询

  5. 编译自定义模块:ejabberdctl module_install mod_mam_sql2

  6. 更新ejabberd.yml配置文件

        mod_mam:
           db_type: sql2
    
  7. 重启ejabberd服务器:ejabberdctl restart

  8. 我希望它可以帮助您解决问题。

答案 1 :(得分:0)

伊戈尔,谢谢你的回答,看起来很有希望,但我做了一些我想在这里分享的东西。 我已经借助此链接http://www.blikoon.com/networking/how-to-install-ejabberd-on-linux-ubuntu从源代码安装了ejabberd 然后我修改了src文件夹中的mod_mam_sql.erl文件。 我修改的代码如下。我重新编译了模块并且工作正常。

Body = fxml:get_subtag_cdata(Pkt, <<"body">>),
Resid = fxml:get_subtag_cdata(Pkt, <<"resid">>),
Ownuid = fxml:get_subtag_cdata(Pkt, <<"ownuid">>),
SType = jlib:atom_to_binary(Type),
case ejabberd_sql:sql_query(
     LServer,
     ?SQL("insert into archive (username, timestamp,"
                " peer, bare_peer, xml, txt, kind, nick,resid,Ownuid) values ("
	"%(SUser)s, "
	"%(TSinteger)d, "
	"%(LPeer)s, "
	"%(BarePeer)s, "
	"%(XML)s, "
	"%(Body)s, "
	"%(SType)s, "
	"%(Nick)s, "
	"%(Resid)s, "
	"%(Ownuid)s)")) of
{updated, _} ->
 {ok, ID};