EngineGP

Форк
0
/
distributor.php 
222 строки · 7.6 Кб
1
<?php
2
/*
3
 * EngineGP   (https://enginegp.ru or https://enginegp.com)
4
 *
5
 * @copyright Copyright (c) 2018-present Solovev Sergei <inbox@seansolovev.ru>
6
 *
7
 * @link      https://github.com/EngineGPDev/EngineGP for the canonical source repository
8
 *
9
 * @license   https://github.com/EngineGPDev/EngineGP/blob/main/LICENSE MIT License
10
 */
11

12
use Firebase\JWT\JWT;
13
use Firebase\JWT\Key;
14

15
if (!defined('EGP')) {
16
    exit(header('Refresh: 0; URL=http://' . $_SERVER['HTTP_HOST'] . '/404'));
17
}
18

19
// Подключение filp/whoops
20
$whoops = new \Whoops\Run();
21
$prettyPageHandler = new \Whoops\Handler\PrettyPageHandler();
22
foreach ($cfg['whoops']['blacklist'] as $key => $secrets) {
23
    foreach ($secrets as $secret) {
24
        $prettyPageHandler->blacklist($key, $secret);
25
    }
26
}
27
$whoops->pushHandler($prettyPageHandler);
28
// логи в консоль браузера
29
$loggingInConsole = new \Whoops\Handler\PlainTextHandler();
30
$loggingInConsole->loggerOnly(true);
31
$loggingInConsole->setLogger((new \Monolog\Logger('EngineGP', [(new \Monolog\Handler\BrowserConsoleHandler())->setFormatter((new \Monolog\Formatter\LineFormatter(null, null, true)))])));
32
$whoops->pushHandler($loggingInConsole);
33
// логи в файл
34
$loggingInFile = new \Whoops\Handler\PlainTextHandler();
35
$loggingInFile->loggerOnly(true);
36
$loggingInFile->setLogger((new \Monolog\Logger('EngineGP', [(new \Monolog\Handler\StreamHandler(ROOT . '/logs/enginegp.log'))->setFormatter((new \Monolog\Formatter\LineFormatter(null, null, true)))])));
37
$whoops->pushHandler($loggingInFile);
38
$whoops->register();
39

40
// Парсинг адреса
41
$url = is_array(sys::url()) ? sys::url() : [];
42
$route = sys::url(false);
43
$section = $url['section'] ?? false;
44

45
$id = array_key_exists('id', $url) ? sys::int($url['id']) : false;
46
$go = array_key_exists('go', $url);
47
$page = array_key_exists('page', $url) ? sys::int($url['page']) : 1;
48
$route = $route == '' ? 'index' : $route;
49

50
// Реферал
51
if (isset($_GET['account'])) {
52
    $_SESSION['referrer'] = sys::int($_GET['account']);
53
}
54

55
$auth = false;
56
$user = [];
57

58
// Получение токена из куки
59
$refreshToken = $_COOKIE['refresh_token'] ?? null;
60

61
// Порог обновления токена
62
$refreshThreshold = 86400 * 7;
63

64
if ($refreshToken) {
65
    try {
66
        // Проверка токена
67
        $decodedJwt = JWT::decode($refreshToken, new Key($_ENV['JWT_KEY'], 'HS256'));
68

69
        // Токен валиден
70
        $user['id'] = $decodedJwt->id;
71

72
        // Если токен истекает менее чем через 7 дней, создаём новый
73
        if ($decodedJwt->exp - $start_point < $refreshThreshold) {
74
            $payload = [
75
                'id' => $user['id'],
76
                'iat' => $start_point,
77
                'exp' => $start_point + 86400 * 30,
78
            ];
79

80
            // Генерация JWT токена
81
            $refreshToken = JWT::encode($payload, $_ENV['JWT_KEY'], 'HS256');
82

83
            // Обновление куки с новым токеном
84
            setcookie('refresh_token', $refreshToken, [
85
                'expires' => $start_point + 86400 * 30,
86
                'path' => '/',
87
                'domain' => $_SERVER['HTTP_HOST'],
88
                'samesite' => 'Strict',
89
            ]);
90
        }
91

92
        // Получение информации о пользователе из базы данных
93
        $sql->query('SELECT `id`, `login`, `balance`, `group`, `level`, `time` FROM `users` WHERE `id`="' . $user['id'] . '" LIMIT 1');
94
        if ($sql->num()) {
95
            $user = $sql->get();
96

97
            // Обновление активности
98
            if ($user['time'] + 10 < $start_point) {
99
                $sql->query('UPDATE `users` set `time`="' . $start_point . '" WHERE `id`="' . $user['id'] . '" LIMIT 1');
100
            }
101

102
            $auth = true;
103
        }
104
    } catch (Exception $e) {
105
        // Если токен недействителен, удаляем куку
106
        setcookie('refresh_token', '', [
107
            'expires' => $start_point - 3600,
108
            'path' => '/',
109
            'domain' => $_SERVER['HTTP_HOST'],
110
            'samesite' => 'Strict',
111
        ]);
112
    }
113
} else {
114
    // Токен не передан
115
    $user['id'] = null;
116
}
117

