FIX problème de gestion du profile, après ouverture d'une conversation puis enregistr...
[euphorik.git] / modules / erl / euphorik_protocole.erl
index dac7d03..c3dfbbe 100755 (executable)
 \r
 \r
 % Une utilisateur s'enregistre avec un tuple {Login, Password}.\r
-register([{login, Login}, {password, Password}], IP) ->\r
+register([{login, Login}, {password, Password}, {profile_infos, Profile_infos}], IP) ->\r
    Can_register = euphorik_bd:can_register(IP),\r
    if Can_register ->\r
          case euphorik_bd:user_by_login(Login) of\r
             {ok, _} ->\r
                erreur("Login déjà existant");\r
             _ ->\r
-               User = euphorik_bd:nouveau_user(Login, Password, generer_cookie()),\r
+               User = euphorik_bd:nouveau_user(Login, Password, generer_cookie(), user_from_json(Profile_infos)),\r
                euphorik_bd:update_ip(User#user.id, IP),\r
                json_reponse_login_ok(User)\r
          end;\r
@@ -58,10 +58,10 @@ register([{login, Login}, {password, Password}], IP) ->
          erreur_register_flood()\r
    end;\r
 % Enregistrement sans {Login, Password}\r
-register([], IP) ->   \r
+register([{profile_infos, Profile_infos}], IP) ->   \r
    Can_register = euphorik_bd:can_register(IP),\r
    if Can_register ->\r
-         User = euphorik_bd:nouveau_user("<nick>", generer_cookie()),\r
+         User = euphorik_bd:nouveau_user("<nick>", generer_cookie(), user_from_json(Profile_infos)),\r
          euphorik_bd:update_ip(User#user.id, IP),\r
          json_reponse_login_ok(User);\r
       true ->\r
@@ -74,19 +74,27 @@ erreur_register_flood() ->
 \r
 % Un utilisateur se logge (avec un couple {login, mot de passe})\r
 login([{login, Login}, {password, Password}], IP) ->\r
-   loginUser(euphorik_bd:user_by_login_password(Login, Password), IP);\r
+   case euphorik_bd:user_by_login_password(Login, Password) of\r
+      {ok, User} ->\r
+         loginUser(User, IP);\r
+      _ -> \r
+         timer:sleep(?TEMPS_ATTENTE_ERREUR_LOGIN),\r
+         erreur("Couple login/pass introuvable")\r
+   end;\r
 % Un utilisateur se logge (avec un cookie)\r
 login([{cookie, Cookie}], IP) ->\r
-   loginUser(euphorik_bd:user_by_cookie(Cookie), IP).\r
+   case euphorik_bd:user_by_cookie(Cookie) of\r
+      {ok, User} ->\r
+         loginUser(User, IP);\r
+      _ ->\r
+         timer:sleep(?TEMPS_ATTENTE_ERREUR_LOGIN),\r
+         erreur("Authentification impossible par cookie")\r
+   end.\r
    \r
-loginUser({ok, User}, IP) ->\r
+loginUser(User, IP) ->\r
    euphorik_bd:update_ip(User#user.id, IP),\r
    euphorik_bd:update_date_derniere_connexion(User#user.id),\r
-   json_reponse_login_ok(User);\r
-loginUser(_, _) ->\r
-   % ajoute un délais d'attente\r
-   timer:sleep(?TEMPS_ATTENTE_ERREUR_LOGIN),\r
-   erreur("Couple login/pass introuvable").\r
+   json_reponse_login_ok(User).\r
    \r
    \r
 % Renvoie un string() représentant un cookie en base 36. Il y a 10^32 possibillités.\r
@@ -107,40 +115,88 @@ profile(
       {cookie, Cookie},\r
       {login, Login},\r
       {password, Password},\r
-      {nick, Pseudo},\r
-      {email, Email},\r
-      {css, Css},\r
-      {nick_format, Nick_format_str},\r
-      {view_times, View_times},\r
-      {view_tooltips, View_tooltips},\r
-      {conversations, {array, Conversations_json}}\r
+      {profile_infos, Profile_infos}\r
    ]\r
 ) ->\r
-   % virage des messages qui n'existent pas\r
-   Conversations = lists:dropwhile(\r
-      fun(Message_id) ->\r
-         not euphorik_bd:message_existe(Message_id)\r
+   case user_from_json(Profile_infos) of\r
+      {erreur, E} -> E;\r
+      UserInfos ->\r
+         User = UserInfos#user {\r
+            cookie = Cookie,\r
+            login = Login,\r
+            password = Password\r
+         },   \r
+         %  TODO : pas très beau, mieux vaut construire un #user\r
+         case euphorik_bd:set_profile(User) of\r
+            ok ->\r
+               json_reponse_ok();\r
+            login_deja_pris ->\r
+               erreur("Login déjà pris");\r
+            _ ->\r
+               erreur("Impossible de mettre à jour le profile")\r
+         end\r
+   end.\r
+\r
+\r
+% Construit un #user à partir des données JSON\r
+user_from_json(\r
+   {struct,\r
+      [\r
+         {nick, Pseudo},\r
+         {email, Email},\r
+         {css, Css},\r
+         {chat_order, Chat_order_str},\r
+         {nick_format, Nick_format_str},\r
+         {view_times, View_times},\r
+         {view_tooltips, View_tooltips},\r
+         {conversations, {array, Conversations_json}},\r
+         {ostentatious_master, Ostentatious_master_str}\r
+      ]\r
+   }\r
+) ->\r
+   % décomposition de la strucure JSON\r
+   Conversations = lists:foldr(\r
+      fun({struct, [{root, Racine}, {minimized, Reduit}]}, A) ->\r
+         % virage des messages qui n'existent pas\r
+         Message_exite = euphorik_bd:message_existe(Racine),\r
+         if Message_exite ->\r
+               [ {Racine, Reduit} | A];\r
+            true ->\r
+               A\r
+         end\r
       end,\r
+      [],\r
       Conversations_json\r
    ),\r
-   %  TODO : pas très beau, mieux vaut construire un #user\r
-   case euphorik_bd:set_profile(\r
-         Cookie,\r
-         Login,\r
-         Password,\r
-         Pseudo,\r
-         Email,\r
-         Css,\r
-         list_to_atom(Nick_format_str),\r
-         View_times,\r
-         View_tooltips,\r
-         Conversations) of\r
-      ok ->\r
-         json_reponse_ok();\r
-      login_deja_pris ->\r
-         erreur("Login déjà pris");\r
-      _ ->\r
-         erreur("Impossible de mettre à jour le profile")\r
+   % vérification des données JSON\r
+   Chat_order = list_to_atom(Chat_order_str),\r
+   Chat_order_valide = lists:any(fun(E) -> E =:= Chat_order end, [reverse, chrono]),\r
+   if not Chat_order_valide ->\r
+         {erreur, Chat_order_str ++ " n'est pas une valeur acceptée pour 'chat_order'"};\r
+      true -> \r
+         Nick_format = list_to_atom(Nick_format_str),\r
+         Nick_format_valide = lists:any(fun(E) -> E =:= Nick_format end, [nick, login, nick_login]),\r
+         if not Nick_format_valide ->\r
+               {erreur, Nick_format_str ++ " n'est pas une valeur acceptée pour 'nick_format'"};\r
+            true -> \r
+               Ostentatious_master = list_to_atom(Ostentatious_master_str),\r
+               Ostentatious_master_valide = lists:any(fun(E) -> E =:= Ostentatious_master end, [invisible, light, heavy]),\r
+               if not Ostentatious_master_valide ->\r
+                     {erreur, Ostentatious_master_str ++ " n'est pas une valeur acceptée pour 'ostentatious_master'"};\r
+                  true ->\r
+                     #user{\r
+                        pseudo = Pseudo,\r
+                        email = Email,\r
+                        css = Css,\r
+                        chat_order = Chat_order,\r
+                        nick_format = Nick_format,\r
+                        view_times = View_times,\r
+                        view_tooltips = View_tooltips,\r
+                        conversations = Conversations,\r
+                        ostentatious_master = Ostentatious_master\r
+                     }\r
+               end\r
+         end      \r
    end.\r
 \r
 \r
@@ -252,7 +308,7 @@ wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id
                         fun({Racine, {Conv, Plus}}) ->\r
                            {struct, [\r
                               {last_page, not Plus},\r
-                              {first, \r
+                              {first, % le premier message de la conversation\r
                                  if Racine =:= undefined orelse Conv =:= [] ->\r
                                        null;\r
                                     true ->\r
@@ -264,7 +320,7 @@ wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id
                                              null\r
                                        end\r
                                  end\r
-                              }, % le premier message de la conversation, peut correspondre\r
+                              },\r
                               {messages, {array,\r
                                  lists:map(\r
                                     fun({Mess, Repond_a}) ->\r
@@ -655,11 +711,18 @@ json_reponse_login_ok(User) ->
          {login, User#user.login},\r
          {email, User#user.email},\r
          {css, User#user.css},\r
+         {chat_order, atom_to_list(User#user.chat_order)},\r
          {nick_format, atom_to_list(User#user.nick_format)},\r
          {view_times, User#user.view_times},\r
          {view_tooltips, User#user.view_tooltips},\r
-         {conversations, {array, User#user.conversations } },\r
-         {ek_master, User#user.ek_master}\r
+         {conversations, {array, lists:map(\r
+            fun({Racine, Reduit}) ->\r
+               {struct, [{root, Racine}, {minimized, Reduit}]}\r
+            end,\r
+            User#user.conversations\r
+         )}},\r
+         {ek_master, User#user.ek_master},\r
+         {ostentatious_master, atom_to_list(User#user.ostentatious_master)}\r
       ]\r
    }.\r
    \r
@@ -692,5 +755,6 @@ json_message(Mess, Repond_a, User) ->
          end,\r
          Repond_a\r
       )}},\r
-      {ek_master, User_mess#user.ek_master}\r
+      {ek_master, User_mess#user.ek_master},\r
+      {ostentatious_master, atom_to_list(User_mess#user.ostentatious_master)}\r
    ]}.\r