Что вам нужно сделать, это:
- Connect.
- Объявить обработчик присутствия. Этот обработчик поддерживает кэш-память о присутствии каждого контакта (подробности см. Ниже)
- Отправка начального присутствия на сервер, который будет вызывать получение статусов присутствия от всех ваших онлайн-контактов, что, в свою очередь, вызовет обработчик.
- Метод status_of () считывает кеш и немедленно определяет состояние присутствия контакта.
Теперь все зависит от того, какая информация о присутствии вам нужна. Для простоты давайте представим, что вам просто нужно значение "онлайн" / "оффлайн". Кеш будет представлять собой словарь, ключами которого являются чистые (без ресурсов) JID, а значения - это набор связанных ресурсов для этого JID. Например:
{'foo@bar.com': set(['work', 'notebook']), 'bob@example.net': set(['gtalk'])}
Теперь, когда вы получаете «доступное» присутствие от определенного JID / ресурса:
if jid not in cache:
cache[jid] = set()
cache[jid].add(resource)
Взаимно, когда вы получаете "недоступное" присутствие:
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]
А теперь:
def is_online(jid):
return jid in cache
Конечно, если вам нужна более подробная информация, вы можете сохранить не только список доступных ресурсов для контакта, но также статус, сообщение о состоянии, приоритет и т. Д. Каждого ресурса.