0

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

4

2 回答 2

0

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

如果您修改了“存档”表(已添加新列),那么第二种方法会有所帮助:

  1. 创建您的自定义模块并将其命名为“ mod_mam _sql2”

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

  3. 找到函数存储/7。

        存储(Pkt,LServer,{LUser,LHost},类型,同行,尼克,_Dir)->
        TSinteger = p1_time_compat:system_time(micro_seconds),
        ID = jlib:integer_to_binary(TSinteger),
        SUser = 案例类型
            聊天-> LUser;
            群聊 -> jid:to_string({LUser, LHost, >})
            结尾,
        BarePeer = jid:to_string(
             吉德:降低(
               jid:remove_resource(Peer))),
        LPeer = jid:to_string(
              jid:tolower(Peer)),
        XML = fxml:element_to_binary(Pkt),
        正文 = fxml:get_subtag_cdata(Pkt, >),
        SType = jlib:atom_to_binary(Type),
        案例 ejabberd_sql:sql_query(
               L服务器,
               ?SQL("插入存档(用户名,时间戳,"
                    " peer, bare_peer, xml, txt, kind, nick) 值 ("
            "%(SUser)s, "
            "%(TSinteger)d, "
            "%(LPeer)s, "
            "%(BarePeer)s, "
            "%(XML)s, "
            "%(正文)s, "
            "%(SType)s, "
            "%(Nick)s)")) 的
        {更新,_} ->
            {好的,ID};
        错误->
            呃
        结尾。
    
  4. 根据需要更改 SQL 查询

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

  6. 更新 ejabberd.yml 配置文件

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

我希望它能帮助你解决你的问题。

于 2016-10-18T18:42:29.977 回答
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};

于 2016-10-19T10:55:09.600 回答