From bacec85920574375f4b8df20d6a0457e1fffc658 Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Sun, 13 Apr 2008 21:17:14 +0000 Subject: [PATCH] MOD avancement sur les conversations (on s'approche du but..) --- css/1/pageMinichat.css | 39 +++++++-- doc/TODO.txt | 3 + doc/protocole2.txt | 18 ++-- doc/technique.txt | 7 +- js/euphorik.js | 82 +++++++++++++----- js/pageMinichat.js | 134 ++++++++++++++++++++++------- modules/erl/euphorik_bd.erl | 15 +++- modules/erl/euphorik_minichat.erl | 11 ++- modules/erl/euphorik_protocole.erl | 52 +++++++---- modules/erl/euphorik_requests.erl | 2 +- modules/include/euphorik_bd.hrl | 1 + 11 files changed, 272 insertions(+), 92 deletions(-) diff --git a/css/1/pageMinichat.css b/css/1/pageMinichat.css index 182b9b0..2d5761c 100755 --- a/css/1/pageMinichat.css +++ b/css/1/pageMinichat.css @@ -46,18 +46,26 @@ vertical-align: top; } +/* voir pour l'astuce css "float left" des conversations : http://www.quirksmode.org/css/clearing.html */ +#page.minichat #conversations { + overflow: hidden; + width: 100% +} + #page.minichat #conversations .conversation { - border-width: 2px; + border-width: 0px; border-style: solid; - border-color: white + border-color: white; + float: left; + width: 100%; } -#page.minichat #conversations div.message { +#page.minichat #conversations div.message { border-left-width: 5px; border-left-style: solid; border-color: transparent; text-align: left; - padding-right: 8px; + padding-right: 5px; padding-left: 4px; cursor: pointer; } @@ -151,15 +159,32 @@ #page.minichat #conversations .extraire:hover { background-color: #818c27 +} + +#page.minichat #conversations .titre { + padding-right: 8px; + background-color: #4b4215 +} + +#page.minichat #conversations .titre .fermer { + float: right; + padding-right: 5px; + padding-left: 5px; + background-color: #c90000; + cursor: pointer; } - + +#page.minichat #conversations .titre .fermer:hover { + background-color: #c95656 +} + #page.minichat #pages { margin-top: 10px; } #page.minichat #pages span { - padding-right : 5px; - padding-left: 5px; + padding-right : 4px; + padding-left: 4px; color: #7664ff; cursor:pointer; } diff --git a/doc/TODO.txt b/doc/TODO.txt index b0288c7..ee877b0 100755 --- a/doc/TODO.txt +++ b/doc/TODO.txt @@ -103,6 +103,8 @@ * Profiling pour améliorer les performances (client et serveur) * traitementComplet() de euphorik.js est très très lent à executer * Traiter les tags TODO dans le code +* Compatage des js lors de la mise en production (afin d'optimiser la bande passante lors de l'accès au site) +* Elaborer une stratégie de mise à jour de la structure de la BD quand celle ci est modifié (voir euphorik_bd:vers_version()) == Bugs == @@ -118,6 +120,7 @@ [ok] On ne peut pas réponde aux messages du système [ok] Apparement les process liés aux connexions ne sont jamais terminé même quand l'utilisateur coupe la connexion à cause de minichat:attends_nouveau_messages() +[1] Lors de l'extraction d'une conv il arrive que la conv extracté soit bien créée mais vide, le bouton ne ferme pas la conv (très étrange, bug de firefox?) [3] Amélioration des requêtes MNESIA, voir : http://mail.google.com/mail/#label/Erlang+mailing-list/117f688280569a58 [2] Quand on revient en arrière dans firefox le message en rédaction est perdu [2] En changeant de page puis en revenant sur la page principale les smiles ne sont plus highlightés lorsque le curseur les survol diff --git a/doc/protocole2.txt b/doc/protocole2.txt index 704dc6a..93efeb2 100644 --- a/doc/protocole2.txt +++ b/doc/protocole2.txt @@ -17,7 +17,7 @@ Authentification: 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é si le client est à jour. - * Dès qclientu'un nouveau message arrive, le serveurs débloque la connexion est envoie le ou les messages manquants. + * Dès qu'un nouveau message arrive, le serveurs débloque la connexion est envoie le ou les messages manquants. C. Protocole @@ -32,21 +32,24 @@ C.1. Login ---------- c -> s -#1 Paul IJKJDHHSAD9081238 + +ou + + LKJDLAKSJBFLKASN + ou -#2 ( et peuvent être omis) Paul IJKJDHHSAD9081238 s -> c -#3 ( et pas obligatoire) +( et pas obligatoire) enregistre|identifie|erreur LKJDLAKSJBFLKASN @@ -55,10 +58,10 @@ s -> c paul49 paul@pierre.com css/lite.css + 1 - - 4 + 4F 1 @@ -85,8 +88,9 @@ c -> s Paul paul@pierre.com css/dark.css + 1 - 4 + 4F 1 diff --git a/doc/technique.txt b/doc/technique.txt index ea0ef37..02ebfc4 100644 --- a/doc/technique.txt +++ b/doc/technique.txt @@ -24,8 +24,8 @@ Sequences : * Extraction d'une conversation a) Conversation.click - b) Messages.ExtraireConversation(numMess) - c) User.ajouterConversation(numMess) + b) Client.ajouterConversation(idMess) + c) Client.flush(false) // mise à jour du profile de manière synchrone d) Messages.rafraichirMessages(true) * Suppression d'une conversation @@ -40,7 +40,8 @@ m4 -> m2 m5 -> m3 m6 -> m3 m7 - +m8 -> m7 +m9 -> m7 diff --git a/js/euphorik.js b/js/euphorik.js index fafa854..a20ee37 100755 --- a/js/euphorik.js +++ b/js/euphorik.js @@ -72,8 +72,7 @@ function Util() { if(typeof XMLSerializer != "undefined") this.serializer = new XMLSerializer() - - // fermeture des dialogues d + jQuery("#info .fermer").click(function(){ jQuery("#info").slideUp(50) }) @@ -413,6 +412,8 @@ Client.prototype.resetDonneesPersonnelles = function() this.email = "" this.css = jQuery("link#cssPrincipale").attr("href") + this.pagePrincipale = 1 + // les conversations, une conversation est un objet possédant les attributs suivants : // - racine (entier) // - page (entier) @@ -436,11 +437,30 @@ Client.prototype.setCss = function(css) * Ajoute une conversation à la vue de l'utilisateur. * Le profile de l'utilisateur est directement sauvegardé sur le serveur. * @param racines la racine de la conversation + * @return true si la conversation a été créée sinon false (par exemple si la conv existe déjà) */ Client.prototype.ajouterConversation = function(racine) { + // vérification s'il elle n'existe pas déjà + for (var i = 0; i < this.conversations.length; i++) + if (this.conversations[i].racine == racine) + return false + this.conversations.push({racine : racine, page : 1}) - this.flush() + this.flush(false) + return true +} + +Client.prototype.supprimerConversation = function(num) +{ + if (num < 0 || num >= this.conversations.length) return + + // décalage TODO : supprimer le dernier élément + for (var i = num; i < this.conversations.length - 1; i++) + this.conversations[i] = this.conversations[i+1] + this.conversations.pop() + + this.flush(false) } Client.prototype.getXMLlogin = function(login, password) @@ -542,24 +562,23 @@ Client.prototype.getXMLProfile = function() nodeCSS.appendChild(XMLDocument.createTextNode(this.css)) XMLDocument.documentElement.appendChild(nodeCSS) + var nodePagePrincipale = XMLDocument.createElement("pagePrincipale") + nodePagePrincipale.appendChild(XMLDocument.createTextNode(this.pagePrincipale)) + XMLDocument.documentElement.appendChild(nodePagePrincipale) + // mémorise les conversations affichées - if (this.conversations.length > 0) + for (var i = 0; i < this.conversations.length; i++) { - var nodeConversations = XMLDocument.createElement("conversations") - XMLDocument.documentElement.appendChild(nodeConversations) - for (var i = 0; i < this.conversations.length; i++) - { - var nodeConv = XMLDocument.createElement("conversation") - nodeConversations.appendChild(nodeConv) - - var nodeRacine = XMLDocument.createElement("racine") - nodeRacine.appendChild(XMLDocument.createTextNode(this.conversations[i].racine)) - nodeConv.appendChild(nodeRacine) - - var nodePage = XMLDocument.createElement("page") - nodePage.appendChild(XMLDocument.createTextNode(this.conversations[i].page)) - nodeConv.appendChild(nodePage) - } + var nodeConv = XMLDocument.createElement("conversation") + XMLDocument.documentElement.appendChild(nodeConv) + + var nodeRacine = XMLDocument.createElement("racine") + nodeRacine.appendChild(XMLDocument.createTextNode(this.conversations[i].racine)) + nodeConv.appendChild(nodeRacine) + + var nodePage = XMLDocument.createElement("page") + nodePage.appendChild(XMLDocument.createTextNode(this.conversations[i].page)) + nodeConv.appendChild(nodePage) } return XMLDocument @@ -680,6 +699,7 @@ Client.prototype.enregistrement = function(login, password) Client.prototype.connexion = function(action) { + //action.action.dump() thisClient = this jQuery.ajax( { @@ -691,6 +711,7 @@ Client.prototype.connexion = function(action) success: function(data) { + //thisClient.util.serializer.serializeToString(data).dump() thisClient.chargerDonnees(data) } } @@ -707,6 +728,8 @@ Client.prototype.deconnexion = function() Client.prototype.chargerDonnees = function(data) { + var thisClient = this + this.setStatut(jQuery("statut", data.documentElement).text()) if (this.identifie()) @@ -718,26 +741,43 @@ Client.prototype.chargerDonnees = function(data) this.pseudo = jQuery("pseudo", data.documentElement).text() this.email = jQuery("email", data.documentElement).text() this.css = jQuery("css", data.documentElement).text() + + // la page de la conversation principale + var tmp = jQuery("pagePrincipale", data.documentElement) + this.pagePrincipale = tmp.length < 1 ? 1 : tmp.text() + // met à jour la css if (this.css != "") { jQuery("link#cssPrincipale").attr("href", this.css) this.majMenu() } + // les conversations + this.conversations = new Array() + jQuery("conversation", data.documentElement).each( + function(i) + { + thisClient.conversations.push( { racine : jQuery("racine", this).text(), page : jQuery("page", this).text() } ) + } + ) } this.dernierMessageErreur = jQuery("information", data.documentElement).text() } /** * Met à jour les données personne sur serveur. + * @param async de manière asynchrone ? défaut = true */ -Client.prototype.flush = function() +Client.prototype.flush = function(async) { + if (async == undefined) + async = true + thisClient = this //thisClient.util.log(this.util.xmlVersAction(this.getXMLProfile()).action) jQuery.ajax( { - async: true, + async: async, type: "POST", url: "request", dataType: "xml", diff --git a/js/pageMinichat.js b/js/pageMinichat.js index 9d4d329..3278dd7 100755 --- a/js/pageMinichat.js +++ b/js/pageMinichat.js @@ -157,8 +157,9 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message) for (var i = 0; i < repondA.length; i++) { jQuery("#conversation div#" + repondA[i]).addClass("repondu") - for (var m = 0; m < this.messages.messages.length; m++) - this.messages.messages[m].clientARepondu = true + for (var c = 0; c < this.messages.conversations.length; c++) + for (var m = 0; m < this.messages.conversations[c].messages.length; m++) + this.messages.conversations[c].messages[m].clientARepondu = true } } @@ -302,23 +303,28 @@ Message.prototype.getConversation = function(messages) * @param numConv le numéro (appelé id) de la conversation * @param formateur outil permettant la mise en forme du texte des messages */ -function Conversation(numConv, formateur, util) +function Conversation(num, util, formateur, funFermer) { + //alert("ok") var thisConversation = this - this.id = numConv + this.num = num + this.id = Math.random()*100000000000000000 this.messageOver = null // le message sur lequel se trouve le curseur - this.formateur = formateur this.util = util + this.formateur = formateur this.messages = new Array() this.messagesParId = new Object() - - this.idDernierMesssage = null this.page = 1 // par défaut on se trouve sur la première page jQuery("#conversations").append( - "
" + '
\ +
' + + (funFermer == undefined ? '' : '
x
') + + '< 1 >\ +
\ +
' ) // enlève la mise en évidence pour la conversation @@ -330,6 +336,15 @@ function Conversation(numConv, formateur, util) thisConversation.messageOver = null } ) + + // suppression de la conversation + if (funFermer != undefined) + jQuery("#conversations #" + this.getId() + " .titre .fermer").click( + function() + { + funFermer(thisConversation.num) + } + ) } /** @@ -351,7 +366,7 @@ Conversation.prototype.ajouterMessage = function(message) Conversation.prototype.viderMessages = function() { this.messages = new Array() - jQuery("#conversations #" + this.getId()).empty() + jQuery("#conversations #" + this.getId() + " .message").remove() } /** @@ -476,6 +491,14 @@ Conversation.prototype.afficherConversation = function(element) ) } +/** + * Supprime une conversation. + */ +Conversation.prototype.supprimer = function() +{ + jQuery("#conversations #" + this.getId()).remove() +} + /////////////////////////////////////////////////////////////////////////////////////////////////// /** @@ -488,9 +511,9 @@ function Messages(client, formateur, util) this.util = util this.conversations = new Array() // les conversations, la première représente la conversation principale - this.conversations[0] = new Conversation(0, this.formateur, this.util) + this.conversations[0] = new Conversation(0, this.util, this.formateur) - this.idDernierMesssage = null // l'id du dernier message connu + this.idDernierMessage = null // l'id du dernier message connu // l'objet XMLHttpRequest représentant la connexion d'attente this.attenteCourante = null @@ -513,10 +536,10 @@ Messages.prototype.getXMLrafraichirMessages = function() XMLDocument.documentElement.appendChild(nodeCookie) } - if (this.idDernierMesssage != null) + if (this.idDernierMessage != null) { var nodeDernierMessageId = XMLDocument.createElement("dernierMessageId") - nodeDernierMessageId.appendChild(XMLDocument.createTextNode(this.idDernierMesssage)) + nodeDernierMessageId.appendChild(XMLDocument.createTextNode(this.idDernierMessage)) XMLDocument.documentElement.appendChild(nodeDernierMessageId) } @@ -529,6 +552,7 @@ Messages.prototype.getXMLrafraichirMessages = function() XMLDocument.documentElement.appendChild(nodePage) // les conversations + /* Obsolète, le serveur les recupères directement auprès des informations utilisateurs for (var i = 0; i < this.client.conversations.length; i++) { var nodeConversation = XMLDocument.createElement("conversation") @@ -541,7 +565,7 @@ Messages.prototype.getXMLrafraichirMessages = function() var nodePageConv = XMLDocument.createElement("page") nodePageConv.appendChild(XMLDocument.createTextNode(this.client.conversations[i].page)) nodeConversation.appendChild(nodePageConv) - } + }*/ return XMLDocument; } @@ -566,11 +590,17 @@ Messages.prototype.ajouterMessages = function(elements, numConversation) */ Messages.prototype.ajouterMessage = function(element, numConversation) { + var thisMessages = this + // pas d'utilisation de jquery pour des raisons de performance - this.idDernierMesssage = element.getAttribute("id") + var id = element.getAttribute("id") + //alert(parseInt(null, 36) +" " + parseInt(this.idDernierMessage, 36)) + if (this.idDernierMessage == null || parseInt(id, 36) > parseInt(this.idDernierMessage, 36)) + this.idDernierMessage = id + //alert(this.idDernierMessage) var message = new Message( - this.idDernierMesssage, + id, jQuery("date", element).text(), jQuery("pseudo", element).text(), jQuery("contenu", element).text() @@ -583,11 +613,51 @@ Messages.prototype.ajouterMessage = function(element, numConversation) message.setRepondA(jQuery("repondA", element)) if (this.conversations[numConversation] == null) - this.conversations[numConversation] = new Conversation(numConversation, this.formateur) + { + this.conversations[numConversation] = new Conversation(numConversation, this.util, this.formateur, + function(num) // fermeture de la conversation + { + thisMessages.supprimerConversation(num) + } + ) + + this.ajusterLargeurConversations() + } this.conversations[numConversation].ajouterMessage(message) } +/** + * Enlève une conversation. + */ +Messages.prototype.supprimerConversation = function(num) +{ + if (num <= 0 || num >= this.conversations.length) return // la numéro 0 ne peut être supprimé + this.conversations[num].supprimer() + + // décalage TODO : supprimer le dernier élément + for (var i = num; i < this.conversations.length - 1; i++) + { + this.conversations[i] = this.conversations[i+1] + this.conversations[i].num -= 1 + } + this.conversations.pop() + this.ajusterLargeurConversations() + + this.client.supprimerConversation(num-1) + + this.rafraichirMessages(true) +} + + +/** + * Ajuste la largeur des conversations en fonction de leur nombre. modifie l'attribut CSS 'width'. + */ +Messages.prototype.ajusterLargeurConversations = function() +{ + jQuery("#conversations .conversation").css("width", 100 / this.conversations.length + "%") +} + /** * Demande à toutes les conversations de se flusher (afficher les messages non-affichés). */ @@ -606,18 +676,18 @@ Messages.prototype.flush = function(numConv) this.conversations[numConv].flush ( - // fonction appellée lors de la demande d'extraction d'une conversation + // fonction appelée lors de la demande d'extraction d'une conversation function(idMess) { - thisMessages.client.ajouterConversation(idMess) - thisMessages.rafraichirMessages(true) + if (thisMessages.client.ajouterConversation(idMess)) + thisMessages.rafraichirMessages(true) } ) } Messages.prototype.viderMessages = function() { - this.idDernierMesssage = null + this.idDernierMessage = null for (var i = 0; i < this.conversations.length; i++) this.conversations[i].viderMessages() @@ -636,15 +706,14 @@ Messages.prototype.rafraichirMessages = function(vider) if (vider == undefined) vider = false + var thisMessages = this // caisupair javacrypte + if (vider) - { - this.idDernierMesssage = null - this.messages = new Array() - } - - var thisMessages = this // caisupair javacrypte + { + this.idDernierMessage = null + } - //this.util.log(this.util.serializer.serializeToString(this.getXMLrafraichirMessages())) + this.util.xmlVersAction(this.getXMLrafraichirMessages()).action.dump() //alert(this.util.xmlVersAction(this.getXMLrafraichirMessages()).action) this.attenteCourante = jQuery.ajax({ type: "POST", @@ -654,10 +723,16 @@ Messages.prototype.rafraichirMessages = function(vider) success: function(data) { - //thisMessages.util.log(thisMessages.util.serializer.serializeToString(data)) + thisMessages.util.serializer.serializeToString(data).dump() if (vider) + { thisMessages.viderMessages() + /* Obsolète : pas besoin de supprimer les conversations + for (var i = 1; i < this.conversations.length; i++) + this.supprimerConversation(1) + */ + } //thisMessages.MAJPages(parseInt(jQuery("nbPage", data.documentElement).text())) @@ -674,6 +749,7 @@ Messages.prototype.rafraichirMessages = function(vider) messages.push(this) } ) + //alert("ajoutMess : " + messages.length + " " + numConv) thisMessages.ajouterMessages(messages, numConv) numConv += 1 } diff --git a/modules/erl/euphorik_bd.erl b/modules/erl/euphorik_bd.erl index 8eb90df..c27a694 100755 --- a/modules/erl/euphorik_bd.erl +++ b/modules/erl/euphorik_bd.erl @@ -21,8 +21,8 @@ create() -> mnesia:delete_schema([node()]), mnesia:create_schema([node()]), % nécessaire pour les tables sur disc mnesia:start(), - create_tables(). - + create_tables(). + create_tables() -> mnesia:create_table(counter, [ @@ -73,8 +73,19 @@ vers_version(4) -> end, record_info(fields, user), user + ); +% Ajout du numéro de page de la conv principale +vers_version(5) -> + mnesia:transform_table( + user, + fun({user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, Indice_flood, Conversations}) -> + {user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, Indice_flood, 1, Conversations} + end, + record_info(fields, user), + user ). + % exemple de peuplage de la BD, utilisé pour les tests peupler() -> mnesia:transaction( diff --git a/modules/erl/euphorik_minichat.erl b/modules/erl/euphorik_minichat.erl index 0ef8ef5..53fe1e3 100755 --- a/modules/erl/euphorik_minichat.erl +++ b/modules/erl/euphorik_minichat.erl @@ -27,7 +27,7 @@ est_une_reponse_a_user/2, % set : update_pseudo_user/2, - set_profile/6, + set_profile/8, update_date_derniere_connexion/1, nouveau_user/2, nouveau_user/3, @@ -195,7 +195,7 @@ update_pseudo_user(UserId, Pseudo) -> % Mise à par Cookie les autres peuvent être undefined ce qui veut dire qu'ils ne seront pas modifié. -set_profile(Cookie, Login, Password, Pseudo, Email, Css) -> +set_profile(Cookie, Login, Password, Pseudo, Email, Css, Page_principale, Conversations) -> resultat_transaction(mnesia:transaction( fun() -> case user_by_cookie(Cookie) of @@ -204,12 +204,15 @@ set_profile(Cookie, Login, Password, Pseudo, Email, Css) -> {ok, U} when U#user.id =/= User#user.id -> login_deja_pris; _ -> - User_modifie = User#user{ + User_modifie = User#user{ + % TODO : pourquoi ne pas tester avec la valeur "undefined" plutôt qu'avec "is_list" ? login = if is_list(Login) -> Login; true -> User#user.login end, password = if is_list(Password) -> Password; true -> User#user.password end, pseudo = if is_list(Pseudo) -> Pseudo; true -> User#user.pseudo end, email = if is_list(Email) -> Email; true -> User#user.email end, - css = if is_list(Css) -> Css; true -> User#user.css end + css = if is_list(Css) -> Css; true -> User#user.css end, + page_principale = if is_list(Page_principale) -> Page_principale; true -> User#user.page_principale end, + conversations = if is_list(Conversations) -> Conversations; true -> User#user.conversations end }, mnesia:write(User_modifie), ok diff --git a/modules/erl/euphorik_protocole.erl b/modules/erl/euphorik_protocole.erl index 35bf993..8fad0e9 100755 --- a/modules/erl/euphorik_protocole.erl +++ b/modules/erl/euphorik_protocole.erl @@ -112,13 +112,16 @@ profile(Action) -> Pseudo = case xmerl_xpath:string("pseudo", Action) of [#xmlElement{content = [#xmlText{value = P2}]}] -> P2; _ -> Login end, Email = case xmerl_xpath:string("email", Action) of [#xmlElement{content = [#xmlText{value = E}]}] -> E; _ -> undefined end, Css = case xmerl_xpath:string("css", Action) of [#xmlElement{content = [#xmlText{value = C}]}] -> C; _ -> undefined end, - Conversations = case xmerl_xpath:string("conversations", Action) of - Conversations -> - % extraction de chaque conversation - - _ -> [] - end, - case euphorik_minichat:set_profile(Cookie, Login, Password, Pseudo, Email, Css) of + Page_principale = case xmerl_xpath:string("pagePrincipale", Action) of [#xmlElement{content = [#xmlText{value = P3}]}] -> list_to_integer(P3); _ -> undefined end, + Conversations = lists:map( + fun(Conv) -> + [#xmlElement{content = [#xmlText{value = Id_racine_str}]}] = xmerl_xpath:string("racine", Conv), + [#xmlElement{content = [#xmlText{value = Page_conv_str}]}] = xmerl_xpath:string("page", Conv), + {erlang:list_to_integer(Id_racine_str, 36), list_to_integer(Page_conv_str)} + end, + xmerl_xpath:string("conversation", Action) + ), + case euphorik_minichat:set_profile(Cookie, Login, Password, Pseudo, Email, Css, Page_principale, Conversations) of ok -> xml_reponse_profile_ok(); login_deja_pris -> @@ -158,14 +161,15 @@ refreshMessage(Action) -> _ -> inconnu end, % extraction des conversations en [{id, page}, ..] - Conversations = lists:map( - fun(Conv) -> - [#xmlElement{content = [#xmlText{value = Id_racine_str}]}] = xmerl_xpath:string("racine", Conv), - [#xmlElement{content = [#xmlText{value = Page_conv_str}]}] = xmerl_xpath:string("page", Conv), - {erlang:list_to_integer(Id_racine_str, 36), erlang:list_to_integer(Page_conv_str)} - end, - xmerl_xpath:string("conversation", Action) - ), + % Obsolète : obtenu depuis la table 'user' + %~ Conversations = lists:map( + %~ fun(Conv) -> + %~ [#xmlElement{content = [#xmlText{value = Id_racine_str}]}] = xmerl_xpath:string("racine", Conv), + %~ [#xmlElement{content = [#xmlText{value = Page_conv_str}]}] = xmerl_xpath:string("page", Conv), + %~ {erlang:list_to_integer(Id_racine_str, 36), erlang:list_to_integer(Page_conv_str)} + %~ end, + %~ xmerl_xpath:string("conversation", Action) + %~ ), % accrochez-vous ca va siouxer ;) [{reponse, [{name, "refreshMessages"}], lists:map( @@ -203,7 +207,7 @@ refreshMessage(Action) -> ] } end, - euphorik_minichat_conversation:conversations(Conversations, Nb_message, Dernier_id, Page) + euphorik_minichat_conversation:conversations(User#user.conversations, Nb_message, Dernier_id, Page) ) }]; _ -> @@ -299,8 +303,20 @@ xml_reponse_login_ok(User) -> {pseudo, [User#user.pseudo]}, {login, [User#user.login]}, {email, [User#user.email]}, - {css, [User#user.css]} - ] + {css, [User#user.css]}, + {pagePrincipale, [integer_to_list(User#user.page_principale)]} + ] ++ + lists:map( + fun(C) -> + {conversation, + [ + {racine, [erlang:integer_to_list(element(1, C), 36)]}, + {page, [integer_to_list(element(2, C))]} + ] + } + end, + User#user.conversations + ) }]. diff --git a/modules/erl/euphorik_requests.erl b/modules/erl/euphorik_requests.erl index 9cec43b..abfdd93 100755 --- a/modules/erl/euphorik_requests.erl +++ b/modules/erl/euphorik_requests.erl @@ -66,7 +66,7 @@ traiter_xml(Contenu) -> %~ traiter_action([#xmlAttribute{value="loginCaptcha"}], XML) -> %~ euphorik_protocole:nouveau_user_captcha(XML); - + % un client s'enregistre (pseudo + password) traiter_action([#xmlAttribute{value="register"}], XML) -> euphorik_protocole:nouveau_user_login(XML); diff --git a/modules/include/euphorik_bd.hrl b/modules/include/euphorik_bd.hrl index 45be716..a3a7f20 100755 --- a/modules/include/euphorik_bd.hrl +++ b/modules/include/euphorik_bd.hrl @@ -40,6 +40,7 @@ date_derniere_connexion, % erlang:now(), est mis à jour lors de n'importe quelle activitée (envoie de message par exemple) css = [], % string() indice_flood = 0, % integer() est incrémenté lorsque l'utilisateur envoie trop rapidement des messages. + page_principale = 1, % la page de la conversation principale conversations = [] % [{integer(), integer()}], la liste des messages correspondant au conversation ainsi que la page affichée }). -- 2.45.2