MOD fin du système de page et cleanage du code
[euphorik.git] / modules / erl / euphorik_minichat.erl
index a7d267c..4268fef 100755 (executable)
@@ -2,8 +2,7 @@
 % Ce module permet de gérer les données persistantes lié au minichat d'euphorik.ch
 % Il permet d'ajouter des message, de demande les messages sur une page donnée, etc..
 % Ce module utilise la base mnesia créée par le module euphorik_bd.
-% Auteur : G.Burri
-% Date : 22.10.2007
+% @author G.Burri
 
 -module(euphorik_minichat).\r
 -export([
    messages/1,
    messages/2,\r
    messages/3,
-   get_messages_depuis_ids/1,
+   message_by_id/1,
+   messages_by_ids/1,
    reponses/0,
    repond_a/1,
-   get_nb_page/1,
+   nb_page/1,
    users/0,
-   get_user_by_cookie/1,   
-   get_user_by_id/1,   \r
-   get_user_by_login/1,
-   get_user_by_login_password/2,
+   user_by_cookie/1,   
+   user_by_id/1,   \r
+   user_by_login/1,
+   user_by_login_password/2,
+   user_by_mess/1,
    possede_message/2,
    a_repondu_a_message/2,
    est_une_reponse_a_user/2,
    % set :\r
    update_pseudo_user/2,
-   set_profile/6,
+   set_profile/8,
    update_date_derniere_connexion/1,
    nouveau_user/2,
    nouveau_user/3,
    nouveau_message/3,
    reset/0,
    % reservé :
-   resultat_transaction/1]).\r
+   resultat_transaction/1\r
+]).\r
 \r
 -include("../include/euphorik_bd.hrl").\r
 -include_lib("stdlib/include/qlc.hrl").\r
@@ -51,7 +53,7 @@
 % Connexion à la base de données de yaws sur overnux
 connect() ->
    mnesia:start(),
-   mnesia:change_config(extra_db_nodes, [yaws@Plop]).
+   mnesia:change_config(extra_db_nodes, [yaws@flynux]).
 
 
 % Efface tous les users, minichat_reponse et minichat.\r
@@ -70,7 +72,7 @@ reset() ->
 
 % Est-ce qu'un utilisateur existe en fonction de son cookie ?
 % Renvoie {ok, User} ou erreur
-get_user_by_cookie(Cookie) ->
+user_by_cookie(Cookie) ->
    resultat_transaction(mnesia:transaction(
       fun() ->
          Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.cookie =:= Cookie])),
@@ -82,7 +84,7 @@ get_user_by_cookie(Cookie) ->
    )).
    
    
-get_user_by_id(ID) ->
+user_by_id(ID) ->
    resultat_transaction(mnesia:transaction(
       fun() ->
          Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.id =:= ID])),
@@ -94,7 +96,7 @@ get_user_by_id(ID) ->
    )).
    \r
    \r
-get_user_by_login(Login) ->\r
+user_by_login(Login) ->\r
    resultat_transaction(mnesia:transaction(\r
       fun() ->\r
          Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.login =:= Login])),\r
@@ -106,7 +108,7 @@ get_user_by_login(Login) ->
    )).\r
    
    
