R
end;
wait_event([{page, "admin"}, {last_troll, Last_troll}]) ->
- case euphorik_bd:trolls_attente(Last_troll) of
+ case wait_event_page_admin(Last_troll) of
+ banned_ips_refresh ->
+ {struct,
+ [
+ {reply, "banned_ips_refresh"}
+ ]
+ };
{mod, Troll} ->
{struct,
[
% Après 60 minutes de connexion, le client doit donc reétablir une connexion
after 1000 * 60 * 60 ->
timeout
- end.
+ end.
+
+
+% Attent un événement concernant la page admin
+% Renvoie les trolls manquants posté après Last_id ou banned_ips_refresh.
+% 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 banned_ips_refresh
+% ou timeout
+wait_event_page_admin(Last_id) ->
+ case {mnesia:subscribe({table, troll, detailed}), mnesia:subscribe({table, ip_table, detailed})} of
+ {{error, E}, _ } -> E;
+ {_, {error, E}} -> E;
+ _ ->
+ R = case euphorik_bd:trolls(Last_id) of
+ [] -> % pas de trolls
+ wait_event_page_admin();
+ Trolls ->
+ {add, Trolls}
+ end,
+ mnesia:unsubscribe({table, troll, detailed}),
+ mnesia:unsubscribe({table, ip_table, detailed}),
+ R
+ end.
+
+wait_event_page_admin() ->
+ % s'il n'y a pas de trolls que l'utilisateur n'a pas connaissance alors on attend un événement
+ receive
+ % cas où un troll est choisit comme courant
+ {mnesia_table_event, {write, troll, Troll, [Old_troll | _], _}}
+ when Old_troll#troll.date_post =:= undefined, Troll#troll.date_post =/= undefined ->
+ {del, Troll#troll.id};
+ {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};
+ {mnesia_table_event, {write, ip_table, IP, [Old_IP | _], _}}
+ when Old_IP#ip_table.ban =/= IP#ip_table.ban; Old_IP#ip_table.ban_duration =/= IP#ip_table.ban_duration ->
+ banned_ips_refresh;
+ {tcp_closed, _} ->
+ exit(normal);
+ _ ->
+ wait_event_page_admin()
+ % 60 minutes de timeout (on ne sais jamais)
+ % Après 60 minutes de connexion, le client doit donc reétablir une connexion
+ after 1000 * 60 * 60 ->
+ timeout
+ end.
% Un utilisateur envoie un message
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",
+ 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 User2#user.login =:= [] -> ""; true -> " (" ++ User2#user.login ++ ")" end,
if Duration =< 15 -> "kické"; true -> "banni" end,
format_minutes(Duration),
if Reason =/= [] -> " - Raison: " ++ Reason; true -> "" end ++ "."
case euphorik_bd:user_by_cookie(Cookie) of
{ok, #user{ek_master = true}} ->
euphorik_bd:deban(unserialize_ip(IP)),
- json_reponse_ok;
+ json_reponse_ok();
_ ->
erreur("Seul les ekMaster peuvent connaitre la liste des ips bannies")
end.
if Minutes == 0 ->
"";
true ->
- integer_to_list(Minutes) ++ " minute" ++ if Minutes > 1 -> "s"; true -> "" end; true -> "" end
+ " " ++ integer_to_list(Minutes) ++ " minute" ++ if Minutes > 1 -> "s"; true -> "" end
end.
\r