0

odbc モジュールの mod_privacy でのみ機能する mod_blocking を実装しようとしています。

私は応答を得続けます:

<error code='500' type='wait'><internal-server-error0 xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error>

これが私のコードです:

process_blocklist_block(LUser, LServer, JIDs) ->
Filter = fun (List) ->
         AlreadyBlocked = list_to_blocklist_jids(List, []),
         lists:foldr(fun (JID, List1) ->
                 case lists:member(JID, AlreadyBlocked)
                     of
                   true -> List1;
                   false ->
                       [#listitem{type = jid,
                          value = JID,
                          action = deny,
                          order = 0,
                          match_all = true}
                    | List1]
                 end
             end,
             List, JIDs)
     end,
case process_blocklist_block(LUser, LServer, Filter,odbc)
of
  {atomic, {ok, Default, List}} ->
  UserList = make_userlist(Default, List),
  broadcast_list_update(LUser, LServer, Default,
            UserList),
  broadcast_blocklist_event(LUser, LServer,
                {block, JIDs}),
  {result, [], UserList};
  _ -> {error, ?ERR_INTERNAL_SERVER_ERROR}
end.

process_blocklist_block(LUser, LServer, Filter, odbc) ->
F = fun () ->
    Default = case mod_privacy_odbc:sql_get_default_privacy_list_t(LUser)
        of
            {selected, [<<"name">>], []} ->
                Name = <<"Blocked contacts">>,
                mod_privacy_odbc:sql_add_privacy_list(LUser, Name),
                mod_privacy_odbc:sql_set_default_privacy_list(LUser, Name),
                Name;
            {selected, [<<"name">>], [[Name]]} -> Name
        end,
    {selected, [<<"id">>], [[ID]]} = mod_privacy_odbc:sql_get_privacy_list_id_t(LUser, Default),
    case mod_privacy_odbc:sql_get_privacy_list_data_by_id_t(ID)
        of
            {selected,
                [<<"t">>, <<"value">>, <<"action">>, <<"ord">>,
                <<"match_all">>, <<"match_iq">>, <<"match_message">>,
                <<"match_presence_in">>, <<"match_presence_out">>],
                RItems = [_ | _]} ->
                List = lists:map(fun mod_privacy_odbc:raw_to_item/1, RItems);
            _ -> List = []
    end,
    NewList = Filter(List),
    NewRItems = lists:map(fun mod_privacy_odbc:item_to_raw/1, NewList),
    mod_privacy_odbc:sql_set_privacy_list(ID, NewRItems),
    {ok, Default, NewList}
end,
ejabberd_odbc:sql_transaction(LServer, F).

すべてのクエリを確認しました。彼らは正常に動作します。このコードのロジックを理解するのに苦労しています。このコードをデバッグして、ロジックがいつ失敗したかを理解するにはどうすればよいですか? 誰かが私を正しい方向に向けることができますか?

UserList = make_userlist(Default, List),
  broadcast_list_update(LUser, LServer, Default,
            UserList),
  broadcast_blocklist_event(LUser, LServer,
                {block, JIDs}),
  {result, [], UserList};
  _ -> {error, ?ERR_INTERNAL_SERVER_ERROR}
4

1 に答える 1

2

期待すれば

  _ -> {error, ?ERR_INTERNAL_SERVER_ERROR}

サーバーが「内部サーバーエラー」を返すポイントです。この場所を次のように変更できます

  _Otherwise ->
       ?WARNING_MSG("Got some unexpected result in mod_priv ~100000p",[_Otherwise]),
       {error, ?ERR_INTERNAL_SERVER_ERROR)

次に、log/ejabberd.log を見てください。

もちろん、ejabberd.cfg で少なくとも 3 のログレベルで mongooseim を開始する必要があります。

于 2014-06-05T14:43:39.347 に答える