From 101688399fb0f1d4a82d9d5ce7c9ec7998ce30b0 Mon Sep 17 00:00:00 2001 From: Vari Date: Sun, 28 Jul 2024 21:50:59 +0200 Subject: [PATCH] Added Report admin Tool with frontend to handle Player Reports. Similar to the Chat Message handling. --- .../Web/Admin/Tools/AdminToolController.php | 1 + .../Web/Admin/Tools/ChatMessageController.php | 4 +- .../Admin/Tools/PlayerReportsController.php | 35 ++++ ...equest.php => HandleModerationRequest.php} | 2 +- .../Moderation/ReportPlayerInfoListEntry.php | 9 +- .../Models/Game/Moderation/PlayerReport.php | 14 ++ ..._28_002907_create_player_reports_table.php | 3 + .../views/admin/tools/user-list.blade.php | 1 - .../views/admin/tools/user-reports.blade.php | 77 ++++++++ .../admin/tools/report-list-entry.blade.php | 182 ++++++++++++++++++ .../views/components/icons/flag.blade.php | 3 + dist/routes/admin.php | 4 + 12 files changed, 329 insertions(+), 6 deletions(-) create mode 100644 dist/app/Http/Controllers/Web/Admin/Tools/PlayerReportsController.php rename dist/app/Http/Requests/Api/Admin/Tools/{HandleChatMessageRequest.php => HandleModerationRequest.php} (91%) create mode 100644 dist/resources/views/admin/tools/user-reports.blade.php create mode 100644 dist/resources/views/components/admin/tools/report-list-entry.blade.php create mode 100644 dist/resources/views/components/icons/flag.blade.php diff --git a/dist/app/Http/Controllers/Web/Admin/Tools/AdminToolController.php b/dist/app/Http/Controllers/Web/Admin/Tools/AdminToolController.php index 45cbb86..d513163 100644 --- a/dist/app/Http/Controllers/Web/Admin/Tools/AdminToolController.php +++ b/dist/app/Http/Controllers/Web/Admin/Tools/AdminToolController.php @@ -34,6 +34,7 @@ final public static function getAllTools(): array UsersController::class, ChatMessageController::class, InboxMailerController::class, + PlayerReportsController::class, ]; } diff --git a/dist/app/Http/Controllers/Web/Admin/Tools/ChatMessageController.php b/dist/app/Http/Controllers/Web/Admin/Tools/ChatMessageController.php index bd5019a..265a00d 100644 --- a/dist/app/Http/Controllers/Web/Admin/Tools/ChatMessageController.php +++ b/dist/app/Http/Controllers/Web/Admin/Tools/ChatMessageController.php @@ -3,7 +3,7 @@ namespace App\Http\Controllers\Web\Admin\Tools; use App\Enums\Auth\Permissions; -use App\Http\Requests\Api\Admin\Tools\HandleChatMessageRequest; +use App\Http\Requests\Api\Admin\Tools\HandleModerationRequest; use App\Models\Admin\BadChatMessage; use Redirect; use Session; @@ -26,7 +26,7 @@ public function index() return view('admin.tools.chat-messages', ['messages' => $badMessages]); } - public function handleMessage(HandleCHatMessageRequest $request, BadChatMessage $message) + public function handleMessage(HandleModerationRequest $request, BadChatMessage $message) { $message->consequences = $request->consequences; $message->handled = true; diff --git a/dist/app/Http/Controllers/Web/Admin/Tools/PlayerReportsController.php b/dist/app/Http/Controllers/Web/Admin/Tools/PlayerReportsController.php new file mode 100644 index 0000000..8151dba --- /dev/null +++ b/dist/app/Http/Controllers/Web/Admin/Tools/PlayerReportsController.php @@ -0,0 +1,35 @@ +paginate(); + + return view('admin.tools.user-reports', ['reports' => $reports]); + } + + public function handleReport(HandleModerationRequest $request, PlayerReport $report) { + $report->consequences = $request->consequences; + $report->handled = true; + $report->handledBy()->associate(Auth::user()); + $report->save(); + + Session::flash('alert-success', 'Handled report saved successfully.'); + return Redirect::back(); + } +} \ No newline at end of file diff --git a/dist/app/Http/Requests/Api/Admin/Tools/HandleChatMessageRequest.php b/dist/app/Http/Requests/Api/Admin/Tools/HandleModerationRequest.php similarity index 91% rename from dist/app/Http/Requests/Api/Admin/Tools/HandleChatMessageRequest.php rename to dist/app/Http/Requests/Api/Admin/Tools/HandleModerationRequest.php index a543fce..2c06848 100644 --- a/dist/app/Http/Requests/Api/Admin/Tools/HandleChatMessageRequest.php +++ b/dist/app/Http/Requests/Api/Admin/Tools/HandleModerationRequest.php @@ -6,7 +6,7 @@ use Auth; use Illuminate\Foundation\Http\FormRequest; -class HandleChatMessageRequest extends FormRequest +class HandleModerationRequest extends FormRequest { public string $consequences; diff --git a/dist/app/Http/Requests/Api/Moderation/ReportPlayerInfoListEntry.php b/dist/app/Http/Requests/Api/Moderation/ReportPlayerInfoListEntry.php index fd69480..7109080 100644 --- a/dist/app/Http/Requests/Api/Moderation/ReportPlayerInfoListEntry.php +++ b/dist/app/Http/Requests/Api/Moderation/ReportPlayerInfoListEntry.php @@ -4,6 +4,7 @@ use App\Enums\Game\CharacterState; use App\Enums\Game\Faction; +use App\Models\User\User; class ReportPlayerInfoListEntry { @@ -25,8 +26,12 @@ public static function makeFromArray(array $array) CharacterState::tryFrom($array['characterState']), Faction::tryFrom($array['faction']), $array['totalXpEarned'], - $array['playtimeInSec'], + $array['playtimeInSeconds'], $array['isReportedPlayer'], - $array['isReporterPlayer']); + $array['isReportingPlayer']); + } + + public function getPlayerName(): string|null { + return User::find($this->playerId, 'last_known_username')?->last_known_username; } } \ No newline at end of file diff --git a/dist/app/Models/Game/Moderation/PlayerReport.php b/dist/app/Models/Game/Moderation/PlayerReport.php index 6209796..05779c9 100644 --- a/dist/app/Models/Game/Moderation/PlayerReport.php +++ b/dist/app/Models/Game/Moderation/PlayerReport.php @@ -17,6 +17,11 @@ class PlayerReport extends Model 'player_infos' => 'array', ]; + protected $attributes = [ + 'handled' => false, + + ]; + public function reportedUser(): BelongsTo { return $this->belongsTo(User::class, 'reported_user_id'); @@ -27,6 +32,15 @@ public function reportingUser(): BelongsTo return $this->belongsTo(User::class, 'reporting_user_id'); } + public function handledBy(): BelongsTo + { + return $this->belongsTo(User::class, 'handled_by_id'); + } + + /** + * + * @return Collection|ReportPlayerInfoListEntry[] + * */ public function playerInfos(): Collection { $collection = collect(); diff --git a/dist/database/migrations/2024_07_28_002907_create_player_reports_table.php b/dist/database/migrations/2024_07_28_002907_create_player_reports_table.php index ef8bad8..11d3457 100644 --- a/dist/database/migrations/2024_07_28_002907_create_player_reports_table.php +++ b/dist/database/migrations/2024_07_28_002907_create_player_reports_table.php @@ -20,6 +20,9 @@ public function up(): void $table->text('details'); $table->uuid('match_id'); $table->json('player_infos'); + $table->foreignUuid('handled_by_id')->nullable()->constrained('users'); + $table->boolean('handled'); + $table->text('consequences')->nullable(); $table->timestamps(); }); diff --git a/dist/resources/views/admin/tools/user-list.blade.php b/dist/resources/views/admin/tools/user-list.blade.php index 613422d..f66627e 100644 --- a/dist/resources/views/admin/tools/user-list.blade.php +++ b/dist/resources/views/admin/tools/user-list.blade.php @@ -26,7 +26,6 @@ @if($userList->count() > 0) - diff --git a/dist/resources/views/admin/tools/user-reports.blade.php b/dist/resources/views/admin/tools/user-reports.blade.php new file mode 100644 index 0000000..a8d1789 --- /dev/null +++ b/dist/resources/views/admin/tools/user-reports.blade.php @@ -0,0 +1,77 @@ +@php + use App\Models\Game\Moderation\PlayerReport; +@endphp + +@props([ + 'reports' => collect() +]) + +@php + /** @var \Illuminate\Support\Collection<\App\Models\Game\Moderation\PlayerReport>|\Illuminate\Pagination\LengthAwarePaginator $reports*/ + + $handledReports = collect(); + $unhandledReports = collect(); + + $reports->each(function (PlayerReport $report) use ($handledReports, $unhandledReports) { + if($report->handled) + $handledReports->add($report); + else + $unhandledReports->add($report); + }) + +@endphp + + +
+ @if($reports->count() <= 0) +

