From 60cb9fc959f3e631e4306cf30ff3219539848a37 Mon Sep 17 00:00:00 2001
From: Alexey Shchepin <alexey@process-one.net>
Date: Sun, 14 Mar 2004 20:47:15 +0000
Subject: [PATCH] * src/web/ejabberd_web.erl: Added interface for users
 listsing and statistics

SVN Revision: 216
---
 ChangeLog                |  5 +++
 src/web/ejabberd_web.erl | 95 ++++++++++++++++++++++++++++++++++++----
 2 files changed, 92 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c2680a514..9e4fc8200 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-03-14  Alexey Shchepin  <alexey@sevcom.net>
+
+	* src/web/ejabberd_web.erl: Added interface for users listsing and
+	statistics
+
 2004-03-13  Alexey Shchepin  <alexey@sevcom.net>
 
 	* src/web/ejabberd_web.erl: New interface for ACLs editing
diff --git a/src/web/ejabberd_web.erl b/src/web/ejabberd_web.erl
index 0eebeb228..518e19e62 100644
--- a/src/web/ejabberd_web.erl
+++ b/src/web/ejabberd_web.erl
@@ -47,7 +47,7 @@ make_xhtml(Els) ->
 
 
 process_get(#request{user = User,
-		     path = ["config" | RPath],
+		     path = ["admin" | RPath],
 		     q = Query,
 		     lang = Lang} = Request) ->
     if
@@ -56,7 +56,7 @@ process_get(#request{user = User,
 		deny ->
 		    {401, [], make_xhtml([?XC("h1", "Not Allowed")])};
 		allow ->
-		    process_config(Request#request{path = RPath})
+		    process_admin(Request#request{path = RPath})
 	    end;
 	true ->
 	    {401,
@@ -76,21 +76,22 @@ process_get(_Request) ->
 
 
 
-process_config(#request{user = User,
+process_admin(#request{user = User,
 			path = [],
 			q = Query,
 			lang = Lang} = Request) ->
-    make_xhtml([?XC("h1", "ejabberd configuration"),
+    make_xhtml([?XC("h1", "ejabberd administration"),
 		?XE("ul",
 		    [?LI([?AC("acls/", "Access Control Lists"), ?C(" "),
 			  ?AC("acls-raw/", "(raw)")]),
 		     ?LI([?AC("access/", "Access Rules")]),
 		     ?LI([?AC("users/", "Users")]),
-		     ?LI([?AC("nodes/", "Nodes")])
+		     ?LI([?AC("nodes/", "Nodes")]),
+		     ?LI([?AC("stats/", "Statistics")])
 		    ])
 	       ]);
 
-process_config(#request{user = User,
+process_admin(#request{user = User,
 			path = ["acls-raw"],
 			q = Query,
 			lang = Lang} = Request) ->
@@ -132,7 +133,7 @@ process_config(#request{user = User,
 		     ])
 	       ]);
 
-process_config(#request{method = Method,
+process_admin(#request{method = Method,
 			user = User,
 			path = ["acls"],
 			q = Query,
@@ -176,7 +177,28 @@ process_config(#request{method = Method,
 		     ])
 	       ]);
 
-process_config(_Request) ->
+process_admin(#request{user = User,
+			path = ["users"],
+			q = Query,
+			lang = Lang} = Request) ->
+    Res = list_users(),
+    make_xhtml([?XC("h1", "ejabberd users")] ++ Res);
+
+process_admin(#request{user = User,
+			path = ["users", Diap],
+			q = Query,
+			lang = Lang} = Request) ->
+    Res = list_users_in_diapason(Diap),
+    make_xhtml([?XC("h1", "ejabberd users")] ++ Res);
+
+process_admin(#request{user = User,
+			path = ["stats"],
+			q = Query,
+			lang = Lang} = Request) ->
+    Res = get_stats(),
+    make_xhtml([?XC("h1", "ejabberd stats")] ++ Res);
+
+process_admin(_Request) ->
     {404, [], make_xhtml([?XC("h1", "Not found")])}.
 
 
@@ -320,3 +342,60 @@ acl_parse_delete(ACLs, Query) ->
     NewACLs.
 
 
+
+list_users() ->
+    Users = ejabberd_auth:dirty_get_registered_users(),
+    SUsers = lists:sort(Users),
+    case length(SUsers) of
+	N when N =< 100 ->
+	    lists:flatmap(
+	      fun(U) ->
+		      [?AC("../user/" ++ U, U), ?BR]
+	      end, SUsers);
+	N ->
+	    NParts = trunc(math:sqrt(N * 0.618)) + 1,
+	    M = trunc(N / NParts) + 1,
+	    lists:flatmap(
+	      fun(K) ->
+		      L = K + M - 1,
+		      Node = integer_to_list(K) ++ "-" ++ integer_to_list(L),
+		      Last = if L < N -> lists:nth(L, SUsers);
+				true -> lists:last(SUsers)
+			     end,
+		      Name = 
+			  lists:nth(K, SUsers) ++ " -- " ++
+			  Last,
+		      [?AC(Node ++ "/", Name), ?BR]
+	      end, lists:seq(1, N, M))
+    end.
+
+list_users_in_diapason(Diap) ->
+    Users = ejabberd_auth:dirty_get_registered_users(),
+    SUsers = lists:sort(Users),
+    {ok, [S1, S2]} = regexp:split(Diap, "-"),
+    N1 = list_to_integer(S1),
+    N2 = list_to_integer(S2),
+    Sub = lists:sublist(SUsers, N1, N2 - N1 + 1),
+    lists:flatmap(
+      fun(U) ->
+	      [?AC("../../user/" ++ U, U), ?BR]
+      end, Sub).
+
+
+
+get_stats() ->
+    OnlineUsers = mnesia:table_info(presence, size),
+    AuthUsers = mnesia:table_info(session, size),
+    RegisteredUsers = mnesia:table_info(passwd, size),
+    
+    [?XAE("table", [],
+	  [?XE("tbody",
+	       [?XE("tr", [?XC("td", "Registered users"),
+			   ?XC("td", integer_to_list(RegisteredUsers))]),
+		?XE("tr", [?XC("td", "Authentificated users"),
+			   ?XC("td", integer_to_list(AuthUsers))]),
+		?XE("tr", [?XC("td", "Online users"),
+			   ?XC("td", integer_to_list(OnlineUsers))])
+	       ])
+	   
+	  ])].
-- 
2.40.0