From 81b3e94e62dd60087d71efc42004f8222d9e1e7a Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Sun, 11 May 2008 23:27:57 +0000 Subject: [PATCH] =?utf8?q?ADD=20trolls,=20fin=20cot=C3=A9=20serveur=20et?= =?utf8?q?=20d=C3=A9but=20cot=C3=A9=20client=20ADD=20possibilit=C3=A9=20de?= =?utf8?q?=20mettre=20un=20message=20lors=20d'un=20slapping=20ou=20d'un=20?= =?utf8?q?bannissement=20MOD=20maj=20TODO?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- css/1/euphorik.css | 47 +++++- css/1/pageAbout.css | 43 ------ css/1/pageAdmin.css | 4 + css/1/pageMinichat.css | 18 ++- css/1/pageProfileRegister.css | 2 - doc/TODO.txt | 2 + doc/protocole3.txt | 102 +++++++++++-- index.html | 3 +- js/euphorik.js | 19 ++- js/pageAdmin.js | 40 +++++ js/pageMinichat.js | 25 ++-- modules/erl/euphorik_bd.erl | 125 +++++++++++++++- .../erl/euphorik_minichat_conversation.erl | 36 ++--- modules/erl/euphorik_protocole.erl | 138 ++++++++++++++++-- modules/erl/euphorik_requests.erl | 8 +- modules/include/euphorik_bd.hrl | 4 +- modules/include/euphorik_defines.hrl | 6 + pages/about.html | 9 +- 18 files changed, 514 insertions(+), 117 deletions(-) create mode 100644 css/1/pageAdmin.css create mode 100644 js/pageAdmin.js diff --git a/css/1/euphorik.css b/css/1/euphorik.css index 2630f1f..c3a4ace 100755 --- a/css/1/euphorik.css +++ b/css/1/euphorik.css @@ -1,5 +1,6 @@ @import url(../common.css); -@import url(pageMinichat.css); +@import url(pageMinichat.css); +@import url(pageAdmin.css); @import url(pageProfileRegister.css); @import url(pageAbout.css); @@ -59,9 +60,51 @@ body { #page { position: relative; - padding: 25px 0px 15px 0px; font-size: 12px; background-color: #000000; + text-align : left; + padding: 30px 10px 15px 10px; +} + +#page > h1 { + margin-top: 10px; + margin-left: 0px; + font-size: 18px; + color : #a6b80e +} + +#page > h2 { + margin-top: 10px; + margin-left: 10px; + font-size: 16px; + color : #899714; +} + +#page > h3 { + margin-top: 10px; + margin-left: 20px; + font-size: 14px; + color : #79841a; + background-color : #1e2201 +} + +#page > h4 { + margin-top: 10px; + margin-left: 25px; + font-size: 12px; + color : #646d1d +} + +#page > p { + margin-top: 3px; + margin-left: 35px; + color : #e9e9e9 +} + +#page > ul { + margin-top: 3px; + margin-left: 45px; + color: #e9e9e9 } #logo { diff --git a/css/1/pageAbout.css b/css/1/pageAbout.css index ffb958e..e661102 100644 --- a/css/1/pageAbout.css +++ b/css/1/pageAbout.css @@ -1,46 +1,3 @@ #page.about { - text-align : left; - padding: 30px 10px 10px 10px; -} - -#page.about h1 { - margin-top: 10px; - margin-left: 0px; - font-size: 18px; - color : #a6b80e -} - -#page.about h2 { - margin-top: 10px; - margin-left: 10px; - font-size: 16px; - color : #899714; -} - -#page.about h3 { - margin-top: 10px; - margin-left: 20px; - font-size: 14px; - color : #79841a; - background-color : #1e2201 -} - -#page.about h4 { - margin-top: 10px; - margin-left: 25px; - font-size: 12px; - color : #646d1d -} - -#page.about p { - margin-top: 3px; - margin-left: 35px; - color : #e9e9e9 -} - -#page.about ul { - margin-top: 3px; - margin-left: 45px; - color: #e9e9e9 } diff --git a/css/1/pageAdmin.css b/css/1/pageAdmin.css new file mode 100644 index 0000000..82626ef --- /dev/null +++ b/css/1/pageAdmin.css @@ -0,0 +1,4 @@ +/* La page d'administration */ + +#page.admin { +} diff --git a/css/1/pageMinichat.css b/css/1/pageMinichat.css index 234f9f5..80a2e33 100755 --- a/css/1/pageMinichat.css +++ b/css/1/pageMinichat.css @@ -1,3 +1,7 @@ +#page.minichat { + padding: 25px 0px 15px 0px; + text-align: center +} #page.minichat img { margin: 0px; @@ -29,10 +33,18 @@ position: absolute; display: none; } -#outilsBan img { +#outilsBan img, +#outilsBan form { float: right; - vertical-align: middle; - margin: 0px 0px 0px 0px; + cursor: pointer +} +#outilsBan p { + font-size: 2px; +} +#outilsBan input { + font-size: 9px; + margin-top: 1px; + margin-left: 1px } #page.minichat .titreSmiles:hover { diff --git a/css/1/pageProfileRegister.css b/css/1/pageProfileRegister.css index 48f5bc9..1b8b70a 100755 --- a/css/1/pageProfileRegister.css +++ b/css/1/pageProfileRegister.css @@ -2,6 +2,4 @@ #page.register, #page.profile { - text-align: left; - padding: 30px 10px 10px 10px; } diff --git a/doc/TODO.txt b/doc/TODO.txt index f08ffbc..3c086e7 100755 --- a/doc/TODO.txt +++ b/doc/TODO.txt @@ -173,6 +173,7 @@ * 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... [3] Le changement de page sous Firefox (pas essayé avec d'autre nav) es plutot moche, le texte est d'abors affiché puis le style est appliqué. +[3] Quelques fichiers sont encore en iso-8859-1 (Makefile, euphorik_bd.hrl, etc..) tout passer en UTF-8 [3] Un message envoyé sans être authentifié ne sera pas taggé comme appartenant à l'utilisateur. a) L'utilisateur attend des messages SANS donné de cookie car il n'est pas authentifié b) L'utilisateur envoie un message @@ -236,6 +237,7 @@ ok : Implémenté * 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 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] Réduire les pseudos trop long en mettant un ".." à la fin et permettre de le voir en entier lorsque le curseur le survol. [4] Compatible OpenID pour l'identification diff --git a/doc/protocole3.txt b/doc/protocole3.txt index 99776a4..e553133 100644 --- a/doc/protocole3.txt +++ b/doc/protocole3.txt @@ -128,7 +128,7 @@ ou -=== Wait event === +=== Wait event (page = chat) === Si "last_message_id" est absent alors le client ne possède pas de message. Si "main_page" est absent alors est vaut 1. "cookie" n'est pas obligatoire. @@ -140,7 +140,8 @@ c -> s "cookie" : "LKJDLAKSJBFLKASN", "message_count" : 10, "last_message_id" : 163, - "main_page" : 1 + "main_page" : 1, + "troll_id" : 45, "conversations" : [ { "racine" : 123, @@ -185,26 +186,95 @@ ou { "reply" : "message_updated", "message_id" : 123, - "contenu" : "Salut +++ poulpe" + "content" : "Salut +++ poulpe" + } +ou + { + "reply" : "new_troll", + "troll_id" : 123, + "content" : "Linux sera desktop ready en 2008 ?" } ou + + +=== Wait event (page = admin) === +c -> s + { + "action" : "wait_event", + "page" : "admin", + "last_troll" : 5 + ] + } + +s -> c + { + "reply" : "troll_modified", + "troll_id" : 3, + "content" : "plop" + } +ou +s -> c + { + "reply" : "troll_added", + "trolls" : + [ + { + "troll_id" : 5, + "content" : "plop" + } + ] + } +ou +s -> c + { + "reply" : "troll_deleted", + "troll_id" : 2 + } -=== Envoie d'un troll === -TODO +=== Envoie d'un troll === c -> s { "action" : "put_troll", "cookie" : "LKJDLAKSJBFLKASN", "content" : "Un bon troll velu !" - } -=== Modification d'un troll === -TODO -=== Suppression d'un troll === -TODO -=== Noter un troll === -TODO + } + +s -> c + +ou + + + +=== Modification d'un troll === +c -> s + { + "action" : "mod_troll", + "cookie" : "LKJDLAKSJBFLKASN", + "troll_id" : 3, + "content" : "Un bon troll velu 2 !" + } + +s -> c + +ou + + + +=== Suppression d'un troll === +c -> s + { + "action" : "del_troll", + "cookie" : "LKJDLAKSJBFLKASN", + "troll_id" : 3 + } + +s -> c + +ou + + === Envoie message === Le client envoie un message, le message peut répondre à un certain nombre d'autres messages. @@ -226,12 +296,12 @@ ou === Slapage === - c -> s { "action" : "slap", "cookie" : "LKJDLAKSJBFLKASN", - "user_id" : 67 + "user_id" : 67, + "reason" : "blablabla" } s -> c @@ -241,13 +311,13 @@ ou === Bannissement === - c -> s { "action" : "ban", "cookie" : "LKJDLAKSJBFLKASN", "duration" : 15, // en minute - "user_id" : 67 + "user_id" : 67, + "reason" : "blablabla" } s -> c diff --git a/index.html b/index.html index e388a93..a35a982 100755 --- a/index.html +++ b/index.html @@ -11,6 +11,7 @@ + @@ -21,7 +22,7 @@
\ + \ +

' +} + +PageAdmin.prototype.charger = function() +{ + $("#page form#nouveauTroll").submit(function(){return false}) + + var thisPage = this + + $("#page form#nouveauTroll button.return").click( + function() + { + + } + ) +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +function Trolls() +{ + +} \ No newline at end of file diff --git a/js/pageMinichat.js b/js/pageMinichat.js index 6b7b340..80cd013 100755 --- a/js/pageMinichat.js +++ b/js/pageMinichat.js @@ -44,7 +44,12 @@ PageMinichat.prototype.charger = function() if (this.client.ekMaster) { $("body").append( - "
\"Ban\"Ban\"Avertissement\"
" + '
' + + '

' + + 'Ban de 3 jours' + + 'Ban de 15min' + + 'Avertissement' + + '
' ) $("#outilsBan").hover( function(){}, @@ -535,7 +540,7 @@ Conversation.prototype.flush = function(funClickOuvrirConv) } ) - $("a[@rel*=lightbox]").lightBox() + $("a[@rel*=lightbox]", this).lightBox() // les outils de bannissement (uniquement pour les ekMaster) if (thisConversation.client.ekMaster) @@ -546,24 +551,27 @@ Conversation.prototype.flush = function(funClickOuvrirConv) var element = $(e.target) var h = element.height() var offset = element.offset() - var outils = $("#outilsBan").css("top", offset.top - 2).css("left", offset.left - 2).height(h < 16 ? 16 : h).width(element.width() + 16 * 3 + 4).show() + var outils = $("#outilsBan").css("top", offset.top - 2).css("left", offset.left - 2).height(h < 16 ? 16 : h).width(element.width() + 16 * 3 + 4 + 64).show() $("img", outils).unbind() $("#slap", outils).click( function(e) { - thisConversation.client.slap(userId) + thisConversation.client.slap(userId, $("#outilsBan input").val()) + $("#outilsBan input").val("") } ) $("#kick", outils).click( function(e) { - thisConversation.client.kick(userId) + thisConversation.client.kick(userId, $("#outilsBan input").val()) + $("#outilsBan input").val("") } ) $("#ban", outils).click( function(e) { - thisConversation.client.ban(userId) + thisConversation.client.ban(userId, $("#outilsBan input").val()) + $("#outilsBan input").val("") } ) }, @@ -903,7 +911,7 @@ Messages.prototype.rafraichirMessages = function(vider) for (var i = 0; i < this.conversations.length; i++) this.conversations[i].idDernierMessageAffiche = 0 - dumpObj(this.getJSONrafraichirMessages()) + ;;; dumpObj(this.getJSONrafraichirMessages()) this.attenteCourante = jQuery.ajax({ type: "POST", url: "request", @@ -920,9 +928,6 @@ Messages.prototype.rafraichirMessages = function(vider) // ajoute les messages reçus à leur conversation respective for (var numConv = 0; numConv < data["conversations"].length; numConv++) { - // ya pas de nouveaux message -> on passe à la prochaine conversation FIXME : marche pas - //if (data["conversations"][numConv]["messages"].length == 0) continue - if (! thisMessages.ajouterMessages(data["conversations"][numConv], numConv)) { thisMessages.util.messageDialogue("La conversation {" + thisMessages.client.conversations[numConv -1].root.toString(36) + "} n'existe pas") diff --git a/modules/erl/euphorik_bd.erl b/modules/erl/euphorik_bd.erl index eb6f1d4..7a9b582 100755 --- a/modules/erl/euphorik_bd.erl +++ b/modules/erl/euphorik_bd.erl @@ -49,6 +49,13 @@ est_banni/1, can_register/1, + % trolls : + trolls/0, + trolls/1, + put_troll/2, + mod_troll/2, + del_troll/1, + % versions : update_version/1, @@ -119,6 +126,7 @@ reset() -> mnesia:clear_table(user), mnesia:clear_table(reponse_minichat), mnesia:clear_table(minichat), + mnesia:clear_table(troll), mnesia:clear_table(ip_table), % crée l'utilisateur root mnesia:transaction(fun() -> @@ -333,7 +341,7 @@ nouveau_message(Mess, Auteur_id, Repond_A) -> % est-ce que l'auteur à trop floodé ? if Auteur#user.indice_flood =/= ?INDICE_SPAM_MAX, Auteur_maj#user.indice_flood =:= ?INDICE_SPAM_MAX, Delta =< ?DUREE_BLOCAGE_SPAM -> mnesia:write(Auteur#user{indice_flood = Auteur_maj#user.indice_flood}), - nouveau_message_sys(Auteur#user.pseudo ++ "(" ++ Auteur#user.login ++ ") est bloqué pour " ++ integer_to_list(trunc(?DUREE_BLOCAGE_SPAM / 1000)) ++ " secondes pour cause de flood.."); + nouveau_message_sys(Auteur#user.pseudo ++ if Auteur#user.login =/= [] -> " (" ++ Auteur#user.login ++ ")"; true -> "" end ++ " est bloqué pour " ++ integer_to_list(trunc(?DUREE_BLOCAGE_SPAM / 1000)) ++ " secondes pour cause de flood."); Auteur#user.indice_flood =:= ?INDICE_SPAM_MAX, Delta =< ?DUREE_BLOCAGE_SPAM -> erreur; true -> @@ -574,6 +582,121 @@ can_register(IP) -> end )). + +% Renvoie tous les trolls. +trolls() -> + resultat_transaction(mnesia:transaction( + fun() -> + qlc:e(qlc:q([T || T <- mnesia:table(troll)])) + end + )). + +% Renvoie les trolls manquants posté après Last_id. +% Si pas de trolls alors attend un événement tel qu'un ajout, une modification ou une suppression. +% renvoie : +% {mod, Troll} +% ou {add, [Trolls]} +% ou {del, Troll_id} +% ou timeout +trolls(Last_id) -> + case mnesia:subscribe({table, troll, detailed}) of + {error, E} = E -> + E; + _ -> + case resultat_transaction(mnesia:transaction( + fun() -> + qlc:e(qlc:q([T || T <- mnesia:table(troll), T#troll.id > Last_id, T#troll.date_post =:= undefined])) + end + )) of + [] -> % pas de trolls + attend_evenement_troll(); + Trolls -> + {add, Trolls} + end + end. + +attend_evenement_troll() -> + % s'il n'y a pas de trolls que l'utilisateur n'a pas connaissance alors on attend un événement + receive + {mnesia_table_event, {write, troll, Troll, [_Old_troll | _], _}} -> + {mod, Troll}; + {mnesia_table_event, {write, troll, Troll, [], _}} -> + {add, [Troll]}; + {mnesia_table_event, {delete, troll, {troll, Id}, _, _}} -> + {del, Id}; + _ -> + attend_evenement_troll() + after 1000 * 60 * 60 -> + timeout + end. + + + % Renvoie l'id du nouveau troll + % ou max_troll_reached_per_user si le nombre de troll posté par l'utilisateur max a été atteind + % ou max_troll_reached si le nombre de troll posté max a été atteind + % ou user_unknown +put_troll(User_id, Content) -> + resultat_transaction(mnesia:transaction( + fun() -> + % control le nombre de troll déjà posté + Nb_troll_poste_par_user = length(qlc:e(qlc:q( + [ + E#troll.id || E <- mnesia:table(troll), + E#troll.id_user =:= User_id, + E#troll.date_post =:= undefined + ] + ))), + Nb_troll_poste_total = length(qlc:e(qlc:q( + [ + E#troll.id || E <- mnesia:table(troll), + E#troll.date_post =:= undefined + ] + ))), + User = user_by_id(User_id), + case User of + {ok, _} -> + if Nb_troll_poste_par_user >= ?NB_MAX_TROLL_WAITING_BY_USER -> + max_troll_reached_per_user; + Nb_troll_poste_total >= ?NB_MAX_TROLL_WAITING -> + max_troll_reached; + true -> + Id = nouvel_id(minichat), + mnesia:write(#troll{id = Id, id_user = User_id, date_create = now(), content = Content}), + Id + end; + _ -> + user_unknown + end + end + )). + + +% renvoie ok | erreur +mod_troll(Troll_id, Content) -> + mnesia:transaction( + fun() -> + case mnesia:wread({troll, Troll_id}) of + [Troll = #troll{date_post = undefined}] -> + mnesia:write(Troll#troll{content = Content}); + _ -> + mnesia:abort("mod_troll: Troll inconnu ou déjà posté") + end + end + ). + + +del_troll(Troll_id) -> + mnesia:transaction( + fun() -> + case mnesia:wread({troll, Troll_id}) of + [#troll{date_post = undefined}] -> + mnesia:delete({troll, Troll_id}); + _ -> + mnesia:abort("mod_troll: Troll inconnu ou déjà posté") + end + end + ). + update_version(1) -> mnesia:transform_table( diff --git a/modules/erl/euphorik_minichat_conversation.erl b/modules/erl/euphorik_minichat_conversation.erl index 8cddd03..d5f486f 100755 --- a/modules/erl/euphorik_minichat_conversation.erl +++ b/modules/erl/euphorik_minichat_conversation.erl @@ -30,8 +30,8 @@ % @spec conversations([{integer(), integer(), integer()}], integer(), integer(), integer()) -> [Conversation()] conversations(Racines, N, D, P) -> % écoute des nouveaux messages - case subscribe(minichat, 2) of - erreur = E -> + case mnesia:subscribe({table, minichat, simple}) of + {error, E} = E -> E; _ -> % demande des conversations @@ -55,31 +55,33 @@ conversations(Racines, N, D, P) -> Conversations end ), - unsubscribe(minichat), + mnesia:unsubscribe({table, minichat, simple}), Conversations_mises_en_forme end. % Ecoute les événements de modification d'une table. % @spec subscribe(atom(), integer()) -> ok | erreur -subscribe(_Table, 0) -> - erreur; -subscribe(Table, C) -> - case mnesia:subscribe({table, Table, simple}) of - {error, {not_active_local, Table}} -> - mnesia:add_table_copy(minichat, node(), ram_copies), - subscribe(Table, C - 1); - {error, _}-> - erreur; - _ -> - ok - end. +% Obsolète +%~ subscribe(_Table, 0) -> + %~ erreur; +%~ subscribe(Table, C) -> + %~ case mnesia:subscribe({table, Table, simple}) of + %~ {error, {not_active_local, Table}} -> + %~ mnesia:add_table_copy(minichat, node(), ram_copies), + %~ subscribe(Table, C - 1); + %~ {error, _}-> + %~ erreur; + %~ _ -> + %~ ok + %~ end. % Arrête d'écouter les modifications d'une table. % @spec unsubscribe(atom()) -> term() -unsubscribe(Table) -> - mnesia:unsubscribe({table, Table, simple}). +% Obsolète +%~ unsubscribe(Table) -> + %~ mnesia:unsubscribe({table, Table, simple}). % Attend qu'un nouveau message arrive, function bloquante. diff --git a/modules/erl/euphorik_protocole.erl b/modules/erl/euphorik_protocole.erl index c2342ca..5c8d6d8 100755 --- a/modules/erl/euphorik_protocole.erl +++ b/modules/erl/euphorik_protocole.erl @@ -13,6 +13,9 @@ put_message/1, ban/1, slap/1, + put_troll/1, + mod_troll/1, + del_troll/1, erreur/1 ]). @@ -120,7 +123,7 @@ profile( % Renvoie les messages appropriés. % last_message id et cookie sont facultatifs -wait_event(Data) -> +wait_event([{page, "chat"} | Data]) -> Cookie = case lists:keysearch(cookie, 1, Data) of {value, {_, C}} -> C; _ -> inconnu end, Last_message_id = case lists:keysearch(last_message_id, 1, Data) of {value, {_, Id}} -> Id; _ -> 0 end, {value, {_, Message_count}} = lists:keysearch(message_count, 1, Data), @@ -187,7 +190,48 @@ wait_event(Data) -> ) ) }} - ]}. + ]}; +wait_event([{page, "admin"}, {last_troll, Last_troll}]) -> + case euphorik_bd:trolls(Last_troll) of + {mod, Troll} -> + {struct, + [ + {reply, "troll_modified"}, + {troll_id, Troll#troll.id}, + {content, Troll#troll.content} + ] + }; + {add, Trolls} -> + {struct, + [ + {reply, "troll_added"}, + {trolls, {array, + lists:map( + fun(T) -> + {struct, + [ + {troll_id, T#troll.id}, + {content, T#troll.content} + ] + } + end, + Trolls + ) + }} + ] + }; + {del, Troll_id} -> + {struct, + [ + {reply, "troll_deleted"}, + {troll_id, Troll_id} + ] + }; + _ -> + erreur("timeout") + end; +wait_event(_) -> + erreur("Page inconnue"). % Un utilisateur envoie un message @@ -243,7 +287,8 @@ ban( [ {cookie, Cookie}, {duration, Duration}, - {user_id, User_id} + {user_id, User_id}, + {reason, Reason} ]) -> % controle que l'utilisateur est un admin case euphorik_bd:user_by_cookie(Cookie) of @@ -253,12 +298,13 @@ ban( erreur("Il n'est pas possible de s'auto bannir"); {ok, User2 = #user{ek_master = false}} -> euphorik_bd:ban(User2#user.last_ip, Duration), - euphorik_bd:nouveau_message_sys(lists:flatten(io_lib:format("~s ~s est ~s pour ~s", + euphorik_bd:nouveau_message_sys(lists:flatten(io_lib:format("~s ~s est ~s pour ~s.~s", [ User2#user.pseudo, if User2#user.login =:= [] -> ""; true -> "(" ++ User2#user.login ++ ")" end, if Duration =< 15 -> "kické"; true -> "banni" end, - format_minutes(Duration) + format_minutes(Duration), + if Reason =/= [] -> " Raison: " ++ Reason; true -> "" end ++ "." ] ))), json_reponse_ok(); @@ -276,19 +322,26 @@ ban( slap( [ {cookie, Cookie}, - {user_id, User_id} + {user_id, User_id}, + {reason, Reason} ]) -> % controle que l'utilisateur est un admin case euphorik_bd:user_by_cookie(Cookie) of {ok, User1 = #user{ek_master = true}} -> case euphorik_bd:user_by_id(User_id) of {ok, User1} -> - euphorik_bd:nouveau_message_sys(lists:flatten(io_lib:format("~s s'auto slap (et il aime ça)", [User1#user.pseudo]))); + euphorik_bd:nouveau_message_sys(lists:flatten(io_lib:format("~s s'auto slap~s.", + [ + User1#user.pseudo, + if Reason =/= [] -> " Raison: " ++ Reason; true -> "" end + ] + ))); {ok, User2 = #user{ek_master = false}} -> - euphorik_bd:nouveau_message_sys(lists:flatten(io_lib:format("~s se fait slaper par ~s", + euphorik_bd:nouveau_message_sys(lists:flatten(io_lib:format("~s se fait slaper par ~s.~s", [ User2#user.pseudo, - User1#user.pseudo + User1#user.pseudo, + if Reason =/= [] -> " Raison: " ++ Reason; true -> "" end ++ "." ] ))), json_reponse_ok(); @@ -301,6 +354,73 @@ slap( erreur("Utilisateur inconnu ou non ek master") end. + +put_troll( + [ + {cookie, Cookie}, + {content, Content} + ] +) -> + % controle que l'utilisateur est un admin + case euphorik_bd:user_by_cookie(Cookie) of + {ok, User = #user{ek_master = true}} -> + case euphorik_bd:put_troll(User#user.id, Content) of + max_troll_reached_per_user -> + erreur(lists:flatten(io_lib:format("Le nombre de troll maximum par utilisateur est atteint : ~w ", [?NB_MAX_TROLL_WAITING_BY_USER]))); + max_troll_reached -> + erreur(lists:flatten(io_lib:format("Le nombre de troll maximum en attente est atteint : ~w ", [?NB_MAX_TROLL_WAITING]))); + _Id -> + json_reponse_ok() + end; + _ -> + erreur("Seul les ekMaster peuvent proposer des trolls") + end. + + +mod_troll( + [ + {cookie, Cookie}, + {troll_id, Troll_id}, + {content, Content} + ] +) -> + % controle que l'utilisateur est un admin + case euphorik_bd:user_by_cookie(Cookie) of + {ok, User = #user{ek_master = true}} -> + User_id = User#user.id, + case euphorik_bd:troll_by_id(Troll_id) of + {ok, #troll{id_user = User_id}} -> + euphorik_bd:mod_troll(User#user.id, Content), + json_reponse_ok(); + _ -> + erreur("Vous ne posséder pas ce troll") + end; + _ -> + erreur("Seul les ekMaster peuvent proposer des trolls") + end. + + +del_troll( + [ + {cookie, Cookie}, + {troll_id, Troll_id} + ] +) -> + % controle que l'utilisateur est un admin + case euphorik_bd:user_by_cookie(Cookie) of + {ok, User = #user{ek_master = true}} -> + User_id = User#user.id, + case euphorik_bd:troll_by_id(Troll_id) of + {ok, #troll{id_user = User_id}} -> + euphorik_bd:del_troll(User#user.id), + json_reponse_ok(); + _ -> + erreur("Vous ne posséder pas ce troll") + end; + _ -> + erreur("Seul les ekMaster peuvent proposer des trolls") + end. + % Construit une erreur erreur(Message) -> diff --git a/modules/erl/euphorik_requests.erl b/modules/erl/euphorik_requests.erl index a7e2ae1..5c2e538 100755 --- a/modules/erl/euphorik_requests.erl +++ b/modules/erl/euphorik_requests.erl @@ -58,5 +58,11 @@ traiter_action("put_message", JSON, _) -> traiter_action("ban", JSON, _) -> euphorik_protocole:ban(JSON); traiter_action("slap", JSON, _) -> - euphorik_protocole:slap(JSON). + euphorik_protocole:slap(JSON); +traiter_action("put_troll", JSON, _) -> + euphorik_protocole:put_troll(JSON); +traiter_action("mod_troll", JSON, _) -> + euphorik_protocole:mod_troll(JSON); +traiter_action("del_troll", JSON, _) -> + euphorik_protocole:del_troll(JSON). \ No newline at end of file diff --git a/modules/include/euphorik_bd.hrl b/modules/include/euphorik_bd.hrl index f1a2241..55f76cd 100755 --- a/modules/include/euphorik_bd.hrl +++ b/modules/include/euphorik_bd.hrl @@ -46,7 +46,7 @@ conversations = [], % [{integer(), integer()}], la liste des messages correspondant au conversation ainsi que la page affichée ek_master = false, last_ip = undefined % integer(), undefined si inconnu - }). + }). % identificateur : (ip) @@ -68,6 +68,6 @@ id_user, date_create, % erlang:now() date_post = undefined, % date à laquelle le troll est affiché sur la page principale. undefined initialement puis erlang:now() quand affiché - contenu % chaine de caractère + content % chaine de caractère }). \ No newline at end of file diff --git a/modules/include/euphorik_defines.hrl b/modules/include/euphorik_defines.hrl index 443437f..779a175 100755 --- a/modules/include/euphorik_defines.hrl +++ b/modules/include/euphorik_defines.hrl @@ -14,3 +14,9 @@ -define(TEMPS_FLOOD_REGISTER, 1500). % 1500 ms % après 5 flood l'ip fautive est considérée comme bannie -define(NB_MAX_FLOOD_REGISTER, 5). + + +% le nombre max de troll qui peuvent être en attente d'être posté (tous les utilisateurs réunis) +-define(NB_MAX_TROLL_WAITING, 10). +% chaque admin peut proposer 1 seul troll à la fois +-define(NB_MAX_TROLL_WAITING_BY_USER, 1). diff --git a/pages/about.html b/pages/about.html index 14eede6..263e789 100644 --- a/pages/about.html +++ b/pages/about.html @@ -35,7 +35,8 @@ Il est déconseillé d'utiliser Microsoft Internet Explorer pour des raisons d'i

Est-ce possible d'avoir les sources du site ?

-

Oui, un repository subversion accessible en lecture existe ici : svn://svn.euphorik.ch/euphorik

+

Oui, un repository subversion accessible en lecture existe ici : svn://svn.euphorik.ch/euphorik

+

Un accès web existe également ici : http://svn.euphorik.ch/index.cgi/euphorik/

Ouais mais c'est libre au moins ?

Oui, euphorik.ch n'est développé qu'avec des logiciels et technologies libres et son code est proposé sous licence GPLv3.

@@ -53,14 +54,14 @@ voici mon email/jabberID : {EMAIL}

  • Présentation du document : CSS 2.1
  • Programmation de la partie dynamique : JavaScript
  • Méthode de communication avec le serveur : AJAX/COMET
  • -
  • Bibliothèques JavaScript : jQuery et Lightbox
  • +
  • Bibliothèques JavaScript : jQuery et jQuery lightBox plugin
  • Coté serveur

    Outils

      @@ -72,7 +73,7 @@ voici mon email/jabberID : {EMAIL}

    Comment est appelé le petit du gnou ?

    -

    Le gaou

    +

    Le gaou.

    Versions à venir

    -- 2.45.2