首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mod_blocking在MongooseIM上的实现

mod_blocking在MongooseIM上的实现
EN

Stack Overflow用户
提问于 2014-06-05 12:01:06
回答 1查看 232关注 0票数 0

我正在尝试实现只能在odbc模块中使用mod_blocking的mod_privacy。

我一直得到回应:

代码语言:javascript
复制
<error code='500' type='wait'><internal-server-error0 xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error>

这是我的代码:

代码语言:javascript
复制
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).

我检查了所有的查询。他们工作得很好。我很难理解这段代码的逻辑。调试这段代码的最佳方法是什么,这样我就可以理解我的逻辑何时失败了?有人能指出我的正确方向吗?

代码语言:javascript
复制
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}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-05 14:43:39

如果你希望

代码语言:javascript
复制
  _ -> {error, ?ERR_INTERNAL_SERVER_ERROR}

是服务器返回“内部服务器错误”的点,您只需将此处更改为

代码语言:javascript
复制
  _Otherwise ->
       ?WARNING_MSG("Got some unexpected result in mod_priv ~100000p",[_Otherwise]),
       {error, ?ERR_INTERNAL_SERVER_ERROR)

然后查看log/ejabberd.log

当然,您需要在ejabberd.cfg中以至少3的日志级别启动mongooseim。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24059692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档