From 20c5327d1229313b2a6bda46a74459f70614306d Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Sat, 17 May 2008 10:11:59 +0000 Subject: [PATCH] =?utf8?q?FIX=20tr=C3=A8s=20l=C3=A9g=C3=A8res=20conrrectio?= =?utf8?q?ns?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- modules/erl/euphorik_bd.erl | 49 +++++------ modules/erl/euphorik_protocole.erl | 127 +++++++++++++++-------------- 2 files changed, 89 insertions(+), 87 deletions(-) diff --git a/modules/erl/euphorik_bd.erl b/modules/erl/euphorik_bd.erl index 3f74689..7fac81d 100755 --- a/modules/erl/euphorik_bd.erl +++ b/modules/erl/euphorik_bd.erl @@ -346,7 +346,7 @@ user_by_mess(Id) -> % Ajoute un message. Repond_A est une liste d'id auquel le message répond -% retourne soit l'id du message soit erreur. +% retourne soit l'id du message soit {erreur, }. nouveau_message(Mess, Auteur_id, Repond_A) -> % regarde si les id 'Repond_A' existent F = fun() -> @@ -354,30 +354,31 @@ nouveau_message(Mess, Auteur_id, Repond_A) -> % est-ce que l'auteur existe ? Auteur = case e(q([E || E <- mnesia:table(user), E#user.id =:= Auteur_id])) of [A] -> A; - _ -> throw("L'auteur du message est introuvable") + _ -> {erreur, "L'auteur du message est introuvable"} end, - if Nb_id_trouve =/= length(Repond_A) -> throw("Un ou plusieurs messages introuvable"); - true -> ok - end, - % 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, - Auteur_maj = Auteur#user{ - indice_flood = if Nouvel_indice_flood > ?INDICE_SPAM_MAX -> ?INDICE_SPAM_MAX; Nouvel_indice_flood < 0 -> 0; true -> Nouvel_indice_flood end, - date_derniere_connexion = now() - }, - % 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 -> - mnesia:write(Auteur#user{indice_flood = Auteur_maj#user.indice_flood}), - nouveau_message_sys(Auteur#user.pseudo ++ if Auteur#user.login =/= [] -> " (" ++ Auteur#user.login ++ ")"; true -> "" end ++ " est bloqué pour " ++ integer_to_list(trunc(?DUREE_BLOCAGE_SPAM / 1000)) ++ " secondes pour cause de flood."); - Auteur#user.indice_flood =:= ?INDICE_SPAM_MAX, Delta =< ?DUREE_BLOCAGE_SPAM -> - erreur; - true -> - mnesia:write(Auteur_maj), - Id = nouvel_id(minichat), - inserer_reponses(Id, Repond_A), - mnesia:write(#minichat{id=Id, auteur_id=Auteur#user.id, date=now(), pseudo=Auteur#user.pseudo, contenu=Mess}), - Id + if Nb_id_trouve =/= length(Repond_A) -> + {erreur, "Un ou plusieurs messages introuvable"}; + true -> + % comparaison entre la date du dernier poste et maintenant (gestion du flood) + 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, + Auteur_maj = Auteur#user{ + indice_flood = if Nouvel_indice_flood > ?INDICE_SPAM_MAX -> ?INDICE_SPAM_MAX; Nouvel_indice_flood < 0 -> 0; true -> Nouvel_indice_flood end, + date_derniere_connexion = now() + }, + % 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 -> + mnesia:write(Auteur#user{indice_flood = Auteur_maj#user.indice_flood}), + nouveau_message_sys(Auteur#user.pseudo ++ if Auteur#user.login =/= [] -> " (" ++ Auteur#user.login ++ ")"; true -> "" end ++ " est bloqué pour " ++ integer_to_list(trunc(?DUREE_BLOCAGE_SPAM / 1000)) ++ " secondes pour cause de flood."); + Auteur#user.indice_flood =:= ?INDICE_SPAM_MAX, Delta =< ?DUREE_BLOCAGE_SPAM -> + {erreur, "Bloqué pour cause de flood"}; + true -> + mnesia:write(Auteur_maj), + Id = nouvel_id(minichat), + inserer_reponses(Id, Repond_A), + mnesia:write(#minichat{id=Id, auteur_id=Auteur#user.id, date=now(), pseudo=Auteur#user.pseudo, contenu=Mess}), + Id + end end end, resultat_transaction(mnesia:transaction(F)). diff --git a/modules/erl/euphorik_protocole.erl b/modules/erl/euphorik_protocole.erl index fd2175d..cf1fbbc 100755 --- a/modules/erl/euphorik_protocole.erl +++ b/modules/erl/euphorik_protocole.erl @@ -198,69 +198,69 @@ wait_event(_) -> wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id, Main_page, Troll_id) -> - % est-ce qu'il y a des nouveaux messages ? - case euphorik_minichat_conversation:conversations(Racines_conversations, Message_count, Last_message_id, Main_page) of - vide -> - % est-ce que le troll est à jour ? - case euphorik_bd:current_troll() of - Current when is_record(Current, troll), Current#troll.id =/= Troll_id -> - {struct, [ - {reply, "new_troll"}, - {troll_id, Current#troll.id}, - {content, Current#troll.content} - ]}; - _ -> + % est-ce que le troll est à jour ? + case euphorik_bd:current_troll() of + Current when is_record(Current, troll), Current#troll.id =/= Troll_id -> + {struct, [ + {reply, "new_troll"}, + {troll_id, Current#troll.id}, + {content, Current#troll.content} + ]}; + _ -> + % est-ce qu'il y a des nouveaux messages ? + case euphorik_minichat_conversation:conversations(Racines_conversations, Message_count, Last_message_id, Main_page) of + vide -> wait_event_bd_page_chat(), % TODO : l'appel est-il bien tail-recursive ? - wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id, Main_page, Troll_id) - end; - Conversations -> - % accrochez-vous ca va siouxer ;) - {struct, [ - {reply, "new_messages"}, - {conversations, {array, - lists:map( - fun({Conv, Plus}) -> - {struct, [ - {last_page, not Plus}, - {messages, {array, - lists:map( - fun({Mess, Repond_a}) -> - Est_proprietaire = User =/= inconnu andalso User#user.id =:= Mess#minichat.auteur_id, - A_repondu_a_message = User =/= inconnu andalso euphorik_bd:a_repondu_a_message(User#user.id, Mess#minichat.id), - Est_une_reponse_a_user = User =/= inconnu andalso euphorik_bd:est_une_reponse_a_user(User#user.id, Mess#minichat.id), - {ok, User_mess } = euphorik_bd:user_by_id(Mess#minichat.auteur_id), - {struct, [ - {id, Mess#minichat.id}, - {user_id, User_mess#user.id}, - {date, format_date(Mess#minichat.date)}, - {system, Mess#minichat.auteur_id =:= 0}, - {owner, Est_proprietaire}, - {answered, A_repondu_a_message}, - {is_a_reply, Est_une_reponse_a_user}, - {nick, Mess#minichat.pseudo}, - {login, User_mess#user.login}, - {content, Mess#minichat.contenu}, - {answer_to, {array, lists:map( - fun(Id_mess) -> - {ok, M} = euphorik_bd:message_by_id(Id_mess), - {ok, User_reponse} = euphorik_bd:user_by_mess(M#minichat.id), - {struct, [{id, M#minichat.id}, {nick, M#minichat.pseudo}, {login, User_reponse#user.login}]} - end, - Repond_a - )}}, - {ek_master, User_mess#user.ek_master} - ]} - end, - Conv - ) - }} - ]} - end, - Conversations - ) - }} - ]} + wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id, Main_page, Troll_id); + Conversations -> + % accrochez-vous ca va siouxer ;) + {struct, [ + {reply, "new_messages"}, + {conversations, {array, + lists:map( + fun({Conv, Plus}) -> + {struct, [ + {last_page, not Plus}, + {messages, {array, + lists:map( + fun({Mess, Repond_a}) -> + Est_proprietaire = User =/= inconnu andalso User#user.id =:= Mess#minichat.auteur_id, + A_repondu_a_message = User =/= inconnu andalso euphorik_bd:a_repondu_a_message(User#user.id, Mess#minichat.id), + Est_une_reponse_a_user = User =/= inconnu andalso euphorik_bd:est_une_reponse_a_user(User#user.id, Mess#minichat.id), + {ok, User_mess } = euphorik_bd:user_by_id(Mess#minichat.auteur_id), + {struct, [ + {id, Mess#minichat.id}, + {user_id, User_mess#user.id}, + {date, format_date(Mess#minichat.date)}, + {system, Mess#minichat.auteur_id =:= 0}, + {owner, Est_proprietaire}, + {answered, A_repondu_a_message}, + {is_a_reply, Est_une_reponse_a_user}, + {nick, Mess#minichat.pseudo}, + {login, User_mess#user.login}, + {content, Mess#minichat.contenu}, + {answer_to, {array, lists:map( + fun(Id_mess) -> + {ok, M} = euphorik_bd:message_by_id(Id_mess), + {ok, User_reponse} = euphorik_bd:user_by_mess(M#minichat.id), + {struct, [{id, M#minichat.id}, {nick, M#minichat.pseudo}, {login, User_reponse#user.login}]} + end, + Repond_a + )}}, + {ek_master, User_mess#user.ek_master} + ]} + end, + Conv + ) + }} + ]} + end, + Conversations + ) + }} + ]} + end end. @@ -304,7 +304,7 @@ put_message( % TODO : non-atomique (update_pseudo+nouveau_message) euphorik_bd:update_pseudo_user(User#user.id, Nick), case euphorik_bd:nouveau_message(Strip_content, User#user.id, Answer_to) of - erreur -> erreur("Impossible d'ajouter un nouveau message"); + {erreur, R} -> erreur("Impossible d'ajouter un nouveau message. Raison : " ++ R); _ -> json_reponse_ok() end @@ -383,7 +383,8 @@ slap( User1#user.pseudo, if Reason =/= [] -> " - Raison: " ++ Reason; true -> "" end ] - ))); + ))), + json_reponse_ok(); {ok, User2 = #user{ek_master = false}} -> euphorik_bd:nouveau_message_sys(lists:flatten(io_lib:format("~s se fait slaper par ~s.~s", [ -- 2.45.2