X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=modules%2Ferl%2Feuphorik_minichat.erl;h=35a9d9714c058e82177b5bb9b0e226aa5f7a382d;hb=d9d05b6a2a13c2da190dd68d4409381d093679b2;hp=a507027b408594fc253491314908b2d136c2fdd5;hpb=897468be6fa01ab87f38189f2daf266f3289c9fb;p=euphorik.git diff --git a/modules/erl/euphorik_minichat.erl b/modules/erl/euphorik_minichat.erl index a507027..35a9d97 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([ @@ -14,6 +13,7 @@ messages/3, message_by_id/1, messages_by_ids/1, + message_existe/1, reponses/0, repond_a/1, nb_page/1, @@ -28,16 +28,19 @@ est_une_reponse_a_user/2, % set : update_pseudo_user/2, - set_profile/6, + set_profile/9, update_date_derniere_connexion/1, nouveau_user/2, nouveau_user/3, nouveau_message/3, reset/0, % reservé : - resultat_transaction/1]). + can_register/1, + resultat_transaction/1 +]). --include("../include/euphorik_bd.hrl"). +-include("../include/euphorik_bd.hrl"). +-include("../include/euphorik_defines.hrl"). -include_lib("stdlib/include/qlc.hrl"). % Un message est considéré comme du spam s'il est posté 1 seconde ou moins après le dernier posté @@ -53,7 +56,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. @@ -195,30 +198,39 @@ 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) -> - resultat_transaction(mnesia:transaction( - fun() -> - case user_by_cookie(Cookie) of - {ok, User} -> - case user_by_login(Login) of - {ok, U} when U#user.id =/= User#user.id -> - login_deja_pris; - _ -> - User_modifie = User#user{ - 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 - }, - mnesia:write(User_modifie), - ok - end; - _ -> erreur - end - end - )). - +set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, 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} -> + case user_by_login(Login) of + {ok, U} when User#user.login =/= [], U#user.id =/= User#user.id -> + login_deja_pris; + _ -> + 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, + nick_format = Nick_format, + 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 + end; + _ -> erreur + end + end + )); + true -> + erreur + end. + % Met à jour la date de la dernière connexion d'un utilisateur à maintenant update_date_derniere_connexion(UserId) -> @@ -360,7 +372,15 @@ messages_by_ids(Ids) -> %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 @@ -369,14 +389,7 @@ 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) -> @@ -413,8 +426,35 @@ repond_a(M_id) -> E#reponse_minichat.repondant =:= M_id, M#minichat.id =:= E#reponse_minichat.cible])) end - )). - + )). + + +% Si deux enregistrements consequtifs de la même IP sont fait en moins d'une seconde alors +% ip_table.nb_try_register est incrémenté de 1 sinon il est décrémenté de 1 (jusqu'a 0). +% Si ip_table.nb_try_register vaut 5 alors l'ip ne peux plus s'enregistrer pour une heure. +can_register(IP) -> + resultat_transaction(mnesia:transaction( + fun() -> + case qlc:e(qlc:q([I || I <- mnesia:table(ip_table), I#ip_table.ip =:= IP])) of + [] -> + mnesia:write(#ip_table{ip = IP, date_last_try_register = now()}), + true; + [T] -> + Delta = delta_date_ms(T#ip_table.date_last_try_register, now()), + if T#ip_table.nb_try_register =:= ?NB_MAX_FLOOD_REGISTER, Delta < ?TEMPS_BAN_FLOOD_REGISTER -> + false; + true -> + mnesia:write(#ip_table{ + ip = IP, + date_last_try_register = now(), + nb_try_register = T#ip_table.nb_try_register + if Delta < ?TEMPS_FLOOD_REGISTER -> 1; T#ip_table.nb_try_register > 0 -> -1; true -> 0 end + }), + true + end + end + end + )). + % Renvoie le résultat d'une transaction (en décomposant le tuple fournit) resultat_transaction({_, T}) ->