static function user_time_diff_set($user_time_diff) { // Переопределяем массив, что бы элементы были в правильном порядке $user_time_diff = array(PLAYER_OPTION_TIME_DIFF => isset($user_time_diff[PLAYER_OPTION_TIME_DIFF]) ? $user_time_diff[PLAYER_OPTION_TIME_DIFF] : '', PLAYER_OPTION_TIME_DIFF_UTC_OFFSET => isset($user_time_diff[PLAYER_OPTION_TIME_DIFF_UTC_OFFSET]) ? $user_time_diff[PLAYER_OPTION_TIME_DIFF_UTC_OFFSET] : 0, PLAYER_OPTION_TIME_DIFF_FORCED => isset($user_time_diff[PLAYER_OPTION_TIME_DIFF_FORCED]) ? $user_time_diff[PLAYER_OPTION_TIME_DIFF_FORCED] : 0, PLAYER_OPTION_TIME_DIFF_MEASURE_TIME => SN_TIME_SQL); $user_time_diff_str = implode(';', $user_time_diff); sn_setcookie(SN_COOKIE_T, $user_time_diff_str, SN_TIME_NOW + PERIOD_MONTH); }
function sn_options_model() { global $user, $user_option_list, $lang, $template_result, $config; $FMT_DATE = preg_replace(array('/d/', '/m/', '/Y/'), array('DD', 'MM', 'YYYY'), FMT_DATE); if (sys_get_param_str('mode') == 'change') { if ($user['authlevel'] > 0) { $planet_protection = sys_get_param_int('adm_pl_prot') ? $user['authlevel'] : 0; db_planet_set_by_owner($user['id'], "`id_level` = '{$planet_protection}'"); db_user_set_by_id($user['id'], "`admin_protection` = '{$planet_protection}'"); $user['admin_protection'] = $planet_protection; } if (sys_get_param_int('vacation') && !$config->user_vacation_disable) { sn_db_transaction_start(); if ($user['authlevel'] < 3) { if ($user['vacation_next'] > SN_TIME_NOW) { message($lang['opt_vacation_err_timeout'], $lang['Error'], 'index.php?page=options', 5); die; } $is_building = doquery("SELECT * FROM `{{fleets}}` WHERE `fleet_owner` = '{$user['id']}' LIMIT 1;", true); if ($is_building) { message($lang['opt_vacation_err_your_fleet'], $lang['Error'], 'index.php?page=options', 5); die; } $que = que_get($user['id'], false); if (!empty($que)) { message($lang['opt_vacation_err_que'], $lang['Error'], 'index.php?page=options', 5); die; } $query = classSupernova::db_get_record_list(LOC_PLANET, "`id_owner` = {$user['id']}"); foreach ($query as $planet) { // $planet = sys_o_get_updated($user, $planet, SN_TIME_NOW); // $planet = $planet['planet']; db_planet_set_by_id($planet['id'], "last_update = " . SN_TIME_NOW . ", energy_used = '0', energy_max = '0',\n metal_perhour = '{$config->metal_basic_income}', crystal_perhour = '{$config->crystal_basic_income}', deuterium_perhour = '{$config->deuterium_basic_income}',\n metal_mine_porcent = '0', crystal_mine_porcent = '0', deuterium_sintetizer_porcent = '0', solar_plant_porcent = '0',\n fusion_plant_porcent = '0', solar_satelit_porcent = '0', ship_sattelite_sloth_porcent = 0"); } $user['vacation'] = SN_TIME_NOW + $config->player_vacation_time; } else { $user['vacation'] = SN_TIME_NOW; } sn_db_transaction_commit(); } foreach ($user_option_list as $option_group_id => $option_group) { foreach ($option_group as $option_name => $option_value) { if ($user[$option_name] !== null) { $user[$option_name] = sys_get_param_str($option_name); } else { $user[$option_name] = $option_value; } } } $options = sys_user_options_pack($user); $player_options = sys_get_param('options'); if (!empty($player_options)) { array_walk($player_options, function (&$value) { // TODO - Когда будет больше параметров - сделать больше проверок $value = intval($value); }); player_save_option_array($user, $player_options); if ($player_options[PLAYER_OPTION_MENU_HIDE_SHOW_BUTTON] == PLAYER_OPTION_MENU_HIDE_SHOW_BUTTON_HIDDEN) { sn_setcookie(SN_COOKIE . '_menu_hidden', '0', time() - PERIOD_WEEK, SN_ROOT_RELATIVE); } } $username = substr(sys_get_param_str_unsafe('username'), 0, 32); $username_safe = db_escape($username); if ($username && $user['username'] != $username && $config->game_user_changename != SERVER_PLAYER_NAME_CHANGE_NONE && sys_get_param_int('username_confirm')) { // проверка на корректность sn_db_transaction_start(); $name_check = doquery("SELECT * FROM {{player_name_history}} WHERE `player_name` LIKE \"{$username_safe}\" LIMIT 1 FOR UPDATE;", true); if (!$name_check || $name_check['player_id'] == $user['id']) { $user = db_user_by_id($user['id'], true); switch ($config->game_user_changename) { case SERVER_PLAYER_NAME_CHANGE_PAY: if (mrc_get_level($user, $planetrow, RES_DARK_MATTER) < $config->game_user_changename_cost) { $template_result['.']['result'][] = array('STATUS' => ERR_ERROR, 'MESSAGE' => $lang['opt_msg_name_change_err_no_dm']); break; } rpg_points_change($user['id'], RPG_NAME_CHANGE, -$config->game_user_changename_cost, sprintf('Пользователь ID %d сменил имя с "%s" на "%s"', $user['id'], $user['username'], $username)); case SERVER_PLAYER_NAME_CHANGE_FREE: db_user_set_by_id($user['id'], "`username` = '{$username_safe}'"); doquery("REPLACE INTO {{player_name_history}} SET `player_id` = {$user['id']}, `player_name` = \"{$username_safe}\""); // TODO: Change cookie to not force user relogin sn_setcookie(SN_COOKIE, '', time() - PERIOD_WEEK, SN_ROOT_RELATIVE); $template_result['.']['result'][] = array('STATUS' => ERR_NONE, 'MESSAGE' => $lang['opt_msg_name_changed']); $user['username'] = $username; break; } } else { $template_result['.']['result'][] = array('STATUS' => ERR_ERROR, 'MESSAGE' => $lang['opt_msg_name_change_err_used_name']); } sn_db_transaction_commit(); } $new_password = sys_get_param('newpass1'); if ($new_password) { try { if ($new_password != sys_get_param('newpass2')) { throw new Exception($lang['opt_err_pass_unmatched'], ERR_WARNING); } //if(sec_password_encode(sys_get_param('db_password'), $user['salt']) != $user['password']) { if (!sec_password_change($user, $new_password, sys_get_param('db_password'), 1)) { // OK throw new Exception($lang['opt_err_pass_wrong'], ERR_WARNING); } //sec_set_cookie_by_user($user, 1); // Не нужно - мы просто перечитаем запись //$aUser = db_user_by_id($user['id']); //$user['password'] = $aUser['password']; //$user['salt'] = $aUser['salt']; // if(!sec_password_check($user, sys_get_param('db_password'))) { // throw new Exception($lang['opt_err_pass_wrong'], ERR_WARNING); // } // // $user['salt'] = sec_password_salt_generate(); // $user['password'] = sec_password_encode($new_password, $user['salt']); // Changed cookie to not force user relogin // sn_setcookie(SN_COOKIE, '', time() - PERIOD_WEEK, SN_ROOT_RELATIVE); // sn_cookie_set_user($user, 1); // sec_set_cookie_by_fields($user['id'], $user['username'], $user['password'], 1); throw new Exception($lang['opt_msg_pass_changed'], ERR_NONE); } catch (Exception $e) { $template_result['.']['result'][] = array('STATUS' => in_array($e->getCode(), array(ERR_NONE, ERR_WARNING, ERR_ERROR)) ? $e->getCode() : ERR_ERROR, 'MESSAGE' => $e->getMessage()); } } $user['email'] = sys_get_param_str('db_email'); if (!$user['email_2']) { $user['email_2'] = sys_get_param_str('db_email2'); } $user['dpath'] = sys_get_param_str('dpath'); $user['lang'] = sys_get_param_str('langer', $user['lang']); if ($lang->lng_switch($user['lang'])) { lng_include('options'); lng_include('messages'); } $user['design'] = sys_get_param_int('design'); $user['noipcheck'] = sys_get_param_int('noipcheck'); $user['spio_anz'] = sys_get_param_int('spio_anz'); $user['settings_tooltiptime'] = sys_get_param_int('settings_tooltiptime'); $user['settings_fleetactions'] = sys_get_param_int('settings_fleetactions', 1); $user['settings_esp'] = sys_get_param_int('settings_esp'); $user['settings_wri'] = sys_get_param_int('settings_wri'); $user['settings_bud'] = sys_get_param_int('settings_bud'); $user['settings_mis'] = sys_get_param_int('settings_mis'); $user['settings_statistics'] = sys_get_param_int('settings_statistics'); $user['settings_info'] = sys_get_param_int('settings_info'); $user['settings_rep'] = sys_get_param_int('settings_rep'); $user['planet_sort'] = sys_get_param_int('settings_sort'); $user['planet_sort_order'] = sys_get_param_int('settings_order'); $user['deltime'] = !sys_get_param_int('deltime') ? 0 : ($user['deltime'] ? $user['deltime'] : SN_TIME_NOW + $config->player_delete_time); $gender = sys_get_param_int('gender', $user['gender']); !isset($lang['sys_gender_list'][$gender]) ? $gender = $user['gender'] : false; $user['gender'] = $user['gender'] == GENDER_UNKNOWN ? $gender : $user['gender']; try { if ($user['birthday']) { throw new exception(); } $user_birthday = sys_get_param_str_unsafe('user_birthday'); if (!$user_birthday || $user_birthday == $FMT_DATE) { throw new exception(); } // Some black magic to parse any valid date format - those that contains all three "d", "m" and "Y" and any of the delimeters "\", "/", ".", "-" $pos['d'] = strpos(FMT_DATE, 'd'); $pos['m'] = strpos(FMT_DATE, 'm'); $pos['Y'] = strpos(FMT_DATE, 'Y'); asort($pos); $i = 0; foreach ($pos as &$position) { $position = ++$i; } $regexp = "/" . preg_replace(array('/\\\\/', '/\\//', '/\\./', '/\\-/', '/d/', '/m/', '/Y/'), array('\\\\\\', '\\/', '\\.', '\\-', '(\\d?\\d)', '(\\d?\\d)', '(\\d{4})'), FMT_DATE) . "/"; if (!preg_match($regexp, $user_birthday, $match)) { throw new exception(); } if (!checkdate($match[$pos['m']], $match[$pos['d']], $match[$pos['Y']])) { throw new exception(); } $user['user_birthday'] = db_escape("{$match[$pos['Y']]}-{$match[$pos['m']]}-{$match[$pos['d']]}"); // EOF black magic! Now we have valid SQL date in $user['user_birthday'] - independent of date format $year = date('Y', SN_TIME_NOW); if (mktime(0, 0, 0, $match[$pos['m']], $match[$pos['d']], $year) > SN_TIME_NOW) { $year--; } $user['user_birthday_celebrated'] = db_escape("{$year}-{$match[$pos['m']]}-{$match[$pos['d']]}"); $user_birthday = ", `user_birthday` = '{$user['user_birthday']}', `user_birthday_celebrated` = '{$user['user_birthday_celebrated']}'"; } catch (exception $e) { $user_birthday = ''; } require_once 'includes/includes/sys_avatar.php'; $avatar_upload_result = sys_avatar_upload($user['id'], $user['avatar']); $template_result['.']['result'][] = $avatar_upload_result; $user_time_diff = user_time_diff_get(); if (sys_get_param_int('user_time_diff_forced')) { user_time_diff_set(array(PLAYER_OPTION_TIME_DIFF => sys_get_param_int('user_time_diff'), PLAYER_OPTION_TIME_DIFF_UTC_OFFSET => 0, PLAYER_OPTION_TIME_DIFF_FORCED => 1, PLAYER_OPTION_TIME_DIFF_MEASURE_TIME => SN_TIME_SQL)); } elseif (sys_get_param_int('opt_time_diff_clear') || $user_time_diff[PLAYER_OPTION_TIME_DIFF_FORCED]) { user_time_diff_set(array(PLAYER_OPTION_TIME_DIFF => '', PLAYER_OPTION_TIME_DIFF_UTC_OFFSET => 0, PLAYER_OPTION_TIME_DIFF_FORCED => 0, PLAYER_OPTION_TIME_DIFF_MEASURE_TIME => SN_TIME_SQL)); } $user_options_safe = db_escape($user['options']); // `username` = '{$username_safe}', // `password` = '{$user['password']}', `salt` = '{$user['salt']}', db_user_set_by_id($user['id'], "`email` = '{$user['email']}', `email_2` = '{$user['email_2']}', `lang` = '{$user['lang']}', `avatar` = '{$user['avatar']}',\n `dpath` = '{$user['dpath']}', `design` = '{$user['design']}', `noipcheck` = '{$user['noipcheck']}',\n `planet_sort` = '{$user['planet_sort']}', `planet_sort_order` = '{$user['planet_sort_order']}', `spio_anz` = '{$user['spio_anz']}',\n `settings_tooltiptime` = '{$user['settings_tooltiptime']}', `settings_fleetactions` = '{$user['settings_fleetactions']}', `settings_esp` = '{$user['settings_esp']}',\n `settings_wri` = '{$user['settings_wri']}', `settings_bud` = '{$user['settings_bud']}', `settings_statistics` = '{$user['settings_statistics']}',\n `settings_info` = '{$user['settings_info']}', `settings_mis` = '{$user['settings_mis']}', `settings_rep` = '{$user['settings_rep']}',\n `deltime` = '{$user['deltime']}', `vacation` = '{$user['vacation']}', `options` = '{$user_options_safe}', `gender` = {$user['gender']}\n {$user_birthday}"); $template_result['.']['result'][] = array('STATUS' => ERR_NONE, 'MESSAGE' => $lang['opt_msg_saved']); } elseif (sys_get_param_str('result') == 'ok') { $template_result['.']['result'][] = array('STATUS' => ERR_NONE, 'MESSAGE' => $lang['opt_msg_saved']); } $user = db_user_by_id($user['id']); $options = sys_user_options_unpack(&$user); }
protected function cookie_clear() { // Автоматически вообще-то - если установлена кука имперсонатора - то чистим обычную, а куку имперсонатора - копируем в неё if (!empty($_COOKIE[$this->cookie_name_impersonate])) { sn_setcookie($this->cookie_name, $_COOKIE[$this->cookie_name_impersonate], SN_TIME_NOW + PERIOD_YEAR, $this->sn_root_path, $this->domain); sn_setcookie($this->cookie_name_impersonate, '', SN_TIME_NOW - PERIOD_WEEK, $this->sn_root_path, $this->domain); } else { sn_setcookie($this->cookie_name, '', SN_TIME_NOW - PERIOD_WEEK, $this->sn_root_path, $this->domain); } }
/** * @param array|mixed $option * @param null|mixed $value */ public function __set($option, $value = null) { global $sn_cache; if (empty($option) || !$this->user_id) { return; } // Если в массиве индекса только один элемент - значит это просто индекс if (is_array($option) && count($option) == 1) { // Разворачиваем его в индекс $option = array(reset($option) => $value); unset($value); // Дальше будет использоваться стандартный код для пары $option, $value } $to_write = array(); // Адресация многомерного массива через массив индексов в $option if (is_array($option) && isset($value)) { $a_data =& $this->data; foreach ($option as $option_id) { !is_array($a_data[$option_id]) ? $a_data[$option_id] = array() : false; $a_data =& $a_data[$option_id]; } if ($a_data != $value) { $a_data = $value; $to_write[reset($option)] = null; } } else { // Пакетная запись из массива ключ -> значение !is_array($option) ? $option = array($option => $value) : false; foreach ($option as $option_id => $option_value) { if ($this->data[$option_id] !== $option_value) { // TODO - вынести отдельно в обработчик if ($option_id == PLAYER_OPTION_MENU_HIDE_SHOW_BUTTON && $option_value == PLAYER_OPTION_MENU_HIDE_SHOW_BUTTON_HIDDEN) { sn_setcookie(SN_COOKIE . '_menu_hidden', '0', time() - PERIOD_WEEK, SN_ROOT_RELATIVE); } $this->data[$option_id] = $option_value; $to_write[$option_id] = null; } } } if (!empty($to_write)) { $field_name = $this->cached_name(); $sn_cache->{$field_name} = $this->data; foreach ($to_write as $option_id => &$option_value) { $option_value = is_array($this->data[$option_id]) ? serialize($this->data[$option_id]) : $this->data[$option_id]; // Сериализация для массивов при сохранении в БД $to_write[$option_id] = "({$this->user_id}, '" . db_escape($option_id) . "', '" . db_escape($option_value) . "')"; } doquery("REPLACE INTO {{player_options}} (`player_id`, `option_id`, `value`) VALUES " . implode(',', $to_write)); } }
protected static function cookie_set($value, $impersonate = false, $period = null) { sn_setcookie($impersonate ? SN_COOKIE_U_I : SN_COOKIE_U, $value, $period === null ? SN_TIME_NOW + PERIOD_YEAR : $period, SN_ROOT_RELATIVE); }
/** * @param bool|string $redirect нужно ли сделать перенаправление после логаута * <p><b>false</b> - не перенаправлять</p> * <p><i><b>true</b></i> - перенаправить на главную страницу</p> * <p><b>string</b> - перенаправить на указанный URL</p> * * @param bool $only_impersonator Если установлен - то логаут происходит только при имперсонации */ function sn_sys_logout($redirect = true, $only_impersonator = false) { global $user_impersonator; if ($only_impersonator && !$user_impersonator) { return; } if ($_COOKIE[SN_COOKIE_I] && $user_impersonator['authlevel'] >= 3) { // sn_cookie_set_user($user_impersonator, 1); // sec_set_cookie_by_fields($user_impersonator['id'], $user_impersonator['username'], $user_impersonator['password'], 1); sec_set_cookie_by_user($user_impersonator, 1); $redirect = $redirect === true ? 'admin/userlist.php' : $redirect; } else { sn_setcookie(SN_COOKIE, '', time() - PERIOD_WEEK, SN_ROOT_RELATIVE); } sn_setcookie(SN_COOKIE_I, '', time() - PERIOD_WEEK, SN_ROOT_RELATIVE); if ($redirect === true) { sys_redirect(SN_ROOT_RELATIVE . 'login.php'); } elseif ($redirect !== false) { sys_redirect($redirect); } }
// TODO ban if ($template_result[F_BANNED_STATUS] && !$skip_ban_check) { if (defined('IN_API')) { return; } $bantime = date(FMT_DATE_TIME, $template_result[F_BANNED_STATUS]); // TODO: Add ban reason. Add vacation time. Add message window sn_sys_logout(false, true); message("{$lang['sys_banned_msg']} {$bantime}", $lang['ban_title']); die("{$lang['sys_banned_msg']} {$bantime}"); } $template_result[F_USER_AUTHORIZED] = $sys_user_logged_in = !empty($user) && isset($user['id']) && $user['id']; // !!! Просто $allow_anonymous используется в платежных модулях !!! $allow_anonymous = $allow_anonymous || isset($sn_page_data['allow_anonymous']) && $sn_page_data['allow_anonymous']; if (!$allow_anonymous && !$sys_user_logged_in) { sn_setcookie(SN_COOKIE, '', time() - PERIOD_WEEK, SN_ROOT_RELATIVE); sys_redirect(SN_ROOT_VIRTUAL . 'login.php'); } $user_time_diff = user_time_diff_get(); //defined('SN_CLIENT_TIME_DIFF_SECONDS') or define('SN_CLIENT_TIME_DIFF_SECONDS', $user_time_diff[PLAYER_OPTION_TIME_DIFF]); //defined('SN_CLIENT_TIME_UTC_OFFSET') or define('SN_CLIENT_TIME_UTC_OFFSET', $user_time_diff[PLAYER_OPTION_TIME_DIFF_UTC_OFFSET]); //$time_diff = SN_CLIENT_TIME_DIFF_SECONDS + SN_CLIENT_TIME_UTC_OFFSET; //defined('SN_CLIENT_TIME_DIFF') or define('SN_CLIENT_TIME_DIFF', $time_diff); //defined('SN_CLIENT_TIME_LOCAL') or define('SN_CLIENT_TIME_LOCAL', SN_TIME_NOW + SN_CLIENT_TIME_DIFF); global $time_diff; define('SN_CLIENT_TIME_DIFF', $time_diff = $user_time_diff[PLAYER_OPTION_TIME_DIFF] + $user_time_diff[PLAYER_OPTION_TIME_DIFF_UTC_OFFSET]); define('SN_CLIENT_TIME_LOCAL', SN_TIME_NOW + SN_CLIENT_TIME_DIFF); !empty($user) && sys_get_param_id('only_hide_news') ? die(nws_mark_read($user)) : false; !empty($user) && sys_get_param_id('survey_vote') ? die(survey_vote($user)) : false; lng_load_i18n($sn_mvc['i18n'][$sn_page_name]); execute_hooks($sn_mvc['model'][''], $template);
public function __construct() { $this->write_full_url = !classSupernova::$config->security_write_full_url_disabled; // Инфа об устройстве и браузере - общая для всех sn_db_transaction_start(); $this->device_cypher = $_COOKIE[SN_COOKIE_D]; if ($this->device_cypher) { $cypher_safe = db_escape($this->device_cypher); $device_id = doquery("SELECT `device_id` FROM {{security_device}} WHERE `device_cypher` = '{$cypher_safe}' LIMIT 1 FOR UPDATE", true); if (!empty($device_id['device_id'])) { $this->device_id = $device_id['device_id']; } } if ($this->device_id <= 0) { do { $cypher_safe = db_escape($this->device_cypher = sys_random_string()); $row = doquery("SELECT `device_id` FROM {{security_device}} WHERE `device_cypher` = '{$cypher_safe}' LIMIT 1 FOR UPDATE", true); } while (!empty($row)); doquery("INSERT INTO {{security_device}} (`device_cypher`) VALUES ('{$cypher_safe}');"); $this->device_id = db_insert_id(); sn_setcookie(SN_COOKIE_D, $this->device_cypher, PERIOD_FOREVER, SN_ROOT_RELATIVE); } sn_db_transaction_commit(); sn_db_transaction_start(); $this->user_agent = $_SERVER['HTTP_USER_AGENT']; $this->browser_id = db_get_set_unique_id_value($_SERVER['HTTP_USER_AGENT'], 'browser_id', 'security_browser', 'browser_user_agent'); sn_db_transaction_commit(); sn_db_transaction_start(); $this->page_address = substr($_SERVER['PHP_SELF'], strlen(SN_ROOT_RELATIVE)); $this->page_address_id = db_get_set_unique_id_value($this->page_address, 'url_id', 'security_url', 'url_string'); sn_db_transaction_commit(); if ($this->write_full_url) { sn_db_transaction_start(); $this->page_url = substr($_SERVER['REQUEST_URI'], strlen(SN_ROOT_RELATIVE)); if (strpos($_SERVER['REQUEST_URI'], '/simulator.php') === 0) { $this->page_url = '/simulator.php'; } $this->page_url_id = db_get_set_unique_id_value($this->page_url, 'url_id', 'security_url', 'url_string'); sn_db_transaction_commit(); } $ip = sec_player_ip(); $this->ip_v4_string = $ip['ip']; $this->ip_v4_int = ip2longu($this->ip_v4_string); $this->ip_v4_proxy_chain = $ip['proxy_chain']; }
$skip_fleet_update = true; require_once 'common.' . substr(strrchr(__FILE__, '.'), 1); /* $time_local = $time_server + $time_diff $time_diff = $time_local - $time_server $time_server = $time_local - $time_diff */ if ($font_size = sys_get_param_str('font_size')) { if (strpos($font_size, '%') !== false) { // Размер шрифта в процентах $font_size = min(max(floatval($font_size), FONT_SIZE_PERCENT_MIN), FONT_SIZE_PERCENT_MAX) . '%'; } elseif (strpos($font_size, 'px') !== false) { // Размер шрифта в пикселях $font_size = min(max(floatval($font_size), FONT_SIZE_PIXELS_MIN), FONT_SIZE_PIXELS_MAX) . 'px'; } else { // Не мышонка, не лягушка... $font_size = FONT_SIZE_PERCENT_DEFAULT_STRING; } sn_setcookie(SN_COOKIE_F, $font_size, SN_TIME_NOW + PERIOD_YEAR); classSupernova::$user_options[PLAYER_OPTION_BASE_FONT_SIZE] = $font_size; } else { $user_time_diff = playerTimeDiff::user_time_diff_get(); if ($user_time_diff[PLAYER_OPTION_TIME_DIFF_FORCED]) { $time_diff = intval($user_time_diff[PLAYER_OPTION_TIME_DIFF]); } else { $user_time_diff = playerTimeDiff::user_time_diff_probe(); playerTimeDiff::user_time_diff_set($user_time_diff); $time_diff = $user_time_diff[PLAYER_OPTION_TIME_DIFF] + $user_time_diff[PLAYER_OPTION_TIME_DIFF_UTC_OFFSET]; } echo $time_diff; }