-get_user_by_login_password(Login, Password) ->
+user_by_login_password(Login, Password) ->
    resultat_transaction(mnesia:transaction(
       fun() ->
          Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.login =:= Login, E#user.password =:= Password])),
@@ -115,12 +117,24 @@ get_user_by_login_password(Login, Password) ->
             _ -> erreur
          end
       end
+   )).
+   
+   
+% Renvoie {ok, User} où User est un #user possédant le message donné.
+user_by_mess(Id) ->
+   resultat_transaction(mnesia:transaction(
+      fun() ->
+         case qlc:e(qlc:q([U || U <- mnesia:table(user), M <- mnesia:table(minichat), M#minichat.id =:= Id, M#minichat.auteur_id =:= U#user.id])) of
+            [User] -> {ok, User};
+            _ -> erreur
+         end
+      end
    )).\r
    \r
    \r
 % Renvoie l'utilisateur root\r
-get_root() ->\r
-   {ok, User} = get_user_by_id(0),\r
+root() ->\r
+   {ok, User} = user_by_id(0),\r
    User.
    
    \r
@@ -181,21 +195,25 @@ update_pseudo_user(UserId, Pseudo) ->
    
    
 % Mise à par Cookie les autres peuvent être undefined ce qui veut dire qu'ils ne seront pas modifié.\r
-set_profile(Cookie, Login, Password, Pseudo, Email, Css) ->
+set_profile(Cookie, Login, Password, Pseudo, Email, Css, Page_principale, Conversations) ->
    resultat_transaction(mnesia:transaction(
       fun() ->
-         case get_user_by_cookie(Cookie) of
+         case user_by_cookie(Cookie) of
             {ok, User} ->               \r
-               case get_user_by_login(Login) of\r
+               case user_by_login(Login) of\r
                   {ok, U} when U#user.id =/= User#user.id ->\r
                      login_deja_pris;\r
                   _ ->               \r
-                     User_modifie = User#user{\r
+                     User_modifie = User#user{
+                        % TODO : pourquoi ne pas tester avec la valeur "undefined" plutôt qu'avec "is_list" ?
+                        % TODO : validation plus strict des données (pas de page négative dans les conv par exemple)\r
                         login = if is_list(Login) -> Login; true -> User#user.login end,\r
                         password = if is_list(Password) -> Password; true -> User#user.password end,\r
                         pseudo = if is_list(Pseudo) -> Pseudo; true -> User#user.pseudo end,\r
                         email = if is_list(Email) -> Email; true -> User#user.email end,\r
-                        css = if is_list(Css) -> Css; true -> User#user.css end\r
+                        css = if is_list(Css) -> Css; true -> User#user.css end,
+                        page_principale = if is_integer(Page_principale), Page_principale > 0 -> Page_principale; true -> User#user.page_principale end,
+                        conversations = if is_list(Conversations) -> Conversations; true -> User#user.conversations end\r
                      },\r
                      mnesia:write(User_modifie),\r
                      ok\r
@@ -223,7 +241,7 @@ update_date_derniere_connexion(UserId) ->
 % Ajoute un nouveau user et le renvoie\r
 nouveau_user(Pseudo, Cookie) ->\r
    F = fun() ->\r
-      Id = get_nouvel_id(user),
+      Id = nouvel_id(user),
       User = #user{id = Id, cookie = Cookie, pseudo = Pseudo, date_creation = now(), date_derniere_connexion = now()},\r
       mnesia:write(User),\r
       User\r
@@ -234,7 +252,7 @@ nouveau_user(Pseudo, Cookie) ->
 % Ajoute un nouveau user et le renvoie
 nouveau_user(Login, Password, Cookie) ->
    F = fun() ->
-      Id = get_nouvel_id(user),
+      Id = nouvel_id(user),
       User = #user{id = Id, cookie = Cookie, pseudo = Login, login = Login, password = Password, date_creation = now(), date_derniere_connexion = now()},
       mnesia:write(User),
       User
@@ -256,7 +274,7 @@ nouveau_message(Mess, Auteur_id, Repond_A) ->
       if Nb_id_trouve =/= length(Repond_A) -> throw("Un ou plusieurs messages introuvable");
          true -> ok
       end,\r
-      Id = get_nouvel_id(minichat),
+      Id = nouvel_id(minichat),
       % compare les dernière
       Delta = delta_date_ms(Auteur#user.date_derniere_connexion, now()),
       Nouvel_indice_flood = Auteur#user.indice_flood + if Delta =< ?DUREE_SPAM -> 2; true -> -1 end,
@@ -266,7 +284,7 @@ nouveau_message(Mess, Auteur_id, Repond_A) ->
       },
       % est-ce que l'auteur à trop floodé ?
       if Auteur#user.indice_flood =/= ?INDICE_SPAM_MAX, Auteur_maj#user.indice_flood =:= ?INDICE_SPAM_MAX, Delta =< ?DUREE_BLOCAGE_SPAM ->\r
-         Root = get_root(),
+         Root = root(),
          mnesia:write(Auteur#user{indice_flood = Auteur_maj#user.indice_flood}),
          mnesia:write(#minichat{id=Id, auteur_id=Root#user.id, date=now(), pseudo=Root#user.pseudo, contenu=Auteur#user.pseudo ++ "(" ++ Auteur#user.login ++ ") est bloqué pour " ++ integer_to_list(trunc(?DUREE_BLOCAGE_SPAM / 1000)) ++ " secondes pour cause de flood.."}),
          Id;
@@ -296,7 +314,7 @@ inserer_reponses(_, []) ->
    \r
 
 % Renvoie un nouvel id pour une table donnée\r
-get_nouvel_id(Table) ->\r
+nouvel_id(Table) ->\r
    mnesia:dirty_update_counter(counter, Table, 1).
    
    \r
@@ -325,13 +343,25 @@ messages(N) ->
    messages(N, 1).
 
 
+% Renvoie {ok, #minichat} (voir #minichat de euphorik_bd.hrl) à partir de son id.
+message_by_id(Id) ->
+   case resultat_transaction(mnesia:transaction(
+      fun() ->
+         qlc:e(qlc:q([E || E <- qlc:keysort(2, mnesia:table(minichat), [{order, ascending}]), Id =:= E#minichat.id]))
+      end
+   )) of
+      [M] -> {ok, M};
+      _ -> erreur
+   end.
+  
+
 % Renvoie une liste de message (voir #minichat de euphorik_bd.hrl) à partir d'une liste d'id (Ids).
-get_messages_depuis_ids(Ids) ->
+messages_by_ids(Ids) ->
    resultat_transaction(mnesia:transaction(
       fun() ->
          % TODO : optimisations ? serait-ce du O(n) ?
          Query = qlc:q([E || E <- qlc:keysort(2, mnesia:table(minichat), [{order, ascending}]), lists:any(fun(Id) -> Id =:= E#minichat.id end, Ids)]),
-         io:format("~s~n", [qlc:info(Query)]),
+         %io:format("~s~n", [qlc:info(Query)]),
          qlc:e(Query)
       end
    )).\r
@@ -339,18 +369,11 @@ get_messages_depuis_ids(Ids) ->
    
 % Renvoie le nombre de page total en fonction du nombre de message par page N 
 % TODO : ya pas un moyen moins pourri pour avoir le nombre de record d'une table ?
-get_nb_page(N) ->
+nb_page(N) ->
    resultat_transaction(mnesia:transaction(fun() ->
       ceiling(length(qlc:e(qlc:q([E#minichat.id || E <- mnesia:table(minichat)]))) / N)
    end)).
-   
-   
-% Renvoie le numéro de la page sur lequel se trouve le message M en sachant qu'il y a N messages par page.
-page(M, N) ->
-   resultat_transaction(mnesia:transaction(fun() ->
-      ceiling((length(qlc:e(qlc:q([E || E <- mnesia:table(minichat), E#minichat.id >= M])))) / N)
-   end)).\r
-   
+     
    
 % Bizarre, cette fonction n'existe pas dans la stdlib.
 ceiling(X) ->