<?php
define("TEAMWOX_HOST", "your.domain.com");
/**
* проверка строки в hex формате
*
* @param string $hex
* @return boolean true если строка в hex формате, иначе false
*/
function is_hex($hex)
{
// обработка строки
$hex = strtolower(trim(ltrim($hex, "0")));
if (empty($hex))
{
$hex = 0;
}
$dec = hexdec($hex);
return ($hex == dechex($dec));
}
/**
* сборка чанков http 'transfer-encoding: chunked'
*
* @param string $chunk исходная строка
* @return string строка с объединенными чанками
*/
function http_chunked_decode($chunk)
{
$pos = 0;
$len = strlen($chunk);
$dechunk = null;
//--- в цикле получаем чанки и соединяем
while (($pos < $len) && ($chunk_len_hex = substr($chunk, $pos, ($new_line_at = strpos($chunk, "\n", $pos + 1)) - $pos)))
{
if (!is_hex($chunk_len_hex))
{
trigger_error('Не правильное число', E_USER_WARNING);
return $chunk;
}
//--- информация о следующем чанке
$pos = $new_line_at + 1;
$chunk_len = hexdec(rtrim($chunk_len_hex, "\r\n"));
//--- объединение чанков
$dechunk .= substr($chunk, $pos, $chunk_len);
$pos = strpos($chunk, "\n", $pos + $chunk_len) + 1;
}
return $dechunk;
}
/**
* Функция получения данных обо всех группах и их статусах
* @return object
*/
function MQ_Query_get_chat_group()
{
//--- открываем сокет к TEAMWOX_HOST 443-й порт с таймаутом в 30 секунд
$socket = fsockopen(TEAMWOX_HOST, 80, $errno, $errstr, 30);
if (!$socket)
{
trigger_error($errstr, E_USER_WARNING);
return false;
}
//--- создадим запрос
$query = "GET /public/chat/groups?json HTTP/1.1\r\n";
$query .= "Host: " . TEAMWOX_HOST . "\r\n";
$query .= "User-agent: Web-site\r\n";
$query .= "Connection: Close\r\n\r\n";
//--- пишем в сокет запрос
fwrite($socket, $query);
//--- получаем ответ
$answer = '';
while (!feof($socket))
{
$answer .= fgets($socket, 4096);
}
//--- закрываем сокет
fclose($socket);
//--- проверяем ответ
$pos = strpos($answer, "\r\n\r\n");
if ($pos > 0)
{
//--- нашли тело ответа
$body = substr($answer, $pos + 4);
$body = http_chunked_decode($body);
return json_decode($body);
}
return false;
}
/**
* Функция для вывод статусов
* @return void
*/
function MQ_Print_status()
{
$data = MQ_Query_get_chat_group();
if (empty($data)) return;
//---
if (empty($data->groups)) return;
foreach ($data->groups as $info)
{
if (empty($info)) continue;
//--- вывод статуса
echo $info->name, " ", ($info->online == 1 ? "on-line" : "off line"), "<br>\r\n";
}
}
//--- вызов функция отображения статусов
MQ_Print_status();
?> |