ADD changement dans le protocole, le premier message de chaque conversation est maint...
[euphorik.git] / modules / erl / euphorik_protocole.erl
index 448a20b..e8c1569 100755 (executable)
@@ -249,50 +249,48 @@ wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id
                   {reply, "new_messages"},\r
                   {conversations, {array,\r
                      lists:map(\r
-                        fun({Conv, Plus}) ->\r
+                        fun({Racine, {Conv, Plus}}) ->\r
                            {struct, [\r
                               {last_page, not Plus},\r
-                              {messages, {array, \r
+                              {first, \r
+                                 if Racine =:= undefined orelse Conv =:= [] ->\r
+                                       "undefined";\r
+                                    true ->\r
+                                       {Racine_id, _, _} = Racine,\r
+                                       case euphorik_bd:message_by_id(Racine_id) of\r
+                                          {ok, Mess} ->\r
+                                             json_message(Mess, euphorik_bd:parents(Racine), User);\r
+                                          _ ->\r
+                                             "undefined"\r
+                                       end\r
+                                 end\r
+                              }, % le premier message de la conversation, peut correspondre\r
+                              {messages, {array,\r
                                  lists:map(\r
-                                    fun({Mess, Repond_a}) ->                                 \r
-                                       Est_proprietaire = User =/= inconnu andalso User#user.id =:= Mess#minichat.auteur_id,\r
-                                       A_repondu_a_message = User =/= inconnu andalso euphorik_bd:a_repondu_a_message(User#user.id, Mess#minichat.id),\r
-                                       Est_une_reponse_a_user = User =/= inconnu andalso euphorik_bd:est_une_reponse_a_user(User#user.id, Mess#minichat.id),\r
-                                       {ok, User_mess } = euphorik_bd:user_by_id(Mess#minichat.auteur_id),\r
-                                       {struct, [\r
-                                          {id, Mess#minichat.id},\r
-                                          {user_id, User_mess#user.id},\r
-                                          {date, format_date(Mess#minichat.date)},\r
-                                          {system, Mess#minichat.auteur_id =:= 0},\r
-                                          {owner, Est_proprietaire},\r
-                                          {answered, A_repondu_a_message},\r
-                                          {is_a_reply, Est_une_reponse_a_user},\r
-                                          {nick, Mess#minichat.pseudo},\r
-                                          {login, User_mess#user.login},\r
-                                          {content, Mess#minichat.contenu},\r
-                                          {root, Mess#minichat.racine_id},\r
-                                          {answer_to, {array, lists:map(\r
-                                             fun(Id_mess) ->                   \r
-                                                {ok, M} = euphorik_bd:message_by_id(Id_mess),\r
-                                                {ok, User_reponse} = euphorik_bd:user_by_mess(M#minichat.id),\r
-                                                {struct, [{id, M#minichat.id}, {nick, M#minichat.pseudo}, {login, User_reponse#user.login}]}\r
-                                             end,\r
-                                             Repond_a\r
-                                          )}},\r
-                                          {ek_master, User_mess#user.ek_master}\r
-                                       ]}\r
+                                    fun({Mess, Repond_a}) ->\r
+                                       json_message(Mess, Repond_a, User)\r
                                     end,\r
                                     Conv\r
                                  )\r
                               }}\r
                            ]}\r
                         end,\r
-                        Conversations\r
+                        % on ajoute un 'undefined' correspondant à la premier conversation qui ne possède pas de racine\r
+                        % TODO : peut être à revoir car un peu lourd est compliqué\r
+                        aggregation_racines_conversations([undefined | Racines_conversations], Conversations)\r
                      )\r
                   }}\r
                ]}\r
          end\r
    end.\r
+   \r
+\r
+aggregation_racines_conversations(L1, L2) -> \r
+   aggregation_racines_conversations(L1, L2, []).\r
+aggregation_racines_conversations([], [], L) -> lists:reverse(L);\r
+aggregation_racines_conversations([E1|R1], [E2|R2], L) ->\r
+   aggregation_racines_conversations(R1, R2, [{E1, E2} | L]).\r
+   \r
 \r
 \r
 % Attend un événement lié à la page 'chat'.\r
@@ -664,3 +662,35 @@ json_reponse_login_ok(User) ->
          {ek_master, User#user.ek_master}\r
       ]\r
    }.\r
+   \r
+% Renvoie le message formaté en JSON.\r
+% Mess est de type #minichat\r
+% Repond_a est une liste d'id des messages auquel répond Mess\r
+% User est l'utilisateur courant de type #user\r
+json_message(Mess, Repond_a, User) ->\r
+   Est_proprietaire = User =/= inconnu andalso User#user.id =:= Mess#minichat.auteur_id,\r
+   A_repondu_a_message = User =/= inconnu andalso euphorik_bd:a_repondu_a_message(User#user.id, Mess#minichat.id),\r
+   Est_une_reponse_a_user = User =/= inconnu andalso euphorik_bd:est_une_reponse_a_user(User#user.id, Mess#minichat.id),\r
+   {ok, User_mess } = euphorik_bd:user_by_id(Mess#minichat.auteur_id),\r
+   {struct, [\r
+      {id, Mess#minichat.id},\r
+      {user_id, User_mess#user.id},\r
+      {date, format_date(Mess#minichat.date)},\r
+      {system, Mess#minichat.auteur_id =:= 0},\r
+      {owner, Est_proprietaire},\r
+      {answered, A_repondu_a_message},\r
+      {is_a_reply, Est_une_reponse_a_user},\r
+      {nick, Mess#minichat.pseudo},\r
+      {login, User_mess#user.login},\r
+      {content, Mess#minichat.contenu},\r
+      {root, Mess#minichat.racine_id},\r
+      {answer_to, {array, lists:map(\r
+         fun(Id_mess) ->                   \r
+            {ok, M} = euphorik_bd:message_by_id(Id_mess),\r
+            {ok, User_reponse} = euphorik_bd:user_by_mess(M#minichat.id),\r
+            {struct, [{id, M#minichat.id}, {nick, M#minichat.pseudo}, {login, User_reponse#user.login}]}\r
+         end,\r
+         Repond_a\r
+      )}},\r
+      {ek_master, User_mess#user.ek_master}\r
+   ]}.\r