X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=modules%2Ferl%2Feuphorik_bd.erl;h=9de83fb208dfb02042d78a8bdb53241bd2498089;hb=327c3bd99f586f3cf3af55f9adb10a71eb78cdd4;hp=7fac81d4a89df771598dca1f5aa9f0e8ba3d8a4c;hpb=20c5327d1229313b2a6bda46a74459f70614306d;p=euphorik.git diff --git a/modules/erl/euphorik_bd.erl b/modules/erl/euphorik_bd.erl index 7fac81d..9de83fb 100755 --- a/modules/erl/euphorik_bd.erl +++ b/modules/erl/euphorik_bd.erl @@ -21,6 +21,7 @@ update_pseudo_user/2, print_users/0, print_users/1, + print_user/1, user_by_cookie/1, user_by_id/1, user_by_login/1, @@ -44,7 +45,7 @@ possede_message/2, % ip : - ip_table/0, + list_ban/0, ban/2, deban/1, est_banni/1, @@ -53,7 +54,6 @@ % trolls : trolls/0, trolls/1, - trolls_attente/1, put_troll/2, mod_troll/2, del_troll/1, @@ -67,9 +67,7 @@ % utiles : resultat_transaction/1 ]). - -import(qlc, [e/1, e/2, q/1, cursor/1]). - -include("../include/euphorik_bd.hrl"). -include("../include/euphorik_defines.hrl"). -include_lib("stdlib/include/qlc.hrl"). @@ -250,28 +248,48 @@ print_users(N) -> Users = qlc:next_answers(C, N), lists:foreach( fun(U) -> - #user{id = Id, pseudo = Pseudo, login = Login, ek_master = Ek_master, date_derniere_connexion = Date} = U, - {{Annee, Mois, Jour}, {Heure, Min, _}} = calendar:now_to_local_time(Date), - io:format( - "~4w : ~10.10..s~10.10..s ~2w.~2.2.0w.~w - ~2wh~2.2.0w~n", - [ - Id, - if Ek_master -> "*"; true -> "" end ++ Pseudo, - "(" ++ Login ++ ")", - Jour, Mois, Annee, Heure, Min - ] - ) + print_user(U) end, Users ), qlc:delete_cursor(C) end)). - + % Affiche tous les users. print_users() -> print_users(all_remaining). + +print_user(User) when is_record(User, user) -> + #user{id = Id, pseudo = Pseudo, login = Login, ek_master = Ek_master, date_derniere_connexion = Date} = User, + {{Annee, Mois, Jour}, {Heure, Min, _}} = calendar:now_to_local_time(Date), + io:format( + "~4w : ~10.10..s~10.10..s ~2w.~2.2.0w.~w - ~2wh~2.2.0w~n", + [ + Id, + if Ek_master -> "*"; true -> "" end ++ Pseudo, + "(" ++ Login ++ ")", + Jour, Mois, Annee, Heure, Min + ] + ); +% Affichage d'un user en fonction de son login +print_user(Login) when is_list(Login) -> + case user_by_login(Login) of + {ok, User} -> + print_user(User); + _ -> + {erreur, "Login pas trouvé : " ++ Login} + end; +% Affichage d'un user en fonction de son id +print_user(Id) when is_integer(Id) -> + case user_by_id(Id) of + {ok, User} -> + print_user(User); + _ -> + {erreur, "Id pas trouvé : " ++ integer_to_list(Id)} + end. + % Est-ce qu'un utilisateur existe en fonction de son cookie ? % Renvoie {ok, User} ou erreur @@ -369,7 +387,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 -> 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."); + 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 -> @@ -521,11 +539,23 @@ possede_message(Id_user, Id_mess) -> _ -> false end. - -ip_table() -> + +% renvoie la liste des ip bannies +% liste de {ip, temps_restant(en minutes), Users} ou Users est une liste de {pseudo, login} +% TODO : déterminer la complexité de cette fonction. (Il n'y a pas d'index sur #user.last_ip) +list_ban() -> resultat_transaction(mnesia:transaction( fun() -> - e(q([IP || IP <- mnesia:table(ip_table)])) + Now = now(), + e(q([ + { + IP#ip_table.ip, + delta_date_minute(date_plus_minutes(IP#ip_table.ban, IP#ip_table.ban_duration), Now), + e(q([{U#user.pseudo, U#user.login} || U <- mnesia:table(user), U#user.last_ip =:= IP#ip_table.ip])) + } || + IP <- qlc:keysort(2, mnesia:table(ip_table)), + if IP#ip_table.ban =:= undefined -> false; true -> date_plus_minutes(IP#ip_table.ban, IP#ip_table.ban_duration) > Now end + ])) end )). @@ -567,7 +597,7 @@ est_banni(User_id) -> if Echeance < Now -> % l'échéance est passée false; true -> - {true, trunc(delta_date_ms(Echeance, Now) / 1000 / 60)} + {true, delta_date_minute(Echeance, Now)} end; _ -> false @@ -624,58 +654,11 @@ trolls() -> % Renvoie les trolls manquants posté après Last_id. trolls(Last_id) -> resultat_transaction(mnesia:transaction( - e(q([T || T <- qlc:keysort(2, mnesia:table(troll)), T#troll.id > Last_id, T#troll.date_post =:= undefined])) + fun() -> + e(q([T || T <- qlc:keysort(2, mnesia:table(troll)), T#troll.id > Last_id, T#troll.date_post =:= undefined])) + end )). - -% Renvoie les trolls manquants posté après Last_id. -% Si pas de trolls alors attend un événement tel qu'un ajout, une modification ou une suppression. -% renvoie : -% {mod, Troll} -% ou {add, [Trolls]} -% ou {del, Troll_id} -% ou timeout -trolls_attente(Last_id) -> - case mnesia:subscribe({table, troll, detailed}) of - {error, E} = E -> - E; - _ -> - R = case resultat_transaction(mnesia:transaction( - fun() -> - e(q([T || T <- qlc:keysort(2, mnesia:table(troll)), T#troll.id > Last_id, T#troll.date_post =:= undefined])) - end - )) of - [] -> % pas de trolls - attend_evenement_troll(); - Trolls -> - {add, Trolls} - end, - mnesia:unsubscribe({table, troll, detailed}), - R - end. - -attend_evenement_troll() -> - % s'il n'y a pas de trolls que l'utilisateur n'a pas connaissance alors on attend un événement - receive - % cas où un troll est choisit comme courant - {mnesia_table_event, {write, troll, Troll, [Old_troll | _], _}} when Old_troll#troll.date_post =:= undefined, Troll#troll.date_post =/= undefined -> - {del, Troll#troll.id}; - {mnesia_table_event, {write, troll, Troll, [_Old_troll | _], _}} -> - {mod, Troll}; - {mnesia_table_event, {write, troll, Troll, [], _}} -> - {add, [Troll]}; - {mnesia_table_event, {delete, troll, {troll, Id}, _, _}} -> - {del, Id}; - {tcp_closed, _} -> - exit(normal); - _ -> - attend_evenement_troll() - % 60 minutes de timeout (on ne sais jamais) - % Après 60 minutes de connexion, le client doit donc reétablir une connexion - after 1000 * 60 * 60 -> - timeout - end. - % 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 @@ -812,6 +795,10 @@ resultat_transaction({_, T}) -> delta_date_ms(D1, D2) -> 1000000000 * abs(element(1, D1) - element(1, D2)) + 1000 * abs(element(2, D1) - element(2, D2)) + trunc(abs(element(3, D1) - element(3, D2)) / 1000). +% Retourne la différence entre deux timestamp (erlang:now) en minutes +delta_date_minute(D1, D2) -> + trunc(delta_date_ms(D1, D2) / 1000 / 60). + % Bizarre, cette fonction n'existe pas dans la stdlib. % Pas utilisé mais bon ca me fait de la peine de l'enlever.