1

私は erlang と ejabbered/mongooseIM が初めてです。送信前にパケットに子要素を追加する非常に単純なマングース モジュールを作成しようとしています。以下は私のコードです:

-module(mod_test).

-behavior(gen_mod).


-export([start/2, stop/1]).
-export([add_child/1]).

-include("ejabberd.hrl").

start(Host, Opts) ->
    ejabberd_hooks:add(filter_packet, Host, ?MODULE, add_child, 0),
    ?DEBUG(" MOD_TEST Started",[]),
    ok.

stop(Host) ->
    ejabberd_hooks:delete(filter_packet, Host, ?MODULE, add_child, 0),
    ok.

add_child({From, To, XML} = Packet) ->
    Tag = {"a","b"},
    NewPacket = xml:append_subtags(Packet, [Tag]),
    ?INFO_MSG("  To party: ~p~n",[To]),
    NewPacket.

いくつかの警告でコードをコンパイルできます

mod_test.erl:3: Warning: behaviour gen_mod undefined
mod_test.erl:11: Warning: variable 'Opts' is unused
mod_test.erl:20: Warning: variable 'From' is unused
mod_test.erl:20: Warning: variable 'XML' is unused

次に、モジュールを追加して実行すると開始されますが、パケットに変更は加えられず、ログも生成されません。

もう 1 つの問題は、start 関数内にログを追加すると、コンパイルされますが、モジュールの開始中にエラーが表示されることです。

2015-03-03 16:36:34.772 [critical] <0.200.0>@gen_mod:start_module:94 Problem starting the module mod_test for host <<"localhost">>
 options: []
 error: undef
[{lager,info,["  mod_test starting ...",[[]]],[]},
 {mod_test,start,2,[{file,"mod_test.erl"},{line,13}]},
 {gen_mod,start_module,3,[{file,"src/gen_mod.erl"},{line,83}]},
 {lists,foreach,2,[{file,"lists.erl"},{line,1336}]},
 {ejabberd_app,start,2,[{file,"src/ejabberd_app.erl"},{line,69}]},
 {application_master,start_it_old,4,
                     [{file,"application_master.erl"},{line,272}]}]
2015-03-03 16:36:34.773 [critical] <0.200.0>@gen_mod:start_module:99 ejabberd initialization was aborted because a module start failed.
The trace is [{lager,info,["  mod_test starting ...",[[]]],[]},{mod_test,start,2,[{file,"mod_test.erl"},{line,13}]},{gen_mod,start_module,3,[{file,"src/gen_mod.erl"},{line,83}]},{lists,foreach,2,[{file,"lists.erl"},{line,1336}]},{ejabberd_app,start,2,[{file,"src/ejabberd_app.erl"},{line,69}]},{application_master,start_it_old,4,[{file,"application_master.erl"},{line,272}]}].

Crash dump was written to: erl_crash.dump
Problem starting the module mod_test for host <<"localhost">>
 options: []
 error: undef
[{lager,info,["  mod_xyz starting ...",[[]]],[]},
 {mod_test,start,2,[{file,"mod_timetagg

私は何を間違っていますか?

4

2 に答える 2

3

filter_packetフックがどのように機能するかという理由で、あなたの例は実際には少しトリッキーです。最初の試行で登録する最悪のフックを選択しました ;)

を調べると、 がパラメーターなしで実行されejabberd_router:do_routeていることがわかります。これはグローバル フックであるため、特定の に関数を登録すると、基本的に無視されます。filter_packetHostadd_childHost

次のことを試してください。

-module(mod_test).
-behavior(gen_mod).

-export([start/2, stop/1]).
-export([add_child/1]).

-include_lib("ejabberd/include/ejabberd.hrl").
-include_lib("exml/include/exml.hrl").

start(Host, Opts) ->
    ejabberd_loglevel:set_custom(?MODULE, 5),
    ejabberd_hooks:add(filter_local_packet, Host, ?MODULE, add_child, 1),
    ?DEBUG(" MOD_TEST Started",[]),
    ok.

stop(Host) ->
    ejabberd_hooks:delete(filter_local_packet, Host, ?MODULE, add_child, 1),
    ok.

add_child({From, To, Element} = HookData) ->
    ?DEBUG("Filtering ~p~n", [HookData]),
    case Element#xmlel.name of
        <<"message">> ->
            Tag = #xmlel{name = <<"added-tag">>, attrs = [], children = []},
            NewElement = xml:append_subtags(Element, [Tag]),
            ?DEBUG("will return new el: ~p", [NewElement]),
            {From, To, NewElement};
        _ ->
            ?DEBUG("will pass old el: ~p", [Element]),
            HookData
    end.

filter_local_packet指定されたものへの登録がHost機能するようになり、すべての着信スタンザが関数に渡されます。すべてのスタンザに偽のタグを追加すると問題が発生する可能性があるため、上記のコードはスタンザに<added-tag>要素を追加するだけであることを覚えておくことが重要<message>です。

上記の例を使用して、そこから作業してください。

幸運を!

于 2015-03-05T09:59:31.770 に答える
1

エラーは ですundef。これは、定義/エクスポートされていない関数が呼び出されたことを意味します。スタック トレースは、問題の関数が であることを示していますlager:info/2

Lager (を処理するロギング ライブラリ?INFO_MSG) には、コードが存在しない関数を呼び出すという特殊な癖がありますが、コードはコンパイル前に解析変換によって変換されます。これはあなたの場合ではないようです。

MongooseIM ツリー内のrebar.configファイル inには、解析変換を適用するようコンパイラに要求するinが含まれています。MongooseIM ツリー全体を組み込んで構築することをお勧めします。これにより、ファイルが正しいオプションで構築されることが保証されます。apps/ejabberd{parse_transform, lager_transform}erl_optsmod_test.erlapps/ejabberd/src

于 2015-03-04T10:38:35.710 に答える