ProgWebAv WebSocket - 2e partie

Afin de travailler sur la dialogue entre deux clients Web, nous allons améliorer le Chat pour que celui-ci permette aux utilisateurs d'envoyer des messages privés entre eux. Pour ce faire nous allons ajouter un système de commande au chat.

1) Une syntaxe pour les commandes

Une syntaxe courrante pour les commandes et de les préfixer par un slash. Par exemple la commande :

/msg email message
permettrait l'envoit d'un message privé. Afin de développer un système évolutif permettant l'ajout de nouvelle commande, vous allez devoir coder la gestion des appels des commandes (une sorte de dispatcher).

2) Un dispatcher pour les commandes

Vos commandes sont actuellement "dispatchées" vers votre action send de votre "controller" Chat. Il faut donc y ajouter un test sur le contenu du message afin de différencier les messages "standards" des commandes. Pour ce faire, une analyse sur le premier caractère de la chaine devrait suffir. Si c'est un slash, déléguez le reste du dispatcher à une autre méthode de votre controller (une méthode avec la visibilité "private").

Les carctères qui suivent le slash avant le premier espace (ou la fin de chaine) sera alors le nom de la commande. Les autres caractères de la chaine seront considérés comme les données (paramètres) de la commande. Pour vous aidez à l'analyse de la chaine, vous pouvez utiliser la commande php "trim".

Une fois le nom de la commande identifiée et ses paramètres recupérés, testez l'existance de la commande. Pour ce faire, il est conseillé de regrouper toutes vos commandes dans un controller et de tester l'existance de la commande dans le controller grâce à la function method_exists (vous pouvez vous inspirer du code du dispatcher codé dans la méthode onmessage). Finalement, appelez cette méthode avec les paramètres de la commande, l'instance du client l'ayant envoyé ainsi que l'instance du "router" websocket pour que la méthode puisse utilise les fonctionnalité d'envoit de message qui s'y trouve.

Pour tester, essayez de créer une nouvelle commande nommée "ping" qui retournera à l'utilisateur un simple "pong"

3) la commande /msg

Pour cette commande, il va falloir encore analyser les paramètres de la commande. En effet ceux-ci sont au nombre de 2: le 1er va vous servir à identifier l'utilisateur à qui envoyer le message, tandis que le 2e sera le message à lui envoyer. Il va donc falloir recherche les clients possédant cette email dans la liste des clients authentifiés au Chat, puis leur envoyé le message. De plus un retour pour l'utilisateur ayant envoyé le message et nécessaire. Celui-ci devrait contenir un message indiquand le succès ou l'echec de l'envoit du message.

4) Modification du code client afin qu'il s'adapte à cette nouvelle fonctionnalité

Afin que les messages privé soit visuellement différent des messages publique, il vous faut modifier le code coté client. Il est conseillé d'envoyer un paramètre" action" spécial pour le client. Par exemple, une stucture comme la suivante semble adéquate:

{
    "action" : "send",
    "data": {
        "email": "foo@bar.com",
        "msg": "Hello World",
        "private": true 
    }
}
De plus, vous pouvez prévoir une autres syntaxe pour les messages "system" (comme votre commande /pong par exemple):

{
    "action" : "system",
    "data": {
        "msg": "pong",
    }
}
Si vous avez besoin d'aide pour la modification coté client, n'hésitez pas à me contacter sous slack (cette partie ne sera pas évalué durant l'examen).