我正在使用Ejabberd服务器进行聊天应用程序。它可以在arhieve表中保存消息,但我希望在发送消息时在表中保存其他字段。该字段将按消息发送。
答案 0 :(得分:0)
有一些方法可以实现这一目标。 第一种也是最简单的方式(但它只影响'存档'表中的' xml'字段)是' store_mam_message'的实现。钩在自定义模块中。您可以修改该挂钩内的数据包并返回应保存在数据库中的新数据包。此挂钩自v16.09起可用
如果您修改了'存档' table(已添加一个新列),然后第二种方式有帮助:
创建自定义模块并将其命名为" mod_mam _sql2"
复制" src / mod_mam_sql.erl"的内容进入您的自定义模块
找到函数存储/ 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
我希望它可以帮助您解决问题。
答案 1 :(得分:0)
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};