]> granicus.if.org Git - ejabberd/commitdiff
* src/mod_muc/mod_muc.erl: It is now possible to configure the
authorMickaël Rémond <mickael.remond@process-one.net>
Tue, 5 Sep 2006 15:53:54 +0000 (15:53 +0000)
committerMickaël Rémond <mickael.remond@process-one.net>
Tue, 5 Sep 2006 15:53:54 +0000 (15:53 +0000)
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

ChangeLog
doc/guide.html
doc/guide.tex
src/mod_muc/mod_muc.erl
src/mod_muc/mod_muc_room.erl

index 1963c31d759f294f0a71c9c1232478576a502463..6bee1d6babc00ff0189acba562e01d262465ede3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2006-09-05  Mickael Remond  <mickael.remond@process-one.net>
+
+       * 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.
+
 2006-09-05  Alexey Shchepin  <alexey@sevcom.net>
 
        * src/ejabberd_socket.erl: All XML socket operations moved here
index 554201a54a0d0663064a1bdca717ff46efc76e25..5c9558f3445798a5686054ecc57fd34aaca42d8d 100644 (file)
@@ -1980,7 +1980,14 @@ Options:
  value is <TT>none</TT>, which means that only the room creator can
  administer his room). By sending a message to the service JID,
  administrators can send service messages that will be displayed in every
- active room.
+ active room.<BR>
+<BR>
+<DT CLASS="dt-description"><B><TT>history_size</TT></B><DD CLASS="dd-description"> a small history of the
+ current discussion is send to users when they enter the room. This option make
+ it possible to define the number of history messages to keep and send to the
+ user joining the room. The value is a integer. Setting the value to <TT>0</TT>
+ disable the history feature and nothing is kept in memory. The default value
+ is <TT>20</TT>. This value is global and affects all MUC rooms on the server.
 </DL>
 Examples:
 <UL CLASS="itemize"><LI CLASS="li-itemize">
@@ -1991,7 +1998,8 @@ In the first example everyone is allowed to use the Multi-User Chat
  sends a message such as &#8220;Tomorrow, the Jabber server will be moved
  to new hardware. This will involve service breakdowns around 23:00 UMT.
  We apologise for this inconvenience.&#8221; to <TT>conference.example.org</TT>,
- it will be displayed in all active rooms.
+ it will be displayed in all active rooms. In this example the history
+ feature is disabled.
  <PRE CLASS="verbatim">
   {acl, admins, {user, "admin", "example.org"}}.
   ...
@@ -2002,7 +2010,8 @@ In the first example everyone is allowed to use the Multi-User Chat
     ...
     {mod_muc, [{access, all},
                {access_create, all},
-               {access_admin, muc_admins}]},
+               {access_admin, muc_admins},
+               {history_size, 0}]},
     ...
    ]}.
 </PRE><LI CLASS="li-itemize">In the second example the Multi-User Chat service is only accessible by
@@ -2012,7 +2021,9 @@ In the first example everyone is allowed to use the Multi-User Chat
  <TT>admin@example.org</TT> sends a message such as &#8220;Tomorrow, the Jabber
  server will be moved to new hardware. This will involve service breakdowns
  around 23:00 UMT. We apologise for this inconvenience.&#8221; to
- <TT>conference.example.org</TT>, it will be displayed in all active rooms.
+ <TT>conference.example.org</TT>, it will be displayed in all active rooms. No
+ <TT>history_size</TT> option is used, this means that the feature is enabled
+ and the default value of 20 history messages will be send to the users.
  <PRE CLASS="verbatim">
   {acl, paying_customers, {user, "customer1", "example.net"}}.
   {acl, paying_customers, {user, "customer2", "example.com"}}.
index 0a757ca581d9cd3bd9cfafbe66300764318f7800..53a07c585e1453282a558a8f18a56462ccaaf9ef 100644 (file)
@@ -1710,6 +1710,13 @@ Options:
   administer his room). By sending a message to the service JID,
   administrators can send service messages that will be displayed in every
   active room.
+
+  \titem{history\_size} \ind{options!history\_size}a small history of the
+  current discussion is send to users when they enter the room. This option make
+  it possible to define the number of history messages to keep and send to the
+  user joining the room. The value is a integer. Setting the value to \term{0}
+  disable the history feature and nothing is kept in memory. The default value
+  is \term{20}. This value is global and affects all MUC rooms on the server.
 \end{description}
 
 Examples:
@@ -1721,7 +1728,8 @@ Examples:
   sends a message such as ``Tomorrow, the \Jabber{} server will be moved
   to new hardware. This will involve service breakdowns around 23:00 UMT.
   We apologise for this inconvenience.'' to \jid{conference.example.org},
-  it will be displayed in all active rooms.
+  it will be displayed in all active rooms. In this example the history
+  feature is disabled.
   \begin{verbatim}
   {acl, admins, {user, "admin", "example.org"}}.
   ...
@@ -1732,7 +1740,8 @@ Examples:
     ...
     {mod_muc, [{access, all},
                {access_create, all},
-               {access_admin, muc_admins}]},
+               {access_admin, muc_admins},
+               {history_size, 0}]},
     ...
    ]}.
 \end{verbatim}
@@ -1743,7 +1752,9 @@ Examples:
   \jid{admin@example.org} sends a message such as ``Tomorrow, the \Jabber{}
   server will be moved to new hardware. This will involve service breakdowns
   around 23:00 UMT. We apologise for this inconvenience.'' to
-  \jid{conference.example.org}, it will be displayed in all active rooms.
+  \jid{conference.example.org}, it will be displayed in all active rooms. No
+  \term{history\_size} option is used, this means that the feature is enabled
+  and the default value of 20 history messages will be send to the users.
   \begin{verbatim}
   {acl, paying_customers, {user, "customer1", "example.net"}}.
   {acl, paying_customers, {user, "customer2", "example.com"}}.
index 6e40d0bdf221c9e8a8abff843785daaa72e83d5c..196181f3f50c3582b7135b9d206144ceff42799b 100644 (file)
@@ -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,
index 3ae1934ac6fc3861de8ea42c66b94b56afbf337e..44eceb47672504dbb898ea8233b292dc97d82ae1 100644 (file)
 
 
 %% 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
 %%%----------------------------------------------------------------------
 %%% 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 ->