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;
- | ![]() | + |
-
-
+
|
- Гота, Schindler/Siemens Be 4/8 № 222 — маршрут 4 Boxberg 26 декабря 2024 г., четверг |
+
- | ![]()
-
-
- |
-
- Санкт-Петербург, ЛВС-86К № 8200 — маршрут 52 Проспект Маршала Жукова -18 ноября 2023 г., суббота |
-
- | ![]()
-
-
-
- |
-
- Санкт-Петербург, 71-931М «Витязь-М» № 7903 — перегонка Улица Куйбышева -18 января 2025 г., суббота |
-
- | ![]()
-
-
-
- |
-
- Санкт-Петербург, 71-134А (ЛМ-99АВ) № 8318 — маршрут 41 -Садовая улица -31 января 2025 г., пятница |
-
- | ![]()
-
-
-
- |
-
- Харьков, T3-ВПСт № 3011 — маршрут 3, СМЕ 3011+3012 Сергіївський майдан 6 марта 2021 г., суббота |
-
- | ![]()
-
-
-
- |
-
- Санкт-Петербург, ЛВС-86К № 5117 — маршрут 19 К/ст "Лахтинский разлив" -10 февраля 2025 г., понедельник |
-
- | ![]()
-
-
- |
-
- Санкт-Петербург, 81-717 (ЛВЗ) № 8451 -Электродепо "Московское" (ТЧ-3) 7 февраля 2025 г., пятница |
-
- | ![]()
-
-
-
- |
-
- Брест, МАЗ-ЭТОН Т103 № 118 — маршрут 102 -Вуліца Гаўрылава | Улица Гаврилова -29 января 2025 г., среда |
-
- | ![]()
-
-
- |
-
- Рига, Tatra T3MR (T6B5-R) № 35098 — 35098+35108 Slokas iela | Улица Слокас -28 октября 2024 г., понедельник |
-