% Ce module utilise une base mnesia.
% @author G.Burri
--module(euphorik_minichat).\r
+-module(euphorik_bd).\r
-export([
% gestion :
create/0,
nouveau_user/3,
set_profile/9,
update_date_derniere_connexion/1,
+ update_ip/2,
update_pseudo_user/2,
users/0,
user_by_cookie/1,
user_by_login/1,
user_by_login_password/2,
user_by_mess/1,
+ toggle_ek_master/1,
% messages :
nouveau_message/3,
a_repondu_a_message/2,
possede_message/2,
- % utiles :
+ % ip :
+ ip_table/0,
+ ban/2,
can_register/1,
+
+ % versions :
+ update_version/1,
+
+ % utiles :
resultat_transaction/1\r
]).\r
\r
% Met à jour la date de la dernière connexion d'un utilisateur à maintenant
-update_date_derniere_connexion(UserId) ->
+update_date_derniere_connexion(User_id) ->
mnesia:transaction(
fun() ->
- case mnesia:wread({user, UserId}) of
+ case mnesia:wread({user, User_id}) of
[User] ->
mnesia:write(User#user{date_derniere_connexion = now()});
_ ->
end
end
).
-
+
+
+% Met à jour l'ip d'un user
+update_ip(User_id, IP) ->
+ mnesia:transaction(
+ fun() ->
+ case mnesia:wread({user, User_id}) of
+ [User] ->
+ mnesia:write(User#user{last_ip = IP});
+ _ ->
+ mnesia:abort("update_ip: User inconnu")
+ end
+ end
+ ).
+
% Met à jour le pseudo du user
update_pseudo_user(UserId, Pseudo) ->
)).\r
+toggle_ek_master(User_id) ->
+ resultat_transaction(mnesia:transaction(
+ fun() ->
+ Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.id =:= User_id])),
+ case Users of
+ [User] ->
+ mnesia:write(User#user{ek_master = not User#user.ek_master});
+ _ -> erreur
+ end
+ end
+ )).
+
+
user_by_login_password(Login, Password) ->
resultat_transaction(mnesia:transaction(
fun() ->
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)]),
qlc:e(Query)
end
)).
_ -> false
end.
+
+ip_table() ->
+ resultat_transaction(mnesia:transaction(
+ fun() ->
+ qlc:e(qlc:q([IP || IP <- mnesia:table(ip_table)]))
+ end
+ )).
+
+
+% Bannie une ip pour un certain temps (en minute).
+ban(IP, Duration) ->
+ mnesia:transaction(
+ fun() ->
+ case mnesia:wread({ip_table, IP}) of
+ [IP_tuple] ->
+ mnesia:write(IP_tuple#ip_table{ban = now(), ban_duration = Duration});
+ _ ->
+ mnesia:write(#ip_table{ip = IP, ban = now(), ban_duration = Duration})
+ end
+ 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.\r
+% 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() ->
)).
+update_version(1) ->
+ mnesia:transform_table(
+ ip_table,
+ fun() -> null end,
+ record_info(fields, ip_table),
+ ip_table
+ ).
+
+
% Renvoie le résultat d'une transaction (en décomposant le tuple fournit)
resultat_transaction({_, T}) ->
T.
% Bizarre, cette fonction n'existe pas dans la stdlib.
+% Pas utilisé mais bon ca me fait de la peine de l'enlever.
ceiling(X) ->
T = trunc(X),
case (X - T) of