Я использую сервер Ejabberd для общения в чате. Он работает для сохранения сообщений в таблице arhieve, но я хочу сохранить дополнительное поле в таблице при отправке сообщения. Это поле будет для каждого сообщения.Как сохранить дополнительные поля в архивной таблице с помощью Ejabberd mod_mam (Управление архивами сообщений, XEP-0313)?
ответ
Игорь, Спасибо за ваш ответ, выглядит многообещающим, но я сделал что-то еще, что я хочу поделиться здесь. Я установил ejabberd из исходного кода с помощью этой ссылки http://www.blikoon.com/networking/how-to-install-ejabberd-on-linux-ubuntu , затем я изменил файл mod_mam_sql.erl в папке src. Код I изменен следующим образом. Я перекомпилировал модуль, и он сработал.
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 ("
\t "%(SUser)s, "
\t "%(TSinteger)d, "
\t "%(LPeer)s, "
\t "%(BarePeer)s, "
\t "%(XML)s, "
\t "%(Body)s, "
\t "%(SType)s, "
\t "%(Nick)s, "
\t "%(Resid)s, "
\t "%(Ownuid)s)")) of
{updated, _} ->
{ok, ID};
Есть несколько способов добиться этого. Первый и самый простой способ (но он влияет только на поле «xml» в таблице «архив») - это реализация крюка «store_mam_message» в вашем настраиваемом модуле. Вы можете изменить пакет внутри этого крючка и вернуть новый пакет, который должен быть сохранен в БД. Этот крюк доступен с v16.09
Если вы изменили «архив» таблица (новая колонка была добавлена к нему), то второй способ помогает:
Создайте свой собственный модуль и вызвать его "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
Update ejabberd.yml конфигурационный файл
mod_mam: db_type: sql2
Restart ejabberd server: ejabberdctl restart
Я надеюсь, что это поможет вам решить вашу проблему.
используется модуль mod_mam ли? –
Да, я использую mod_mam для регистрации сообщения в базе данных (mysql) – user1820017