diff options
author | Badlop <badlop@process-one.net> | 2015-05-08 13:09:13 +0200 |
---|---|---|
committer | Badlop <badlop@process-one.net> | 2015-05-08 13:09:25 +0200 |
commit | f817762cc48c13476a531bc40059cd17aea4cf0b (patch) | |
tree | 08137ee90959eef5218978b0aaa2e87885e54453 | |
parent | Fix check_password_hash argument parsing (#559) (diff) |
New max_users_presence mod_muc option (thanks to anhcoi123)(#562)
-rw-r--r-- | src/mod_muc_room.erl | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 8d0b36b6..c52b4e32 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -55,6 +55,8 @@ -define(MAX_USERS_DEFAULT_LIST, [5, 10, 20, 30, 50, 100, 200, 500, 1000, 2000, 5000]). +-define(DEFAULT_MAX_USERS_PRESENCE,1000). + %-define(DBGFSM, true). -ifdef(DBGFSM). @@ -2101,10 +2103,23 @@ extract_history([#xmlel{attrs = Attrs} = El | Els], extract_history([_ | Els], Type) -> extract_history(Els, Type). +is_room_overcrowded(StateData) -> + MaxUsersPresence = gen_mod:get_module_opt(StateData#state.server_host, + mod_muc, max_users_presence, + fun(MUP) when is_integer(MUP) -> MUP end, + ?DEFAULT_MAX_USERS_PRESENCE), + (?DICT):size(StateData#state.users) > MaxUsersPresence. + send_update_presence(JID, StateData) -> send_update_presence(JID, <<"">>, StateData). send_update_presence(JID, Reason, StateData) -> + case is_room_overcrowded(StateData) of + true -> ok; + false -> send_update_presence1(JID, Reason, StateData) + end. + +send_update_presence1(JID, Reason, StateData) -> LJID = jlib:jid_tolower(JID), LJIDs = case LJID of {U, S, <<"">>} -> @@ -2130,6 +2145,12 @@ send_new_presence(NJID, StateData) -> send_new_presence(NJID, <<"">>, StateData). send_new_presence(NJID, Reason, StateData) -> + case is_room_overcrowded(StateData) of + true -> ok; + false -> send_new_presence1(NJID, Reason, StateData) + end. + +send_new_presence1(NJID, Reason, StateData) -> #user{nick = Nick} = (?DICT):fetch(jlib:jid_tolower(NJID), StateData#state.users), @@ -2216,6 +2237,12 @@ send_new_presence(NJID, Reason, StateData) -> (?DICT):to_list(StateData#state.users)). send_existing_presences(ToJID, StateData) -> + case is_room_overcrowded(StateData) of + true -> ok; + false -> send_existing_presences1(ToJID, StateData) + end. + +send_existing_presences1(ToJID, StateData) -> LToJID = jlib:jid_tolower(ToJID), {ok, #user{jid = RealToJID, role = Role}} = (?DICT):find(LToJID, StateData#state.users), |