2021-06-05 09:26:32 +00:00
< ? php
namespace App\Http\Controllers\Admin ;
use App\Classes\Pterodactyl ;
use App\Http\Controllers\Controller ;
use App\Models\Server ;
2023-01-19 10:18:51 +00:00
use App\Models\User ;
2021-06-05 09:26:32 +00:00
use Exception ;
use Illuminate\Contracts\Foundation\Application ;
use Illuminate\Contracts\View\Factory ;
use Illuminate\Contracts\View\View ;
use Illuminate\Http\JsonResponse ;
use Illuminate\Http\RedirectResponse ;
use Illuminate\Http\Request ;
use Illuminate\Http\Response ;
class ServerController extends Controller
{
/**
* Display a listing of the resource .
*
* @ return Application | Factory | View | Response
*/
public function index ()
{
return view ( 'admin.servers.index' );
}
/**
* Show the form for creating a new resource .
*
* @ return Response
*/
public function create ()
{
//
}
/**
* Store a newly created resource in storage .
*
2023-01-05 17:01:42 +00:00
* @ param Request $request
2021-06-05 09:26:32 +00:00
* @ return Response
*/
public function store ( Request $request )
{
//
}
/**
* Display the specified resource .
*
2023-01-05 17:01:42 +00:00
* @ param Server $server
2021-06-05 09:26:32 +00:00
* @ return Response
*/
public function show ( Server $server )
{
//
}
/**
* Show the form for editing the specified resource .
*
2023-01-05 17:01:42 +00:00
* @ param Server $server
2021-06-05 09:26:32 +00:00
* @ return Response
*/
public function edit ( Server $server )
{
2023-01-19 10:18:51 +00:00
// get all users from the database
$users = User :: all ();
2022-07-19 08:36:40 +00:00
return view ( 'admin.servers.edit' ) -> with ([
2023-01-05 17:01:42 +00:00
'server' => $server ,
2023-01-19 10:18:51 +00:00
'users' => $users ,
2022-07-19 08:36:40 +00:00
]);
2021-06-05 09:26:32 +00:00
}
/**
* Update the specified resource in storage .
*
2023-01-05 17:01:42 +00:00
* @ param Request $request
* @ param Server $server
2021-06-05 09:26:32 +00:00
*/
public function update ( Request $request , Server $server )
{
2022-07-19 08:36:40 +00:00
$request -> validate ([
2023-01-05 17:01:42 +00:00
'identifier' => 'required|string' ,
2023-01-19 10:18:51 +00:00
'user_id' => 'required|integer' ,
2022-07-19 08:36:40 +00:00
]);
2023-01-19 10:18:51 +00:00
if ( $request -> get ( 'user_id' ) != $server -> user_id ) {
// find the user
$user = User :: findOrFail ( $request -> get ( 'user_id' ));
// try to update the owner on pterodactyl
try {
$response = Pterodactyl :: updateServerOwner ( $server , $user -> pterodactyl_id );
if ( $response -> getStatusCode () != 200 ) {
return redirect () -> back () -> with ( 'error' , 'Failed to update server owner on pterodactyl' );
}
// update the owner on the database
$server -> user_id = $user -> id ;
} catch ( Exception $e ) {
return redirect () -> back () -> with ( 'error' , 'Internal Server Error' );
}
}
// update the identifier
$server -> identifier = $request -> get ( 'identifier' );
$server -> save ();
2022-07-19 08:36:40 +00:00
return redirect () -> route ( 'admin.servers.index' ) -> with ( 'success' , 'Server updated!' );
2021-06-05 09:26:32 +00:00
}
/**
* Remove the specified resource from storage .
*
2023-01-05 17:01:42 +00:00
* @ param Server $server
2021-06-05 09:26:32 +00:00
* @ return RedirectResponse | Response
*/
public function destroy ( Server $server )
{
2021-08-02 14:47:22 +00:00
try {
$server -> delete ();
2023-01-05 17:01:42 +00:00
2021-12-13 10:47:35 +00:00
return redirect () -> route ( 'admin.servers.index' ) -> with ( 'success' , __ ( 'Server removed' ));
2021-08-02 14:47:22 +00:00
} catch ( Exception $e ) {
2023-01-19 10:18:51 +00:00
return redirect () -> route ( 'admin.servers.index' ) -> with ( 'error' , __ ( 'An exception has occurred while trying to remove a resource "' ) . $e -> getMessage () . '"' );
2021-08-02 14:47:22 +00:00
}
2021-06-05 09:26:32 +00:00
}
/**
2022-07-22 01:52:49 +00:00
* Cancel the Server billing cycle .
*
* @ param Server $server
* @ return RedirectResponse | Response
*/
public function cancel ( Server $server )
{
try {
error_log ( $server -> update ([
'cancelled' => now (),
]));
return redirect () -> route ( 'servers.index' ) -> with ( 'success' , __ ( 'Server cancelled' ));
} catch ( Exception $e ) {
return redirect () -> route ( 'servers.index' ) -> with ( 'error' , __ ( 'An exception has occurred while trying to cancel the server"' ) . $e -> getMessage () . '"' );
}
}
/**
* @ param Server $server
2021-06-05 09:26:32 +00:00
* @ return RedirectResponse
*/
2022-01-25 21:52:19 +00:00
public function toggleSuspended ( Server $server )
{
2021-06-05 09:26:32 +00:00
try {
2023-01-05 17:01:42 +00:00
$server -> isSuspended () ? $server -> unSuspend () : $server -> suspend ();
2021-06-05 09:26:32 +00:00
} catch ( Exception $exception ) {
return redirect () -> back () -> with ( 'error' , $exception -> getMessage ());
}
2021-12-13 10:47:35 +00:00
return redirect () -> back () -> with ( 'success' , __ ( 'Server has been updated!' ));
2021-06-05 09:26:32 +00:00
}
2022-10-21 19:12:07 +00:00
public function syncServers ()
{
$pteroServers = Pterodactyl :: getServers ();
$CPServers = Server :: get ();
$CPIDArray = [];
$renameCount = 0 ;
2023-01-19 10:18:51 +00:00
foreach ( $CPServers as $CPServer ) { //go thru all CP servers and make array with IDs as keys. All values are false.
2023-01-05 17:01:42 +00:00
if ( $CPServer -> pterodactyl_id ) {
$CPIDArray [ $CPServer -> pterodactyl_id ] = false ;
}
2022-10-21 19:12:07 +00:00
}
2023-01-19 10:18:51 +00:00
foreach ( $pteroServers as $server ) { //go thru all ptero servers, if server exists, change value to true in array.
2023-01-05 17:01:42 +00:00
if ( isset ( $CPIDArray [ $server [ 'attributes' ][ 'id' ]])) {
$CPIDArray [ $server [ 'attributes' ][ 'id' ]] = true ;
2022-10-21 19:12:07 +00:00
2023-01-19 10:18:51 +00:00
if ( isset ( $server [ 'attributes' ][ 'name' ])) { //failsafe
2022-10-21 19:12:07 +00:00
//Check if a server got renamed
$savedServer = Server :: query () -> where ( 'pterodactyl_id' , $server [ 'attributes' ][ 'id' ]) -> first ();
2023-01-05 17:01:42 +00:00
if ( $savedServer -> name != $server [ 'attributes' ][ 'name' ]) {
2022-10-21 19:12:07 +00:00
$savedServer -> name = $server [ 'attributes' ][ 'name' ];
$savedServer -> save ();
$renameCount ++ ;
}
}
}
}
2023-01-05 17:01:42 +00:00
$filteredArray = array_filter ( $CPIDArray , function ( $v , $k ) {
2023-01-19 10:18:51 +00:00
return $v == false ;
2023-01-05 17:01:42 +00:00
}, ARRAY_FILTER_USE_BOTH ); //Array of servers, that dont exist on ptero (value == false)
2022-10-21 19:12:07 +00:00
$deleteCount = 0 ;
2023-01-19 10:18:51 +00:00
foreach ( $filteredArray as $key => $CPID ) { //delete servers that dont exist on ptero anymore
if ( ! Pterodactyl :: getServerAttributes ( $key , true )) {
2023-01-05 17:01:42 +00:00
$deleteCount ++ ;
}
2022-10-21 19:12:07 +00:00
}
2023-01-19 10:18:51 +00:00
return redirect () -> back () -> with ( 'success' , __ ( 'Servers synced successfully' . (( $renameCount ) ? ( ',\n' . __ ( 'renamed' ) . ' ' . $renameCount . ' ' . __ ( 'servers' )) : '' ) . (( count ( $filteredArray )) ? ( ',\n' . __ ( 'deleted' ) . ' ' . $deleteCount . '/' . count ( $filteredArray ) . ' ' . __ ( 'old servers' )) : '' ))) . '.' ;
2022-10-21 19:12:07 +00:00
}
2021-06-05 09:26:32 +00:00
/**
* @ return JsonResponse | mixed
2023-01-05 17:01:42 +00:00
*
2021-06-05 09:26:32 +00:00
* @ throws Exception
*/
public function dataTable ( Request $request )
{
2021-06-06 20:04:46 +00:00
$query = Server :: with ([ 'user' , 'product' ]);
2023-01-05 17:01:42 +00:00
if ( $request -> has ( 'product' )) {
$query -> where ( 'product_id' , '=' , $request -> input ( 'product' ));
}
if ( $request -> has ( 'user' )) {
$query -> where ( 'user_id' , '=' , $request -> input ( 'user' ));
}
2021-06-05 09:26:32 +00:00
$query -> select ( 'servers.*' );
return datatables ( $query )
-> addColumn ( 'user' , function ( Server $server ) {
2023-01-19 10:18:51 +00:00
return '<a href="' . route ( 'admin.users.show' , $server -> user -> id ) . '">' . $server -> user -> name . '</a>' ;
2021-06-05 09:26:32 +00:00
})
-> addColumn ( 'resources' , function ( Server $server ) {
return $server -> product -> description ;
})
-> addColumn ( 'actions' , function ( Server $server ) {
2023-01-05 17:01:42 +00:00
$suspendColor = $server -> isSuspended () ? 'btn-success' : 'btn-warning' ;
$suspendIcon = $server -> isSuspended () ? 'fa-play-circle' : 'fa-pause-circle' ;
$suspendText = $server -> isSuspended () ? __ ( 'Unsuspend' ) : __ ( 'Suspend' );
2021-06-05 09:26:32 +00:00
return '
2023-01-19 10:18:51 +00:00
< a data - content = " ' . __('Edit') . ' " data - toggle = " popover " data - trigger = " hover " data - placement = " top " href = " ' . route('admin.servers.edit', $server->id ) . ' " class = " btn btn-sm btn-info mr-1 " >< i class = " fas fa-pen " ></ i ></ a >
< form class = " d-inline " method = " post " action = " ' . route('admin.servers.togglesuspend', $server->id ) . ' " >
' . csrf_field() . '
< button data - content = " ' . $suspendText . ' " data - toggle = " popover " data - trigger = " hover " data - placement = " top " class = " btn btn-sm ' . $suspendColor . ' text-white mr-1 " >< i class = " far ' . $suspendIcon . ' " ></ i ></ button >
2021-06-05 09:26:32 +00:00
</ form >
2023-01-19 10:18:51 +00:00
< form class = " d-inline " onsubmit = " return submitResult(); " method = " post " action = " ' . route('admin.servers.destroy', $server->id ) . ' " >
' . csrf_field() . '
' . method_field(' DELETE ') . '
< button data - content = " ' . __('Delete') . ' " data - toggle = " popover " data - trigger = " hover " data - placement = " top " class = " btn btn-sm btn-danger mr-1 " >< i class = " fas fa-trash " ></ i ></ button >
2021-06-05 09:26:32 +00:00
</ form >
' ;
})
-> addColumn ( 'status' , function ( Server $server ) {
$labelColor = $server -> isSuspended () ? 'text-danger' : 'text-success' ;
2023-01-05 17:01:42 +00:00
2023-01-19 10:18:51 +00:00
return '<i class="fas ' . $labelColor . ' fa-circle mr-2"></i>' ;
2021-06-05 09:26:32 +00:00
})
-> editColumn ( 'created_at' , function ( Server $server ) {
return $server -> created_at ? $server -> created_at -> diffForHumans () : '' ;
})
-> editColumn ( 'suspended' , function ( Server $server ) {
return $server -> suspended ? $server -> suspended -> diffForHumans () : '' ;
})
-> editColumn ( 'name' , function ( Server $server ) {
2023-01-19 10:18:51 +00:00
return '<a class="text-info" target="_blank" href="' . config ( 'SETTINGS::SYSTEM:PTERODACTYL:URL' ) . '/admin/servers/view/' . $server -> pterodactyl_id . '">' . strip_tags ( $server -> name ) . '</a>' ;
2021-06-05 09:26:32 +00:00
})
-> rawColumns ([ 'user' , 'actions' , 'status' , 'name' ])
-> make ();
}
}