X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=modules%2Ferl%2Feuphorik_protocole.erl;h=c2342ca3c773824f78af9daec7f16262d05cf952;hb=eae50232e73fca26d6f631c8177cbea649e5036e;hp=c2cb9846b537865c4faec2cd79644060b46a5af4;hpb=2faefc542de20cfcc0220b5c7fd7982dd0fbbfd4;p=euphorik.git diff --git a/modules/erl/euphorik_protocole.erl b/modules/erl/euphorik_protocole.erl index c2cb984..c2342ca 100755 --- a/modules/erl/euphorik_protocole.erl +++ b/modules/erl/euphorik_protocole.erl @@ -5,12 +5,14 @@ -module(euphorik_protocole). -export([ - register/1, - login/1, + register/2, + login/2, logout/1, profile/1, wait_event/1, put_message/1, + ban/1, + slap/1, erreur/1 ]). @@ -20,31 +22,47 @@ % Une utilisateur s'enregistre avec un tuple {Login, Password}. -register([{login, Login}, {password, Password}]) -> - case euphorik_minichat:user_by_login(Login) of - {ok, _} -> - erreur("Login déjà existant"); - _ -> - User = euphorik_minichat:nouveau_user(Login, Password, generer_cookie()), - json_reponse_login_ok(User) +register([{login, Login}, {password, Password}], IP) -> + Can_register = euphorik_bd:can_register(IP), + if Can_register -> + case euphorik_bd:user_by_login(Login) of + {ok, _} -> + erreur("Login déjà existant"); + _ -> + User = euphorik_bd:nouveau_user(Login, Password, generer_cookie()), + euphorik_bd:update_ip(User#user.id, IP), + json_reponse_login_ok(User) + end; + true -> + erreur_register_flood() end; % Enregistrement sans {Login, Password} -register([]) -> - User = euphorik_minichat:nouveau_user("", generer_cookie()), - json_reponse_login_ok(User). +register([], IP) -> + Can_register = euphorik_bd:can_register(IP), + if Can_register -> + User = euphorik_bd:nouveau_user("", generer_cookie()), + euphorik_bd:update_ip(User#user.id, IP), + json_reponse_login_ok(User); + true -> + erreur_register_flood() + end. + +erreur_register_flood() -> + erreur("Trop de register (flood)"). % Un utilisateur se logge (avec un couple {login, mot de passe}) -login([{login, Login}, {password, Password}]) -> - loginUser(euphorik_minichat:user_by_login_password(Login, Password)); +login([{login, Login}, {password, Password}], IP) -> + loginUser(euphorik_bd:user_by_login_password(Login, Password), IP); % Un utilisateur se logge (avec un cookie) -login([{cookie, Cookie}]) -> - loginUser(euphorik_minichat:user_by_cookie(Cookie)). +login([{cookie, Cookie}], IP) -> + loginUser(euphorik_bd:user_by_cookie(Cookie), IP). -loginUser({ok, User}) -> - euphorik_minichat:update_date_derniere_connexion(User#user.id), +loginUser({ok, User}, IP) -> + euphorik_bd:update_ip(User#user.id, IP), + euphorik_bd:update_date_derniere_connexion(User#user.id), json_reponse_login_ok(User); -loginUser(_) -> +loginUser(_, _) -> % ajoute un délais d'attente (TODO : un autre moyen plus élégant ?) receive after 1000 -> erreur("Erreur login") @@ -80,7 +98,7 @@ profile( % est-ce que les messages auquel on répond existent ? Conversations = lists:foldr( fun({struct, [{root, Root}, {page, Page}]}, Acc) -> - Message_existe = euphorik_minichat:message_existe(Root), + Message_existe = euphorik_bd:message_existe(Root), if Message_existe -> [{Root, Page} | Acc]; true -> @@ -90,7 +108,7 @@ profile( [], Conversations_json ), - case euphorik_minichat:set_profile(Cookie, Login, Password, Pseudo, Email, Css, list_to_atom(Nick_format_str), Main_page, Conversations) of + case euphorik_bd:set_profile(Cookie, Login, Password, Pseudo, Email, Css, list_to_atom(Nick_format_str), Main_page, Conversations) of ok -> json_reponse_ok(); login_deja_pris -> @@ -102,15 +120,20 @@ profile( % Renvoie les messages appropriés. % last_message id et cookie sont facultatifs -% TODO : erreur : {badmatch,false} wait_event(Data) -> Cookie = case lists:keysearch(cookie, 1, Data) of {value, {_, C}} -> C; _ -> inconnu end, Last_message_id = case lists:keysearch(last_message_id, 1, Data) of {value, {_, Id}} -> Id; _ -> 0 end, {value, {_, Message_count}} = lists:keysearch(message_count, 1, Data), Main_page = case lists:keysearch(main_page, 1, Data) of {value, {_, P}} -> P; _ -> 1 end, {value, {_, {array, Conversations_json}}} = lists:keysearch(conversations, 1, Data), - Conversations = lists:map(fun({struct, [{root, Racine}, {page, Page}]}) -> {Racine, Page} end, Conversations_json), - User = case euphorik_minichat:user_by_cookie(Cookie) of + Conversations = lists:map( + fun({struct, [{root, Racine}, {page, Page} | Reste]}) -> + Last_mess_conv = case Reste of [{last_message_id, L}] -> L; _ -> 0 end, + {Racine, Page, Last_mess_conv} + end, + Conversations_json + ), + User = case euphorik_bd:user_by_cookie(Cookie) of {ok, U} -> U; _ -> inconnu end, @@ -126,35 +149,30 @@ wait_event(Data) -> 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_minichat:a_repondu_a_message(User#user.id, Mess#minichat.id), - Est_une_reponse_a_user = User =/= inconnu andalso euphorik_minichat:est_une_reponse_a_user(User#user.id, Mess#minichat.id), - % io:format("Repond_a : ~p~n", [Repond_a]), - User_mess = - if Mess#minichat.auteur_id =:= 0 -> - inconnu; - true -> - {ok, U2} = euphorik_minichat:user_by_id(Mess#minichat.auteur_id), - U2 - end, - {struct, [ - {id, Mess#minichat.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, if User_mess =:= inconnu -> Mess#minichat.pseudo; true -> User_mess#user.login end}, - {content, Mess#minichat.contenu}, - {answer_to, {array, lists:map( - fun(Id_mess) -> - {ok, M} = euphorik_minichat:message_by_id(Id_mess), - {ok, User_reponse} = euphorik_minichat:user_by_mess(M#minichat.id), - {struct, [{id, M#minichat.id}, {nick, M#minichat.pseudo}, {login, User_reponse#user.login}]} - end, - Repond_a - )}} - ]} + 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 ) @@ -181,24 +199,108 @@ put_message( {answer_to, {array, Answer_to}} ] ) -> - case euphorik_minichat:user_by_cookie(Cookie) of + case euphorik_bd:user_by_cookie(Cookie) of {ok, User} -> - Strip_content = string:strip(Content), - if (Strip_content =:= []) -> - erreur("Message vide"); - true -> - % TODO : non-atomique (update_pseudo+nouveau_message) - euphorik_minichat:update_pseudo_user(User#user.id, Nick), - case euphorik_minichat:nouveau_message(Strip_content, User#user.id, Answer_to) of - erreur -> erreur("Impossible d'ajouter un nouveau message"); - _ -> - json_reponse_ok() + case euphorik_bd:est_banni(User#user.id) of + {true, Temps_restant} -> + erreur("Vous êtes banni pour encore " ++ format_minutes(Temps_restant)); + _ -> + Strip_content = string:strip(Content), + if Strip_content =:= [] -> + erreur("Message vide"); + true -> + % 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"); + _ -> + json_reponse_ok() + end end end; - _ -> - erreur("Utilisateur inconnu") + _ -> + erreur("Utilisateur inconnu") + end. + + +% Formatage de minutes. +% par exemple : "1min", "45min", "1h23min", "1jour 2h34min" +format_minutes(Min) -> + Jours = Min div (60 * 24), + Heures = Min rem (60 * 24) div 60, + Minutes = Min rem (60), + if Jours =/= 0 -> integer_to_list(Jours) ++ "Jour" ++ if Jours > 1 -> "s"; true -> "" end ++ " "; true -> "" end ++ + if Heures =/= 0 -> integer_to_list(Heures) ++ "h"; true -> "" end ++ + if Minutes == 0 -> + ""; + true -> + lists:flatten(io_lib:format(if Jours =:= 0, Heures =:= 0 -> "~w"; true -> "~2.2.0w" end, [Minutes])) ++ "min" + end. + + +% bannissement d'un utilisateur (son ip est bannie) +ban( + [ + {cookie, Cookie}, + {duration, Duration}, + {user_id, User_id} + ]) -> + % controle que l'utilisateur est un admin + case euphorik_bd:user_by_cookie(Cookie) of + {ok, User1 = #user{ek_master = true}} -> + case euphorik_bd:user_by_id(User_id) of + {ok, User1} -> + erreur("Il n'est pas possible de s'auto bannir"); + {ok, User2 = #user{ek_master = false}} -> + euphorik_bd:ban(User2#user.last_ip, Duration), + euphorik_bd:nouveau_message_sys(lists:flatten(io_lib:format("~s ~s est ~s pour ~s", + [ + User2#user.pseudo, + if User2#user.login =:= [] -> ""; true -> "(" ++ User2#user.login ++ ")" end, + if Duration =< 15 -> "kické"; true -> "banni" end, + format_minutes(Duration) + ] + ))), + json_reponse_ok(); + {ok, _} -> + erreur("L'utilisateur est lui même un ekMaster"); + _ -> + erreur("Utilisateur à bannir inconnu") + end; + _ -> + erreur("Utilisateur inconnu ou non ek master") end. + +% slapage d'un user (avertissement) +slap( + [ + {cookie, Cookie}, + {user_id, User_id} + ]) -> + % controle que l'utilisateur est un admin + case euphorik_bd:user_by_cookie(Cookie) of + {ok, User1 = #user{ek_master = true}} -> + case euphorik_bd:user_by_id(User_id) of + {ok, User1} -> + euphorik_bd:nouveau_message_sys(lists:flatten(io_lib:format("~s s'auto slap (et il aime ça)", [User1#user.pseudo]))); + {ok, User2 = #user{ek_master = false}} -> + euphorik_bd:nouveau_message_sys(lists:flatten(io_lib:format("~s se fait slaper par ~s", + [ + User2#user.pseudo, + User1#user.pseudo + ] + ))), + json_reponse_ok(); + {ok, _} -> + erreur("L'utilisateur est lui même un ekMaster"); + _ -> + erreur("Utilisateur à slaper inconnu") + end; + _ -> + erreur("Utilisateur inconnu ou non ek master") + end. + % Construit une erreur erreur(Message) -> @@ -232,8 +334,6 @@ format_date(Date) -> ). -%%%%%%%%% %%%%%%%%% - json_reponse_ok() -> {struct, [{reply, "ok"}]}. @@ -265,9 +365,7 @@ json_reponse_login_ok(User) -> User#user.conversations ) } - } + }, + {ek_master, User#user.ek_master} ] }. - - -%%%%%%%%% %%%%%%%%%