diff --git a/app/Controllers/Api/Contests/GetInfo.php b/app/Controllers/Api/Contests/GetInfo.php new file mode 100644 index 0000000..91ce43c --- /dev/null +++ b/app/Controllers/Api/Contests/GetInfo.php @@ -0,0 +1,59 @@ +fetchContest(); + $this->setStatuses(); + $this->outputJson(); + } + + private function fetchContest(): void + { + $statuses = [0, 1, 2]; + foreach ($statuses as $status) { + $contest = DB::query('SELECT * FROM contests WHERE status = :status', [':status' => $status]); + if (!empty($contest)) { + $this->contest = $contest[0]; + break; + } + } + } + + private function setStatuses(): void + { + $time = time(); + $status = $this->contest['status'] ?? null; + + if ($status === 0) { + $this->pretendsStatus = ($this->contest['openpretendsdate'] > $time) ? 'waiting' : 'waitingforserver'; + $this->publicStatus = 'closed'; + } elseif ($status === 1) { + $this->pretendsStatus = ($this->contest['closepretendsdate'] > $time) ? 'opened' : 'waitingforserver'; + $this->publicStatus = 'closed'; + } elseif ($status === 2) { + $this->pretendsStatus = 'closed'; + $this->publicStatus = ($this->contest['closedate'] <= $time) ? 'waitingforserver' : 'opened'; + } + } + + private function outputJson(): void + { + echo json_encode(array( + 'contest' => $this->contest, + 'statuses' => [ + 'pretends' => $this->pretendsStatus, + 'public' => $this->publicStatus, + ] + )); + } +} \ No newline at end of file diff --git a/app/Controllers/Api/Images/Contests/Rate.php b/app/Controllers/Api/Images/Contests/Rate.php new file mode 100644 index 0000000..d727a7b --- /dev/null +++ b/app/Controllers/Api/Images/Contests/Rate.php @@ -0,0 +1,46 @@ + Auth::userid(), ':cid' => $_GET['kid']))[0]['COUNT(*)']; + $countvotes = $count - $uservotes; + $contest = DB::query('SELECT * FROM contests WHERE id=:id', array(":id" => $_GET['kid']))[0]; + $photo = new Photo($_GET['pid']); + if ($contest['status'] != 2) { + exit; + } + if ($photo->i('on_contest') != 1 && $photo->i('contest_id') != $_GET['kid']) { + exit; + } + if ((int)DB::query('SELECT photo_id FROM contests_rates WHERE photo_id=:pid AND user_id=:uid AND contest_id=:cid', array(':uid' => Auth::userid(), ':pid' => $_GET['pid'], ':cid' => $_GET['kid']))[0]['photo_id'] === (int)$_GET['pid']) { + DB::query('DELETE FROM contests_rates WHERE user_id=:uid AND photo_id=:pid AND contest_id=:cid', array(':pid' => $_GET['pid'], ':uid' => Auth::userid(), ':cid' => $_GET['kid'])); + $status = 0; + $newval = $countvotes + 1; + } else { + $newval = $countvotes - 1; + if ($newval >= 0) { + DB::query('INSERT INTO contests_rates VALUES (\'0\', :pid, :uid, :cid)', array(':pid' => $_GET['pid'], ':uid' => Auth::userid(), ':cid' => $_GET['kid'])); + $status = 1; + } + } + if ($newval < 0) { + $text = 'Вы можете выбрать максимум 3 фотографии.'; + } else if ($newval === 0) { + $text = 'Вы выбрали 3 фотографии. Спасибо за голосование!'; + } else { + $text = "Вы можете выбрать ещё {$newval} фото."; + } + echo '[{"' . $_GET['pid'] . '":'.$status.'},"' . $text . '"]'; + } +} diff --git a/app/Controllers/Api/Images/RateContest.php b/app/Controllers/Api/Images/RateContest.php deleted file mode 100644 index e69de29..0000000 diff --git a/app/Controllers/ApiController.php b/app/Controllers/ApiController.php index 85ec7cf..fa137d9 100644 --- a/app/Controllers/ApiController.php +++ b/app/Controllers/ApiController.php @@ -8,7 +8,6 @@ use \App\Controllers\Api\{Login, Register}; use \App\Controllers\Api\Subscribe as SubscribeUser; use \App\Controllers\Api\Images\{Upload}; use \App\Controllers\Api\Images\Rate as PhotoVote; -use \App\Controllers\Api\Images\RateContest as PhotoVoteContest; use \App\Controllers\Api\Images\Compress as PhotoCompress; use \App\Controllers\Api\Images\CheckAll as PhotoCheckAll; use \App\Controllers\Api\Images\LoadRecent as PhotoLoadRecent; @@ -21,6 +20,8 @@ use \App\Controllers\Api\Images\Comments\Pin as PhotoCommentPin; use \App\Controllers\Api\Images\Comments\Load as PhotoCommentLoad; use \App\Controllers\Api\Images\Comments\Rate as PhotoCommentVote; use \App\Controllers\Api\Images\Contests\SendPretend as PhotoContestsSendPretend; +use \App\Controllers\Api\Images\Contests\Rate as PhotoContestsRate; +use \App\Controllers\Api\Contests\GetInfo as ContestsGetInfo; use \App\Controllers\Api\GeoDB\Search as GeoDBSearch; use \App\Controllers\Api\Vehicles\Load as VehiclesLoad; use \App\Controllers\Api\Profile\Update as ProfileUpdate; @@ -57,7 +58,7 @@ class ApiController return new PhotoVote(); } public static function photovotecontest() { - return new PhotoVoteContest(); + return new PhotoContestsRate(); } public static function photofavorite() { return new PhotoFavorite(); @@ -140,6 +141,9 @@ class ApiController public static function vehiclesload() { return new VehiclesLoad(); } + public static function contestsgetinfo() { + return new ContestsGetInfo(); + } } \ No newline at end of file diff --git a/app/Controllers/Exec/Tasks/ExecContests.php b/app/Controllers/Exec/Tasks/ExecContests.php index 6fc85d8..fb6a498 100644 --- a/app/Controllers/Exec/Tasks/ExecContests.php +++ b/app/Controllers/Exec/Tasks/ExecContests.php @@ -36,6 +36,9 @@ class ExecContests case 2: self::handleClosingContest($contest); break; + case 02: + self::handleClosePretendsByTime($contest); + break; } } @@ -56,20 +59,38 @@ class ExecContests private static function handleClosePretends(array $contest) { - if (self::isAnotherContestInStatus(2)) { + if (self::isAnotherContestInStatus(2) || self::isAnotherContestInStatus(02)) { echo "[{$contest['id']}] Waiting for another contest to end. Skip...\n"; return; } - if ($contest['closepretendsdate'] <= time() && $contest['opendate'] <= time()) { + if ($contest['closepretendsdate'] <= time()) { DB::query('UPDATE photos SET on_contest=2 WHERE on_contest=1 AND contest_id=:id', array(':id'=>$contest['id'])); - DB::query('UPDATE contests SET status = 2 WHERE id = :id', [':id' => $contest['id']]); + if ($contest['opendate'] <= time()) { + DB::query('UPDATE contests SET status = 2 WHERE id = :id', [':id' => $contest['id']]); + echo "[{$contest['id']}] Opened.\n"; + } else { + DB::query('UPDATE contests SET status = 02 WHERE id = :id', [':id' => $contest['id']]); + } echo "[{$contest['id']}] Closed for pretends.\n"; } else { echo "[{$contest['id']}] Not closed for pretends. Skip...\n"; } } + private static function handleClosePretendsByTime(array $contest) + { + echo "[{$contest['id']}] Cheking for Open by time...\n"; + if ($contest['opendate'] <= time()) { + DB::query('UPDATE contests SET status = 2 WHERE id = :id', [':id' => $contest['id']]); + echo "[{$contest['id']}] .\n"; + } else { + echo "[{$contest['id']}] not opened by time. Skip...\n"; + } + echo "[{$contest['id']}] Opened.\n"; + + } + private static function handleClosingContest(array $contest) { if ($contest['closedate'] > time()) { @@ -80,25 +101,32 @@ class ExecContests echo "[{$contest['id']}] Ready for closing!\n"; self::processVotes($contest); DB::query('UPDATE contests SET status = 3 WHERE id = :id', [':id' => $contest['id']]); + DB::query('UPDATE photos SET contest_id = 0, on_contest = 0 WHERE contest_id = :id', [':id' => $contest['id']]); echo "[{$contest['id']}] Closed.\n"; if (NGALLERY['root']['contests']['autonew']['enabled'] === true) { echo "Creating new contest..."; $theme = DB::query('SELECT * FROM contests_themes WHERE status=1 ORDER BY RAND() LIMIT 1')[0]; + if (count($theme) <= 0) { + echo "Not found themes for autocreating Contest. Skip...\n"; + return; + } $time = time(); - if (NGALLERY['root']['contests']['autonew']['pretendsopen'] === 'now') { + if (NGALLERY['root']['contests']['autonew']['times']['pretendsopen'] === 'now') { $pretendsopen = $time; + $status = 1; } else { - $pretendsopen = Date::addTime(NGALLERY['root']['contests']['autonew']['pretendsopen']); + $status = 0; + $pretendsopen = Date::addTime(NGALLERY['root']['contests']['autonew']['times']['pretendsopen']); } - $pretendsclose = Date::addTime(NGALLERY['root']['contests']['autonew']['pretendsclose']); - if (NGALLERY['root']['contests']['autonew']['open'] === 'now') { + $pretendsclose = Date::addTime(NGALLERY['root']['contests']['autonew']['times']['pretendsclose']); + if (NGALLERY['root']['contests']['autonew']['times']['open'] === 'now') { $contestopen = $pretendsclose; } else { - $contestopen = Date::addTime(NGALLERY['root']['contests']['autonew']['open']); + $contestopen = Date::addTime(NGALLERY['root']['contests']['autonew']['times']['open']); } - $contestclose = Date::addTime(NGALLERY['root']['contests']['autonew']['close']); - DB::query('INSERT INTO contests VALUES (\'0\', :themeid, :openprdate, :closeprdate, :opendate, :closedate, 0)', array(':themeid'=>$theme['id'], ':openprdate'=>$pretendsopen, ':closeprdate'=>$pretendsclose, ':opendate'=>$contestopen, ':closedate'=>$contestclose)); + $contestclose = Date::addTime(NGALLERY['root']['contests']['autonew']['times']['close']); + DB::query('INSERT INTO contests VALUES (\'0\', :themeid, :openprdate, :closeprdate, :opendate, :closedate, :status)', array(':themeid'=>$theme['id'], ':openprdate'=>$pretendsopen, ':closeprdate'=>$pretendsclose, ':opendate'=>$contestopen, ':closedate'=>$contestclose, ':status'=>$status)); echo "Contest created! Continue..."; } } @@ -107,7 +135,7 @@ class ExecContests { $votes = DB::query( 'SELECT user_id, photo_id, COUNT(*) AS vote_count - FROM photos_rates_contest WHERE contest_id = :id + FROM contests_rates WHERE contest_id = :id GROUP BY user_id ORDER BY vote_count DESC LIMIT 3', [':id' => $contest['id']] ); @@ -123,20 +151,25 @@ class ExecContests { $photo = DB::query('SELECT * FROM photos WHERE id = :id', [':id' => $vote['photo_id']])[0]; $photoData = json_decode($photo['content'], true); - + + if (!isset($photoData['contests']) || !is_array($photoData['contests'])) { + $photoData['contests'] = []; + } + $theme = DB::query('SELECT title FROM contests_themes WHERE id = :id', [':id' => $contest['themeid']])[0]['title']; - - $photoData['contests'] = [ + + $photoData['contests'][] = [ 'id' => $contest['id'], 'contesttheme' => $theme, 'votenum' => $vote['vote_count'], 'place' => $place ]; - + DB::query('UPDATE photos SET content = :content, on_contest=0, contest_id=0 WHERE id = :id', [ ':id' => $vote['photo_id'], - ':content' => json_encode($photoData) + ':content' => json_encode($photoData, JSON_UNESCAPED_UNICODE) ]); + } private static function isAnotherContestInStatus(int $status): bool diff --git a/app/Core/Routes.php b/app/Core/Routes.php index d0c3b68..7afc185 100644 --- a/app/Core/Routes.php +++ b/app/Core/Routes.php @@ -69,7 +69,9 @@ class Routes Router::post('/api/photo/comment/$id/edit', 'ApiController@photocommentedit'); Router::post('/api/photo/comment/$id/delete', 'ApiController@photocommentdelete'); Router::post('/api/photo/comment/$id/pin', 'ApiController@photocommentpin'); - Router::post('/api/photo/contests/sendpretend', 'ApiController@sendpretendphoto()'); + Router::post('/api/photo/contests/sendpretend', 'ApiController@sendpretendphoto'); + Router::get('/api/photo/contests/rate', 'ApiController@photovotecontest'); + Router::get('/api/contests/getinfo', 'ApiController@contestsgetinfo'); Router::get('/api/vehicles/load', 'ApiController@vehiclesload'); Router::get('/api/geodb/search', 'ApiController@geodbsearch'); if ($user->i('admin') > 0) { diff --git a/static/img/star_people.png b/static/img/star_people.png new file mode 100644 index 0000000..a6fa392 Binary files /dev/null and b/static/img/star_people.png differ diff --git a/static/img/vs1.png b/static/img/vs1.png new file mode 100644 index 0000000..92aceac Binary files /dev/null and b/static/img/vs1.png differ diff --git a/static/img/vs2.png b/static/img/vs2.png new file mode 100644 index 0000000..7e0388f Binary files /dev/null and b/static/img/vs2.png differ diff --git a/static/img/vs3.png b/static/img/vs3.png new file mode 100644 index 0000000..5218054 Binary files /dev/null and b/static/img/vs3.png differ diff --git a/views/pages/Admin/Contests.php b/views/pages/Admin/Contests.php index f24a6ad..2476a67 100644 --- a/views/pages/Admin/Contests.php +++ b/views/pages/Admin/Contests.php @@ -60,6 +60,8 @@ if (!$task->isTaskExists("ExecContests", "php ".$_SERVER['DOCUMENT_ROOT'].$task- $status = 'Ещё не проведён'; } else if ($t['status'] === 1) { $status = 'Отбор кандидатов'; + } else if ($t['status'] === 02) { + $status = 'Ещё не открыт для отбора победителей'; } else if ($t['status'] === 2) { $status = 'Отбор победителей'; } else if ($t['status'] === 3) { diff --git a/views/pages/Contests/VotingIndex.php b/views/pages/Contests/VotingIndex.php index 146a2d8..60dda92 100644 --- a/views/pages/Contests/VotingIndex.php +++ b/views/pages/Contests/VotingIndex.php @@ -1,7 +1,7 @@ @@ -20,7 +20,7 @@ use \App\Models\User;

Следующий Фотоконкурс будет через:

'; } else { ?>
$contest['id'])); foreach ($photos_contest as $pc) { - echo ' + $class = ''; + if ((int)DB::query('SELECT photo_id FROM contests_rates WHERE photo_id=:pid AND user_id=:uid AND contest_id=:cid', array(':uid' => Auth::userid(), ':pid' => $pc['id'], ':cid' => $contest['id']))[0]['photo_id'] === (int)$pc['id']) { + $class = ' voted'; + } + echo '
- - + +

'.htmlspecialchars($pc['postbody']).'

+

'.htmlspecialchars($pc['place']).'

+

'.Date::zmdate($pc['posted_at']).'
Автор: '.$user->i('username').'

+
630 КБ + 630 КБ
-
2
-
182
+
'.DB::query('SELECT COUNT(*) FROM photos_views WHERE photo_id=:id', array(':id'=>$p['id']))[0]['COUNT(*)'].'
-

Гота,  Schindler/Siemens Be 4/8  222  —  маршрут 4
ГотаРазные фотографии

-

Boxberg / Leina

Настоящий немецкий Сайлент Хилл!
-
- Echtes deutsches Silent Hill!

-

26 декабря 2024 г., четверг
Автор: KIA-Trainz

-
'; } ?> - -
- - - - - - -
526 КБ -
-
246
-
-
-

Санкт-Петербург,  ЛВС-86К  8200   —  маршрут 52
Санкт-ПетербургТрамвайные линии и инфраструктура

-

Проспект Маршала Жукова

-

18 ноября 2023 г., суббота
Автор: Матвей Батуро

-
-
- -
- - - - - - -
797 КБ -
-
5
-
251
-
-
-

Санкт-Петербург,  71-931М «Витязь-М»  7903  —  перегонка
Санкт-Петербург,  ПР (18М)  С-7116  —  перегонка

-

Улица Куйбышева

-

18 января 2025 г., суббота
Автор: bo1ng10

-
-
- -
- - - - - - -
656 КБ -
-
5
-
328
-
-
-

Санкт-Петербург,  71-134А (ЛМ-99АВ)  8318   —  маршрут 41

-

Садовая улица

-

31 января 2025 г., пятница
Автор: Yastrebov Nikolay

-
-
- -
- - - - - - -
481 КБ -
-
1
-
582
-
-
-

Харьков,  T3-ВПСт  3011  —  маршрут 3, СМЕ 3011+3012
Харьков,  T3-ВПСт  3012  —  маршрут 3, СМЕ 3011+3012
ХарьковТрамвайные линии

-

Сергіївський майдан / Павлівська площа | Сергиевская площадь / Павловская площадь

-

6 марта 2021 г., суббота
Автор: Moon_Expedition

-
-
- -
- - - - - - -
555 КБ -
-
16
-
1286
-
-
-

Санкт-Петербург,  ЛВС-86К  5117  —  маршрут 19
Санкт-Петербург,  71-638-02 «Поларис»  5810

-

К/ст "Лахтинский разлив"

-

10 февраля 2025 г., понедельник
Автор: Qwerty_qwertovich

-
-
- -
- - - - - - -
674 КБ -
-
224
-
-
-

Санкт-Петербург,  81-717 (ЛВЗ)  8451 

-

Электродепо "Московское" (ТЧ-3)

Маневровые передвижения

-

7 февраля 2025 г., пятница
Автор: frunzenecc

-
-
- -
- - - - - - -
675 КБ -
-
3
-
322
-
-
-

Брест,  МАЗ-ЭТОН Т103  118  —  маршрут 102

-

Вуліца Гаўрылава | Улица Гаврилова

-

29 января 2025 г., среда
Автор: Ivan Tkachenko

-
-
- -
- - - - - - -
486 КБ -
-
204
-
-
-

Рига,  Tatra T3MR (T6B5-R)  35098  —  35098+35108
РигаМосты

-

Slokas iela | Улица Слокас

-

28 октября 2024 г., понедельник
Автор: Tučňák

-
-
+
Число проголосовавших: 3
Число голосов: 6

diff --git a/views/pages/Contests/VotingWaiting.php b/views/pages/Contests/VotingWaiting.php index f6ee24f..156c7e0 100644 --- a/views/pages/Contests/VotingWaiting.php +++ b/views/pages/Contests/VotingWaiting.php @@ -31,7 +31,13 @@ use \App\Models\{User, VoteContest}; $contest['id'])); foreach ($photos_contest as $pc) { $user = new User($pc['user_id']); echo '
@@ -44,7 +50,7 @@ use \App\Models\{User, VoteContest}; - '.VoteContest::count($pc['id'], $contest['id']).' + '.VoteContest::count($pc['id'], $contest['id']).' diff --git a/views/pages/Main.php b/views/pages/Main.php index 5dd97ee..6b526fc 100644 --- a/views/pages/Main.php +++ b/views/pages/Main.php @@ -134,20 +134,62 @@ LIMIT 10;'); $contest = DB::query('SELECT * FROM contests WHERE status=2')[0]; $theme = DB::query('SELECT * FROM contests_themes WHERE id=:id', array(':id' => $contest['themeid']))[0]; echo '

Фотоконкурс!

- Закончится через:
+ Закончится через:
Тематика: ' . $theme['title'] . '
Голосуйте за лучшие фотографии, которые должны стать победителями сегодняшнего конкурса!

- Голосовать! + '; } else if (DB::query('SELECT status FROM contests WHERE status=1')[0]['status'] === 1) { $contest = DB::query('SELECT * FROM contests WHERE status=1')[0]; $theme = DB::query('SELECT * FROM contests_themes WHERE id=:id', array(':id' => $contest['themeid']))[0]; echo '

Фотоконкурс!

- Начнётся через:
+ Начнётся через:
Тематика: ' . $theme['title'] . '
- Лучшие фотографии по мнению сообщества ' . NGALLERY['root']['title'] . ' будут отмечены

- Участвовать! Голосовать за претендентов - '; + Лучшие фотографии по мнению сообщества ' . NGALLERY['root']['title'] . ' будут отмечены

+ + '; } diff --git a/views/pages/Photo.php b/views/pages/Photo.php index 8fb8b1f..0017562 100644 --- a/views/pages/Photo.php +++ b/views/pages/Photo.php @@ -125,6 +125,25 @@ if ($photo->i('id') !== null) { i('on_contest') === 2) { ?> +  Фотография участвует в голосовании + + content('contests') as $c) { + if ($c['place'] === 1) { + $img = '3'; + } + if ($c['place'] === 2) { + $img = '2'; + } + if ($c['place'] === 3) { + $img = '1'; + } + echo '  '.$c['place'].'-е место на фотоконкурсе'; + } + + if ($photo->i('priority') === 1) { ?>
Условная публикация
i('priority') === 2) { ?> @@ -259,14 +278,14 @@ if ($photo->i('id') !== null) { echo 'voted'; } ?>">Мне не нравится content('video') === null && $photo->i('user_id') != Auth::userid()) { ?> + if (($photo->content('video') === null && $photo->i('user_id') != Auth::userid()) || $photo->i('on_contest') != 2) { ?> Красиво, на конкурс! Неконкурсное фото - i('user_id') === Auth::userid()) { ?> + i('user_id') === Auth::userid() && $photo->i('on_contest') != 2) { ?> Выставить на конкурсНе участвовать в конкурсе