diff --git a/.gitignore b/.gitignore
index d38ba36..5711796 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,5 @@ yarn-error.log
/.vscode
_ide_helper.php
.phpstorm.meta.php
+
+_ide_helper_models.php
diff --git a/app/Http/Controllers/ChampionController.php b/app/Http/Controllers/ChampionController.php
index b0f582f..cdc833f 100644
--- a/app/Http/Controllers/ChampionController.php
+++ b/app/Http/Controllers/ChampionController.php
@@ -2,8 +2,6 @@
namespace App\Http\Controllers;
-use App\Http\Requests\StoreChampionRequest;
-use App\Http\Requests\UpdateChampionRequest;
use App\Models\Champion;
use App\Models\ChampionRoles;
use Illuminate\Support\Facades\Cache;
@@ -24,22 +22,6 @@ class ChampionController extends Controller
return view('champions.index', ['champions' => $champions, 'roles' => $roles]);
}
- /**
- * Show the form for creating a new resource.
- */
- public function create()
- {
- //
- }
-
- /**
- * Store a newly created resource in storage.
- */
- public function store(StoreChampionRequest $request)
- {
- //
- }
-
/**
* Display the specified resource.
*/
@@ -48,7 +30,9 @@ class ChampionController extends Controller
$threeDaysInSeconds = 60 * 60 * 24 * 3;
$sixMonthsInSeconds = 60 * 60 * 24 * 30 * 6;
- $champion = Cache::remember('championShowCache'.$champion->slug, $threeDaysInSeconds, static fn () => $champion->load('skins', 'lanes'));
+ $champion = Cache::remember('championShowCache'.$champion->slug, $threeDaysInSeconds, static fn () => $champion->load('streamers', 'skins', 'lanes'));
+
+ $streamers = $champion->load('streamers')->streamers;
$splashColor = Cache::remember(
'championSplashColorCache'.$champion->slug,
@@ -58,30 +42,6 @@ class ChampionController extends Controller
$champion->splash_color = $splashColor;
- return view('champions.show', ['champion' => $champion]);
- }
-
- /**
- * Show the form for editing the specified resource.
- */
- public function edit(Champion $champion)
- {
- //
- }
-
- /**
- * Update the specified resource in storage.
- */
- public function update(UpdateChampionRequest $request, Champion $champion)
- {
- //
- }
-
- /**
- * Remove the specified resource from storage.
- */
- public function destroy(Champion $champion)
- {
- //
+ return view('champions.show', ['champion' => $champion, 'streamers' => $streamers]);
}
}
diff --git a/app/Http/Controllers/StreamerController.php b/app/Http/Controllers/StreamerController.php
new file mode 100644
index 0000000..20f37dc
--- /dev/null
+++ b/app/Http/Controllers/StreamerController.php
@@ -0,0 +1,36 @@
+ Streamer::orderBy('champion_id')->get());
+
+ return response()->json($streamers);
+ }
+}
diff --git a/app/Http/Controllers/StreamerPanelController.php b/app/Http/Controllers/StreamerPanelController.php
new file mode 100644
index 0000000..1d64fa8
--- /dev/null
+++ b/app/Http/Controllers/StreamerPanelController.php
@@ -0,0 +1,91 @@
+ Streamer::with('champion')->get(),
+ ]);
+ }
+
+ /**
+ * Show the form for creating a new resource.
+ */
+ public function create()
+ {
+ return view('streamerpanel.streamer-create', [
+ 'champions' => Champion::all(),
+ ]);
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ */
+ public function store(Request $request)
+ {
+ $request->validate(['champion_id' => 'required|exists:champions,champion_id',
+ 'platform' => 'required|in:twitch,youtube,kick,douyu,huya',
+ 'username' => 'required|string',
+ 'displayname' => 'required|string',
+ ]);
+
+ Streamer::create($request->all());
+
+ Cache::forget('streamersListAllAPICache');
+
+ return redirect()->route('streamerpanel.index');
+ }
+
+ /**
+ * Show the form for editing the specified resource.
+ */
+ public function edit(Streamer $streamer)
+ {
+ return view('streamerpanel.streamer-edit', [
+ 'streamer' => $streamer,
+ 'champions' => Champion::all(),
+ ]);
+ }
+
+ /**
+ * Update the specified resource in storage.
+ */
+ public function update(Request $request, Streamer $streamer)
+ {
+ $request->validate([
+ 'champion_id' => 'required|exists:champions,id',
+ 'platform' => 'required|in:twitch,youtube,kick,douyu,huya',
+ 'username' => 'required|string',
+ 'displayname' => 'required|string',
+ ]);
+
+ $streamer->update($request->all());
+
+ Cache::forget('streamersListAllAPICache');
+
+ return redirect()->route('streamerpanel.index');
+ }
+
+ /**
+ * Remove the specified resource from storage.
+ */
+ public function destroy(Streamer $streamer)
+ {
+ $streamer->delete();
+
+ Cache::forget('streamersListAllAPICache');
+
+ return redirect()->route('streamerpanel.index');
+ }
+}
diff --git a/app/Models/Champion.php b/app/Models/Champion.php
index 3e9e49b..73576e5 100644
--- a/app/Models/Champion.php
+++ b/app/Models/Champion.php
@@ -94,6 +94,11 @@ class Champion extends Model
return $this->hasOne(ChampionRoles::class, 'champion_id', 'champion_id');
}
+ public function streamers()
+ {
+ return $this->hasMany(Streamer::class, 'champion_id', 'champion_id');
+ }
+
public function getChampionImageAttribute($centered = true): string
{
$url = 'https://cdn.communitydragon.org/latest/champion/'.$this->champion_id.'/splash-art';
diff --git a/app/Models/Streamer.php b/app/Models/Streamer.php
new file mode 100644
index 0000000..5ad7b52
--- /dev/null
+++ b/app/Models/Streamer.php
@@ -0,0 +1,43 @@
+ 'Twitch',
+ 'youtube' => 'YouTube',
+ 'kick' => 'Kick',
+ 'douyu' => 'Douyu',
+ 'huya' => 'Huya',
+ ];
+
+ return $platforms[$value];
+ }
+
+ public function getStreamerUrlAttribute(): string
+ {
+ return match ($this->platform) {
+ 'Twitch' => "https://www.twitch.tv/{$this->username}",
+ 'YouTube' => "https://www.youtube.com/@{$this->username}",
+ 'Kick' => "https://kick.com/{$this->username}",
+ 'Douyu' => "https://www.douyu.com/{$this->username}",
+ 'Huya' => "https://www.huya.com/{$this->username}",
+ };
+ }
+
+ public function champion(): BelongsTo
+ {
+ return $this->belongsTo(Champion::class, 'champion_id', 'champion_id');
+ }
+}
diff --git a/app/View/Components/Streamerpanel/StreamerCreateForm.php b/app/View/Components/Streamerpanel/StreamerCreateForm.php
new file mode 100644
index 0000000..8a15adb
--- /dev/null
+++ b/app/View/Components/Streamerpanel/StreamerCreateForm.php
@@ -0,0 +1,26 @@
+streamers = $streamers;
+ }
+
+ /**
+ * Get the view / contents that represent the component.
+ */
+ public function render(): View
+ {
+ return view('components.streamerpanel.streamers-table');
+ }
+}
diff --git a/composer.lock b/composer.lock
index 8e546b8..3be4300 100644
--- a/composer.lock
+++ b/composer.lock
@@ -118,16 +118,16 @@
},
{
"name": "aws/aws-sdk-php",
- "version": "3.301.1",
+ "version": "3.301.4",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "0a910d2b35e7087337cdf3569dc9b6ce232aafba"
+ "reference": "1d04b11a621eaceb389d2cfbd82bcdc423903796"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0a910d2b35e7087337cdf3569dc9b6ce232aafba",
- "reference": "0a910d2b35e7087337cdf3569dc9b6ce232aafba",
+ "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/1d04b11a621eaceb389d2cfbd82bcdc423903796",
+ "reference": "1d04b11a621eaceb389d2cfbd82bcdc423903796",
"shasum": ""
},
"require": {
@@ -207,9 +207,9 @@
"support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues",
- "source": "https://github.com/aws/aws-sdk-php/tree/3.301.1"
+ "source": "https://github.com/aws/aws-sdk-php/tree/3.301.4"
},
- "time": "2024-03-15T18:14:42+00:00"
+ "time": "2024-03-20T18:16:55+00:00"
},
{
"name": "blade-ui-kit/blade-icons",
@@ -5036,16 +5036,16 @@
},
{
"name": "spatie/laravel-package-tools",
- "version": "1.16.3",
+ "version": "1.16.4",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-package-tools.git",
- "reference": "59db18c2e20d49a0b6d447bb1c654f6c123beb9e"
+ "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/59db18c2e20d49a0b6d447bb1c654f6c123beb9e",
- "reference": "59db18c2e20d49a0b6d447bb1c654f6c123beb9e",
+ "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53",
+ "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53",
"shasum": ""
},
"require": {
@@ -5084,7 +5084,7 @@
],
"support": {
"issues": "https://github.com/spatie/laravel-package-tools/issues",
- "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.3"
+ "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.4"
},
"funding": [
{
@@ -5092,7 +5092,7 @@
"type": "github"
}
],
- "time": "2024-03-07T07:35:57+00:00"
+ "time": "2024-03-20T07:29:11+00:00"
},
{
"name": "spatie/laravel-query-builder",
@@ -8726,16 +8726,16 @@
},
{
"name": "composer/pcre",
- "version": "3.1.2",
+ "version": "3.1.3",
"source": {
"type": "git",
"url": "https://github.com/composer/pcre.git",
- "reference": "4775f35b2d70865807c89d32c8e7385b86eb0ace"
+ "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/pcre/zipball/4775f35b2d70865807c89d32c8e7385b86eb0ace",
- "reference": "4775f35b2d70865807c89d32c8e7385b86eb0ace",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8",
+ "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8",
"shasum": ""
},
"require": {
@@ -8777,7 +8777,7 @@
],
"support": {
"issues": "https://github.com/composer/pcre/issues",
- "source": "https://github.com/composer/pcre/tree/3.1.2"
+ "source": "https://github.com/composer/pcre/tree/3.1.3"
},
"funding": [
{
@@ -8793,7 +8793,7 @@
"type": "tidelift"
}
],
- "time": "2024-03-07T15:38:35+00:00"
+ "time": "2024-03-19T10:26:25+00:00"
},
{
"name": "doctrine/deprecations",
@@ -9223,16 +9223,16 @@
},
{
"name": "mockery/mockery",
- "version": "1.6.9",
+ "version": "1.6.10",
"source": {
"type": "git",
"url": "https://github.com/mockery/mockery.git",
- "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06"
+ "reference": "47065d1be1fa05def58dc14c03cf831d3884ef0b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mockery/mockery/zipball/0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06",
- "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06",
+ "url": "https://api.github.com/repos/mockery/mockery/zipball/47065d1be1fa05def58dc14c03cf831d3884ef0b",
+ "reference": "47065d1be1fa05def58dc14c03cf831d3884ef0b",
"shasum": ""
},
"require": {
@@ -9244,8 +9244,8 @@
"phpunit/phpunit": "<8.0"
},
"require-dev": {
- "phpunit/phpunit": "^8.5 || ^9.6.10",
- "symplify/easy-coding-standard": "^12.0.8"
+ "phpunit/phpunit": "^8.5 || ^9.6.17",
+ "symplify/easy-coding-standard": "^12.1.14"
},
"type": "library",
"autoload": {
@@ -9302,7 +9302,7 @@
"security": "https://github.com/mockery/mockery/security/advisories",
"source": "https://github.com/mockery/mockery"
},
- "time": "2023-12-10T02:24:34+00:00"
+ "time": "2024-03-19T16:15:45+00:00"
},
{
"name": "myclabs/deep-copy",
@@ -9738,16 +9738,16 @@
},
{
"name": "phpstan/phpstan",
- "version": "1.10.62",
+ "version": "1.10.63",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
- "reference": "cd5c8a1660ed3540b211407c77abf4af193a6af9"
+ "reference": "ad12836d9ca227301f5fb9960979574ed8628339"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/cd5c8a1660ed3540b211407c77abf4af193a6af9",
- "reference": "cd5c8a1660ed3540b211407c77abf4af193a6af9",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ad12836d9ca227301f5fb9960979574ed8628339",
+ "reference": "ad12836d9ca227301f5fb9960979574ed8628339",
"shasum": ""
},
"require": {
@@ -9796,7 +9796,7 @@
"type": "tidelift"
}
],
- "time": "2024-03-13T12:27:20+00:00"
+ "time": "2024-03-18T16:53:53+00:00"
},
{
"name": "phpunit/php-code-coverage",
diff --git a/database/migrations/2024_03_20_233357_create_streamers_table.php b/database/migrations/2024_03_20_233357_create_streamers_table.php
new file mode 100644
index 0000000..c59477a
--- /dev/null
+++ b/database/migrations/2024_03_20_233357_create_streamers_table.php
@@ -0,0 +1,34 @@
+id();
+ $table->integer('champion_id');
+ $table->enum('platform', ['twitch', 'youtube', 'kick', 'douyu', 'huya']);
+ $table->string('username');
+ $table->string('displayname');
+
+ $table->foreign('champion_id')->references('champion_id')->on('champions')->onDelete('cascade');
+
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('streamers');
+ }
+};
diff --git a/dev_quickstart.bat b/dev_quickstart.bat
new file mode 100644
index 0000000..4cba6ac
--- /dev/null
+++ b/dev_quickstart.bat
@@ -0,0 +1 @@
+npm run dev-all
\ No newline at end of file
diff --git a/resources/css/app.css b/resources/css/app.css
index a320b96..787170f 100644
--- a/resources/css/app.css
+++ b/resources/css/app.css
@@ -2,6 +2,78 @@
@tailwind components;
@tailwind utilities;
+@font-face {
+ font-display: swap;
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 100;
+ src: url("/fonts/inter-v13-latin-100.woff2") format("woff2");
+}
+
+@font-face {
+ font-display: swap;
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 200;
+ src: url("/fonts/inter-v13-latin-200.woff2") format("woff2");
+}
+
+@font-face {
+ font-display: swap;
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 300;
+ src: url("/fonts/inter-v13-latin-300.woff2") format("woff2");
+}
+
+@font-face {
+ font-display: swap;
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 400;
+ src: url("/fonts/inter-v13-latin-regular.woff2") format("woff2");
+}
+
+@font-face {
+ font-display: swap;
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 500;
+ src: url("/fonts/inter-v13-latin-500.woff2") format("woff2");
+}
+
+@font-face {
+ font-display: swap;
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 600;
+ src: url("/fonts/inter-v13-latin-600.woff2") format("woff2");
+}
+
+@font-face {
+ font-display: swap;
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 700;
+ src: url("/fonts/inter-v13-latin-700.woff2") format("woff2");
+}
+
+@font-face {
+ font-display: swap;
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 800;
+ src: url("/fonts/inter-v13-latin-800.woff2") format("woff2");
+}
+
+@font-face {
+ font-display: swap;
+ font-family: "Inter";
+ font-style: normal;
+ font-weight: 900;
+ src: url("/fonts/inter-v13-latin-900.woff2") format("woff2");
+}
+
.glow-shadow::before {
content: "";
position: absolute;
@@ -13,13 +85,18 @@
animation: glow 4s infinite;
--tw-scale-x: 1.02;
--tw-scale-y: 1.02;
- transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y))
+ rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
+ scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.shadow-md-splash {
- --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
- --tw-shadow-colored: 0 4px 6px -1px var(--splash-color), 0 2px 4px -2px var(--splash-color);
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+ --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1),
+ 0 2px 4px -2px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 4px 6px -1px var(--splash-color),
+ 0 2px 4px -2px var(--splash-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
+ var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
@keyframes glow {
@@ -27,10 +104,12 @@
opacity: 0.8;
filter: blur(8px);
}
+
50% {
opacity: 0.45;
filter: blur(11px);
}
+
100% {
opacity: 0.8;
filter: blur(8px);
@@ -47,75 +126,22 @@
box-shadow: 0 50vh 0 50vh #292524;
}
-/* inter-100 - latin */
-@font-face {
- font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
- font-family: 'Inter';
- font-style: normal;
- font-weight: 100;
- src: url('/fonts/inter-v13-latin-100.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+.text-shadow-twitch {
+ text-shadow: 1px 1px 2px #6441a5;
}
-/* inter-200 - latin */
-@font-face {
- font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
- font-family: 'Inter';
- font-style: normal;
- font-weight: 200;
- src: url('/fonts/inter-v13-latin-200.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+
+.text-shadow-youtube {
+ text-shadow: 1px 1px 2px #ff0000;
}
-/* inter-300 - latin */
-@font-face {
- font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
- font-family: 'Inter';
- font-style: normal;
- font-weight: 300;
- src: url('/fonts/inter-v13-latin-300.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+
+.text-shadow-kick {
+ text-shadow: 1px 1px 2px #53fc18;
}
-/* inter-regular - latin */
-@font-face {
- font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
- font-family: 'Inter';
- font-style: normal;
- font-weight: 400;
- src: url('/fonts/inter-v13-latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+
+.text-shadow-douyu {
+ text-shadow: 1px 1px 2px #ff5f3a;
}
-/* inter-500 - latin */
-@font-face {
- font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
- font-family: 'Inter';
- font-style: normal;
- font-weight: 500;
- src: url('/fonts/inter-v13-latin-500.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+
+.text-shadow-huya {
+ text-shadow: 1px 1px 2px #ffaa06;
}
-/* inter-600 - latin */
-@font-face {
- font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
- font-family: 'Inter';
- font-style: normal;
- font-weight: 600;
- src: url('/fonts/inter-v13-latin-600.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
-}
-/* inter-700 - latin */
-@font-face {
- font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
- font-family: 'Inter';
- font-style: normal;
- font-weight: 700;
- src: url('/fonts/inter-v13-latin-700.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
-}
-/* inter-800 - latin */
-@font-face {
- font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
- font-family: 'Inter';
- font-style: normal;
- font-weight: 800;
- src: url('/fonts/inter-v13-latin-800.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
-}
-/* inter-900 - latin */
-@font-face {
- font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
- font-family: 'Inter';
- font-style: normal;
- font-weight: 900;
- src: url('/fonts/inter-v13-latin-900.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
-}
\ No newline at end of file
diff --git a/resources/views/champions/show.blade.php b/resources/views/champions/show.blade.php
index f0f744e..b50ca14 100644
--- a/resources/views/champions/show.blade.php
+++ b/resources/views/champions/show.blade.php
@@ -5,7 +5,7 @@
about ' . $champion->name . ', ' . $champion->title . '. ' . substr($champion->lore, 0, 50) . '...')
@section('content')
-
- {{$champion->lore}} + {{ $champion->name }} Streamers +
+ A list of streamers who play {{ $champion->name }} and are atleast Diamond 2 or higher.
+