EngineGP/system/library/games/mta/service.php

354 lines
17 KiB
PHP
Raw Normal View History

2023-03-04 23:45:46 +00:00
<?php
if(!DEFINED('EGP'))
2023-03-05 13:59:34 +00:00
exit(header('Refresh: 0; URL=http://'.$_SERVER['SERVER_NAME'].'/404'));
2023-03-04 23:45:46 +00:00
class service
{
public static function buy($aData = array())
{
2023-03-05 13:59:34 +00:00
global $cfg, $sql, $user, $start_point;
// Проверка локации
$sql->query('SELECT `address`, `test` FROM `units` WHERE `id`="'.$aData['unit'].'" AND `mta`="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`,'
.'`time`,'
.'`test`,'
.'`tests`,'
.'`discount`,'
.'`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' => 'Сборка не найдена.'));
$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'] == 'mta')
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' => 'Переданные данные слот неверны.'));
// Определение суммы
if($cfg['settlement_period'])
{
// Цена аренды за расчетный период
$sum = games::define_sum($tarif['discount'], $tarif['price'], $aData['slots'], $start_point);
$aData['time'] = games::define_period('buy', params::$aDayMonth);
}else
$sum = games::define_sum($tarif['discount'], $tarif['price'], $aData['slots'], $aData['time']);
// Проверка промо-кода
$promo = games::define_promo(
$aData['promo'],
array(
'tarif' => $aData['tarif'],
'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['mta'];
// Проверка наличия свободного адреса
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']['mta']*isset($aSDATA['slots']);
2023-03-05 13:59:34 +00:00
// Массив данных
$aSDATA = array(
'unit' => $aData['unit'], // идентификатор локации
'tarif' => $aData['tarif'], // идентификатор тарифа
'ram' => $ram, // значение ram
'param_fix' => isset($tarif['param_fix']), // фиксированные параметры
2023-03-05 13:59:34 +00:00
'pack' => $aData['pack'], // Выбранная сборка для установки
'time' => $aData['time'], // Время аренды
'days' => $days, // Число дней
'sum' => $sum, // Сумма списания
'test' => $test, // тестовый период
'address' => $ip.':'.$port, // адрес игрового сервера
'port' => $port, // порт игрового сервера
'slots' => $aData['slots'], // Кол-во слот
'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 777 {} \;;'
.'chmod 500 '.params::$aFileGame[$server['mta']].'"');
// Запись данных нового сервера
$sql->query('UPDATE `servers` set
`uid`="'.$uid.'",
`unit`="'.$aSDATA['unit'].'",
`tarif`="'.$aSDATA['tarif'].'",
`user`="'.$user['id'].'",
`address`="'.$aSDATA['address'].'",
`port`="'.$aSDATA['port'].'",
`game`="mta",
`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'].'",
`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`="mta", `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;
}
2023-03-04 23:45:46 +00:00
}
?>