XMPPHP GTalk Status
Я пытаюсь получить свой онлайн-статус, используя XMPPHP, и я не могу получить ничего, что имеет мой статус, из $conn
, Вот фрагмент моего кода:
require_once('XMPPHP/XMPP.php');
$conn = new XMPPHP_XMPP('talk.google.com', 5222, 'xxxx@gmail.com', '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()
чтобы увидеть список информации моего друга (хотя меня интересует только мое), но не повезло.
Любые предложения, как я могу заставить это работать? Благодарю.
2 ответа
Я боролся с этой проблемой в течение последних 2 дней, и, наконец, понял, как заставить все работать. Я документирую это здесь, потому что это был вопрос переполнения стека, который чаще всего появлялся у меня при поиске ответов.
Метод $conn->sence() не только отправляет информацию о вашем присутствии на сервер; он также собирает информацию о присутствии для каждого контакта с сервера. Основная проблема состоит в том, что когда вы отправляете команду $conn->sence(), вы должны дать сценарию время для получения и обработки этой информации с сервера. Все примеры сценариев используют $conn->processUntil('sence'), чтобы сделать это, но по какой-то причине для меня это не остановило работу достаточно долго, чтобы получить всю информацию реестра.
Чтобы обойти это, я, наконец, просто использовал $conn->processTime(2), заставляя вещи ждать 2 секунды, прежде чем продолжить. Это достаточно хорошо для моих целей, но явно подло. Итак, используя ваш код в качестве примера:
require_once('XMPPHP/XMPP.php');
$conn = new XMPPHP_XMPP('talk.google.com', 5222, 'xxxx@gmail.com', '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 = 'user@domain.tld'; // put your jid here
$status = $conn->roster->getPresence($my_jid);
echo $status['show'];
Это покажет онлайн статус для jid, который вы предоставляете.
Обратите внимание, что в этом примере я также изменил конструктор для отображения максимально подробного журнала. Это было ключом к тому, чтобы помочь мне пройти через это.
Очевидно, что лучшим решением было бы добавить команду $conn->processUntil('roster') в платформу или что-то в этом роде. Но так как рамки не обновлялись в течение 5 лет, это вряд ли произойдет.
Надеюсь, это сэкономит кому-то те часы, которые я потерял, пытаясь решить эту проблему. Приветствия.
Вы должны иметь возможность запросить собственное присутствие, передав свой собственный jid (username@gmail.com) в 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