-Euphorik - Protocole v3
+Euphorik - Protocole v3
-----------------------
== Introduction ==
-Ce document a pour but de décrire la communication client-serveur du site euphorik.\r
-Les messages échangés sont basés sur le format JSON.
+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'.
-\r
+
== Principes ==
-Enregistrement:\r
- * 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.
+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:\r
- * L'authentification (login) se fait soit par un couple <login, mot de passe> soit à l'aide d'un cookie.\r
- * Permet de récupérer les données d'un profile
+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.
+ * 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.
+Les messages client vers serveur sont envoyés par HTTP-POST.
-A toutes les requêtes le serveur peut répondre une erreur :
+A toutes les requêtes le serveur peut répondre une erreur :
<error>
{
"reply" : "error",
"error_message" : "blabla"
}
-Message ok générique :
+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.
+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
{
- "action" : "authentification",
+ "header" : {action : "authentification", version : 3},
"login" : "paul",
"password" : "IJKJDHHSAD9081238"
}
ou
{
- "action" : "authentification",
+ "header" : {action : "authentification", version : 3}
"cookie" : "LKJDLAKSJBFLKASN"
}
ou
{
- "action" : "register",
+ "header" : {action : "authentification", version : 3},
"login" : "paul",
"password" : "IJKJDHHSAD9081238"
}
"css" : "css/1/euphorik.css",
"main_page" : 1
}
-ou\r
+ou
{
- "reply" : "register" | "authentification",\r
- "status" : "auth_registered",\r
- "cookie" : "LKJDLAKSJBFLKASN",\r
- "id" : 193,\r
- "nick" : "Paul",\r
- "login" : "paul49",\r
- "email" : "paul@pierre.com",\r
+ "reply" : "register" | "authentification",
+ "status" : "auth_registered",
+ "cookie" : "LKJDLAKSJBFLKASN",
+ "id" : 193,
+ "nick" : "Paul",
+ "login" : "paul49",
+ "email" : "paul@pierre.com",
"css" : "css/3/euphorik.css",
- "nick_format" : "nick" | "login" | "nick_login",\r
- "main_page" : 1,
- "conversations" : [
- {
- "racine" : 123,
- "page" : 1
- }
- ],
- "ek_master" : true | false\r
+ "chat_order" : "chrono" | "reverse",
+ "nick_format" : "nick" | "login" | "nick_login",
+ "view_times" : true | false,
+ "view_tooltips" : true | false,
+ "conversations" : [{"root" : 3, "minimized" : true},
+ "ek_master" : true | false,
+ "ostentatious_master" : "invisible" | "light" | "heavy"
}
- \r
+
=== Logout ===
-c -> s\r
- {\r
- "action" : "logout",\r
- "cookie" : "LKJDLAKSJBFLKASN"\r
+c -> s
+ {
+ "header" : {action : "logout", version : 3},
+ "cookie" : "LKJDLAKSJBFLKASN"
}
- \r
+
=== Profile ===
-c -> s\r
- {\r
- "action" : "set_profile",\r
- "cookie" : "LKJDLAKSJBFLKASN",\r
- "login" : "paul49",\r
- "password" : "IJKJDHHSAD9081238",\r
- "nick" : "Paul",\r
- "email" : "paul@pierre.com",\r
+c -> s
+ {
+ "header" : {action : "set_profile", version : 3},
+ "cookie" : "LKJDLAKSJBFLKASN",
+ "login" : "paul49",
+ "password" : "IJKJDHHSAD9081238",
+ "nick" : "Paul",
+ "email" : "paul@pierre.com",
"css" : "css/3/euphorik.css",
- "nick_format" : "nick" | "login" | "nick_login",\r
- "main_page" : 1,
- "conversations" : [
- {
- "root" : 123,
- "page" : 1
- }
- ]\r
- }\r
+ "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"
+ }
s -> c
<ok>
<error>
-=== Wait event ===
-Si "last_message_id" est absent alors le client ne possède pas de message.
+=== 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.
-c -> s\r
- {\r
- "action" : "wait_event",
- "page" : "chat"\r
- "cookie" : "LKJDLAKSJBFLKASN",\r
+<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",\r
+ "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
+ "main_page" : 1,
+ "troll_id" : 45,
"conversations" : [
{
- "racine" : 123,
+ "root" : 123,
"page" : 1,
"last_message_id" : 4 (pas obligatoire)
}
- ]\r
+ ]
}
-s -> c\r
-La première conversation est la principale (main).\r
-L'ordre des conversation est le même que celui des données de l'utilisateur.\r
-Le format de la date n'est pas formel.\r
- {\r
- "reply" : "new_messages",\r
- "conversations" : [\r
- {\r
- "last_page" : true | false,\r
- "messages" : [
- {\r
- "id" : 54,
- "user_id" : 344,\r
- "date" : "Hier 17:26:54",\r
- "system" : true | false,\r
- "owner" : true | false,\r
- "answered" : true | false,\r
- "is_a_reply" : true | false,\r
- "nick" : "Paul",\r
- "login" : "paul_22",\r
- "content" : "Salut",\r
- "answer_to" : [\r
- { "id" : 123, "nick" : "Pierre", "login" : "pierre_45" }\r
- ]
- "ek_master" : true | false
- }\r
- ]\r
+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>, .. ]
}
- ...\r
- ]\r
+ ]
}
-ou\r
- {\r
- "reply" : "message_updated",\r
- "message_id" : 123,\r
- "contenu" : "Salut +++ poulpe"\r
+ou
+ {
+ "reply" : "message_updated",
+ "message_id" : 123,
+ "content" : "Salut poulpe",\r
+ "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>
-\r
-\r
+
+
+=== 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 ===
-TODO\r
-c -> s\r
- {\r
- "action" : "put_troll",\r
- "cookie" : "LKJDLAKSJBFLKASN",\r
- "content" : "Un bon troll velu !"\r
- }\r
-=== Modification d'un troll ===\r
-TODO\r
-=== Suppression d'un troll ===\r
-TODO\r
-=== Noter un troll ===\r
-TODO
+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.\r
+Le client envoie un message, le message peut répondre à un certain nombre d'autres messages.
+"answer_to" n'est pas obligatoire.
-c -> s\r
- {\r
- "action" : "put_message",\r
- "cookie" : "LKJDLAKSJBFLKASN",\r
- "nick" : "Paul",\r
- "content" : "Bonjour",\r
- "answer_to" : [ 345, 532, ... ]\r
+c -> s
+ {
+ "header" : {action : "put_message", version : 3},
+ "cookie" : "LKJDLAKSJBFLKASN",
+ "nick" : "Paul",
+ "content" : "Bonjour",
+ "answer_to" : [ 345, 532, ... ]
}
s -> c
<error>
-=== Bannissement ===
+=== Slapage ===
+c -> s
+ {
+ "header" : {action : "slap", version : 3},
+ "cookie" : "LKJDLAKSJBFLKASN",
+ "user_id" : 67,
+ "reason" : "blablabla"
+ }
+
+s -> c
+ <ok>
+ou
+ <error>
+
+=== Bannissement ===
c -> s
{
- "action" : "ban",
+ "header" : {action : "ban", version : 3},
"cookie" : "LKJDLAKSJBFLKASN",
"duration" : 15, // en minute
- "user_id" : 67
+ "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>\r
- \r
-=== Ajout d'une correction d'un messages ===\r
-Le client envoie un correctif sous la forme de texte supplémentaire à appondre au dernier messages.\r
-Le message est appondu avec un " +++ " devant, par exemple :\r
-> Gnome c'est mieux que KDE +++ Euh non ok, c'est faux\r
-\r
-c -> s\r
- {\r
- "action" : "correction",\r
- "cookie" : "LKJDLAKSJBFLKASN",\r
- "content" : "Euh non ok, c'est faux"\r
- }\r
- \r
-s -> c\r
- {\r
- "reply" : "correction",\r
- "status" : "ok" | "error",\r
- "message_error" : "blabla"\r
+ <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"
}