Merge branch 'master' of gburri.org:euphorik
authorUmmon <greg.burri@gmail.com>
Thu, 23 Apr 2020 16:43:19 +0000 (18:43 +0200)
committerUmmon <greg.burri@gmail.com>
Thu, 23 Apr 2020 16:43:19 +0000 (18:43 +0200)
1  2 
.gitignore
index.yaws
js/euphorik.js
modules/erl/euphorik_bd_admin.erl
modules/erl/euphorik_common.erl

diff --combined .gitignore
@@@ -1,3 -1,3 +1,5 @@@
  *.iws
  *.beam
--var/
++var/
++/BD
++/data
diff --combined index.yaws
@@@ -46,7 -46,7 +46,7 @@@
     <script type="text/javascript" src="js/communication.js" prod="delete"></script>\r
     <script type="text/javascript" src="js/conf.js" prod="delete"></script>\r
     <script type="text/javascript" src="js/util.js" prod="delete"></script>\r
 -   <script type="text/javascript" src="js/formater.js" prod="delete"></script>\r
 +   <script type="text/javascript" src="js/formatter.js" prod="delete"></script>\r
     <script type="text/javascript" src="js/pages.js" prod="delete"></script>\r
     <script type="text/javascript" src="js/client.js" prod="delete"></script>\r
  \r
     <body>\r
        <div id="container">\r
           <erl>\r
-             % permet de prédéfinir la "class" du logo pour un ekMaster...\r
+             % To redefine the logo class for the ekMasters.\r
              out(A) ->\r
-                Est_ek_master = euphorik_bd:is_ek_master_from_cookie(yaws_api:find_cookie_val("cookie", A)),\r
-                {ehtml, {'div', [{id, "logo"}] ++ if Est_ek_master -> [{class, "ekMaster"}]; true -> [] end}}.\r
+                Is_ek_master = euphorik_bd:is_ek_master_from_cookie(yaws_api:find_cookie_val("cookie", A)),\r
+                {ehtml, {'div', [{id, "logo"}] ++ if Is_ek_master -> [{class, "ekMaster"}]; true -> [] end}}.\r
           </erl>\r
           <div id="info" style="display:none" ><div id="icone"></div><div class="close" ></div><div class="message" ></div><div class="buttons"></div></div>\r
           <div id="waitbar" style="display:none" ><div class="image"></div></div>\r
                    <erl>\r
                       % parse les styles disponible\r
                       out(A) ->\r
