2016-10-14 11 views
0

Я использую сервер Ejabberd для общения в чате. Он работает для сохранения сообщений в таблице arhieve, но я хочу сохранить дополнительное поле в таблице при отправке сообщения. Это поле будет для каждого сообщения.Как сохранить дополнительные поля в архивной таблице с помощью Ejabberd mod_mam (Управление архивами сообщений, XEP-0313)?

+0

используется модуль mod_mam ли? –

+0

Да, я использую mod_mam для регистрации сообщения в базе данных (mysql) – user1820017

ответ

0

Игорь, Спасибо за ваш ответ, выглядит многообещающим, но я сделал что-то еще, что я хочу поделиться здесь. Я установил 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};

0

Есть несколько способов добиться этого. Первый и самый простой способ (но он влияет только на поле «xml» в таблице «архив») - это реализация крюка «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 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. 
    
  4. Изменение SQL-запрос, как вам нужно

  5. Составьте свой собственный модуль: ejabberdctl module_install mod_mam_sql2

  6. Update ejabberd.yml конфигурационный файл

     
        mod_mam: 
         db_type: sql2 
    
  7. Restart ejabberd server: ejabberdctl restart

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

 Смежные вопросы

  • Нет связанных вопросов^_^