DEL suppression de la decription du protocole (passé dans le wiki)
authorGreg Burri <greg.burri@gmail.com>
Mon, 28 Jul 2008 08:41:03 +0000 (08:41 +0000)
committerGreg Burri <greg.burri@gmail.com>
Mon, 28 Jul 2008 08:41:03 +0000 (08:41 +0000)
doc/protocole3.txt [deleted file]
modules/erl/euphorik_requests.erl
tools/tools.rb

diff --git a/doc/protocole3.txt b/doc/protocole3.txt
deleted file mode 100644 (file)
index 2eb81a6..0000000
+++ /dev/null
@@ -1,392 +0,0 @@
-Euphorik - Protocole v3
------------------------
-
-== Introduction ==
-Ce document a pour but de décrire la communication client-serveur du site euphorik.
-Les messages échangés sont basés sur le format JSON.
-Ce document remplace 'protocole2.txt'.
-
-
-== Principes ==
-Enregistrement:
- * Permet de créer un compte, un cookie est donné en retour. Ce cookie doit être stocké par le client pour pouvoir s'authentifier par la suite.
-
-Authentification:
- * L'authentification (login) se fait soit par un couple <login, mot de passe> soit à l'aide d'un cookie.
- * Permet de récupérer les données d'un profile
-
-Rafraichissement:
- * Le client envoie une demande au serveur avec l'id du dernier message (via XMLHttpRequest ou un function de JQuery)
- * Le serveur maintient la connexion bloquée si le client est à jour.
- * Dès qu'un nouveau message arrive, le serveur débloque la connexion et envoie le ou les messages manquants.
-
-== Protocole ==
-c : client
-s : server
-Les messages client vers serveur sont envoyés par HTTP-POST.
-
-A toutes les requêtes le serveur peut répondre une erreur :
-<error>
-   {
-      "reply" : "error",
-      "error_message" : "blabla"
-   }
-   
-Message ok générique :
-<ok>
-   {
-      "reply" : "ok"
-   }
-
-Entete des messages clients :
-Si la version du protocole n'est pas similaire du coté serveur la requête est refusée
-<client_header>
-   {
-      "action" : <action>,
-      "version" : 3
-   }
-
-
-=== Enregistrement et authentification ===
-Permet de créer un nouvel utilisateur.
-"login" et "password" peuvent ne pas être fournis avec un message de type "register", dans ce cas l'utilisateur ne pourra s'authentifier qu'a l'aide de son cookie.
-Le mot de passe est hashé en md5.
-
-c -> s
-   { 
-      "header" : {action : "register", version : 3},
-      "login" : "paul",
-      "password" : "IJKJDHHSAD9081238",
-      "profile" : { .. } // voir <profile>
-   }
-ou
-   {
-      "header" : {action : "authentification", version : 3}
-      "cookie" : "LKJDLAKSJBFLKASN"
-   }
-ou
-   {
-      "header" : {action : "authentification", version : 3},
-      "login" : "paul",
-      "password" : "IJKJDHHSAD9081238"
-   }
-   
-s -> c
-   {
-      "reply" : "register" | "authentification",
-      "status" : "auth_registered" | "auth_not_registered",
-      "cookie" : "LKJDLAKSJBFLKASN",
-      "id" : 193,
-      "login" : "paul49",
-      "ek_master" : true | false,
-      "profile" : <profile>
-   }
-=== Logout ===
-c -> s
-   {
-      "header" : {action : "logout", version : 3},
-      "cookie" : "LKJDLAKSJBFLKASN"
-   }
-=== Profile ===
-<profile>
-   {
-      "nick" : "Paul",
-      "email" : "paul@pierre.com",
-      "css" : "css/3/euphorik.css",
-      "chat_order" : "chrono" | "reverse",
-      "nick_format" : "nick" | "login" | "nick_login",
-      "view_times" : true | false,
-      "view_tooltips" : true | false,
-      "conversations" : [{"root" : 3, "minimized" : true},
-      "ostentatious_master" : "invisible" | "light" | "heavy"
-   }
-
-c -> s
-   {
-      "header" : {action : "set_profile", version : 3},
-      "cookie" : "LKJDLAKSJBFLKASN",
-      "login" : "paul49",
-      "password" : "IJKJDHHSAD9081238",
-      "profile" : <profile>
-   }
-      
-s -> c
-   <ok>
-ou
-   <error>
-
-
-=== Wait event (page = chat) ===
-Si "last_message_id" est absent alors le client ne possède pas de message.
-Si "main_page" est absent alors est vaut 1.
-"cookie" n'est pas obligatoire.
-
-<message>
-   {
-      "id" : 54,
-      "user_id" : 344,
-      "date" : "Hier 17:26:54",
-      "system" : true | false,
-      "owner" : true | false,
-      "answered" : true | false,
-      "is_a_reply" : true | false,
-      "nick" : "Paul",
-      "login" : "paul_22",
-      "content" : "Salut",
-      "root" : 453,
-      "answer_to" : [
-         { "id" : 123, "nick" : "Pierre", "login" : "pierre_45" }
-      ],
-      "ek_master" : true | false,
-      "ostentatious_master" : "invisible" | "light" | "heavy",
-      "last_modification" : "Hier 17:26:54"
-   }
-
-c -> s
-   {
-      "header" : {action : "wait_event", version : 3},
-      "page" : "chat"
-      "cookie" : "LKJDLAKSJBFLKASN",
-      "message_count" : 10,
-      "last_message_id" : 163,
-      "main_page" : 1,
-      "troll_id" : 45,
-      "conversations" : [
-         {
-            "root" : 123,
-            "page" : 1,
-            "last_message_id" : 4 (pas obligatoire)
-         }
-      ]
-   }
-s -> c
-La première conversation est la principale (main).
-L'ordre des conversation est le même que celui des données de l'utilisateur.
-Le format de la date n'est pas formel.
-first correpond au premier message de la conversation, vaut 'null' pour la conversation principale ainsi que pour les conversations vides.
-   {
-      "reply" : "new_message",
-      "conversations" : [
-         {
-            "last_page" : true | false,
-            "first" : <message> | null,
-            "messages" : [ <message>, .. ]
-         }
-      ]
-   }
-ou
-   {
-      "reply" : "message_updated",
-      "message_id" : 123,
-      "content" : "Salut poulpe",
-      "last_modification" : "Hier 17:26:54"
-   }
-ou
-   {
-      "reply" : "new_troll",
-      "troll_id" : 123,
-      "message_id" : 12,
-      "content" : "Linux sera desktop ready en 2008 ?"
-   }
-ou
-   <error>
-
-
-=== Wait event (page = admin) ===
-c -> s
-   {
-      "header" : {action : "wait_event", version : 3},
-      "page" : "admin",
-      "last_troll" : 5
-   }
-   
-s -> c
-   {
-      "reply" : "troll_modified",
-      "troll_id" : 3,
-      "content" : "plop"
-   }
-ou
-s -> c
-   {
-      "reply" : "troll_added",
-      "trolls" :
-         [
-            {
-               "troll_id" : 5,
-               "content" : "plop",
-               "author" : "<Pseudo>"
-               "author_id" : 2
-            }
-         ]
-   }
-ou
-s -> c
-   {
-      "reply" : "troll_deleted",
-      "troll_id" : 2
-   }
-ou
-indique de mettre à jour la liste d'ips
-s -> c
-   {
-      "reply" : "banned_ips_refresh"
-   }
-
-
-=== Envoie d'un troll ===
-c -> s
-   {
-      "header" : {action : "put_troll", version : 3},
-      "cookie" : "LKJDLAKSJBFLKASN",
-      "content" : "Un bon troll velu !"
-   }
-s -> c
-   <ok>
-ou
-   <error>
-   
-   
-=== Modification d'un troll ===
-c -> s
-   {
-      "header" : {action : "mod_troll", version : 3},
-      "cookie" : "LKJDLAKSJBFLKASN",
-      "troll_id" : 3,
-      "content" : "Un bon troll velu 2 !"
-   }
-s -> c
-   <ok>
-ou
-   <error>
-   
-   
-=== Suppression d'un troll ===
-c -> s
-   {
-      "header" : {action : "del_troll", version : 3},
-      "cookie" : "LKJDLAKSJBFLKASN",
-      "troll_id" : 3
-   }
-s -> c
-   <ok>
-ou
-   <error>
-   
-
-=== Envoie message ===
-Le client envoie un message, le message peut répondre à un certain nombre d'autres messages.
-"answer_to" n'est pas obligatoire.
-
-c -> s
-   {
-      "header" : {action : "put_message", version : 3},
-      "cookie" : "LKJDLAKSJBFLKASN",
-      "nick" : "Paul",
-      "content" : "Bonjour",
-      "answer_to" : [ 345, 532, ... ]
-   }
-s -> c
-   <ok>
-ou
-   <error>
-
-
-=== Slapage ===
-c -> s
-   {
-      "header" : {action : "slap", version : 3},
-      "cookie" :  "LKJDLAKSJBFLKASN",
-      "user_id" : 67,
-      "reason" : "blablabla"
-   }
-   
-s -> c
-   <ok>
-ou
-   <error>
-   
-
-=== Bannissement ===
-c -> s
-   {
-      "header" : {action : "ban", version : 3},
-      "cookie" : "LKJDLAKSJBFLKASN",
-      "duration" : 15, // en minute
-      "user_id" : 67,
-      "reason" : "blablabla"
-   }
-   
-s -> c
-   <ok>
-ou
-   <error>
-   
-   
-=== Liste des ip bannis ===
-c -> s
-   {
-      "header" : {action : "list_banned_ips", version : 3},
-      "cookie" : "LKJDLAKSJBFLKASN"
-   }
-
-s -> c 
-   {
-      "reply" : "list_banned_ips",
-      "list" : [
-         {
-            ip : "192.168.1.2", 
-            remaining_time : "1h23"
-            users : [
-               {
-                  nick : "Pierre" , 
-                  login : "pierre" 
-               }
-            ]
-         }
-      ]
-   }
-   
-
-=== Débannissement ===
-c -> s
-   {
-      "header" : {action : "unban", version : 3},
-      "cookie" : "LKJDLAKSJBFLKASN"
-      "ip" : "192.168.1.2"
-   }
-   
-s -> c
-   <ok>
-ou
-   <error>
-
-=== Ajout d'une correction d'un messages ===
-Le client envoie un correctif sous la forme de texte supplémentaire à appondre au dernier messages.
-Le message est appondu avec un " +++ " devant, par exemple :
-> Gnome c'est mieux que KDE +++ Euh non ok, c'est faux
-
-c -> s
-   {
-      "header" : {action : "correction", version : 3},
-      "cookie" : "LKJDLAKSJBFLKASN",
-      "content" : "Euh non ok, c'est faux"
-   }
-   
-s -> c
-   {
-      "reply" : "correction",
-      "status" : "ok" | "error",
-      "message_error" : "blabla"
-   } 
index f497382..8c46b7b 100755 (executable)
 % \r
 % Ce module est fait pour répondre à des requêtes 'AJAX'.\r
 % Il est définit comme 'appmods' pour l'url "request" dans yaws.\r
-% Par exemple http://www.euphorik.ch/request abouti sur la fonction out() de ce module.\r
+% Par exemple http://www.euphorik.ch/request abouti sur la fonction out/1 de ce module.\r
 % @author G.Burri\r
 \r
 \r
 -module(euphorik_requests).\r
 -export([out/1, traiter_donnees/2]).\r
--include_lib("xmerl/include/xmerl.hrl").\r
 -include_lib("yaws/include/yaws_api.hrl").\r
 -include("../include/euphorik_defines.hrl").\r
 \r
 \r
+% Point d'entrée pour les requêtes AJAX sur http://www.euphorik.ch/request.\r
 out(A) ->\r
-   %io:format("~p~n", [A]), % utilisé parfois pendant le debug\r
    IP = case inet:peername(A#arg.clisock) of\r
       {ok, {Adresse, _Port}} -> Adresse;\r
       _ -> inconnue\r
@@ -40,7 +39,6 @@ out(A) ->
    inet:setopts(A#arg.clisock, [{active, true}, {keepalive, true}]),\r
    {value, {_, Contenu}} = lists:keysearch("action", 1, yaws_api:parse_post(A)),\r
    Ret = traiter_donnees(Contenu, IP),\r
-   %io:format("~p~n", [Ret]),\r
    {content, "application/json", Ret}.\r
 \r
 \r
@@ -61,7 +59,7 @@ traiter_donnees(Contenu, IP) ->
 % authentification d'un client\r
 traiter_action("authentification", JSON, IP) ->\r
    euphorik_protocole:login(JSON, IP);\r
-% un client s'enregistre (pseudo + password)\r
+% un client s'enregistre : (pseudo + password) ou de manière anonyme\r
 traiter_action("register", JSON, IP) ->\r
    euphorik_protocole:register(JSON, IP);\r
 % modification du profile\r
@@ -73,18 +71,25 @@ traiter_action("wait_event", JSON, _) ->
 % un utilisateur envoie un message\r
 traiter_action("put_message", JSON, _) ->\r
    euphorik_protocole:put_message(JSON);\r
+% un ekMaster bannie un utilisateur (ip)\r
 traiter_action("ban", JSON, _) ->\r
    euphorik_protocole:ban(JSON);\r
+% un ekMaster slap un utilisateur\r
 traiter_action("slap", JSON, _) ->\r
    euphorik_protocole:slap(JSON);\r
+% un ekMaster envoie un nouveau troll\r
 traiter_action("put_troll", JSON, _) ->\r
    euphorik_protocole:put_troll(JSON);\r
+% un ekMaster modifie un troll\r
 traiter_action("mod_troll", JSON, _) ->\r
    euphorik_protocole:mod_troll(JSON);\r
+% un ekMaster supprime un troll\r
 traiter_action("del_troll", JSON, _) ->\r
    euphorik_protocole:del_troll(JSON);\r
+% un ekMaster demande la liste des ips bannies\r
 traiter_action("list_banned_ips", JSON, _) ->\r
    euphorik_protocole:list_banned_ips(JSON);\r
+% un ekMaster débannie une ip\r
 traiter_action("unban", JSON, _) ->\r
    euphorik_protocole:unban_ip(JSON).\r
  
\ No newline at end of file
index 644c825..75d3602 100644 (file)
@@ -19,20 +19,16 @@ along with Euphorik.  If not, see <http://www.gnu.org/licenses/>.
 =end
 \r
 #TODO :\r
-# - mettre à jour les numéros de versions en appelant le script "cope_num_version.rb"\r
-# - création de unit tests (voir eunit) et validation avant la mise en prod
-
-# Utilisation :
-#  tools.rb <commande> <args>
-# commandes :
-#  \r
+# - mettre à jour les numéros de versions (créer une classe)\r
+# - création de unit tests (voir eunit) et validation avant la mise en prod\r
+# - faire une classe qui vérifie tous les js avec jslint\r
 \r
 class MiseEnProd\r
    @@rep_remote = '/var/www/euphorik'\r
    @@host = 'euphorik.ch'\r
    @@opt_rsync = ''\r
    \r
-   def initialize  \r
+   def initialize      \r
    end  \r
 \r
    def creer_remote_rep(rep)      \r
@@ -60,19 +56,12 @@ class MiseEnProd
    end\r
    \r
    # css, images, html, etc..\r
-   def copier_partie_statique      
-      copier_fichier_html("index.yaws")
-      
-      ####print `rsync #{$opt_rsync} index.yaws #{$host}:#{$rep_remote}`\r
-      #print `rsync #{$opt_rsync} favicon.ico #{$host}:#{$rep_remote}`\r
-      #print `rsync #{$opt_rsync} -r css #{$host}:#{$rep_remote}`\r
-      #print `rsync #{$opt_rsync} -r pages #{$host}:#{$rep_remote}`\r
-      #print `rsync #{$opt_rsync} -r --exclude 'autres' img #{$host}:#{$rep_remote}`      \r
-   end
-   
-   # Copie un fichier html, enlève les balises qui ont comme attribut : prod="delete"
-   def copier_fichier_htm(fichier)
-      
+   def copier_partie_statique      \r
+      print `rsync #{$opt_rsync} index.yaws #{$host}:#{$rep_remote}`\r
+      print `rsync #{$opt_rsync} favicon.ico #{$host}:#{$rep_remote}`\r
+      print `rsync #{$opt_rsync} -r css #{$host}:#{$rep_remote}`\r
+      print `rsync #{$opt_rsync} -r pages #{$host}:#{$rep_remote}`\r
+      print `rsync #{$opt_rsync} -r --exclude 'autres' img #{$host}:#{$rep_remote}`      \r
    end\r
    \r
    # contrôle des fichiers js à l'aide de jslint\r