ADD création d'un message associé au troll de la semaine lors de l'élection de celui ci.
authorGreg Burri <greg.burri@gmail.com>
Sat, 24 May 2008 07:50:38 +0000 (07:50 +0000)
committerGreg Burri <greg.burri@gmail.com>
Sat, 24 May 2008 07:50:38 +0000 (07:50 +0000)
css/1/pageMinichat.css
doc/protocole3.txt
js/pageMinichat.js
modules/erl/euphorik_bd.erl
modules/erl/euphorik_protocole.erl
modules/include/euphorik_bd.hrl

index bd2a920..da92691 100755 (executable)
@@ -60,7 +60,8 @@
 
 #page.minichat #trollCourant .troll {
        font-style: italic;
-       color: #FFFF88
+       color: #FFFF88;
+       cursor: pointer;
 }
 
 #page.minichat .titreSmiles:hover {
index 8489e58..4b18f9e 100644 (file)
@@ -192,6 +192,7 @@ ou
    {
       "reply" : "new_troll",
       "troll_id" : 123,
+      "message_id" : 12,
       "content" : "Linux sera desktop ready en 2008 ?"
    }
 ou
index 5ce2793..0ba6dc6 100755 (executable)
@@ -242,14 +242,7 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message)
                         
                // met à jour la classe des messages auquel repond celui ci (c'est un peu de la triche)
                for (var i = 0; i < repondA.length; i++)
