FIX gros bug moisi (ajout de l'information du dernier message au niveau des conversat...
[euphorik.git] / modules / erl / euphorik_minichat_conversation.erl
index 982c4a3..a280e1f 100755 (executable)
@@ -27,7 +27,7 @@
 % Message est le message de type #minichat et Parents une liste d'Id.
 % Plus est un bool. Si Plus vaut true alors il y a encore des messages.
 % Si il n'y a pas de nouveaux message alors la fonction est bloquante et attend un nouveau message.
-% @spec conversations([{integer(), integer()}], integer(), integer(), integer()) -> [Conversation()]
+% @spec conversations([{integer(), integer(), integer()}], integer(), integer(), integer()) -> [Conversation()]
 conversations(Racines, N, D, P) ->
    % écoute des nouveaux messages
    case subscribe(minichat, 2) of
@@ -36,6 +36,7 @@ conversations(Racines, N, D, P) ->
       _ ->
          % demande des conversations
          Conversations = conversations_detailees(Racines, N, D, P),
+         %io:format("Conversations : ~p~n", [Conversations]),
          % si les conversations sont vides alors on attend un nouveau message
          Vide = not any(
             fun(C) ->
@@ -50,11 +51,14 @@ conversations(Racines, N, D, P) ->
          Conversations_mises_en_forme = mise_en_forme_conversations(
             if Vide ->
                attend_nouveau_message(),
+               %io:format("Racines = ~p, N = ~p, D = ~p, P = ~p~n", [Racines, N, D, P]),
+               %io:format("Conversations = ~p~n", [conversations_detailees(Racines, N, D, P)]),
                conversations_detailees(Racines, N, D, P);
             true ->
                Conversations
             end
          ),
+         %io:format("Conversations_mises_en_forme = ~p~n", [Conversations_mises_en_forme]),
          unsubscribe(minichat),
          Conversations_mises_en_forme
    end.
@@ -132,7 +136,7 @@ mise_en_forme_conversation(Messages) ->
 % Racines est une liste de tuple {Id, P} des racines des conversations ou P est la page et Id l'id du message.
 % @spec conversations_detailees([{integer(), integer()}], integer(), integer(), integer()) -> [[integer()] | Conversation_detailee()]
 conversations_detailees(Racines, N, D, P) ->   
-   Conversations = map(fun({Racine, P_conv}) -> conversation(Racine, N, D, P_conv) end, Racines),
+   Conversations = map(fun({Racine, P_conv, Dernier}) -> conversation(Racine, N, Dernier, P_conv) end, Racines),
    Conversation_principale = resultat_transaction(transaction(fun() ->
       Curseur = qlc:cursor(q([E#minichat.id || E <- qlc:sort(table(minichat), [{order, descending}])])),
       {CP, Plus} = conversation_principale(Curseur, Conversations, N, P),
@@ -151,7 +155,6 @@ conversation_principale(C, Conversations, N, P) ->
    % on prend en message de plus pour savoir s'il y en a plus que ce que l'on désire
    CP = reverse(conversation_principale2(C, lists:flatten(map(fun({C2, _, X, _}) -> C2 -- X end, Conversations)), N + 1, (P - 1) * N)),
    Plus = length(CP) =:= N + 1,
-   io:format("~p~n", [CP]),
    {
       if Plus ->
          [_| Suivants] = CP,
@@ -197,16 +200,16 @@ conversation_principale2(C, Messages, N, S) ->
 % @spec conversation([integer()], integer(), integer(), integer()) -> Conversation_detailee()
 conversation(R, N, D, P) ->
    {C, X} = conversation([], [R], []),
-   Decalage = N*(P-1)+1,
+   Decalage = N * (P - 1) + 1,
    {
       reverse(C),
       if Decalage > length(C) ->
             [];
          true ->
-            reverse(filter(
+            filter(
                fun(E) -> E > D end,
-               sublist(C, Decalage, N)
-            ))
+               reverse(sublist(C, Decalage, N))
+            )
       end,
       reverse(X),
       Decalage + N - 1 < length(C) 
@@ -219,13 +222,13 @@ conversation(R, N, D, P) ->
 conversation(Messages, [M | Reste], X) ->
    Est_deja_traite = any(fun(E) -> E =:= M end, Messages),
    if  Est_deja_traite ->
-      conversation(Messages, Reste, X);
-   true ->
-      Enfants = enfants(M),
-      Parents = parents(M),
-      % un message est dit exiterne si un de ses parent ne fait pas partie de la conversation ou si un de ses parents fait partie de X
-      Est_message_externe =  Parents -- Messages =/= [] orelse intersection(Parents, X) =/= [],
-      conversation([M | Messages], Reste ++ Enfants, if Est_message_externe -> [M | X]; true -> X end)
+         conversation(Messages, Reste, X);
+      true ->
+         Enfants = enfants(M),
+         Parents = parents(M),
+         % un message est dit externe si un de ses parent ne fait pas partie de la conversation ou si un de ses parents fait partie de X
+         Est_message_externe =  Parents -- Messages =/= [] orelse intersection(Parents, X) =/= [],
+         conversation([M | Messages], lists:merge(Reste, Enfants), if Est_message_externe -> [M | X]; true -> X end)
    end;
 conversation(Messages, [], X) ->
    {Messages, X}.