Moved the Agents into their own repo. Kept the agent.pl just for reference

This commit is contained in:
Frank Harris 2025-09-11 13:27:32 -04:00
parent 22381be29a
commit 8680a02b13
18132 changed files with 0 additions and 2569420 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,430 +0,0 @@
:root {
--dark-1: #2f3439;
--dark-2: #2a2e33;
--dark-3: #24282d;
/* 1a -> 10% */
/* 66 -> 40% */
/* cc -> 80% */
}
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-button {
width: 0px;
height: 0px;
}
::-webkit-scrollbar-corner {
background: transparent;
}
@media (min-width: 768px) {
body {
padding-bottom: 25px;
}
}
.dark-mode::-webkit-scrollbar-thumb,
.dark-mode *::-webkit-scrollbar-thumb {
background: rgba(255,255,255,.4);
border: 0px none rgba(255,255,255,.4);
border-radius: 10px;
}
.dark-mode::-webkit-scrollbar-thumb:hover,
.dark-mode *::-webkit-scrollbar-thumb:hover {
background: rgba(255,255,255,.4);
}
.dark-mode::-webkit-scrollbar-thumb:activ,
.dark-mode *::-webkit-scrollbar-thumb:active {
background: rgba(255,255,255,.4);
}
.dark-mode::-webkit-scrollbar-track,
.dark-mode *::-webkit-scrollbar-track {
border: 0px none rgba(255,255,255,.4);
border-radius: 10px;
}
.light-mode::-webkit-scrollbar-thumb,
.light-mode *::-webkit-scrollbar-thumb {
background: rgba(0,0,0,.4);
border: 0px none rgba(0,0,0,.4);
border-radius: 10px;
}
.light-mode::-webkit-scrollbar-thumb:hover,
.light-mode *::-webkit-scrollbar-thumb:hover {
background: rgba(0,0,0,.4);
}
.light-mode::-webkit-scrollbar-thumb:active,
.light-mode *::-webkit-scrollbar-thumb:active {
background: rgba(0,0,0,.4);
}
.light-mode::-webkit-scrollbar-track,
.light-mode *::-webkit-scrollbar-track {
border: 0px none rgba(0,0,0,.4);
border-radius: 10px;
}
.main-sidebar .sidebar {
overflow-x: hidden !important;
}
.sidebar .os-scrollbar-handle {
width: 3px;
margin-left: 4px;
}
.mixed-mode footer a.text-dark:hover,
.dark-mode a.text-dark:hover {
color: #fff !important;
}
.light-mode .os-theme-light > .os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle {
background: rgba(0,0,0,.4) !important;
}
.dark-mode .os-theme-light > .os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle {
background: rgba(255,255,255,.4) !important;
}
.ace_scrollbar-v,
.ace_scrollbar-inner {
width: 6px !important;
}
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active{
-webkit-box-shadow: inset !important;
}
.login-page .navbar {
position: fixed;
top: 0px;
left: 0px;
width: 100%;
}
.preloader {
align-items: center;
justify-content: center;
}
.brand-link {
display: inline-block;
}
.sidebar-collapse .brand-link > img {
margin: 0px;
}
.user-panel img
{
width: 2.1rem;
height: 2.1rem;
}
.rc-anchor-dark.rc-anchor-normal {
border: 1px solid #6c757d;
background: #454d55;
}
.hide, .hidden {
display: none;
}
body.sidebar-collapse .main-sidebar:not(.hover) .text-truncate
{
text-overflow: unset;
}
.main-sidebar img.nav-icon {
width: 14px !important;
height: 14px !important;
}
body.sidebar-collapse .main-sidebar img.nav-icon {
margin-left: 7px !important;
}
body:not(.sidebar-collapse) .main-sidebar img.nav-icon {
margin-right: 7px !important;
}
.nav-sidebar .nav-link p {
white-space: nowrap !important;
}
.nav-sidebar .nav-item img.nav-icon {
margin-right: 0.5rem;
}
.card .card-body > pre {
padding: 0px;
background: transparent;
}
.card:not(.maximized-card) .card-body > pre {
max-height: 400px;
overflow: auto;
}
pre {
padding: 1rem;
}
.dark-mode pre {
color: #fff;
background-color: var(--dark-1);
}
.light-mode pre {
background-color: var(--light);
}
.callout a {
text-decoration: none;
color: #007bff;
}
.versionInfo:hover {
cursor: pointer;
color: #fff;
}
.sort-highlight {
background: rgb(52 58 64 / 50%);
border: 2px dashed #2d3338;
margin-bottom: 10px;
border-radius: 4px;
}
.collapsible:hover {
cursor: pointer;
}
.card-body.p-0 > .table > tbody > tr:nth-child(1) > td {
border-top: none;
}
.loading:before {
content: "\f110" !important;
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear;
}
.loading {
content: "Loading..." !important;
}
.shortblink {
animation: blink 1s infinite;
}
@keyframes blink {
50% {
opacity: 0.3;
}
}
.light-mode .btn.redirectLink {
color: var(--light);
}
.dark-mode .white-popup {
background-color: var(--dark);
border: 10px solid var(--dark);
color: var(--light);
}
.dark-mode .magnificTitle {
background-color: var(--dark);
}
.btn:not(.btn-tool) {
margin-bottom: 0.1rem;
margin-right: 0.25rem;
}
.loading-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 99;
text-align: center;
background-color: rgb(0 0 0 / 40%);
}
.loading-overlay img {
top: 40%;
position: absolute;
}
.tablesorter-header {
white-space: nowrap;
}
table.tablesorter thead tr .tablesorter-header {
background-repeat: no-repeat;
background-position: center right;
cursor: pointer;
}
table.tablesorter thead tr .tablesorter-headerUnSorted {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC");
}
table.tablesorter thead tr .tablesorter-headerAsc {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==");
}
table.tablesorter thead tr .tablesorter-headerDesc {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=");
}
#toast-container {
min-width: 28%;
max-width: calc(100% - 32px);
width: auto;
}
#toast-container > div {
width: 100%;
}
.dark-mode .input-group-text {
background-color: var(--dark-2);
}
/* *** mfp popup *** */
.mfp-bg {
opacity: 0.3;
}
.light-mode .white-popup {
border-color: var(--gray);
border-radius: 6px;
background-color: var(--light);
}
.light-mode .magnificTitle {
background-color: var(--gray);
}
.ui-dialog .ui-dialog-content {
min-height: 60px !important;
}
/* Icons Default */
.administration-table a:before,
.monitorButtonContainer a:before
{ content: "\f101"; }
/* Icons Defined */
/* FA Set */
.monitorButtonContainer a:before,
.srvctrl a:before {
font-family: "Font Awesome 5 Free";
font-weight: 900;
}
/* Brands */
.nav-sidebar [href^="?m=steam_workshop"] > .nav-icon,
.administration-table [href^="?m=steam_workshop"]:before,
.monitorButtonContainer [href^="?m=steam_workshop"]:before,
.monitorButtonContainer [href^="?m=gamemanager&p=update"]:before,
.nav-sidebar [href="?m=TS3Admin"] > .nav-icon
{
font-family: "Font Awesome 5 Brands";
font-weight: 400;
}
/* Icons */
.nav-sidebar [href="?m=dashboard&p=dashboard"] > .nav-icon:before,
.administration-table [href="?m=dashboard&p=dashboard"]:before { content: "\f3fd"; }
.nav-sidebar [href="?m=gamemanager&p=game_monitor"] > .nav-icon:before,
.nav-sidebar [link="?m=gamemanager&p=game_monitor"] > .nav-icon:before { content: "\f108"; }
.nav-sidebar [href="?m=administration&p=main"] > .nav-icon:before,
.nav-sidebar [link="?m=administration&p=main"] > .nav-icon:before { content: "\f023"; }
.nav-sidebar [href="?m=TS3Admin"] > .nav-icon:before { content: "\f4f9"; }
.nav-sidebar [href^="?m=gamemanager&p=log"] > .nav-icon:before,
.monitorButtonContainer [href^="?m=gamemanager&p=log"]:before { content: "\f1da"; }
.nav-sidebar [href="?m=addonsmanager&p=addons_manager"] > .nav-icon:before,
.monitorButtonContainer [href^="?m=addonsmanager&p=user_addons"]:before,
.administration-table [href="?m=addonsmanager&p=addons_manager"]:before { content: "\f12e"; }
.nav-sidebar [href="?m=extras"] > .nav-icon:before,
.administration-table [href="?m=extras"]:before{ content: "\f1e6"; }
.nav-sidebar [href^="?m=ftp"] > .nav-icon:before,
.monitorButtonContainer [href^="?m=ftp"]:before,
.administration-table [href^="?m=ftp"]:before{ content: "\f15c"; }
.nav-sidebar [href="?m=user_games"] > .nav-icon:before,
.administration-table [href="?m=user_games"]:before{ content: "\f11b"; }
.nav-sidebar [href="?m=config_games"] > .nav-icon:before,
.administration-table [href="?m=config_games"]:before{ content: "\f044"; }
.nav-sidebar [href^="?m=litefm"] > .nav-icon:before,
.nav-sidebar [href="?m=litefm&p=litefm_settings"] > .nav-icon:before,
.administration-table [href="?m=litefm&p=litefm_settings"]:before,
.nav-sidebar [href^="?m=user_games&p=edit"] > .nav-icon:before,
.monitorButtonContainer [href^="?m=user_games&p=edit"]:before{ content: "\f085"; }
.nav-sidebar [href="?m=modulemanager"] > .nav-icon:before,
.administration-table [href="?m=modulemanager"]:before { content: "\f009"; }
.nav-sidebar [href="?m=settings"] > .nav-icon:before,
.administration-table [href="?m=settings"]:before { content: "\f1de"; }
.nav-sidebar [href="?m=server"] > .nav-icon:before,
.administration-table [href="?m=server"]:before { content: "\f233"; }
.nav-sidebar [href="?m=settings&p=themes"] > .nav-icon:before,
.administration-table [href="?m=settings&p=themes"]:before { content: "\f043"; }
.nav-sidebar [href="?m=update"] > .nav-icon:before,
.administration-table [href="?m=update"]:before { content: "\f021"; }
.nav-sidebar [href^="?m=gamemanager&p=update"] > .nav-icon:before,
.nav-sidebar [href^="?m=steam_workshop"] > .nav-icon:before,
.administration-table [href^="?m=steam_workshop"]:before,
.monitorButtonContainer [href^="?m=steam_workshop"]:before,
.monitorButtonContainer [href^="?m=gamemanager&p=update"]:before { content: "\f1b6"; }
.nav-sidebar [href^="?m=user_admin"] > .nav-icon:before,
.nav-sidebar [link^="?m=user_admin"] > .nav-icon:before,
.administration-table [href^="?m=user_admin"]:before{ content: "\f007"; }
.nav-sidebar [href="?m=user_admin&p=show_groups"] > .nav-icon:before { content: "\f0c0"; }
.nav-sidebar [href="?m=administration&p=watch_logger"] > .nav-icon:before,
.administration-table [href="?m=administration&p=watch_logger"]:before { content: "\f017"; }
.nav-sidebar [href^="?m=cron"] > .nav-icon:before,
.administration-table [href^="?m=cron"]:before { content: "\f073"; }
.nav-sidebar [href="?m=mysql&p=mysql_admin"] > .nav-icon:before,
.monitorButtonContainer [href^="?m=mysql"]:before,
.administration-table [href="?m=mysql&p=mysql_admin"]:before { content: "\f1c0"; }
.nav-sidebar [href="?m=administration&p=banlist"] > .nav-icon:before,
.administration-table [href="?m=administration&p=banlist"]:before { content: "\f05e"; }
.nav-sidebar [href^="home.php?m=gamemanager&p=rcon_presets"] > .nav-icon:before,
.monitorButtonContainer [href^="home.php?m=gamemanager&p=rcon_presets"]:before,
.nav-sidebar [href="?m=rcon&p=rcon"] > .nav-icon:before,
.administration-table [href="?m=rcon&p=rcon"]:before { content: "\f120"; }
.nav-sidebar [href^="?m=gamemanager&p=rsync_install"] > .nav-icon:before { content: "\f0ad"; }
.nav-sidebar [href^="?m=support"] > .nav-icon:before { content: "\f095"; }
.nav-sidebar [href^="?m=faq"] > .nav-icon:before,
.administration-table [href^="?m=faq"]:before{ content: "\f059"; }
.nav-sidebar [href^="?m=fast_download"] > .nav-icon:before,
.monitorButtonContainer [href^="?m=fast_download"]:before,
.administration-table [href^="?m=fast_download"]:before { content: "\f019"; }
.nav-sidebar [href^="?m=dsi"] > .nav-icon:before,
.monitorButtonContainer [href^="?m=dsi"]:before,
.administration-table [href^="?m=dsi"]:before{ content: "\f03e"; }
.nav-sidebar [href^="?m=simple-billing"] > .nav-icon:before,
.administration-table [href^="?m=simple-billing"]:before { content: "\f07a"; }
.nav-sidebar [href^="?m=util"] > .nav-icon:before { content: "\f0ad"; }
.nav-sidebar [href^="?m=lgsl_with_img_mod"] > .nav-icon:before,
.administration-table [href^="?m=lgsl_with_img_mod"]:before { content: "\f022"; }
.nav-sidebar [href^="?m=news"] > .nav-icon:before,
.administration-table [href^="?m=news"]:before { content: "\f1ea"; }
.nav-sidebar [href^="?m=register"] > .nav-icon:before { content: "\f067"; }
.nav-sidebar [href="?logout"] > .nav-icon:before { content: "\f08b"; }
.nav-sidebar [href="index.php"] > .nav-icon:before { content: "\f0e4"; }
.monitorButtonContainer [href^="?m=litefm"]:before { content: "\f03a"; }
.monitorbutton.size:before { content: "\f07c"; }
.monitorbutton.getAutoUpdateLink:before { content: "\f0c1"; }
.monitorButtonContainer [href^="?m=gamemanager&p=rsync_install"]:before { content: "\f381"; }
.administration-table.externalLinks a:before { content: "\f0c1"; }
.nav-sidebar [href^="?m=tickets"] > .nav-icon:before,
.administration-table [href^="?m=tickets"]:before { content: "\f4c4"; }
.monitorButtonContainer [href^="?m=editconfigfiles"]:before { content: "\f1c9"; }
.monitorButtonContainer [href^="?m=user_games&p=custom_fields"]:before { content: "\f1de"; }
.nav-sidebar [href="?m=tshock"] > .nav-icon:before { content: "\f1bb"; }
.nav-sidebar [href="?m=circular"] > .nav-icon:before,
.administration-table [href="?m=circular"]:before { content: "\f0e0"; }
.monitorbutton.getAPILinks:before { content: "\f1da"; }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View file

