From 0d4b0d904b6ea3498607c5f6558b717de8684746 Mon Sep 17 00:00:00 2001 From: Xinecraft Date: Mon, 3 Jun 2024 13:42:12 +0530 Subject: [PATCH] unlink player --- .../Controllers/Admin/PlayerController.php | 30 +++++ app/Policies/PlayerPolicy.php | 5 + database/seeders/PermissionSeeder.php | 3 + .../default/js/Pages/Admin/User/EditUser.vue | 2 +- .../default/js/Pages/Player/ShowPlayer.vue | 118 ++++++++++-------- .../Profile/UpdateProfileInformationForm.vue | 2 +- routes/web.php | 1 + 7 files changed, 107 insertions(+), 54 deletions(-) diff --git a/app/Http/Controllers/Admin/PlayerController.php b/app/Http/Controllers/Admin/PlayerController.php index e8914f695..23852b4ba 100644 --- a/app/Http/Controllers/Admin/PlayerController.php +++ b/app/Http/Controllers/Admin/PlayerController.php @@ -3,9 +3,11 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; +use App\Jobs\AccountUnlinkAfterSuccessCommandJob; use App\Models\MinecraftPlayerSession; use App\Models\Player; use DB; +use Illuminate\Http\Request; class PlayerController extends Controller { @@ -22,4 +24,32 @@ public function destroy(Player $player) return redirect()->back() ->with(['toast' => ['type' => 'success', 'title' => __('Player Deleted!'), 'body' => __('All intel data related to the player is deleted.')]]); } + + public function unlink(Player $player, Request $request) + { + $this->authorize('unlink', $player); + + $attachedUser = $player->users()->first(); + if (! $attachedUser) { + return redirect()->back() + ->with(['toast' => ['type' => 'danger', 'title' => __('Not Linked!'), 'body' => __('Player is not linked to any user.')]]); + } + + // Unlink the player + $player->users()->detach($attachedUser->id); + + // If MARK_USER_VERIFYED_ON_ACCOUNT_LINK is enabled then mark user as unverified when he unlink all players. + $linkedPlayersExist = $attachedUser->players()->exists(); + if (config('minetrax.mark_user_verified_on_account_link') && $attachedUser->verified_at && ! $linkedPlayersExist) { + $attachedUser->verified_at = null; + $attachedUser->save(); + } + + // Dispatch unlink after success commands + AccountUnlinkAfterSuccessCommandJob::dispatch($player, $attachedUser->id); + + // Return redirect back with flash + return redirect()->back() + ->with(['toast' => ['type' => 'success', 'title' => __('Played unlinked successfully!'), 'body' => __('Player has been unlinked from that account.'), 'milliseconds' => 10000]]); + } } diff --git a/app/Policies/PlayerPolicy.php b/app/Policies/PlayerPolicy.php index 51fd2a50d..98f326a50 100644 --- a/app/Policies/PlayerPolicy.php +++ b/app/Policies/PlayerPolicy.php @@ -62,4 +62,9 @@ public function destroy(User $user, Player $player) { return $user->can('delete players'); } + + public function unlink(User $user, Player $player) + { + return $user->can('unlink any_players'); + } } diff --git a/database/seeders/PermissionSeeder.php b/database/seeders/PermissionSeeder.php index b4def1e19..57c4302af 100644 --- a/database/seeders/PermissionSeeder.php +++ b/database/seeders/PermissionSeeder.php @@ -123,5 +123,8 @@ public function run() Permission::findOrCreate('create command_queues'); Permission::findOrCreate('read command_queues'); Permission::findOrCreate('delete command_queues'); + + Permission::findOrCreate('link any_players'); + Permission::findOrCreate('unlink any_players'); } } diff --git a/resources/default/js/Pages/Admin/User/EditUser.vue b/resources/default/js/Pages/Admin/User/EditUser.vue index ac7208a17..386f94e6a 100644 --- a/resources/default/js/Pages/Admin/User/EditUser.vue +++ b/resources/default/js/Pages/Admin/User/EditUser.vue @@ -153,7 +153,7 @@ -

+

{{ __("None") }} + + + + +

@@ -769,64 +786,61 @@ - diff --git a/resources/default/js/Pages/Profile/UpdateProfileInformationForm.vue b/resources/default/js/Pages/Profile/UpdateProfileInformationForm.vue index d78f4e5c6..cae616055 100644 --- a/resources/default/js/Pages/Profile/UpdateProfileInformationForm.vue +++ b/resources/default/js/Pages/Profile/UpdateProfileInformationForm.vue @@ -212,7 +212,7 @@ name('intel.player.list'); Route::delete('intel/player/{player:uuid}/delete', [\App\Http\Controllers\Admin\PlayerController::class, 'destroy'])->name('intel.player.delete'); + Route::delete('player/{player:uuid}/unlink', [\App\Http\Controllers\Admin\PlayerController::class, 'unlink'])->name('player.unlink'); Route::get('rank', [\App\Http\Controllers\Admin\RankController::class, 'index'])->name('rank.index'); Route::get('rank/create', [\App\Http\Controllers\Admin\RankController::class, 'create'])->name('rank.create');