diff --git a/app/Http/Controllers/YearlyOverviewController.php b/app/Http/Controllers/YearlyOverviewController.php index e37f993f6..eb410c3a0 100644 --- a/app/Http/Controllers/YearlyOverviewController.php +++ b/app/Http/Controllers/YearlyOverviewController.php @@ -13,13 +13,16 @@ namespace App\Http\Controllers; +use App\Models\Category; use App\Models\Comment; use App\Models\Group; +use App\Models\History; use App\Models\Post; use App\Models\Thank; use App\Models\Torrent; use App\Models\TorrentRequest; use App\Models\User; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\DB; class YearlyOverviewController extends Controller @@ -47,189 +50,226 @@ class YearlyOverviewController extends Controller public function show(int $year): \Illuminate\Contracts\View\View|\Illuminate\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\Foundation\Application { // Year Validation - $yearValid = checkdate(1, 1, $year) && \strlen((string) $year) <= 4 && date('Y', strtotime(config('other.birthdate'))) <= $year && $year <= date('Y'); + $currentYear = now()->year; + $birthYear = Carbon::parse(config('other.birthdate'))->year; - if (!$yearValid) { - abort(404); - } - - // Site Years - $siteYears = collect(); - - for ($currentYear = (int) date('Y', strtotime('-1 year')); $currentYear >= date('Y', strtotime(config('other.birthdate'))); $currentYear--) { - $siteYears->push($currentYear); - } - - // Top 10 Best Downloaded Movie - $topMovies = Torrent::with(['category']) - ->where('category_id', '=', 1) - ->whereYear('created_at', '=', $year) - ->latest('times_completed') - ->take(10) - ->get(); - - // Bottom 5 Worst Downloaded Movie - $bottomMovies = Torrent::with(['category']) - ->where('category_id', '=', 1) - ->whereYear('created_at', '=', $year) - ->oldest('times_completed') - ->take(5) - ->get(); - - // Top 10 Best Downloaded TV - $topTv = Torrent::with(['category']) - ->where('category_id', '=', 2) - ->whereYear('created_at', '=', $year) - ->latest('times_completed') - ->distinct('tmdb') - ->take(10) - ->get(); - - // Top 10 Best Downloaded TV - $bottomTv = Torrent::with(['category']) - ->where('category_id', '=', 2) - ->whereYear('created_at', '=', $year) - ->oldest('times_completed') - ->distinct('tmdb') - ->take(5) - ->get(); - - // Top 10 Best Downloaded FANRES - $topFanres = Torrent::with(['category']) - ->where('category_id', '=', 3) - ->whereYear('created_at', '=', $year) - ->latest('times_completed') - ->distinct('tmdb') - ->take(10) - ->get(); - - // Top 10 Best Downloaded FANRES - $bottomFanres = Torrent::with(['category']) - ->where('category_id', '=', 3) - ->whereYear('created_at', '=', $year) - ->oldest('times_completed') - ->distinct('tmdb') - ->take(5) - ->get(); - - // Top 10 Uploaders By Content - $uploaders = Torrent::with('user') - ->whereYear('created_at', '=', $year) - ->select(DB::raw('user_id, count(*) as value')) - ->groupBy('user_id') - ->latest('value') - ->take(10) - ->get(); - - // Top 10 Requesters - $requesters = TorrentRequest::with('user') - ->whereYear('created_at', '=', $year) - ->where('user_id', '!=', 1) - ->select(DB::raw('user_id, count(*) as value')) - ->groupBy('user_id') - ->latest('value') - ->take(10) - ->get(); - - // Top 10 Request Fillers - $fillers = TorrentRequest::with('filler') - ->whereYear('created_at', '=', $year) - ->where('filled_by', '!=', 1) - ->select(DB::raw('filled_by, count(*) as value')) - ->groupBy('filled_by') - ->latest('value') - ->take(10) - ->get(); - - // Top 10 Commenters - $commenters = Comment::with('user') - ->whereYear('created_at', '=', $year) - ->where('user_id', '!=', 1) - ->select(DB::raw('user_id, count(*) as value')) - ->groupBy('user_id') - ->latest('value') - ->take(10) - ->get(); - - // Top 10 Thankers - $thankers = Thank::with('user') - ->whereYear('created_at', '=', $year) - ->where('user_id', '!=', 1) - ->select(DB::raw('user_id, count(*) as value')) - ->groupBy('user_id') - ->latest('value') - ->take(10) - ->get(); - - // Top 10 Forum Users By Posts - $forums = Post::with('user') - ->whereYear('created_at', '=', $year) - ->select(DB::raw('user_id, count(*) as value')) - ->groupBy('user_id') - ->latest('value') - ->take(10) - ->get(); - - // New Users - $newUsers = User::whereYear('created_at', '=', $year) - ->count(); - - // Uploads By Category - $movieUploads = Torrent::where('category_id', '=', 1) - ->whereYear('created_at', '=', $year) - ->count(); - - $tvUploads = Torrent::where('category_id', '=', 2) - ->whereYear('created_at', '=', $year) - ->count(); - - $fanresUploads = Torrent::where('category_id', '=', 3) - ->whereYear('created_at', '=', $year) - ->count(); - - $trailerUploads = Torrent::where('category_id', '=', 5) - ->whereYear('created_at', '=', $year) - ->count(); - - // Total Uploads - $totalUploads = Torrent::whereYear('created_at', '=', $year) - ->count(); - - // Total Downloads - $totalDownloads = Torrent::whereYear('created_at', '=', $year) - ->sum('times_completed'); - - // Staff List - $staffers = Group::query() - ->with('users.group') - ->where('is_modo', '=', 1) - ->orWhere('is_admin', '=', 1) - ->get() - ->sortByDesc('position'); + abort_unless($birthYear <= $year && $year < $currentYear, 404); return view('stats.yearly_overviews.show', [ - 'topMovies' => $topMovies, - 'bottomMovies' => $bottomMovies, - 'topTv' => $topTv, - 'bottomTv' => $bottomTv, - 'topFanres' => $topFanres, - 'bottomFanres' => $bottomFanres, - 'uploaders' => $uploaders, - 'forums' => $forums, - 'requesters' => $requesters, - 'fillers' => $fillers, - 'commenters' => $commenters, - 'thankers' => $thankers, - 'newUsers' => $newUsers, - 'movieUploads' => $movieUploads, - 'tvUploads' => $tvUploads, - 'fanresUploads' => $fanresUploads, - 'trailerUploads' => $trailerUploads, - 'totalUploads' => $totalUploads, - 'totalDownloads' => $totalDownloads, - 'staffers' => $staffers, - 'siteYears' => $siteYears, - 'year' => $year, + 'topMovies' => cache()->rememberForever( + 'yearly-overview:'.$year.':top-movies', + fn () => Torrent::with('movie') + ->select([ + 'tmdb', + DB::raw('COUNT(h.id) as download_count'), + DB::raw('MIN(category_id) as category_id'), + ]) + ->leftJoinSub( + History::query() + ->whereNotNull('completed_at') + ->where('history.created_at', '>=', $year.'-01-01 00:00:00') + ->where('history.created_at', '<=', $year.'-12-31 23:59:59'), + 'h', + fn ($join) => $join->on('torrents.id', '=', 'h.torrent_id') + ) + ->where('tmdb', '!=', 0) + ->whereIn('category_id', Category::select('id')->where('movie_meta', '=', true)) + ->groupBy('tmdb') + ->orderByDesc('download_count') + ->take(10) + ->get() + ), + 'bottomMovies' => cache()->rememberForever( + 'yearly-overview:'.$year.':bottom-movies', + fn () => Torrent::with('movie') + ->select([ + 'tmdb', + DB::raw('COUNT(h.id) as download_count'), + DB::raw('MIN(category_id) as category_id'), + ]) + ->leftJoinSub( + History::query() + ->whereNotNull('completed_at') + ->where('history.created_at', '>=', $year.'-01-01 00:00:00') + ->where('history.created_at', '<=', $year.'-12-31 23:59:59'), + 'h', + fn ($join) => $join->on('torrents.id', '=', 'h.torrent_id') + ) + ->where('tmdb', '!=', 0) + ->whereIn('category_id', Category::select('id')->where('movie_meta', '=', true)) + ->groupBy('tmdb') + ->orderBy('download_count') + ->take(5) + ->get() + ), + 'topTv' => cache()->rememberForever( + 'yearly-overview:'.$year.':top-tv', + fn () => Torrent::with('tv') + ->select([ + 'tmdb', + DB::raw('COUNT(h.id) as download_count'), + DB::raw('MIN(category_id) as category_id'), + ]) + ->leftJoinSub( + History::query() + ->whereNotNull('completed_at') + ->where('history.created_at', '>=', $year.'-01-01 00:00:00') + ->where('history.created_at', '<=', $year.'-12-31 23:59:59'), + 'h', + fn ($join) => $join->on('torrents.id', '=', 'h.torrent_id') + ) + ->where('tmdb', '!=', 0) + ->whereIn('category_id', Category::select('id')->where('tv_meta', '=', true)) + ->groupBy('tmdb') + ->orderByDesc('download_count') + ->take(10) + ->get() + ), + 'bottomTv' => cache()->rememberForever( + 'yearly-overview:'.$year.':bottom-tv', + fn () => Torrent::with('tv') + ->select([ + 'tmdb', + DB::raw('COUNT(h.id) as download_count'), + DB::raw('MIN(category_id) as category_id'), + ]) + ->leftJoinSub( + History::query() + ->whereNotNull('completed_at') + ->where('history.created_at', '>=', $year.'-01-01 00:00:00') + ->where('history.created_at', '<=', $year.'-12-31 23:59:59'), + 'h', + fn ($join) => $join->on('torrents.id', '=', 'h.torrent_id') + ) + ->where('tmdb', '!=', 0) + ->whereIn('category_id', Category::select('id')->where('tv_meta', '=', true)) + ->groupBy('tmdb') + ->orderBy('download_count') + ->take(5) + ->get() + ), + 'uploaders' => cache()->rememberForever( + 'yearly-overview:'.$year.':uploaders', + fn () => Torrent::with('user.group') + ->where('created_at', '>=', $year.'-01-01 00:00:00') + ->where('created_at', '<=', $year.'-12-31 23:59:59') + ->where('anon', '=', false) + ->select(DB::raw('user_id, COUNT(*) as value')) + ->groupBy('user_id') + ->orderByRaw('COALESCE(value, 0) DESC') + ->take(10) + ->get() + ), + 'posters' => $posters = cache()->rememberForever( + 'yearly-overview:'.$year.':posts', + fn () => Post::with('user.group') + ->where('created_at', '>=', $year.'-01-01 00:00:00') + ->where('created_at', '<=', $year.'-12-31 23:59:59') + ->select(DB::raw('user_id, COUNT(*) as value')) + ->groupBy('user_id') + ->orderByRaw('COALESCE(value, 0) DESC') + ->take(10) + ->get() + ), + 'requesters' => cache()->rememberForever( + 'yearly-overview:'.$year.':requesters', + fn () => TorrentRequest::with(['user.group']) + ->where('created_at', '>=', $year.'-01-01 00:00:00') + ->where('created_at', '<=', $year.'-12-31 23:59:59') + ->where('user_id', '!=', 1) + ->where('anon', '=', false) + ->select(DB::raw('user_id, COUNT(*) as value')) + ->groupBy('user_id') + ->orderByRaw('COALESCE(value, 0) DESC') + ->take(10) + ->get() + ), + 'fillers' => cache()->rememberForever( + 'yearly-overview:'.$year.':fillers', + fn () => TorrentRequest::with('filler.group') + ->where('filled_when', '>=', $year.'-01-01 00:00:00') + ->where('filled_when', '<=', $year.'-12-31 23:59:59') + ->where('filled_by', '!=', 1) + ->where('filled_anon', '=', false) + ->select(DB::raw('filled_by, COUNT(*) as value')) + ->groupBy('filled_by') + ->orderByRaw('COALESCE(value, 0) DESC') + ->take(10) + ->get() + ), + 'commenters' => cache()->rememberForever( + 'yearly-overview:'.$year.':commenters', + fn () => Comment::with('user.group') + ->where('created_at', '>=', $year.'-01-01 00:00:00') + ->where('created_at', '<=', $year.'-12-31 23:59:59') + ->where('user_id', '!=', 1) + ->where('anon', '=', false) + ->select(DB::raw('user_id, COUNT(*) as value')) + ->groupBy('user_id') + ->orderByRaw('COALESCE(value, 0) DESC') + ->take(10) + ->get() + ), + 'thankers' => cache()->rememberForever( + 'yearly-overview:'.$year.':thankers', + fn () => Thank::with('user.group') + ->where('created_at', '>=', $year.'-01-01 00:00:00') + ->where('created_at', '<=', $year.'-12-31 23:59:59') + ->where('user_id', '!=', 1) + ->select(DB::raw('user_id, COUNT(*) as value')) + ->groupBy('user_id') + ->orderByRaw('COALESCE(value, 0) DESC') + ->take(10) + ->get() + ), + 'newUsers' => cache()->rememberForever( + 'yearly-overview:'.$year.':new-users', + fn () => User::query() + ->where('created_at', '>=', $year.'-01-01 00:00:00') + ->where('created_at', '<=', $year.'-12-31 23:59:59') + ->count() + ), + 'movieUploads' => cache()->rememberForever( + 'yearly-overview:'.$year.':movie-uploads', + fn () => Torrent::query() + ->where('created_at', '>=', $year.'-01-01 00:00:00') + ->where('created_at', '<=', $year.'-12-31 23:59:59') + ->whereIn('category_id', Category::select('id')->where('movie_meta', '=', true)) + ->count() + ), + 'tvUploads' => cache()->rememberForever( + 'yearly-overview:'.$year.':tv-uploads', + fn () => Torrent::query() + ->where('created_at', '>=', $year.'-01-01 00:00:00') + ->where('created_at', '<=', $year.'-12-31 23:59:59') + ->whereIn('category_id', Category::select('id')->where('tv_meta', '=', true)) + ->count() + ), + 'totalUploads' => cache()->rememberForever( + 'yearly-overview:'.$year.':total-uploads', + fn () => Torrent::query() + ->where('created_at', '>=', $year.'-01-01 00:00:00') + ->where('created_at', '<=', $year.'-12-31 23:59:59') + ->count() + ), + 'totalDownloads' => cache()->rememberForever( + 'yearly-overview:'.$year.':total-downloads', + fn () => History::query() + ->where('created_at', '>=', $year.'-01-01 00:00:00') + ->where('created_at', '<=', $year.'-12-31 23:59:59') + ->count() + ), + 'staffers' => cache()->rememberForever( + 'yearly-overview:'.$year.':staffers', + fn () => Group::query() + ->with('users.group') + ->where('is_modo', '=', 1) + ->orWhere('is_admin', '=', 1) + ->orderByDesc('position') + ->get() + ), + 'birthYear' => $birthYear, + 'year' => $year, ]); } } diff --git a/resources/sass/app.scss b/resources/sass/app.scss index bbc3e1ee2..c38a583dd 100755 --- a/resources/sass/app.scss +++ b/resources/sass/app.scss @@ -57,6 +57,7 @@ @import 'components/user-active'; @import 'components/user-card'; @import 'components/user-resurrections'; +@import 'components/user-stat-card'; @import 'components/user-tag'; @import 'components/user-torrents'; @import 'components/user-uploads'; diff --git a/resources/sass/components/_user-stat-card.scss b/resources/sass/components/_user-stat-card.scss new file mode 100644 index 000000000..c525b4ed7 --- /dev/null +++ b/resources/sass/components/_user-stat-card.scss @@ -0,0 +1,38 @@ +.user-stat-card-container { + display: grid; + gap: 12px 24px; + grid-auto-flow: dense; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + align-items: center; +} + +.user-stat-card { + background: var(--user-stat-card-bg); + border: var(--user-stat-card-border); + border-radius: var(--user-stat-card-border-radius); + box-shadow: var(--user-stat-card-box-shadow); + padding: 16px; + display: grid; + gap: 4px 16px; + grid-template-areas: 'avatar username' 'avatar stat'; + grid-template-columns: auto 1fr; +} + +.user-stat-card__username { + grid-area: username; + padding: 0; + margin: 0; +} + +.user-stat-card__stat { + grid-area: stat; + padding: 0; + margin: 0; +} + +.user-stat-card__avatar { + grid-area: avatar; + border-radius: 50%; + width: 60px; + height: 60px; +} \ No newline at end of file diff --git a/resources/sass/pages/_overview.scss b/resources/sass/pages/_overview.scss index 4bcf69ee8..1b98a5ae9 100644 --- a/resources/sass/pages/_overview.scss +++ b/resources/sass/pages/_overview.scss @@ -1,18 +1,61 @@ -.overview__welcome { - text-align: center; +.overview__opening { + display: flex; + flex-direction: column; + align-items: center; } -.overview__welcome h1 { - font-size: 180px; +.overview__opening-heading { + font-size: 90px; margin: 0; } -.overview__welcome h3 { - font-size: 100px; +.overview__opening-subheading { + font-size: 50px; margin: 0; - line-height: 0; } -.overview__welcome span { - line-height: 10; +.overview__closing { + display: flex; + flex-direction: column; + align-items: center; +} + +.overview__closing-heading { + font-size: 90px; + margin: 0; +} + +.overview__closing-subheading { + font-size: 50px; + margin: 0; +} + +.overview__closing-thanks { + display: block; + margin: 80px 0 40px 0; +} + +.overview__poster-grid { + display: flex; + flex-wrap: nowrap; + gap: 24px; + overflow-x: auto; +} + +.overview__poster { + min-width: 150px; + max-width: 150px; +} + +.overview__staff-list { + display: flex; + gap: 24px; + padding: 0; + margin: 0 0 20px 0; +} + +.overview__staff-list-item { + list-style-type: none; + margin: 0; + padding: 0; } \ No newline at end of file diff --git a/resources/sass/themes/cosmic-void.scss b/resources/sass/themes/cosmic-void.scss index b7b6c8940..05b101c8c 100644 --- a/resources/sass/themes/cosmic-void.scss +++ b/resources/sass/themes/cosmic-void.scss @@ -311,6 +311,12 @@ --torrent-tag-bg: transparent; --torrent-tag-hover-fg: #fff; --torrent-tag-hover-bg: rgba(255,255,255,0.1); + + --user-stat-card-bg: #1a1a1a; + --user-stat-card-fg: #ddd; + --user-stat-card-border: none; + --user-stat-card-border-radius: 0; + --user-stat-card-box-shadow: none; } .text-red { diff --git a/resources/sass/themes/galactic.scss b/resources/sass/themes/galactic.scss index 2e7165ef4..232bfe2c3 100644 --- a/resources/sass/themes/galactic.scss +++ b/resources/sass/themes/galactic.scss @@ -340,6 +340,12 @@ --torrent-tag-bg: transparent; --torrent-tag-hover-fg: #fff; --torrent-tag-hover-bg: rgba(255,255,255,0.1); + + --user-stat-card-bg: #1a1a1a; + --user-stat-card-fg: #ddd; + --user-stat-card-border: none; + --user-stat-card-border-radius: 0; + --user-stat-card-box-shadow: none; } .text-bright { diff --git a/resources/sass/themes/light.scss b/resources/sass/themes/light.scss index 32056a192..9e6c963a4 100644 --- a/resources/sass/themes/light.scss +++ b/resources/sass/themes/light.scss @@ -315,4 +315,10 @@ --torrent-tag-bg: transparent; --torrent-tag-hover-fg: #000; --torrent-tag-hover-bg: rgba(255,255,255,0.4); + + --user-stat-card-bg: #989898; + --user-stat-card-fg: #fff; + --user-stat-card-border: none; + --user-stat-card-border-radius: 0; + --user-stat-card-box-shadow: none; } diff --git a/resources/sass/themes/material-design-v3-amoled.scss b/resources/sass/themes/material-design-v3-amoled.scss index 38cf5045b..d836ad108 100644 --- a/resources/sass/themes/material-design-v3-amoled.scss +++ b/resources/sass/themes/material-design-v3-amoled.scss @@ -314,6 +314,12 @@ --torrent-tag-bg: transparent; --torrent-tag-hover-fg: #fff; --torrent-tag-hover-bg: rgba(255,255,255,0.1); + + --user-stat-card-bg: #000; + --user-stat-card-fg: #aaa; + --user-stat-card-border: 1px solid #222; + --user-stat-card-border-radius: 22px; + --user-stat-card-box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12); } .panel__body { diff --git a/resources/sass/themes/material-design-v3-dark.scss b/resources/sass/themes/material-design-v3-dark.scss index 94c3ae576..39773919e 100644 --- a/resources/sass/themes/material-design-v3-dark.scss +++ b/resources/sass/themes/material-design-v3-dark.scss @@ -314,6 +314,12 @@ --torrent-tag-bg: transparent; --torrent-tag-hover-fg: #fff; --torrent-tag-hover-bg: rgba(255,255,255,0.1); + + --user-stat-card-bg: #3b3942; + --user-stat-card-fg: #ddd; + --user-stat-card-border: none; + --user-stat-card-border-radius: 22px; + --user-stat-card-box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12); } .panel__body { diff --git a/resources/sass/themes/material-design-v3-light.scss b/resources/sass/themes/material-design-v3-light.scss index 7e11c2f79..e9c1bd7c9 100644 --- a/resources/sass/themes/material-design-v3-light.scss +++ b/resources/sass/themes/material-design-v3-light.scss @@ -313,6 +313,12 @@ --torrent-tag-bg: transparent; --torrent-tag-hover-fg: #000; --torrent-tag-hover-bg: rgba(255,255,255,0.4); + + --user-stat-card-bg: #f6f6f6; + --user-stat-card-fg: #050505; + --user-stat-card-border: none; + --user-stat-card-border-radius: 22px; + --user-stat-card-box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12); } .panel__body { diff --git a/resources/sass/themes/nord.scss b/resources/sass/themes/nord.scss index 64936fff3..7dfa6e36a 100644 --- a/resources/sass/themes/nord.scss +++ b/resources/sass/themes/nord.scss @@ -335,6 +335,12 @@ --torrent-tag-bg: #eceff4; --torrent-tag-hover-fg: #2e3440; --torrent-tag-hover-bg: #eceff477; + + --user-stat-card-bg: #4C566A; + --user-stat-card-fg: #d8dee9; + --user-stat-card-border: none; + --user-stat-card-border-radius: 10px; + --user-stat-card-box-shadow: none; } /* Links diff --git a/resources/sass/themes/revel.scss b/resources/sass/themes/revel.scss index 45dbb1509..4e888d518 100644 --- a/resources/sass/themes/revel.scss +++ b/resources/sass/themes/revel.scss @@ -340,6 +340,12 @@ --torrent-tag-bg: transparent; --torrent-tag-hover-fg: #fff; --torrent-tag-hover-bg: rgba(255,255,255,0.1); + + --user-stat-card-bg: transparent; + --user-stat-card-fg: #aaa; + --user-stat-card-border: 1px solid #444; + --user-stat-card-border-radius: 0; + --user-stat-card-box-shadow: none; } /* Background */ diff --git a/resources/views/stats/yearly_overviews/show.blade.php b/resources/views/stats/yearly_overviews/show.blade.php index 2fd60598e..5ad94d68a 100644 --- a/resources/views/stats/yearly_overviews/show.blade.php +++ b/resources/views/stats/yearly_overviews/show.blade.php @@ -18,101 +18,268 @@ @endsection +@section('nav-tabs') + @for ($i = $birthYear; $i < now()->year; $i++) +
  • + + {{ $i }} + +
  • + @endfor +@endsection + @section('page', 'page__stats--overview') @section('main')

    Yearly Overview

    -
    -

    Thats A Wrap!

    -

    {{ $year }}

    - +
    +

    That's A Wrap!

    +

    {{ $year }}

    +

    Another strong year here at {{ config('app.name') }}. To every user who made a contribution big or small please accept our sincere thanks. Now, without further ado, here's the best and worst of the year! - -

    -
    - -

    Top 10 Movies (Based on downloads count)

    -
    - -

    5 Worst Movies (Based on downloads count)

    -
    - -

    Top 10 TV Shows (Based on downloads count)

    -
    - -

    5 Worst TV Shows (Based on downloads count)

    -
    - -

    Top 10 Users (Based on number of torrent uploads made)

    -
    - -

    Top 10 Users (Based on number of torrent requests made)

    -
    - -

    Top 10 Users (Based on number of torrent requests filled)

    -
    - -

    Top 10 Users (Based on number of comments made)

    -
    - -

    Top 10 Users (Based on number of posts made)

    -
    - -

    Top 10 Users (Based on number of thanks given)

    -
    - -

    Overall

    -
    -
    -
    -

    {{ $newUsers }}

    -

    New users this year

    -
    -
    -

    {{ $movieUploads }}

    -

    Movies uploaded this year

    -
    -
    -

    {{ $tvUploads }}

    -

    TV Shows uploaded this year

    -
    -
    -

    {{ $fanresUploads }}

    -

    FANRES uploaded this year

    -
    -
    -

    {{ $trailerUploads }}

    -

    Trailers uploaded this year

    -
    -
    -

    {{ $totalUploads }}

    -

    Total torrents uploaded this year

    -
    -
    -

    {{ $totalDownloads }}

    -

    Total torrents downloaded this year

    -
    -
    -
    - -

    Closing Remarks

    -
    -
    -

    Thank You!

    -

    For a wonderful {{ $year }} at {{ config('app.name') }}

    - Special thanks from, - @foreach ($staffers as $group) -

    - @foreach ($group->users as $user) - {{ $user->username }}, - @endforeach -

    - @endforeach +

    +
    +

    Top 10 Movies (Based on downloads count)

    +
    + @foreach ($topMovies as $work) +
    + +
    + {{ $work->download_count }} +
    +
    + @endforeach +
    +
    +
    +

    5 Worst Movies (Based on downloads count)

    +
    + @foreach ($bottomMovies as $work) +
    + +
    + {{ $work->download_count }} +
    +
    + @endforeach +
    +
    +
    +

    Top 10 TV Shows (Based on downloads count)

    +
    + @foreach ($topTv as $work) +
    + +
    + {{ $work->download_count }} +
    +
    + @endforeach +
    +
    +
    +

    5 Worst TV Shows (Based on downloads count)

    +
    + @foreach ($bottomTv as $work) +
    + +
    + {{ $work->download_count }} +
    +
    + @endforeach +
    +
    +
    +

    Top 10 Users (Based on number of torrent uploads made)

    +
    + @foreach ($uploaders as $uploader) +
    +

    + +

    +

    + {{ $uploader->value }} {{ __('user.uploads') }} +

    + avatar +
    + @endforeach +
    +
    +
    +

    Top 10 Users (Based on number of torrent requests made)

    +
    + @foreach ($requesters as $requester) +
    +

    + +

    +

    + {{ $requester->value }} {{ __('request.requests') }} +

    + avatar +
    + @endforeach +
    +
    +
    +

    Top 10 Users (Based on number of torrent requests filled)

    +
    + @foreach ($fillers as $filler) +
    +

    + +

    +

    + {{ $filler->value }} {{ __('notification.request-fills') }} +

    + avatar +
    + @endforeach +
    +
    +
    +

    Top 10 Users (Based on number of comments made)

    +
    + @foreach ($commenters as $commenter) +
    +

    + +

    +

    + {{ $commenter->value }} {{ __('user.comments') }} +

    + avatar +
    + @endforeach +
    +
    +
    +

    Top 10 Users (Based on number of posts made)

    +
    + @foreach ($posters as $poster) +
    +

    + +

    +

    + {{ $poster->value }} {{ __('common.posts') }} +

    + avatar +
    + @endforeach +
    +
    +
    +

    Top 10 Users (Based on number of thanks given)

    +
    + @foreach ($thankers as $thanker) +
    +

    + +

    +

    + {{ $thanker->value }} {{ __('torrent.thanks') }} +

    + avatar +
    + @endforeach +
    +
    +
    +

    Overall

    +
    +
    New users this year
    +
    {{ $newUsers }}
    +
    Movies uploaded this year
    +
    {{ $movieUploads }}
    +
    TV Shows uploaded this year
    +
    {{ $tvUploads }}
    +
    Total torrents uploaded this year
    +
    {{ $totalUploads }}
    +
    Total torrents downloaded this year
    +
    {{ $totalDownloads }}
    +
    +
    +
    +

    Closing Remarks

    +
    +

    Thank You!

    +

    + For a wonderful {{ $year }} at {{ config('app.name') }} +

    + Special thanks from, + @foreach ($staffers as $group) + + @endforeach +
    +
    @endsection