* Cleaner le code (erl, js, xhtml, css) et eventuellement profiler un peu (le refresh est lent sous opera)
* Pouvoir afficher les utilisateurs (print_users(admin)) qui sont admin\r
* Afficher l'ip dans le print_users().\r
-* Limiter la mise en évidence de la conversation lorsque le curseur se trouve sur les pseudos\r
-* Mettre dans la FAQ la signification des couleurs associées aux messages.\r
+* Limiter la mise en évidence de la conversation lorsque le curseur se trouve sur les pseudos
* Enlever le petit carré mis en couleur et mettre le pseudo + date en couleur à la place\r
+* Mettre dans la FAQ la signification des couleurs associées aux messages.\r
* Ne pas pouvoir poster avec "<nick>"\r
* Lorsque le curseur se trouve sur le nom d'une personne à qui l'on répond n'highliter que cette conversation !! (très bonne idée)\r
=== v1.1 ===\r
2 : Urgent
3 : Peu grave\r
\r
+[1] Il arrive qu'après le poste d'un message le refresh ne se fasse plus, peut-être une "race-condition" dans la classe PageEvent de euphorik.js\r
+[1] 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"\r
+ * action=%7B%22action%22%3A%22list_banned_ips%22%2C%22cookie%22%3A%22<<cookie>>%22%7D\r
[1] Traiter les tags TODO et FIXME dans le code
[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é ?
{
return '<h1>Trolls</h1>\
<p>Un troll est un sujet à débat, en général une question, affiché sur la page principale.</p>\
- <p>Chaque semaine un troll est choisit au hasard parmis les trolls proposés et devient le troll de la semaine.</p>\
+ <p>Chaque semaine un troll est choisi au hasard parmis les trolls proposés et devient le troll de la semaine.</p>\
<form action="" id="nouveauTroll">\
<p>\
<input class="troll" name="troll" type="text" maxlength="500" value=""></input>\
function(){},
function(event)
{
- $("#conversations .message").removeClass("cache")
- thisConversation.messageOver = null
+ thisConversation.enleverMiseEnEvidence()
}
)
}
+/**
+ *
+ */
+Conversation.prototype.enleverMiseEnEvidence = function()
+{
+ $("#conversations .message").removeClass("cache")
+ this.messageOver = null
+}
+
/**
* Défini la page courante et s'il l'on se trouve sur la dernière page.
* @pageCourante la page courante
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
-
- // l'id du message
- var idMess = $(this).attr("id").substr(4)
-
+
// extraction d'une conversation
if ($(event.target).is(".extraire"))
{
- funClickOuvrirConv(parseInt(idMess, 36))
+ funClickOuvrirConv(idMess)
return
}
var valCourant = $("input.message").val()
if (valCourant == undefined) valCourant = ""
- var tag = $(".pseudo span.ident", this).text() + "{" + idMess + "}" + ">"
+ 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])
}
)
+
// Q : pourquoi pas un .hover ?
// R : simplement pour éviter que lorsqu'un message arrive cela n'affecte la conversation actuellement mise en évidence (uniquement pour Firefox)
- .mousemove(
+ $(".entete", this).mousemove(
function(e)
{
if (this !== thisConversation.messageOver)
{
- thisConversation.afficherConversation(this)
+ thisConversation.afficherConversation(idMess)
thisConversation.messageOver = this
}
}
+ ).hover(
+ function(){},
+ // quand on sort de l'entête du message la mise en évidence est enlevée
+ function()
+ {
+ thisConversation.enleverMiseEnEvidence()
+ }
)
}
)
/**
* Etablit une liste des messages à mettre en evidence et des messages à cacher.
* Puis applique un plan diabolique.
- * @param element un message de la liste des messages
+ * @param id l'id du message
*/
-Conversation.prototype.afficherConversation = function(element)
-{
- // cherche le message selectionné
- var id = parseInt($(element).attr("id").substr(4), 36)
-
+Conversation.prototype.afficherConversation = function(id)
+{
var message = this.messagesParId[id]
if (message == undefined) return
$(rep_ebin)/euphorik_requests.beam \\r
$(rep_ebin)/euphorik_protocole.beam \
$(rep_ebin)/euphorik_daemon.beam \
+$(rep_ebin)/euphorik_common.beam \
$(rep_ebin)/euphorik_test.beam
\r
# Module pour la gestion des données persistante la BD\r
$(rep_ebin)/euphorik_daemon.beam: $(rep_erl)/euphorik_daemon.erl $(rep_include)/euphorik_defines.hrl\r
erlc $(erlc_params)
+# Module avec plein de bordel dedant
+$(rep_ebin)/euphorik_common.beam: $(rep_erl)/euphorik_common.erl
+ erlc $(erlc_params)
+
# Module dédié au tests
$(rep_ebin)/euphorik_test.beam: $(rep_erl)/euphorik_test.erl $(rep_erl)/euphorik_bd.erl $(rep_include)/euphorik_bd.hrl
erlc $(erlc_params)\r
messages/2,\r
messages/3,
message_by_id/1,
- message_by_id_sans_transaction/1,
messages_by_ids/1,
message_existe/1,
reponses/0,
print_user(User) when is_record(User, user) ->
- #user{id = Id, pseudo = Pseudo, login = Login, ek_master = Ek_master, date_derniere_connexion = Date} = User,
+ #user{id = Id, 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(
- "~4w : ~10.10..s~10.10..s ~2w.~2.2.0w.~w - ~2wh~2.2.0w~n",
+ % 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 ++ ")",
+ Login,
+ euphorik_common:serialize_ip(IP),
Jour, Mois, Annee, Heure, Min
]
);
message_by_id(Id) ->
resultat_transaction(mnesia:transaction(
fun() ->
- message_by_id_sans_transaction(Id)
+ case mnesia:read({minichat, Id}) of
+ [] -> erreur;
+ [M] ->
+ {ok, M#minichat{contenu = contenu_message(M)}}
+ end
end
)).
-message_by_id_sans_transaction(Id) ->
- case mnesia:read({minichat, Id}) of
- [] -> erreur;
- [M] ->
- {ok, M#minichat{contenu = contenu_message(M)}}
- end.
% Renvoie le contenu d'un message donnée, à utiliser à l'intérieur d'une transaction.
fun() ->
lists:foldr(
fun(Id, Acc) ->
- case euphorik_bd:message_by_id_sans_transaction(Id) of
+ case euphorik_bd:message_by_id(Id) of
{ok, Message} ->
[{Message, parents(Id)} | Acc];
_ ->
) ->
case euphorik_bd:user_by_cookie(Cookie) of
{ok, #user{ek_master = true}} ->
- euphorik_bd:deban(unserialize_ip(IP)),
+ euphorik_bd:deban(euphorik_common:unserialize_ip(IP)),
json_reponse_ok();
_ ->
erreur("Seul les ekMaster peuvent connaitre la liste des ips bannies")
fun({IP, T, Users}) ->
{struct,
[
- {ip, serialize_ip(IP)},
+ {ip, euphorik_common:serialize_ip(IP)},
{remaining_time, format_minutes(T)},
{users, {array, lists:map(
fun({Pseudo, Login}) ->
]
}.
-
-serialize_ip(IP) ->
- lists:flatten(io_lib:format("~w.~w.~w.~w", tuple_to_list(IP))).
-
-
-unserialize_ip(IP) ->
- case io_lib:fread("~d.~d.~d.~d", IP) of
- {ok, [A, B, C, D], []} -> {A, B, C, D};
- _ -> erreur
- end.
-
% Formatage de minutes.
% par exemple : "1min", "45min", "1h23min", "1jour 2h34min"
\r
\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 choisit au hasard parmis ceux proposés par les administrateurs.</p>\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>Quels-sont les navigateurs supportés ?</h3>