Un serveur de chat a pour but de permettre à plusieurs
utilisateurs de dialoguer entre eux. Chaque utilisateur a
la possibilité d'échanger des messages avec les autres. De
plus pour permettre aux utilisateurs de se regrouper,
certaines informations peuvent être publiées aux autres, et
éventuellement, enregistrées sur le serveur.
Un utilisateur qui se connecte ponctuellement sur YooGoo, peut ne
pas vouloir fournir d'informations le concernant. Il est alors un
peu comme un invité. Aucune des informations qu'il fournit ne sont
conservées sur le serveur. A peine il sera déconnecté que son
profil n'existera plus, il est obligé d'envoyer les informations à
chaque fois. Un utilisateur à tout de même accès à toutes les
fonctions de YooGoo.
Un utilisateur régulier de YooGoo a fortement intérêt à
s'enregistrer. Toutes les informations qu'il fournit sont alors
enregistrées sur le serveur. Ainsi à chaque connexion il retrouve
toutes les informations qu'il a pu rentrer dans ses précédentes
sessions.
La commande REG PASSWORD permet d'enregistrer le
pseudo sous lequel on est connecté. Par la suite cet utilisateur
devra taper son mot de passe à la connexion pour pouvoir accéder
au serveur. Ainsi on est sûr que ce soit toujours la même personne
qui utilise ce nom. Pour se désenregistrer, on utilise la commande
UNREG (sans paramètre). Chaque enregistrement crée une
entrée dans une base de données d'utilisateur. Lorsqu'on se
désinscrit l'entrée est supprimée, et il ne reste plus de trace de
l'utilisateur.
Les utilisateurs ont donc la possibilité d'enregistrer des
informations les concernant afin de les rendre disponibles
aux autres utilisateurs. Chaque utilisateur, enregistré ou
pas, à un mini profil contenant son pseudo, sa ville, sa
date de naissance et son genre. Un utilisateur enregistré
a, quant à lui, un profil complet avec nom, prénom, adresse
etc.
Pour modifier les valeurs des champs de son profil, on
utilise les fonctions CHNICK,
CHGENDER,... et ainsi de suite pour tous les
champs du profil. Ces fonctions testent les arguments
passés en paramètre pour voir s'il est acceptable. Si
aucune valeur est passée en paramètre à la fonction, on
efface le contenu du champ.
Toutes ces informations sont accessibles aux autres utilisateurs
grâce à deux fonctions. La première est ASV USER
qui renvoie RPL_ASV NICK STATUS GENRE VILLE. On obtient
aussi tout le mini profil. Cette fonction est utilisable aussi
bien sur les utilisateurs enregistrés que sur ceux non
enregistrés. La seule restriction est qu'ils doivent être
connectés. La deuxième fonction est WHO USER. Elle
renvoie plusieurs réponses RPL_WHO. La fonction ne
renvoie que les champs qui ont une valeur non nulle. Les
différentes réponses sont :
- RPL_WHO n°1 = Pseudo + genre + âge + ville
- RPL_WHO n°2 = Nom + Prénom + Adresse + Code Postal + Langue + Pays
- RPL_WHO n°3 = Téléphone 1 + Téléphone 2 + Mail 1 + Mail 2
- RPL_WHO n°4 = Photo + Description
La fin de la transmission est marquée par le message
R
PL_E
NDW
HO. La valeur du champ est précédée par un
identifiant par exemple :
Rpl_who NOM= Angeline SEXE= FEMALE AGE= 19821006 VILLE= Paris
La commande
WHO ne marche que sur les utilisateurs
enregistrés, connectés ou non.
Mais le plus grand intérêt du profil est de pouvoir effectuer des
recherches dessus. Il existe une fonction de recherche qui renvoie
la liste des utilisateurs correspondant aux critères que l'on a
défini. Il est donc possible de faire une recherche multicritères.
La fonction de recherche se prototype ainsi :
Search [Nick=Pseudo] [Age=Age][Birth=Date_Naissance] [Town=Ville]
[Sex={Male|Female}][Status={OnLine|OffLine}]
On renvoie une réponse RPL_SEARCH PSEUDO pour chaque
utilisateur trouvé.
La liste de contacts est une liste de personnes que l'on
connaît et qui ont des droits spéciaux. Il y a deux types
de personnes que l'on rajoute dans sa liste, des personnes
que l'on aime bien avec qui on va partager certaines
informations. D'autres qu'on essaye d'éviter, on pourra
alors leur interdire certaines choses.
La fonction permettant de gérer toute la liste de contacts est :
contactlist add|get|del|change|accept|denie|status
Voici le détail de chaque sous fonction :
- ADD USER [DROIT]
- :
ajoute un utilisateur à la liste de contacts. Si droit n'est pas
indiqué c'est la valeur par défaut qui sera donné comme droit. Si
c'est un droit "mauvais" on envoie à l'utilisateur ajouté soit
CL_BLACKLISTEDBY (l'utilisateur a été mis en liste noire)
soit CL_IGNOREDBY (l'utilisateur est ignoré) soit
CL_MUTEBY (l'utilisateur ne peut plus parler avec la
personne). Si le droit est "ami" , on envoie alors une requête
d'ajout à l'utilisateur concerné, sauf si celui-ci a aussi donné
un droit "ami" à l'appelant.
- DEL USER
- :
supprime un utilisateur de la liste de contacts. Si l'utilisateur
était un ami il est prévenu par CL_REMOVEDBY. Si
l'utilisateur supprimé était un ami, on supprime le nom de
l'appelant dans la liste des utilisateurs dont il est ami.
- CHANGE USER [DROIT]
- :
change les droits d'un utilisateur de la liste de contacts. Il faut
faire attention aux cas où un "ennemi" devient un "ami" ou
vice-versa. Si pas de droit la valeur par défaut est mise.
- GET [USER]
- :
permet de recevoir la liste de contacts d'un utilisateur. Sans
paramètre la fonction renvoie la liste de contact de l'appelant.
Sinon il faut que l'utilisateur ait les bons droits chez
l'utilisateur dont il désire avoir la liste de contacts.
Renvoie RPL_CL PSEUDO DROIT (avec dix couples
(pseudo, droit)maximum par réponse).
- ACCEPT USER
- :
permet d'accepter la demande d'ajout d'un ami.
- DENIE USER
- :
refuse la demande d'ajout d'un ami.
- STATUS
- :
renvoie le statut de tous les utilisateurs amis présents sur
la liste de contacts.
Comme nous l'avons vu, il est possible de donner des droits "ami"
comme des droits "mauvais" aux utilisateurs présents dans la liste
de contacts.
Les différents droits sont :
- CL_BLACKLIST
- :
L'utilisateur cible est mis sur liste noire. Il n'a plus accès
aux informations de l'utilisateur appelant (la fonction
WHO et ASV lui sont inaccessibles). Il lui est
impossible de parler avec l'utilisateur appelant. Si l'utilisateur
cible essaye d'ajouter l'appelant à sa liste de contact, il
obtiendra un refus automatiquement. De plus l'appelant ne reçoit
plus les messages de la cible même lorsqu'il est connecté sur le
même canal.
- CL_NOREP
- :
L'utilisateur appelant ne donne plus accès à ces informations
(WHO et ASV inaccessibles). Un ajout sur la
liste de contacts sera automatiquement refusé.
- CL_MUTE
- :
L'utilisateur appelant ne reçoit plus aucun message de la part
de la cible, ni directement ni des canaux.
- CL_NOINOF
- :
L'utilisateur cache ces informations (WHO et
ASV inaccessibles).
- CL_ASVONLY
- :
Le WHO est inaccessible à la cible.
- CL_AMI1
- :
L'utilisateur cible est un ami. La cible prévient de ses
changements de statut, de ses connexions et déconnexions.
- CL_AMI2
- :
L'utilisateur cible est un ami. La cible prévient de ses
changements de statut, de ses connections et déconnections. La
cible peut avoir accès à la liste de contacts de l'appelant.
Le statut permet d'indiquer dans quel état on est. Souvent
certains utilisateurs restent connectés toute la journée, mais ils
ne sont pas forcément devant leur ordinateur. Pour prévenir les
autres dans un tel cas, il suffit de mettre son statut sur AWAY,
pour indiquer que l'on est parti. Comme état il existe :
- ONLINE, on est connecté et devant son ordinateur.
- CHAT, on est disponible pour discuter.
- AWAY, on n'est pas devant son écran.
- DND, Do Not Disturb, on ne veut pas être dérangé.
- OCCUPIED, on est occupé.
- BRB, Be right Back, on revient tout de suite.
- OFFLINE, non connecté.
A chaque changement de statut il faut prévenir toutes les
personnes qui sont nos amis. Il faut aussi prévenir tous les
utilisateurs qui sont connectés au même canal, ceci peut permettre
à un client YooGoo de suivre l'évolution du statut des
utilisateurs connectés sur un canal. Il faut aussi prévenir ses
amis lorsqu'on se connecte et quand on se déconnecte. A la
connexion il faut aussi recevoir les statuts de tous les
utilisateurs amis présents dans la liste de contacts. Ceci se fait
grâce à la fonction contactlist status. Cela est optionnel, donc
ce n'est pas le serveur qui s'en occupe, c'est le client qui doit
envoyer cette commande pour gérer une liste d'amis.
Que serait un serveur de chat sans commande pour dialoguer entre
utilisateurs ? Dans YooGoo il existe deux façons de parler entre
utilisateur, soit en passant par des canaux, soit en communiquant
directement avec un utilisateur.
Pour une discussion directe il y a deux possibilités, soit en
passant par le serveur, soit en connexion directe entre les deux
personnes. Pour une connexion directe c'est la commande
QUERY USER PORT qui sera utilisée. La
commande query envoie à l'utilisateur cible l'adresse IP et le
port où il doit se connecter pour parler avec l'autre utilisateur.
C'est alors aux client de s'occuper d'établir la connexion et de
communiquer. Le serveur ne s'occupe que de fournir l'adresse où se
connecter. L'inconvénient de cette méthode est d'une part que
chaque utilisateur connaît l'IP de l'autre, ce qui dans certains
cas peut être dangereux (selon la personne avec qui on parle),
d'autre part, on ne passe plus par le serveur, donc la
communication n'est pas forcement cryptée. L'avantage est que le
trafic sur le réseau est beaucoupmoins important et plus
rapide.
Si on communique en passant par le serveur, c'est la commande
MSGUSER USER MSG qui sera utilisée. C'est le
serveur qui s'occupe d'envoyer le message d'un utilisateur à
l'autre. Le message est comme tous les autres, cryptés. De plus on
n'a pas besoin de connaître l'IP de l'autre. Un autre grand
avantage de cette méthode est que si l'utilisateur avec qui on
parle est enregistré, on peut aussi lui envoyer des messages même
s'il n'est pas connecté. Lors de sa prochaine connexion il recevra
tous les messages qu'on lui a envoyés. Ceci est extrêmement
pratique car souvent on ne peut pas être connecté en même temps,
et il est difficile de croiser tout le monde.
L'autre possibilité de discussion est de passer par des canaux.
Les canaux sont vus plus en détails dans la partie suivante.