diff options
Diffstat (limited to 'src/mod_muc_riak.erl')
-rw-r--r-- | src/mod_muc_riak.erl | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/mod_muc_riak.erl b/src/mod_muc_riak.erl new file mode 100644 index 000000000..bc6e5959a --- /dev/null +++ b/src/mod_muc_riak.erl @@ -0,0 +1,117 @@ +%%%------------------------------------------------------------------- +%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net> +%%% @copyright (C) 2016, Evgeny Khramtsov +%%% @doc +%%% +%%% @end +%%% Created : 13 Apr 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net> +%%%------------------------------------------------------------------- +-module(mod_muc_riak). + +-behaviour(mod_muc). + +%% API +-export([init/2, import/2, store_room/4, restore_room/3, forget_room/3, + can_use_nick/4, get_rooms/2, get_nick/3, set_nick/4]). + +-include("mod_muc.hrl"). + +%%%=================================================================== +%%% API +%%%=================================================================== +init(_Host, _Opts) -> + ok. + +store_room(_LServer, Host, Name, Opts) -> + {atomic, ejabberd_riak:put(#muc_room{name_host = {Name, Host}, + opts = Opts}, + muc_room_schema())}. + +restore_room(_LServer, Host, Name) -> + case ejabberd_riak:get(muc_room, muc_room_schema(), {Name, Host}) of + {ok, #muc_room{opts = Opts}} -> Opts; + _ -> error + end. + +forget_room(_LServer, Host, Name) -> + {atomic, ejabberd_riak:delete(muc_room, {Name, Host})}. + +can_use_nick(LServer, Host, JID, Nick) -> + {LUser, LServer, _} = jid:tolower(JID), + LUS = {LUser, LServer}, + case ejabberd_riak:get_by_index(muc_registered, + muc_registered_schema(), + <<"nick_host">>, {Nick, Host}) of + {ok, []} -> + true; + {ok, [#muc_registered{us_host = {U, _Host}}]} -> + U == LUS; + {error, _} -> + true + end. + +get_rooms(_LServer, Host) -> + case ejabberd_riak:get(muc_room, muc_room_schema()) of + {ok, Rs} -> + lists:filter( + fun(#muc_room{name_host = {_, H}}) -> + Host == H + end, Rs); + _Err -> + [] + end. + +get_nick(LServer, Host, From) -> + {LUser, LServer, _} = jid:tolower(From), + US = {LUser, LServer}, + case ejabberd_riak:get(muc_registered, + muc_registered_schema(), + {US, Host}) of + {ok, #muc_registered{nick = Nick}} -> Nick; + {error, _} -> error + end. + +set_nick(LServer, Host, From, Nick) -> + {LUser, LServer, _} = jid:tolower(From), + LUS = {LUser, LServer}, + {atomic, + case Nick of + <<"">> -> + ejabberd_riak:delete(muc_registered, {LUS, Host}); + _ -> + Allow = case ejabberd_riak:get_by_index( + muc_registered, + muc_registered_schema(), + <<"nick_host">>, {Nick, Host}) of + {ok, []} -> + true; + {ok, [#muc_registered{us_host = {U, _Host}}]} -> + U == LUS; + {error, _} -> + false + end, + if Allow -> + ejabberd_riak:put(#muc_registered{us_host = {LUS, Host}, + nick = Nick}, + muc_registered_schema(), + [{'2i', [{<<"nick_host">>, + {Nick, Host}}]}]); + true -> + false + end + end}. + +import(_LServer, #muc_room{} = R) -> + ejabberd_riak:put(R, muc_room_schema()); +import(_LServer, #muc_registered{us_host = {_, Host}, nick = Nick} = R) -> + ejabberd_riak:put(R, muc_registered_schema(), + [{'2i', [{<<"nick_host">>, {Nick, Host}}]}]). + +%%%=================================================================== +%%% Internal functions +%%%=================================================================== +muc_room_schema() -> + {record_info(fields, muc_room), #muc_room{}}. + +muc_registered_schema() -> + {record_info(fields, muc_registered), #muc_registered{}}. |