Remove the weekly troll.
[euphorik.git] / modules / erl / euphorik_protocole.erl
index 947a18b..ad80c27 100755 (executable)
@@ -15,7 +15,7 @@
 %\r
 % You should have received a copy of the GNU General Public License\r
 % along with Euphorik.  If not, see <http://www.gnu.org/licenses/>.\r
-% \r
+%\r
 % Ce module gére les différents messages envoyés par le client (javascript) via AJAX.\r
 % Les messages donnés ainsi que les réponses sont au format JSON.\r
 % @author G.Burri\r
@@ -30,9 +30,6 @@
    put_message/1,\r
    ban/1,\r
    slap/1,\r
-   put_troll/1,\r
-   mod_troll/1,\r
-   del_troll/1,\r
    unban_ip/1,\r
    list_banned_ips/1,\r
    erreur/1\r
@@ -57,7 +54,7 @@ register([{login, Login}, {password, Password}, {profile, Profile_json}], IP) ->
          erreur_register_flood()\r
    end;\r
 % Enregistrement sans {Login, Password}\r
-register([{profile, Profile_json}], IP) ->   \r
+register([{profile, Profile_json}], IP) ->\r
    Can_register = euphorik_bd:can_register(IP),\r
    if Can_register ->\r
          Profile = profile_from_json(Profile_json),\r
@@ -67,17 +64,17 @@ register([{profile, Profile_json}], IP) ->
       true ->\r
          erreur_register_flood()\r
    end.\r
-   \r
+\r
 erreur_register_flood() ->\r
    erreur(20).\r
-   \r
+\r
 \r
 % Un utilisateur se logge (avec un couple {login, mot de passe})\r
 login([{login, Login}, {password, Password}], IP) ->\r
    case euphorik_bd:user_by_login_password(Login, Password) of\r
       {ok, User} ->\r
          loginUser(User, IP);\r
-      _ -> \r
+      _ ->\r
          timer:sleep(?TEMPS_ATTENTE_ERREUR_LOGIN),\r
          erreur(30)\r
    end;\r
@@ -90,15 +87,15 @@ login([{cookie, Cookie}], IP) ->
          timer:sleep(?TEMPS_ATTENTE_ERREUR_LOGIN),\r
          erreur(40)\r
    end.\r
-   \r
-   \r
+\r
+\r
 % L'utilisateur donné se logge avec l'ip donnée.\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
-   \r
-   \r
+\r
+\r
 % Renvoie un string() représentant un cookie en base 36. Il y a 10^32 possibillités.\r
 generer_cookie() ->\r
    {A1, A2, A3} = now(),\r
@@ -164,12 +161,12 @@ profile_from_json(
    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
+      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
+            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
@@ -187,7 +184,7 @@ profile_from_json(
                         ostentatious_master = Ostentatious_master\r
                      }\r
                end\r
-         end      \r
+         end\r
    end.\r
 \r
 \r
@@ -199,7 +196,6 @@ wait_event([{page, "chat"} | Data]) ->
    Last_message_id = case lists:keysearch(last_message_id, 1, Data) of {value, {_, Id}} -> Id; _ -> 0 end,\r
    {value, {_, Message_count}} = lists:keysearch(message_count, 1, Data),\r
    Main_page = case lists:keysearch(main_page, 1, Data) of {value, {_, P}} -> P; _ -> 1 end,\r
-   Troll_id = case lists:keysearch(troll_id, 1, Data) of {value, {_, T}} -> T; _ -> 0 end,\r
    {value, {_, {array, Conversations_json}}} = lists:keysearch(conversations, 1, Data),\r
    Racines_conversations = lists:map(\r
       fun({struct, [{root, Racine}, {page, Page} | Reste]}) ->\r
@@ -212,62 +208,23 @@ wait_event([{page, "chat"} | Data]) ->
       {ok, U} -> U;\r
       _ -> inconnu\r
    end,\r
-   case {mnesia:subscribe({table, minichat, detailed}), mnesia:subscribe({table, troll, detailed})} of\r
-      {{error, E}, _} -> E;\r
-      {_, {error, E}} -> E;\r
+   case mnesia:subscribe({table, minichat, detailed}) of\r
+      {error, E} -> E;\r
       _ ->\r
          % attente d'événements\r
-         R = wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id, Main_page, Troll_id),\r
+         R = wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id, Main_page),\r
          mnesia:unsubscribe({table, minichat, detailed}),\r
