2016-10-14 5 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 次に、srcフォルダのmod_mam_sql.erlファイルを変更しました。 変更されたコードは次のとおりです。私はモジュールを再コンパイルし、うまくいった。

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'フックの実装です。そのフックの中でパケットを修正し、DBに保存されるべき新しいパケットを返すことができます。あなたは「アーカイブ」テーブルを変更した場合、このフックは(新しい列が追加されました)v16.09

以降で使用可能です、そして、第二の方法は役立ちます:

  1. カスタムモジュールを作成し、それを呼び出します"mod_mam _sql2"

  2. コピーカスタムモジュール

  3. に "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. 
    
  4. 変更SQLクエリあなたは

  5. を必要とするよう、カスタムモジュールをコンパイルしますejabberdctl module_install mod_mam_sql2

  6. 更新ejabberd.yml設定ファイル

     
        mod_mam: 
         db_type: sql2 
    
  7. 再起動ejabberdサーバ:ejabberdctl restart

私はあなたの問題を解決するのに役立つことを願っています。

関連する問題