我正在使用 Ejabberd 服务器进行聊天应用程序。它可以将消息保存在 arhieve 表中,但我想在发送消息时在表中保存其他字段。此字段将是每条消息。
2 回答
有一些方法可以实现这一点。第一种也是最简单的方法(但它只影响“归档”表中的“xml”字段)是在您的自定义模块中实现“store_mam_message”挂钩。您可以修改该钩子内的数据包并返回应保存在数据库中的新数据包。这个钩子从 v16.09 开始可用
如果您修改了“存档”表(已添加新列),那么第二种方法会有所帮助:
创建您的自定义模块并将其命名为“ mod_mam _sql2”
将“src/mod_mam_sql.erl”的内容复制到您的自定义模块中
找到函数存储/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}; 错误-> 呃 结尾。
根据需要更改 SQL 查询
编译您的自定义模块:ejabberdctl module_install mod_mam_sql2
更新 ejabberd.yml 配置文件
mod_mam: db_type: sql2
重启 ejabberd 服务器:ejabberdctl restart
我希望它能帮助你解决你的问题。
伊戈尔,谢谢你的回答,看起来很有希望,但我做了一些我想在这里分享的其他事情。我已经在此链接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};