X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=modules%2Ferl%2Feuphorik_protocole.erl;h=59f8def0c83766e4b2900e4cc4b043242de9ff5d;hb=d9d05b6a2a13c2da190dd68d4409381d093679b2;hp=ff53a1c209955328d08e2654fa7f860ec8fb4563;hpb=35838780dce22af9f2dc80af9149a30a0433de0a;p=euphorik.git diff --git a/modules/erl/euphorik_protocole.erl b/modules/erl/euphorik_protocole.erl index ff53a1c..59f8def 100755 --- a/modules/erl/euphorik_protocole.erl +++ b/modules/erl/euphorik_protocole.erl @@ -5,7 +5,7 @@ -module(euphorik_protocole). -export([ - register/1, + register/2, login/1, logout/1, profile/1, @@ -20,18 +20,32 @@ % 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_minichat:can_register(IP), + if Can_register -> + 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) + 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_minichat:can_register(IP), + if Can_register -> + User = euphorik_minichat:nouveau_user("", generer_cookie()), + 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}) @@ -45,7 +59,10 @@ loginUser({ok, User}) -> euphorik_minichat:update_date_derniere_connexion(User#user.id), json_reponse_login_ok(User); loginUser(_) -> - erreur("Erreur login"). + % ajoute un délais d'attente (TODO : un autre moyen plus élégant ?) + receive after 1000 -> + erreur("Erreur login") + end. % Renvoie un string() représentant un cookie en base 36. Il y a 10^32 possibillités. @@ -66,16 +83,17 @@ profile( {cookie, Cookie}, {login, Login}, {password, Password}, - {pseudo, Pseudo}, + {nick, Pseudo}, {email, Email}, {css, Css}, + {nick_format, Nick_format_str}, {main_page, Main_page}, - {conversations, Conversations_json} + {conversations, {array, Conversations_json}} ] ) -> % est-ce que les messages auquel on répond existent ? Conversations = lists:foldr( - fun([struct, {root, Root}, {page, Page}], Acc) -> + fun({struct, [{root, Root}, {page, Page}]}, Acc) -> Message_existe = euphorik_minichat:message_existe(Root), if Message_existe -> [{Root, Page} | Acc]; @@ -86,7 +104,7 @@ profile( [], Conversations_json ), - case euphorik_minichat:set_profile(Cookie, Login, Password, Pseudo, Email, Css, Main_page, Conversations) of + case euphorik_minichat: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 -> @@ -105,7 +123,13 @@ wait_event(Data) -> {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, [{racine, Racine}, {page, Page}]}) -> {Racine, Page} end, Conversations_json), + 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_minichat:user_by_cookie(Cookie) of {ok, U} -> U; _ -> inconnu @@ -183,11 +207,12 @@ put_message( 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"); + erreur -> erreur("Impossible d'ajouter un nouveau message"); _ -> - euphorik_minichat:update_pseudo_user(User#user.id, Nick), - json_reponse_ok() + json_reponse_ok() end end; _ -> @@ -244,14 +269,17 @@ json_reponse_login_ok(User) -> {login, User#user.login}, {email, User#user.email}, {css, User#user.css}, + {nick_format, atom_to_list(User#user.nick_format)}, {main_page, User#user.page_principale}, {conversations, {array, lists:map( fun(C) -> {struct, - {root, element(1, C)}, - {page, element(2, C)} + [ + {root, element(1, C)}, + {page, element(2, C)} + ] } end, User#user.conversations