diff options
author | Mickaël Rémond <mickael.remond@process-one.net> | 2006-09-05 15:53:54 +0000 |
---|---|---|
committer | Mickaël Rémond <mickael.remond@process-one.net> | 2006-09-05 15:53:54 +0000 |
commit | d97eaa26d553822c3a4148c224c618418d58ad54 (patch) | |
tree | 7404fd7e69a0eb228ad24e764bb7943993df269f /src | |
parent | * src/ejabberd_socket.erl: All XML socket operations moved here (diff) |
* src/mod_muc/mod_muc.erl: It is now possible to configure the
MUC room history feature. A new option has been added in ejabberd muc
module configuration (history_size) to define the size of the history.
0 is used to disable the feature.
* src/mod_muc/mod_muc_room.erl: Likewise.
* doc/guide.tex: Likewise.
SVN Revision: 601
Diffstat (limited to 'src')
-rw-r--r-- | src/mod_muc/mod_muc.erl | 26 | ||||
-rw-r--r-- | src/mod_muc/mod_muc_room.erl | 34 |
2 files changed, 36 insertions, 24 deletions
diff --git a/src/mod_muc/mod_muc.erl b/src/mod_muc/mod_muc.erl index 6e40d0bdf..196181f3f 100644 --- a/src/mod_muc/mod_muc.erl +++ b/src/mod_muc/mod_muc.erl @@ -36,7 +36,7 @@ -record(muc_online_room, {name_host, pid}). -record(muc_registered, {us_host, nick}). --record(state, {host, server_host, access}). +-record(state, {host, server_host, access, history_size}). -define(PROCNAME, ejabberd_mod_muc). @@ -148,14 +148,17 @@ init([Host, Opts]) -> Access = gen_mod:get_opt(access, Opts, all), AccessCreate = gen_mod:get_opt(access_create, Opts, all), AccessAdmin = gen_mod:get_opt(access_admin, Opts, none), + HistorySize = gen_mod:get_opt(history_size, Opts, 20), catch ets:new(muc_online_room, [named_table, public, {keypos, #muc_online_room.name_host}]), ejabberd_router:register_route(MyHost), - load_permanent_rooms(MyHost, Host, {Access, AccessCreate, AccessAdmin}), + load_permanent_rooms(MyHost, Host, {Access, AccessCreate, AccessAdmin}, + HistorySize), {ok, #state{host = MyHost, server_host = Host, - access = {Access, AccessCreate, AccessAdmin}}}. + access = {Access, AccessCreate, AccessAdmin}, + history_size = HistorySize}}. %%-------------------------------------------------------------------- %% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} | @@ -187,8 +190,9 @@ handle_cast(_Msg, State) -> handle_info({route, From, To, Packet}, #state{host = Host, server_host = ServerHost, - access = Access} = State) -> - case catch do_route(Host, ServerHost, Access, From, To, Packet) of + access = Access, + history_size = HistorySize} = State) -> + case catch do_route(Host, ServerHost, Access, HistorySize, From, To, Packet) of {'EXIT', Reason} -> ?ERROR_MSG("~p", [Reason]); _ -> @@ -239,11 +243,11 @@ stop_supervisor(Host) -> supervisor:terminate_child(ejabberd_sup, Proc), supervisor:delete_child(ejabberd_sup, Proc). -do_route(Host, ServerHost, Access, From, To, Packet) -> +do_route(Host, ServerHost, Access, HistorySize, From, To, Packet) -> {AccessRoute, _AccessCreate, _AccessAdmin} = Access, case acl:match_rule(ServerHost, AccessRoute, From) of allow -> - do_route1(Host, ServerHost, Access, From, To, Packet); + do_route1(Host, ServerHost, Access, HistorySize, From, To, Packet); _ -> {xmlelement, _Name, Attrs, _Els} = Packet, Lang = xml:get_attr_s("xml:lang", Attrs), @@ -254,7 +258,7 @@ do_route(Host, ServerHost, Access, From, To, Packet) -> end. -do_route1(Host, ServerHost, Access, From, To, Packet) -> +do_route1(Host, ServerHost, Access, HistorySize, From, To, Packet) -> {_AccessRoute, AccessCreate, AccessAdmin} = Access, {Room, _, Nick} = jlib:jid_tolower(To), {xmlelement, Name, Attrs, _Els} = Packet, @@ -379,7 +383,8 @@ do_route1(Host, ServerHost, Access, From, To, Packet) -> ?DEBUG("MUC: open new room '~s'~n", [Room]), {ok, Pid} = mod_muc_room:start( Host, ServerHost, Access, - Room, From, Nick), + Room, HistorySize, From, + Nick), ets:insert( muc_online_room, #muc_online_room{name_host = {Room, Host}, @@ -411,7 +416,7 @@ do_route1(Host, ServerHost, Access, From, To, Packet) -> -load_permanent_rooms(Host, ServerHost, Access) -> +load_permanent_rooms(Host, ServerHost, Access, HistorySize) -> case catch mnesia:dirty_select( muc_room, [{#muc_room{name_host = {'_', Host}, _ = '_'}, [], @@ -427,6 +432,7 @@ load_permanent_rooms(Host, ServerHost, Access) -> ServerHost, Access, Room, + HistorySize, R#muc_room.opts), ets:insert( muc_online_room, diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl index 3ae1934ac..44eceb476 100644 --- a/src/mod_muc/mod_muc_room.erl +++ b/src/mod_muc/mod_muc_room.erl @@ -14,10 +14,10 @@ %% External exports --export([start_link/6, - start_link/5, +-export([start_link/7, + start_link/6, + start/7, start/6, - start/5, route/4]). %% gen_fsm callbacks @@ -85,22 +85,22 @@ %%%---------------------------------------------------------------------- %%% API %%%---------------------------------------------------------------------- -start(Host, ServerHost, Access, Room, Creator, Nick) -> +start(Host, ServerHost, Access, Room, HistorySize, Creator, Nick) -> Supervisor = gen_mod:get_module_proc(ServerHost, ejabberd_mod_muc_sup), supervisor:start_child( - Supervisor, [Host, ServerHost, Access, Room, Creator, Nick]). + Supervisor, [Host, ServerHost, Access, Room, HistorySize, Creator, Nick]). -start(Host, ServerHost, Access, Room, Opts) -> +start(Host, ServerHost, Access, Room, HistorySize, Opts) -> Supervisor = gen_mod:get_module_proc(ServerHost, ejabberd_mod_muc_sup), supervisor:start_child( - Supervisor, [Host, ServerHost, Access, Room, Opts]). + Supervisor, [Host, ServerHost, Access, Room, HistorySize, Opts]). -start_link(Host, ServerHost, Access, Room, Creator, Nick) -> - gen_fsm:start_link(?MODULE, [Host, ServerHost, Access, Room, Creator, Nick], +start_link(Host, ServerHost, Access, Room, HistorySize, Creator, Nick) -> + gen_fsm:start_link(?MODULE, [Host, ServerHost, Access, Room, HistorySize, Creator, Nick], ?FSMOPTS). -start_link(Host, ServerHost, Access, Room, Opts) -> - gen_fsm:start_link(?MODULE, [Host, ServerHost, Access, Room, Opts], +start_link(Host, ServerHost, Access, Room, HistorySize, Opts) -> + gen_fsm:start_link(?MODULE, [Host, ServerHost, Access, Room, HistorySize, Opts], ?FSMOPTS). %%%---------------------------------------------------------------------- @@ -114,20 +114,22 @@ start_link(Host, ServerHost, Access, Room, Opts) -> %% ignore | %% {stop, StopReason} %%---------------------------------------------------------------------- -init([Host, ServerHost, Access, Room, Creator, _Nick]) -> +init([Host, ServerHost, Access, Room, HistorySize, Creator, _Nick]) -> State = set_affiliation(Creator, owner, #state{host = Host, server_host = ServerHost, access = Access, room = Room, + history = lqueue_new(HistorySize), jid = jlib:make_jid(Room, Host, ""), just_created = true}), {ok, normal_state, State}; -init([Host, ServerHost, Access, Room, Opts]) -> +init([Host, ServerHost, Access, Room, HistorySize, Opts]) -> State = set_opts(Opts, #state{host = Host, server_host = ServerHost, access = Access, room = Room, + history = lqueue_new(HistorySize), jid = jlib:make_jid(Room, Host, "")}), {ok, normal_state, State}. @@ -1372,7 +1374,11 @@ lqueue_new(Max) -> len = 0, max = Max}. -lqueue_in(Item, #lqueue{queue = Q1, len = Len, max = Max}) -> +%% If the message queue limit is set to 0, do not store messages. +lqueue_in(Item, LQ = #lqueue{max = 0}) -> + LQ; +%% Otherwise, rotate messages in the queue store. +lqueue_in(Item, LQ = #lqueue{queue = Q1, len = Len, max = Max}) -> Q2 = queue:in(Item, Q1), if Len >= Max -> |