diff --git a/app/Controllers/Api/Images/Comments/Create.php b/app/Controllers/Api/Images/Comments/Create.php index b0c45fd..89bebb2 100644 --- a/app/Controllers/Api/Images/Comments/Create.php +++ b/app/Controllers/Api/Images/Comments/Create.php @@ -4,15 +4,15 @@ namespace App\Controllers\Api\Images\Comments; use App\Services\{Auth, Router, GenerateRandomStr, DB, Json, Files, Shell}; use App\Models\Notification; - +use App\Services\Upload as Upload; class Create { - + static $filesrc; private static function create($content, $id) { - DB::query('INSERT INTO photos_comments VALUES (\'0\', :userid, :postid, :postbody, :time, :content)', array('postid' => $_POST['id'], ':postbody' => $_POST['wtext'], ':userid' => Auth::userid(), ':time' => time(), ':content'=>'')); + DB::query('INSERT INTO photos_comments VALUES (\'0\', :userid, :postid, :postbody, :time, :content)', array('postid' => $_POST['id'], ':postbody' => $_POST['wtext'], ':userid' => Auth::userid(), ':time' => time(), ':content'=>$content)); } public function __construct() { @@ -21,15 +21,54 @@ class Create if ((int)$id === DB::query('SELECT id FROM photos WHERE id=:id', array(':id' => $id))[0]['id']) { - $content = Json::return( - array( - 'type' => 'none', - 'by' => 'user' - ) - ); + if ($_FILES['filebody']['error'] != 4) { + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $mime = finfo_file($finfo, $_FILES['filebody']['tmp_name']); + finfo_close($finfo); + $filename = GenerateRandomStr::gen_uuid(); + if (preg_match('/^image\//', $mime)) { + $info = getimagesize($_FILES['filebody']['tmp_name']); - if (strlen($postbody) < 4096 || strlen($postbody) > 1) { - if (trim($postbody) != '') { + if ($info['mime'] == 'image/jpeg') + $image = imagecreatefromjpeg($_FILES['filebody']['tmp_name']); + elseif ($info['mime'] == 'image/gif') + $image = imagecreatefromgif($_FILES['filebody']['tmp_name']); + elseif ($info['mime'] == 'image/png') + $image = imagecreatefrompng($_FILES['filebody']['tmp_name']); + $type = 'img'; + $destination = '/cdn/temp/'.$filename.'.jpg'; + imagejpeg($image, $_SERVER['DOCUMENT_ROOT'].$destination, 60); + + } else if (preg_match('/^audio\//', $mime)) { + return "Аудио"; + } else if (preg_match('/^video\//', $mime)) { + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + $ffmpeg = \FFMpeg\FFMpeg::create(array( + 'ffmpeg.binaries' => $_SERVER['DOCUMENT_ROOT'] . '/app/Controllers/Exec/ffmpeg.exe', + 'ffprobe.binaries' => $_SERVER['DOCUMENT_ROOT'] . '/app/Controllers/Exec/ffprobe.exe', + 'timeout' => 3600, // The timeout for the underlying process + 'ffmpeg.threads' => 12, // The number of threads that FFMpeg should use + ), $logger); + } else { + $ffmpeg = \FFMpeg\FFMpeg::create(); + } + $video = $ffmpeg->open($_FILES['filebody']['tmp_name']); + $video->save(new \FFMpeg\Format\Video\X264(), $_SERVER['DOCUMENT_ROOT'] . "/cdn/temp/" . $filename . '.mp4'); + $video->frame(\FFMpeg\Coordinate\TimeCode::fromSeconds(1))->save($_SERVER['DOCUMENT_ROOT'] . "/cdn/temp/VIDPRV_" . $filename . '.jpg'); + $type = 'video'; + $destination = '/cdn/temp/'.$filename.'.mp4'; + $destination_vidprv = '/cdn/temp/VIDPRV'.$filename.'.jpg'; + } else { + return "Неизвестный тип файла"; + } + + $upload = new Upload($_SERVER['DOCUMENT_ROOT'].$destination, 'cdn/'.$type.'/'); + self::$filesrc = $upload->getSrc(); + } + + + if ((strlen($postbody) < 4096 || strlen($postbody) > 1) || $_FILES['filebody']['error'] != 4) { + if (trim($postbody) != '' || $_FILES['filebody']['error'] != 4) { $postbody = ltrim($postbody); echo json_encode( array( @@ -48,17 +87,24 @@ class Create } else { die(json_encode( array( - 'errorcode' => '1', + 'errorcode' => '2', 'error' => 1 ) )); } - + $content = Json::return( + array( + 'type' => 'none', + 'by' => 'user', + 'filetype' => $type, + 'src' => self::$filesrc + ) + ); self::create($content, $id); } else { die(json_encode( array( - 'errorcode' => '1', + 'errorcode' => '3', 'error' => 1 ) )); diff --git a/app/Controllers/Api/Images/Rate.php b/app/Controllers/Api/Images/Rate.php index 377fbd8..3730ebd 100644 --- a/app/Controllers/Api/Images/Rate.php +++ b/app/Controllers/Api/Images/Rate.php @@ -15,7 +15,7 @@ class Rate if (isset($_GET['vote']) && isset($_GET['pid'])) { if (Vote::photo(Auth::userid(), $_GET['pid']) === -1) { - DB::query('INSERT INTO photos_rates VALUES (\'0\', :id, :pid, :type)', array(':id'=>Auth::userid(), ':pid' => $_GET['pid'], ':type'=>$_GET['vote'])); + DB::query('INSERT INTO photos_rates VALUES (\'0\', :id, :pid, :type, 0)', array(':id'=>Auth::userid(), ':pid' => $_GET['pid'], ':type'=>$_GET['vote'])); if (Vote::photo(Auth::userid(), $_GET['pid']) != $_GET['vote']) { DB::query('DELETE FROM photos_rates WHERE user_id=:id AND photo_id=:pid AND type=:type', array(':id'=>Auth::userid(), ':pid' => $_GET['pid'], ':type'=>Vote::photo(Auth::userid(), $_GET['pid']))); } diff --git a/app/Controllers/Api/Register.php b/app/Controllers/Api/Register.php index aa960b3..a7eb17d 100644 --- a/app/Controllers/Api/Register.php +++ b/app/Controllers/Api/Register.php @@ -7,7 +7,9 @@ use \App\Controllers\ExceptionRegister; use \App\Core\Page; use donatj\UserAgent\UserAgentParser; - +use PHPMailer\PHPMailer\PHPMailer; +use PHPMailer\PHPMailer\Exception; +use Beeyev\DisposableEmailFilter\DisposableEmailFilter; class Register { @@ -294,6 +296,7 @@ class Register $password = $_POST['password']; $email = $_POST['email']; $forbusernames = explode(',', NGALLERY['root']['registration']['prohibited_usernames']); + $status = 0; if (!self::checkforb($_POST['username'], $forbusernames)) { if (!strcasecmp(DB::query('SELECT username FROM users WHERE (LOWER(username) LIKE :username)', array(':username' => '%' . $username . '%'))[0]['username'], $username) === false) { @@ -315,11 +318,107 @@ class Register 'regdate' => time() ) ); + if (NGALLERY['root']['registration']['emailverify'] == 'true') { + $status === 3; + } + DB::query('INSERT INTO users VALUES (\'0\', :username, :email, :password, :photourl, 5, :online, 0, :status, :content)', array(':username' => ltrim($username), ':password' => password_hash(ltrim($password), PASSWORD_BCRYPT), ':photourl' => '/static/img/avatar.png', ':email' => $email, ':content' => $content, ':online' => time(), ':status'=>$status)); + if (NGALLERY['root']['registration']['emailverify'] == 'true') { + $disposableEmailFilter = new DisposableEmailFilter(); + if ($disposableEmailFilter->isDisposableEmailAddress($_POST['email'])) { + echo json_encode( + array( + 'errorcode' => '9', + 'errortitle' => 'Почта запрещена для регистрации', + 'error' => 1 + ) + ); + die(); + } + $token = GenerateRandomStr::gen_uuid(); + $user_id = DB::query('SELECT id FROM users WHERE username=:username', array(':username' => $username))[0]['id']; + $key = GenerateRandomStr::gen_uuid(); + $content = Json::return( + array( + 'user_id' => $user_id + ) + ); + $mail = new PHPMailer(true); + DB::query('INSERT INTO servicekeys VALUES (\'0\', :token, :type, 1, :content)', array(':token'=>$key, ':type'=>'EMAILVERIFY', ':content'=>$content)); + try { + $mail->isSMTP(); + $mail->Host = NGALLERY['root']['email']['credentials']['host']; + $mail->SMTPAuth = true; + $mail->CharSet = "UTF-8"; + $mail->Username = NGALLERY['root']['email']['credentials']['username']; + $mail->Password = NGALLERY['root']['email']['credentials']['password']; + $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; + $mail->Port = NGALLERY['root']['email']['credentials']['port']; - DB::query('INSERT INTO users VALUES (\'0\', :username, :email, :password, :photourl, 5, :online, 0, 0, :content)', array(':username' => ltrim($username), ':password' => password_hash(ltrim($password), PASSWORD_BCRYPT), ':photourl' => '/static/img/avatar.png', ':email' => $email, ':content' => $content, ':online' => time())); - $cstrong = True; - $token = GenerateRandomStr::gen_uuid(); - $user_id = DB::query('SELECT id FROM users WHERE username=:username', array(':username' => $username))[0]['id']; + $mail->setFrom(NGALLERY['root']['email']['from']['address'], NGALLERY['root']['title']); + $mail->addAddress($_POST['email']); + + $mail->isHTML(true); + $mail->Subject = 'Подтверждение регистрации | '.NGALLERY['root']['title']; + + $mail->Body = ' + + +
+ + + + + +Это письмо было отправлено на ваш почтовый ящик, так как оно было указано при регистрации на '.NGALLERY['root']['title'].' ('.$_SERVER['HTTP_HOST'].')
Если вы его не запрашивали, проигнорируйте его.
- Удалить - c['id'] ?>, 'EDIT_COMMENT', '= htmlspecialchars($this->c['body']) ?>', 'modaledit= $this->c['id'] ?>'); return false;">Редактировать
+ Удалить +
Пожалуйста, подтвердите свою почту
+Письмо с ссылкой для подтверждения почты была отправлена на Ваш ящик, указанный при регистрации.
Вы не участвуете в программе тестирования Birux Streams
- К сожалению, мы уже набрали достаточное количество участников. Следующая волна заявок будет скоро — следите в Telegram-канале - Birux - -Доступ запрещён!
- Такие дела. Эфир не принадлежит вам. -Ваш комментарий
+Предложить медиа на публикацию
Ваш текущий индекс загрузки: = $user->i('uploadindex') ?>
diff --git a/views/pages/Register.php b/views/pages/Register.php index 0df48c0..8efe318 100644 --- a/views/pages/Register.php +++ b/views/pages/Register.php @@ -98,6 +98,7 @@ if (Auth::userid() > 0) {Регистрируясь на сервере = NGALLERY['root']['title'] ?>, вы принимаете его правила.
+Вы можете пройти экскурсию по сайту.
diff --git a/views/pages/System/EmailVerify.php b/views/pages/System/EmailVerify.php new file mode 100644 index 0000000..5edada3 --- /dev/null +++ b/views/pages/System/EmailVerify.php @@ -0,0 +1,36 @@ + + + + + + + + + + + + + +
Спасибо, ваша почта подтверждена.
+ +Экскурсия по сайту
+ + + +С чего начать?
++- Регистрация аккаунта является самым первым и основным этапом в начале вашего пути на данном сайте.
+ - Для регистрации вам потребуется ввести Логин, E-mail и пароль.
+ - В качестве логина для входа на сайт, Вы можете использовать свой E-mail или никнейм, указанный при регистрации.
+
+Регистрируясь на сайте, вы соглашаетесь с правилами сайта
++
Ваш профиль
++- Для взаимодействия с сайтом, у вас появляется профиль.
+ - Ваш профиль виден всем пользователям и даже гостям сайта. В целях приватности и безопасности, пожалуйста, воздержитесь от публикации личной информации в профиле.
+ - На Вас, как и Вы на других пользователей можете подписываться, чтобы следить за обновлениями во вкладке Фотографии избранных авторов.
+
++
Фотографии и Видео
++- Фотографии и Видео — это неотъемлемая часть сайта, на которой строится вся идея портала =NGALLERY['root']['title']?>.
+ - На главной странице размещаются последние 30 фотографий и топ 10 фотографий по просмотрам за 24 часа.
+
+
++
Поиск
+ ++- Раздел "Поиск" позволяет искать пользователей и группы.
+ - Данный раздел сайта со временем будет улучшаться.
+
++- Для начала поиска нужно знать имя (или фамилию) пользователя; а если ищете группу, то нужно знать её название.
+
+Быстрый поиск
+ ++- Если вы хотите как-либо сэкономить время, то строка поиска доступна и в шапке сайта
+
+ ++
Загружайте и делитесь видео со своими друзьями!
+ ++- Вы можете загружать неограниченное количество видеозаписей и клипов
+ - Раздел "Видеозаписи" регулируется настройками приватности
+
+Видео можно загружать минуя раздел "Видеозаписи" через обычное прикрепление к новой записи на стене:
+Импортирование видео с YouTube
+ ++- Кроме загрузки видео напрямую, сайт поддерживает и встраивание видео из YouTube
+
++
Слушайте аудиозаписи
+ ++- Вы можете слушать аудиозаписи в разделе "Мои Аудиозаписи"
+ - Этот раздел также регулируется настройками приватности
+ - Самые прослушиваемые песни находятся во вкладке "Популярное", а недавно загруженные — во вкладке "Новое"
+
+
+ ++- Чтобы добавить песню в свою коллекцию, наведите на неё и нажмите на плюс. Найти нужную песню можно в поиске
+
+ - Если вы не можете найти нужную песню, вы можете загрузить её самостоятельно
+
+
+ +Важно: песня не должна нарушать авторские права
+ +Создавайте плейлисты
+ ++- Вы можете создавать сборники треков во вкладке "Мои плейлисты"
+ - Можно также добавлять чужие плейлисты в свою коллекцию
+
+
+ ++
Следите за тем, что пишут ваши друзья
+ ++- Раздел "Мои Новости" разделяется на два типа: локальная лента и глобальная лента
+ - В локальной ленте будут показываться новости только ваших друзей и групп
+
+
+ +Никакой системы рекомендаций. Свою ленту новостей формируете только вы.
+ + ++
Следите за тем, какие темы обсуждают на сайте
+ ++- В глобальной ленте новостей будут показываться записи всех пользователей сайта и групп
+ - Просмотр данного раздела может не рекомендоваться для чувствительных и ранимых людей
+
+
+ + + +Дизайн глобальной ленты по дизайну никак не отличается от локальной
+ + +В ленте есть множество типов контента: начиная от обычных фото и видео, и заканчивая анонимными постами и опросами
+ + ++
Создавайте группы!
+ ++- На сайте уже имеются тысячи групп, посвящённые различным темам и каким-либо фанатским объединениям
+ - Вы можете присоединяться к любой группе. А если не нашли подходящую, то можно создавать и свою
+ - Каждая группа имеет свой раздел вики-страниц, фотоальбомов, блок ссылок и обсуждений
+
+ + + +Раздел "Мои Группы" находится в левом меню сайта
+Пример сообщества
+ +Управляйте своей группой вместе с другом
+ ++- Управление группой осуществляется в разделе "Редактировать группу" под аватаром сообщества
+ - Создайте команду администраторов из обычных участников или тех, кому вы доверяете
+ - Вы можете скрыть нужного Вам администратора, чтобы он нигде не показывался в пределах вашей группы
+
+ +Группы часто представляют собой реальные организации, члены которых хотят оставаться на связи со своей аудиторией
+ + ++
Упс
+ ++- Я был бы очень рад сделать туториал по этому разделу, но раздел находится на этапе разработки. А сейчас мы пока этот раздел туториала пропустим и пойдём дальше...
+
+ + + ++
Темы оформления
+ ++- После регистрации, в качестве оформления у вас будет установлена стандартная тема
+ - Некоторых новых пользователей может слегка отпугнуть нынешняя стоковая тема, которая веет совсем уж древностью
+ - Но не беда: Вы можете создать свою тему для сайта, ознакомившись с документацией или выбрать уже существующую из каталога
+
+ +Каталог тем доступен в разделе "Мои Настройки" во вкладке "Интерфейс"
+ + +
+
+
Фон профиля и группы
+ ++- Вы можете установить два изображения в качестве фона вашей страницы
+ - Они будут отображаться по бокам у тех, кто зайдёт на вашу страницу
+
+ +Страница установки фона
+ +
+- Совет: перед установкой фона, поэкспериментируйте с разметкой: попробуйте отзеркалить будущую фоновую картинку, или вообще просто создайте красивый градиент
+
+ + ++ +
Примеры страниц с установленным фоном
+ +
С помощью этой возможности вы можете добавить своему профилю больше индивидуальности
+ + +Аватары
+ ++- Вы можете задать вариант показа аватара пользователя: стандартное, закруглённые и квадратные (1:1)
+ - Данные настройки будут видны только вам
+
+ ++ +
+ +
Редактирование левого меню
+ ++- При необходимости вы можете скрыть ненужные разделы сайта
+ - Напоминание: Разделы первой необходимости (Моя Страница; Мои Друзья; Мои Ответы; Мои Настройки) скрыть нельзя
+
+ +Вид постов
++- Если надоел старый дизайн стены, который был в некогда популярном оригинальном ВКонтакте.ру, то вы всегда можете изменить вид постов на Микроблог
+ - Вид постов можно менять между двумя вариантами в любое время
+ - Обратите внимание, что если выбран старый вид отображения постов, то последние комментарии подгружаться не будут
+
+ ++ +
+ +
+
Микроблог
++ + + + +
+
Ваучеры
+ ++- Ваучер в OpenVK это что-то вроде промокода на добавление какой-либо валюты (проценты рейтинга, голосов и так далее)
+ - Подобные купоны создаются по каким-либо значимым событиям и праздникам. Следите за Telegram-каналом OpenVK
+
+ +Ваучеры состоят из 24 цифр и букв
+ +
+- После активации какого-либо ваучера, заданная администраторами валюта будет перечислена в вашу пользу
+ - Помните: Все ваучеры имеют ограниченный срок активации
+
+Успешная активация (например, нам зачислили 100 голосов)
+ +
Внимание: После активации ваучера на вашу страницу, тот же самый ваучер нельзя будет активировать повторно
+ + +
+ + + + +
+
Мобильная версия
+ ++- На данный момент мобильной веб-версии сайта пока нет, но зато есть мобильное приложение для Android
+ - OpenVK Legacy - это мобильное приложение OpenVK для ретро-устройств на Android с дизайном ВКонтакте 3.0.4 из 2013 года
+ - Минимально поддерживаемой версией является Android 2.1 Eclair, то есть аппараты времён начала 2010-ых вполне пригодятся
+
+Скриншоты приложения
+ +
Где это можно скачать?
+ ++- Релизные версии скачиваются через официальный репозиторий F-Droid
+ - Если вы являетесь бета-тестировщиком приложения, то новые версии приложения выкладываются в отдельный канал обновления
+ - Важно: Приложение может иметь различные баги и недочёты, об ошибках сообщайте в официальную группу приложения
+
++ +
+
На этом экскурсия по сайту завершена.
+ + + + +
+
=$text?>
-