X-Git-Url: http://git.euphorik.ch/?p=euphorik.git;a=blobdiff_plain;f=modules%2Ferl%2Feuphorik_bd.erl;h=13acf968d73b0ff78ef79ee237bb449fe8795874;hp=b938f757c3c490785becda5c6eb0bb795138542a;hb=65a4c4e621c5cfc52f20097db8ede10714a7c0f6;hpb=bde82d4691e6bb96f841307b8e2771cec5996e5d diff --git a/modules/erl/euphorik_bd.erl b/modules/erl/euphorik_bd.erl index b938f75..13acf96 100755 --- a/modules/erl/euphorik_bd.erl +++ b/modules/erl/euphorik_bd.erl @@ -33,7 +33,7 @@ % users : nouveau_user/2, nouveau_user/3, - set_profile/9, + set_profile/11, update_date_derniere_connexion/1, update_ip/2, update_pseudo_user/2, @@ -50,6 +50,7 @@ % messages : nouveau_message/3, nouveau_message_sys/1, + nouveau_message_sys/2, messages/1, messages/2, messages/3, @@ -78,6 +79,7 @@ troll_by_id/1, current_troll/0, elire_troll/0, + message_id_associe/1, % versions : update_version/1, @@ -110,7 +112,7 @@ create_tables() -> ]), mnesia:create_table(minichat, [ {attributes, record_info(fields, minichat)}, - {index, [auteur_id]}, + {index, [auteur_id, troll_id]}, {disc_copies, [node()]} ]), mnesia:create_table(reponse_minichat, [ @@ -182,12 +184,12 @@ nouveau_user(Login, Password, Cookie) -> % 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, Nick_format, Page_principale, Conversations) -> +set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, View_times, View_tooltips, Page_principale, Conversations) -> if Nick_format =:= nick; Nick_format =:= login; Nick_format =:= nick_login -> resultat_transaction(mnesia:transaction( fun() -> case user_by_cookie(Cookie) of - {ok, User} -> + {ok, User} -> case user_by_login(Login) of {ok, U} when Login =/= [], U#user.id =/= User#user.id -> login_deja_pris; @@ -201,6 +203,8 @@ set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, Page_princ email = if is_list(Email) -> Email; true -> User#user.email end, css = if is_list(Css) -> Css; true -> User#user.css end, nick_format = Nick_format, + view_times = View_times, + view_tooltips = View_tooltips, 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 }, @@ -430,13 +434,19 @@ inserer_reponses(_, []) -> % Permet de créer un message système. % Renvoie l'id du message système nouveau_message_sys(Mess) -> + nouveau_message_sys(Mess, undefined). + + +% Création d'un message système lié à un troll. +nouveau_message_sys(Mess, Troll_id) -> {ok, Root} = user_by_id(0), - mnesia:transaction( + resultat_transaction(mnesia:transaction( fun() -> Id = nouvel_id(minichat), - mnesia:write(#minichat{id=Id, auteur_id=0, date=now(), pseudo=Root#user.pseudo, contenu=Mess}) + mnesia:write(#minichat{id=Id, auteur_id=0, date=now(), pseudo=Root#user.pseudo, contenu=Mess, troll_id=Troll_id}), + Id end - ). + )). % Renvoie N messages se trouvant sur la première page @@ -447,7 +457,10 @@ messages(N) -> % Renvoie N messages se trouvant sur la page P messages(N, P) -> F = fun() -> - C = cursor(q([E || E <- qlc:keysort(2, mnesia:table(minichat), [{order, descending}])])), + C = cursor(q([ + E#minichat{contenu = contenu_message(E)} || + E <- qlc:keysort(2, mnesia:table(minichat), [{order, descending}]) + ])), if P > 1 -> qlc:next_answers(C, N * (P - 1)); true -> ok end, @@ -468,12 +481,18 @@ messages(Id, N, P) -> message_by_id(Id) -> case resultat_transaction(mnesia:transaction( fun() -> - e(q([E || E <- qlc:keysort(2, mnesia:table(minichat), [{order, ascending}]), Id =:= E#minichat.id])) + e(q([E#minichat{contenu = contenu_message(E)} || E <- qlc:keysort(2, mnesia:table(minichat), [{order, ascending}]), Id =:= E#minichat.id])) end )) of [M] -> {ok, M}; _ -> erreur end. + + +% Renvoie le contenu d'un message donnée, à utiliser à l'intérieur d'une transaction. +% TODO : Cette fonction pourrait être remplacé par un "outer-join", est-ce possible avec qlc ? +contenu_message(E) -> + lists:flatten(E#minichat.contenu ++ e(q([T#troll.content || T <- mnesia:table(troll), T#troll.id =:= E#minichat.troll_id]))). % Renvoie une liste de message (voir #minichat de euphorik_bd.hrl) à partir d'une liste d'id (Ids). @@ -678,6 +697,7 @@ trolls(Last_id) -> )). + % Crée un nouveau troll. % Renvoie l'id du nouveau troll % ou max_troll_reached_per_user si le nombre de troll posté par l'utilisateur max a été atteind % ou max_troll_reached si le nombre de troll posté max a été atteind @@ -775,6 +795,7 @@ current_troll() -> % Elit un troll au hasard parmis les trolls en attente (leur date_post =:= undefined) +% Un message est posté par 'Sys' et le troll elu est lié à ce message % met à jour sa date de post. % renvoie plus_de_trolls si il n'y a aucun troll en attente. elire_troll() -> @@ -788,12 +809,25 @@ elire_troll() -> Trolls -> Troll = lists:nth(random:uniform(length(Trolls)), Trolls), Troll2 = Troll#troll{date_post = now()}, - mnesia:write(Troll2) + mnesia:write(Troll2), + nouveau_message_sys("Troll de la semaine : ", Troll2#troll.id) end end ). - + +% Renvoie l'id du message associé au troll dont l'id est donnée. +% Renvoie undefined si il n'y en a pas. +message_id_associe(Troll_id) -> + resultat_transaction(mnesia:transaction( + fun() -> + case e(q([M#minichat.id || M <- mnesia:table(minichat), M#minichat.troll_id =:= Troll_id])) of + [Id] -> Id; + _ -> undefined + end + end + )). + update_version(1) -> mnesia:transform_table(