form button {
font-size: 11px;
}
+form input[readonly] {
+ background-color: #d0c9aa
+}
/***** Les liens *****/
.lien, a {
form button {
font-size: 11px;
}
+form input[readonly] {
+ background-color: #484e46
+}
/***** Les liens *****/\r
.lien, a {\r
\r
=== v1.0 ===\r
* Cleaner le code (erl, js, xhtml, css) et eventuellement profiler un peu (le refresh est lent sous opera)
-* Pouvoir afficher les utilisateurs (print_users()) qui sont admin\r
+* 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
+* Enlever le petit carré mis en couleur et mettre le pseudo + date en couleur à la place\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
+* Revoir le système de conversation : \r
+ * Pouvoir extraire "toute la conversation" ou seulement une "sous conversation" (ce qui est actuellement le cas)\r
+ * Tous les messages auquels on répond doivent faire partie de la conversation !!\r
+ * Fermer temporairement une conversation (la réduire sous la forme d'un onglet)\r
+ * lien vers une conversation : http://www.euphorik.ch/?conv=45\r
* Mettre un icon (genre sablier ou truc qui tourne à la apple) lorsque le chat se charge (également lors d'un changement de page par exemple)\r
+ * L'icon apparait tout en haut (absolute)\r
* Simuler un réseau lent\r
-* Création d'un script ruby dans /tool pour apposer automatiquement une entête concernant la licence voir : http://www.gnu.org/licenses/gpl-howto.fr.html\r
- * Eventuellement mettre à jour automatiquement le Copyright (date) et les personnes responsables \r
-* Mise à jour automatique de la version dans le about en fonction du tag/branche courant ?\r
-* Modération des messages : les modos peuvent les supprimer\r
+* Mise à jour automatique de la version dans le about en fonction du tag/branche courant (lors de la mise en production) ?\r
* Tests de monter en charge coté serveur, analyse de la complexité (regarder du coté des TODO dans le code). Utiliser eventuellement Tsung\r
* Profiling pour améliorer les performances (client et serveur)\r
* traitementComplet() de euphorik.js est très très lent à executer\r
-* Traiter les tags TODO et FIXME dans le code\r
-* Pouvoir récupérer son mdp (ou en générer un autre) via son email\r
+* Pouvoir récupérer son mdp (ou en générer un autre) via son email. Marquer dans le profile que l'email sert à cela et n'est pas visible pas les autres personnes\r
+* (Pouvoir inverser le chat) tester la faisabilité\r
=== v1.2 ===\r
+* Avoir une liste d'amis dans le profile\r
+ * Pouvoir n'afficher les messages que des amis (et des personnes y répondant)\r
+ * Ajouter une personne à ses amis avec une toolbar similaire à celle de banissement\r
+* Création d'un script ruby dans /tool pour apposer automatiquement une entête concernant la licence voir : http://www.gnu.org/licenses/gpl-howto.fr.html\r
+ * Eventuellement mettre à jour automatiquement le Copyright (date) et les personnes responsables \r
+* Système de censure par les admins (suppression d'un message)\r
* Intégrer les totoz : http://www.totoz.eu/ (avec une limite de 3 par messages par exemple) \r
* avoir une option pour les cacher ou les voir\r
* Masquer systématiquement ceux qui dépassent une certaine taille en pixel\r
1 : Critique
2 : Urgent
3 : Peu grave\r
-
+\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é ?
* solution 2 : mémoriser le skin courant dans un cookie\r
4 : A discuter
A : Abandonné
ok : Implémenté
-
-[1] Possibilité d'extraire une conversation, on click (par l'intermediaire d'un petit bouton par exemple) sur un message et l'arbre de réponses correspondant s'affiche dans une colonne sur la gauche.
- * Il est possible d'ouvrir plusieurs conversations
- * Les messages faisant partie des conversations ne sont plus visibles dans le flux général
- * (une colonne peut avoir le focus, dans ce cas on répond automatiquement à la dernière personne qui nous a répondu)
- * Chaque colonne possède une entête avec le message d'origine et trois boutons :
- * un pour copier l'id de la conversation dans la textbox (voir point suivant)
- * un pour fermer la conversation
- * un pour créer une url vers cette conversation (un peu à la manière de google maps)
+\r
+[2] Indiquer le nombre de fois qu'un lien a été visité (également pour les images) (Bernie)\r
+ * Afficher quelque part les url les plus cliqués
[2] Raccourcis pour répondre aux conversations (genre CTRL+2 pour répondre au deuxième)\r
+[2] Système de news/event (Bernie)\r
[2] Syntaxe avancée des messagees :\r
* Possibilité d'utiliser les balises <i>, <b>, <code>, <q> (quoted text)\r
- * Utiliser la syntaxe de mediaWiki
+ * Utiliser la syntaxe de mediaWiki : http://en.wikipedia.org/wiki/Wikipedia:Cheatsheet
* La balise <hide> pour mettre des spoilers
-[2] Une option dans le profile pour se délogger automatiquement lorsque l'on quitte le site
-[2] Pouvoir cacher les dates\r
+[2] Une option dans le profile pour se délogger automatiquement lorsque l'on quitte le site\r
[3] Gestion de l'historique (calendrier)
[3] Idée de bernie :
* Pouvoir STFUER des personnes, lorsqu'elle envoie un message un autre truc à la con est écrit à la place
- * la phrase à la con est piché parmis une liste éditable depuis le panneau d'admin
+ * la phrase à la con est prise parmis une liste éditable depuis le panneau d'admin
* La stfuation se fait depuis le panel de bannissement (slap, stfu, kick, ban)
[4] Unifier tout le code en anglais (sauf les commentaires)
[4] Inscrire le nom de l'image dans les les liens vers des images (à la place de simplement [jpg] ou [gif])
[4] Système de trolls. Voir decription.txt.\r
\r
[A] smiles personnalisés, on peut en ajouter dans la préférence utilisateur.
-[ok] Pouvoir insérer des tags qui sont des liens vers des conversations, par exemple : {R4S} =~ /\{\w+\}/
-
+[ok] Pouvoir insérer des tags qui sont des liens vers des conversations, par exemple : {R4S} =~ /\{\w+\}/\r
+[ok] Possibilité d'extraire une conversation, on click (par l'intermediaire d'un petit bouton par exemple) sur un message et l'arbre de réponses correspondant s'affiche dans une colonne sur la gauche.\r
+ * Il est possible d'ouvrir plusieurs conversations\r
+ * Les messages faisant partie des conversations ne sont plus visibles dans le flux général\r
+ * (une colonne peut avoir le focus, dans ce cas on répond automatiquement à la dernière personne qui nous a répondu)\r
+ * Chaque colonne possède une entête avec le message d'origine et trois boutons :\r
+ * un pour copier l'id de la conversation dans la textbox (voir point suivant) \r
+ * un pour fermer la conversation\r
+ * un pour créer une url vers cette conversation (un peu à la manière de google maps)\r
+[ok] Pouvoir cacher les dates
=== Concurrents ===
http://www.phpfreechat.net/demo.fr.html
resultat_transaction(mnesia:transaction(fun() ->
C = cursor(
qlc:keysort(
- 9,
+ #user.date_derniere_connexion,
q([E || E <- mnesia:table(user)]),
[{order, descending}]
),
F = fun() ->
C = cursor(
qlc:keysort(
- 2,
+ #minichat.id,
q([E#minichat{contenu = contenu_message(E)} || E <- mnesia:table(minichat)]),
[{order, descending}]
),
% Renvoie une liste de message (voir #minichat de euphorik_bd.hrl) à partir d'une liste d'id (Ids).
+% TODO : optimisations ? serait-ce du O(n) ?
+% Bon de toutes façons on s'en fout c'est pas utilisé :)
messages_by_ids(Ids) ->
resultat_transaction(mnesia:transaction(
fun() ->
- % TODO : optimisations ? serait-ce du O(n) ?
e(qlc:keysort(
- 2,
+ #minichat.id,
q([E || E <- mnesia:table(minichat), lists:any(fun(Id) -> Id =:= E#minichat.id end, Ids)]),
[{order, ascending}]
),[{tmpdir, ?KEY_SORT_TEMP_DIR}])
trolls() ->
resultat_transaction(mnesia:transaction(
fun() ->
- e(qlc:keysort(2, q([T || T <- mnesia:table(troll)])), [{tmpdir, ?KEY_SORT_TEMP_DIR}])
+ e(qlc:keysort(#troll.id, q([T || T <- mnesia:table(troll)])), [{tmpdir, ?KEY_SORT_TEMP_DIR}])
end
)).
trolls(Last_id) ->
resultat_transaction(mnesia:transaction(
fun() ->
- e(qlc:keysort(2, q([T || T <- mnesia:table(troll), T#troll.id > Last_id, T#troll.date_post =:= undefined])), [{tmpdir, ?KEY_SORT_TEMP_DIR}])
+ e(qlc:keysort(#troll.id, q([T || T <- mnesia:table(troll), T#troll.id > Last_id, T#troll.date_post =:= undefined])), [{tmpdir, ?KEY_SORT_TEMP_DIR}])
end
)).
current_troll() ->
resultat_transaction(mnesia:transaction(
fun() ->
- % TODO : ya pas moyen de désigner le champs plutot qu'avec un nombre pour le tri ?
- C = cursor(qlc:keysort(5, q([T || T <- mnesia:table(troll), T#troll.date_post =/= undefined]), [{order, descending}]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]),
+ C = cursor(qlc:keysort(#troll.date_post, q([T || T <- mnesia:table(troll), T#troll.date_post =/= undefined]), [{order, descending}]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]),
R = case qlc:next_answers(C, 1) of
[T] -> T;
_ -> aucun
-include_lib("stdlib/include/qlc.hrl").
-import(lists, [reverse/1, any/2, map/2, sublist/3, filter/2]).
-import(euphorik_bd, [resultat_transaction/1]).
--import(qlc, [e/2, q/1, keysort/3]).
+-import(qlc, [e/2, q/1]).
-import(mnesia, [table/1, transaction/1]).
% Message est le message de type #minichat et Parents une liste d'Id.
% Plus est un bool. Si Plus vaut true alors il y a encore des messages.
% Si il n'y a pas de nouveaux message alors vide est renvoyé.
+% Chaque racine est un tuple {N, P, D}
+% N : le nombre de message
+% D : le dernier message connu, 0 si aucun
+% P : la page souhaité, la premier est la 1
% @spec conversations([{integer(), integer(), integer()}], integer(), integer(), integer()) -> [Conversation()]
conversations(Racines, N, D, P) ->
Conversations = conversations_detailees(Racines, N, D, P),
conversations_detailees(Racines, N, D, P) ->
Conversations = map(fun({Racine, P_conv, Dernier}) -> conversation(Racine, N, Dernier, P_conv) end, Racines),
Conversation_principale = resultat_transaction(transaction(fun() ->
- Curseur = qlc:cursor(q([E#minichat.id || E <- qlc:sort(table(minichat), [{order, descending}])]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]),
+ Curseur = qlc:cursor(
+ qlc:sort(q([E#minichat.id || E <- table(minichat)]), [{order, descending}]),
+ [{tmpdir, ?KEY_SORT_TEMP_DIR}]
+ ),
{CP, Plus} = conversation_principale(Curseur, Conversations, N, P),
qlc:delete_cursor(Curseur),
{[M || M <- CP, M > D], Plus} % filtre en fonction de D
<h2>Versions à venir</h2>
-<p>Liste non-exaustive des fonctionnalités à venir.</p>
+<p>Liste non-exaustive des fonctionnalités à venir.</p>\r
+
<h3>1.1</h3>
-<ul><li>possibilité de récupérer son login/password via son email.</li></ul>
+<ul>\r
+ <li>Possibilité de récupérer son login/password via son email.</li>\r
+ <li>Possibilité d'inverser le chat.</li>\r
+ <li>Révision du système de conversation.\r
+ <ul>\r
+ <li>Impossibilité de répondre à plusieurs messages de conversations différentes.</li>\r
+ <li>Possibilité d'extraire complétement une conversation.</li>\r
+ <li>Possibilité de réduire une conversation (la cacher temporairement).</li>\r
+ <li>Possibilité de créer un lien vers une conversation, par exemple : http://www.euphorik.ch/?conv=34\r
+ </ul>\r
+ </li>\r
+</ul>\r
+
<h3>1.2</h3>
-<ul><li>Intégration des <a href="http://totoz.eu">totoz</a>.</li></ul>
+<ul>\r
+ <li>Intégration des <a href="http://totoz.eu">totoz</a>.</li>\r
+ <li>Un admin pourra censurer un message.</li>\r
+</ul>\r
+
<h3>1.3</h3>
-<ul><li>Possibilité d'ajouter une correction à son dernier message.</li></ul>
+<ul><li>Possibilité d'ajouter une correction à son dernier message.</li></ul>\r
+
<h3>1.4</h3>
<ul><li>Ajout de nouveaux styles.</li></ul>