1 | <?php /** @noinspection SqlResolve */ |
||||
2 | |||||
3 | use DBAL\db_mysql; |
||||
4 | |||||
5 | define('IN_ADMIN', true); |
||||
6 | |||||
7 | require('../includes/init.' . substr(strrchr(__FILE__, '.'), 1)); |
||||
8 | |||||
9 | global $user, $lang, $result; |
||||
10 | /** |
||||
11 | * @var array $user |
||||
12 | */ |
||||
13 | |||||
14 | if( |
||||
15 | ($user['authlevel'] < 3) |
||||
16 | && |
||||
17 | (empty($config->admin_http_key) || empty($_GET['admin_http_key']) || $_GET['admin_http_key'] != $config->admin_http_key) |
||||
18 | ) |
||||
19 | { |
||||
20 | SnTemplate::messageBox($lang['sys_noalloaw'], $lang['sys_noaccess']); |
||||
21 | die(); |
||||
22 | } |
||||
23 | |||||
24 | // If we have already passed here through admin_http_key - then we can safely assume that it's admin |
||||
25 | if(empty($user['authlevel'])) { |
||||
26 | $user['authlevel'] = 3; |
||||
27 | } |
||||
28 | |||||
29 | define('IN_AJAX', true); |
||||
30 | |||||
31 | lng_include('admin'); |
||||
32 | |||||
33 | $totaltime = microtime(true); |
||||
34 | $pack_until = date("Y-m-01 00:00:00", SN_TIME_NOW - PERIOD_MONTH * 3); |
||||
35 | |||||
36 | // [#] info_best_battles 1b0 |
||||
37 | $best_reports = array(); |
||||
38 | if(defined('MODULE_INFO_BEST_BATTLES_QUERY')) { |
||||
39 | $query = doquery(MODULE_INFO_BEST_BATTLES_QUERY); |
||||
0 ignored issues
–
show
Deprecated Code
introduced
by
![]() |
|||||
40 | while($row = db_fetch($query)) { |
||||
0 ignored issues
–
show
The function
db_fetch() has been deprecated.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
41 | $best_reports[] = $row['ube_report_id']; |
||||
42 | } |
||||
43 | } |
||||
44 | $best_reports = !empty($best_reports) ? ' AND ube_report_id NOT IN (' . implode(',', $best_reports) . ')' : ''; |
||||
45 | |||||
46 | |||||
47 | $ques = array( |
||||
48 | // 'DELETE {{users}}.* FROM {{users}} WHERE `user_as_ally` IS NULL and `onlinetime` < unix_timestamp(now()) - ( 60 * 60 * 24 * 45) and metamatter_total <= 0;', |
||||
49 | |||||
50 | // Выводим из отпуска игроков, которые находятся там более 4 недель |
||||
51 | // 'UPDATE {{users}} |
||||
52 | // SET vacation = 0, vacation_next = 0 |
||||
53 | // WHERE |
||||
54 | // authlevel = 0 AND user_as_ally IS NULL AND user_bot = ' . USER_BOT_PLAYER . ' /* Не админы, Не Альянсы, Не боты */ |
||||
55 | // AND vacation > 0 AND banaday = 0 /* В отпуске и не в бане */ |
||||
56 | // AND vacation < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 4 WEEK)) /* Находящиеся в отпуске более 4 недель */;', |
||||
57 | |||||
58 | // // Игроки удаляются по Регламенту |
||||
59 | // 'DELETE FROM `{{users}}` WHERE |
||||
60 | // authlevel = 0 AND user_as_ally IS NULL AND user_bot = ' . USER_BOT_PLAYER . ' AND metamatter_total = 0 AND /* Не админы, Не Альянсы, Не боты, Не Бессмертные*/ |
||||
61 | // metamatter = 0 AND /* Нету ММ */ |
||||
62 | // vacation = 0 AND banaday = 0 AND /* Не в отпуске, Не в бане */ |
||||
63 | // ( |
||||
64 | // (onlinetime - register_time < 5 * 60 AND UNIX_TIMESTAMP() - onlinetime > 2*7 *86400) |
||||
65 | // OR (onlinetime - register_time < 30 * 60 AND UNIX_TIMESTAMP() - onlinetime > 4*7 *86400) |
||||
66 | // OR (onlinetime - register_time < 10 * 60*60 AND UNIX_TIMESTAMP() - onlinetime > 6*7 *86400) |
||||
67 | // OR (UNIX_TIMESTAMP() - onlinetime > 8*7 *86400) |
||||
68 | // );', |
||||
69 | |||||
70 | // Игроки, которые не были активны более 4 недель становятся I-шками. Для них |
||||
71 | // Отключаем получение писем |
||||
72 | // 'UPDATE {{users}} |
||||
73 | // SET OPTIONS = "" |
||||
74 | // WHERE |
||||
75 | // authlevel = 0 AND user_as_ally IS NULL AND user_bot = ' . USER_BOT_PLAYER . ' AND vacation = 0 /* Не админы, Не Альянсы, Не боты, Не в отпуске */ |
||||
76 | // AND onlinetime < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 4 WEEK)) /* Не выходившие в онлайн более 4 недель */;', |
||||
77 | // // Отключаем производство на планетах |
||||
78 | // 'UPDATE {{users}} AS u |
||||
79 | // JOIN {{planets}} AS p ON p.id_owner = u.id |
||||
80 | // SET |
||||
81 | // metal_perhour = 0, |
||||
82 | // crystal_perhour = 0, |
||||
83 | // deuterium_perhour = 0, |
||||
84 | // metal_mine_porcent = 0, |
||||
85 | // crystal_mine_porcent = 0, |
||||
86 | // deuterium_sintetizer_porcent = 0, |
||||
87 | // solar_plant_porcent = 0, |
||||
88 | // fusion_plant_porcent = 0, |
||||
89 | // solar_satelit_porcent = 0, |
||||
90 | // ship_sattelite_sloth_porcent = 0 |
||||
91 | // WHERE |
||||
92 | // authlevel = 0 AND user_as_ally IS NULL AND user_bot = ' . USER_BOT_PLAYER . ' AND vacation = 0 /* Не админы, Не Альянсы, Не боты, Не в отпуске */ |
||||
93 | // AND onlinetime < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 4 WEEK)) /* Не выходившие в онлайн более 4 недель */;', |
||||
94 | // Удаляем все здания из очереди |
||||
95 | // 'DELETE q FROM {{users}} AS u JOIN {{que}} AS q ON q.que_player_id = u.id |
||||
96 | // WHERE |
||||
97 | // authlevel = 0 AND user_as_ally IS NULL AND user_bot = ' . USER_BOT_PLAYER . ' AND vacation = 0 /* Не админы, Не Альянсы, Не боты, Не в отпуске */ |
||||
98 | // AND onlinetime < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 4 WEEK)) /* Не выходившие в онлайн более 4 недель */;', |
||||
99 | // Возвращаем все флоты ??? |
||||
100 | // Пока не будем делать запрос - за 4 недели всяко все флоты должны вернутся... |
||||
101 | // TODO I-шки - неделя на разграбление - или сколько там стата хранится... |
||||
102 | |||||
103 | // Удаляем планеты без пользователей |
||||
104 | 'DELETE FROM `{{planets}}` WHERE `id_owner` not in (select id from `{{users}}`) AND id_owner <> 0;', // TODO NO FK Переписать на джоине |
||||
105 | // Удаляем юниты без планет |
||||
106 | 'DELETE un FROM `{{unit}}` AS un |
||||
107 | LEFT JOIN `{{planets}}` AS pl ON pl.id = un.unit_location_id |
||||
108 | WHERE unit_location_type = ' . LOC_PLANET . ' AND pl.id IS NULL;', |
||||
109 | // Удаляем пустые юниты с 0 уровнем (кроме Капитана) - TODO - перенести в модуль, если нужно! |
||||
110 | // 'DELETE FROM {{unit}} WHERE unit_location_type = ' . LOC_PLANET . ' AND unit_level = 0 AND unit_type <> ' . UNIT_CAPTAIN, |
||||
111 | // Удаляем очереди на ничьих планетах |
||||
112 | 'DELETE q FROM `{{que}}` AS q |
||||
113 | LEFT JOIN `{{planets}}` AS p ON p.id = q.que_planet_id |
||||
114 | WHERE |
||||
115 | que_type IN (' . QUE_STRUCTURES . ', ' . QUE_HANGAR . ', ' . SUBQUE_FLEET . ', ' . SUBQUE_DEFENSE . ') |
||||
116 | AND |
||||
117 | (p.id_owner = 0 OR p.id_owner IS NULL);', |
||||
118 | |||||
119 | // Удаляем пустые САБы |
||||
120 | 'DELETE FROM `{{aks}}` WHERE `id` NOT IN (SELECT DISTINCT `fleet_group` FROM `{{fleets}}`);', // TODO Переписать на джоине |
||||
121 | |||||
122 | // UBE reports |
||||
123 | "DELETE FROM `{{ube_report}}` WHERE `ube_report_time_combat` < DATE_SUB(NOW(), INTERVAL 60 DAY) {$best_reports};", // TODO Настройка |
||||
124 | |||||
125 | // Чистка сообщений - ВРЕМЕННО ОТКЛЮЧЕНО |
||||
126 | // 'DELETE FROM `{{messages}}` WHERE `message_owner` not in (select id from {{users}});', // TODO NO FK |
||||
127 | // Удаляются сообщения, старше 4 недель, кроме личных и Альянсовских |
||||
128 | 'DELETE FROM `{{messages}}` WHERE |
||||
129 | UNIX_TIMESTAMP() - message_time > 4*7 * 24 * 60 * 60 AND |
||||
130 | message_type NOT IN (' . MSG_TYPE_PLAYER . ', ' . MSG_TYPE_ALLIANCE . ', ' . MSG_TYPE_ADMIN . ');', |
||||
131 | // Удаляются сообщения у пользователей, которые неактивны больше 4 недель - кроме личных и Альянсовских |
||||
132 | 'DELETE m FROM `{{users}}` AS u |
||||
133 | JOIN `{{messages}}` AS m ON m.message_owner = u.id |
||||
134 | WHERE |
||||
135 | message_type NOT IN (' . MSG_TYPE_PLAYER . ', ' . MSG_TYPE_ALLIANCE . ') AND |
||||
136 | authlevel = 0 AND user_as_ally IS NULL AND /* Не админы, Не Альянсы */ |
||||
137 | UNIX_TIMESTAMP() - onlinetime > 4*7 *86400;', |
||||
138 | |||||
139 | 'DELETE FROM `{{chat}}` WHERE timestamp < unix_timestamp(now()) - (60 * 60 * 24 * 14);', |
||||
140 | |||||
141 | // Recalculate Alliance members |
||||
142 | "UPDATE `{{alliance}}` as a LEFT JOIN (SELECT ally_id, count(*) as ally_memeber_count FROM `{{users}}` WHERE ally_id IS NOT NULL GROUP BY ally_id) as u ON u.ally_id = a.id |
||||
143 | SET a.`ally_members` = u.ally_memeber_count;", |
||||
144 | // Deleting empty Alliances - ВРЕМЕННО ОТКЛЮЧЕНО |
||||
145 | // 'DELETE FROM {{alliance}} WHERE id not in (select ally_id from {{users}} WHERE `user_as_ally` IS NOT NULL group by ally_id);', |
||||
146 | // 'DELETE FROM {{alliance}} WHERE ally_members <= 0;', |
||||
147 | "UPDATE `{{users}}` SET ally_id = null, ally_name = null, ally_tag = null, ally_register_time = 0, ally_rank_id = 0 WHERE ally_id not in (select id from `{{alliance}}`);", |
||||
148 | |||||
149 | // Пакуем данные по логу ТМ |
||||
150 | array( |
||||
151 | "INSERT INTO {{log_dark_matter}} |
||||
152 | (log_dark_matter_timestamp, log_dark_matter_username, log_dark_matter_reason, log_dark_matter_amount, |
||||
153 | log_dark_matter_comment, log_dark_matter_page, log_dark_matter_sender) |
||||
154 | SELECT |
||||
155 | '{$pack_until}', IF(u.username IS NULL, ldm.log_dark_matter_username, u.username), " . RPG_CUMULATIVE . ", sum(ldm.log_dark_matter_amount), |
||||
156 | 'Баланс на {$pack_until}', 'admin/ajax_maintenance.php', ldm.log_dark_matter_sender |
||||
157 | FROM |
||||
158 | {{log_dark_matter}} AS ldm |
||||
159 | LEFT JOIN {{users}} AS u ON u.id = ldm.log_dark_matter_sender |
||||
160 | WHERE |
||||
161 | ldm.log_dark_matter_timestamp < '{$pack_until}' |
||||
162 | GROUP BY |
||||
163 | log_dark_matter_sender;", |
||||
164 | |||||
165 | "DELETE FROM `{{log_dark_matter}}` WHERE log_dark_matter_timestamp < '{$pack_until}';", |
||||
166 | ), |
||||
167 | |||||
168 | // Пакуем статистические данные по онлайну пользователей |
||||
169 | array( |
||||
170 | "REPLACE INTO `{{log_users_online}}` |
||||
171 | (online_timestamp, online_count, online_aggregated) |
||||
172 | SELECT |
||||
173 | FROM_UNIXTIME((UNIX_TIMESTAMP(online_timestamp) DIV " . PERIOD_MINUTE_10 . ") * (" . PERIOD_MINUTE_10 . ")), ceil(avg(online_count)), " . LOG_ONLIINE_AGGREGATE_PERIOD_MINUTE_10 . " |
||||
174 | FROM |
||||
175 | `{{log_users_online}}` |
||||
176 | WHERE |
||||
177 | online_timestamp < '{$pack_until}' AND online_aggregated = " . LOG_ONLIINE_AGGREGATE_NONE . " |
||||
178 | GROUP BY |
||||
179 | (UNIX_TIMESTAMP(online_timestamp) DIV " . PERIOD_MINUTE_10 . ") * (" . PERIOD_MINUTE_10 . ");", |
||||
180 | |||||
181 | "DELETE FROM `{{log_users_online}}` WHERE online_timestamp < '{$pack_until}' AND online_aggregated = " . LOG_ONLIINE_AGGREGATE_NONE, |
||||
182 | ), |
||||
183 | |||||
184 | // Удаляем старые записи из логов |
||||
185 | "DELETE FROM `{{logs}}` WHERE log_timestamp < '{$pack_until}';", |
||||
186 | // Удаляем записи о маинтенансе, апдейте и пересчете статистики более чем недельной давности - они нам уже не нужны |
||||
187 | 'DELETE FROM `{{logs}}` WHERE |
||||
188 | `log_code` IN (' . LOG_INFO_DB_CHANGE . ', ' . LOG_INFO_MAINTENANCE . ', ' . LOG_INFO_STAT_START . ', ' . LOG_INFO_STAT_PROCESS . ', ' . LOG_INFO_STAT_FINISH . ') |
||||
189 | AND `log_timestamp` < DATE_SUB(NOW(),INTERVAL 7 DAY);', |
||||
190 | |||||
191 | |||||
192 | // Удаляем вхождения игроков, на которые никто не ссылается |
||||
193 | "DELETE spe FROM `{{security_player_entry}}` AS spe |
||||
194 | LEFT JOIN `{{counter}}` AS c ON c.player_entry_id = spe.id |
||||
195 | WHERE c.counter_id IS NULL;", |
||||
196 | // Удаляем устройства, на которые никто не ссылается |
||||
197 | "DELETE sd FROM `{{security_device}}` AS sd |
||||
198 | LEFT JOIN `{{security_player_entry}}` AS spe ON spe.device_id = sd.device_id |
||||
199 | WHERE spe.id IS NULL;", |
||||
200 | // Удаляем браузеры, на которые никто не ссылается |
||||
201 | "DELETE sb FROM `{{security_browser}}` AS sb |
||||
202 | LEFT JOIN `{{security_player_entry}}` AS spe ON spe.browser_id = sb.browser_id |
||||
203 | WHERE spe.id IS NULL;", |
||||
204 | // Удаляем строки запросов, на которые никто не ссылается |
||||
205 | "DELETE sqs FROM `{{security_query_strings}}` AS sqs |
||||
206 | LEFT JOIN `{{counter}}` AS c ON c.query_string_id = sqs.id |
||||
207 | WHERE c.counter_id IS NULL;", |
||||
208 | // Удаляем УРЛы, на которые никто не ссылается |
||||
209 | "DELETE su FROM `{{security_url}}` AS su |
||||
210 | LEFT JOIN `{{counter}}` AS c ON c.page_url_id = su.url_id |
||||
211 | WHERE c.counter_id IS NULL;", |
||||
212 | |||||
213 | // "INSERT INTO {{counter}} SET |
||||
214 | // `page_url_id` = {$this->page_address_id}, |
||||
215 | |||||
216 | |||||
217 | // Удаляем записи визитов без пользователей |
||||
218 | // 'DELETE FROM `{{counter}}` WHERE `user_id` NOT IN (SELECT `id` FROM `{{users}}`);', |
||||
219 | ); |
||||
220 | |||||
221 | function sn_maintenance_pack_user_list($user_list) { |
||||
222 | $user_list = explode(',', $user_list); |
||||
223 | foreach($user_list as $key => $user_id) { |
||||
224 | if(!is_numeric($user_id)) { |
||||
225 | unset($user_list[$key]); |
||||
226 | } |
||||
227 | } |
||||
228 | |||||
229 | $result = array(); |
||||
230 | if(!empty($user_list)) { |
||||
231 | $query = doquery("SELECT `id` FROM `{{users}}` WHERE `id` in (" . implode(',', $user_list) . ")"); |
||||
0 ignored issues
–
show
The function
doquery() has been deprecated.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
232 | while($row = db_fetch($query)) { |
||||
0 ignored issues
–
show
The function
db_fetch() has been deprecated.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
233 | $result[] = $row['id']; |
||||
234 | } |
||||
235 | } |
||||
236 | |||||
237 | return implode(',', $result); |
||||
238 | } |
||||
239 | |||||
240 | global $config, $debug, $lang; |
||||
241 | |||||
242 | db_mysql::db_transaction_start(); |
||||
243 | $old_server_status = SN::$config->pass()->game_disable; |
||||
244 | $old_server_status == GAME_DISABLE_NONE ? SN::$config->pass()->game_disable = GAME_DISABLE_MAINTENANCE : false; |
||||
245 | db_mysql::db_transaction_commit(); |
||||
246 | |||||
247 | foreach($ques as $que_transaction) { |
||||
248 | db_mysql::db_transaction_start(); |
||||
249 | |||||
250 | !is_array($que_transaction) ? $que_transaction = array($que_transaction) : false; |
||||
251 | foreach($que_transaction as $que) { |
||||
252 | set_time_limit(120); |
||||
253 | $QryResult = doquery($que); |
||||
0 ignored issues
–
show
The function
doquery() has been deprecated.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
254 | //$msg .= '<hr>' . $que . '<hr>'; |
||||
255 | $que = str_replace(array('{{', '}}'), '', $que); |
||||
256 | //$que = str_replace('{{', '', $que); |
||||
257 | //$que = str_replace('}}', '', $que); |
||||
258 | |||||
259 | $msg .= |
||||
260 | '<li>' . htmlspecialchars($que) . |
||||
261 | ' --- <span style="' . ($QryResult ? 'ok">OK' : 'error">FAILED!') . '</span> ' . |
||||
262 | SN::$db->db_affected_rows() . ' ' . $lang['adm_records'] . |
||||
263 | "</li>"; |
||||
264 | |||||
265 | $debug->warning($que . ' --- ' . ($QryResult ? 'OK' : 'FAILED!') . ' ' . SN::$db->db_affected_rows() . ' ' . $lang['adm_records'], 'System maintenance', LOG_INFO_MAINTENANCE); |
||||
266 | } |
||||
267 | |||||
268 | db_mysql::db_transaction_commit(); |
||||
269 | } |
||||
270 | |||||
271 | db_mysql::db_transaction_start(); |
||||
272 | SN::$config->pass()->stats_hide_player_list = sn_maintenance_pack_user_list(SN::$config->pass()->stats_hide_player_list); |
||||
273 | $debug->warning('Упакован stats_hide_player_list', 'System maintenance', LOG_INFO_MAINTENANCE); |
||||
274 | db_mysql::db_transaction_commit(); |
||||
275 | |||||
276 | db_mysql::db_transaction_start(); |
||||
277 | SN::$config->db_saveItem('game_watchlist', sn_maintenance_pack_user_list(SN::$config->pass()->game_watchlist)); |
||||
278 | $debug->warning('Упакован game_watchlist', 'System maintenance', LOG_INFO_MAINTENANCE); |
||||
279 | db_mysql::db_transaction_commit(); |
||||
280 | |||||
281 | SN::$config->db_saveItem('users_amount', db_user_count()); |
||||
282 | SN::$config->db_saveItem('game_disable', $old_server_status); |
||||
283 | |||||
284 | $_GET['admin_update'] = 1; |
||||
285 | |||||
286 | include_once('../scheduler.php'); |
||||
287 | $totaltime = microtime(true) - $totaltime; |
||||
288 | |||||
289 | $result = $result ? "<li>{$lang['adm_stat_title']} - {$result}</li>" : ''; |
||||
290 | $result = '<div align="left"><ul>' . $msg . $result . '</ul></div>'; |
||||
291 | echo json_encode($result . ' ' . $totaltime); |
||||
292 |