No Reports

+ @endif + + @if($unhandledReports->count() > 0) +

Unhandled Reports

+ +
User ID
+ + + + + + + + + + + @foreach($unhandledReports as $report) + + @endforeach + +
TimeReporterReportedReasonDetailsMatch InfoActions
+ @endif + + @if($handledReports->count() > 0) +

Handled Reports

+ + + + + + + + + + + + + + @foreach($handledReports as $report) + + @endforeach + +
TimeReporterReportedReasonDetailsMatch InfoConsequencesHandled By
+ @endif + +
+ {{ $reports->links() }} +
+ + \ No newline at end of file diff --git a/dist/resources/views/components/admin/tools/report-list-entry.blade.php b/dist/resources/views/components/admin/tools/report-list-entry.blade.php new file mode 100644 index 0000000..6554022 --- /dev/null +++ b/dist/resources/views/components/admin/tools/report-list-entry.blade.php @@ -0,0 +1,182 @@ +@props([ + 'report' +]) + +@php + /** @var \App\Models\Game\Moderation\PlayerReport $report */ +@endphp + +
+ @csrf + + + {{ $report->created_at }} + + + +
+ Profile Picture of {{ $report->reportingUser->last_known_username }} + + {{ $report->reportingUser->last_known_username ?? $report->reportingUser->id }} + +
+
+ + + +
+ Profile Picture of {{ $report->reportedUser->last_known_username }} + + {{ $report->reportedUser->last_known_username ?? $report->reportedUser->id }} + +
+
+ + + {{ $report->reason }} + + +
+ {{ $report->details ?? '---' }} +
+ + + + + + Show + + + + + + @if(!$report->handled) + +
+ + + Handle + + + + + + + + + + + + +
+ + + + @else + + {{ $report->consequences }} + + + @if($report->handledBy === null) + Handler Unknown + @else +
+ Profile Picture of {{ $report->handledBy?->last_known_username }} + + {{ $report->handledBy?->last_known_username ?? $report->handledBy?->id }} + +
+ @endif + + @endif + +
\ No newline at end of file diff --git a/dist/resources/views/components/icons/flag.blade.php b/dist/resources/views/components/icons/flag.blade.php new file mode 100644 index 0000000..4c316eb --- /dev/null +++ b/dist/resources/views/components/icons/flag.blade.php @@ -0,0 +1,3 @@ + + + diff --git a/dist/routes/admin.php b/dist/routes/admin.php index 5137006..9822262 100644 --- a/dist/routes/admin.php +++ b/dist/routes/admin.php @@ -7,6 +7,7 @@ use App\Http\Controllers\Web\Admin\Tools\GameNewsController; use App\Http\Controllers\Web\Admin\Tools\InboxMailerController; use App\Http\Controllers\Web\Admin\Tools\LogViewerController; +use App\Http\Controllers\Web\Admin\Tools\PlayerReportsController; use App\Http\Controllers\Web\Admin\Tools\UsersController; use App\Http\Controllers\Web\GameFileController; @@ -41,6 +42,9 @@ Route::get('chat-filter', [ChatMessageController::class, 'index'])->name(ChatMessageController::class); Route::post('chat-filter/handle-message/{message}', [ChatMessageController::class, 'handleMessage'])->name('chat-filter.handle'); +Route::get('reports', [PlayerReportsController::class, 'index'])->name(PlayerReportsController::class); +Route::post('reports/handle-report/{report}', [PlayerReportsController::class, 'handleReport'])->name('reports.handle'); + Route::fallback(function () { return redirect(route('admin.dashboard')); });