XMPP: comment demander au serveur pour le statut de présence des contacts d'un utilisateur?

StackOverflow https://stackoverflow.com/questions/4029924

  •  26-09-2019
  •  | 
  •  

Question

Nous avons un site et nous avons développé un système de chat à l'aide de la bibliothèque strophe.js et ejabberd serveur XMPP. Nous utilisons l'attachement de la session qui a été lancé avec PHP (en utilisant une bibliothèque en interne). Ce que nous faisons est d'obtenir le RID et SID à partir du script PHP, puis utilisez l'attachement de la session de strophes. Ledit RID et SID est stocké sur un cookie et la valeur RID sur le cookie est mis à jour chaque mise à jour de la RID sur strophe.js.

Cette belle des travaux, après la connexion que nous recevons l'état de présence de chacun de nos contacts. Le problème est, quand vous allez à une autre page sur le site, et FIXER utilisant ledit RID (nous utilisons la valeur incrémentée produite par strophes) et SID, le serveur ne serait pas envoyer des informations de présence de vos contacts plus par opposition à lorsque vous vous connectez. Cela a causé notre zone de contacts à apparaître invisible, même si elles sont en ligne. Ils ne semblent en ligne si vous (ou votre interlocuteur) ouvrez une session sur le chat, puis connectez à nouveau (puisque vous recevrez une mise à jour de présence du serveur XMPP).

J'ai écrit une solution de contournement où l'état de présence de vos contacts est enregistré sur un cookie (tous les contacts en ligne auront leurs JIDs enregistrés sur le cookie) lorsqu'une présence est reçue du serveur. Ceci est vérifié chaque chargement de page, si le cookie est défini, il sera lu, et tous JIDs sur le cookie sera marqué en ligne. Cela fonctionne bien, mais il pourrait y avoir de meilleures façons de résoudre ce problème, en utilisant les comportements par défaut de XMPP.

Était-ce utile?

La solution

serveurs XMPP envoient des sondes de présence à tous vos contacts en votre nom lorsque vous envoyez votre propre présence initiale au serveur. A partir de là, vous ne recevrez les changements d'état de présence de vos contacts.

Si vous perdez l'état de présence de vos contacts, vous devez envoyer vos propres sondes de présence pour rétablir cet état. Cependant, cela est probablement pas quelque chose que vous voulez faire beaucoup, et en passant autour de l'état de présence est probablement préféré dans la plupart des cas.

Vous pouvez essayer de faire passer l'état via XMPP. Par exemple, vous pouvez utiliser le stockage XML privé (XEP-0049), Pubsub (XEP-0060) ou PEP (XEP-0163).

Une autre option au lieu de cookies pour le passer côté client est d'utiliser un objet HTML5 SharedWorker pour maintenir l'état.

Autres conseils

Je frémis à l'idée des propriétés d'échelle associées à stocker toutes de la présence que vous venez de recevoir à l'arrière du serveur au serveur de stockage privé. Le stockage privé presque toujours est soutenu au stockage à long terme plutôt que stockées dans la mémoire, de sorte que vous allez rectifier le disque de votre serveur à la poussière.

Si vous souhaitez stocker plus état dans le navigateur, et vous isoler de la version du navigateur, et vous utilisez déjà jQuery, puis jStore est assez douce.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top