function sys_stat_calculate() { global $config, $sta_update_step; ini_set('memory_limit', $config->stats_php_memory ? $config->stats_php_memory : '1024M'); $user_skip_list = sys_stat_get_user_skip_list(); // $sn_groups_resources_loot = sn_get_groups('resources_loot'); $rate[RES_METAL] = $config->rpg_exchange_metal; $rate[RES_CRYSTAL] = $config->rpg_exchange_crystal / $config->rpg_exchange_metal; $rate[RES_DEUTERIUM] = $config->rpg_exchange_deuterium / $config->rpg_exchange_metal; $rate[RES_DARK_MATTER] = $config->rpg_exchange_darkMatter / $config->rpg_exchange_metal; $sta_update_step = -1; sta_set_time_limit('starting update'); $counts = $points = $unit_cost_cache = $user_allies = array(); sn_db_transaction_start(); sta_set_time_limit('calculating players stats'); $i = 0; // Блокируем всех пользователей classSupernova::db_lock_tables('users'); $user_list = db_user_list('', true, 'id, dark_matter, metal, crystal, deuterium, user_as_ally, ally_id'); $row_num = count($user_list); // while($player = db_fetch($query)) foreach ($user_list as $player) { if ($i++ % 100 == 0) { sta_set_time_limit("calculating players stats (player {$i}/{$row_num})", false); } if (array_key_exists($user_id = $player['id'], $user_skip_list)) { continue; } $resources = $player['metal'] * $rate[RES_METAL] + $player['crystal'] * $rate[RES_CRYSTAL] + $player['deuterium'] * $rate[RES_DEUTERIUM] + $player['dark_matter'] * $rate[RES_DARK_MATTER]; $counts[$user_id][UNIT_RESOURCES] += $resources; // $points[$user_id][UNIT_RESOURCES] += $resources; // А здесь мы фильтруем пользователей по $user_skip_list - далее не нужно этого делать, потому что if (!isset($user_skip_list[$user_id])) { $user_allies[$user_id] = $player['ally_id']; } } unset($user_list); classSupernova::cache_clear(LOC_USER, true); //pdump(classSupernova::$data[LOC_USER]); //pdump(classSupernova::$locks[LOC_USER]); sta_set_time_limit('calculating planets stats'); $i = 0; $query = db_planet_list_resources_by_owner(); $row_num = db_num_rows($query); while ($planet = db_fetch($query)) { if ($i++ % 100 == 0) { sta_set_time_limit("calculating planets stats (planet {$i}/{$row_num})", false); } if (array_key_exists($user_id = $planet['id_owner'], $user_skip_list)) { continue; } $resources = $planet['metal'] * $rate[RES_METAL] + $planet['crystal'] * $rate[RES_CRYSTAL] + $planet['deuterium'] * $rate[RES_DEUTERIUM]; $counts[$user_id][UNIT_RESOURCES] += $resources; // $points[$user_id][UNIT_RESOURCES] += $resources; } // Calculation of Fleet-In-Flight sta_set_time_limit('calculating flying fleets stats'); $i = 0; $query = doquery("SELECT fleet_owner, fleet_array, fleet_resource_metal, fleet_resource_crystal, fleet_resource_deuterium FROM {{fleets}};"); $row_num = db_num_rows($query); while ($fleet_row = db_fetch($query)) { if ($i++ % 100 == 0) { sta_set_time_limit("calculating flying fleets stats (fleet {$i}/{$row_num})", false); } if (array_key_exists($user_id = $fleet_row['fleet_owner'], $user_skip_list)) { continue; } $fleet = sys_unit_str2arr($fleet_row['fleet_array']); foreach ($fleet as $unit_id => $unit_amount) { $counts[$user_id][UNIT_SHIPS] += $unit_amount; if (!isset($unit_cost_cache[$unit_id][0])) { $unit_cost_cache[$unit_id][0] = get_unit_param($unit_id, P_COST); } $unit_cost_data =& $unit_cost_cache[$unit_id][0]; $points[$user_id][UNIT_SHIPS] += ($unit_cost_data[RES_METAL] * $rate[RES_METAL] + $unit_cost_data[RES_CRYSTAL] * $rate[RES_CRYSTAL] + $unit_cost_data[RES_DEUTERIUM] * $rate[RES_DEUTERIUM]) * $unit_amount; } $resources = $fleet_row['fleet_resource_metal'] * $rate[RES_METAL] + $fleet_row['fleet_resource_crystal'] * $rate[RES_CRYSTAL] + $fleet_row['fleet_resource_deuterium'] * $rate[RES_DEUTERIUM]; $counts[$user_id][UNIT_RESOURCES] += $resources; // $points[$user_id][UNIT_RESOURCES] += $resources; } sta_set_time_limit('calculating unit stats'); $i = 0; $query = db_unit_list_stat_calculate(); $row_num = db_num_rows($query); while ($unit = db_fetch($query)) { if ($i++ % 100 == 0) { sta_set_time_limit("calculating unit stats (unit {$i}/{$row_num})", false); } if (array_key_exists($user_id = $unit['unit_player_id'], $user_skip_list)) { continue; } $counts[$user_id][$unit['unit_type']] += $unit['unit_level'] * $unit['unit_amount']; $total_cost = eco_get_total_cost($unit['unit_snid'], $unit['unit_level']); $points[$user_id][$unit['unit_type']] += (isset($total_cost['total']) ? $total_cost['total'] : 0) * $unit['unit_amount']; } sta_set_time_limit('calculating ques stats'); $i = 0; $query = db_que_list_stat(); $row_num = db_num_rows($query); while ($que_item = db_fetch($query)) { if ($i++ % 100 == 0) { sta_set_time_limit("calculating ques stats (que item {$i}/{$row_num})", false); } if (array_key_exists($user_id = $que_item['que_player_id'], $user_skip_list)) { continue; } $que_unit_amount = $que_item['que_unit_amount']; $que_item = sys_unit_str2arr($que_item['que_unit_price']); $resources = ($que_item[RES_METAL] * $rate[RES_METAL] + $que_item[RES_CRYSTAL] * $rate[RES_CRYSTAL] + $que_item[RES_DEUTERIUM] * $rate[RES_DEUTERIUM]) * $que_unit_amount; $counts[$user_id][UNIT_RESOURCES] += $resources; // $points[$user_id][UNIT_RESOURCES] += $resources; } sta_set_time_limit('archiving old statistic'); // Statistic rotation // doquery("DELETE FROM {{statpoints}} WHERE `stat_code` >= 14;"); doquery("DELETE FROM {{statpoints}} WHERE `stat_date` < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL {$config->stats_history_days} DAY));"); doquery("UPDATE {{statpoints}} SET `stat_code` = `stat_code` + 1;"); sta_set_time_limit('posting new user stats to DB'); $data = array(); foreach ($user_allies as $user_id => $ally_id) { // $counts[UNIT_RESOURCES] дублирует $points[UNIT_RESOURCES], поэтому $points не заполняем, а берем $counts и делим на 1000 $points[$user_id][UNIT_RESOURCES] = $counts[$user_id][UNIT_RESOURCES] / 1000; $points[$user_id] = array_map('floor', $points[$user_id]); $counts[$user_id] = array_map('floor', $counts[$user_id]); $ally_id = $ally_id ? $ally_id : 'NULL'; $user_defence_points = $points[$user_id][UNIT_DEFENCE] + $points[$user_id][UNIT_DEF_MISSILES]; $user_defence_counts = $counts[$user_id][UNIT_DEFENCE] + $counts[$user_id][UNIT_DEF_MISSILES]; $user_points = array_sum($points[$user_id]); $user_counts = array_sum($counts[$user_id]); $data[] = $q = "({$user_id},{$ally_id},1,1,'{$points[$user_id][UNIT_TECHNOLOGIES]}','{$counts[$user_id][UNIT_TECHNOLOGIES]}'," . "'{$points[$user_id][UNIT_STRUCTURES]}','{$counts[$user_id][UNIT_STRUCTURES]}','{$user_defence_points}','{$user_defence_counts}'," . "'{$points[$user_id][UNIT_SHIPS]}','{$counts[$user_id][UNIT_SHIPS]}','{$points[$user_id][UNIT_RESOURCES]}','{$counts[$user_id][UNIT_RESOURCES]}'," . "{$user_points},{$user_counts}," . SN_TIME_NOW . ")"; sys_stat_calculate_flush($data); } sys_stat_calculate_flush($data, true); // Updating Allie's stats sta_set_time_limit('posting new Alliance stats to DB'); doquery("INSERT INTO {{statpoints}}\n (`tech_points`, `tech_count`, `build_points`, `build_count`, `defs_points`, `defs_count`,\n `fleet_points`, `fleet_count`, `res_points`, `res_count`, `total_points`, `total_count`,\n `stat_date`, `id_owner`, `id_ally`, `stat_type`, `stat_code`,\n `tech_old_rank`, `build_old_rank`, `defs_old_rank`, `fleet_old_rank`, `res_old_rank`, `total_old_rank`\n )\n SELECT\n SUM(u.`tech_points`)+aus.`tech_points`, SUM(u.`tech_count`)+aus.`tech_count`, SUM(u.`build_points`)+aus.`build_points`, SUM(u.`build_count`)+aus.`build_count`,\n SUM(u.`defs_points`)+aus.`defs_points`, SUM(u.`defs_count`)+aus.`defs_count`, SUM(u.`fleet_points`)+aus.`fleet_points`, SUM(u.`fleet_count`)+aus.`fleet_count`,\n SUM(u.`res_points`)+aus.`res_points`, SUM(u.`res_count`)+aus.`res_count`, SUM(u.`total_points`)+aus.`total_points`, SUM(u.`total_count`)+aus.`total_count`,\n " . SN_TIME_NOW . ", NULL, u.`id_ally`, 2, 1,\n a.tech_rank, a.build_rank, a.defs_rank, a.fleet_rank, a.res_rank, a.total_rank\n FROM {{statpoints}} as u\n join {{alliance}} as al on al.id = u.id_ally\n left join {{statpoints}} as aus on aus.id_owner = al.ally_user_id and aus.stat_type = 1 AND aus.stat_code = 1\n LEFT JOIN {{statpoints}} as a ON a.id_ally = u.id_ally AND a.stat_code = 2 AND a.stat_type = 2\n WHERE u.`stat_type` = 1 AND u.stat_code = 1 AND u.id_ally<>0\n GROUP BY u.`id_ally`"); // Удаляем больше не нужные записи о достижении игрока-альянса db_stat_list_delete_ally_player(); // Some variables we need to update ranks $qryResetRowNum = 'SET @rownum=0;'; $qryFormat = 'UPDATE {{statpoints}} SET `%1$s_rank` = (SELECT @rownum:=@rownum+1) WHERE `stat_type` = %2$d AND `stat_code` = 1 ORDER BY `%1$s_points` DESC, `id_owner` ASC, `id_ally` ASC;'; $rankNames = array('tech', 'build', 'defs', 'fleet', 'res', 'total'); // Updating player's ranks sta_set_time_limit("updating ranks for players"); foreach ($rankNames as $rankName) { sta_set_time_limit("updating player rank '{$rankName}'", false); doquery($qryResetRowNum); doquery(sprintf($qryFormat, $rankName, 1)); } sta_set_time_limit("updating ranks for Alliances"); // --- Updating Allie's ranks foreach ($rankNames as $rankName) { sta_set_time_limit("updating Alliances rank '{$rankName}'", false); doquery($qryResetRowNum); doquery(sprintf($qryFormat, $rankName, 2)); } sta_set_time_limit('setting previous user stats from archive'); doquery("UPDATE {{statpoints}} as new\n LEFT JOIN {{statpoints}} as old ON old.id_owner = new.id_owner AND old.stat_code = 2 AND old.stat_type = new.stat_type\n SET\n new.tech_old_rank = old.tech_rank,\n new.build_old_rank = old.build_rank,\n new.defs_old_rank = old.defs_rank ,\n new.fleet_old_rank = old.fleet_rank,\n new.res_old_rank = old.res_rank,\n new.total_old_rank = old.total_rank\n WHERE\n new.stat_type = 1 AND new.stat_code = 1;"); sta_set_time_limit('setting previous allies stats from archive'); doquery("UPDATE {{statpoints}} as new\n LEFT JOIN {{statpoints}} as old ON old.id_ally = new.id_ally AND old.stat_code = 2 AND old.stat_type = new.stat_type\n SET\n new.tech_old_rank = old.tech_rank,\n new.build_old_rank = old.build_rank,\n new.defs_old_rank = old.defs_rank ,\n new.fleet_old_rank = old.fleet_rank,\n new.res_old_rank = old.res_rank,\n new.total_old_rank = old.total_rank\n WHERE\n new.stat_type = 2 AND new.stat_code = 1;"); sta_set_time_limit('updating players current rank and points'); db_stat_list_update_user_stats(); sta_set_time_limit('updating Allys current rank and points'); db_stat_list_update_ally_stats(); // Counting real user count and updating values $config->db_saveItem('users_amount', db_user_count()); sn_db_transaction_commit(); }
$range = sys_get_param_int('range', 1); $source = sys_get_param_str('source'); $template = gettemplate('stat_statistics', true); $subject_list = array(1 => array('header' => $lang['stat_player'])); if (!$source) { $subject_list[2] = array('header' => $lang['stat_allys']); } stat_tpl_assign($template, $who, 'subject', $subject_list, $sn_group_stat_common); $stat_types = array(STAT_TOTAL => array('type' => 'total'), STAT_FLEET => array('type' => 'fleet'), STAT_TECH => array('type' => 'tech'), STAT_BUILDING => array('type' => 'build'), STAT_DEFENSE => array('type' => 'defs'), STAT_RESOURCE => array('type' => 'res'), STAT_RAID_TOTAL => array('type' => 'raids'), STAT_RAID_WON => array('type' => 'raidswin'), STAT_RAID_LOST => array('type' => 'raidsloose'), STAT_LVL_BUILDING => array('type' => 'lvl_minier'), STAT_LVL_TECH => array('type' => 'player_rpg_tech_level'), STAT_LVL_RAID => array('type' => 'lvl_raid')); stat_tpl_assign($template, $type, 'type', $stat_types, $sn_group_stat_common); $Rank = $stat_types[$type]['type']; $is_common_stat = in_array($type, $sn_group_stat_common); $start = floor($range / 100 % 100) * 100; $query = db_stat_list_statistic($who, $is_common_stat, $Rank, $start, $source); // TODO - Не работает, если игроков на Блице > 100 $record_count = $source ? db_num_rows($query) : ($who == 1 ? db_user_count() : db_ally_count()); // pdump($record_count, '$record_count'); // $record_count = db_num_rows($query); $page_count = floor($record_count / 100); $pages = array(); for ($i = 0; $i <= $page_count; $i++) { $first_element = $i * 100 + 1; $last_element = $first_element + 99; $pages[$first_element] = array('header' => "{$first_element}-{$last_element}"); } $range = $range > $record_count ? $record_count : $range; stat_tpl_assign($template, $range, 'range', $pages, $sn_group_stat_common); while ($row = db_fetch($query)) { $row_stat = array('ID' => $row['id'], 'RANK' => $row['rank'], 'RANK_CHANGE' => $row['rank_old'] ? $row['rank_old'] - $row['rank'] : 0, 'POINTS' => pretty_number($row['points'])); //pdump($row); if ($who == 1) {
foreach ($ques as $que_transaction) { sn_db_transaction_start(); !is_array($que_transaction) ? $que_transaction = array($que_transaction) : false; foreach ($que_transaction as $que) { set_time_limit(120); $QryResult = doquery($que); //$msg .= '<hr>' . $que . '<hr>'; $que = str_replace(array('{{', '}}'), '', $que); //$que = str_replace('{{', '', $que); //$que = str_replace('}}', '', $que); $msg .= '<li>' . htmlspecialchars($que) . ' --- <span style="' . ($QryResult ? 'ok">OK' : 'error">FAILED!') . '</span> ' . db_affected_rows() . ' ' . $lang['adm_records'] . "</li>"; $debug->warning($que . ' --- ' . ($QryResult ? 'OK' : 'FAILED!') . ' ' . db_affected_rows() . ' ' . $lang['adm_records'], 'System maintenance', LOG_INFO_MAINTENANCE); } sn_db_transaction_commit(); } sn_db_transaction_start(); $config->db_saveItem('stats_hide_player_list', sn_maintenance_pack_user_list($config->db_loadItem('stats_hide_player_list'))); $debug->warning('Упакован stats_hide_player_list', 'System maintenance', LOG_INFO_MAINTENANCE); sn_db_transaction_commit(); sn_db_transaction_start(); $config->db_saveItem('game_watchlist', sn_maintenance_pack_user_list($config->db_loadItem('game_watchlist'))); $debug->warning('Упакован game_watchlist', 'System maintenance', LOG_INFO_MAINTENANCE); sn_db_transaction_commit(); $config->db_saveItem('users_amount', db_user_count()); $config->db_saveItem('game_disable', $old_server_status); $_GET['admin_update'] = 1; include_once '../scheduler.php'; $totaltime = microtime(true) - $totaltime; $result = $result ? "<li>{$lang['adm_stat_title']} - {$result}</li>" : ''; $result = '<div align="left"><ul>' . $msg . $result . '</ul></div>'; echo json_encode($result . ' ' . $totaltime);
<?php /** * login.php * * @version 2.0 Security checks & tests by Gorlum for http://supernova.ws * @version 1.1 Security checks & tests by Gorlum for http://supernova.ws * @version 1.0 * @copyright 2008 by ?????? for XNova */ define('LOGIN_LOGOUT', true); $allow_anonymous = true; include 'includes/init.' . substr(strrchr(__FILE__, '.'), 1); // die(); if ($template_result[F_USER_IS_AUTHORIZED]) { sys_redirect('index' . DOT_PHP_EX); } lng_include('login'); lng_include('admin'); $username_unsafe = sys_get_param_str_unsafe('username'); $password_raw = trim(sys_get_param('password')); $password_repeat_raw = trim(sys_get_param('password_repeat')); $email = sys_get_param_str('email'); $template = gettemplate('login_body', true); $template->assign_vars(array('last_user' => db_user_last_registered_username(), 'online_users' => db_user_count(true), 'id_ref' => sys_get_param_int('id_ref'), 'F_LOGIN_MESSAGE' => $template_result[F_LOGIN_MESSAGE], 'F_LOGIN_STATUS' => $template_result[F_LOGIN_STATUS], 'LOGIN_ERROR_USERNAME' => LOGIN_ERROR_USERNAME, 'LOGIN_ERROR_PASSWORD' => LOGIN_ERROR_PASSWORD, 'REGISTER_ERROR_EMAIL_EXISTS' => REGISTER_ERROR_EMAIL_EXISTS, 'PASSWORD_RESTORE_ERROR_WRONG_EMAIL' => PASSWORD_RESTORE_ERROR_EMAIL_NOT_EXISTS, 'USERNAME' => htmlentities($username_unsafe, ENT_QUOTES, 'UTF-8'), 'EMAIL' => htmlentities($email, ENT_QUOTES, 'UTF-8'), 'PASSWORD' => htmlentities($password_raw, ENT_QUOTES, 'UTF-8'), 'PASSWORD_REPEAT' => htmlentities($password_repeat_raw, ENT_QUOTES, 'UTF-8'), 'URL_RULES' => $config->url_rules, 'URL_FORUM' => $config->url_forum, 'URL_FAQ' => $config->url_faq, 'GAME_BLITZ' => $config->game_mode == GAME_BLITZ)); tpl_login_lang($template); display($template, $lang['Login'], false, '', false, false);
if (!isset($sn_data['pages'][$sn_page_name])) { $sn_page_name = ''; } sn_db_connect(); global $lang; $lang = new classLocale(DEFAULT_LANG, $config->server_locale_log_usage); $lang->lng_switch(sys_get_param_str('lang')); if ($config->server_updater_check_auto && $config->server_updater_check_last + $config->server_updater_check_period <= SN_TIME_NOW) { include SN_ROOT_PHYSICAL . 'ajax_version_check' . DOT_PHP_EX; } if ($config->user_birthday_gift && SN_TIME_NOW > $config->user_birthday_celebrate + PERIOD_DAY) { require_once SN_ROOT_PHYSICAL . "includes/includes/user_birthday_celebrate" . DOT_PHP_EX; sn_user_birthday_celebrate(); } if (!$config->var_online_user_count || $config->var_online_user_time + 30 < SN_TIME_NOW) { $config->db_saveItem('var_online_user_count', db_user_count(true)); $config->db_saveItem('var_online_user_time', SN_TIME_NOW); if ($config->server_log_online) { doquery("INSERT IGNORE INTO {{log_users_online}} SET online_count = {$config->var_online_user_count};"); } } // pdump($skip_fleet_update, '$skip_fleet_update'); // pdump($supernova->options['fleet_update_skip'], '$supernova->options[fleet_update_skip]'); global $skip_fleet_update; $skip_fleet_update = $skip_fleet_update || $supernova->options['fleet_update_skip'] || defined('IN_ADMIN'); if (!$skip_fleet_update && SN_TIME_NOW - strtotime($config->fleet_update_last) > $config->fleet_update_interval) { require_once SN_ROOT_PHYSICAL . "includes/includes/flt_flying_fleet_handler2" . DOT_PHP_EX; flt_flying_fleet_handler($skip_fleet_update); } sec_login($result); $user = $result[F_LOGIN_USER];