\r
% Un utilisateur se logge (avec un couple {login, mot de passe})\r
login([{login, Login}, {password, Password}], IP) ->\r
- loginUser(euphorik_bd:user_by_login_password(Login, Password), IP);\r
+ case euphorik_bd:user_by_login_password(Login, Password) of\r
+ {ok, User} ->\r
+ loginUser(User, IP);\r
+ _ -> \r
+ timer:sleep(?TEMPS_ATTENTE_ERREUR_LOGIN),\r
+ erreur("Couple login/pass introuvable")\r
+ end;\r
% Un utilisateur se logge (avec un cookie)\r
login([{cookie, Cookie}], IP) ->\r
- loginUser(euphorik_bd:user_by_cookie(Cookie), IP).\r
+ case euphorik_bd:user_by_cookie(Cookie) of\r
+ {ok, User} ->\r
+ loginUser(User, IP);\r
+ _ ->\r
+ timer:sleep(?TEMPS_ATTENTE_ERREUR_LOGIN),\r
+ erreur("Authentification impossible par cookie")\r
+ end.\r
\r
-loginUser({ok, User}, IP) ->\r
+loginUser(User, IP) ->\r
euphorik_bd:update_ip(User#user.id, IP),\r
euphorik_bd:update_date_derniere_connexion(User#user.id),\r
- json_reponse_login_ok(User);\r
-loginUser(_, _) ->\r
- % ajoute un délais d'attente\r
- timer:sleep(?TEMPS_ATTENTE_ERREUR_LOGIN),\r
- erreur("Couple login/pass introuvable").\r
+ json_reponse_login_ok(User).\r
\r
\r
% Renvoie un string() représentant un cookie en base 36. Il y a 10^32 possibillités.\r
{nick, Pseudo},\r
{email, Email},\r
{css, Css},\r
+ {chat_order, Chat_order_str},\r
{nick_format, Nick_format_str},\r
{view_times, View_times},\r
{view_tooltips, View_tooltips},\r
- {conversations, {array, Conversations_json}}\r
+ {conversations, {array, Conversations_json}},\r
+ {ostentatious_master, Ostentatious_master}\r
]\r
) ->\r
- % virage des messages qui n'existent pas\r
- Conversations = lists:dropwhile(\r
- fun(Message_id) ->\r
- not euphorik_bd:message_existe(Message_id)\r
+ % décomposition de la strucure JSON\r
+ Conversations = lists:foldr(\r
+ fun({struct, [{root, Racine}, {minimized, Reduit}]}, A) ->\r
+ % virage des messages qui n'existent pas\r
+ Message_exite = euphorik_bd:message_existe(Racine),\r
+ if Message_exite ->\r
+ [ {Racine, Reduit} | A];\r
+ true ->\r
+ A\r
+ end\r
end,\r
+ [],\r
Conversations_json\r
),\r
% TODO : pas très beau, mieux vaut construire un #user\r
Pseudo,\r
Email,\r
Css,\r
+ list_to_atom(Chat_order_str),\r
list_to_atom(Nick_format_str),\r
View_times,\r
View_tooltips,\r
- Conversations) of\r
+ Conversations,\r
+ list_to_atom(Ostentatious_master)) of\r
ok ->\r
json_reponse_ok();\r
login_deja_pris ->\r
{reply, "new_messages"},\r
{conversations, {array,\r
lists:map(\r
- fun({Conv, Plus}) ->\r
+ fun({Racine, {Conv, Plus}}) ->\r
{struct, [\r
{last_page, not Plus},\r
- {messages, {array, \r
+ {first, \r
+ if Racine =:= undefined orelse Conv =:= [] ->\r
+ null;\r
+ true ->\r
+ {Racine_id, _, _} = Racine,\r
+ case euphorik_bd:message_by_id(Racine_id) of\r
+ {ok, Mess} ->\r
+ json_message(Mess, euphorik_bd:parents(Racine), User);\r
+ _ ->\r
+ null\r
+ end\r
+ end\r
+ }, % le premier message de la conversation, peut correspondre\r
+ {messages, {array,\r
lists:map(\r
- fun({Mess, Repond_a}) -> \r
- Est_proprietaire = User =/= inconnu andalso User#user.id =:= Mess#minichat.auteur_id,\r
- A_repondu_a_message = User =/= inconnu andalso euphorik_bd:a_repondu_a_message(User#user.id, Mess#minichat.id),\r
- Est_une_reponse_a_user = User =/= inconnu andalso euphorik_bd:est_une_reponse_a_user(User#user.id, Mess#minichat.id),\r
- {ok, User_mess } = euphorik_bd:user_by_id(Mess#minichat.auteur_id),\r
- {struct, [\r
- {id, Mess#minichat.id},\r
- {user_id, User_mess#user.id},\r
- {date, format_date(Mess#minichat.date)},\r
- {system, Mess#minichat.auteur_id =:= 0},\r
- {owner, Est_proprietaire},\r
- {answered, A_repondu_a_message},\r
- {is_a_reply, Est_une_reponse_a_user},\r
- {nick, Mess#minichat.pseudo},\r
- {login, User_mess#user.login},\r
- {content, Mess#minichat.contenu},\r
- {root, Mess#minichat.racine_id},\r
- {answer_to, {array, lists:map(\r
- fun(Id_mess) -> \r
- {ok, M} = euphorik_bd:message_by_id(Id_mess),\r
- {ok, User_reponse} = euphorik_bd:user_by_mess(M#minichat.id),\r
- {struct, [{id, M#minichat.id}, {nick, M#minichat.pseudo}, {login, User_reponse#user.login}]}\r
- end,\r
- Repond_a\r
- )}},\r
- {ek_master, User_mess#user.ek_master}\r
- ]}\r
+ fun({Mess, Repond_a}) ->\r
+ json_message(Mess, Repond_a, User)\r
end,\r
Conv\r
)\r
}}\r
]}\r
end,\r
- Conversations\r
+ % on ajoute un 'undefined' correspondant à la premier conversation qui ne possède pas de racine\r
+ % TODO : peut être à revoir car un peu lourd est compliqué\r
+ aggregation_racines_conversations([undefined | Racines_conversations], Conversations)\r
)\r
}}\r
]}\r
end\r
end.\r
+ \r
+\r
+aggregation_racines_conversations(L1, L2) -> \r
+ aggregation_racines_conversations(L1, L2, []).\r
+aggregation_racines_conversations([], [], L) -> lists:reverse(L);\r
+aggregation_racines_conversations([E1|R1], [E2|R2], L) ->\r
+ aggregation_racines_conversations(R1, R2, [{E1, E2} | L]).\r
+ \r
\r
\r
% Attend un événement lié à la page 'chat'.\r
{login, User#user.login},\r
{email, User#user.email},\r
{css, User#user.css},\r
+ {chat_order, atom_to_list(User#user.chat_order)},\r
{nick_format, atom_to_list(User#user.nick_format)},\r
{view_times, User#user.view_times},\r
{view_tooltips, User#user.view_tooltips},\r
- {conversations, {array, User#user.conversations } },\r
- {ek_master, User#user.ek_master}\r
+ {conversations, {array, lists:map(\r
+ fun({Racine, Reduit}) ->\r
+ {struct, [{root, Racine}, {minimized, Reduit}]}\r
+ end,\r
+ User#user.conversations\r
+ )}},\r
+ {ek_master, User#user.ek_master},\r
+ {ostentatious_master, atom_to_list(User#user.ostentatious_master)}\r
]\r
}.\r
+ \r
+% Renvoie le message formaté en JSON.\r
+% Mess est de type #minichat\r
+% Repond_a est une liste d'id des messages auquel répond Mess\r
+% User est l'utilisateur courant de type #user\r
+json_message(Mess, Repond_a, User) ->\r
+ Est_proprietaire = User =/= inconnu andalso User#user.id =:= Mess#minichat.auteur_id,\r
+ A_repondu_a_message = User =/= inconnu andalso euphorik_bd:a_repondu_a_message(User#user.id, Mess#minichat.id),\r
+ Est_une_reponse_a_user = User =/= inconnu andalso euphorik_bd:est_une_reponse_a_user(User#user.id, Mess#minichat.id),\r
+ {ok, User_mess } = euphorik_bd:user_by_id(Mess#minichat.auteur_id),\r
+ {struct, [\r
+ {id, Mess#minichat.id},\r
+ {user_id, User_mess#user.id},\r
+ {date, format_date(Mess#minichat.date)},\r
+ {system, Mess#minichat.auteur_id =:= 0},\r
+ {owner, Est_proprietaire},\r
+ {answered, A_repondu_a_message},\r
+ {is_a_reply, Est_une_reponse_a_user},\r
+ {nick, Mess#minichat.pseudo},\r
+ {login, User_mess#user.login},\r
+ {content, Mess#minichat.contenu},\r
+ {root, Mess#minichat.racine_id},\r
+ {answer_to, {array, lists:map(\r
+ fun(Id_mess) -> \r
+ {ok, M} = euphorik_bd:message_by_id(Id_mess),\r
+ {ok, User_reponse} = euphorik_bd:user_by_mess(M#minichat.id),\r
+ {struct, [{id, M#minichat.id}, {nick, M#minichat.pseudo}, {login, User_reponse#user.login}]}\r
+ end,\r
+ Repond_a\r
+ )}},\r
+ {ek_master, User_mess#user.ek_master},\r
+ {ostentatious_master, atom_to_list(User_mess#user.ostentatious_master)}\r
+ ]}.\r