<path
inkscape:export-ydpi="128.38945"
inkscape:export-xdpi="128.38945"
- inkscape:export-filename="/home/gburri/projets/euphorik/img/css1/fleche_reponse.png"
+ inkscape:export-filename="/home/gburri/projets/euphorik/trunk/styles/1/img/fleche_proprietaire.png"
sodipodi:nodetypes="cccc"
id="path3464"
d="M 595.4055,142.72403 L 600.26686,149.16555 L 595.4055,155.34191 L 595.4055,142.72403 z"
- style="fill:#31732f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
+ style="fill:#350a0a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
<path
inkscape:export-ydpi="128.38945"
inkscape:export-xdpi="128.38945"
<script type="text/javascript" src="js/md5.js" prod="delete"></script>
<script type="text/javascript" src="js/json2.js" prod="delete"></script>
<script type="text/javascript" src="js/comet.js" prod="delete"></script>
+ <script type="text/javascript" src="js/betterjs.js" prod="delete"></script>
<script type="text/javascript" src="js/euphorik.js" ></script>
--- /dev/null
+// tout un tas d'améliorations de JavaScript ;)
+
+
+/**
+ * Pour chaque propriété de l'objet execute f(p, v) ou p est le nom de la propriété et v sa valeur.
+ * Ne parcours pas les propriétés des prototypes.
+ * FIXME : Normalement : Object.prototype.each = function(f) mais non supporté par jquery
+ */
+//Object.prototype.each = function(f) {
+var objectEach = function(o, f) {
+ for (var k in o) {
+ if (o.hasOwnProperty(k)) {
+ f(k, o[k]);
+ }
+ }
+};
+
+var objectMemberCount = function(o) {
+ var nb = 0;
+ for (var k in o) {
+ if (o.hasOwnProperty(k)) {
+ nb += 1;
+ }
+ }
+ return nb;
+};
+
+Array.prototype.each = function(f) {
+ for (var i = 0; i < this.length; i++) {
+ f(i, this[i]);
+ }
+};
+
+Array.prototype.map = function(f) {
+ for (var i = 0; i < this.length; i++) {
+ this[i] = f(this[i])
+ }
+};
+
+String.prototype.trim = function() {
+ return jQuery.trim(this) // anciennement : this.replace(/^\s+|\s+$/g, "");
+}
+
+String.prototype.ltrim = function() {
+ return this.replace(/^\s+/, "");
+}
+
+String.prototype.rtrim = function() {
+ return this.replace(/\s+$/, "");
+}
+
+
+/**
+ * Voir : http://www.coolpage.com/developer/javascript/Correct%20OOP%20for%20Javascript.html
+ *
+ * Exemple :
+ *
+ * function Mammal(name) {
+ * this.name = name;
+ * }
+ *
+ * Cat.Inherits(Mammal);
+ * function Cat(name) {
+ * this.Super(Mammal, name);
+ * }
+ */
+/*Object.prototype.Super = function(parent) {
+ if(arguments.length > 1) {
+ parent.apply( this, Array.prototype.slice.call( arguments, 1 ) );
+ } else {
+ parent.call( this );
+ }
+}
+Function.prototype.Inherits = function(parent) {
+ this.prototype = new parent();
+ this.prototype.constructor = this;
+}*/
// You should have received a copy of the GNU General Public License
// along with Euphorik. If not, see <http://www.gnu.org/licenses/>.
-/**
- * Contient la base javascript pour le site euphorik.ch.
- * Chaque page possède son propre fichier js nommé "page<nom de la page>.js".
- * Auteur : GBurri
- * Date : 6.11.2007
- */
-
// tout euphorik est contenu dans cet objet
var euphorik = {}
-// ;; euphorik.include =
- //;; euphorik.include = function(f) { var s = document.createElement('script'); s.type = 'text/javascript'; s.src = "js/" + f + ".js"; document.getElementsByTagName('head')[0].appendChild(s); }
-
-
-// version jQuery : function(f) { jQuery.ajax({async : false, url : "js/" + f + ".js", dataType : "script"}) }
-// mais comme il n'est pas encore chargé...
-;; euphorik.include = function(f) {
-;; var req, url = 'js/' + f + '.js'
-;; if (window.XMLHttpRequest) {
-;; req = new XMLHttpRequest(); req.open("GET", url, false); req.send(null);
-;; } else if (window.ActiveXObject) {
-;; req = new ActiveXObject((navigator.userAgent.toLowerCase().indexOf('msie 5') != -1) ? "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP");
-;; if (req) { req.open("GET", url, false); req.send(); }
-;; }
-;; if (req!==false) { if (req.status==200) { window.eval(req.responseText); } else if (req.status==404) { alert("erreur de chargement (404) de : " + url) } }
-;; };
-
-
-// tout un tas d'améliorations de JavaScript ;)
-/**
- * Pour chaque propriété de l'objet execute f(p, v) ou p est le nom de la propriété et v sa valeur.
- * Ne parcours pas les propriétés des prototypes.
- * FIXME : Normalement : Object.prototype.each = function(f) mais non supporté par jquery
- */
-//Object.prototype.each = function(f) {
-var objectEach = function(o, f) {
- for (var k in o) {
- if (o.hasOwnProperty(k)) {
- f(k, o[k]);
- }
- }
-};
-
-var objectMemberCount = function(o) {
- var nb = 0;
- for (var k in o) {
- if (o.hasOwnProperty(k)) {
- nb += 1;
- }
- }
- return nb;
-};
-
-Array.prototype.each = function(f) {
- for (var i = 0; i < this.length; i++) {
- f(i, this[i]);
- }
-};
-
-Array.prototype.map = function(f) {
- for (var i = 0; i < this.length; i++) {
- this[i] = f(this[i])
- }
-};
-
-String.prototype.trim = function() {
- return jQuery.trim(this) // anciennement : this.replace(/^\s+|\s+$/g, "");
-}
-
-String.prototype.ltrim = function() {
- return this.replace(/^\s+/, "");
-}
-
-String.prototype.rtrim = function() {
- return this.replace(/\s+$/, "");
-}
-
-
-/**
- * Voir : http://www.coolpage.com/developer/javascript/Correct%20OOP%20for%20Javascript.html
- *
- * Exemple :
- *
- * function Mammal(name) {
- * this.name = name;
- * }
- *
- * Cat.Inherits(Mammal);
- * function Cat(name) {
- * this.Super(Mammal, name);
- * }
- */
-/*Object.prototype.Super = function(parent) {
- if(arguments.length > 1) {
- parent.apply( this, Array.prototype.slice.call( arguments, 1 ) );
- } else {
- parent.call( this );
- }
-}
-Function.prototype.Inherits = function(parent) {
- this.prototype = new parent();
- this.prototype.constructor = this;
-}*/
-
-
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
// le main
$(document).ready(
var client = new euphorik.Client(util)
var pages = new euphorik.Pages()
-
// connexion vers le serveur (utilise un cookie qui traine)
client.connexionCookie()
update_date_derniere_connexion/1,\r
update_ip/2,\r
update_pseudo_user/2,\r
- print_users/0,\r
- print_users/1,\r
- print_user/1,\r
user_by_cookie/1, \r
user_by_id/1, \r
user_by_login/1,\r
user_by_login_password/2,\r
user_by_mess/1,\r
- toggle_ek_master/1,\r
css_from_user_cookie/1,\r
is_ek_master_from_cookie/1,\r
\r
nouveau_user(Login, Password, Cookie, Profile) ->\r
F = fun() ->\r
Id = nouvel_id(user),\r
- User = #user{id = Id, cookie = Cookie, login = Login, password = Password, date_creation = now(), date_derniere_connexion = now(), profile = Profile#profile{pseudo = login}},\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
end\r
end\r
).\r
- \r
- \r
-% Affiche N user trié par leur date de dernière connexion.\r
-% Opt est une liste d'option d'affichage :\r
-% * ekmaster : n'affiche que les admins\r
-print_users(N, Opt) ->\r
- AfficheQueLesEkMaster = lists:any(fun(O) -> O =:= ekmaster end, Opt),\r
- resultat_transaction(mnesia:transaction(fun() ->\r
- C = cursor(\r
- qlc:keysort(\r
- #user.date_derniere_connexion, \r
- if AfficheQueLesEkMaster ->\r
- q([E || E <- mnesia:table(user), E#user.ek_master =:= true]);\r
- true ->\r
- q([E || E <- mnesia:table(user)])\r
- end,\r
- [{order, descending}]\r
- ),\r
- [{tmpdir, ?KEY_SORT_TEMP_DIR}]\r
- ),\r
- Users = qlc:next_answers(C, N),\r
- lists:foreach(\r
- fun(U) ->\r
- print_user(U)\r
- end,\r
- Users\r
- ),\r
- qlc:delete_cursor(C)\r
- end)).\r
- \r
- \r
-% Affiche tous les users.\r
-print_users(Opt) ->\r
- print_users(all_remaining, Opt).\r
-\r
-% Affiche tous les users.\r
-print_users() ->\r
- print_users(all_remaining, []).\r
- \r
-print_user(User) when is_record(User, 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
- "~4w : ~10.10..s(~10.10..s) ~s ~2w.~2.2.0w.~w - ~2wh~2.2.0w~n",\r
- [ \r
- Id,\r
- if Ek_master -> "*"; true -> "" end ++ Pseudo,\r
- Login,\r
- euphorik_common:serialize_ip(IP),\r
- Jour, Mois, Annee, Heure, Min\r
- ]\r
- );\r
-% Affichage d'un user en fonction de son login\r
-print_user(Login) when is_list(Login) ->\r
- case user_by_login(Login) of\r
- {ok, User} ->\r
- print_user(User);\r
- _ ->\r
- {erreur, "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
- case user_by_id(Id) of \r
- {ok, User} ->\r
- print_user(User);\r
- _ ->\r
- {erreur, "Id pas trouvé : " ++ integer_to_list(Id)}\r
- end.\r
- \r
+ \r
\r
% Est-ce qu'un utilisateur existe en fonction de son cookie ?\r
% Renvoie {ok, User} ou erreur\r
end\r
)).\r
\r
- \r
-toggle_ek_master(User_id) ->\r
- resultat_transaction(mnesia:transaction(\r
- fun() ->\r
- Users = e(q([E || E <- mnesia:table(user), E#user.id =:= User_id]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]),\r
- case Users of\r
- [User] ->\r
- mnesia:write(User#user{ek_master = not User#user.ek_master});\r
- _ -> erreur\r
- end\r
- end\r
- )).\r
- \r
\r
% Renvoie une chaine représentant le cookie ou undefined si pas trouvé.\r
css_from_user_cookie(Cookie) ->\r
reset/0,
update/0,
backup/1,
- restore/1
+ restore/1,
+
+ toggle_ek_master/1,
+ print_users/0,
+ print_users/1,
+ print_user/1
]).
-import(qlc, [e/2, q/1, cursor/2]).
-include("../include/euphorik_bd.hrl").
% Renvoie le fichier (avec le chemin) correspondant à la version Version, par exemple : "/var/euphorik/BD/backups/backup1"
fichier_backup(Version) ->
mnesia:system_info(directory) ++ "/backups/" ++ if is_integer(Version) -> "backup" ++ integer_to_list(Version); true -> Version end.
+
+
+toggle_ek_master(User_id) ->
+ euphorik_bd:resultat_transaction(mnesia:transaction(
+ fun() ->
+ Users = e(q([E || E <- mnesia:table(user), E#user.id =:= User_id]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]),
+ case Users of
+ [User] ->
+ mnesia:write(User#user{ek_master = not User#user.ek_master});
+ _ -> erreur
+ end
+ end
+ )).
+
+
+% Affiche N user trié par leur date de dernière connexion.
+% Opt est une liste d'option d'affichage :
+% * ekmaster : n'affiche que les admins
+print_users(N, Opt) ->
+ AfficheQueLesEkMaster = lists:any(fun(O) -> O =:= ekmaster end, Opt),
+ euphorik_bd:resultat_transaction(mnesia:transaction(fun() ->
+ C = cursor(
+ qlc:keysort(
+ #user.date_derniere_connexion,
+ if AfficheQueLesEkMaster ->
+ q([E || E <- mnesia:table(user), E#user.ek_master =:= true]);
+ true ->
+ q([E || E <- mnesia:table(user)])
+ end,
+ [{order, descending}]
+ ),
+ [{tmpdir, ?KEY_SORT_TEMP_DIR}]
+ ),
+ Users = qlc:next_answers(C, N),
+ lists:foreach(
+ fun(U) ->
+ print_user(U)
+ end,
+ Users
+ ),
+ qlc:delete_cursor(C)
+ end)).
+
+
+% Affiche tous les users.
+print_users(Opt) ->
+ print_users(all_remaining, Opt).
+
+% Affiche tous les users.
+print_users() ->
+ print_users(all_remaining, []).
+
+print_user(User) when is_record(User, user) ->
+ #user{id = Id, profile = #profile{pseudo = Pseudo}, login = Login, ek_master = Ek_master, date_derniere_connexion = Date, last_ip = IP} = User,
+ {{Annee, Mois, Jour}, {Heure, Min, _}} = calendar:now_to_local_time(Date),
+ io:format(
+ % id pseudo (login) IP Jour Mois Année Heure Minute
+ "~4w : ~10.10..s(~10.10..s) ~s ~2w.~2.2.0w.~w - ~2wh~2.2.0w~n",
+ [
+ Id,
+ if Ek_master -> "*"; true -> "" end ++ Pseudo,
+ Login,
+ euphorik_common:serialize_ip(IP),
+ Jour, Mois, Annee, Heure, Min
+ ]
+ );
+% Affichage d'un user en fonction de son login
+print_user(Login) when is_list(Login) ->
+ case euphorik_bd:user_by_login(Login) of
+ {ok, User} ->
+ print_user(User);
+ _ ->
+ {erreur, "Login pas trouvé : " ++ Login}
+ end;
+% Affichage d'un user en fonction de son id
+print_user(Id) when is_integer(Id) ->
+ case euphorik_bd:user_by_id(Id) of
+ {ok, User} ->
+ print_user(User);
+ _ ->
+ {erreur, "Id pas trouvé : " ++ integer_to_list(Id)}
+ end.
+
\ No newline at end of file
creer_users(N, []).
creer_users(0, Ids) -> lists:map(fun(#user{id = Id}) -> Id end, Ids);
creer_users(N, Ids) ->
- creer_users(N - 1, [euphorik_bd:nouveau_user(mot_rand(random:uniform(4) + 4), "", "") | Ids ]).
+ creer_users(N - 1, [euphorik_bd:nouveau_user(mot_rand(random:uniform(4) + 4), "", "", #profile{}) | Ids ]).
% crée un message aléatoire et le renvoie
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1">
<file>
<url>modules/erl/euphorik_protocole.erl</url>
- <line>677</line>
+ <line>713</line>
</file>
<file>
<url>js/pageMinichat.js</url>
\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\r
+# - création de unit tests (voir eunit) et validation avant la mise en prod
+
+# Utilisation :
+# tools.rb <commande> <args>
+# commandes :
+# \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
end\r
\r
# css, images, html, etc..\r
- 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
+ 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)
+
end\r
\r
# contrôle des fichiers js à l'aide de jslint\r