MOD séparation logique du profile des utilisateurs dans la BD
authorGreg Burri <greg.burri@gmail.com>
Sat, 26 Jul 2008 19:59:28 +0000 (19:59 +0000)
committerGreg Burri <greg.burri@gmail.com>
Sat, 26 Jul 2008 19:59:28 +0000 (19:59 +0000)
doc/protocole3.txt
js/client.js
modules/erl/euphorik_bd.erl
modules/erl/euphorik_bd_admin.erl
modules/erl/euphorik_protocole.erl
modules/include/euphorik_bd.hrl

index c8642ab..2eb81a6 100644 (file)
@@ -58,7 +58,7 @@ c -> s
       "header" : {action : "register", version : 3},
       "login" : "paul",
       "password" : "IJKJDHHSAD9081238",
-      "profile_infos" : { .. } // voir <profile_infos>
+      "profile" : { .. } // voir <profile>
    }
 ou
    {
@@ -78,17 +78,9 @@ s -> c
       "status" : "auth_registered" | "auth_not_registered",
       "cookie" : "LKJDLAKSJBFLKASN",
       "id" : 193,
-      "nick" : "Paul",
       "login" : "paul49",
-      "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},
       "ek_master" : true | false,
-      "ostentatious_master" : "invisible" | "light" | "heavy"
+      "profile" : <profile>
    }
  
  
@@ -101,7 +93,7 @@ c -> s
  
  
 === Profile ===
-<profile_infos>
+<profile>
    {
       "nick" : "Paul",
       "email" : "paul@pierre.com",
@@ -120,7 +112,7 @@ c -> s
       "cookie" : "LKJDLAKSJBFLKASN",
       "login" : "paul49",
       "password" : "IJKJDHHSAD9081238",
-      "profile_infos" : <profile_infos>
+      "profile" : <profile>
    }
       
 s -> c
index 73622a4..9daa0f5 100644 (file)
@@ -189,7 +189,7 @@ euphorik.Client.prototype.getJSONEnregistrement = function(login, password) {
       mess.password = password;\r
    }\r
    \r
-   mess.profile_infos = this.getJSONProfileInfos();\r
+   mess.profile = this.getJSONProfileInfos();\r
    \r
    return mess;\r
 };\r
@@ -208,7 +208,7 @@ euphorik.Client.prototype.getJSONProfile = function() {
       "cookie" : this.cookie,\r
       "login" : this.login,\r
       "password" : this.password,\r
-      "profile_infos" : this.getJSONProfileInfos()\r
+      "profile" : this.getJSONProfileInfos()\r
    };\r
 };\r
 \r
