Как сохранить дополнительные поля в архивной таблице, используя Ejabberd mod_mam (Message Archive Management, XEP-0313)?
Я использую сервер Ejabberd для общения в чате. Он работает для сохранения сообщений в таблице архива, но я хочу сохранить дополнительное поле в таблице при отправке сообщения. Это поле будет для сообщения.
2 ответа
Игорь, спасибо за ваш ответ, выглядит многообещающе, но я сделал кое-что еще, чем хочу поделиться здесь. Я установил ejabberd из исходного кода по этой ссылке http://www.blikoon.com/networking/how-to-install-ejabberd-on-linux-ubuntu затем я изменил файл mod_mam_sql.erl в папке src. Код, который я изменил, выглядит следующим образом. Я перекомпилировал модуль, и он заработал.
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};
Есть несколько способов добиться этого. Первый и самый простой способ (но он влияет только на поле 'xml' в таблице 'archive') - это реализация хука 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 Тип чата -> 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), регистр ejabberd_sql:sql_query( LServer,?SQL("вставить в архив (имя пользователя, отметка времени," ") значения peer, bare_peer, xml, txt, kind, nick) (" "%(SUser)s, " "%(TSinteger)d, " "%(LPeer)s, " "%(BarePeer)s, " "%(XML)s, " "%(Body)s ","%(SType)s, " "%(Nick)s)")) из {updated, _} -> {ok, ID}; Err -> Err конец.
Измените SQL-запрос по мере необходимости
Скомпилируйте ваш пользовательский модуль: ejabberdctl module_install mod_mam_sql2
Обновите файл конфигурации ejabberd.yml
mod_mam: db_type: sql2
Перезапустите сервер ejabberd: перезапустите ejabberdctl
Я надеюсь, что это поможет вам решить вашу проблему.