ADD avancement sur la page admin : listage des ips bannis (presque fini)
[euphorik.git] / modules / erl / euphorik_bd.erl
index 7fac81d..be43e59 100755 (executable)
@@ -21,6 +21,7 @@
    update_pseudo_user/2,
    print_users/0,
    print_users/1,
+   print_user/1,
    user_by_cookie/1,   
    user_by_id/1,   
    user_by_login/1,
@@ -44,7 +45,7 @@
    possede_message/2,
    
    % ip :
-   ip_table/0,
+   list_ban/0,
    ban/2,
    deban/1,
    est_banni/1,
@@ -67,9 +68,7 @@
    % utiles :
    resultat_transaction/1\r
 ]).
-
 -import(qlc, [e/1, e/2, q/1, cursor/1]).\r
-\r
 -include("../include/euphorik_bd.hrl").
 -include("../include/euphorik_defines.hrl").\r
 -include_lib("stdlib/include/qlc.hrl").\r
@@ -250,28 +249,48 @@ print_users(N) ->
       Users = qlc:next_answers(C, N),
       lists:foreach(
          fun(U) ->
-            #user{id = Id, pseudo = Pseudo, login = Login, ek_master = Ek_master, date_derniere_connexion = Date} = U,
-            {{Annee, Mois, Jour}, {Heure, Min, _}} = calendar:now_to_local_time(Date),
-            io:format(
-               "~4w : ~10.10..s~10.10..s ~2w.~2.2.0w.~w - ~2wh~2.2.0w~n",
-               [  
-                  Id,
-                  if Ek_master -> "*"; true -> "" end ++ Pseudo,
-                  "(" ++ Login ++ ")",
-                  Jour, Mois, Annee, Heure, Min
-               ]
-            )
+            print_user(U)
          end,
          Users
       ),
       qlc:delete_cursor(C)
    end)).
    
-
+   
 % Affiche tous les users.
 print_users() ->
    print_users(all_remaining).
    
+   
+print_user(User) when is_record(User, user) ->
+   #user{id = Id, pseudo = Pseudo, login = Login, ek_master = Ek_master, date_derniere_connexion = Date} = User,
+   {{Annee, Mois, Jour}, {Heure, Min, _}} = calendar:now_to_local_time(Date),
+   io:format(
+      "~4w : ~10.10..s~10.10..s ~2w.~2.2.0w.~w - ~2wh~2.2.0w~n",
+      [  
+         Id,
+         if Ek_master -> "*"; true -> "" end ++ Pseudo,
+         "(" ++ Login ++ ")",
+         Jour, Mois, Annee, Heure, Min
+      ]
+   );
+% Affichage d'un user en fonction de son login
+print_user(Login) when is_list(Login) ->
+   case user_by_login(Login) of
+      {ok, User} ->
+         print_user(User);
+      _ ->
+         {erreur, "Login pas trouvé : " ++ Login}
+   end;
+% Affichage d'un user en fonction de son id
+print_user(Id) when is_integer(Id) -> 
+   case user_by_id(Id) of 
+      {ok, User} ->
+         print_user(User);
+      _ ->
+         {erreur, "Id pas trouvé : " ++ integer_to_list(Id)}
+   end.
+   
 
 % Est-ce qu'un utilisateur existe en fonction de son cookie ?
 % Renvoie {ok, User} ou erreur
@@ -521,11 +540,23 @@ possede_message(Id_user, Id_mess) ->
       _ -> false
    end.
    
-
-ip_table() ->
+   
+% renvoie la liste des ip bannies
+% liste de {ip, temps_restant(en minutes), Users} ou Users est une liste de {pseudo, login}
+% TODO : déterminer la complexité de cette fonction. (Il n'y a pas d'index sur #user.last_ip)
+list_ban() ->
    resultat_transaction(mnesia:transaction(
       fun() ->
-         e(q([IP || IP <- mnesia:table(ip_table)]))
+         Now = now(),
+         e(q([
+            {
+               IP#ip_table.ip,
+               delta_date_minute(date_plus_minutes(IP#ip_table.ban, IP#ip_table.ban_duration), Now),
+               e(q([{U#user.pseudo, U#user.login} || U <- mnesia:table(user), U#user.last_ip =:= IP#ip_table.ip]))
+            } ||
+            IP <- qlc:keysort(2, mnesia:table(ip_table)),
+            if IP#ip_table.ban =:= undefined -> false; true -> date_plus_minutes(IP#ip_table.ban, IP#ip_table.ban_duration) > Now end
+         ]))
       end
    )).
 
@@ -567,7 +598,7 @@ est_banni(User_id) ->
                if Echeance < Now -> % l'échéance est passée
                      false;
                   true ->
-                     {true, trunc(delta_date_ms(Echeance, Now) / 1000 / 60)}
+                     {true, delta_date_minute(Echeance, Now)}
                end;
             _ ->
                false
@@ -812,6 +843,10 @@ resultat_transaction({_, T}) ->
 delta_date_ms(D1, D2) ->
    1000000000 * abs(element(1, D1) - element(1, D2)) + 1000 * abs(element(2, D1) - element(2, D2)) + trunc(abs(element(3, D1) - element(3, D2)) / 1000).
 
+% Retourne la différence entre deux timestamp (erlang:now) en minutes
+delta_date_minute(D1, D2) ->
+   trunc(delta_date_ms(D1, D2) / 1000 / 60).
+
 
 % Bizarre, cette fonction n'existe pas dans la stdlib.
 % Pas utilisé mais bon ca me fait de la peine de l'enlever.