EngineGP/system/library/games/graph.php
2023-05-05 04:17:19 +03:00

398 lines
19 KiB
PHP

<?php
if (!DEFINED('EGP'))
exit(header('Refresh: 0; URL=http://' . $_SERVER['SERVER_NAME'] . '/404'));
class graph
{
public static function full($server, $slots, $key, $time)
{
// Массивы данных
$aData = graph::graph_data($time, $server, $slots);
$aOnline = $aData['online'];
$aCPU = $aData['cpu'];
$aRAM = $aData['ram'];
$aHDD = $aData['hdd'];
$MyData = new pData();
// Онлайн
$MyData->addPoints($aOnline, 'ONLINE');
// CPU
$MyData->addPoints($aCPU, 'CPU');
// RAM
$MyData->addPoints($aRAM, 'RAM');
// HDD
$MyData->addPoints($aHDD, 'HDD');
// Время
$MyData->addPoints($aData['time'], 'TIME');
$MyData->setSerieOnAxis('CPU', 1);
$MyData->setSerieOnAxis('RAM', 1);
$MyData->setSerieOnAxis('HDD', 1);
$MyData->setAxisPosition(1, AXIS_POSITION_RIGHT);
$MyData->setAxisName(0, 'Онлайн');
$MyData->setAxisName(1, 'Нагрузка %');
$MyData->setAbscissa('TIME');
// Сечение линии
$MyData->setSerieTicks('ONLINE', 4);
// Цвет линий
$MyData->setPalette('ONLINE', array('R' => 68, 'G' => 148, 'B' => 224));
$MyData->setPalette('CPU', array('R' => 216, 'G' => 65, 'B' => 65));
$MyData->setPalette('RAM', array('R' => 26, 'G' => 150, 'B' => 38));
$MyData->setPalette('HDD', array('R' => 205, 'G' => 196, 'B' => 37));
$myPicture = new pImage(896, 220, $MyData);
$myPicture->drawFilledRectangle(0, 0, 896, 220, array('R' => 255, 'G' => 255, 'B' => 255));
$myPicture->drawRectangle(0, 0, 895, 219, array('R' => 221, 'G' => 221, 'B' => 221));
$myPicture->setFontProperties(array('R' => 25, 'G' => 25, 'B' => 25, 'FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8));
$myPicture->setGraphArea(40, 20, 616, 190);
$myPicture->drawFilledRectangle(40, 20, 616, 190, array('R' => 240, 'G' => 242, 'B' => 242, 'Alpha' => 100));
$myPicture->drawScale(array('XMargin' => 5, 'YMargin' => 5, 'GridR' => 76, 'GridG' => 109, 'GridB' => 120, 'LabelSkip' => 0, 'DrawSubTicks' => TRUE, 'Mode' => SCALE_MODE_MANUAL, 'Factors' => array(0 => array($slots), 1 => array(25, 50, 75, 100)), 'ManualScale' => array(0 => array('Min' => 0, 'Max' => $slots), 1 => array('Min' => 0, 'Max' => 100))));
$myPicture->drawText(676, 34, 'Средний онлайн: ' . graph::average($aOnline), array('R' => 25, 'G' => 25, 'B' => 25, 'FontName' => LIB . 'games/graph/fonts/arianamu.ttf', 'FontSize' => 10, 'Align' => TEXT_ALIGN_BOTTOMLEFT));
$myPicture->drawText(676, 54, 'Средняя нагрузка (CPU): ' . graph::average($aCPU) . '%', array('R' => 25, 'G' => 25, 'B' => 25, 'FontName' => LIB . 'games/graph/fonts/arianamu.ttf', 'FontSize' => 10, 'Align' => TEXT_ALIGN_BOTTOMLEFT));
$myPicture->drawText(676, 74, 'Средняя нагрузка (RAM): ' . graph::average($aRAM) . '%', array('R' => 25, 'G' => 25, 'B' => 25, 'FontName' => LIB . 'games/graph/fonts/arianamu.ttf', 'FontSize' => 10, 'Align' => TEXT_ALIGN_BOTTOMLEFT));
$myPicture->drawText(676, 94, 'Средняя нагрузка (HDD): ' . graph::average($aHDD) . '%', array('R' => 25, 'G' => 25, 'B' => 25, 'FontName' => LIB . 'games/graph/fonts/arianamu.ttf', 'FontSize' => 10, 'Align' => TEXT_ALIGN_BOTTOMLEFT));
$myPicture->drawText(676, 129, 'Максимальный онлайн: ' . max($aOnline), array('R' => 25, 'G' => 25, 'B' => 25, 'FontName' => LIB . 'games/graph/fonts/arianamu.ttf', 'FontSize' => 10, 'Align' => TEXT_ALIGN_BOTTOMLEFT));
$myPicture->drawText(676, 153, 'Максимальная нагрузка (CPU): ' . max($aCPU) . '%', array('R' => 25, 'G' => 25, 'B' => 25, 'FontName' => LIB . 'games/graph/fonts/arianamu.ttf', 'FontSize' => 10, 'Align' => TEXT_ALIGN_BOTTOMLEFT));
$myPicture->drawText(676, 173, 'Максимальная нагрузка (RAM): ' . max($aRAM) . '%', array('R' => 25, 'G' => 25, 'B' => 25, 'FontName' => LIB . 'games/graph/fonts/arianamu.ttf', 'FontSize' => 10, 'Align' => TEXT_ALIGN_BOTTOMLEFT));
$myPicture->drawText(676, 193, 'Максимальная нагрузка (HDD): ' . max($aHDD) . '%', array('R' => 25, 'G' => 25, 'B' => 25, 'FontName' => LIB . 'games/graph/fonts/arianamu.ttf', 'FontSize' => 10, 'Align' => TEXT_ALIGN_BOTTOMLEFT));
$myPicture->setFontProperties(array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 7));
$myPicture->drawSplineChart();
$myPicture->setShadow(FALSE);
$myPicture->drawLegend(466, 10, array('Style' => LEGEND_NOBORDER, 'Mode' => LEGEND_HORIZONTAL));
$myPicture->render(TEMP . (md5($key . 'full_' . $time)) . '.png');
unset($MyData, $myPicture);
return NULL;
}
public static function first($server, $aPoints, $aStyle, $style, $key)
{
global $cfg, $aGname;
$MyData = new pData();
// Значения
$MyData->addPoints($aPoints, 'ONLINE');
$MyData->addPoints(array(VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID), 'NONE');
$MyData->setAbscissa('NONE');
// Цвет линии
$MyData->setPalette('ONLINE', $aStyle[$style]['line']);
// Размер баннера
$myPicture = new pImage(160, 248, $MyData);
// Цвет фона
$myPicture->drawFilledRectangle(0, 0, 160, 248, $aStyle[$style]['fon']);
// Обводка
$myPicture->drawRectangle(0, 0, 159, 247, $aStyle[$style]['border']);
// Шрифт текста
$myPicture->setFontProperties(array_merge($aStyle[$style]['color'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 5)));
// Размер графика
$myPicture->setGraphArea(35, 160, 150, 210);
// Цвет фона графика
$myPicture->drawFilledRectangle(35, 160, 150, 210, $aStyle[$style]['graph']);
// График
$myPicture->drawScale(array('XMargin' => 5, 'YMargin' => 5, 'CycleBackground' => TRUE, 'LabelSkip' => 0, 'DrawSubTicks' => TRUE, 'Mode' => SCALE_MODE_MANUAL, 'Factors' => array(0 => array($server['slots_start'])), 'ManualScale' => array(0 => array('Min' => 0, 'Max' => $server['slots_start']))));
// Название игрового сервера
$myPicture->drawFilledRectangle(0, 0, 18, 248, $aStyle[$style]['leftbox']);
$myPicture->drawText(14, 245, $server['name'], array_merge($aStyle[$style]['boxcolor'], array('Angle' => 90, 'FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 10)));
$myPicture->drawFilledRectangle(0, 0, 18, 5, $aStyle[$style]['leftbox']);
// Адрес игрового сервера
$myPicture->drawFilledRectangle(25, 5, 153, 18, $aStyle[$style]['box']);
$myPicture->drawText(28, 17, 'Адрес сервера', array_merge($aStyle[$style]['boxcolor'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
$myPicture->drawText(26, 30, $server['address'], array_merge($aStyle[$style]['color'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
// Статус игрового сервера
$myPicture->drawFilledRectangle(25, 35, 153, 48, $aStyle[$style]['box']);
$myPicture->drawText(28, 47, 'Состояние сервера', array_merge($aStyle[$style]['boxcolor'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
$myPicture->drawText(26, 62, graph::status($server['status'], $server['map']), array_merge($aStyle[$style]['color'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
// Игроки на игровом сервере
$myPicture->drawFilledRectangle(25, 65, 153, 78, $aStyle[$style]['box']);
$myPicture->drawText(28, 77, 'Игроки на сервере', array_merge($aStyle[$style]['boxcolor'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
$myPicture->drawText(26, 92, $server['online'] . ' / ' . $server['slots_start'], array_merge($aStyle[$style]['color'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
// Полоска загрузки
$myPicture->drawProgress(83, 82, ceil($server['slots_start'] / 100 * $server['online']), array_merge($aStyle[$style]['progress'], array('Width' => 70, 'Height' => 8)));
// Тип игрового сервера
$myPicture->drawFilledRectangle(25, 95, 153, 108, $aStyle[$style]['box']);
$myPicture->drawText(28, 107, 'Тип сервера', array_merge($aStyle[$style]['boxcolor'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
$myPicture->drawText(26, 122, $aGname[$server['game']], array_merge($aStyle[$style]['color'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
// Хостинг игровых серверов
$myPicture->drawText(89, 230, $cfg['graph'], array_merge($aStyle[$style]['color'], array('FontSize' => 10, 'Align' => TEXT_ALIGN_BOTTOMMIDDLE)));
$myPicture->drawText(89, 245, 'Хостинг игровых серверов', array_merge($aStyle[$style]['color'], array('FontSize' => 8, 'Align' => TEXT_ALIGN_BOTTOMMIDDLE)));
$myPicture->drawSplineChart();
$myPicture->render(TEMP . (md5($key . $style . 'first')) . '.png');
unset($MyData, $myPicture);
return NULL;
}
public static function second($server, $aPoints, $aStyle, $style, $key)
{
global $cfg, $aGname;
$MyData = new pData();
// Значения
$MyData->addPoints($aPoints, 'ONLINE');
$MyData->addPoints(array(VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID, VOID), 'NONE');
$MyData->setAbscissa('NONE');
// Цвет линии
$MyData->setPalette('ONLINE', $aStyle[$style]['line']);
// Размер баннера
$myPicture = new pImage(560, 95, $MyData);
// Цвет фона
$myPicture->drawFilledRectangle(0, 0, 560, 95, $aStyle[$style]['fon']);
// Название игрового сервера
$myPicture->drawFilledRectangle(5, 5, 410, 18, $aStyle[$style]['box']);
$myPicture->drawText(8, 17, 'Название сервера', array_merge($aStyle[$style]['boxcolor'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
$myPicture->drawText(6, 31, $server['name'], array_merge($aStyle[$style]['color'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
// Костыль для "обрезания" названия сервера
$myPicture->drawFilledRectangle(405, 19, 560, 35, $aStyle[$style]['fon']);
// Обводка
$myPicture->drawRectangle(0, 0, 559, 94, $aStyle[$style]['border']);
// Шрифт текста
$myPicture->setFontProperties(array_merge($aStyle[$style]['color'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 5)));
// Размер графика
$myPicture->setGraphArea(430, 5, 554, 60);
// Цвет фона графика
$myPicture->drawFilledRectangle(430, 5, 554, 60, $aStyle[$style]['graph']);
// График
$myPicture->drawScale(array('XMargin' => 5, 'YMargin' => 5, 'CycleBackground' => TRUE, 'LabelSkip' => 0, 'DrawSubTicks' => TRUE, 'Mode' => SCALE_MODE_MANUAL, 'Factors' => array(0 => array($server['slots_start'])), 'ManualScale' => array(0 => array('Min' => 0, 'Max' => $server['slots_start']))));
// Адрес игрового сервера
$myPicture->drawFilledRectangle(5, 36, 210, 49, $aStyle[$style]['box']);
$myPicture->drawText(8, 48, 'Адрес сервера', array_merge($aStyle[$style]['boxcolor'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
$myPicture->drawText(6, 62, $server['address'], array_merge($aStyle[$style]['color'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
// Статус игрового сервера
$myPicture->drawFilledRectangle(215, 36, 410, 49, $aStyle[$style]['box']);
$myPicture->drawText(218, 48, 'Состояние сервера', array_merge($aStyle[$style]['boxcolor'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
$myPicture->drawText(216, 62, graph::status($server['status'], $server['map']), array_merge($aStyle[$style]['color'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
// Игроки на игровом сервере
$myPicture->drawFilledRectangle(5, 67, 210, 80, $aStyle[$style]['box']);
$myPicture->drawText(8, 79, 'Игроки на сервере', array_merge($aStyle[$style]['boxcolor'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
$myPicture->drawText(6, 93, $server['online'] . ' / ' . $server['slots_start'], array_merge($aStyle[$style]['color'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
// Полоска загрузки
$myPicture->drawProgress(90, 83, ceil($server['slots_start'] / 100 * $server['online']), array_merge($aStyle[$style]['progress'], array('Width' => 120, 'Height' => 8)));
// Тип игрового сервера
$myPicture->drawFilledRectangle(215, 67, 410, 80, $aStyle[$style]['box']);
$myPicture->drawText(218, 79, 'Тип сервера', array_merge($aStyle[$style]['boxcolor'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
$myPicture->drawText(216, 91, $aGname[$server['game']], array_merge($aStyle[$style]['color'], array('FontName' => LIB . 'games/graph/fonts/tahoma.ttf', 'FontSize' => 8)));
// Хостинг игровых серверов
$myPicture->drawText(490, 77, $cfg['graph'], array('FontSize' => 10, 'Align' => TEXT_ALIGN_BOTTOMMIDDLE));
$myPicture->drawText(490, 90, 'Хостинг игровых серверов', array('FontSize' => 8, 'Align' => TEXT_ALIGN_BOTTOMMIDDLE));
$myPicture->drawSplineChart();
$myPicture->render(TEMP . (md5($key . $style . 'second')) . '.png');
unset($MyData, $myPicture);
return NULL;
}
public static function online_day($server, $max)
{
global $sql, $start_point;
$time = $start_point - 86400;
$aOnline = array();
$aSel = array();
$sql->query('SELECT `online` FROM `graph_hour` WHERE `server`="' . $server . '" AND `time`>"' . $time . '" ORDER BY `id` DESC LIMIT 24');
while ($value = $sql->get())
$aSel[] = $value['online'];
$n = count($aSel);
$n = $n > 1 ? $n - 1 : 0;
if ($n) {
for ($i = $n; $i >= 0; $i -= 1)
$aOnline[] = $aSel[$i] > $max ? $max : $aSel[$i];
}
$add = count($aOnline);
if ($add < 24) {
for ($i = $n; $i <= 23; $i += 1)
$aOnline[] = 0;
}
return $aOnline;
}
private static function graph_data($period, $server, $max)
{
global $sql, $start_point;
$aData = array(
'limit' => array(
'day' => 24,
'week' => 7,
'month' => 30
),
'for' => array(
'day' => 23,
'week' => 6,
'month' => 29
),
'from' => array(
'day' => 'graph_hour',
'week' => 'graph_day',
'month' => 'graph_day'
),
'time' => array(
'day' => 86400,
'week' => 604800,
'month' => 2592000
)
);
$time = $start_point - $aData['time'][$period];
$aOnline = array();
$aCPU = array();
$aRAM = array();
$aHDD = array();
$aTime = array();
$aSel = array();
$sql->query('SELECT `online`, `cpu`, `ram`, `hdd`, `time` FROM `' . $aData['from'][$period] . '` WHERE `server`="' . $server . '" AND `time`>"' . $time . '" ORDER BY `id` DESC LIMIT ' . $aData['limit'][$period]);
while ($value = $sql->get())
$aSel[] = array('online' => $value['online'], 'cpu' => $value['cpu'], 'ram' => $value['ram'], 'hdd' => $value['hdd'], 'time' => $value['time']);
$n = count($aSel);
$n = $n > 1 ? $n - 1 : 0;
$next = true;
if (isset($aSel[$n]['online'])) {
for ($i = $n; $i >= 0; $i -= 1) {
$aOnline[] = $aSel[$i]['online'] > $max ? $max : $aSel[$i]['online'];
$aCPU[] = $aSel[$i]['cpu'];
$aRAM[] = $aSel[$i]['ram'];
$aHDD[] = $aSel[$i]['hdd'];
if ($next) {
$aTime[] = VOID;
$next = false;
} else {
$aTime[] = $period == 'day' ? date('H:i', $aSel[$i]['time']) : date('d.m', $aSel[$i]['time']);
$next = true;
}
}
}
$add = count($aOnline);
for ($i = $add; $i <= $aData['for'][$period]; $i += 1) {
$aOnline[] = 0;
$aCPU[] = 0;
$aRAM[] = 0;
$aHDD[] = 0;
$aTime[] = VOID;
}
return array('online' => $aOnline, 'cpu' => $aCPU, 'ram' => $aRAM, 'hdd' => $aHDD, 'time' => $aTime);
}
private static function status($status, $map)
{
switch ($status) {
case 'working':
return 'Карта: ' . $map;
case 'off':
return 'Статус: выключен';
case 'start':
return 'Статус: запускается';
case 'restart':
return 'Статус: перезапускается';
case 'change':
return 'Статус: меняется карта';
case 'install':
return 'Статус: устанавливается';
case 'reinstall':
return 'Статус: переустанавливается';
case 'update':
return 'Статус: обновляется';
case 'recovery':
return 'Статус: восстанавливается';
case 'overdue':
return 'Статус: просрочен';
case 'blocked':
return 'Статус: заблокирован';
}
}
private static function average($arr)
{
return !count($arr) ? 0 : ceil(array_sum($arr) / count($arr));
}
}
?>