+
+
+wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id, Main_page, Troll_id) ->
+ % est-ce que le troll est à jour ?
+ case euphorik_bd:current_troll() of
+ Current when is_record(Current, troll), Current#troll.id =/= Troll_id ->
+ {struct, [
+ {reply, "new_troll"},
+ {troll_id, Current#troll.id},
+ {message_id, euphorik_bd:message_id_associe(Current#troll.id)},
+ {content, Current#troll.content}
+ ]};
+ _ ->
+ % est-ce qu'il y a des nouveaux messages ?
+ case euphorik_minichat_conversation:conversations(Racines_conversations, Message_count, Last_message_id, Main_page) of
+ vide ->
+ wait_event_bd_page_chat(),
+ % TODO : l'appel est-il bien tail-recursive ?
+ wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id, Main_page, Troll_id);
+ Conversations ->
+ % accrochez-vous ca va siouxer ;)
+ {struct, [
+ {reply, "new_messages"},
+ {conversations, {array,
+ lists:map(
+ fun({Conv, Plus}) ->
+ {struct, [
+ {last_page, not Plus},
+ {messages, {array,
+ lists:map(
+ fun({Mess, Repond_a}) ->
+ 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),
+ {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, User_mess#user.login},
+ {content, Mess#minichat.contenu},
+ {answer_to, {array, lists:map(
+ fun(Id_mess) ->
+ {ok, M} = euphorik_bd:message_by_id(Id_mess),
+ {ok, User_reponse} = euphorik_bd:user_by_mess(M#minichat.id),
+ {struct, [{id, M#minichat.id}, {nick, M#minichat.pseudo}, {login, User_reponse#user.login}]}
+ end,
+ Repond_a
+ )}},
+ {ek_master, User_mess#user.ek_master}
+ ]}
+ end,
+ Conv
+ )
+ }}
+ ]}
+ end,
+ Conversations
+ )
+ }}
+ ]}
+ end
+ end.
+
+
+% Attend un événement lié à la page 'chat'.
+wait_event_bd_page_chat() ->
+ receive % attente d'un post
+ {mnesia_table_event, {write, minichat, _Message, [], _}} ->
+ ok;
+ {mnesia_table_event, {write, troll, Troll, [Old_troll | _], _}} when Troll#troll.date_post =/= undefined, Old_troll#troll.date_post == undefined ->
+ ok;
+ {tcp_closed, _} ->
+ exit(normal);
+ _ ->
+ wait_event_bd_page_chat()
+ % 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.
+
+
+% 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.
+