z-index: 10;
left: 600px;
top:0px;
- border: 1px;
- background-color: #164200;
- border: #2d8800 1px solid;
- color: #EEEEEE;
font-size: 9px;
}
\r
.captcha {\r
display:none\r
-}\r
-\r
-/* Obsolète
-#captcha {
- margin-bottom: 5px;
-}
-#captcha input {
- margin-left: 5px;
}
-#captcha .captchaImg {
- background-color: #FFFFFF;
- vertical-align: bottom;
-}*/
form input,
-form button {
+form button,
+form select {
background-color: #164200;
border: #2d8800 1px solid;
color: #EEEEEE;
"nick" : "Paul",\r
"login" : "paul49",\r
"email" : "paul@pierre.com",\r
- "css" : "css/3/euphorik.css",\r
+ "css" : "css/3/euphorik.css",
+ "nick_format" : "nick" | "login" | "nick_login",\r
"main_page" : 1,
"conversations" : [
{
"password" : "IJKJDHHSAD9081238",\r
"nick" : "Paul",\r
"email" : "paul@pierre.com",\r
- "css" : "css/3/euphorik.css",\r
+ "css" : "css/3/euphorik.css",
+ "nick_format" : "nick" | "login" | "nick_login",\r
"main_page" : 1,
"conversations" : [
{
<div id="menu">
<div class="minichat">chat</div><div class="profile"></div><div class="register">register</div><div class="logout">logout</div><div class="about">about</div>\r
</div>
- <select id="menuCss">
- <option value="1" selected="selected">Dark</option>
- <option value="2">Cold</option>
- <option value="3">Classic</option>
- </select>
+ <form>
+ <select id="menuCss">
+ <option value="1" selected="selected">Dark</option>
+ <option value="2">Cold</option>
+ <option value="3">Classic</option>
+ </select>
+ </form>
<div id="page"></div>
<div id="footer"><a href="http://yaws.hyber.org"><img src="img/powered-by-yaws.gif" alt="powered by Yaws" /></a></div>
</div>
this.password = ""\r
this.email = ""\r
this.css = jQuery("link#cssPrincipale").attr("href")
+ this.nickFormat = "nick"
this.pagePrincipale = 1
"nick" : this.pseudo,
"email" : this.email,
"css" : this.css,
+ "nick_format" : this.nickFormat,
"main_page" : this.pagePrincipale < 1 ? 1 : this.pagePrincipale,
"conversations" : this.getJSONConversations()
}
}\r
\r
Client.prototype.deconnexion = function()\r
-{\r
+{
+ this.flush()\r
this.setStatut(statutType.deconnected) // deconnexion\r
this.resetDonneesPersonnelles()\r
this.delCookie ()\r
this.pseudo = data["nick"]\r
this.email = data["email"]\r
this.css = data["css"]
+ this.nickFormat = data["nick_format"]
// la page de la conversation principale
this.pagePrincipale = data["main_page"] == undefined ? 1 : data["main_page"]
* @param pseudo
* @param contenu
*/
-function Message(id, date, pseudo, contenu)
+function Message(id, date, pseudo, login, contenu)
{
this.id = id
this.date = date
this.pseudo = pseudo
+ this.login = login
this.contenu = contenu
this.appartientAuClient = false
* @param numConv le numéro (appelé id) de la conversation
* @param formateur outil permettant la mise en forme du texte des messages
*/
-function Conversation(num, util, formateur)
+function Conversation(num, util, formateur, client)
{
var thisConversation = this
this.messageOver = null // le message sur lequel se trouve le curseur
this.util = util
this.formateur = formateur
+ this.client = client
+
this.messages = new Array()
this.messagesParId = new Object()
var XHTML = ""
for (var i = this.messages.length - 1; i >= 0; i--)
if (this.messages[i].id > idDernierMessageAffiche)
- {
+ {
var message = this.messages[i]
+ // construit l'identifiant de la personne
+ var identifiant =
+ this.client.nickFormat == "nick" ? message.pseudo :
+ (this.client.nickFormat == "login" ? message.login : message.pseudo + "(" + message.login +")" )
+
var XHTMLrepondA = ""
for (var id in message.repondA)
XHTMLrepondA += this.formateur.traitementComplet(message.repondA[id].pseudo) + "> "
"\">" +
"<div class=\"extraire\">></div>" +
"[<span class=\"date\">" + message.date + "</span>]" +
- "<span class=\"pseudo\">" + this.formateur.traitementComplet(message.pseudo) + "</span>:" +
+ "<span class=\"pseudo\">" + this.formateur.traitementComplet(identifiant) + "</span>:" +
XHTMLrepondA +
"<span class=\"contenu\">" + (message.systeme ? this.formateur.remplacerBalisesHTML(message.contenu) : this.formateur.traitementComplet(message.contenu, message.pseudo)) + "</span>" +
"</div>"
id,
element["date"],
element["nick"],
+ element["login"],
element["content"]
) \r
{
var thisMessages = this
- this.conversations[num] = new Conversation(num, this.util, this.formateur)
+ this.conversations[num] = new Conversation(num, this.util, this.formateur, this.client)
if (funFermer != undefined)
this.conversations[num].eventFermer(funFermer)
if (funLien != undefined)
// ajoute les messages reçu à leur conversation respective
for (var numConv = 0; numConv < data["conversations"].length; numConv++)
{
+ //PLOP if (data["conversations"][numConv]["messages"].length == 0) continue
+
thisMessages.ajouterMessages(data["conversations"][numConv], numConv)
// définit les événements liés à la conversation
PageProfile.prototype.contenu = function()
{
+ // pourquoi ?
return ""
}
\r
jQuery("form#profile input.login").val(this.client.login)\r
jQuery("form#profile input.pseudo").val(this.client.pseudo)\r
- jQuery("form#profile input.email").val(this.client.email)\r
+ jQuery("form#profile input.email").val(this.client.email)
+
+ jQuery("form#profile select#affichagePseudo option").removeAttr("selected")
+ jQuery("form#profile select#affichagePseudo option[value=" + this.client.nickFormat + "]").attr("selected", "selected")
+ \r
\r
- jQuery("#page form#profile button").click(\r
+ jQuery("form#profile button").click(\r
function()\r
{\r
thisPage.client.pseudo = thisPage.formateur.filtrerInputPseudo(jQuery("form#profile input.pseudo").val())\r
- thisPage.client.email = jQuery("form#profile input.email").val()\r
+ thisPage.client.email = jQuery("form#profile input.email").val()
+ thisPage.client.nickFormat = jQuery("form#profile select#affichagePseudo option:selected").attr("value")
\r
var password = jQuery("form#profile input.password").val()\r
var passwordRe = jQuery("form#profile input.passwordRe").val() \r
<td>e-mail</td>\
<td><input class="email" type="text" size="40" maxlength="100"/></td>\
</tr>\
+ <tr>\
+ <td>Affichage des identifiants</td>\
+ <td>\
+ <select id="affichagePseudo">\
+ <option value="nick">Pseudo</option>\
+ <option value="login">Login</option>\
+ <option value="nick_login">Pseudo(Login)</option>\
+ </select>\
+ </td>\
+ </tr>\
<tr>' : '') + '\
<tr>\
<td></td>\
</tr>\
</table>\
</form>'
-}
\ No newline at end of file
+}
+
% Instructions pour créer une nouvelle base :
% $erl -sname yaws -mnesia dir '"/projets/euphorik/BD"'
+% voir doc/installation.txt
% >l(euphorik_bd).
% >euphorik_bd:create().\r
create() ->\r
end,
record_info(fields, user),
user
- ).
+ );
+% Ajout le format d'affichage des pseudos
+vers_version(6) ->
+ mnesia:transform_table(
+ user,
+ fun({user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, Indice_flood, Page_Principale, Conversations}) ->
+ {user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, nick, Indice_flood, Page_Principale, Conversations}
+ end,
+ record_info(fields, user),
+ user
+ ).
% exemple de peuplage de la BD, utilisé pour les tests
est_une_reponse_a_user/2,
% set :\r
update_pseudo_user/2,
- set_profile/8,
+ set_profile/9,
update_date_derniere_connexion/1,
nouveau_user/2,
nouveau_user/3,
% Mise à par Cookie les autres peuvent être undefined ce qui veut dire qu'ils ne seront pas modifié.\r
-set_profile(Cookie, Login, Password, Pseudo, Email, Css, Page_principale, Conversations) ->
- resultat_transaction(mnesia:transaction(
- fun() ->
- case user_by_cookie(Cookie) of
- {ok, User} -> \r
- case user_by_login(Login) of\r
- {ok, U} when U#user.id =/= User#user.id ->\r
- login_deja_pris;\r
- _ -> \r
- User_modifie = User#user{
- % TODO : pourquoi ne pas tester avec la valeur "undefined" plutôt qu'avec "is_list" ?
- % TODO : validation plus strict des données (pas de page négative dans les conv par exemple)\r
- login = if is_list(Login) -> Login; true -> User#user.login end,\r
- password = if is_list(Password) -> Password; true -> User#user.password end,\r
- pseudo = if is_list(Pseudo) -> Pseudo; true -> User#user.pseudo end,\r
- email = if is_list(Email) -> Email; true -> User#user.email end,\r
- css = if is_list(Css) -> Css; true -> User#user.css end,
- page_principale = if is_integer(Page_principale), Page_principale > 0 -> Page_principale; true -> User#user.page_principale end,
- conversations = if is_list(Conversations) -> Conversations; true -> User#user.conversations end\r
- },\r
- mnesia:write(User_modifie),\r
- ok\r
- end;
- _ -> erreur
- end
- end
- )).
+set_profile(Cookie, Login, Password, Pseudo, Email, Css, Page_principale, Nick_format, Conversations) ->
+ if Nick_format =:= nick; Nick_format =:= login; Nick_format =:= nick_login ->
+ resultat_transaction(mnesia:transaction(
+ fun() ->
+ case user_by_cookie(Cookie) of
+ {ok, User} -> \r
+ case user_by_login(Login) of\r
+ {ok, U} when U#user.id =/= User#user.id ->\r
+ login_deja_pris;\r
+ _ -> \r
+ User_modifie = User#user{
+ % TODO : pourquoi ne pas tester avec la valeur "undefined" plutôt qu'avec "is_list" ?
+ % TODO : validation plus strict des données (pas de page négative dans les conv par exemple)\r
+ login = if is_list(Login) -> Login; true -> User#user.login end,\r
+ password = if is_list(Password) -> Password; true -> User#user.password end,\r
+ pseudo = if is_list(Pseudo) -> Pseudo; true -> User#user.pseudo end,\r
+ email = if is_list(Email) -> Email; true -> User#user.email end,\r
+ css = if is_list(Css) -> Css; true -> User#user.css end,
+ nick_format = Nick_format,
+ page_principale = if is_integer(Page_principale), Page_principale > 0 -> Page_principale; true -> User#user.page_principale end,
+ conversations = if is_list(Conversations) -> Conversations; true -> User#user.conversations end\r
+ },\r
+ mnesia:write(User_modifie),\r
+ ok\r
+ end;
+ _ -> erreur
+ end
+ end
+ ));
+ true ->
+ erreur
+ end.
% Met à jour la date de la dernière connexion d'un utilisateur à maintenant
conversations/4\r
]).
+-compile(export_all).
+
-include("euphorik_bd.hrl").
-include_lib("stdlib/include/qlc.hrl").
true ->
Enfants = enfants(M),
Parents = parents(M),
- % un message est dit exiterne si un de ses parent ne fait pas partie de la conversation ou si un de ses parents fait partie de X
+ % un message est dit externe si un de ses parent ne fait pas partie de la conversation ou si un de ses parents fait partie de X
Est_message_externe = Parents -- Messages =/= [] orelse intersection(Parents, X) =/= [],
conversation([M | Messages], Reste ++ Enfants, if Est_message_externe -> [M | X]; true -> X end)
end;
euphorik_minichat:update_date_derniere_connexion(User#user.id),
json_reponse_login_ok(User);
loginUser(_) ->
- erreur("Erreur login").
+ % ajoute un délais d'attente (TODO : un autre moyen plus élégant ?)
+ receive after 1000 ->
+ erreur("Erreur login")
+ end.
\r
% Renvoie un string() représentant un cookie en base 36. Il y a 10^32 possibillités.\r
{nick, Pseudo},
{email, Email},
{css, Css},
+ {nick_format, Nick_format_str},
{main_page, Main_page},
{conversations, {array, Conversations_json}}
]
[],
Conversations_json
),
- case euphorik_minichat:set_profile(Cookie, Login, Password, Pseudo, Email, Css, Main_page, Conversations) of
+ case euphorik_minichat:set_profile(Cookie, Login, Password, Pseudo, Email, Css, list_to_atom(Nick_format_str), Main_page, Conversations) of
ok ->
json_reponse_ok();
login_deja_pris ->
{login, User#user.login},
{email, User#user.email},
{css, User#user.css},
+ {nick_format, atom_to_list(User#user.nick_format)},
{main_page, User#user.page_principale},
{conversations,
{array,
\r
-include_lib("xmerl/include/xmerl.hrl").\r
-include_lib("yaws/include/yaws_api.hrl").
+
\r
-% Test du module\r
+% Test du module (TODO)\r
tester() ->
que_dal.\r
out(A) ->\r
%inet:setopts(A#arg.clisock, inet:getopts(A#arg.clisock, [active])),\r
{value, {_, Contenu}} = lists:keysearch("action", 1, yaws_api:parse_post(A)),\r
- Ret = traiter_donnees(Contenu),\r
- %{content, "text/xml", Ret}.
+ Ret = traiter_donnees(Contenu),
{content, "application/json", Ret}.\r
\r
traiter_donnees(Contenu) ->
case json:decode_string(Contenu) of
{ok, {struct, [{action, Action}| Reste]}} ->
- %io:format("~p~n", [euphorik_protocole:login(JSON)]),
json:encode(traiter_action(Action, Reste));
_ ->
error
date_creation, % erlang:now()\r
date_derniere_connexion, % erlang:now(), est mis à jour lors de n'importe quelle activitée (envoie de message par exemple)\r
css = [], % string()
+ nick_format = nick, %atom(), peut valoir 'nick', 'login' ou 'nick_login'
indice_flood = 0, % integer() est incrémenté lorsque l'utilisateur envoie trop rapidement des messages.
page_principale = 1, % la page de la conversation principale
conversations = [] % [{integer(), integer()}], la liste des messages correspondant au conversation ainsi que la page affichée\r