X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=modules%2Ferl%2Feuphorik_protocole.erl;h=24569dec04bd8722d87dd2aca80db3ca727aa183;hb=7e76d6bc2ccd165730addd3337656b479f9d95d4;hp=194961ed631acc0da5ed3c7436ae92e4e1c81a4c;hpb=13bf850da2316cde3ad2ff8d5c26fb32928bf7b4;p=euphorik.git diff --git a/modules/erl/euphorik_protocole.erl b/modules/erl/euphorik_protocole.erl index 194961e..24569de 100755 --- a/modules/erl/euphorik_protocole.erl +++ b/modules/erl/euphorik_protocole.erl @@ -12,6 +12,10 @@ wait_event/1, put_message/1, ban/1, + slap/1, + put_troll/1, + mod_troll/1, + del_troll/1, erreur/1 ]). @@ -119,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), @@ -150,22 +154,17 @@ wait_event(Data) -> Est_proprietaire = User =/= inconnu andalso User#user.id =:= Mess#minichat.auteur_id, A_repondu_a_message = User =/= inconnu andalso euphorik_bd:a_repondu_a_message(User#user.id, Mess#minichat.id), Est_une_reponse_a_user = User =/= inconnu andalso euphorik_bd:est_une_reponse_a_user(User#user.id, Mess#minichat.id), - User_mess = - if Mess#minichat.auteur_id =:= 0 -> - inconnu; - true -> - {ok, U2} = euphorik_bd:user_by_id(Mess#minichat.auteur_id), - U2 - end, + {ok, User_mess } = euphorik_bd:user_by_id(Mess#minichat.auteur_id), {struct, [ {id, Mess#minichat.id}, + {user_id, User_mess#user.id}, {date, format_date(Mess#minichat.date)}, {system, Mess#minichat.auteur_id =:= 0}, {owner, Est_proprietaire}, {answered, A_repondu_a_message}, {is_a_reply, Est_une_reponse_a_user}, {nick, Mess#minichat.pseudo}, - {login, if User_mess =:= inconnu -> Mess#minichat.pseudo; true -> User_mess#user.login end}, + {login, User_mess#user.login}, {content, Mess#minichat.contenu}, {answer_to, {array, lists:map( fun(Id_mess) -> @@ -191,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 @@ -205,21 +245,41 @@ put_message( ) -> case euphorik_bd:user_by_cookie(Cookie) of {ok, User} -> - Strip_content = string:strip(Content), - if (Strip_content =:= []) -> - erreur("Message vide"); - true -> - % TODO : non-atomique (update_pseudo+nouveau_message) - euphorik_bd:update_pseudo_user(User#user.id, Nick), - case euphorik_bd:nouveau_message(Strip_content, User#user.id, Answer_to) of - erreur -> erreur("Impossible d'ajouter un nouveau message"); - _ -> - json_reponse_ok() + case euphorik_bd:est_banni(User#user.id) of + {true, Temps_restant} -> + erreur("Vous êtes banni pour encore " ++ format_minutes(Temps_restant)); + _ -> + Strip_content = string:strip(Content), + if Strip_content =:= [] -> + erreur("Message vide"); + true -> + % TODO : non-atomique (update_pseudo+nouveau_message) + euphorik_bd:update_pseudo_user(User#user.id, Nick), + case euphorik_bd:nouveau_message(Strip_content, User#user.id, Answer_to) of + erreur -> erreur("Impossible d'ajouter un nouveau message"); + _ -> + json_reponse_ok() + end end end; - _ -> - erreur("Utilisateur inconnu") - end. + _ -> + erreur("Utilisateur inconnu") + end. + + +% Formatage de minutes. +% par exemple : "1min", "45min", "1h23min", "1jour 2h34min" +format_minutes(Min) -> + Jours = Min div (60 * 24), + Heures = Min rem (60 * 24) div 60, + Minutes = Min rem (60), + if Jours =/= 0 -> integer_to_list(Jours) ++ "Jour" ++ if Jours > 1 -> "s"; true -> "" end ++ " "; true -> "" end ++ + if Heures =/= 0 -> integer_to_list(Heures) ++ "h"; true -> "" end ++ + if Minutes == 0 -> + ""; + true -> + lists:flatten(io_lib:format(if Jours =:= 0, Heures =:= 0 -> "~w"; true -> "~2.2.0w" end, [Minutes])) ++ "min" + end. % bannissement d'un utilisateur (son ip est bannie) @@ -227,21 +287,140 @@ 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 + {ok, User1 = #user{ek_master = true}} -> + case euphorik_bd:user_by_id(User_id) of + {ok, User1} -> + 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.~s", + [ + User2#user.pseudo, + if User2#user.login =:= [] -> ""; true -> "(" ++ User2#user.login ++ ")" end, + if Duration =< 15 -> "kické"; true -> "banni" end, + format_minutes(Duration), + if Reason =/= [] -> " - Raison: " ++ Reason; true -> "" end ++ "." + ] + ))), + json_reponse_ok(); + {ok, _} -> + erreur("L'utilisateur est lui même un ekMaster"); + _ -> + erreur("Utilisateur à bannir inconnu") + end; + _ -> + erreur("Utilisateur inconnu ou non ek master") + end. + + +% slapage d'un user (avertissement) +slap( + [ + {cookie, Cookie}, + {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~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.~s", + [ + User2#user.pseudo, + User1#user.pseudo, + if Reason =/= [] -> " - Raison: " ++ Reason; true -> "" end ++ "." + ] + ))), + json_reponse_ok(); + {ok, _} -> + erreur("L'utilisateur est lui même un ekMaster"); + _ -> + erreur("Utilisateur à slaper inconnu") + end; + _ -> + 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:user_by_id(User_id) of - {ok, User} -> - euphorik_bd:ban(User#user.last_ip, Duration); + 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("Utilisateur à bannir inconnu") + erreur("Vous ne posséder pas ce troll") end; _ -> - erreur("Utilisateur inconnu ou non ek master") + 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) -> @@ -273,7 +452,7 @@ format_date(Date) -> end ++ io_lib:format("~2.10.0B:~2.10.0B:~2.10.0B", [Heure, Minute, Seconde]) ). - + json_reponse_ok() -> {struct, [{reply, "ok"}]}.