-               {
                   $("#conversations div#" + repondA[i]).addClass("repondu")
-                  /* Ca sert à rien, TODO : tester/virer
-                  for (var c = 0; c < thisPageMinichat.messages.conversations.length; c++)
-                     for (var m = 0; m < thisPageMinichat.messages.conversations[c].messages.length; m++)
-                        thisPageMinichat.messages.conversations[c].messages[m].clientARepondu = true
-                  */
-               }
             }
             else if (data["reply"] == "error")
             {
@@ -930,7 +923,13 @@ Messages.prototype.rafraichirMessages = function(vider)
          {
             case "new_troll" :
                thisMessages.trollIdCourant = data["troll_id"]
-               $("#trollCourant .troll").html(thisMessages.formateur.traitementComplet(data["content"]))
+               $("#trollCourant .troll").html(thisMessages.formateur.traitementComplet(data["content"])).unbind().click(
+                  function()
+                  {
+                     thisMessages.ouvrirConversation(data["message_id"])
+                  }
+               )
+               
                $("#trollCourant .troll a[@rel*=lightbox]").lightBox()
                break
                
index b938f75..91d6f67 100755 (executable)
@@ -50,6 +50,7 @@
    % messages :
    nouveau_message/3,
    nouveau_message_sys/1,
+   nouveau_message_sys/2,
    messages/1,
    messages/2,\r
    messages/3,
@@ -78,6 +79,7 @@
    troll_by_id/1,
    current_troll/0,
    elire_troll/0,
+   message_id_associe/1,
    
    % versions :
    update_version/1,
@@ -110,7 +112,7 @@ create_tables() ->
    ]),
    mnesia:create_table(minichat, [
       {attributes, record_info(fields, minichat)},
-      {index, [auteur_id]},
+      {index, [auteur_id, troll_id]},
       {disc_copies, [node()]}
    ]),
    mnesia:create_table(reponse_minichat, [
@@ -430,13 +432,19 @@ inserer_reponses(_, []) ->
 % Permet de créer un message système.
 % Renvoie l'id du message système
 nouveau_message_sys(Mess) ->
+   nouveau_message_sys(Mess, undefined).
+   
+
+% Création d'un message système lié à un troll.
+nouveau_message_sys(Mess, Troll_id) ->
    {ok, Root} = user_by_id(0),
-   mnesia:transaction(
+   resultat_transaction(mnesia:transaction(
       fun() ->
          Id = nouvel_id(minichat),
-         mnesia:write(#minichat{id=Id, auteur_id=0, date=now(), pseudo=Root#user.pseudo, contenu=Mess})
+         mnesia:write(#minichat{id=Id, auteur_id=0, date=now(), pseudo=Root#user.pseudo, contenu=Mess, troll_id=Troll_id}),
+         Id
       end
-   ).
+   )).
    
    
 % Renvoie N messages se trouvant sur la première page
@@ -447,7 +455,10 @@ messages(N) ->
 % Renvoie N messages se trouvant sur la page P
 messages(N, P) ->  
    F = fun() ->
-      C = cursor(q([E || E <- qlc:keysort(2, mnesia:table(minichat), [{order, descending}])])),
+      C = cursor(q([
+         E#minichat{contenu = contenu_message(E)} ||
+         E <- qlc:keysort(2, mnesia:table(minichat), [{order, descending}])
+      ])),
       if P > 1 -> qlc:next_answers(C, N * (P - 1));
          true -> ok
       end,
@@ -468,12 +479,18 @@ messages(Id, N, P) ->
 message_by_id(Id) ->
    case resultat_transaction(mnesia:transaction(
       fun() ->
-         e(q([E || E <- qlc:keysort(2, mnesia:table(minichat), [{order, ascending}]), Id =:= E#minichat.id]))
+         e(q([E#minichat{contenu = contenu_message(E)} || E <- qlc:keysort(2, mnesia:table(minichat), [{order, ascending}]), Id =:= E#minichat.id]))
       end
    )) of
       [M] -> {ok, M};
       _ -> erreur
    end.
+   
+   
+% Renvoie le contenu d'un message donnée, à utiliser à l'intérieur d'une transaction.
+% TODO : Cette fonction pourrait être remplacé par un "outer-join", est-ce possible avec qlc ?
+contenu_message(E) ->
+   lists:flatten(E#minichat.contenu ++ e(q([T#troll.content || T <- mnesia:table(troll), T#troll.id =:= E#minichat.troll_id]))).
   
 
 % Renvoie une liste de message (voir #minichat de euphorik_bd.hrl) à partir d'une liste d'id (Ids).
@@ -678,6 +695,7 @@ trolls(Last_id) ->
    )).
    
  
+ % Crée un nouveau troll.
  % Renvoie l'id du nouveau troll
  % ou max_troll_reached_per_user si le nombre de troll posté par l'utilisateur max a été atteind
  % ou max_troll_reached si le nombre de troll posté max a été atteind
@@ -775,6 +793,7 @@ current_troll() ->
 
 
 % Elit un troll au hasard parmis les trolls en attente (leur date_post =:= undefined)
+% Un message est posté par 'Sys' et le troll elu est lié à ce message
 % met à jour sa date de post.
 % renvoie plus_de_trolls si il n'y a aucun troll en attente.
 elire_troll() ->       
@@ -788,12 +807,25 @@ elire_troll() ->
             Trolls ->
                Troll = lists:nth(random:uniform(length(Trolls)), Trolls),
                Troll2 = Troll#troll{date_post = now()},
-               mnesia:write(Troll2)
+               mnesia:write(Troll2),
+               nouveau_message_sys("Troll de la semaine : ", Troll2#troll.id)
          end
       end
    ).
    
-   
+
+% Renvoie l'id du message associé au troll dont l'id est donnée.
+% Renvoie undefined si il n'y en a pas.
+message_id_associe(Troll_id) ->
+   resultat_transaction(mnesia:transaction(
+      fun() ->
+         case e(q([M#minichat.id || M <- mnesia:table(minichat), M#minichat.troll_id =:= Troll_id])) of
+            [Id] -> Id;
+            _ -> undefined
+         end
+      end
+   )).
+      
    
 update_version(1) ->
    mnesia:transform_table(
index f1f0acd..e3e2cdf 100755 (executable)
@@ -38,7 +38,6 @@
    list_banned_ips/1,
    erreur/1
 ]).
--include_lib("xmerl/include/xmerl.hrl").
 -include("../include/euphorik_bd.hrl").\r
 -include("../include/euphorik_defines.hrl").\r
 
@@ -229,6 +228,7 @@ wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id
          {struct, [
             {reply, "new_troll"},
             {troll_id, Current#troll.id},
+            {message_id, euphorik_bd:message_id_associe(Current#troll.id)},
             {content, Current#troll.content}
          ]};
       _ ->
index 8c16c70..ff1ca40 100755 (executable)
@@ -33,7 +33,8 @@
       auteur_id, % -> #user.id
       date, % erlang:now()
       pseudo, % chaine de caractère
-      contenu % chaine de caractère
+      contenu, % chaine de caractère
+      troll_id = undefined % l'id du troll associé correspondant
    }).\r
    
    \r