@@ -356,20 +356,20 @@ euphorik.Client.prototype.chargerDonnees = function(data) {
       \r
       this.id = data.id;\r
       this.login = data.login;\r
-      this.pseudo = data.nick;\r
-      this.email = data.email;\r
-      this.setCss(data.css);\r
-      this.chatOrder = data.chat_order;\r
-      this.nickFormat = data.nick_format;\r
-      this.viewTimes = data.view_times;\r
-      this.viewTooltips = data.view_tooltips;\r
-      this.ostentatiousMaster = data.ostentatious_master;\r
+      this.pseudo = data.profile.nick;\r
+      this.email = data.profile.email;\r
+      this.setCss(data.profile.css);\r
+      this.chatOrder = data.profile.chat_order;\r
+      this.nickFormat = data.profile.nick_format;\r
+      this.viewTimes = data.profile.view_times;\r
+      this.viewTooltips = data.profile.view_tooltips;\r
+      this.ostentatiousMaster = data.profile.ostentatious_master;\r
       \r
       // la page de la conversation principale\r
       this.pagePrincipale = 1;\r
       \r
       // les conversations\r
-      this.conversations = data.conversations;\r
+      this.conversations = data.profile.conversations;\r
       this.conversations.map(function(conv) {\r
          return { root : conv.root, page : 1, reduit : conv.minimized };\r
       });\r
index f5fa258..904fc0a 100755 (executable)
@@ -25,9 +25,9 @@
 -module(euphorik_bd).\r
 -export([   \r
    % users :\r
-   nouveau_user/3,\r
+   nouveau_user/2,\r
    nouveau_user/4,\r
-   set_profile/1,\r
+   set_profile/4,\r
    update_date_derniere_connexion/1,\r
    update_ip/2,\r
    update_pseudo_user/2,\r
 \r
 \r
 % Ajoute un nouveau user et le renvoie\r
-% User_infos représente le profile de l'utilisateur, il est possibe qu'il soit vide\r
-nouveau_user(Pseudo, Cookie, User_infos) ->\r
+nouveau_user(Cookie, Profile) ->\r
    F = fun() ->\r
       Id = nouvel_id(user),\r
-      User = User_infos#user{id = Id, cookie = Cookie, pseudo = Pseudo, date_creation = now(), date_derniere_connexion = now()},\r
+      User = #user{id = Id, cookie = Cookie, date_creation = now(), date_derniere_connexion = now(), profile = Profile},\r
       mnesia:write(User),\r
       User\r
    end,\r
@@ -102,32 +101,31 @@ nouveau_user(Pseudo, Cookie, User_infos) ->
   \r
   \r
 % Ajoute un nouveau user et le renvoie\r
-% User_infos représente le profile de l'utilisateur, il est possibe qu'il soit vide\r
-nouveau_user(Login, Password, Cookie, User_infos) ->\r
+nouveau_user(Login, Password, Cookie, Profile) ->\r
    F = fun() ->\r
       Id = nouvel_id(user),\r
-      User = User_infos#user{id = Id, cookie = Cookie, pseudo = Login, login = Login, password = Password, date_creation = now(), date_derniere_connexion = now()},\r
+      User = #user{id = Id, cookie = Cookie, login = Login, password = Password, date_creation = now(), date_derniere_connexion = now(), profile = Profile#profile{pseudo = login}},\r
       mnesia:write(User),\r
       User\r
    end,\r
   resultat_transaction(mnesia:transaction(F)).\r
   \r
 \r
-% Définit les données d'une utilisateur.\r
-set_profile(User) ->\r
+% Définit les données du profile d'une utilisateur.\r
+set_profile(Cookie, Login, Password, Profile) ->\r
    resultat_transaction(mnesia:transaction(\r
       fun() ->\r
-         case user_by_cookie(User#user.cookie) of\r
+         case user_by_cookie(Cookie) of\r
             {ok, User_existant} ->\r
-               case user_by_login(User#user.login) of\r
-                  {ok, U} when User#user.login =/= [], U#user.id =/= User_existant#user.id ->\r
+               case user_by_login(Login) of\r
+                  {ok, U} when Login =/= [], U#user.id =/= User_existant#user.id ->\r
                      login_deja_pris;\r
                   _ ->\r
                      mnesia:write(\r
-                        User#user{\r
-                           id = User_existant#user.id,\r
-                           login = if User_existant#user.login =:= [] -> User#user.login; true -> User_existant#user.login end, % on ne peut pas changer de login sauf si on en a pas !\r
-                           password = if User#user.password =:= [] -> User_existant#user.password; true -> User#user.password end\r
+                        User_existant#user{\r
+                           login = if User_existant#user.login =:= [] -> Login; true -> User_existant#user.login end, % on ne peut pas changer de login sauf si on en a pas !\r
+                           password = if Password =:= [] -> User_existant#user.password; true -> Password end,\r
+                           profile = Profile\r
                         }\r
                      ),\r
                      ok\r
@@ -171,8 +169,8 @@ update_pseudo_user(UserId, Pseudo) ->
    mnesia:transaction(\r
       fun() ->      \r
          case mnesia:wread({user, UserId}) of\r
-            [User] when User#user.pseudo =/= Pseudo ->\r
-               mnesia:write(User#user{pseudo = Pseudo});\r
+            [#user{profile = Profile} = User] when Profile#profile.pseudo =/= Pseudo ->\r
+               mnesia:write(User#user{profile = Profile#profile { pseudo = Pseudo } });\r
             _ ->\r
                mnesia:abort("update_pseudo_user: User inconnu ou pseudo deja à jour")\r
           end\r
@@ -218,7 +216,7 @@ print_users() ->
    print_users(all_remaining, []).\r
    \r
 print_user(User) when is_record(User, user) ->\r
-   #user{id = Id, pseudo = Pseudo, login = Login, ek_master = Ek_master, date_derniere_connexion = Date, last_ip = IP} = User,\r
+   #user{id = Id, profile = #profile{pseudo = Pseudo}, login = Login, ek_master = Ek_master, date_derniere_connexion = Date, last_ip = IP} = User,\r
    {{Annee, Mois, Jour}, {Heure, Min, _}} = calendar:now_to_local_time(Date),\r
    io:format(\r
       % id        pseudo     (login)        IP  Jour  Mois   Année  Heure Minute\r
@@ -301,8 +299,8 @@ toggle_ek_master(User_id) ->
 % Renvoie une chaine représentant le cookie ou undefined si pas trouvé.\r
 css_from_user_cookie(Cookie) ->\r
    case user_by_cookie(Cookie) of \r
-      {ok, User} ->\r
-         User#user.css;\r
+      {ok, #user{profile = Profile}} ->\r
+         Profile#profile.css;\r
       _ ->\r
          undefined\r
    end.\r
@@ -364,7 +362,7 @@ nouveau_message(Mess, Auteur_id, Repond_A_ids) ->
          _ ->\r
             % est-ce que l'auteur existe ?\r
             case e(q([E || E <- mnesia:table(user), E#user.id =:= Auteur_id]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) of\r
-               [Auteur] ->\r
+               [#user{profile = Profile} = Auteur] ->\r
                   if length(Repond_a) =/= length(Repond_A_ids) ->\r
                         {erreur, "Un ou plusieurs messages introuvable"};\r
                      true ->\r
@@ -378,7 +376,7 @@ nouveau_message(Mess, Auteur_id, Repond_A_ids) ->
                         % est-ce que l'auteur à trop floodé ?\r
                         if Auteur#user.indice_flood =/= ?INDICE_SPAM_MAX, Auteur_maj#user.indice_flood =:= ?INDICE_SPAM_MAX, Delta =< ?DUREE_BLOCAGE_SPAM ->\r
                            mnesia:write(Auteur#user{indice_flood = Auteur_maj#user.indice_flood}),\r
-                           nouveau_message_sys("''" ++ Auteur#user.pseudo ++ if Auteur#user.login =/= [] -> " (" ++ Auteur#user.login ++ ")"; true -> "" end ++ "'' est bloqué pour " ++ integer_to_list(trunc(?DUREE_BLOCAGE_SPAM / 1000)) ++ " secondes pour cause de flood.");\r
+                           nouveau_message_sys("''" ++ Profile#profile.pseudo ++ if Auteur#user.login =/= [] -> " (" ++ Auteur#user.login ++ ")"; true -> "" end ++ "'' est bloqué pour " ++ integer_to_list(trunc(?DUREE_BLOCAGE_SPAM / 1000)) ++ " secondes pour cause de flood.");\r
                         Auteur#user.indice_flood =:= ?INDICE_SPAM_MAX, Delta =< ?DUREE_BLOCAGE_SPAM ->\r
                            {erreur, "Bloqué pour cause de flood"};\r
                         true ->     \r
@@ -389,7 +387,7 @@ nouveau_message(Mess, Auteur_id, Repond_A_ids) ->
                               id = Id,\r
                               auteur_id = Auteur#user.id,\r
                               date = now(),\r
-                              pseudo = Auteur#user.pseudo,\r
+                              pseudo = Profile#profile.pseudo,\r
                               contenu = Mess,\r
                               racine_id = if Racine_id =:= undefined -> Id; true -> Racine_id end\r
                            }),\r
@@ -419,11 +417,11 @@ nouveau_message_sys(Mess) ->
 \r
 % Création d'un message système lié à un troll.\r
 nouveau_message_sys(Mess, Troll_id) ->\r
-   {ok, Root} = user_by_id(0),\r
+   {ok, #user{profile = Profile}} = user_by_id(0),\r
    resultat_transaction(mnesia:transaction(\r
       fun() ->\r
          Id = nouvel_id(minichat),\r
-         mnesia:write(#minichat{id=Id, auteur_id=0, date=now(), pseudo=Root#user.pseudo, contenu=Mess, troll_id=Troll_id, racine_id=Id}),\r
+         mnesia:write(#minichat{id = Id, auteur_id = 0, date = now(), pseudo = Profile#profile.pseudo, contenu = Mess, troll_id = Troll_id, racine_id = Id}),\r
          Id\r
       end\r
    )).\r
@@ -623,7 +621,7 @@ list_ban() ->
             {\r
                IP#ip_table.ip,\r
                delta_date_minute(date_plus_minutes(IP#ip_table.ban, IP#ip_table.ban_duration), Now),\r
-               e(q([{U#user.pseudo, U#user.login} || U <- mnesia:table(user), U#user.last_ip =:= IP#ip_table.ip]), [{tmpdir, ?KEY_SORT_TEMP_DIR}])\r
+               e(q([{Profile#profile.pseudo, U#user.login} || #user{profile = Profile} = U <- mnesia:table(user), U#user.last_ip =:= IP#ip_table.ip]), [{tmpdir, ?KEY_SORT_TEMP_DIR}])\r
             } ||\r
             IP <- mnesia:table(ip_table),\r
             if IP#ip_table.ban =:= undefined -> false; true -> date_plus_minutes(IP#ip_table.ban, IP#ip_table.ban_duration) > Now end\r
index b683cc5..18e6ced 100644 (file)
 % You should have received a copy of the GNU General Public License
 % along with Euphorik.  If not, see <http://www.gnu.org/licenses/>.
 % 
-% Module mettant à disposition tout un tas de fonction pour l'administration de la base de données euphorik comme :\r
-%  - Création de la BD\r
-%  - Mise à jour de la BD\r
-%  - Backup et restauration\r
-%  - Copie de la BD à partir d'un autre noeud\r
+% Module mettant à disposition tout un tas de fonction pour l'administration de la base de données euphorik comme :
+%  - Création de la BD
+%  - Mise à jour de la BD
+%  - Backup et restauration
+%  - Copie de la BD à partir d'un autre noeud
 %
 % @author G.Burri
 
 -module(euphorik_bd_admin).
 -export([
-   version_bd/0,\r
-   create/0,\r
-   connect/0,\r
-   connect/1,\r
+   version_bd/0,
+   create/0,
+   connect/0,
+   connect/1,
    reset/0,
    update/0,
    backup/1,
@@ -47,82 +47,82 @@ version_bd() ->
       fun() ->
          mnesia:read({proprietes, version})
       end
-   )).\r
-   \r
-\r
-% Instructions pour créer une nouvelle base : \r
-% $erl -sname yaws -mnesia dir '"/projets/euphorik/BD"'\r
-% voir doc/installation.txt\r
-% >l(euphorik_bd).\r
-% >euphorik_bd:create().\r
-create() ->\r
-   mnesia:stop(),\r
-   mnesia:delete_schema([node()]),\r
-   mnesia:create_schema([node()]), % nécessaire pour les tables sur disc\r
-   mnesia:start(),\r
-   create_tables(),\r
-   reset().\r
-   \r
-create_tables() ->\r
-   mnesia:create_table(counter, [\r
-      {attributes, record_info(fields, counter)},\r
-      {disc_copies, [node()]}\r
-   ]),\r
-   mnesia:create_table(proprietes, [\r
-      {attributes, record_info(fields, proprietes)},\r
-      {disc_copies, [node()]}\r
-   ]),\r
-   mnesia:create_table(minichat, [\r
-      {attributes, record_info(fields, minichat)},\r
-      {index, [auteur_id, troll_id]},\r
-      {disc_copies, [node()]}\r
-   ]),\r
-   mnesia:create_table(reponse_minichat, [\r
-      {type, bag},\r
-      {attributes, record_info(fields, reponse_minichat)},\r
-      {index, [cible]},\r
-      {disc_copies, [node()]}\r
-   ]),\r
-   mnesia:create_table(user, [\r
-      {attributes, record_info(fields, user)},\r
-      {index, [cookie, login]},\r
-      {disc_copies, [node()]}\r
-   ]),\r
-   mnesia:create_table(ip_table, [\r
-      {attributes, record_info(fields, ip_table)},\r
-      {disc_copies, [node()]}\r
-   ]),\r
-   mnesia:create_table(troll, [\r
-      {attributes, record_info(fields, troll)},\r
-      {index, [date_post]},\r
-      {disc_copies, [node()]}\r
-   ]).\r
-   \r
-   \r
-% Connexion à la base de données de yaws sur overnux\r
-connect() ->\r
-   connect(yaws@flynux).\r
-connect(Node) ->\r
-   mnesia:start(),\r
-   mnesia:change_config(extra_db_nodes, [Node]).\r
-\r
-\r
-% Efface toutes les données de la base de données.\r
-reset() ->\r
-   mnesia:clear_table(counter),\r
-   mnesia:clear_table(proprietes),\r
-   mnesia:clear_table(user),\r
-   mnesia:clear_table(reponse_minichat),\r
-   mnesia:clear_table(minichat),\r
-   mnesia:clear_table(troll),\r
-   mnesia:clear_table(ip_table),\r
-   % crée l'utilisateur root\r
-   mnesia:transaction(fun() ->\r
-      mnesia:write(#proprietes{nom = version, valeur = ?VERSION_BD}),\r
-      User = #user{id = 0, pseudo = "Sys", login = "Sys", date_creation = now(), date_derniere_connexion = now(), ek_master = true},\r
-      mnesia:write(User),\r
-      User\r
-   end).\r
+   )).
+   
+
+% Instructions pour créer une nouvelle base : 
+% $erl -sname yaws -mnesia dir '"/projets/euphorik/BD"'
+% voir doc/installation.txt
+% >l(euphorik_bd).
+% >euphorik_bd:create().
+create() ->
+   mnesia:stop(),
+   mnesia:delete_schema([node()]),
+   mnesia:create_schema([node()]), % nécessaire pour les tables sur disc
+   mnesia:start(),
+   create_tables(),
+   reset().
+   
+create_tables() ->
+   mnesia:create_table(counter, [
+      {attributes, record_info(fields, counter)},
+      {disc_copies, [node()]}
+   ]),
+   mnesia:create_table(proprietes, [
+      {attributes, record_info(fields, proprietes)},
+      {disc_copies, [node()]}
+   ]),
+   mnesia:create_table(minichat, [
+      {attributes, record_info(fields, minichat)},
+      {index, [auteur_id, troll_id]},
+      {disc_copies, [node()]}
+   ]),
+   mnesia:create_table(reponse_minichat, [
+      {type, bag},
+      {attributes, record_info(fields, reponse_minichat)},
+      {index, [cible]},
+      {disc_copies, [node()]}
+   ]),
+   mnesia:create_table(user, [
+      {attributes, record_info(fields, user)},
+      {index, [cookie, login]},
+      {disc_copies, [node()]}
+   ]),
+   mnesia:create_table(ip_table, [
+      {attributes, record_info(fields, ip_table)},
+      {disc_copies, [node()]}
+   ]),
+   mnesia:create_table(troll, [
+      {attributes, record_info(fields, troll)},
+      {index, [date_post]},
+      {disc_copies, [node()]}
+   ]).
+   
+   
+% Connexion à la base de données de yaws sur overnux
+connect() ->
+   connect(yaws@flynux).
+connect(Node) ->
+   mnesia:start(),
+   mnesia:change_config(extra_db_nodes, [Node]).
+
+
+% Efface toutes les données de la base de données.
+reset() ->
+   mnesia:clear_table(counter),
+   mnesia:clear_table(proprietes),
+   mnesia:clear_table(user),
+   mnesia:clear_table(reponse_minichat),
+   mnesia:clear_table(minichat),
+   mnesia:clear_table(troll),
+   mnesia:clear_table(ip_table),
+   % crée l'utilisateur root
+   mnesia:transaction(fun() ->
+      mnesia:write(#proprietes{nom = version, valeur = ?VERSION_BD}),
+      User = #user{id = 0, profile = #profile{pseudo = "Sys"}, login = "Sys", date_creation = now(), date_derniere_connexion = now(), ek_master = true},
+      mnesia:write(User),
+      User
+   end).
    
 
 % Met à jour la bd, compare ?VERSION_BD avec la version dans la table 'proprietes'
@@ -162,7 +162,7 @@ patch(1) ->
    mnesia:transform_table(
       user,
       fun({user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, Nick_format, View_times, View_tooltips, Indice_flood, _Page_principale, Conversations, Ek_master, Last_ip}) ->
-            {user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, patch1_transforme_css(Css), Nick_format, View_times, View_tooltips, light, reverse, Indice_flood, lists:map(fun({R, _}) -> {R, false} end, Conversations), Ek_master, Last_ip}
+            {user, Id, Cookie, Login, Password, {profile, Pseudo, Email, patch1_transforme_css(Css), Nick_format, View_times, View_tooltips, light, reverse, lists:map(fun({R, _}) -> {R, false} end, Conversations)}, Date_creation, Date_derniere_connexion, Indice_flood, Ek_master, Last_ip}
       end,
       record_info(fields, user),
       user
index c3dfbbe..1b0a49b 100755 (executable)
 \r
 \r
 % Une utilisateur s'enregistre avec un tuple {Login, Password}.\r
-register([{login, Login}, {password, Password}, {profile_infos, Profile_infos}], IP) ->\r
+register([{login, Login}, {password, Password}, {profile, Profile_json}], IP) ->\r
    Can_register = euphorik_bd:can_register(IP),\r
    if Can_register ->\r
          case euphorik_bd:user_by_login(Login) of\r
             {ok, _} ->\r
                erreur("Login déjà existant");\r
             _ ->\r
-               User = euphorik_bd:nouveau_user(Login, Password, generer_cookie(), user_from_json(Profile_infos)),\r
+               User = euphorik_bd:nouveau_user(Login, Password, generer_cookie(), profile_from_json(Profile_json)),\r
                euphorik_bd:update_ip(User#user.id, IP),\r
                json_reponse_login_ok(User)\r
          end;\r
@@ -58,10 +58,11 @@ register([{login, Login}, {password, Password}, {profile_infos, Profile_infos}],
          erreur_register_flood()\r
    end;\r
 % Enregistrement sans {Login, Password}\r
-register([{profile_infos, Profile_infos}], IP) ->   \r
+register([{profile, Profile_json}], IP) ->   \r
    Can_register = euphorik_bd:can_register(IP),\r
    if Can_register ->\r
-         User = euphorik_bd:nouveau_user("<nick>", generer_cookie(), user_from_json(Profile_infos)),\r
+         Profile = profile_from_json(Profile_json),\r
+         User = euphorik_bd:nouveau_user(generer_cookie(), Profile#profile{pseudo = "<nick>"}),\r
          euphorik_bd:update_ip(User#user.id, IP),\r
          json_reponse_login_ok(User);\r
       true ->\r
@@ -115,19 +116,14 @@ profile(
       {cookie, Cookie},\r
       {login, Login},\r
       {password, Password},\r
-      {profile_infos, Profile_infos}\r
+      {profile, Profile_json}\r
    ]\r
 ) ->\r
-   case user_from_json(Profile_infos) of\r
+   case profile_from_json(Profile_json) of\r
       {erreur, E} -> E;\r
-      UserInfos ->\r
-         User = UserInfos#user {\r
-            cookie = Cookie,\r
-            login = Login,\r
-            password = Password\r
-         },   \r
+      Profile ->\r
          %  TODO : pas très beau, mieux vaut construire un #user\r
-         case euphorik_bd:set_profile(User) of\r
+         case euphorik_bd:set_profile(Cookie, Login, Password, Profile) of\r
             ok ->\r
                json_reponse_ok();\r
             login_deja_pris ->\r
@@ -139,7 +135,7 @@ profile(
 \r
 \r
 % Construit un #user à partir des données JSON\r
-user_from_json(\r
+profile_from_json(\r
    {struct,\r
       [\r
          {nick, Pseudo},\r
@@ -184,7 +180,7 @@ user_from_json(
                if not Ostentatious_master_valide ->\r
                      {erreur, Ostentatious_master_str ++ " n'est pas une valeur acceptée pour 'ostentatious_master'"};\r
                   true ->\r
-                     #user{\r
+                     #profile{\r
                         pseudo = Pseudo,\r
                         email = Email,\r
                         css = Css,\r
@@ -254,12 +250,12 @@ wait_event([{page, "admin"}, {last_troll, Last_troll}]) ->
                {trolls, {array, \r
                   lists:map(\r
                      fun(T) ->                        \r
-                        {ok, User} = euphorik_bd:user_by_id(T#troll.id_user),\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, User#user.pseudo},\r
+                              {author, Profile#profile.pseudo},\r
                               {author_id, User#user.id}\r
                            ]\r
                         }\r
@@ -467,11 +463,11 @@ ban(
             case euphorik_bd:user_by_id(User_id) of\r
                {ok, User1} ->\r
                   erreur("Il n'est pas possible de s'auto bannir");\r
-               {ok, User2 = #user{ek_master = false}} ->\r
+               {ok, #user{ek_master = false, profile = Profile2} = User2} ->\r
                   euphorik_bd:ban(User2#user.last_ip, Duration),\r
                   euphorik_bd:nouveau_message_sys(lists:flatten(io_lib:format("''~s~s'' est ~s pour ~s.~s",\r
                      [\r
-                        User2#user.pseudo,\r
+                        Profile2#profile.pseudo,\r
                         if User2#user.login =:= [] -> ""; true -> " (" ++ User2#user.login ++ ")" end,\r
                         if Duration =< 15 -> "kické"; true -> "banni" end,\r
                         format_minutes(Duration),\r
@@ -498,21 +494,21 @@ slap(
    ]) ->\r
       % controle que l'utilisateur est un admin\r
       case euphorik_bd:user_by_cookie(Cookie) of\r
-         {ok, User1 = #user{ek_master = true}} ->\r
+         {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
                      [\r
-                        User1#user.pseudo,\r
+                        Profile1#profile.pseudo,\r
                         if Reason =/= [] -> " - Raison: " ++ Reason; true -> "" end\r
                      ]\r
                   ))),\r
                   json_reponse_ok();\r
-               {ok, User2 = #user{ek_master = false}} ->\r
+               {ok, #user{ek_master = false, profile = Profile2}} ->\r
                   euphorik_bd:nouveau_message_sys(lists:flatten(io_lib:format("~s se fait slaper par ~s.~s",\r
                      [\r
-                        User2#user.pseudo,\r
-                        User1#user.pseudo,\r
+                        Profile2#profile.pseudo,\r
+                        Profile1#profile.pseudo,\r
                         if Reason =/= [] -> " - Raison: " ++ Reason; true -> "" end ++ "."\r
                      ]\r
                   ))),\r
@@ -700,29 +696,33 @@ json_reponse_ok() ->
    {struct, [{reply, "ok"}]}.\r
    \r
    \r
-json_reponse_login_ok(User) ->\r
+json_reponse_login_ok(#user{profile = Profile} = User) ->\r
    {\r
       struct, [\r
          {reply, "login"},\r
          {status, if (User#user.password =/= []) and (User#user.login =/= []) -> "auth_registered"; true -> "auth_not_registered" end},\r
          {cookie, User#user.cookie},\r
          {id, User#user.id},\r
-         {nick, User#user.pseudo},\r
          {login, User#user.login},\r
-         {email, User#user.email},\r
-         {css, User#user.css},\r
-         {chat_order, atom_to_list(User#user.chat_order)},\r
-         {nick_format, atom_to_list(User#user.nick_format)},\r
-         {view_times, User#user.view_times},\r
-         {view_tooltips, User#user.view_tooltips},\r
-         {conversations, {array, lists:map(\r
-            fun({Racine, Reduit}) ->\r
-               {struct, [{root, Racine}, {minimized, Reduit}]}\r
-            end,\r
-            User#user.conversations\r
-         )}},\r
          {ek_master, User#user.ek_master},\r
-         {ostentatious_master, atom_to_list(User#user.ostentatious_master)}\r
+         {profile, {struct,\r
+            [\r
+               {nick, Profile#profile.pseudo},\r
+               {email, Profile#profile.email},\r
+               {css, Profile#profile.css},\r
+               {chat_order, atom_to_list(Profile#profile.chat_order)},\r
+               {nick_format, atom_to_list(Profile#profile.nick_format)},\r
+               {view_times, Profile#profile.view_times},\r
+               {view_tooltips, Profile#profile.view_tooltips},\r
+               {conversations, {array, lists:map(\r
+                  fun({Racine, Reduit}) ->\r
+                     {struct, [{root, Racine}, {minimized, Reduit}]}\r
+                  end,\r
+                  Profile#profile.conversations\r
+               )}},\r
+               {ostentatious_master, atom_to_list(Profile#profile.ostentatious_master)}\r
+            ]\r
+         }}\r
       ]\r
    }.\r
    \r
@@ -734,7 +734,7 @@ json_message(Mess, Repond_a, User) ->
    Est_proprietaire = User =/= inconnu andalso User#user.id =:= Mess#minichat.auteur_id,\r
    A_repondu_a_message = User =/= inconnu andalso euphorik_bd:a_repondu_a_message(User#user.id, Mess#minichat.id),\r
    Est_une_reponse_a_user = User =/= inconnu andalso euphorik_bd:est_une_reponse_a_user(User#user.id, Mess#minichat.id),\r
-   {ok, User_mess } = euphorik_bd:user_by_id(Mess#minichat.auteur_id),\r
+   {ok,  #user{profile = Profile_mess} = User_mess } = euphorik_bd:user_by_id(Mess#minichat.auteur_id),\r
    {struct, [\r
       {id, Mess#minichat.id},\r
       {user_id, User_mess#user.id},\r
@@ -756,5 +756,5 @@ json_message(Mess, Repond_a, User) ->
          Repond_a\r
       )}},\r
       {ek_master, User_mess#user.ek_master},\r
-      {ostentatious_master, atom_to_list(User_mess#user.ostentatious_master)}\r
+      {ostentatious_master, atom_to_list(Profile_mess#profile.ostentatious_master)}\r
    ]}.\r
index 038dae8..01d6281 100755 (executable)
@@ -20,6 +20,7 @@
 
 % Version de la BD
 -define(VERSION_BD, 2).
+-define(TABLES, [counter, proprietes, minichat, reponse_minichat, user, ip_table, troll]).
 
 
 % Pour générer des id
    }). 
 
 
--record(user,
+
+-record(profile, % attention : pas une table !
    {
-      id,
-      cookie, % string()
-      login = [], % string()
-      password = [], % string() (md5)
       pseudo = [], % string()
       email = [], % string()
-      date_creation, % erlang:now()
-      date_derniere_connexion, % erlang:now(), est mis à jour lors de n'importe quelle activitée (envoie de message par exemple)
       css = [], % string()
       nick_format = nick, %atom(), peut valoir 'nick', 'login' ou 'nick_login'
       view_times = true,
       view_tooltips = true,
       ostentatious_master = light, % peut valoir invisible, light ou heavy. seulement pour ek_master
       chat_order = reverse, % peut valoir chrono ou reverse
+      conversations = [] % [{integer(), bool}], la liste des messages correspondant au conversation {racine, reduite?}
+   }).
+-record(user,
+   {
+      id,
+      cookie, % string()
+      login = [], % string()
+      password = [], % string() (md5)
+      profile = #profile{},
+      date_creation, % erlang:now()
+      date_derniere_connexion, % erlang:now(), est mis à jour lors de n'importe quelle activitée (envoie de message par exemple)
       indice_flood = 0, % integer() est incrémenté lorsque l'utilisateur envoie trop rapidement des messages.
-      conversations = [], % [{integer(), bool}], la liste des messages correspondant au conversation {racine, reduite?}
       ek_master = false,
       last_ip = undefined % integer(), undefined si inconnu
    }).