#page.about {
}
+
+#page.about .faqCouleurProprietaire {
+ color: #31732f;
+}
+#page.about .faqCouleurReponse {
+ color: #bf2911;
+}
+#page.about .faqCouleurRepondu {
+ color: #84196c;
+}
#page.about {
}
+
+#page.about .faqCouleurProprietaire {
+ color: #31732f;
+}
+#page.about .faqCouleurReponse {
+ color: #bf2911;
+}
+#page.about .faqCouleurRepondu {
+ color: #84196c;
+}
\ No newline at end of file
zoom: 1
}
#page.minichat #conversations div.reponse {
- border-color: #bd7a11
+ border-color: #bf2911
}
#page.minichat #conversations div.repondu {
- border-color: #b711bd
+ border-color: #84196c
}
#page.minichat #conversations div.proprietaire {
- border-color: #bd1129
+ border-color: #31732f
}
#page.minichat #conversations div.systeme {
background-color: #555555
\r
=== v1.0.1 ===
* Pouvoir afficher les utilisateurs (print_users(admin)) qui sont admin\r
-* Mettre dans la FAQ la signification des couleurs associées aux messages.\r
-* Ne pas pouvoir poster avec "<nick>"\r
+* Ne pas pouvoir poster avec "<nick>" -> mettre en constante\r
* Ajouter euphorik_common.erl au repo !!\r
* Compilation :\r
* Compiler avec le flag +debug_info pour le developpement\r
[ok] Cleaner le code (erl, js, xhtml, css) et eventuellement profiler un peu (le refresh est lent sous opera)\r
[ok] Afficher l'ip dans le print_users().
[ok] Enlever le petit carré mis en couleur et mettre le pseudo + date en couleur à la place
-
+[ok] Mettre dans la FAQ la signification des couleurs associées aux messages.
+
=== Bugs ===
1 : Critique
2 : Urgent
[2] Le changement de skin n'est pas mémorisé lorsque l'on est pas connecté (normal puisque le style est mémorisé dans le profil)
* solution 1 : permettre le changement de skin uniquement pour les personnes enregistré ?
* solution 2 : mémoriser le skin courant dans un cookie\r
-[2] Il est possible d'envoyer plusieurs fois le même message en pressant très rapidement plusieurs fois sur ENTER... (à vérifier)\r
[2] Après l'ajout d'une image il n'est pas possible de naviger depuis celle ci vers les autres images en utilisant Next et Prev de lightbox après l'avoir affich\r
[2] Plein de bugs sous MS internet explorer 7
* click sur le lien du conv insère sont id systématiquement au début du message
* le changement de skin foire complétement
-[2] griser le login dans le profil pour montrer qu'on ne peut pas l'éditer
[3] Quand on revient en arrière dans firefox le message en rédaction est perdu
* Pas sous Opera, apparemment Firefox recharge toute la page (donc impossible qu'il puisse remettre le message)
* Eventuellement sauvegarder le message en rédaction dans le profile...\r
[ok] Lors d'un logout il faut faire un full refresh (pour mettre à jour les messages auquel on répond par exemple)
[ok] Après être passé de la page Admin à Chat le client continu de réaliser de temps en temp des requêtes "lists_banned_ips"
* action=%7B%22action%22%3A%22list_banned_ips%22%2C%22cookie%22%3A%22<<cookie>>%22%7D
+[ok] Le widget select qui permet la sélection des css n'est pas initialisé correctement au chargement du site
+[ok] Il est possible d'envoyer plusieurs fois le même message en pressant très rapidement plusieurs fois sur ENTER... (à vérifier)
+[ok] griser le login dans le profil pour montrer qu'on ne peut pas l'éditer
=== Idées ===\r
Une fois l'idée validée elle est déplacée dans une version à venir.\r
* Conversation
* Message
+=== Compilation avec +native ===
+Mesure du temps d'execution pour :
+ * euphorik_test:start(20, 20) : 20 personnes postants 20 messages
+ sans +native : 3:39
+ avec +native : 3.41
+
+Conclusion :
+ l'ajout de +native n'a pas de répercussions significatives sur les performances, cela provient
+ surement du fait que le gros du travail est fait du coté de la base de donnée Mnesia.
=== Séquences ===
* Attente de nouveaux messages
{
if (!thisUtil.bulleActive)
return
-
+
var m = $("#messageBulle")
var f = $("#flecheBulle")
+ // remplie le paragraphe de la bulle avec le message
$("p", m).html(message)
-
+
+ // réinitialise la position, évite le cas ou la boite est collé à droite et remplie avec un texte la faisant dépassé
+ // dans ce cas la hauteur n'est pas calculé correctement
+ m.css("top", 0).css("left", 0)
+
var positionFleche = {
left : element.offset().left + element.width() / 2 - f.width() / 2,
top : element.offset().top - f.height()
return
this.css = css
- $("link#cssPrincipale").attr("href", this.css)
- this.majMenu()\r
- \r
+ $("link#cssPrincipale").attr("href", this.css)\r
if (this.autoflush) this.flush(true)
}
this.conversations = data["conversations"]
this.majBulle()
+ this.majCssSelectionee()
}
}
Client.prototype.majMenu = function()
{
- // TODO : à virer : ne plus changer de style de display ... spa beau .. ou trouver une autre méthode
- // var displayType = this.css == "css/3/euphorik.css" ? "block" : "inline" //this.client
displayType = "block"
$("#menu .admin").css("display", this.ekMaster ? displayType : "none")
this.util.bulleActive = this.viewTooltips
}
+/**
+ * Met à jour la css sélectionnée, lors du chargement des données.
+ */
+Client.prototype.majCssSelectionee = function()
+{
+ // extraction du numéro de la css courante
+ var numCssCourante = this.css.match(/^.*?\/(\d)\/.*$/)
+ if (numCssCourante[1] != undefined)
+ {
+ $("#menuCss option").removeAttr("selected")
+ $("#menuCss option[value=" + numCssCourante[1]+ "]").attr("selected", "selected")
+ }
+}
+
Client.prototype.slap = function(userId, raison)
{
var thisClient = this
this.regexMessageTagMatch = /\{.*?\}>/g
this.regexMessageTagReplace = /^(.*?\{.*?\}>)*/
+
+ // permet d'éviter d'envoyer plusieurs messages simultanément en pressant
+ // rapidement sur "enter" par exemple
+ this.envoieMessageEnCours = false
}
PageMinichat.prototype.contenu = function()
}
PageMinichat.prototype.envoyerMessage = function(pseudo, message)
-{
+{
var thisPageMinichat = this
\r
// (un pseudo vide est autorisé)
this.client.pseudo = pseudo\r
+ // évite le double post
+ if (this.envoieMessageEnCours)
+ {
+ this.util.messageDialogue("Message en cours d'envoie...")
+ return
+ }
+ this.envoieMessageEnCours = true
+
;; dumpObj(this.getJSONMessage(pseudo, message, repondA))\r
jQuery.ajax(\r
{\r
dataType : "json",
beforeSend : function(xmlHttpRequest)
{
+ // TODO : ça marche ça ??
xmlHttpRequest.setRequestHeader("X-Requested-With", "")
},\r
success : function(data, textStatus)\r
else if (data["reply"] == "error")
{
thisPageMinichat.util.messageDialogue(data["error_message"])
- } \r
+ }
+ thisPageMinichat.envoieMessageEnCours = false\r
+ },
+ error : function()
+ {
+ thisPageMinichat.envoieMessageEnCours = false
}\r
}\r
)
var DOM = $(XHTML)
DOM.each(
function()
- {
+ {
$(".lienConv", this).click(
function(event)
{
funClickOuvrirConv(parseInt(racine.substring(1, racine.length - 1), 36))
return false
}
+ )
+
+ thisConversation.util.infoBulle("Extraction de la conversation", $(".extraire", this))
+
+ // l'id du message
+ var idMess36 = $(this).attr("id").substr(4)
+ var idMess = parseInt(idMess36, 36)
+
+ $(this).click(
+ function(event)
+ {
+ if ($(event.target).is("a") || $(event.target).parents("#outilsBan").length > 0) return
+
+ // extraction d'une conversation
+ if ($(event.target).is(".extraire"))
+ {
+ funClickOuvrirConv(idMess)
+ return
+ }
+
+ var valCourant = $("input.message").val()
+ if (valCourant == undefined) valCourant = ""
+ var tag = $(".pseudo span.ident", this).text() + "{" + idMess36 + "}" + ">"
+ if (valCourant.indexOf(tag, 0) == -1)
+ $("input.message").val(tag + " " + valCourant)
+ thisConversation.util.setCaretToEnd($("form input.message")[0])
+ }
+ )
+
+ // mise en évidence de la conversation
+ $(".entete", this).hover(
+ function()
+ {
+ thisConversation.decolorerEntetes()
+ thisConversation.afficherConversation(idMess)
+ },
+ // quand on sort de l'entête du message la mise en évidence est enlevée
+ function()
+ {
+ thisConversation.enleverMiseEnEvidence()
+ thisConversation.decolorerEntetes()
+ thisConversation.colorerEntetes()
+ }
)
if (thisConversation.client.viewTimes)
$("#outilsBan", this).hide()
}
)
-
- thisConversation.util.infoBulle("Extraction de la conversation", $(".extraire", this))
-
- // l'id du message
- var idMess36 = $(this).attr("id").substr(4)
- var idMess = parseInt(idMess36, 36)
-
- $(this).click(
- function(event)
- {
- if ($(event.target).is("a") || $(event.target).parents("#outilsBan").length > 0) return
-
- // extraction d'une conversation
- if ($(event.target).is(".extraire"))
- {
- funClickOuvrirConv(idMess)
- return
- }
-
- var valCourant = $("input.message").val()
- if (valCourant == undefined) valCourant = ""
- var tag = $(".pseudo span.ident", this).text() + "{" + idMess36 + "}" + ">"
- if (valCourant.indexOf(tag, 0) == -1)
- $("input.message").val(tag + " " + valCourant)
- thisConversation.util.setCaretToEnd($("form input.message")[0])
- }
- )\r
- \r
- // mise en évidence de la conversation
- $(".entete", this).hover(\r
- function()\r
- {
- thisConversation.decolorerEntetes()\r
- thisConversation.afficherConversation(idMess)\r
- },
- // quand on sort de l'entête du message la mise en évidence est enlevée
- function()
- {
- thisConversation.enleverMiseEnEvidence()
- thisConversation.decolorerEntetes()
- thisConversation.colorerEntetes()
- }
- )
}
)
DOM.prependTo("#conversations #" + this.getId())
% Affiche N user trié par leur date de dernière connexion.
-print_users(N) ->
+% 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),
resultat_transaction(mnesia:transaction(fun() ->
C = cursor(
qlc:keysort(
#user.date_derniere_connexion,
- q([E || E <- mnesia:table(user)]),
+ 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}]
end)).
+% Affiche tous les users.
+print_users(Opt) ->
+ print_users(all_remaining, Opt).
+
% Affiche tous les users.
print_users() ->
- print_users(all_remaining).
-
+ print_users(all_remaining, []).
print_user(User) when is_record(User, user) ->
#user{id = Id, pseudo = Pseudo, login = Login, ek_master = Ek_master, date_derniere_connexion = Date, last_ip = IP} = User,
end,
[euphorik_minichat_conversation, euphorik_protocole, euphorik_requests, euphorik_bd, euphorik_daemon]
).
-
-
+
\ No newline at end of file
\r
-module(euphorik_requests).\r
--export([\r
- tester/0,\r
- out/1\r
-]).\r
+-export([out/1]).\r
-include_lib("xmerl/include/xmerl.hrl").\r
-include_lib("yaws/include/yaws_api.hrl").
\r
-% Test du module (TODO)\r
-tester() ->
- que_dal.\r
-
-\r
out(A) ->
%io:format("~p~n", [A]), % utilisé parfois pendant le debug
IP = case inet:peername(A#arg.clisock) of
{ok, {Adresse, _Port}} -> Adresse;
_ -> inconnue
end,
- % passive -> active, permet de recevoir {tcp_closed, _} lorsque le socket se ferme\r
- inet:setopts(A#arg.clisock, [{active, true}]),\r
+ % passive -> active, permet de recevoir {tcp_closed, _} lorsque le socket se ferme
+ % keepalive -> true, evite que des firewalls coupe la connexion TCP sans prévenir\r
+ inet:setopts(A#arg.clisock, [{active, true}, {keepalive, true}]),\r
{value, {_, Contenu}} = lists:keysearch("action", 1, yaws_api:parse_post(A)),\r
Ret = traiter_donnees(Contenu, IP),
{content, "application/json", Ret}.\r
-module(euphorik_test).
--export([start/1, stop/1]).
+-export([start/2, stop/1]).
-include("../include/euphorik_bd.hrl").
% N est le nombre d'utilisateur
-start(N) ->
+% M est le nombre de message que chaque utilisateur va poster
+start(N, M) ->
Ids = creer_users(N),
lists:map(
fun(Id) ->
fun() ->
{A1, A2, A3} = now(),
random:seed(A1, A2, A3),
- loop(Id)
+ loop(Id, M)
end
)
end,
tire_element_rand(N-1, L, [E | Elements])
end.
-
-loop(User_id) ->
+loop(User_id, 0) ->
+ io:format("~p a fini~n", [User_id]);
+loop(User_id, M) ->
% attend un temp aléatoire compris entre 1 sec et 5 sec
timer:sleep(1000 * random:uniform(5)),
% poste un message aléatoire par une personne aléatoire répondant à des messages aléatoires
{Message, Repond_a} = {message_rand(), messages_id_rand()},
io:format("~p poste ~p et repond a ~w~n", [User_id, Message, Repond_a]),
euphorik_bd:nouveau_message(Message, User_id, Repond_a),
- loop(User_id).
+ loop(User_id, M - 1).
\ No newline at end of file
\r
<h3>C'est quoi un "troll de la semaine" ?</h3>\r
<p>Simplement un sujet de débat à tendance trollifique. Chaque lundi à 3 heure du matin un nouveau troll est choisi au hasard parmis ceux proposés par les administrateurs.</p>\r
-\r
+
+<h3>A quoi correspondent les couleurs liés aux messages ?</h3>
+<ul>
+ <li><span class="faqCouleurProprietaire">Vert</span> : messages appartenant à l'utilisateur courant.</li>
+ <li><span class="faqCouleurReponse">Rouge</span> : messages répondant à l'utilisateur courant.</li>
+ <li><span class="faqCouleurRepondu">Bleu</span> : messages auquels l'utilisateur courant à répondu.</li>
+</ul>\r
<h3>Quels-sont les navigateurs supportés ?</h3>
<p>Le site a été testé sous "Firefox 2 et 3", "Safari 3" et "Opera 9".