如何使用 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(已经添加了一个新的列),那么第二种方式有帮助:
创建自定义模块并将其命名为“mod_mam_sql2”
将 "src/mod_mam_sql.erl" 的内容复制到您的自定义模块中
求函数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.
根据需要更改 SQL-查询
编译你的自定义模块:ejabberdctl module_install mod_mam_sql2
更新ejabberd.yml 配置文件
mod_mam:
db_type: sql2
重启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};
我正在使用 Ejabberd 服务器进行聊天应用。它可以在 arhieve table 中保存消息,但我想在发送消息时在 table 中保存其他字段。此字段将针对每条消息。
有一些方法可以实现这一点。 第一种也是最简单的方法(但它只影响 'archive' table 中的 'xml' 字段)是在自定义模块中实现 'store_mam_message' 挂钩。您可以修改该挂钩内的数据包和 return 应保存在数据库中的新数据包。此挂钩自 v16.09
起可用如果你修改了'archive' table(已经添加了一个新的列),那么第二种方式有帮助:
创建自定义模块并将其命名为“mod_mam_sql2”
将 "src/mod_mam_sql.erl" 的内容复制到您的自定义模块中
求函数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.
根据需要更改 SQL-查询
编译你的自定义模块:ejabberdctl module_install mod_mam_sql2
更新ejabberd.yml 配置文件
mod_mam: db_type: sql2
重启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};