Как сохранить дополнительные поля в архивной таблице, используя 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

Если вы изменили таблицу "архив" (в нее был добавлен новый столбец), то поможет второй способ:

  1. Создайте свой пользовательский модуль и назовите его "mod_mam_sql2"

  2. Скопируйте содержимое "src/mod_mam_sql.erl" в свой пользовательский модуль

  3. Найти магазин функций / 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 конец.
  4. Измените SQL-запрос по мере необходимости

  5. Скомпилируйте ваш пользовательский модуль: ejabberdctl module_install mod_mam_sql2

  6. Обновите файл конфигурации ejabberd.yml

        mod_mam:
           db_type: sql2
  7. Перезапустите сервер ejabberd: перезапустите ejabberdctl

Я надеюсь, что это поможет вам решить вашу проблему.

Другие вопросы по тегам