Статус GTML XMPPHP - программирование
Подтвердить что ты не робот

Статус GTML XMPPHP

Я пытаюсь получить мой онлайн-статус, используя XMPPHP, и я не могу получить что-либо, у которого есть мой статус, из $conn. Вот фрагмент моего кода:

require_once('XMPPHP/XMPP.php');

$conn = new XMPPHP_XMPP('talk.google.com', 5222, '[email protected]', 'xxxxx', 'xmpphp', 'gmail.com', $printlog = false, $loglevel = XMPPHP_Log::LEVEL_INFO);

$conn->connect();
$conn->processUntil('session_start');
$conn->presence($status='Controller available.');
var_dump($conn); // this gives me a long output but nothing about status. ex: http://pastebin.com/yfs1V5Jb

Я также попробовал getRoster(), чтобы увидеть список моих друзей (хотя Im только заинтересован в моем), но не повезло.

Любые предложения, как я могу заставить это работать? Спасибо.

4b9b3361

Ответ 1

Я занимался этой проблемой в течение последних 2 дней и, наконец, выяснил, как это работает. Я документирую это здесь, потому что это был вопрос, который чаще всего появлялся для меня во время поиска ответов.

Метод $conn- > presence() не только отправляет информацию о вашем присутствии на сервер; он также собирает информацию о присутствии для каждого контакта с сервера. Основная проблема заключается в том, что когда вы отправляете команду $conn- > presence(), вы должны предоставить script время для получения и обработки этой информации с сервера. В сценариях примера все используют $conn- > processUntil ('presence') для этого, но по какой-то причине для меня это не остановило вещи достаточно долго, чтобы получить всю информацию о реестре.

Чтобы обойти это, я, наконец, просто использовал $conn- > processTime (2), заставляя вещи ждать 2 секунды, прежде чем продолжить. Это достаточно хорошо для моих целей, но, безусловно, это взломать. Итак, используя ваш код в качестве примера:

require_once('XMPPHP/XMPP.php');

$conn = new XMPPHP_XMPP('talk.google.com', 5222, '[email protected]', 'xxxxx', 'xmpphp', 'gmail.com', $printlog = true, $loglevel = XMPPHP_Log::LEVEL_VERBOSE);

$conn->connect();
$conn->processUntil('session_start');
$conn->presence($status='Controller available.');
$conn->processTime(2);

// now see the results
$roster = $conn->roster->getRoster();
print_r($roster); // you should now see roster array with presence info for each contact

Чтобы более точно ответить на ваш вопрос, вместо кода в разделе "теперь см. результаты" вы можете использовать следующее:

$my_jid = '[email protected]'; // put your jid here
$status = $conn->roster->getPresence($my_jid);
echo $status['show'];

Это отобразит статус онлайн для предоставленного вами джипа.

Обратите внимание, что в этом примере я также изменил конструктор, чтобы отобразить наиболее подробный журнал. Это было ключом к тому, чтобы помочь мне в этом.

Лучшим решением, очевидно, будет добавление команды $conn- > processUntil ('roster') в фреймворк или что-то в этом роде. Но поскольку структура не обновляется через 5 лет, это вряд ли произойдет.

Надеюсь, это спасет кого-то, что я потерял, пытаясь его решить. Приветствия.

Ответ 2

Вы должны иметь возможность запросить свое собственное присутствие, передав свой собственный jid ([email protected]) в getPresence();

Например:

$status = $conn->roster->getPresence($jid);
var_dump($status);    // Make sure you are retrieving a populated presence array
echo $status['show']; // available,unavailable,dnd
echo $status['status']; //status message

Совсем немного назад я столкнулся с проблемой, когда эта библиотека не заполняла записи реестров. Если вы столкнулись с этой проблемой, вы должны применить исправление, подробно описанное здесь: https://code.google.com/p/xmpphp/issues/detail?id=44&q=empty