X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=modules%2Ferl%2Feuphorik_minichat.erl;h=2e2f406e004cc8e8736317fabc96a0780369134c;hb=35838780dce22af9f2dc80af9149a30a0433de0a;hp=a7d267ca097832965134717fefe205c66ef83b7e;hpb=13ea96f3600d1c42b22b6ea91dc75055555f72b7;p=euphorik.git diff --git a/modules/erl/euphorik_minichat.erl b/modules/erl/euphorik_minichat.erl index a7d267c..2e2f406 100755 --- a/modules/erl/euphorik_minichat.erl +++ b/modules/erl/euphorik_minichat.erl @@ -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). -export([ @@ -12,28 +11,32 @@ messages/1, messages/2, messages/3, - get_messages_depuis_ids/1, + message_by_id/1, + messages_by_ids/1, + message_existe/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, % set : 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]). + resultat_transaction/1 +]). -include("../include/euphorik_bd.hrl"). -include_lib("stdlib/include/qlc.hrl"). @@ -51,7 +54,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. @@ -70,7 +73,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 +85,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 +97,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 +109,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 +118,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. @@ -181,21 +196,25 @@ update_pseudo_user(UserId, Pseudo) -> % Mise à par Cookie les autres peuvent être undefined ce qui veut dire qu'ils ne seront pas modifié. -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} -> - 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; _ -> - User_modifie = User#user{ + 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) login = if is_list(Login) -> Login; true -> User#user.login end, password = if is_list(Password) -> Password; true -> User#user.password end, pseudo = if is_list(Pseudo) -> Pseudo; true -> User#user.pseudo end, email = if is_list(Email) -> Email; true -> User#user.email end, - css = if is_list(Css) -> Css; true -> User#user.css end + 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 }, mnesia:write(User_modifie), ok @@ -204,7 +223,7 @@ set_profile(Cookie, Login, Password, Pseudo, Email, Css) -> end end )). - + % Met à jour la date de la dernière connexion d'un utilisateur à maintenant update_date_derniere_connexion(UserId) -> @@ -223,7 +242,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 +253,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 +275,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 +285,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 +315,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,32 +344,45 @@ 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 - )). + )). + + +% Est-ce qu'un message existe ? Renvoie un boolean. +% TODO : ya pas plus simple ? +message_existe(Id) -> + resultat_transaction(mnesia:transaction(fun() -> + length(qlc:e(qlc:q([E#minichat.id || E <- mnesia:table(minichat), E#minichat.id =:= Id]))) =:= 1 + end)). % 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)). - + % Bizarre, cette fonction n'existe pas dans la stdlib. ceiling(X) ->