|
@@ -0,0 +1,354 @@
|
|
|
|
+<?php
|
|
|
|
+if (!DEFINED('EGP'))
|
|
|
|
+ exit(header('Refresh: 0; URL=http://' . $_SERVER['SERVER_NAME'] . '/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;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+?>
|