Ce que vous devez faire est:
- Connect.
- Déclarez un gestionnaire de présence. Ce gestionnaire maintient un cache de la présence de chaque contact (voir détails ci-dessous)
- Envoie une présence initiale au serveur, ce qui provoquera la réception des statuts de présence de tous vos contacts en ligne, ce qui déclenchera à son tour le gestionnaire.
- La méthode status_of() lit le cache et déduit immédiatement l'état de présence du contact.
Maintenant, cela dépend des informations de présence dont vous avez besoin. Par souci de simplicité, supposons que vous ayez juste besoin d'une valeur "en ligne"/"hors ligne". Le cache serait un dictionnaire dont les clés sont les JID nus (sans ressource) et les valeurs sont un ensemble de ressources connectées pour ce JID.Par exemple:
{'[email protected]': set(['work', 'notebook']), '[email protected]': set(['gtalk'])}
Maintenant, lorsque vous recevez une présence "disponible" à partir d'un certain JID/ressource:
if jid not in cache:
cache[jid] = set()
cache[jid].add(resource)
Réciproquement, lorsque vous recevez une présence "non disponible":
if jid in cache: # bad people send "unavailable" just to make your app crash
cache[jid].discard(resource)
if 0 == len(cache[jid]):
del cache[jid]
Et maintenant:
def is_online(jid):
return jid in cache
Bien sûr, si vous souhaitez des informations plus détaillées, vous pouvez gérer non seulement la liste des ressources disponibles pour un contact mais également le statut, le message d'état, la priorité, etc. de chaque ressource.