-                         Stlyes_dir = A#arg.docroot ++ "/styles",\r
-                         {ok, Liste_dir} = file:list_dir(Stlyes_dir),\r
+                         Styles_dir = A#arg.docroot ++ "/styles",\r
+                         {ok, Liste_dir} = file:list_dir(Styles_dir),\r
                          {ehtml,\r
                             lists:foldr(\r
                                fun(Dir, Acc) ->\r
-                                  case file:consult(Stlyes_dir ++ "/" ++ Dir ++ "/infos.txt") of\r
+                                  case file:consult(Styles_dir ++ "/" ++ Dir ++ "/infos.txt") of\r
                                      {ok, [{nom, Nom}]} ->\r
                                         [{option, [{value, Dir}], Nom} | Acc];\r
                                      _ ->\r
diff --combined js/euphorik.js
@@@ -23,10 -23,10 +23,10 @@@ var euphorik = {}
  
  // le main
  $(document).ready(
-    function() { 
+    function() {
        var fragment = new Fragment();
 -      var formater = new euphorik.Formater();
 -      var util = new euphorik.Util(formater);
 +      var formatter = new euphorik.Formatter();
 +      var util = new euphorik.Util(formatter);
        var communication = new euphorik.Communication(
           function(data) { util.messageDialog(data.error_message); },
           function() { util.showWaitBar(); },
        );
        var client = new euphorik.Client(util, communication);
        var pages = new euphorik.Pages(fragment, communication);
-            
        // Client authentification with the cookie information (if  it exists).
        client.connectionCookie();
-       
        $("#menuCss").change(function() { client.setCss("styles/" + $("option:selected", this).attr("value") + "/euphorik.css"); });
  
-       // FIXME : doesn't work under Opera
-       // see : http://dev.jquery.com/ticket/2892#preview
        $(window).unload(function() { client.flush(); });
-       
        $("#menu .minichat").click(function() { pages.displayPage("minichat"); });
        $("#menu .admin").click(function() { pages.displayPage("admin"); });
        $("#menu .profile").click(function() { pages.displayPage("profile"); });
        });
        $("#menu .register").click(function(){ pages.displayPage("register"); });
        $("#menu .about").click(function(){ pages.displayPage("about"); });
-       
 -      // TODO: simplification : such link[1] should be created and automatically open the right page without
 +      // TODO : simplification : such link[1] should be created and automatically open the right page without
        //  explicitly add a page.
        // [1] : <a class="pageLink" href="termes_of_use">Terms of use</a>
        $("#footer .termsOfUse").click(function(){ pages.displayPage("terms_of_use"); });
-       
 -      pages.addPage(new euphorik.PageMinichat(client, formater, util, communication), true);
 -      pages.addPage(new euphorik.PageAdmin(client, formater, util, communication));
 -      pages.addPage(new euphorik.PageProfile(client, formater, util));
 -      pages.addPage(new euphorik.PageRegister(client, formater, util));
 -      pages.addPage(new euphorik.PageAbout(client, formater, util, communication));
 +      pages.addPage(new euphorik.PageMinichat(client, formatter, util, communication), true);
 +      pages.addPage(new euphorik.PageAdmin(client, formatter, util, communication));
 +      pages.addPage(new euphorik.PageProfile(client, formatter, util));
 +      pages.addPage(new euphorik.PageRegister(client, formatter, util));
 +      pages.addPage(new euphorik.PageAbout(client, formatter, util, communication));
        pages.addPage("terms_of_use");
-       
        pages.displayPage(); // display the default page
     }
  );
  % 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
- % 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
\r
+ % Some functions to manage the database like creating, updating, backuping etc.\r
+ %\r
+ % @author G.Burri\r
  \r
  -module(euphorik_bd_admin).\r
 -\r
 +-author("Greg Burri <greg.burri@gmail.com>").\r
  -export([\r
     version_bd/0,\r
     create/0,\r
     print_users/1,\r
     print_user/1\r
  ]).\r
\r
  -import(qlc, [e/2, q/1, cursor/2]).\r
\r
  -include("../include/euphorik_bd.hrl").\r
  -include("../include/euphorik_defines.hrl").\r
  -include_lib("stdlib/include/qlc.hrl").\r
  \r
\r
- % Renvoie la version courante de la BD.\r
+ % Return the current version of the DB.\r
  version_bd() ->\r
     euphorik_bd:resultat_transaction(mnesia:transaction(\r
        fun() ->\r
        end\r
     )).\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 a the database. Warning: it will delete all existent data.\r
+ % Example:\r
+ %  $erl -sname yaws -mnesia dir '"/projects/euphorik/DB"'\r
+ %  >l(euphorik_admin).\r
+ %  >euphorik_bd:create().\r
  create() ->\r
     mnesia:stop(),\r
     mnesia:delete_schema([node()]),\r
@@@ -106,12 -103,11 +103,11 @@@ create_tables() -
        {attributes, record_info(fields, troll)},\r
        {disc_copies, [node()]}\r
     ]),\r
-    creer_indexes().\r
+    create_indexes().\r
  \r