@ -1,5 +0,0 @@
<svg width="101px" height="101px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" class="lds-dual-ring">
<circle cx="50" cy="50" ng-attr-r="{{config.radius}}" ng-attr-stroke-width="{{config.width}}" ng-attr-stroke="{{config.stroke}}" ng-attr-stroke-dasharray="{{config.dasharray}}" fill="none" stroke-linecap="round" r="45" stroke-width="4" stroke="#1997c6" stroke-dasharray="70.68583470577035 70.68583470577035">
<animateTransform attributeName="transform" type="rotate" calcMode="linear" values="0 50 50;360 50 50" keyTimes="0;1" dur="1s" begin="0s" repeatCount="indefinite"></animateTransform>
</circle>
</svg>

Before

Width:  |  Height:  |  Size: 671 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

View file

@ -1,215 +0,0 @@
<?php
class ThemeDB
{
protected $link;
public $settingsTable, $serverStatsTable;
private $absolutePath = "../../../..";
public function __construct()
{
$this->settingsTable = $this->tablePrefix().'adminlte_settings';
$this->serverStatsTable = $this->tablePrefix().'adminlte_serverstats';
}
public function tablePrefix()
{
include($this->absolutePath."/includes/config.inc.php");
return $table_prefix;
}
private function getConnType()
{
if(class_exists('pdo'))
{
return 'pdo';
}
elseif(class_exists('mysqli'))
{
return 'mysqli';
}
else
{
echo 'error: neither pdo nor mysqli extensions are installed or activated';
exit;
}
}
private function connect()
{
include($this->absolutePath."/includes/config.inc.php");
if($this->getConnType()=='pdo')
{
try
{
$dbh = new PDO('mysql:host='.$db_host.';dbname='.$db_name, $db_user, $db_pass);
}
catch (PDOException $e)
{
echo 'Connection failed: ' . $e->getMessage();
exit;
}
$this->link = $dbh;
}
elseif($this->getConnType()=='mysqli')
{
$mysqli = @new mysqli($db_host, $db_user, $db_pass, $db_name);
if($mysqli->connect_error)
{
echo 'Connection error: ' . $mysqli->connect_error;
exit;
}
$this->link = $mysqli;
}
}
public function query($query, $returnData = true)
{
$this->connect();
if($this->getConnType()=='pdo')
{
try {
$stmt = $this->link->prepare($query);
$stmt->execute();
if($returnData)
{
$output = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
catch(PDOException $e)
{
return $e->getMessage();
}
}
elseif($this->getConnType()=='mysqli')
{
$result = $this->link->query($query);
if(!$result)
{
return $this->link->error;
}
else
{
if($result=="NULL")
{
return true;
}
else
{
$output = array();
while($row = $result->fetch_assoc())
{
$output[] = $row;
}
}
}
}
if($returnData)
{
if(count($output)>=1)
{
return $output;
}
else
{
return false;
}
}
else
{
return true;
}
}
public function getSetting($name, $userId = false)
{
if($userId === false)
{
$userId = $_SESSION['user_id'];
}
$query = '
SELECT value
FROM '.$this->settingsTable.'
WHERE user = "'.$userId.'" AND name = "'.$name.'"
';
$data = $this->query($query);
if(!empty($data))
{
return unserialize($data[0]['value']);
}
else
{
return false;
}
}
public function setSetting($name, $value, $userId = false)
{
if($userId === false)
{
$userId = $_SESSION['user_id'];
}
// dont use on duplicate key update statement because of the increasing index
// so instead check if the entry exists, if yes update, if not create :)
if($this->getSetting($name, $userId))
{
return $this->query("
UPDATE ".$this->settingsTable."
SET value = '".serialize($value)."'
WHERE user = '".$userId."' AND name = '".$name."'
");
}else
{
return $this->query("
INSERT INTO ".$this->settingsTable." (user, name, value)
VALUES('".$userId."', '".$name."', '".serialize($value)."')
");
}
}
public function removeSetting($name, $userId = false)
{
if($userId === false)
{
$userId = $_SESSION['user_id'];
}
$query = "
DELETE FROM ".$this->settingsTable."
WHERE user = '".$userId."' and name = '".$name."'
";
return $this->query($query);
}
public function getMaintenanceMode()
{
$query = "
SELECT setting,value
FROM ".$this->tablePrefix()."settings
WHERE setting = 'maintenance_mode' or setting = 'maintenance_title' or setting = 'maintenance_message'
";
$data = $this->query($query);
if($data)
{
$dataOut = array();
foreach($data as $setting)
{
$dataOut[$setting['setting']] = $setting['value'];
}
return $dataOut;
}
}
}

View file

@ -1,502 +0,0 @@
<?php
include("../../../../includes/helpers.php");
include("./db.class.php");
include("./theme.class.php");
// start ogp session
startSession();
// initialize classes
$ThemeDB = new ThemeDB;
$Theme = new Theme;
// declarations
$isadmin = false;
$uploadsFolder = dirname(__FILE__).'/uploads';
$themeUploadsPath = "themes/AdminLTE/dist/php/uploads/";
// check if uploads folder exists and create if not
if(!file_exists($uploadsFolder))
{
mkdir($uploadsFolder, 0744, true);
}
// declare themeTables
$themeTables = array(
array(
'name' => $ThemeDB->settingsTable,
'query' => '
CREATE TABLE '.$ThemeDB->settingsTable.' (
id int(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
user int(4) NOT NULL,
name varchar(255) NOT NULL,
value mediumtext NOT NULL,
UNIQUE KEY UniqueSetting (user,name)
);
'
),
// id int(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
array(
'name' => $ThemeDB->serverStatsTable,
'query' => '
CREATE TABLE '.$ThemeDB->serverStatsTable.' (
home_id int(4) NOT NULL,
users_online int(4) NOT NULL,
current_stamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
'
)
);
// check if theme settings db exists and create if not
foreach($themeTables AS $themeTable)
{
$sql = 'show tables like "'.$themeTable['name'].'"';
if($ThemeDB->query($sql) === false)
{
// create settings table
$ThemeDBCreate = $ThemeDB->query($themeTable['query'], false);
if($ThemeDBCreate===true)
{
// echo 'table "'.$themeTable['name'].'" successfully created';
}
else
{
// throw error
echo "<pre>Error:";
print_r($ThemeDBCreate);
echo "</pre>";
exit();
}
}
}
// check & set admin
if(isset($_SESSION['user_id']))
{
$isadmin = $Theme->checkIsAdmin($_SESSION['user_id']);
}
if(isset($_GET['m']))
{
if($_GET['m']=='global')
{
if(isset($_GET['p']))
{
if($_GET['p']=='check')
{
if(isset($_GET['v']))
{
if($_GET['v']=='maintenance')
{
$data = $ThemeDB->getMaintenanceMode();
header("Content-Type: application/json");
echo json_encode($data);
exit();
}
elseif($_GET['v']=='isadmin')
{
if($isadmin)
{
echo 1;
}else
{
echo 0;
}
exit();
}
elseif($_GET['v']=='updateserverstats')
{
if(isset($_GET['token']))
{
echo $Theme->updateGameserverStats($_GET['token']);
}
}
}
}
elseif($_GET['p']=='theme')
{
// check if user session exists
if(isset($_SESSION['users_login']))
{
if(isset($_GET['v']) && ($_GET['v']=='light' || $_GET['v']=='dark' || $_GET['v']=='mixed'))
{
// write new value to db
$theme = $ThemeDB->setSetting('theme', $_GET['v']);
}
else
{
$theme = $ThemeDB->getSetting('theme');
if(empty($theme))
{
// write default value to db
$theme = $ThemeDB->setSetting('theme', 'dark');
}
}
header("Content-Type: application/json");
echo json_encode($theme);
}
exit();
}
elseif($_GET['p']=='themeLogo')
{
// load global setting (id -1)
$themeLogo = $ThemeDB->getSetting('themeLogo', -1);
if(empty($themeLogo))
{
echo 0;
exit();
}
header("Content-Type: application/json");
echo json_encode($themeLogo);
exit();
}
elseif($_GET['p']=='themeNavWidth')
{
if(isset($_SESSION['users_login']))
{
// load global setting (id -1)
$themeNavWidth = $ThemeDB->getSetting('themeNavWidth', -1);
if(empty($themeNavWidth))
{
$themeNavWidth = 250;
}
header("Content-Type: application/json");
echo json_encode($themeNavWidth);
}
exit();
}
elseif($_GET['p']=='themeServerstats')
{
if(isset($_SESSION['users_login']))
{
if(isset($_GET['v']) && $_GET['v']=='displayNum')
{
$themeServerstatsNum = $ThemeDB->getSetting('themeServerstatsNum', -1);
if(empty($themeServerstatsNum) || $themeServerstatsNum<1 || $themeServerstatsNum>20)
{
$themeServerstatsNum = 10;
}
echo $themeServerstatsNum;
}else
{
// check if token is set to check if themeServerstats are enabled or not
$themeServerstats = $ThemeDB->getSetting('updateToken', -1);
echo empty($themeServerstats) ? 'remove' : 'activate';
}
}
exit();
}
}
}
elseif($_GET['m']=='user')
{
// check if user session exists
if(isset($_SESSION['users_login']))
{
if(isset($_GET['p']))
{
if($_GET['p']=='getavatar')
{
if(isset($_GET['userid']) && is_numeric($_GET['userid']))
{
$avatar = $ThemeDB->getSetting('avatar', $_GET['userid']);
if(empty($avatar))
{
$avatarPath = "themes/AdminLTE/dist/img/default-avatar.png";
}else
{
$avatarPath = $avatar;
}
echo $avatarPath;
exit;
}
}elseif($_GET['p']=='setavatar')
{
if(isset($_GET['userid']) && is_numeric($_GET['userid']))
{
// security; for now, only allow upload for own user id
if($_GET['userid']==$_SESSION['user_id'])
{
echo _NewFileUpload($_FILES['userAvatar'], $_GET['userid'], 'avatar');
exit;
}
}
}
}
}
}
elseif($_GET['m']=='dashboard')
{
// check if user session exists
if(isset($_SESSION['users_login']))
{
if(isset($_GET['p']))
{
if($_GET['p']=='columnsettings')
{
$columns = $ThemeDB->getSetting('dashboard_columns');
if(empty($columns))
{
// no column settings available, set default settings
$newColumns = array();
// select remote server
$newColumns[] = array('item' => 'item6', 'section' => 'column4', 'collapsed' => 0);
// server status
$newColumns[] = array('item' => 'item7', 'section' => 'column5', 'collapsed' => 0);
// process monitor
$newColumns[] = array('item' => 'item8', 'section' => 'column6', 'collapsed' => 0);
// server status
$newColumns[] = array('item' => 'item9', 'section' => 'column4', 'collapsed' => 0);
// write default value to db
$setSetting = $ThemeDB->setSetting('dashboard_columns', $newColumns);
$columns = $newColumns;
}
header("Content-Type: application/json");
echo json_encode($columns);
exit();
}
elseif($_GET['p']=='updatecolumnsettings')
{
// only allow new generated items from theme
$allowedItems = array('item6', 'item7', 'item8', 'item9');
// decode all items
$items = json_decode($_POST['data'], 1)['items'];
// specify new columns
$newColumns = array();
foreach($items AS $item)
{
if(in_array($item['id'], $allowedItems))
{
$newColumns[] = array('item' => $item['id'], 'section' => $item['column'], 'collapsed' => $item['collapsed']);
}
}
// write to db
$setSetting = $ThemeDB->setSetting('dashboard_columns', $newColumns);
echo "success";
exit();
}
elseif($_GET['p']=='listservers')
{
echo $Theme->listServersFromDB();
exit();
}
}
}
}
elseif($_GET['m']=='settings')
{
if($isadmin)
{
if(isset($_GET['p']))
{
if($_GET['p']=='fileUpload')
{
echo _NewFileUpload($_FILES['themeLogo'], 'themeLogo', 'themeLogo', true);
exit;
}
elseif($_GET['p']=='themeLogo')
{
if(isset($_GET['v']) && ($_GET['v']=='remove'))
{
// load global setting (id -1)
$themeLogo = $ThemeDB->getSetting('themeLogo', -1);
if(!empty($themeLogo))
{
// build direct path
$oldLogo = $uploadsFolder."/".basename($themeLogo);
// delete old logo if exists
if(file_exists($oldLogo))
{
unlink($oldLogo);
}
// remove logo from db
echo $ThemeDB->removeSetting('themeLogo', -1);
}
}
}
elseif($_GET['p']=='themeNavWidth')
{
if(isset($_GET['v']) && is_numeric($_GET['v']) && $_GET['v']>=250 && $_GET['v']<=350)
{
// save new width
$setSetting = $ThemeDB->setSetting('themeNavWidth', $_GET['v'], -1);
echo $_GET['v'];
exit;
}else
{
// invalid value - return default width
echo 250;
exit;
}
}
elseif($_GET['p']=='themeServerstats')
{
if(isset($_GET['v']))
{
if($_GET['v']=='activate')
{
// generate token
$newToken = bin2hex(random_bytes(20));
// set token
$ThemeDB->setSetting('updateToken', $newToken, -1);
// set cronjob
$Theme->checkForCronjob();
}
elseif($_GET['v']=='remove')
{
// remove token
$ThemeDB->removeSetting('updateToken', -1);
// remove cronjob
$Theme->checkForCronjob(true);
}
elseif($_GET['v']=='setNum')
{
if(isset($_GET['num']) && is_numeric($_GET['num']))
{
$setNum = $_GET['num'];
if($setNum<1 || $setNum>20)
{
$setNum = 10;
}
// set num
$ThemeDB->setSetting('themeServerstatsNum', $setNum, -1);
}
}
}
exit;
}
}
}
}
}
// file upload function
function _NewFileUpload($filesField, $uploadName, $settingName, $systemSetting = false)
{
Global $uploadsFolder, $ThemeDB, $themeUploadsPath;
if(isset($filesField))
{
// check if uploads folder is writable
if(!is_writable($uploadsFolder))
{
$retArr = array(
'code' => 'error',
'data' => 'Error: Uploads Folder is not writable.<br>Check Folder: '.$uploadsFolder,
);
return json_encode($retArr);
}
// define svg mime types
$svgMimeTypes = array('image/svg+xml', 'image/svg');
// check if file is an image or a valid svg mime type
$isImage = getimagesize($filesField['tmp_name']);
if($isImage === false && !in_array(mime_content_type($filesField['tmp_name']), $svgMimeTypes))
{
// file is not an image; break script
$retArr = array(
'code' => 'error',
'data' => 'Error: File is no Image ('.mime_content_type($filesField['tmp_name']).')',
);
return json_encode($retArr);
}
// check file size
if($filesField['size'] > 5242880) // 5mb in bytes
{
// filesize is too big; break script
$retArr = array(
'code' => 'error',
'data' => 'Error: Filesize extends 5mb',
);
return json_encode($retArr);
}
// check if setting/upload already exists
if($systemSetting)
{
$oldUpload = $ThemeDB->getSetting($settingName, -1);
}else
{
$oldUpload = $ThemeDB->getSetting($settingName);
}
if(!empty($oldUpload))
{
// build file path
$oldLogo = $uploadsFolder."/".basename($oldUpload);
// delete old upload
if(file_exists($oldLogo))
{
unlink($oldLogo);
}
}
// get file extension
$fileExt = pathinfo($filesField['name'])['extension'];
$destFile = $uploadsFolder."/".$uploadName.".".$fileExt;
$newUpload = $themeUploadsPath.$uploadName.".".$fileExt;
if(move_uploaded_file($filesField['tmp_name'], $destFile))
{
// write to db
if($systemSetting)
{
$setSetting = $ThemeDB->setSetting($settingName, $newUpload, -1);
}else
{
$setSetting = $ThemeDB->setSetting($settingName, $newUpload);
}
$retArr = array(
'code' => 'success',
'data' => $newUpload,
);
return json_encode($retArr);
}
else
{
$retArr = array(
'code' => 'error',
'data' => 'Error: Could not move uploaded File',
);
return json_encode($retArr);
}
}else
{
return "no files";
}
}
?>

View file

@ -1,739 +0,0 @@
<?php
class Theme
{
private $absolutePath = "../../../..";
private function getOGPPublicPath()
{
return str_replace("themes/AdminLTE/dist/php/settings.php", "", $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']);
}
public function checkIsAdmin($user_id)
{
// load ThemeDB class
require_once("./db.class.php");
$ThemeDB = new ThemeDB;
if(is_numeric($user_id))
{
$query = "
SELECT users_role
FROM ".$ThemeDB->tablePrefix()."users
WHERE user_id = ".$user_id."
";
$data = $ThemeDB->query($query);
if($data)
{
// reset users_group session for on the fly changes
$_SESSION['users_group'] = $data[0]['users_role'];
if($data[0]['users_role']=='admin')
{
return true;
}
}
}
return false;
}
private function getOGPServers($all = false)
{
// load ThemeDB class
require_once("./db.class.php");
$ThemeDB = new ThemeDB;
// list all ogp servers
if($all)
{
$query = "
SELECT *
FROM ".$ThemeDB->tablePrefix()."remote_servers
";
}else
{
$query = "
SELECT *
FROM ".$ThemeDB->tablePrefix()."remote_servers
ORDER BY 'remote_server_id' ASC
LIMIT 1
";
}
$data = $ThemeDB->query($query);
if($data)
{
return $data;
}
return false;
}
private function getAllCrons()
{
return $this->OGPCronjob('get');
}
private function OGPCronjob($type, $id = false, $url = false)
{
// load ogp lib_remote
require_once($this->absolutePath."/includes/lib_remote.php");
$firstRemoteServer = $this->getOGPServers();
if($firstRemoteServer)
{
$remote = new OGPRemoteLibrary($firstRemoteServer[0]['agent_ip'], $firstRemoteServer[0]['agent_port'], $firstRemoteServer[0]['encryption_key'], $firstRemoteServer[0]['timeout']);
if($remote->status_chk() != 1)
{
return false;
}
}else
{
// no server available
return false;
}
if($type=="get")
{
return $remote->scheduler_list_tasks();
}
elseif($type=="add" && $url)
{
return $remote->scheduler_add_task($url);
}
elseif($type=="edit" && $id && $url)
{
return $remote->scheduler_edit_task($id, $url);
}
elseif($type=="del")
{
return $remote->scheduler_del_task($id);
}
}
public function checkForCronjob($remove = false)
{
// load ThemeDB class
require_once("./db.class.php");
$ThemeDB = new ThemeDB;
$checkURL = $this->getOGPPublicPath().'themes/AdminLTE/dist/php/settings.php?m=global&p=check&v=updateserverstats';
$updateToken = $ThemeDB->getSetting('updateToken', -1);
$foundCron = false;
$validCron = false;
$allCrons = $this->OGPCronjob('get');
foreach($allCrons AS $cronNum => $cronVal)
{
// check if current cron is updateserverstats
if(strpos($cronVal, 'settings.php?m=global&p=check&v=updateserverstats') !== false)
{
if($remove)
{
// remove cron
$this->OGPCronjob('del', $cronNum);
}else
{
if($foundCron)
{
// possible duplicates, remove them all
$this->OGPCronjob('del', $cronNum);
continue;
}
else
{
$foundCron = $cronNum;
preg_match('/"(.*)"/', $cronVal, $cronURL);
$cronComponents = parse_url(end($cronURL));
parse_str($cronComponents['query'], $cronParams);
if($updateToken==$cronParams['token'])
{
$validCron = true;
}
}
}
}
}
if(!$remove && ($foundCron || !$validCron))
{
// specify cron url
$goodCronEntry = '*/5 * * * * wget -qO- "'.$checkURL.'&token='.$updateToken.'" --no-check-certificate';
if($foundCron && !$validCron)
{
// cron existent but invalid - update entry
$this->OGPCronjob('edit', $foundCron, $goodCronEntry);
return 'updated cronjob';
}
elseif(!$foundCron)
{
// cron not existent - create entry
$this->OGPCronjob('add', false, $goodCronEntry);
return 'created cronjob';
}
}
return false;
}
public function getGameServer($user_id = false)
{
// load ThemeDB class
require_once("./db.class.php");
$ThemeDB = new ThemeDB;
// load ogp server_config_parser to get SERVER_CONFIG_LOCATION variable
require_once($this->absolutePath."/modules/config_games/server_config_parser.php");
// load ogp lib_remote
require_once($this->absolutePath."/includes/lib_remote.php");
// first get all server homes, specific configs and ip/port config
$query = "
SELECT *
FROM ".$ThemeDB->tablePrefix()."home_ip_ports
NATURAL JOIN ".$ThemeDB->tablePrefix()."remote_servers
NATURAL JOIN ".$ThemeDB->tablePrefix()."server_homes
NATURAL JOIN ".$ThemeDB->tablePrefix()."config_homes
NATURAL JOIN ".$ThemeDB->tablePrefix()."remote_server_ips
NATURAL JOIN ".$ThemeDB->tablePrefix()."config_mods
NATURAL JOIN ".$ThemeDB->tablePrefix()."game_mods
";
if($user_id !== false)
{
$query .= "
NATURAL JOIN
(
SELECT home_id
FROM ".$ThemeDB->tablePrefix()."user_homes
WHERE user_id = ".$user_id."
UNION
SELECT home_id
FROM ".$ThemeDB->tablePrefix()."user_groups
NATURAL JOIN ".$ThemeDB->tablePrefix()."user_group_homes
WHERE user_id = ".$user_id."
) temp
";
}
$query .= "
WHERE force_mod_id IN
(
SELECT force_mod_id
FROM ".$ThemeDB->tablePrefix()."home_ip_ports
WHERE force_mod_id = ".$ThemeDB->tablePrefix()."game_mods.mod_id OR force_mod_id = 0
) ORDER BY home_user_order ASC, ".$ThemeDB->tablePrefix()."server_homes.home_id ASC
";
$serverHomes = $ThemeDB->query($query);
if($serverHomes)
{
foreach($serverHomes AS $key => $shData)
{
// check if the screen running the server is running.
$remote = new OGPRemoteLibrary($shData['agent_ip'], $shData['agent_port'], $shData['encryption_key'], $shData['timeout']);
if( $remote->is_screen_running(OGP_SCREEN_TYPE_HOME, $shData['home_id']))
{
$queryData = $this->getProtocolAndQuery($serverHomes[$key]);
$serverHomes[$key]['qProtocol'] = $queryData['qProtocol'];
$serverHomes[$key]['qName'] = $queryData['qName'];
$serverHomes[$key]['qMod'] = $queryData['qMod'];
}
else
{
// server screen stopped - remove server from array
unset($serverHomes[$key]);
}
}
return $serverHomes;
}
else
{
return false;
}
}
private function gameServerQuery($serverObject)
{
// declarations
$timeout = 5;
// default output
$gsq = array(
'online' => 0,
'max' => 0,
'serverOnline' => false,
'map' => false,
);
// change serverIP to agent ip if server is behind nat
$serverIP = ($serverObject['use_nat']==0) ? $serverObject['ip'] : $serverObject['agent_ip'];
// gameq
if($serverObject['qProtocol']=='gameq')
{
// load gameq class
require_once($this->absolutePath."/protocol/GameQ/Autoloader.php");
// ogp lgsl_port_conversion
require_once($this->absolutePath."/protocol/lgsl/lgsl_protocol.php");
$portConversion = lgsl_port_conversion($serverObject['qName'], $serverObject['port'], "", "");
$c_port = $portConversion['0']; // conn port
$q_port = $portConversion['1']; // query port
$s_port = $portConversion['2']; // software port
$gq = new \GameQ\GameQ();
$gq->addServer(array(
'id' => 'server',
'type' => $serverObject['qName'],
'host' => $serverIP.':'.$serverObject['port'],
'options' => [
'query_port' => $q_port,
],
));
$gq->setOption('timeout', $timeout);
// process gameq request
$data = $gq->process();
// only update if server is running
if(!empty($data['gq_online']) && $data['gq_online'])
{
$gsq['online'] = $data['gq_numplayers'];
$gsq['max'] = $data['gq_maxplayers'];
$gsq['serverOnline'] = true;
}else
{
$gsq['serverOnline'] = false;
}
}
// lgsl
elseif($serverObject['qProtocol']=='lgsl')
{
// ogp lgsl_port_conversion
require_once($this->absolutePath."/protocol/lgsl/lgsl_protocol.php");
$portConversion = lgsl_port_conversion($serverObject['qName'], $serverObject['port'], "", "");
$c_port = $portConversion['0']; // conn port
$q_port = $portConversion['1']; // query port
$s_port = $portConversion['2']; // software port
// get live data
$data = lgsl_query_live($serverObject['qName'], $serverIP, $c_port, $q_port, $s_port, "sa");
// only update if server is running
if($data['b']['status'])
{
$gsq['online'] = $data['s']['players'];
$gsq['max'] = $data['s']['playersmax'];
$gsq['serverOnline'] = true;
$gsq['map'] = $data['s']['map'];
}else
{
$gsq['serverOnline'] = false;
}
}
// ts3
elseif($serverObject['qProtocol']=='teamspeak3')
{
require_once($this->absolutePath."/protocol/TeamSpeak3/TeamSpeak3.php");
try
{
$ts3_VirtualServer = TeamSpeak3::factory('serverquery://'.$serverIP.':'.($serverObject['port'] + 24).'/?server_port='.$serverObject['port'].'&timeout='.$timeout);
$ts3_VirtualServer->setExcludeQueryClients(true);
$gsq['online'] = $ts3_VirtualServer->virtualserver_clientsonline-$ts3_VirtualServer->virtualserver_queryclientsonline;
$gsq['max'] = $ts3_VirtualServer->virtualserver_maxclients;
$gsq['serverOnline'] = true;
$gsq['map'] = 'teamspeak3';
}
catch(Exception $e)
{
$gsq['serverOnline'] = false;
}
}
return $gsq;
}
public function updateGameserverStats($token = false)
{
// load ThemeDB class
require_once("./db.class.php");
$ThemeDB = new ThemeDB;
// check token
if($token)
{
$checkToken = $ThemeDB->getSetting('updateToken', -1);
if($token==$checkToken)
{
// get all GameServers
$getGameServer = $this->getGameServer();
if($getGameServer)
{
foreach($getGameServer AS $key => $gameServer)
{
$gsq = $this->gameServerQuery($gameServer);
// write player stats into db
$ThemeDB->query("
INSERT INTO ".$ThemeDB->serverStatsTable." (home_id, users_online)
VALUES('".$gameServer['home_id']."', '".$gsq['online']."')
");
}
// delete old stats (keep only entries from last 1 day)
$ThemeDB->query("
DELETE FROM ogp_adminlte_serverstats WHERE current_stamp < DATE_ADD(NOW(), INTERVAL -1 DAY)
");
return "successfully updated";
}else
{
return "no running gameserver found";
}
}else
{
return "invalid token";
}
}
return "no token";
}
public function listServersFromDB()
{
$allServers = '';
$filterUserId = $_SESSION['user_id'];
if(isset($_SESSION['users_group']) && $_SESSION['users_group']=='admin')
{
// user is admin, so display all servers
$filterUserId = false;
}
// get all servers from db
$getGameServer = $this->getGameServer($filterUserId);
if($getGameServer)
{
foreach($getGameServer as $key => $val)
{
$allServers .= $this->buildServerBox($val);
}
}
return $allServers;
}
private function buildServerBox($serverObject)
{
$gameName = (strtolower($serverObject['mod_name'])=='none') ? $serverObject['game_name'] : $serverObject['game_name'].' ('.$serverObject['mod_name'].')';
$gameMonitorLink = 'home.php?m=gamemanager&p=game_monitor&home_id-mod_id-ip-port='.$serverObject['home_id'].'-'.$serverObject['mod_id'].'-'.$serverObject['ip'].'-'.$serverObject['port'];
// call game config file to get protocol, query and mod values
$queryData = $this->getProtocolAndQuery($serverObject);
$serverObject['qProtocol'] = $queryData['qProtocol'];
$serverObject['qName'] = $queryData['qName'];
$serverObject['qMod'] = $queryData['qMod'];
// start server query to get online/unknown status and map parameter
$gsq = $this->gameServerQuery($serverObject);
$serverOnline = ($gsq['serverOnline']) ? 'online' : 'unknown';
$serverObject['qMap'] = $gsq['map'];
// small map fix for special servers
$serverObject['qMap'] = ($serverObject['qMap']=='-') ? '_' : $serverObject['qMap'];
// declare icon box
$iconBox = '
<span class="info-box-icon">
<i class="fas fa-gamepad"></i>
</span>
';
if($gsq['serverOnline'])
{
// check if a map image exists
$mapImage = $this->getServerImage($serverObject);
if($mapImage!=$this->getOGPPublicPath().'images/online_big.png')
{
$iconBox = '
<span class="info-box-icon" style="
background-image: url(\''.$mapImage.'\');
background-size: cover;
background-repeat: no-repeat;
">
</span>
';
}
}
$serverBox = '
<div class="info-box serverstatus mb-2" data-id="'.$serverObject['home_id'].'" data-status="'.$serverOnline.'">
'.$iconBox.'
<div class="info-box-content d-flex flex-row justify-content-between pr-0">
<span class="server-infos mr-2">
<div class="server-name text-truncate">
<a href="'.$gameMonitorLink.'" class="text-dark" data-toggle="tooltip" title="'.$serverObject['home_name'].'">'.$serverObject['home_name'].'</a>
</div>
<div class="server-ipport">'.$serverObject['ip'].':'.$serverObject['port'].'</div>
<div class="server-gamename text-nowrap text-muted text-sm">'.$gameName.'</div>
</span>
<span class="player-infos ml-auto w-100">
<h5 class="server-player text-right ml-2">
<span class="server-current-player">'.$gsq['online'].'</span>/<span class="server-max-player">'.$gsq['max'].'</span>
</h5>
'.$this->buildPlayerChart($serverObject).'
</span>
</div>
</div>
';
return $serverBox;
}
private function buildPlayerChart($serverObject)
{
// load ThemeDB class
require_once("./db.class.php");
$ThemeDB = new ThemeDB;
$showElements = $ThemeDB->getSetting('themeServerstatsNum', -1);
if(empty($showElements))
{
$showElements = 10;
}
$onlineStatsQuery = $ThemeDB->query("
SELECT users_online
FROM ".$ThemeDB->serverStatsTable."
WHERE home_id = ".$serverObject['home_id']."
ORDER BY current_stamp DESC
LIMIT ".$showElements."
");
$labels = array();
$onlineStats = array();
foreach($onlineStatsQuery AS $osq)
{
$labels[] = '';
$onlineStats[] = $osq['users_online'];
}
$chart = '
<div class="playerChart">
<div class="chart-container ml-auto" style="position: relative; height:35px; width:90%">
<canvas id="playerChart-'.$serverObject['home_id'].'"></canvas>
</div>
<script>
var onlineUsersText = langConsts[langConstPrefix + "online"];
var lineChartCanvas = $("#playerChart-'.$serverObject['home_id'].'").get(0).getContext("2d");
var lineChart = new Chart(lineChartCanvas, {
type: "line",
data: {
labels: ["'.implode('","', $labels).'"],
datasets: [{
label: onlineUsersText,
backgroundColor: "rgba(108,117,125,0.9)",
borderColor: "rgba(108,117,125,0.9)",
data: ["'.implode('","', array_reverse($onlineStats)).'"],
borderWidth: 0
}]
},
options: {
"title": {
"display": false,
},
"legend": {
"display": false,
},
"responsive": true,
"maintainAspectRatio": false,
"scales": {
"yAxes": [
{
"display": false,
"ticks": {
"beginAtZero": true
}
}
],
"xAxes": [
{
"display": false
}
],
},
"layout": {
"padding": {
"top": 3,
"bottom": 3
}
},
"tooltips": {
intersect: false,
enabled: false,
custom: function(tooltipModel)
{
var tooltipEl = document.getElementById("chartjs-tooltip");
// Create element on first render
if(!tooltipEl)
{
tooltipEl = document.createElement("div");
tooltipEl.id = "chartjs-tooltip";
tooltipEl.innerHTML = tooltipModel.body[0].lines[0];
document.body.appendChild(tooltipEl);
}else
{
// hide if mouse got away from dot
if(typeof(tooltipModel.body)=="undefined")
{
tooltipEl.style.opacity = 0;
return;
}
// update innerHTML
tooltipEl.innerHTML = tooltipModel.body[0].lines[0];
}
// Hide if no tooltip
if(tooltipModel.opacity === 0)
{
tooltipEl.style.opacity = 0;
return;
}
// Set caret Position
tooltipEl.classList.remove("above", "below", "no-transform");
if(tooltipModel.yAlign)
{
tooltipEl.classList.add(tooltipModel.yAlign);
}
else
{
tooltipEl.classList.add("no-transform");
}
var position = this._chart.canvas.getBoundingClientRect();
// Display, position, and set styles for font
tooltipEl.style.opacity = 1;
tooltipEl.style.position = "absolute";
tooltipEl.style.left = position.left + window.pageXOffset + tooltipModel.caretX + "px";
tooltipEl.style.top = position.top + window.pageYOffset + tooltipModel.caretY + "px";
tooltipEl.style.pointerEvents = "none";
},
},
},
});
</script>
</div>
';
return $chart;
}
private function getProtocolAndQuery($serverObject)
{
// load ogp server_config_parser to get SERVER_CONFIG_LOCATION variable
require_once($this->absolutePath."/modules/config_games/server_config_parser.php");
// load home config file
$serverConfig = simplexml_load_file($this->absolutePath."/".SERVER_CONFIG_LOCATION.$serverObject['home_cfg_file']);
if($serverConfig)
{
// get protocol query name
if($serverConfig->{'protocol'}=='gameq')
{
$queryName = (string)$serverConfig->gameq_query_name;
}
elseif($serverConfig->{'protocol'}=='lgsl')
{
$queryName = (string)$serverConfig->lgsl_query_name;
}
else
{
$queryName = (string)$serverConfig->{'protocol'};
}
return array(
'qName' => $queryName,
'qProtocol' => (string)$serverConfig->{'protocol'},
'qMod' => (string)$serverConfig->{'mods'}->{'mod'}['key'],
);
}
return false;
}
private function getServerImage($serverObject)
{
// load ogp helpers
require_once($this->absolutePath."/includes/helpers.php");
$query_name = strtolower($serverObject['qName']);
$mod = strtolower($serverObject['qMod']);
$map = str_replace("-", "_", strtolower($serverObject['qMap']));
// adapting get_map_path() from OGP
$mod_gt = $mod;
if($mod == "cstrike")
{
if ($query_name == "halflife")
$mod_gt = "cs";
elseif($query_name == "source")
$mod_gt = "css";
}
if($mod == "tf")
{
if ($query_name == "halflife")
$mod_gt = "tf";
elseif($query_name == "source")
$mod_gt = "tf2";
}
// ts3 fix
$query_name = ($query_name == "teamspeak3") ? "ts3" : $query_name;
$mod_gt = $mod == "fof" ? "hl2dm" : $mod_gt;
$mod_gt = $mod == "insurgency" ? "ins" : $mod_gt;
$mod_gt = $mod == "redorchestra2" ? "ro2" : $mod_gt;
$mod_gt = $mod == "risingstorm2" ? "ro2" : $mod_gt;
$mod_gt = $mod == "killingfloor2" ? "kf2" : $mod_gt;
$mod_gt = $query_name == "7dtd" ? "7daystodie" : $mod_gt;
$mod_gt = $query_name == "callofduty" ? "cod" : $mod_gt;
$mod_gt = $query_name == "callofdutyuo" ? "uo" : $mod_gt;
$mod_gt = $query_name == "callofduty2" ? "cod2" : $mod_gt;
$mod_gt = $query_name == "callofduty4mw" ? "cod4" : $mod_gt;
$mod_gt = $query_name == "callofdutywaw" ? "codww" : $mod_gt;
$mod_gt = $query_name == "callofdutymw3" ? "mw3" : $mod_gt;
$mod_gt = $query_name == "conanexiles" ? "conan" : $mod_gt;
$map_paths = array(
$this->getOGPPublicPath()."protocol/lgsl/maps/$query_name/$mod/$map.jpg",
$this->getOGPPublicPath()."protocol/lgsl/maps/$query_name/$mod/$map.gif",
$this->getOGPPublicPath()."protocol/lgsl/maps/$query_name/$mod/$map.png",
$this->getOGPPublicPath()."protocol/lgsl/maps/$query_name/$map.jpg",
$this->getOGPPublicPath()."protocol/lgsl/maps/$query_name/$map.gif",
$this->getOGPPublicPath()."protocol/lgsl/maps/$query_name/$map.png",
"https://image.gametracker.com/images/maps/160x120/$mod_gt/$map.jpg",
"https://image.gametracker.com/images/maps/160x120/$query_name/$map.jpg",
$this->getOGPPublicPath()."images/online_big.png"
);
return get_first_existing_file($map_paths, 'https://gametracker.com', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0');
}
}
?>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB