ADD trolls, fin coté serveur et début coté client
[euphorik.git] / modules / erl / euphorik_minichat_conversation.erl
index eb154ee..d5f486f 100755 (executable)
    conversations/4\r
 ]).
 
--compile(export_all).
-
 -include("euphorik_bd.hrl").
 -include_lib("stdlib/include/qlc.hrl").
 
 -import(lists, [reverse/1, any/2, map/2, sublist/3, filter/2]).
--import(euphorik_minichat, [resultat_transaction/1]).
+-import(euphorik_bd, [resultat_transaction/1]).
 -import(qlc, [e/1, q/1, keysort/3]).
 -import(mnesia, [table/1, transaction/1]).
   
 % 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
-      erreur = E ->
+   case mnesia:subscribe({table, minichat, simple}) of
+      {error, E} = E ->
          E;
       _ ->
          % demande des conversations
@@ -57,31 +55,33 @@ conversations(Racines, N, D, P) ->
                Conversations
             end
          ),
-         unsubscribe(minichat),
+         mnesia:unsubscribe({table, minichat, simple}),
          Conversations_mises_en_forme
    end.
    
    
 % Ecoute les événements de modification d'une table.
 % @spec subscribe(atom(), integer()) -> ok | erreur
-subscribe(_Table, 0) ->
-   erreur;
-subscribe(Table, C) ->
-   case mnesia:subscribe({table, Table, simple}) of 
-       {error, {not_active_local, Table}} ->       
-         mnesia:add_table_copy(minichat, node(), ram_copies),
-         subscribe(Table, C - 1);
-      {error, _}->
-         erreur;
-      _ ->
-         ok
-   end.   
+% Obsolète
+%~ subscribe(_Table, 0) ->
+   %~ erreur;
+%~ subscribe(Table, C) ->
+   %~ case mnesia:subscribe({table, Table, simple}) of 
+       %~ {error, {not_active_local, Table}} ->
+         %~ mnesia:add_table_copy(minichat, node(), ram_copies),
+         %~ subscribe(Table, C - 1);
+      %~ {error, _}->
+         %~ erreur;
+      %~ _ ->
+         %~ ok
+   %~ end.   
    
    
 % Arrête d'écouter les modifications d'une table.
 % @spec unsubscribe(atom()) -> term()
-unsubscribe(Table) -> 
-   mnesia:unsubscribe({table, Table, simple}).
+% Obsolète
+%~ unsubscribe(Table) -> 
+   %~ mnesia:unsubscribe({table, Table, simple}).
  
  
 % Attend qu'un nouveau message arrive, function bloquante.
@@ -117,7 +117,7 @@ mise_en_forme_conversations([{Principale, Plus_principale} | Conversations]) ->
 mise_en_forme_conversation(Messages) ->
    lists:foldr(
       fun(Id, Acc) ->
-         case euphorik_minichat:message_by_id(Id) of
+         case euphorik_bd:message_by_id(Id) of
             {ok, Message} ->
                [{Message, parents(Id)} | Acc];
             _ ->
@@ -134,7 +134,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),
@@ -198,16 +198,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) 
@@ -220,13 +220,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 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], 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}.