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

How to save extra fields in archive table using Ejabberd mod_mam (Message Archive Management, XEP-0313)?

我正在使用 Ejabberd 服务器进行聊天应用。它可以在 arhieve table 中保存消息,但我想在发送消息时在 table 中保存其他字段。此字段将针对每条消息。

有一些方法可以实现这一点。 第一种也是最简单的方法(但它只影响 'archive' table 中的 'xml' 字段)是在自定义模块中实现 'store_mam_message' 挂钩。您可以修改该挂钩内的数据包和 return 应保存在数据库中的新数据包。此挂钩自 v16.09

起可用

如果你修改了'archive' table(已经添加了一个新的列),那么第二种方式有帮助:

  1. 创建自定义模块并将其命名为“mod_mam_sql2”

  2. 将 "src/mod_mam_sql.erl" 的内容复制到您的自定义模块中

  3. 求函数store/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

希望对您的问题有所帮助。

Igor,感谢您的回答,看起来很有希望,但我做了其他事情,我想在这里分享。 我已经在这个 link 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};