<?php

# запрет доступа, определен пользователь
if (defined('USER')) $FUNC->go('/failed');

# проверка авторизации
if ($FUNC->sess('auth')) { $sess = explode('z', trim($FUNC->sess('auth'))); // проверка авторизации, парсинг
$hash = $FUNC->filter($sess[0], 'sql'); $num = (isset($sess[1])) ? $FUNC->filter($sess[1], 'sql') : 0; // определение данных
if (db_exist($DB, 'auths', 'id', array('hash' => $hash, 'num' => $num))) $FUNC->go('/'); } // проверка в базе данных

# авторизация провалена, возвращена ошибка
if (isset($_GET['error'])) $FUNC->go('/failed');

# авторизация успешна
elseif (isset($_GET['code'])) {

# запрос токена на сервере
$params = array('client_id' => VK['id'], 'client_secret' => VK['key'], 'code' => $_GET['code'], 'redirect_uri' => 'https://' . SERV['host'] .'/vk/auth/'); // параметры
$data = json_decode(@file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(http_build_query($params))), true); // запрос на сервер

# запрос данных пользователя
if (isset($data['access_token'])) { $fields = 'bdate,deactivated,first_name,id,photo_200,sex'; // список получаемых полей
$params = array('access_token' => $data['access_token'], 'fields' => $fields, 'user_ids' => $data['user_id'], 'v' => VK['vers']); // параметры
$vk = json_decode(@file_get_contents('https://api.vk.com/method/users.get' . '?' . urldecode(http_build_query($params))), true); // запрос на сервер

# получение данных, обработка
if (isset($vk['response'][0]['id'])) { $info = $vk['response'][0]; // информация аккаунта
if (isset($info['deactivated'])) $FUNC->go('/failed'); // проверка блокировки вконтакте
$sex = ($info['sex'] == 0) ? 'none' : (($info['sex'] == 1) ? 'female' : 'male'); // пол (гендер)
$name = ($USER->filter($info['first_name'], 'name')) ? $info['first_name'] : 'none' ; // настоящее имя
$avatar = (strpos($info['photo_200'], 'camera')) ? 'none' : $USER->avatar($info['photo_200'], true); // аватар
$bdate = (isset($info['bdate']) && $USER->bdate($info['bdate'], true, true)) ? $USER->bdate($info['bdate'], true) : 'none' ; // дата рождения

# определение текущего пользователя
if (db_exist($DB, 'users', 'id', array('vk' => $info['id']))) { $user = db_output($DB, 'users', array('id','avatar','email'), array('vk' => $info['id'])); // получение данных из базы
$id = $user['id']; if ($user['avatar'] != 'none') unlink(ROOT .'design/avatars/'. $user['avatar'] .'.jpg'); // проверка аватара, удаление
db_update($DB, 'users', array('avatar' => $avatar, 'birthday' => $bdate, 'name' => $name), array('id' => $user['id'])); // обновление персональных данных
if (!isset($user['email']) && isset($data['email']) && (!db_exist($DB, 'users', 'email', array('email' => $data['email']))) && // проверка условий установки e-mail
$USER->filter($data['email'], 'email')) db_update($DB, 'users', array('email' => $data['email']), array('id' => $user['id'])); } else {  // обновление e-mail
if (isset($data['email']) && (db_exist($DB, 'users', 'email', array('email' => $data['email'])))) $FUNC->go('/failed'); // проверка занятость e-mail

# регистрация нового пользователя
$id = db_create($DB, 'users', array('active' => 'yes', 'avatar' => $avatar, 'birthday' => $bdate, 'bonus' => time() + 86400, 'money' => DATA['money'], // основа
'name' => $name, 'reg' => time(), 'sex' => $sex, 'status' => 'user', 'vk' => $info['id'], 'visit' => time()), true); db_create($DB, 'settings'); db_create($DB, 'statistic'); // настройки
 if (isset($data['email']) && $USER->filter($data['email'], 'email')) db_update($DB, 'users', array('email' => $data['email']), array ('id' => $id)); // статистика, e-mail

# создание ресурсов игры, в базе данных
for ($how = 1; $how <= DATA['garden']; $how++) { db_create($DB, 'garden', array('num' => $how, 'user' => $id)); } // грядки
for ($how = 1; $how <= DATA['animal']; $how++) { db_create($DB, 'animal', array('num' => $how, 'user' => $id)); } // загоны
for ($how = 1; $how <= DATA['technic']; $how++) { db_create($DB, 'technic', array('num' => $how, 'user' => $id)); } // техника

# создание заданий игры, в базе данных
for ($how = 1; $how <= DATA['tasks']; $how++) { $plant = $GAME->random(1, 4); $count = $GAME->random(3, 10); // растение, количество
$perc = $GAME->random(0, 30); $price = round(((SALE['plant_'. $plant] * $count) / 100) * (100 + $perc)); // вычисление награды
$person = $GAME->person(); $image = $person[0]; $name = $person[1]; db_create($DB, 'tasks', array( // персонаж, имя
'image' => $image, 'name' => $name, 'num' => $how, 'one' =>'plant:'. $plant .':'. $count, 'price' => $price, 'user' => $id)); } } // запись в базу

# данные авторизации
$hash = $FUNC->random(20); // случайная строка
$num = $FUNC->random(9, true); // случайный номер
$browser = $FUNC->browser(AGENT); // браузер
$device = $FUNC->device(AGENT); // используемое устройство
$os = $FUNC->os(AGENT); // операционная система
$ip = $FUNC->ip(IP); // ip - адрес клиента
$auth = $hash .'z'. $num; // данные авторизации
$FUNC->sess('auth', $auth); // запись авторизации
db_delete($DB, 'auths', array('user' => $id)); // чистка авторизаций

# запись авторизации в базу данных
db_create($DB, 'auths', array('browser' => $browser, 'device' => $device, 'hash' => $hash, 'ip' => $ip, 'num' => $num, 'os' => $os, 'user' => $id)); // запись

# проверка наличия ошибок, переадресация в игру
$FUNC->go('/garden'); } else $FUNC->go('/failed'); } else $FUNC->go('/failed'); }

# отправляем запрос к ВКонтакте
$http = (isset($_SERVER['HTTPS'])) ? 'https://' : 'http://'; $scope = 'email,offline'; // определение протокола, получаемые параметры
$params = array('client_id' => VK['id'], 'redirect_uri'  => $http . SERV['host'] .'/vk/auth/', 'response_type' => 'code', 'scope' => $scope, 'v' => VK['vers']); // параметры запроса
$link = urldecode(http_build_query($params)); $FUNC->go('/authorize?'. $link, 'https', 'oauth.vk.com'); // обработка параметров, переадресация

?>