diff options
author | Paweł Chmielowski <pchmielowski@process-one.net> | 2019-04-30 13:41:03 +0200 |
---|---|---|
committer | Paweł Chmielowski <pchmielowski@process-one.net> | 2019-04-30 13:41:03 +0200 |
commit | b83d30fd07040b64f1d632781388e3864b80c200 (patch) | |
tree | c218dba32bf54ff467bb45a9e3d977bd004114b0 /src | |
parent | Fix escaping for sql part of mamsub from muc mam (diff) |
Make get_subscribed_rooms work even for non-persistant rooms
This will store info about non-persistant rooms in db, but rooms with that
that option enabled will not be restored on server restart.
This will save info about room only on subscribers change.
Diffstat (limited to 'src')
-rw-r--r-- | src/mod_muc.erl | 47 | ||||
-rw-r--r-- | src/mod_muc_room.erl | 58 |
2 files changed, 74 insertions, 31 deletions
diff --git a/src/mod_muc.erl b/src/mod_muc.erl index 6420ced31..76fce1f8e 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -654,31 +654,46 @@ load_permanent_rooms(Host, ServerHost, Access, HistorySize, RoomShaper, QueueType) -> RMod = gen_mod:ram_db_mod(ServerHost, ?MODULE), lists:foreach( - fun(R) -> - {Room, Host} = R#muc_room.name_host, - case RMod:find_online_room(ServerHost, Room, Host) of - error -> - {ok, Pid} = mod_muc_room:start(Host, - ServerHost, Access, Room, - HistorySize, RoomShaper, - R#muc_room.opts, QueueType), - RMod:register_online_room(ServerHost, Room, Host, Pid); - {ok, _} -> - ok - end - end, - get_rooms(ServerHost, Host)). + fun(R) -> + {Room, Host} = R#muc_room.name_host, + case proplists:get_bool(persistent, R#muc_room.opts) of + true -> + case RMod:find_online_room(ServerHost, Room, Host) of + error -> + {ok, Pid} = mod_muc_room:start(Host, + ServerHost, Access, Room, + HistorySize, RoomShaper, + R#muc_room.opts, QueueType), + RMod:register_online_room(ServerHost, Room, Host, Pid); + {ok, _} -> + ok + end; + _ -> + forget_room(ServerHost, Host, Room) + end + end, get_rooms(ServerHost, Host)). start_new_room(Host, ServerHost, Access, Room, HistorySize, RoomShaper, From, Nick, DefRoomOpts, QueueType) -> - case restore_room(ServerHost, Host, Room) of + Opts = case restore_room(ServerHost, Host, Room) of + error -> + error; + Opts0 -> + case proplists:get_bool(persistent, Opts0) of + true -> + Opts0; + _ -> + error + end + end, + case Opts of error -> ?DEBUG("MUC: open new room '~s'~n", [Room]), mod_muc_room:start(Host, ServerHost, Access, Room, HistorySize, RoomShaper, From, Nick, DefRoomOpts, QueueType); - Opts -> + _ -> ?DEBUG("MUC: restore room '~s'~n", [Room]), mod_muc_room:start(Host, ServerHost, Access, Room, HistorySize, RoomShaper, Opts, QueueType) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 5778569df..2e3c2f146 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -1140,6 +1140,7 @@ close_room_if_temporary_and_empty(StateData1) -> "and empty", [jid:encode(StateData1#state.jid)]), add_to_log(room_existence, destroyed, StateData1), + maybe_forget_room(StateData1), {stop, normal, StateData1}; _ -> {next_state, normal_state, StateData1} end. @@ -3485,14 +3486,15 @@ change_config(Config, StateData) -> end, store_room(StateData1), StateData1; - {true, false} -> - Affiliations = get_affiliations(StateData), - mod_muc:forget_room(StateData1#state.server_host, - StateData1#state.host, - StateData1#state.room), - StateData1#state{affiliations = Affiliations}; - {false, false} -> - StateData1 + {WasPersistent, false} -> + maybe_forget_room(StateData1), + case WasPersistent of + true -> + Affiliations = get_affiliations(StateData), + StateData1#state{affiliations = Affiliations}; + _ -> + StateData1 + end end, case {(StateData#state.config)#config.members_only, Config#config.members_only} of @@ -3822,14 +3824,27 @@ destroy_room(DEl, StateData) -> Info#user.jid, Packet, ?NS_MUCSUB_NODES_CONFIG, StateData) end, ok, get_users_and_subscribers(StateData)), - case (StateData#state.config)#config.persistent of - true -> - mod_muc:forget_room(StateData#state.server_host, - StateData#state.host, StateData#state.room); - false -> ok - end, + maybe_forget_room(StateData), {result, undefined, stop}. +maybe_forget_room(StateData) -> + Forget = case (StateData#state.config)#config.persistent of + true -> + true; + _ -> + Mod = gen_mod:db_mod(StateData#state.server_host, mod_muc), + erlang:function_exported(Mod, get_subscribed_rooms, 3) + end, + case Forget of + true -> + mod_muc:forget_room(StateData#state.server_host, + StateData#state.host, + StateData#state.room), + StateData; + _ -> + StateData + end. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Disco @@ -4359,7 +4374,20 @@ element_size(El) -> store_room(StateData) -> store_room(StateData, []). store_room(StateData, ChangesHints) -> - if (StateData#state.config)#config.persistent -> + % Let store persistent rooms or on those backends that have get_subscribed_rooms + ShouldStore = case (StateData#state.config)#config.persistent of + true -> + true; + _ -> + case ChangesHints of + [] -> + false; + _ -> + Mod = gen_mod:db_mod(StateData#state.server_host, mod_muc), + erlang:function_exported(Mod, get_subscribed_rooms, 3) + end + end, + if ShouldStore -> mod_muc:store_room(StateData#state.server_host, StateData#state.host, StateData#state.room, make_opts(StateData), |