EngineGP/system/library/games/rust/service.php
Sergei Solovev 276ec7f3eb Updating the server name reference in code
This change replaces the use of $_SERVER['SERVER_NAME'] with $_SERVER['HTTP_HOST'] throughout the codebase. The modification ensures consistency and compliance with best practices, since $_SERVER['HTTP_HOST'] is often used to extract the host header from an HTTP request. This update may improve compatibility and security, especially in scenarios where the Host header plays a key role in proper server configuration and routing. Please review and test the changes carefully to ensure smooth functionality in different environments.
2023-12-23 04:50:14 +03:00

354 lines
17 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
if (!DEFINED('EGP'))
exit(header('Refresh: 0; URL=http://' . $_SERVER['HTTP_HOST'] . '/404'));
class service
{
public static function buy($aData = array())
{
global $cfg, $sql, $user, $start_point;
// Проверка локации
$sql->query('SELECT `address`, `test` FROM `units` WHERE `id`="' . $aData['unit'] . '" AND `rust`="1" AND `show`="1" LIMIT 1');
if (!$sql->num())
sys::outjs(array('e' => 'Локация не найдена.'));
$unit = $sql->get();
// Проверка тарифа
$sql->query('SELECT `id` FROM `tarifs` WHERE `id`="' . $aData['tarif'] . '" AND `unit`="' . $aData['unit'] . '" AND `show`="1" LIMIT 1');
if (!$sql->num())
sys::outjs(array('e' => 'Тариф не найден.'));
$sql->query('SELECT '
. '`slots_min`,'
. '`slots_max`,'
. '`port_min`,'
. '`port_max`,'
. '`hostname`,'
. '`packs`,'
. '`tickrate`,'
. '`time`,'
. '`test`,'
. '`tests`,'
. '`discount`,'
. '`map`,'
. '`ftp`,'
. '`plugins`,'
. '`console`,'
. '`stats`,'
. '`copy`,'
. '`web`,'
. '`plugins_install`,'
. '`hdd`,'
. '`autostop`,'
. '`core_fix`,'
. '`ip`,'
. '`price`'
. ' FROM `tarifs` WHERE `id`="' . $aData['tarif'] . '" LIMIT 1');
$tarif = $sql->get();
// Проверка сборки
if (!array_key_exists($aData['pack'], sys::b64djs($tarif['packs'], true)))
sys::outjs(array('e' => 'Сборка не найдена.'));
// Проверка TickRate
if (!in_array($aData['tickrate'], explode(':', $tarif['tickrate'])))
sys::outjs(array('e' => 'Переданные данные tickrate неверны.'));
$test = 0;
// Проверка периода на тест
if ($aData['test']) {
if (!$tarif['test'] || !$unit['test'])
sys::outjs(array('e' => 'Тестовый период недоступен.'));
// Проверка на повторный запрос
$sql->query('SELECT `id`, `game` FROM `tests` WHERE `user`="' . $user['id'] . '" LIMIT 1');
if ($sql->num()) {
$test_info = $sql->get();
if (!$cfg['tests']['game'] || $test_info['game'] == 'rust')
sys::outjs(array('e' => 'Тестовый период предоставляется один раз.'));
$sql->query('SELECT `id` FROM `servers` WHERE `user`="' . $user['id'] . '" AND `test`="1" LIMIT 1');
if ($sql->num() and !$cfg['tests']['sametime'])
sys::outjs(array('e' => 'Чтобы получить тестовый период другой игры, дождитесь окончания текущего.'));
}
// Проверка наличия мест на локации
$sql->query('SELECT `id` FROM `servers` WHERE `unit`="' . $aData['unit'] . '" AND `test`="1" AND `time`>"' . $start_point . '" LIMIT ' . $unit['test']);
if ($sql->num() == $unit['test'])
sys::outjs(array('e' => 'Свободного места для тестового периода нет.'));
// Проверка наличия мест для выбранного тарифа
$sql->query('SELECT `id` FROM `servers` WHERE `tarif`="' . $aData['tarif'] . '" AND `test`="1" AND `time`>"' . $start_point . '" LIMIT ' . $tarif['tests']);
if ($sql->num() == $tarif['tests'])
sys::outjs(array('e' => 'Свободного места для тестового периода выбранного тарифа нет.'));
$test = 1;
} else
// Проверка периода
if (!$cfg['settlement_period'] and !in_array($aData['time'], explode(':', $tarif['time'])))
sys::outjs(array('e' => 'Переданные данные периода неверны.'));
// Проверка слот
if ($aData['slots'] < $tarif['slots_min'] || $aData['slots'] > $tarif['slots_max'])
sys::outjs(array('e' => 'Переданные данные слот неверны.'));
// Определение цены
$aPrice = explode(':', $tarif['price']);
$price = $aPrice[array_search($aData['tickrate'], explode(':', $tarif['tickrate']))];
// Определение суммы
if ($cfg['settlement_period']) {
// Цена аренды за расчетный период
$sum = games::define_sum($tarif['discount'], $price, $aData['slots'], $start_point);
$aData['time'] = games::define_period('buy', params::$aDayMonth);
} else
$sum = games::define_sum($tarif['discount'], $price, $aData['slots'], $aData['time']);
// Проверка промо-кода
$promo = games::define_promo(
$aData['promo'],
array(
'tarif' => $aData['tarif'],
'tickrate' => $aData['tickrate'],
'slots' => $aData['slots'],
'time' => $aData['time'],
'user' => $user['id']
),
$tarif['discount'],
$sum
);
$days = $aData['time']; // Кол-во дней аренды
// Использование промо-кода
if (is_array($promo)) {
if (array_key_exists('sum', $promo))
$sum = $promo['sum'];
else
$days += $promo['days']; // Кол-во дней аренды с учетом подарочных (промо-код)
}
// Проверка баланса
if ($user['balance'] < $sum)
sys::outjs(array('e' => 'У вас не хватает ' . (round($sum - $user['balance'], 2)) . ' ' . $cfg['currency']));
// Выделенный адрес игрового сервера
if (!empty($tarif['ip'])) {
$aIp = explode(':', $tarif['ip']);
$ip = false;
$port = params::$aDefPort['rust'];
// Проверка наличия свободного адреса
foreach ($aIp as $adr) {
$adr = trim($adr);
$sql->query('SELECT `id` FROM `servers` WHERE `unit`="' . $aData['unit'] . '" AND `address` LIKE "' . $adr . ':%" LIMIT 1');
if (!$sql->num()) {
$ip = $adr;
break;
}
}
} else {
$ip = sys::first(explode(':', $unit['address']));
$port = false;
// Проверка наличия свободного порта
for ($tarif['port_min']; $tarif['port_min'] <= $tarif['port_max']; $tarif['port_min'] += 1) {
$sql->query('SELECT `id` FROM `servers` WHERE `unit`="' . $aData['unit'] . '" AND (`address`="' . $ip . ':' . $tarif['port_min'] . '" OR `port`="' . $tarif['port_min'] . '") LIMIT 1');
if (!$sql->num()) {
$port = $tarif['port_min'];
break;
}
}
}
if (!$ip || !$port) {
$sql->query('UPDATE `tarifs` set `show`="0" WHERE `id`="' . $aData['tarif'] . '" LIMIT 1');
sys::outjs(array('e' => 'К сожалению нет доступных мест, обратитесь в тех.поддержку.'));
}
if ($test)
$aData['time'] = games::time($start_point, $tarif['test']);
else
$aData['time'] = games::time($start_point, $days);
$fix_one = 0;
$core = 0;
if ($tarif['core_fix'] != '') {
$aCore = explode(',', $tarif['core_fix']);
foreach ($aCore as $cpu) {
$sql->query('SELECT `id` FROM `servers` WHERE `unit`="' . $aData['unit'] . '" AND `tarif`="' . $aData['tarif'] . '" AND `core_fix`="' . $cpu . '" AND `core_fix_one`="1" LIMIT 1');
if ($sql->num())
continue;
$fix_one = 1;
$core = $cpu;
break;
}
if (!$core) {
$sql->query('UPDATE `tarifs` set `show`="0" WHERE `id`="' . $aData['tarif'] . '" LIMIT 1');
sys::outjs(array('e' => 'К сожалению нет доступных мест, обратитесь в тех.поддержку.'));
}
}
$ram = isset($tarif['param_fix']) ? $aData['ram'] : $cfg['ram']['rust'] * $aData['slots'];
// Массив данных
$aSDATA = array(
'unit' => $aData['unit'], // идентификатор локации
'tarif' => $aData['tarif'], // идентификатор тарифа
'ram' => $ram, // значение ram
'param_fix' => isset($tarif['param_fix']), // фиксированные параметры
'tickrate' => $aData['tickrate'], // значение tickrate
'pack' => $aData['pack'], // Выбранная сборка для установки
'time' => $aData['time'], // Время аренды
'days' => $days, // Число дней
'sum' => $sum, // Сумма списания
'test' => $test, // тестовый период
'address' => $ip . ':' . $port, // адрес игрового сервера
'port' => $port, // порт игрового сервера
'slots' => $aData['slots'], // Кол-во слот
'map' => $tarif['map'], // Фиксированное значение слот
'autostop' => $tarif['autostop'], // Выключение при 0 онлайне
'ftp' => $tarif['ftp'], // Использование ftp
'plugins' => $tarif['plugins'], // Использование плагинов
'console' => $tarif['console'], // Использование консоли
'stats' => $tarif['stats'], // Использование графиков (ведение статистики)
'copy' => $tarif['copy'], // Использование резервных копий
'web' => $tarif['web'], // Использование доп услуг
'plugins_install' => $tarif['plugins_install'], // Список установленных плагинов
'hdd' => $tarif['hdd'], // Дисковое пространство
'core_fix' => $core, // Выделенный поток
'core_fix_one' => $fix_one, // Выделенный поток
'promo' => $promo // Использование промо-кода
);
return $aSDATA;
}
public static function install($aSDATA = array())
{
global $cfg, $sql, $user, $start_point;
include(LIB . 'ssh.php');
// Массив данных локации (адрес,пароль)
$sql->query('SELECT `address`, `passwd` FROM `units` WHERE `id`="' . $aSDATA['unit'] . '" LIMIT 1');
$unit = $sql->get();
// Проверка ssh соединения с локацией
if (!$ssh->auth($unit['passwd'], $unit['address']))
sys::outjs(array('e' => sys::text('error', 'ssh')));
// Массив данных тарифа (путь сборки,путь установки)
$sql->query('SELECT `path`, `install`, `hostname` FROM `tarifs` WHERE `id`="' . $aSDATA['tarif'] . '" LIMIT 1');
$tarif = $sql->get();
// Получение идентификаторов игрового сервера
$sql->query('INSERT INTO `servers` set uid="1"');
$id = $sql->id();
$uid = $id + 1000;
// Директория сборки
$path = $tarif['path'] . $aSDATA['pack'];
// Директория игрового сервера
$install = $tarif['install'] . $uid;
$ssh->set('mkdir ' . $install . ';' // Создание директории
. 'useradd -s /bin/false -d ' . $install . ' -g servers -u ' . $uid . ' server' . $uid . ';' // Создание пользователя сервера на локации
. 'chown server' . $uid . ':1000 ' . $install . ';' // Изменение владельца и группы директории
. 'cd ' . $install . ' && sudo -u server' . $uid . ' screen -dmS i_' . $uid . ' sh -c "cp -r ' . $path . '/. .;' // Копирование файлов сборки для сервера
. 'find . -type d -exec chmod 700 {} \;;'
. 'find . -type f -exec chmod 600 {} \;;'
. 'chmod 500 ' . params::$aFileGame['RustDedicated'] . '"');
// Запись данных нового сервера
$sql->query('UPDATE `servers` set
`uid`="' . $uid . '",
`unit`="' . $aSDATA['unit'] . '",
`tarif`="' . $aSDATA['tarif'] . '",
`user`="' . $user['id'] . '",
`address`="' . $aSDATA['address'] . '",
`port`="' . $aSDATA['port'] . '",
`game`="rust",
`slots`="' . $aSDATA['slots'] . '",
`slots_start`="' . $aSDATA['slots'] . '",
`status`="install",
`name`="' . $tarif['hostname'] . '",
`pack`="' . $aSDATA['pack'] . '",
`plugins_use`="' . $aSDATA['plugins'] . '",
`ftp_use`="' . $aSDATA['ftp'] . '",
`console_use`="' . $aSDATA['console'] . '",
`stats_use`="' . $aSDATA['stats'] . '",
`copy_use`="' . $aSDATA['copy'] . '",
`web_use`="' . $aSDATA['web'] . '",
`tickrate`="' . $aSDATA['tickrate'] . '",
`map_start`="' . $aSDATA['map'] . '",
`vac`="1",
`hdd`="' . $aSDATA['hdd'] . '",
`time`="' . $aSDATA['time'] . '",
`date`="' . $start_point . '",
`test`="' . $aSDATA['test'] . '",
`ram`="' . $aSDATA['ram'] . '",
`core_fix`="' . $aSDATA['core_fix'] . '",
`core_fix_one`="' . $aSDATA['core_fix_one'] . '",
`autostop`="' . $aSDATA['autostop'] . '" WHERE `id`="' . $id . '" LIMIT 1');
// Запись установленных плагинов
if ($aSDATA['plugins']) {
// Массив идентификаторов плагинов
$aPlugins = sys::b64djs($aSDATA['plugins_install']);
if (isset($aPlugins[$aSDATA['pack']])) {
$plugins = explode(',', $aPlugins[$aSDATA['pack']]);
foreach ($plugins as $plugin)
if ($plugin)
$sql->query('INSERT INTO `plugins_install` set `server`="' . $id . '", `plugin`="' . $plugin . '", `time`="' . $start_point . '"');
}
}
// Списание средств с баланса пользователя
$sql->query('UPDATE `users` set `balance`="' . ($user['balance'] - $aSDATA['sum']) . '" WHERE `id`="' . $user['id'] . '" LIMIT 1');
// Запись получения тестового периода
if ($aSDATA['test']) {
$sql->query('INSERT INTO `tests` set `server`="' . $id . '", `unit`="' . $aSDATA['unit'] . '", `game`="rust", `user`="' . $user['id'] . '", `time`="' . $start_point . '"');
$sql->query('INSERT INTO `logs` set `user`="' . $user['id'] . '", `text`="' . sys::updtext(sys::text('logs', 'buy_server_test'), array('id' => $id)) . '", `date`="' . $start_point . '", `type`="buy", `money`="0"');
} else {
// Реф. система
games::part($user['id'], $aSDATA['sum']);
// Запись логов
if (!is_array($aSDATA['promo']))
$sql->query('INSERT INTO `logs` set `user`="' . $user['id'] . '", `text`="' . sys::updtext(sys::text('logs', 'buy_server'), array('days' => games::parse_day($aSDATA['days'], true), 'money' => $aSDATA['sum'], 'id' => $id)) . '", `date`="' . $start_point . '", `type`="buy", `money`="' . $aSDATA['sum'] . '"');
else {
$sql->query('UPDATE `servers` set `benefit`="' . $aSDATA['time'] . '" WHERE `id`="' . $id . '" LIMIT 1');
$sql->query('INSERT INTO `promo_use` set `promo`="' . $aSDATA['promo']['id'] . '", `user`="' . $user['id'] . '", `time`="' . $start_point . '"');
$sql->query('INSERT INTO `logs` set `user`="' . $user['id'] . '", `text`="' . sys::updtext(sys::text('logs', 'buy_server_promo'), array('days' => games::parse_day($aSDATA['days'], true), 'money' => $aSDATA['sum'], 'promo' => $aSDATA['promo']['cod'], 'id' => $id)) . '", `date`="' . $start_point . '", `type`="buy", `money`="' . $aSDATA['sum'] . '"');
}
}
return $id;
}
}
?>