X-Git-Url: http://git.euphorik.ch/?p=euphorik.git;a=blobdiff_plain;f=modules%2Ferl%2Feuphorik_minichat.erl;h=a507027b408594fc253491314908b2d136c2fdd5;hp=a7d267ca097832965134717fefe205c66ef83b7e;hb=897468be6fa01ab87f38189f2daf266f3289c9fb;hpb=0c375e90be7cb944c1724b78377ae23c2f2ee8ef diff --git a/modules/erl/euphorik_minichat.erl b/modules/erl/euphorik_minichat.erl index a7d267c..a507027 100755 --- a/modules/erl/euphorik_minichat.erl +++ b/modules/erl/euphorik_minichat.erl @@ -12,15 +12,17 @@ messages/1, messages/2, 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, - get_user_by_login/1, - get_user_by_login_password/2, + user_by_cookie/1, + user_by_id/1, + 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, @@ -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) -> )). -get_user_by_login(Login) -> +user_by_login(Login) -> resultat_transaction(mnesia:transaction( fun() -> Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.login =:= Login])), @@ -106,7 +108,7 @@ get_user_by_login(Login) -> )). -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 )). % Renvoie l'utilisateur root -get_root() -> - {ok, User} = get_user_by_id(0), +root() -> + {ok, User} = user_by_id(0), User. @@ -184,9 +198,9 @@ update_pseudo_user(UserId, Pseudo) -> set_profile(Cookie, Login, Password, Pseudo, Email, Css) -> resultat_transaction(mnesia:transaction( fun() -> - case get_user_by_cookie(Cookie) of + case user_by_cookie(Cookie) of {ok, User} -> - case get_user_by_login(Login) of + case user_by_login(Login) of {ok, U} when U#user.id =/= User#user.id -> login_deja_pris; _ -> @@ -223,7 +237,7 @@ update_date_derniere_connexion(UserId) -> % Ajoute un nouveau user et le renvoie nouveau_user(Pseudo, Cookie) -> F = fun() -> - Id = get_nouvel_id(user), + Id = nouvel_id(user), User = #user{id = Id, cookie = Cookie, pseudo = Pseudo, date_creation = now(), date_derniere_connexion = now()}, mnesia:write(User), User @@ -234,7 +248,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 +270,7 @@ nouveau_message(Mess, Auteur_id, Repond_A) -> if Nb_id_trouve =/= length(Repond_A) -> throw("Un ou plusieurs messages introuvable"); true -> ok end, - 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 +280,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 -> - 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 +310,7 @@ inserer_reponses(_, []) -> % Renvoie un nouvel id pour une table donnée -get_nouvel_id(Table) -> +nouvel_id(Table) -> mnesia:dirty_update_counter(counter, Table, 1). @@ -325,13 +339,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 )). @@ -339,17 +365,17 @@ 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)). +%~ 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)). % Bizarre, cette fonction n'existe pas dans la stdlib.