118
// Заголовок
119
$title = '';
120

121
// Навигация
122
$html->nav($cfg['name'], $cfg['http']);
123

124
include(DATA . 'header.php');
125

126
// Подключение файла
127
if (in_array($route, $aRoute)) {
128
    include(ENG . $route . '.php');
129
} else {
130
    include(ENG . '404.php');
131
}
132

133
// Обновление ссылок
134
if (isset($html->arr['main'])) {
135
    $html->upd(
136
        'main',
137
        [
138
            '[home]',
139
            '[js]',
140
            '[css]',
141
            '[img]',
142
        ],
143
        [
144
            $cfg['http'],
145
            $cfg['http'] . 'template/js/',
146
            $cfg['http'] . 'template/css/',
147
            $cfg['http'] . 'template/images/',
148
        ]
149
    );
150
}
151

152
// Онлайн игроков (общее количество всех игроков)
153
$aop = '';
154
//$aop = $mcache->get('all_online_players'); //Если ваш хостинг чувствует себя плохо из за чрезмерной нагрузки от данного модуля, то включите кеширование, раскомментировав этот кусочек кода
155
if ($aop == '') {
156
    $sql->query('SELECT SUM(`online`) FROM `servers` WHERE `status`="working" OR `status`="change"');
157
    $sum = $sql->get();
158

159
    $aop = $sum['SUM(`online`)'];
160

161
    $mcache->set('all_online_players', $aop, false, 1);
162
}
163

164
// Заготовка выхлопа
165
$html->get('all');
166
$html->set('title', $title . ' | ' . $cfg['name']);
167
$html->set('description', sys::head('description'));
168
$html->set('keywords', sys::head('keywords'));
169
$html->set('home', $cfg['http']);
170
$html->set('js', $cfg['http'] . 'template/js/');
171
$html->set('css', $cfg['http'] . 'template/css/');
172
$html->set('img', $cfg['http'] . 'template/images/');
173
$html->set('aop', $aop);
174
$html->set('cur', $cfg['currency']);
175

176
// Если авторизован
177
if ($auth) {
178
    // Здесь вы можете использовать информацию о пользователе, например, $user['balance']
179
    $html->set('login', $user['login']);
180
    $html->set('balance', round($user['balance'], 2));
181
    $html->set('other_menu', $html->arr['vmenu'] ?? '');
182
} else {
183
    // Если пользователь не авторизован, выполните необходимые действия
184
    $html->set('other_menu', '');
185
}
186

187
$html->set('nav', $html->arr['nav'] ?? '', true);
188
$html->set('main', $html->arr['main'] ?? '', true);
189

190
$sql->query('SELECT `id`, `login`, `time` FROM `users` ORDER BY `id` ASC');
191
$online = '<span style="padding:0 5px;">';
192
while ($staff = $sql->get()) {
193
    if ($staff['time'] + 15 > $start_point) {
194
        $online .= $staff['login'] . ', ';
195
    } else {
196
        $online .= '';
197
    }
198
}
199
$online .= '</span>';
200
$html->set('online_users', $online);
201
$html->pack('all');
202

203
// Блоки
204
if ($auth) {
205
    // Проверка наличия игрового сервера
206
    $servers = $sql->query('(SELECT `id` FROM `servers` WHERE `user`="' . $user['id'] . '" LIMIT 1) UNION (SELECT `id` FROM `owners` WHERE `user`="' . $user['id'] . '" LIMIT 1)');
207

208
    if ($sql->num()) {
209
        $html->unitall('servers', 'all', 1, 1);
210
    } else {
211
        $html->unitall('servers', 'all', 0, 1);
212
    }
213

214
    $html->unitall('auth', 'all', 1, 1);
215
    $html->unitall('admin', 'all', $user['group'] == 'admin', 1);
216
    $html->unitall('support', 'all', $user['group'] == 'support', 1);
217
} else {
218
    $html->unitall('auth', 'all', 0, 1);
219
    $html->unitall('servers', 'all', 0, 1);
220
    $html->unitall('admin', 'all', 0, 1);
221
    $html->unitall('support', 'all', 0, 1);
222
}
223

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.