Filtrage des messages

La dernière amélioration apportée à notre serveur de chat consiste à pouvoir bloquer ou autoriser les messages émanant des autres utilisateurs

Blocage d'un utilisateur insistant

Notre protocole doit à nouveau s'enrichir de deux types d'événement.

Nom Paramètre Définition Réponse possible
>block pseudo Blocage des messages d'un utilisateur
>accept pseudo Autorisation des messages d'un utilisateur

Gestion des autorisations

Côté serveur

Le serveur va être en charge de maintenir à jour la liste des autorisations par utilisateur pour déterminer les destinataires concernés par l'envoi d'un message d'un expéditeur donné.

Pour cela, je propose de mettre en place un objet acceptMessagesBy dont les clés correspondront aux expéditeurs et les valeurs associées aux destinataires concernés, c'est à dire ayant autorisé les messages de cet expéditeur.

{
  'o.nocent': ['o.nocent', 'd.gillard', 'f.blanchard'],
  'd.gillard': ['d.gillard', 'f.blanchard'],
  'f.blanchard': ['f.blanchard']
}

Dans l'exemple ci-dessus, o.nocent peut écrire à tous les utilisateurs : personne ne l'a bloqué. À l'inverse, il a bloqué d.gillard car son pseudo n'apparaît pas dans le tableau acceptMessagesBy['d.gillard']. De même, f.blanchard a été bloqué par tout le monde car il ne peut écrire qu'à lui-même.

Exercice

Modifiez la liste retournée avec l'événement de type <users afin d'y ajouter l'information d'autorisation. Conformément à l'exemple ci-dessus, l'utilisateur o.nocent devrair recevoir :

[
  { name: 'o.nocent',    accept: true  },
  { name: 'd.gillard',   accept: false },
  { name: 'f.blanchard', accept: false }
]

Côté client

Nous allons modifier l'affichage de la liste des utilisateurs connectés afin d'y ajouter un switch qui permettra de bloquer ou autoriser un utilisateur.

Utilisateurs bloqués ou autorisés

Exercice

Modifiez le code en charge de l'affichage des utilisateurs afin :

  • d'ajouter un switch pour chaque utilisateur
  • de fixer l'état du switch et la couleur du texte en fonction du paramètre accept
  • d'y associer un écouteur d'événement de type change qui enverra un événement de type >block ou >accept en fonction de l'état du switch (propriété checked)

Côté serveur

Lors de la réception d'un événement de type >block ou >accept, le serveur doit mettre à jour l'objet acceptMessagesBy.

Exercice

Écrivez deux écouteurs d'événement pour l'objet socket afin de modifier le tableau acceptMessagesBy[nickname]nickname correspond au paramètre de l'événement envoyé par le client.

Enfin, l'envoi des messages et des images (publics et privés) depuis le serveur doit être modifié de façon à ce que seuls les utilisateurs listés dans acceptMessagesBy[sender] ne soient destinataires de l'événement.

Exercice

Modifiez le code des écouteurs d'événement de type >message, >image, >private et >private-image afin de filtrer l'envoi des messages depuis le serveur.

Et après ?

Félicitations, vous avez réalisé avec succès toutes les étapes de la conception d'un serveur de chat. Maintenant, vous êtes libres d'y ajouter vos propres fonctionnalités : soyes créatifs !