-         mnesia:unsubscribe({table, troll, detailed}),\r
          R\r
    end;\r
 % Attend un événement pour la page "Admin"\r
-wait_event([{page, "admin"}, {last_troll, Last_troll}]) ->\r
-   case wait_event_page_admin(Last_troll) of\r
+wait_event([{page, "admin"}]) ->\r
+   case wait_event_page_admin() of\r
       banned_ips_refresh ->\r
-         {struct, \r
-            [\r
-               {reply, "banned_ips_refresh"}\r
-            ]\r
-         };\r
-      {mod, Troll} ->\r
          {struct,\r
             [\r
-               {reply, "troll_modified"},\r
-               {troll_id, Troll#troll.id},\r
-               {content, Troll#troll.content}\r
+               {reply, "banned_ips_refresh"}\r
             ]\r
          };\r
-      {add, Trolls} ->\r
-         {struct,\r
-            [\r
-               {reply, "troll_added"},\r
-               {trolls, {array, \r
-                  lists:map(\r
-                     fun(T) ->                        \r
-                        {ok, #user{profile = Profile} = User} = euphorik_bd:user_by_id(T#troll.id_user),\r
-                        {struct,\r
-                           [\r
-                              {troll_id, T#troll.id},\r
-                              {content, T#troll.content},\r
-                              {author, Profile#profile.pseudo},\r
-                              {author_id, User#user.id}\r
-                           ]\r
-                        }\r
-                     end,\r
-                     Trolls\r
-                  )\r
-               }}\r
-            ]\r
-         };         \r
-      {del, Troll_id} ->\r
-         {struct,\r
-            [\r
-               {reply, "troll_deleted"},\r
-               {troll_id, Troll_id}\r
-            ]\r
-         };                  \r
       _ ->\r
          erreur(60)\r
    end;\r
@@ -275,71 +232,60 @@ wait_event(_) ->
    erreur(70).\r
 \r
 \r
-% Attend un événement pour la page "Chat" et renvoie soit un troll soit les messages manquants au client.\r
-wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id, Main_page, Troll_id) ->\r
-   % est-ce que le troll est à jour ?\r
-   case euphorik_bd:current_troll() of\r
-      Current when is_record(Current, troll), Current#troll.id =/= Troll_id ->\r
-         {struct, [\r
-            {reply, "new_troll"},\r
-            {troll_id, Current#troll.id},\r
-            {message_id, Current#troll.id_minichat},\r
-            {content, Current#troll.content}\r
-         ]};\r
-      _ ->\r
-         % est-ce qu'il y a des nouveaux messages ?\r
-         case euphorik_minichat_conversation:conversations(Racines_conversations, Message_count, Last_message_id, Main_page) of\r
-            vide ->            \r
-               wait_event_bd_page_chat(),\r
-               wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id, Main_page, Troll_id);\r
-            Conversations ->\r
-               % accrochez-vous ca va siouxer ;)\r
-               {struct, [\r
-                  {reply, "new_messages"},\r
-                  {conversations, {array,\r
-                     lists:map(\r
-                        fun({Racine, {Conv, Plus}}) ->\r
-                           {struct, [\r
-                              {last_page, not Plus},\r
-                              {first, % le premier message de la conversation\r
-                                 if Racine =:= undefined orelse Conv =:= [] ->\r
-                                       null;\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_id(Racine_id), User);\r
-                                          _ ->\r
-                                             null\r
-                                       end\r
-                                 end\r
-                              },\r
-                              {messages, {array,\r
-                                 lists:map(\r
-                                    fun({Mess, Repond_a}) ->\r
-                                       json_message(Mess, Repond_a, User)\r
-                                    end,\r
-                                    Conv\r
-                                 )\r
-                              }}\r
-                           ]}\r
-                        end,\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
+% Attend un événement pour la page "Chat" et renvoie les messages manquants au client.\r
+wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id, Main_page) ->\r
+      % est-ce qu'il y a des nouveaux messages ?\r
+      case euphorik_minichat_conversation:conversations(Racines_conversations, Message_count, Last_message_id, Main_page) of\r
+         vide ->\r
+            wait_event_bd_page_chat(),\r
+            wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id, Main_page);\r
+         Conversations ->\r
+            % Accrochez-vous ca va siouxer ;).\r
+            {struct, [\r
+               {reply, "new_messages"},\r
+               {conversations, {array,\r
+                  lists:map(\r
+                     fun({Racine, {Conv, Plus}}) ->\r
+                        {struct, [\r
+                           {last_page, not Plus},\r
+                           {first, % le premier message de la conversation\r
+                              if Racine =:= undefined orelse Conv =:= [] ->\r
+                                    null;\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_id(Racine_id), User);\r
+                                       _ ->\r
+                                          null\r
+                                    end\r
+                              end\r
+                           },\r
+                           {messages, {array,\r
+                              lists:map(\r
+                                 fun({Mess, Repond_a}) ->\r
+                                    json_message(Mess, Repond_a, User)\r
+                                 end,\r
+                                 Conv\r
+                              )\r
+                           }}\r
+                        ]}\r
+                     end,\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
-   \r
 \r
-aggregation_racines_conversations(L1, L2) -> \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
 \r
 % Attend un événement lié à la page 'chat'.\r
@@ -347,71 +293,42 @@ wait_event_bd_page_chat() ->
    receive % attente d'un post\r
       {mnesia_table_event, {write, minichat, _Message, [], _}} ->\r
          ok;\r
-      {mnesia_table_event, {write, troll, Troll, [Old_troll | _], _}} when Troll#troll.date_post =/= undefined, Old_troll#troll.date_post == undefined ->\r
-         ok;\r
       {tcp_closed, _} ->\r
          exit(normal);\r
       _ ->\r
          wait_event_bd_page_chat()\r
    % 60 minutes de timeout (on ne sais jamais)\r
    % Après 60 minutes de connexion, le client doit donc reétablir une connexion\r
-   after 1000 * 60 * 60 -> \r
+   after 1000 * 60 * 60 ->\r
       timeout\r
    end.\r
 \r
 \r
 % Attent un événement concernant la page admin\r
-% Renvoie les trolls manquants posté après Last_id ou banned_ips_refresh.\r
-% Si pas de trolls alors attend un événement tel qu'un ajout, une modification ou une suppression.\r
-% renvoie :\r
-%  {mod, Troll}\r
-% ou {add, [Trolls]}\r
-% ou {del, Troll_id}\r
-% ou banned_ips_refresh\r
+% banned_ips_refresh\r
 % ou timeout\r
-wait_event_page_admin(Last_id) ->\r
-   case {mnesia:subscribe({table, troll, detailed}), mnesia:subscribe({table, ip_table, detailed})} of\r
-      {{error, E}, _ } -> E;\r
-      {_, {error, E}} -> E;\r
-      _ ->\r
-         R = case euphorik_bd:trolls(Last_id) of\r
-               [] -> % pas de trolls\r
-                  wait_event_page_admin();\r
-               Trolls ->\r
-                  {add, Trolls}\r
-         end,\r
-         mnesia:unsubscribe({table, troll, detailed}),\r
-         mnesia:unsubscribe({table, ip_table, detailed}),\r
-         R\r
-   end.\r
-   \r
 wait_event_page_admin() ->\r
-   % s'il n'y a pas de trolls que l'utilisateur n'a pas connaissance alors on attend un événement\r
-   receive\r
-      % cas où un troll est choisit comme courant\r
-      {mnesia_table_event, {write, troll, Troll, [Old_troll | _], _}}\r
-         when Old_troll#troll.date_post =:= undefined, Troll#troll.date_post =/= undefined ->\r
-         {del, Troll#troll.id};\r
-      {mnesia_table_event, {write, troll, Troll, [_Old_troll | _], _}} ->\r
-         {mod, Troll};\r
-      {mnesia_table_event, {write, troll, Troll, [], _}} ->\r
-         {add, [Troll]};\r
-      {mnesia_table_event, {delete, troll, {troll, Id}, _, _}} ->\r
-         {del, Id};\r
-      {mnesia_table_event, {write, ip_table, IP, [Old_IP | _], _}}\r
-         when Old_IP#ip_table.ban =/= IP#ip_table.ban; Old_IP#ip_table.ban_duration =/= IP#ip_table.ban_duration ->\r
-         banned_ips_refresh;\r
-      {tcp_closed, _} ->\r
-         exit(normal);\r
+   case mnesia:subscribe({table, ip_table, detailed}) of\r
+      {error, E} -> E;\r
       _ ->\r
-         wait_event_page_admin()\r
-   % 60 minutes de timeout (on ne sais jamais)\r
-   % Après 60 minutes de connexion, le client doit donc reétablir une connexion\r
-   after 1000 * 60 * 60 -> \r
-      timeout\r
+      R = receive\r
+         {mnesia_table_event, {write, ip_table, IP, [Old_IP | _], _}}\r
+            when Old_IP#ip_table.ban =/= IP#ip_table.ban; Old_IP#ip_table.ban_duration =/= IP#ip_table.ban_duration ->\r
+            banned_ips_refresh;\r
+         {tcp_closed, _} ->\r
+            exit(normal);\r
+         _ ->\r
+            wait_event_page_admin()\r
+         % 60 minutes de timeout (on ne sais jamais)\r
+         % Après 60 minutes de connexion, le client doit donc reétablir une connexion\r
+      after 1000 * 60 * 60 ->\r
+         timeout\r
+      end,\r
+      mnesia:unsubscribe({table, ip_table, detailed}),\r
+      R\r
    end.\r
-         \r
-         \r
+\r
+\r
 % Un utilisateur envoie un message\r
 % Answer_to est une liste d'id (int)\r
 put_message(\r
@@ -480,7 +397,7 @@ ban(
          _ ->\r
             erreur(150)\r
       end.\r
-      \r
+\r
 \r
 % slapage d'un user (avertissement)\r
 slap(\r
@@ -494,7 +411,7 @@ slap(
          {ok, User1 = #user{ek_master = true, profile = Profile1}} ->\r
             case euphorik_bd:user_by_id(User_id) of\r
                {ok, User1} ->\r
-                  euphorik_bd:nouveau_message_sys(lists:flatten(io_lib:format("~s s'auto slap~s.", \r
+                  euphorik_bd:nouveau_message_sys(lists:flatten(io_lib:format("~s s'auto slap~s.",\r
                      [\r
                         Profile1#profile.pseudo,\r
                         if Reason =/= [] -> " - Raison: " ++ Reason; true -> "" end\r
@@ -518,75 +435,8 @@ slap(
          _ ->\r
             erreur(170)\r
       end.\r
-      \r
\r
-put_troll(\r
-   [\r
-      {cookie, Cookie},\r
-      {content, Content}\r
-   ]\r
-) ->\r
-   % controle que l'utilisateur est un admin\r
-   case euphorik_bd:user_by_cookie(Cookie) of\r
-      {ok, User = #user{ek_master = true}} ->\r
-         case euphorik_bd:put_troll(User#user.id, Content) of\r
-            max_troll_reached_per_user ->\r
-               erreur(180, [?NB_MAX_TROLL_WAITING_BY_USER]);\r
-            max_troll_reached ->\r
-               erreur(190, [?NB_MAX_TROLL_WAITING]);\r
-            _Id ->\r
-               json_reponse_ok()\r
-         end;\r
-      _ ->\r
-         erreur(200)\r
-   end.\r
-   \r
-   \r
-mod_troll(\r
-   [\r
-      {cookie, Cookie},\r
-      {troll_id, Troll_id},\r
-      {content, Content}\r
-   ]\r
-) ->\r
-   % controle que l'utilisateur est un admin\r
-   case euphorik_bd:user_by_cookie(Cookie) of\r
-      {ok, User = #user{ek_master = true}} ->\r
-         User_id = User#user.id,\r
-         case euphorik_bd:troll_by_id(Troll_id) of\r
-            {ok, #troll{id_user = User_id}} ->\r
-               euphorik_bd:mod_troll(Troll_id, Content),\r
-               json_reponse_ok();\r
-            _ ->\r
-               erreur(210)\r
-         end;\r
-      _ ->\r
-         erreur(220)\r
-      end.\r
 \r
-   \r
-del_troll(\r
-   [\r
-      {cookie, Cookie},\r
-      {troll_id, Troll_id}\r
-   ]\r
-) -> \r
-   % controle que l'utilisateur est un admin\r
-   case euphorik_bd:user_by_cookie(Cookie) of\r
-      {ok, User = #user{ek_master = true}} ->\r
-         User_id = User#user.id,\r
-         case euphorik_bd:troll_by_id(Troll_id) of\r
-            {ok, #troll{id_user = User_id}} ->\r
-               euphorik_bd:del_troll(Troll_id),\r
-               json_reponse_ok();\r
-            _ ->\r
-               erreur(210)\r
-         end;\r
-      _ ->\r
-         erreur(220)\r
-   end.\r
-   \r
-   \r
+\r
 unban_ip(\r
    [\r
       {cookie, Cookie},\r
@@ -600,8 +450,8 @@ unban_ip(
       _ ->\r
          erreur(230)\r
    end.\r
-   \r
-   \r
+\r
+\r
 list_banned_ips(\r
    [\r
       {cookie, Cookie}\r
@@ -645,12 +495,12 @@ list_banned_ips(
 % Construit une erreur\r
 erreur(Num, Args) ->\r
    erreur_json(Num, lists:flatten(io_lib:format(euphorik_bd:get_texte(Num), Args))).\r
-   \r
-   \r
+\r
+\r
 erreur(Num) ->\r
    erreur_json(Num, euphorik_bd:get_texte(Num)).\r
-   \r
-   \r
+\r
+\r
 erreur_json(Num, Mess) ->\r
    {\r
       struct, [\r
@@ -659,8 +509,8 @@ erreur_json(Num, Mess) ->
          {error_message, Mess}\r
       ]\r
    }.\r
-   \r
-   \r
+\r
+\r
 % Formatage de minutes.\r
 % par exemple : "1min", "45min", "1h23min", "1jour 2h34min"\r
 format_minutes(Min) ->\r
@@ -674,8 +524,8 @@ format_minutes(Min) ->
       true ->\r
          " " ++ integer_to_list(Minutes) ++ " minute"  ++ if Minutes > 1 -> "s"; true -> "" end\r
    end.\r
-   \r
-   \r
+\r
+\r
 % Formatage d'une heure\r
 % local_time() -> string\r
 format_date(Date) ->\r
@@ -690,7 +540,7 @@ format_date(Date) ->
          Hier ->\r
             "Hier ";\r
          Annee =:= AnneeNow ->\r
-            io_lib:format("~2.10.0B/~2.10.0B ", [Jour, Mois]);         \r
+            io_lib:format("~2.10.0B/~2.10.0B ", [Jour, Mois]);\r
          true ->\r
             io_lib:format("~2.10.0B/~2.10.0B/~B ", [Jour, Mois, Annee])\r
       end ++\r
@@ -700,8 +550,8 @@ format_date(Date) ->
 \r
 json_reponse_ok() ->\r
    {struct, [{reply, "ok"}]}.\r
-   \r
-   \r
+\r
+\r
 json_reponse_login_ok(#user{profile = Profile} = User) ->\r
    {\r
       struct, [\r
@@ -731,7 +581,7 @@ json_reponse_login_ok(#user{profile = Profile} = User) ->
          }}\r
       ]\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
@@ -754,7 +604,7 @@ json_message(Mess, Repond_a, User) ->
       {content, Mess#minichat.contenu},\r
       {root, Mess#minichat.racine_id},\r
       {answer_to, {array, lists:map(\r
-         fun(Id_mess) ->  \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