\r
- % mis à part car lors de la reprise de données avec load_textfile les indexes ne sont pas recréés\r
- creer_indexes() ->\r
-    % commence par supprimer les anciens indexes\r
+ % Create all the needed indexes on the tables.\r
+ create_indexes() ->\r
+    % Delete all existing indexes.\r
     lists:foreach(fun(T) ->\r
           lists:foreach(fun(P) ->\r
                 mnesia:del_table_index(T, P)\r
     mnesia:add_table_index(troll, date_post),\r
     mnesia:add_table_index(troll, id_minichat).\r
  \r
\r
- % Connexion à la base de données de yaws sur overnux\r
+ % To connect to an remote database node.\r
  connect() ->\r
-    connect(yaws@flynux).\r
+    connect(yaws@x220).\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
+ % Remove all data.\r
  reset() ->\r
     mnesia:clear_table(counter),\r
     mnesia:clear_table(proprietes),\r
     mnesia:clear_table(minichat),\r
     mnesia:clear_table(troll),\r
     mnesia:clear_table(ip_table),\r
-    % crée l'utilisateur root\r
+    % Create the root user.\r
     mnesia:transaction(fun() ->\r
-       mnesia:write(#proprietes{nom = version, valeur = ?VERSION_BD}),\r
+       mnesia:write(#proprietes{nom = version, valeur = ?DB_VERSION}),\r
        User = #user{id = 0, profile = #profile{pseudo = "Sys"}, login = "Sys", date_creation = erlang:timestamp(), date_derniere_connexion = erlang:timestamp(), ek_master = true},\r
        mnesia:write(User),\r
        User\r
     end),\r
-    peupler_texte().\r
\r
+    populate_text().\r
  \r
- peupler_texte() ->\r
+ populate_text() ->\r
     mnesia:transaction(fun() ->\r
        mnesia:write(#texte{ id = 10, fr = "Login déjà existant"}),\r
        mnesia:write(#texte{ id = 20, fr = "Trop de register (flood)"}),\r
        mnesia:write(#texte{ id = 70, fr = "Page inconnue"}),\r
        mnesia:write(#texte{ id = 80, fr = "Vous êtes banni pour encore ~s"}),\r
        mnesia:write(#texte{ id = 90, fr = "Message vide"}),\r
-       mnesia:write(#texte{ id = 100, fr = "Impossible d'ajouter un nouveau message. Raison : ~s"}),\r
+       mnesia:write(#texte{ id = 100, fr = "Impossible d'ajouter un nouveau message. Cause : ~s"}),\r
        mnesia:write(#texte{ id = 110, fr = "Utilisateur inconnu"}),\r
        mnesia:write(#texte{ id = 120, fr = "Il n'est pas possible de s'auto bannir"}),\r
        mnesia:write(#texte{ id = 130, fr = "L'utilisateur est lui même un ekMaster"}),\r
        mnesia:write(#texte{ id = 230, fr = "Seul les ekMaster peuvent connaitre la liste des ips bannies"})\r
     end).\r
  \r
\r
- % Met à jour la bd, compare ?VERSION_BD avec la version dans la table 'proprietes'\r
- % et exécute les patchs nécessaires.\r
+ % Update the database to the latest version (?DB_VERSION).\r
  update() ->\r
     case mnesia:dirty_read({proprietes, version}) of\r
        [#proprietes{valeur = Version}] ->\r
           update(Version);\r
        _ ->\r
-          erreur\r
+          error\r
     end.\r
\r
\r
- % Mise à jour de la BD.\r
- % attention : il est nécessaire de se trouver dans une transaction.\r
- update(?VERSION_BD) -> fini;\r
+ update(?DB_VERSION) -> finished;\r
  update(Version) ->\r
-    case mnesia:backup(fichier_backup(Version)) of\r
+    case mnesia:backup(backup_file_path(Version)) of\r
        ok ->\r
           case patch(Version) of\r
              ok ->\r
                 mnesia:dirty_write(#proprietes{nom = version, valeur = Version + 1}),\r
                 update(Version + 1);\r
-             Erreur ->\r
-                Erreur\r
+             Error ->\r
+                Error\r
           end;\r
-       {error, Raison} -> {error, lists:flatten(io_lib:format("Erreur de création du backup de la version ~w : ~w", [Version, Raison]))}\r
+       {error, Message} -> {error, lists:flatten(io_lib:format("Error: unable to create a backup file prior updating the database to the version ~w: ~w", [Version, Message]))}\r
     end.\r
  \r
  \r
@@@ -255,7 -242,7 +242,7 @@@ patch(1) -
        {attributes, record_info(fields, texte)},\r
        {disc_copies, [node()]}\r
     ]),\r
-    peupler_texte(),\r
+    populate_text(),\r
     % traitement des users\r
     mnesia:transform_table(\r
        user,\r
           lists:foreach(fun(M) -> Traiter_message(M, M#minichat.id) end, Messages)\r
        end\r
     ) of\r
-       {aborted, Raison} -> {erreur, Raison};\r
+       {aborted, Cause} -> {error, Cause};\r
        {atomic, _} -> ok\r
     end;\r
  % 2 -> 3\r
@@@ -319,7 -306,7 +306,7 @@@ patch(2) -
        % la table troll utilise maintenant son index et pas celui de la table minichat (correction d'un vieux bug)\r
        mnesia:write(#counter{key = troll, value = mnesia:table_info(minichat, size)})\r
     end),\r
-    creer_indexes(). % uniquement pour l'indice sur id_minichat de la table troll\r
+    create_indexes(). % uniquement pour l'indice sur id_minichat de la table troll\r
  \r
  \r
  % Renvoie le dossier dans lequel les backups sont effectué, ce dossier doit être en écriture.\r
@@@ -328,7 -315,7 +315,7 @@@ dossier_backups() -
  \r
  \r
  % Renvoie le fichier (avec le chemin) correspondant à la version Version, par exemple : "/var/euphorik/BD/backups/backup1"\r
fichier_backup(Version) when is_integer(Version) ->\r
backup_file_path(Version) when is_integer(Version) ->\r
     dossier_backups() ++ "backup" ++ integer_to_list(Version).\r
  \r
  \r
@@@ -343,7 -330,7 +330,7 @@@ restore(Fichier) when is_list(Fichier) 
  % Reviens à une version précédente de la base de données.\r
  % (les données insérées durant les versions plus récentes sont perdues).\r
  restore(Version) when is_integer(Version) ->\r
-    mnesia:restore(fichier_backup(Version), []). % [{default_op, recreate_tables}]).\r
+    mnesia:restore(backup_file_path(Version), []). % [{default_op, recreate_tables}]).\r
  \r
  \r
  % Change le nom du noeud d'un backup.\r
@@@ -380,24 -367,6 +367,6 @@@ change_node_name(From, To, Source, Targ
          end,\r
      mnesia:traverse_backup(Source, Target, Convert, switched).\r
  \r
\r
- % Obsolète\r
- %~ backup_text(File) ->\r
-    %~ mnesia:dump_to_textfile(File).\r
- %~ restore_text(File) ->\r
-    %~ mnesia:stop(),\r
-    %~ mnesia:delete_schema([node()]),\r
-    %~ mnesia:start(),\r
-    %~ create_tables(),\r
-    %~ case mnesia:load_textfile(File) of\r
-       %~ {atomic, ok} ->\r
-          %~ update(),\r
-          %~ creer_indexes();\r
-       %~ Erreur ->\r
-          %~ Erreur\r
-    %~ end.\r
\r
\r
  toggle_ek_master(User_id) ->\r
     euphorik_bd:resultat_transaction(mnesia:transaction(\r
        fun() ->\r
           case Users of\r
              [User] ->\r
                 mnesia:write(User#user{ek_master = not User#user.ek_master});\r
-             _ -> erreur\r
+             _ -> error\r
           end\r
        end\r
     )).\r
@@@ -468,7 -437,7 +437,7 @@@ print_user(Login) when is_list(Login) -
        {ok, User} ->\r
           print_user(User);\r
        _ ->\r
-          {erreur, "Login pas trouvé : " ++ Login}\r
+          {error, "Login pas trouvé : " ++ Login}\r
     end;\r
  % Affichage d'un user en fonction de son id\r
  print_user(Id) when is_integer(Id) ->\r
        {ok, User} ->\r
           print_user(User);\r
        _ ->\r
-          {erreur, "Id pas trouvé : " ++ integer_to_list(Id)}\r
+          {error, "Id pas trouvé : " ++ integer_to_list(Id)}\r
     end.\r
  \r
  % along with Euphorik.  If not, see <http://www.gnu.org/licenses/>.
  %
  % Module with some useful stuffs.
 -% @author G.Burri
  
  
  -module(euphorik_common).
 +-author("Greg Burri <greg.burri@gmail.com>").
  -export([
     ceiling/1,
     delta_date_ms/2,
@@@ -42,7 -42,7 +42,7 @@@ ceiling(X) -
     end.
  
  
- % Retourne la difference entre deux timestamp (erlang:now()) en miliseconde
+ % Retourne la difference entre deux timestamp (erlang:timestamp()) en miliseconde
  delta_date_ms(D1, D2) ->
     1000000000 * abs(element(1, D1) - element(1, D2)) + 1000 * abs(element(2, D1) - element(2, D2)) + trunc(abs(element(3, D1) - element(3, D2)) / 1000).