Parcourir la source

Merge pull request #449 from ControlPanel-gg/development

v. 0.7.6
Dennis il y a 3 ans
Parent
commit
597d283779
32 fichiers modifiés avec 746 ajouts et 205 suppressions
  1. 1 0
      README.md
  2. 11 0
      app/Classes/Settings/Misc.php
  3. 53 3
      app/Http/Controllers/Admin/PaymentController.php
  4. 16 2
      app/Http/Controllers/Admin/UserController.php
  5. 33 1
      app/Http/Controllers/Api/UserController.php
  6. 43 0
      app/Http/Controllers/Auth/RegisterController.php
  7. 24 11
      app/Http/Controllers/Auth/SocialiteController.php
  8. 9 6
      app/Http/Controllers/NotificationController.php
  9. 15 0
      app/Http/Controllers/ProfileController.php
  10. 11 5
      app/Models/User.php
  11. 59 0
      app/Notifications/ReferralNotification.php
  12. 1 1
      config/app.php
  13. 56 0
      database/migrations/2022_06_02_081655_referral_code.php
  14. 35 0
      database/migrations/2022_06_02_091921_table-user-referrals.php
  15. 36 1
      database/seeders/Seeds/SettingsSeeder.php
  16. BIN
      public/favicon.ico
  17. BIN
      public/images/bitsec.png
  18. BIN
      public/images/controlpanel_logo.png
  19. 2 2
      public/install/forms.php
  20. 11 0
      public/install/functions.php
  21. 2 2
      public/install/index.php
  22. 10 12
      resources/views/admin/activitylogs/index.blade.php
  23. 65 0
      resources/views/admin/settings/tabs/misc.blade.php
  24. 2 1
      resources/views/admin/store/edit.blade.php
  25. 2 0
      resources/views/admin/users/index.blade.php
  26. 29 0
      resources/views/admin/users/show.blade.php
  27. 10 1
      resources/views/auth/register.blade.php
  28. 12 15
      resources/views/home.blade.php
  29. 4 1
      resources/views/layouts/main.blade.php
  30. 4 0
      resources/views/notifications/index.blade.php
  31. 189 141
      resources/views/profile/index.blade.php
  32. 1 0
      routes/web.php

+ 1 - 0
README.md

@@ -2,6 +2,7 @@
 
 
 -   PayPal Integration
 -   PayPal Integration
 -   Stripe Integration
 -   Stripe Integration
+-   Referral System
 -   Email Verification
 -   Email Verification
 -   Audit Log
 -   Audit Log
 -   Admin Dashboard
 -   Admin Dashboard

+ 11 - 0
app/Classes/Settings/Misc.php

@@ -37,6 +37,11 @@ class Misc
             'mailencryption' => 'nullable|string',
             'mailencryption' => 'nullable|string',
             'mailfromadress' => 'nullable|string',
             'mailfromadress' => 'nullable|string',
             'mailfromname' => 'nullable|string',
             'mailfromname' => 'nullable|string',
+            'enable_referral' => 'nullable|string',
+            'referral_reward' => 'nullable|numeric',
+            'referral_allowed' => 'nullable|string',
+            'referral_percentage' => 'nullable|numeric',
+            'referral_mode' => 'nullable|string',
         ]);
         ]);
 
 
         if ($validator->fails()) {
         if ($validator->fails()) {
@@ -69,6 +74,12 @@ class Misc
             "SETTINGS::MAIL:ENCRYPTION" => "mailencryption",
             "SETTINGS::MAIL:ENCRYPTION" => "mailencryption",
             "SETTINGS::MAIL:FROM_ADDRESS" => "mailfromadress",
             "SETTINGS::MAIL:FROM_ADDRESS" => "mailfromadress",
             "SETTINGS::MAIL:FROM_NAME" => "mailfromname",
             "SETTINGS::MAIL:FROM_NAME" => "mailfromname",
+            "SETTINGS::REFERRAL::ENABLED" => "enable_referral",
+            "SETTINGS::REFERRAL::REWARD" => "referral_reward",
+            "SETTINGS::REFERRAL::ALLOWED" => "referral_allowed",
+            "SETTINGS::REFERRAL:MODE" => "referral_mode",
+            "SETTINGS::REFERRAL:PERCENTAGE" => "referral_percentage"
+
 
 
         ];
         ];
 
 

+ 53 - 3
app/Http/Controllers/Admin/PaymentController.php

@@ -19,6 +19,8 @@ use Illuminate\Http\JsonResponse;
 use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\Request;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\Storage;
 use Illuminate\Support\Facades\Storage;
 use LaravelDaily\Invoices\Classes\Buyer;
 use LaravelDaily\Invoices\Classes\Buyer;
 use LaravelDaily\Invoices\Classes\InvoiceItem;
 use LaravelDaily\Invoices\Classes\InvoiceItem;
@@ -179,9 +181,25 @@ class PaymentController extends Controller
                 }
                 }
 
 
 
 
-                //update role
+                //update role give Referral-reward
                 if ($user->role == 'member') {
                 if ($user->role == 'member') {
                     $user->update(['role' => 'client']);
                     $user->update(['role' => 'client']);
+
+                    if((config("SETTINGS::REFERRAL:MODE") == "commission" || config("SETTINGS::REFERRAL:MODE") == "both") && $shopProduct->type=="Credits"){
+                        if($ref_user = DB::table("user_referrals")->where('registered_user_id', '=', $user->id)->first()){
+                            $ref_user = User::findOrFail($ref_user->referral_id);
+                            $increment = number_format($shopProduct->quantity/100*config("SETTINGS::REFERRAL:PERCENTAGE"),0,"","");
+                            $ref_user->increment('credits', $increment);
+
+                            //LOGS REFERRALS IN THE ACTIVITY LOG
+                            activity()
+                                ->performedOn($user)
+                                ->causedBy($ref_user)
+                                ->log('gained '. $increment.' '.config("SETTINGS::SYSTEM:CREDITS_DISPLAY_NAME").' for commission-referral of '.$user->name.' (ID:'.$user->id.')');
+                        }
+
+                    }
+
                 }
                 }
 
 
                 //store payment
                 //store payment
@@ -326,9 +344,25 @@ class PaymentController extends Controller
                     $user->increment('server_limit', $shopProduct->quantity);
                     $user->increment('server_limit', $shopProduct->quantity);
                 }
                 }
 
 
-                //update role
+                //update role give Referral-reward
                 if ($user->role == 'member') {
                 if ($user->role == 'member') {
                     $user->update(['role' => 'client']);
                     $user->update(['role' => 'client']);
+
+                    if((config("SETTINGS::REFERRAL:MODE") == "commission"  || config("SETTINGS::REFERRAL:MODE") == "both") && $shopProduct->type=="Credits"){
+                        if($ref_user = DB::table("user_referrals")->where('registered_user_id', '=', $user->id)->first()){
+                            $ref_user = User::findOrFail($ref_user->referral_id);
+                            $increment = number_format($shopProduct->quantity/100*config("SETTINGS::REFERRAL:PERCENTAGE"),0,"","");
+                            $ref_user->increment('credits', $increment);
+
+                            //LOGS REFERRALS IN THE ACTIVITY LOG
+                            activity()
+                                ->performedOn($user)
+                                ->causedBy($ref_user)
+                                ->log('gained '. $increment.' '.config("SETTINGS::SYSTEM:CREDITS_DISPLAY_NAME").' for commission-referral of '.$user->name.' (ID:'.$user->id.')');
+                        }
+
+                    }
+
                 }
                 }
 
 
                 //store paid payment
                 //store paid payment
@@ -431,9 +465,25 @@ class PaymentController extends Controller
                     $user->increment('server_limit', $shopProduct->quantity);
                     $user->increment('server_limit', $shopProduct->quantity);
                 }
                 }
 
 
-                //update role
+                //update role give Referral-reward
                 if ($user->role == 'member') {
                 if ($user->role == 'member') {
                     $user->update(['role' => 'client']);
                     $user->update(['role' => 'client']);
+
+                    if((config("SETTINGS::REFERRAL:MODE") == "commission"  || config("SETTINGS::REFERRAL:MODE") == "both")&& $shopProduct->type=="Credits"){
+                        if($ref_user = DB::table("user_referrals")->where('registered_user_id', '=', $user->id)->first()){
+                            $ref_user = User::findOrFail($ref_user->referral_id);
+                            $increment = number_format($shopProduct->quantity/100*config("SETTINGS::REFERRAL:PERCENTAGE"),0,"","");
+                            $ref_user->increment('credits', $increment);
+
+                            //LOGS REFERRALS IN THE ACTIVITY LOG
+                            activity()
+                                ->performedOn($user)
+                                ->causedBy($ref_user)
+                                ->log('gained '. $increment.' '.config("SETTINGS::SYSTEM:CREDITS_DISPLAY_NAME").' for commission-referral of '.$user->name.' (ID:'.$user->id.')');
+                        }
+
+                    }
+
                 }
                 }
 
 
                 //update payment db entry status
                 //update payment db entry status

+ 16 - 2
app/Http/Controllers/Admin/UserController.php

@@ -8,6 +8,7 @@ use App\Http\Controllers\Controller;
 use App\Models\Settings;
 use App\Models\Settings;
 use App\Models\User;
 use App\Models\User;
 use App\Notifications\DynamicNotification;
 use App\Notifications\DynamicNotification;
+use Illuminate\Support\Facades\DB;
 use Spatie\QueryBuilder\QueryBuilder;
 use Spatie\QueryBuilder\QueryBuilder;
 use Exception;
 use Exception;
 use Illuminate\Contracts\Foundation\Application;
 use Illuminate\Contracts\Foundation\Application;
@@ -52,8 +53,18 @@ class UserController extends Controller
      */
      */
     public function show(User $user)
     public function show(User $user)
     {
     {
+        //QUERY ALL REFERRALS A USER HAS
+        //i am not proud of this at all.
+            $allReferals = array();
+            $referrals = DB::table("user_referrals")->where("referral_id","=",$user->id)->get();
+            foreach($referrals as $referral){
+                array_push($allReferals, $allReferals["id"] = User::query()->findOrFail($referral->registered_user_id));
+            }
+            array_pop($allReferals);
+
         return view('admin.users.show')->with([
         return view('admin.users.show')->with([
-            'user' => $user
+            'user' => $user,
+            'referrals' => $allReferals
         ]);
         ]);
     }
     }
 
 
@@ -258,6 +269,9 @@ class UserController extends Controller
             ->addColumn('servers', function (User $user) {
             ->addColumn('servers', function (User $user) {
                 return $user->servers->count();
                 return $user->servers->count();
             })
             })
+            ->addColumn('referrals', function (User $user) {
+                return DB::table('user_referrals')->where("referral_id","=",$user->id)->count();
+            })
             ->addColumn('discordId', function (User $user) {
             ->addColumn('discordId', function (User $user) {
                 return $user->discordUser ? $user->discordUser->id : '';
                 return $user->discordUser ? $user->discordUser->id : '';
             })
             })
@@ -307,7 +321,7 @@ class UserController extends Controller
             ->orderColumn('last_seen', function ($query) {
             ->orderColumn('last_seen', function ($query) {
                 $query->orderBy('last_seen', "desc");
                 $query->orderBy('last_seen', "desc");
             })
             })
-            ->rawColumns(['avatar', 'name', 'credits', 'role', 'usage', 'actions', 'last_seen'])
+            ->rawColumns(['avatar', 'name', 'credits', 'role', 'usage', 'referrals', 'actions', 'last_seen'])
             ->make(true);
             ->make(true);
     }
     }
 }
 }

+ 33 - 1
app/Http/Controllers/Api/UserController.php

@@ -8,6 +8,8 @@ use App\Http\Controllers\Controller;
 use App\Models\DiscordUser;
 use App\Models\DiscordUser;
 use App\Models\Settings;
 use App\Models\Settings;
 use App\Models\User;
 use App\Models\User;
+use App\Notifications\ReferralNotification;
+use Carbon\Carbon;
 use Illuminate\Contracts\Foundation\Application;
 use Illuminate\Contracts\Foundation\Application;
 use Illuminate\Contracts\Pagination\LengthAwarePaginator;
 use Illuminate\Contracts\Pagination\LengthAwarePaginator;
 use Illuminate\Contracts\Routing\ResponseFactory;
 use Illuminate\Contracts\Routing\ResponseFactory;
@@ -17,6 +19,7 @@ use Illuminate\Database\Eloquent\Model;
 use Illuminate\Http\Request;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;
 use Illuminate\Http\Response;
 use Illuminate\Support\Facades\App;
 use Illuminate\Support\Facades\App;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Hash;
 use Illuminate\Support\Facades\Hash;
 use Illuminate\Support\Str;
 use Illuminate\Support\Str;
 use Illuminate\Validation\Rule;
 use Illuminate\Validation\Rule;
@@ -227,7 +230,17 @@ class UserController extends Controller
 
 
         return $user;
         return $user;
     }
     }
-
+    /**
+     * Create a unique Referral Code for User
+     * @return string
+     */
+    protected function createReferralCode(){
+        $referralcode = STR::random(8);
+        if (User::where('referral_code', '=', $referralcode)->exists()) {
+            $this->createReferralCode();
+        }
+        return $referralcode;
+    }
     /**
     /**
      * @throws ValidationException
      * @throws ValidationException
      */
      */
@@ -245,6 +258,7 @@ class UserController extends Controller
             'credits' => config('SETTINGS::USER:INITIAL_CREDITS', 150),
             'credits' => config('SETTINGS::USER:INITIAL_CREDITS', 150),
             'server_limit' => config('SETTINGS::USER:INITIAL_SERVER_LIMIT', 1),
             'server_limit' => config('SETTINGS::USER:INITIAL_SERVER_LIMIT', 1),
             'password' => Hash::make($request->input('password')),
             'password' => Hash::make($request->input('password')),
+            'referral_code' => $this->createReferralCode(),
         ]);
         ]);
 
 
         $response = Pterodactyl::client()->post('/application/users', [
         $response = Pterodactyl::client()->post('/application/users', [
@@ -269,7 +283,25 @@ class UserController extends Controller
         $user->update([
         $user->update([
             'pterodactyl_id' => $response->json()['attributes']['id']
             'pterodactyl_id' => $response->json()['attributes']['id']
         ]);
         ]);
+        //INCREMENT REFERRAL-USER CREDITS
+        if(!empty($request->input("referral_code"))){
+            $ref_code = $request->input("referral_code");
+            $new_user = $user->id;
+            if($ref_user = User::query()->where('referral_code', '=', $ref_code)->first()) {
+                if(config("SETTINGS::REFERRAL:MODE") == "register" || config("SETTINGS::REFERRAL:MODE") == "both") {
+                    $ref_user->increment('credits', config("SETTINGS::REFERRAL::REWARD"));
+                    $ref_user->notify(new ReferralNotification($ref_user->id, $new_user));
+                }
+                //INSERT INTO USER_REFERRALS TABLE
+                DB::table('user_referrals')->insert([
+                    'referral_id' => $ref_user->id,
+                    'registered_user_id' => $user->id,
+                    'created_at' =>  Carbon::now(),
+                    'updated_at' => Carbon::now()
+                ]);
+            }
 
 
+        }
         $user->sendEmailVerificationNotification();
         $user->sendEmailVerificationNotification();
 
 
         return $user;
         return $user;

+ 43 - 0
app/Http/Controllers/Auth/RegisterController.php

@@ -6,10 +6,15 @@ use App\Classes\Pterodactyl;
 use App\Http\Controllers\Controller;
 use App\Http\Controllers\Controller;
 use App\Models\Settings;
 use App\Models\Settings;
 use App\Models\User;
 use App\Models\User;
+use App\Notifications\ReferralNotification;
 use App\Providers\RouteServiceProvider;
 use App\Providers\RouteServiceProvider;
+use Carbon\Carbon;
 use Illuminate\Foundation\Auth\RegistersUsers;
 use Illuminate\Foundation\Auth\RegistersUsers;
 use Illuminate\Support\Facades\App;
 use Illuminate\Support\Facades\App;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Hash;
 use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\Validator;
 use Illuminate\Support\Facades\Validator;
 use Illuminate\Support\Str;
 use Illuminate\Support\Str;
 use Illuminate\Validation\ValidationException;
 use Illuminate\Validation\ValidationException;
@@ -78,6 +83,18 @@ class RegisterController extends Controller
         return Validator::make($data, $validationRules);
         return Validator::make($data, $validationRules);
     }
     }
 
 
+    /**
+     * Create a unique Referral Code for User
+     * @return string
+     */
+    protected function createReferralCode(){
+        $referralcode = STR::random(8);
+        if (User::where('referral_code', '=', $referralcode)->exists()) {
+            $this->createReferralCode();
+        }
+        return $referralcode;
+    }
+
     /**
     /**
      * Create a new user instance after a valid registration.
      * Create a new user instance after a valid registration.
      *
      *
@@ -92,6 +109,8 @@ class RegisterController extends Controller
             'credits'      => config('SETTINGS::USER:INITIAL_CREDITS', 150),
             'credits'      => config('SETTINGS::USER:INITIAL_CREDITS', 150),
             'server_limit' => config('SETTINGS::USER:INITIAL_SERVER_LIMIT', 1),
             'server_limit' => config('SETTINGS::USER:INITIAL_SERVER_LIMIT', 1),
             'password'     => Hash::make($data['password']),
             'password'     => Hash::make($data['password']),
+            'referral_code' => $this->createReferralCode(),
+
         ]);
         ]);
 
 
         $response = Pterodactyl::client()->post('/application/users', [
         $response = Pterodactyl::client()->post('/application/users', [
@@ -116,7 +135,31 @@ class RegisterController extends Controller
             'pterodactyl_id' => $response->json()['attributes']['id']
             'pterodactyl_id' => $response->json()['attributes']['id']
         ]);
         ]);
 
 
+        //INCREMENT REFERRAL-USER CREDITS
+        if(!empty($data['referral_code'])){
+            $ref_code = $data['referral_code'];
+            $new_user = $user->id;
+            if($ref_user = User::query()->where('referral_code', '=', $ref_code)->first()) {
+                if(config("SETTINGS::REFERRAL:MODE") == "sign-up" || config("SETTINGS::REFERRAL:MODE") == "both") {
+                    $ref_user->increment('credits', config("SETTINGS::REFERRAL::REWARD"));
+                    $ref_user->notify(new ReferralNotification($ref_user->id, $new_user));
+
+                    //LOGS REFERRALS IN THE ACTIVITY LOG
+                    activity()
+                        ->performedOn($user)
+                        ->causedBy($ref_user)
+                        ->log('gained '. config("SETTINGS::REFERRAL::REWARD").' '.config("SETTINGS::SYSTEM:CREDITS_DISPLAY_NAME").' for sign-up-referral of '.$user->name.' (ID:'.$user->id.')');
+                }
+                //INSERT INTO USER_REFERRALS TABLE
+                DB::table('user_referrals')->insert([
+                    'referral_id' => $ref_user->id,
+                    'registered_user_id' => $user->id,
+                    'created_at' =>  Carbon::now(),
+                    'updated_at' => Carbon::now()
+                ]);
+            }
 
 
+        }
 
 
         return $user;
         return $user;
     }
     }

+ 24 - 11
app/Http/Controllers/Auth/SocialiteController.php

@@ -7,6 +7,7 @@ use App\Models\DiscordUser;
 use App\Models\Settings;
 use App\Models\Settings;
 use App\Models\User;
 use App\Models\User;
 use App\Models\Voucher;
 use App\Models\Voucher;
+use Exception;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Http;
 use Illuminate\Support\Facades\Http;
 use Laravel\Socialite\Facades\Socialite;
 use Laravel\Socialite\Facades\Socialite;
@@ -35,17 +36,29 @@ class SocialiteController extends Controller
         $guildId = config("SETTINGS::DISCORD:GUILD_ID");
         $guildId = config("SETTINGS::DISCORD:GUILD_ID");
         $roleId = config("SETTINGS::DISCORD:ROLE_ID");
         $roleId = config("SETTINGS::DISCORD:ROLE_ID");
 
 
-        //save / update discord_users
-        if (is_null($user->discordUser)) {
-            //create discord user in db
-            DiscordUser::create(array_merge($discord->user, ['user_id' => Auth::user()->id]));
-            //update user
-            Auth::user()->increment('credits', config('SETTINGS::USER:CREDITS_REWARD_AFTER_VERIFY_DISCORD'));
-            Auth::user()->increment('server_limit', config('SETTINGS::USER:SERVER_LIMIT_REWARD_AFTER_VERIFY_DISCORD'));
-            Auth::user()->update(['discord_verified_at' => now()]);
-        } else {
-            $user->discordUser->update($discord->user);
-        }
+            //save / update discord_users
+
+            //check if discord account is already linked to an cpgg account
+            if (is_null($user->discordUser)) {
+                $discordLinked = DiscordUser::where('id', '=', $discord->id)->first();
+                if ($discordLinked !== null) {
+                    return redirect()->route('profile.index')->with(
+                        'error',
+                        'Discord account already linked!'
+                    );
+                }
+
+                //create discord user in db
+                DiscordUser::create(array_merge($discord->user, ['user_id' => Auth::user()->id]));
+
+                //update user
+                Auth::user()->increment('credits', config('SETTINGS::USER:CREDITS_REWARD_AFTER_VERIFY_DISCORD'));
+                Auth::user()->increment('server_limit', config('SETTINGS::USER:SERVER_LIMIT_REWARD_AFTER_VERIFY_DISCORD'));
+                Auth::user()->update(['discord_verified_at' => now()]);
+
+            } else {
+                $user->discordUser->update($discord->user);
+            }
 
 
         //force user into discord server
         //force user into discord server
         //TODO Add event on failure, to notify ppl involved
         //TODO Add event on failure, to notify ppl involved

+ 9 - 6
app/Http/Controllers/NotificationController.php

@@ -2,11 +2,6 @@
 
 
 namespace App\Http\Controllers;
 namespace App\Http\Controllers;
 
 
-use Illuminate\Contracts\View\Factory;
-use Illuminate\Contracts\View\View;
-use Illuminate\Http\Request;
-use Illuminate\Http\Response;
-use Illuminate\Notifications\Notification;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Auth;
 
 
 class NotificationController extends Controller
 class NotificationController extends Controller
@@ -15,7 +10,6 @@ class NotificationController extends Controller
     public function index()
     public function index()
     {
     {
         $notifications = Auth::user()->notifications()->paginate();
         $notifications = Auth::user()->notifications()->paginate();
-
         return view('notifications.index')->with([
         return view('notifications.index')->with([
             'notifications' => $notifications
             'notifications' => $notifications
         ]);
         ]);
@@ -31,4 +25,13 @@ class NotificationController extends Controller
             'notification' => $notification
             'notification' => $notification
         ]);
         ]);
     }
     }
+
+    public function readAll(){
+        $notifications = Auth::user()->notifications()->get();
+        foreach($notifications as $notification){
+            $notification->markAsRead();
+        }
+        return redirect()->back();
+
+    }
 }
 }

+ 15 - 0
app/Http/Controllers/ProfileController.php

@@ -16,11 +16,26 @@ class ProfileController extends Controller
     /** Display a listing of the resource. */
     /** Display a listing of the resource. */
     public function index()
     public function index()
     {
     {
+        switch (Auth::user()->role) {
+            case 'admin':
+                $badgeColor = 'badge-danger';
+                break;
+            case 'mod':
+                $badgeColor = 'badge-info';
+                break;
+            case 'client':
+                $badgeColor = 'badge-success';
+                break;
+            default:
+                $badgeColor = 'badge-secondary';
+                break;
+        }
         return view('profile.index')->with([
         return view('profile.index')->with([
             'user' => Auth::user(),
             'user' => Auth::user(),
             'credits_reward_after_verify_discord' => config('SETTINGS::USER:CREDITS_REWARD_AFTER_VERIFY_DISCORD'),
             'credits_reward_after_verify_discord' => config('SETTINGS::USER:CREDITS_REWARD_AFTER_VERIFY_DISCORD'),
             'force_email_verification' => config('SETTINGS::USER:FORCE_EMAIL_VERIFICATION'),
             'force_email_verification' => config('SETTINGS::USER:FORCE_EMAIL_VERIFICATION'),
             'force_discord_verification' => config('SETTINGS::USER:FORCE_DISCORD_VERIFICATION'),
             'force_discord_verification' => config('SETTINGS::USER:FORCE_DISCORD_VERIFICATION'),
+            'badgeColor' => $badgeColor,
         ]);
         ]);
     }
     }
 
 

+ 11 - 5
app/Models/User.php

@@ -60,7 +60,8 @@ class User extends Authenticatable implements MustVerifyEmail
         'pterodactyl_id',
         'pterodactyl_id',
         'discord_verified_at',
         'discord_verified_at',
         'avatar',
         'avatar',
-        'suspended'
+        'suspended',
+        'referral_code'
     ];
     ];
 
 
     /**
     /**
@@ -195,7 +196,7 @@ class User extends Authenticatable implements MustVerifyEmail
      */
      */
     public function unSuspend()
     public function unSuspend()
     {
     {
-        foreach ($this->servers as $server) {
+        foreach ($this->getServersWithProduct() as $server) {
             if ($this->credits >= $server->product->getHourlyPrice()) {
             if ($this->credits >= $server->product->getHourlyPrice()) {
                 $server->unSuspend();
                 $server->unSuspend();
             }
             }
@@ -232,14 +233,19 @@ class User extends Authenticatable implements MustVerifyEmail
      * @return string
      * @return string
      */
      */
     public function creditUsage()
     public function creditUsage()
-    {
+    {            
         $usage = 0;
         $usage = 0;
-
-        foreach ($this->Servers as $server) {
+        foreach ($this->getServersWithProduct() as $server) {
             $usage += $server->product->price;
             $usage += $server->product->price;
         }
         }
 
 
         return number_format($usage, 2, '.', '');
         return number_format($usage, 2, '.', '');
+    }    
+
+    private function getServersWithProduct() {
+        return $this->servers()
+            ->with('product')
+            ->get();
     }
     }
 
 
     /**
     /**

+ 59 - 0
app/Notifications/ReferralNotification.php

@@ -0,0 +1,59 @@
+<?php
+
+namespace App\Notifications;
+
+use App\Models\User;
+use Illuminate\Bus\Queueable;
+use Illuminate\Notifications\Notification;
+use Illuminate\Support\Facades\Auth;
+
+class ReferralNotification extends Notification
+
+{
+    use Queueable;
+    /**
+     * @var User
+     */
+    private $user;
+
+    /**
+     * Create a new notification instance.
+     *
+     * @param User $user
+     */
+    public function __construct(int $user, int $ref_user)
+    {
+        $this->user = User::findOrFail($user);
+        $this->ref_user = User::findOrFail($ref_user);
+    }
+
+    /**
+     * Get the notification's delivery channels.
+     *
+     * @param mixed $notifiable
+     * @return array
+     */
+    public function via($notifiable)
+    {
+        return ['database'];
+    }
+
+    /**
+     * Get the array representation of the notification.
+     *
+     * @param mixed $notifiable
+     * @return array
+     */
+    public function toArray($notifiable)
+    {
+        return [
+            'title' => __("Someone registered using your Code!"),
+            'content' => "
+                <p>You received ".config('SETTINGS::REFERRAL::REWARD')." ".config('SETTINGS::SYSTEM:CREDITS_DISPLAY_NAME')."</p>
+                <p>because ".$this->ref_user->name." registered with your Referral-Code!</p>
+                <p>Thank you very much for supporting us!.</p>
+                <p>".config('app.name', 'Laravel')."</p>
+            ",
+        ];
+    }
+}

+ 1 - 1
config/app.php

@@ -4,7 +4,7 @@ use App\Models\Settings;
 
 
 return [
 return [
 
 
-    'version' => '0.7.5',
+    'version' => '0.7.6',
 
 
     /*
     /*
     |--------------------------------------------------------------------------
     |--------------------------------------------------------------------------

+ 56 - 0
database/migrations/2022_06_02_081655_referral_code.php

@@ -0,0 +1,56 @@
+<?php
+
+use App\Models\User;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Support\Str;
+
+class ReferralCode extends Migration
+{
+    
+    public function generateCode($userid){
+        
+            $random = STR::random(8);
+            if (User::where('referral_code', '=', $random)->doesntExist()) {
+                DB::table("users")
+                    ->where("id", "=", $userid)
+                    ->update(['referral_code' => $random]);
+            }else{
+                $this->generateCode($userid);
+            }
+    }
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('users', function (Blueprint $table) {
+            $table->string('referral_code')->lenght(8)->nullable();
+        });
+
+        $existing_user = User::where('referral_code', '')->orWhere('referral_code', NULL)->get();
+
+        foreach ($existing_user as $user) {
+            $this->generateCode($user->id);
+            }
+        }
+    
+
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('users', function (Blueprint $table) {
+            $table->dropColumn('referral_code');
+        });
+    }
+
+}

+ 35 - 0
database/migrations/2022_06_02_091921_table-user-referrals.php

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class TableUserReferrals extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('user_referrals', function (Blueprint $table) {
+            $table->unsignedBigInteger('referral_id');
+            $table->unsignedBigInteger('registered_user_id');
+            $table->foreign('referral_id')->references('id')->on('users')->onDelete('cascade');;
+            $table->foreign('registered_user_id')->references('id')->on('users')->onDelete('cascade');;
+            $table->timestamps();
+        });
+
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('user_referrals');
+    }
+}

+ 36 - 1
database/seeders/Seeds/SettingsSeeder.php

@@ -24,7 +24,7 @@ class SettingsSeeder extends Seeder
         ]);
         ]);
 
 
         Settings::firstOrCreate([
         Settings::firstOrCreate([
-            'key' => 'SETTINGS::USER:NITIAL_SERVER_LIMIT',
+            'key' => 'SETTINGS::USER:INITIAL_SERVER_LIMIT',
         ], [
         ], [
             'value'       => '1',
             'value'       => '1',
             'type'        => 'integer',
             'type'        => 'integer',
@@ -465,5 +465,40 @@ class SettingsSeeder extends Seeder
             'type'  => 'string',
             'type'  => 'string',
             'description'  => 'Mailer From Name'
             'description'  => 'Mailer From Name'
         ]);
         ]);
+        Settings::firstOrCreate([
+            'key'   => 'SETTINGS::REFERRAL::ENABLED',
+        ], [
+            'value' =>"true",
+            'type'  => 'string',
+            'description'  => 'Enable or disable the referral system'
+        ]);
+        Settings::firstOrCreate([
+            'key'   => 'SETTINGS::REFERRAL::REWARD',
+        ], [
+            'value' =>100,
+            'type'  => 'integer',
+            'description'  => 'Credit reward a user should receive when a user registers with his referral code'
+        ]);
+        Settings::firstOrCreate([
+            'key'   => 'SETTINGS::REFERRAL::ALLOWED',
+        ], [
+            'value' =>"client",
+            'type'  => 'string',
+            'description'  => 'Who should be allowed to to use the referral code. all/client'
+        ]);
+        Settings::firstOrCreate([
+            'key'   => 'SETTINGS::REFERRAL:MODE',
+        ], [
+            'value' =>"sign-up",
+            'type'  => 'string',
+            'description'  => 'Whether referrals get Credits on User-Registration or if a User buys credits'
+        ]);
+        Settings::firstOrCreate([
+            'key'   => 'SETTINGS::REFERRAL:PERCENTAGE',
+        ], [
+            'value' =>100,
+            'type'  => 'integer',
+            'description'  => 'The Percentage Value a referred user gets'
+        ]);
     }
     }
 }
 }

BIN
public/favicon.ico


BIN
public/images/bitsec.png


BIN
public/images/controlpanel_logo.png


+ 2 - 2
public/install/forms.php

@@ -269,8 +269,8 @@ if (isset($_POST['createUser'])) {
     }
     }
 
 
 
 
-
-    $query1 = "INSERT INTO `" . getEnvironmentValue("DB_DATABASE") . "`.`users` (`name`, `role`, `credits`, `server_limit`, `pterodactyl_id`, `email`, `password`, `created_at`) VALUES ('$name', 'admin', '250', '1', '$pteroID', '$mail', '$pass', CURRENT_TIMESTAMP)";
+    $random = generateRandomString();
+    $query1 = "INSERT INTO `" . getEnvironmentValue("DB_DATABASE") . "`.`users` (`name`, `role`, `credits`, `server_limit`, `pterodactyl_id`, `email`, `password`, `created_at`, `referral_code`) VALUES ('$name', 'admin', '250', '1', '$pteroID', '$mail', '$pass', CURRENT_TIMESTAMP, '$random')";
 
 
 
 
 
 

+ 11 - 0
public/install/functions.php

@@ -139,3 +139,14 @@ function wh_log($log_msg)
     // if you don't add `FILE_APPEND`, the file will be erased each time you add a log
     // if you don't add `FILE_APPEND`, the file will be erased each time you add a log
     file_put_contents($log_file_data, "[" . date('h:i:s') . "] " . $log_msg . "\n", FILE_APPEND);
     file_put_contents($log_file_data, "[" . date('h:i:s') . "] " . $log_msg . "\n", FILE_APPEND);
 }
 }
+
+
+function generateRandomString($length = 8) {
+    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+    $charactersLength = strlen($characters);
+    $randomString = '';
+    for ($i = 0; $i < $length; $i++) {
+        $randomString .= $characters[rand(0, $charactersLength - 1)];
+    }
+    return $randomString;
+}

+ 2 - 2
public/install/index.php

@@ -143,7 +143,7 @@ echo $cardheader;
                     <label for="databaseuser">Database User</label>
                     <label for="databaseuser">Database User</label>
                     <input x-model="databaseuser" id="databaseuser" name="databaseuser" type="text"
                     <input x-model="databaseuser" id="databaseuser" name="databaseuser" type="text"
                            required
                            required
-                           value="dashboarduser" class="form-control">
+                           value="controlpaneluser" class="form-control">
                 </div>
                 </div>
             </div>
             </div>
             <div class="form-group">
             <div class="form-group">
@@ -159,7 +159,7 @@ echo $cardheader;
                 <div class="custom-control mb-3">
                 <div class="custom-control mb-3">
                     <label for="database">Database</label>
                     <label for="database">Database</label>
                     <input x-model="database" id="database" name="database" type="text" required
                     <input x-model="database" id="database" name="database" type="text" required
-                           value="dashboard" class="form-control">
+                           value="controlpanel" class="form-control">
                 </div>
                 </div>
             </div>
             </div>
 
 

+ 10 - 12
resources/views/admin/activitylogs/index.blade.php

@@ -77,27 +77,25 @@
 		@endif</td>
 		@endif</td>
                                 <td>
                                 <td>
                                         <span>
                                         <span>
-                                            @switch($log->description)
-                                                @case('created')
+                                                @if(str_starts_with($log->description,"created"))
                                                 <small><i class="fas text-success fa-plus mr-2"></i></small>
                                                 <small><i class="fas text-success fa-plus mr-2"></i></small>
-                                                @break
-                                                @case('redeemed')
+                                                @elseif(str_starts_with($log->description,"redeemed"))
                                                 <small><i class="fas text-success fa-money-check-alt mr-2"></i></small>
                                                 <small><i class="fas text-success fa-money-check-alt mr-2"></i></small>
-                                                @break
-                                                @case('deleted')
+                                                 @elseif(str_starts_with($log->description,"deleted"))
                                                 <small><i class="fas text-danger fa-times mr-2"></i></small>
                                                 <small><i class="fas text-danger fa-times mr-2"></i></small>
-                                                @break
-                                                @case('updated')
+                                                 @elseif(str_starts_with($log->description,"gained"))
+                                                <small><i class="fas text-success fa-money-bill mr-2"></i></small>
+                                                 @elseif(str_starts_with($log->description,"updated"))
                                                 <small><i class="fas text-info fa-pen mr-2"></i></small>
                                                 <small><i class="fas text-info fa-pen mr-2"></i></small>
-                                                @break
-                                            @endswitch
-                                            {{ucfirst($log->description)}}
+                                                @endif
                                             {{ explode("\\" , $log->subject_type)[2]}}
                                             {{ explode("\\" , $log->subject_type)[2]}}
+                                            {{$log->description}}
+
 				            @php $first=true @endphp
 				            @php $first=true @endphp
 					    @foreach(json_decode($log->properties, true) as $properties)
 					    @foreach(json_decode($log->properties, true) as $properties)
 						@if($first)
 						@if($first)
 						    @if(isset($properties['name']))
 						    @if(isset($properties['name']))
-					    	       " {{$properties['name']}} "
+					    	       "{{$properties['name']}}"
 						    @endif
 						    @endif
 						    @if(isset($properties['email']))
 						    @if(isset($properties['email']))
 						       < {{$properties['email']}} >
 						       < {{$properties['email']}} >

+ 65 - 0
resources/views/admin/settings/tabs/misc.blade.php

@@ -184,7 +184,72 @@
                     </div>
                     </div>
                 </div>
                 </div>
             </div>
             </div>
+            <div class="col-md-3 px-3">
+                <div class="row mb-2">
+                    <div class="col text-center">
+                        <h1>Referral</h1>
+                    </div>
+                </div>
+
+                <div class="custom-control mb-3 p-0">
+                    <div class="col m-0 p-0 d-flex justify-content-between align-items-center">
+                        <div>
+                            <input value="true" id="enable_referral" name="enable_referral"
+                                   {{ config('SETTINGS::REFERRAL::ENABLED') == 'true' ? 'checked' : '' }}
+                                   type="checkbox">
+                            <label for="enable_referral">{{ __('Enable Referral') }} </label>
+                        </div>
+                    </div>
+                </div>
 
 
+                <div class="custom-control mb-3 p-0">
+                    <label for="referral_mode">{{ __('Mode') }}:
+                        <i data-toggle="popover" data-trigger="hover"
+                           data-content="{{ __('Should a reward be given if a new User registers or if a new user buys credits') }}" class="fas fa-info-circle"></i>
+                    </label>
+                    <select id="referral_mode" style="width:100%" class="custom-select" name="referral_mode" required
+                            autocomplete="off" @error('referral_mode') is-invalid @enderror>
+                        <option value="commission" @if (config('SETTINGS::REFERRAL:MODE') == "commission") selected
+                            @endif>{{ __("Commission") }}</option>
+                        <option value="sign-up" @if (config('SETTINGS::REFERRAL:MODE') == "sign-up") selected
+                            @endif>{{ __("Sign-Up") }}</option>
+                        <option value="both" @if (config('SETTINGS::REFERRAL:MODE') == "both") selected
+                            @endif>{{ __("Both") }}</option>
+                    </select>
+                </div>
+                <div class="form-group mb-3">
+                    <div class="custom-control p-0">
+                        <label for="referral_percentage">{{ __('Referral reward in percent') }} {{__("(only for commission-mode)")}}:
+                            <i data-toggle="popover" data-trigger="hover"
+                               data-content="{{ __('If a referred user buys credits, the referral-user will get x% of the Credits the referred user bought') }}" class="fas fa-info-circle"></i>
+                        </label>
+                        <input x-model="referral_percentage" id="referral_percentage" name="referral_percentage"
+                               type="number" value="{{ config('SETTINGS::REFERRAL:PERCENTAGE') }}"
+                               class="form-control @error('referral_percentage') is-invalid @enderror">
+                    </div>
+                </div>
+                <div class="form-group mb-3">
+                    <div class="custom-control p-0">
+                        <label for="referral_reward">{{ __('Referral reward in') }} {{ config('SETTINGS::SYSTEM:CREDITS_DISPLAY_NAME', 'Credits') }} {{__("(only for sign-up-mode)")}}:</label>
+                        <input x-model="referral_reward" id="referral_reward" name="referral_reward"
+                               type="number" value="{{ config('SETTINGS::REFERRAL::REWARD') }}"
+                               class="form-control @error('referral_reward') is-invalid @enderror">
+                    </div>
+                </div>
+                <div class="custom-control mb-3 p-0">
+                    <label for="referral_allowed">{{ __('Allowed') }}:
+                        <i data-toggle="popover" data-trigger="hover"
+                           data-content="{{ __('Who is allowed to see their referral-URL') }}" class="fas fa-info-circle"></i>
+                    </label>
+                    <select id="referral_allowed" style="width:100%" class="custom-select" name="referral_allowed" required
+                            autocomplete="off" @error('referral_allowed') is-invalid @enderror>
+                            <option value="everyone" @if (config('SETTINGS::REFERRAL::ALLOWED') == "everyone") selected
+                                @endif>{{ __("Everyone") }}</option>
+                        <option value="client" @if (config('SETTINGS::REFERRAL::ALLOWED') == "client") selected
+                            @endif>{{ __("Clients") }}</option>
+                    </select>
+                </div>
+            </div>
 
 
         </div>
         </div>
         <div class="row">
         <div class="row">

+ 2 - 1
resources/views/admin/store/edit.blade.php

@@ -48,7 +48,8 @@
                                     <label for="type">{{ __('Type') }}</label>
                                     <label for="type">{{ __('Type') }}</label>
                                     <select required name="type" id="type"
                                     <select required name="type" id="type"
                                         class="custom-select  @error('name') is-invalid @enderror">
                                         class="custom-select  @error('name') is-invalid @enderror">
-                                        <option selected value="Credits">{{ CREDITS_DISPLAY_NAME }}</option>
+                                        <option @if ($shopProduct->type == 'credits') selected @endif value="Credits">{{ CREDITS_DISPLAY_NAME }}</option>
+                                        <option @if ($shopProduct->type == 'Server slots') selected @endif value="Server slots">{{__("Server Slots")}}</option>
                                     </select>
                                     </select>
                                     @error('name')
                                     @error('name')
                                         <div class="text-danger">
                                         <div class="text-danger">

+ 2 - 0
resources/views/admin/users/index.blade.php

@@ -47,6 +47,7 @@
                             <th>{{__('Email')}}</th>
                             <th>{{__('Email')}}</th>
                             <th>{{CREDITS_DISPLAY_NAME}}</th>
                             <th>{{CREDITS_DISPLAY_NAME}}</th>
                             <th>{{__('Servers')}}</th>
                             <th>{{__('Servers')}}</th>
+                            <th>{{__("Referrals")}}</th>
                             <th>{{__('Verified')}}</th>
                             <th>{{__('Verified')}}</th>
                             <th>{{__('Last seen')}}</th>
                             <th>{{__('Last seen')}}</th>
                             <th></th>
                             <th></th>
@@ -90,6 +91,7 @@
                     {data: 'email', name: 'users.email'},
                     {data: 'email', name: 'users.email'},
                     {data: 'credits' , name : 'users.credits'},
                     {data: 'credits' , name : 'users.credits'},
                     {data: 'servers' , sortable : false},
                     {data: 'servers' , sortable : false},
+                    {data: 'referrals'},
                     {data: 'verified' , sortable : false},
                     {data: 'verified' , sortable : false},
                     {data: 'last_seen'},
                     {data: 'last_seen'},
                     {data: 'actions' , sortable : false},
                     {data: 'actions' , sortable : false},

+ 29 - 0
resources/views/admin/users/show.blade.php

@@ -244,8 +244,37 @@
                     @include('admin.servers.table' , ['filter' => '?user=' . $user->id])
                     @include('admin.servers.table' , ['filter' => '?user=' . $user->id])
 
 
                 </div>
                 </div>
+
             </div>
             </div>
+                <div class="card">
+                    <div class="card-header">
+                        <h5 class="card-title"><i class="fas fa-user-check mr-2"></i>{{__('Referals')}} ({{__("referral-code")}} : {{$user->referral_code}})</h5>
+                    </div>
+                    <div class="card-body table-responsive">
+
+
+                        @foreach($referrals as $referral)
+                        <div class="col-lg-6">
+                            <div class="row">
+                                <div class="col-lg-4">
+                                    <label>User ID: {{$referral->id}}</label>
+                                </div>
+                                <div class="col-lg-4">
+                                       <span style="max-width: 250px;" class="d-inline-block text-truncate">
+                                           <i class="fas fa-user-check mr-2"></i><a href="{{route("admin.users.show",$referral->id)}}">{{$referral->name}}</a>
+                                       </span>
+                                </div>
+                                <div class="col-lg-4">
+                                       <span style="max-width: 250px;" class="d-inline-block text-truncate">
+                                           <i class="fas fa-clock mr-2"></i>{{$referral->created_at->diffForHumans()}}
+                                       </span>
+                                </div>
+                            </div>
+                        </div>
+                        @endforeach
+                    </div>
 
 
+                </div>
 
 
         </div>
         </div>
         <!-- END CUSTOM CONTENT -->
         <!-- END CUSTOM CONTENT -->

+ 10 - 1
resources/views/auth/register.blade.php

@@ -91,7 +91,16 @@
                             </div>
                             </div>
                         </div>
                         </div>
                     </div>
                     </div>
-
+                    @if(config('SETTINGS::REFERRAL::ENABLED') == "true")
+                        <div class="input-group mb-3">
+                            <input type="text" value="{{ \Request::get('ref') }}" class="form-control" name="referral_code" placeholder="{{__('Referral code')}} ( {{__("optional")}} )">
+                            <div class="input-group-append">
+                                <div class="input-group-text">
+                                    <span class="fas fa-user-check"></span>
+                                </div>
+                            </div>
+                        </div>
+                    @endif
                     <div class="input-group mb-3">
                     <div class="input-group mb-3">
                         {!! htmlFormSnippet() !!}
                         {!! htmlFormSnippet() !!}
                         @error('g-recaptcha-response')
                         @error('g-recaptcha-response')

+ 12 - 15
resources/views/home.blade.php

@@ -144,22 +144,19 @@
         as $log)
         as $log)
                                 <li class="list-group-item d-flex justify-content-between text-muted">
                                 <li class="list-group-item d-flex justify-content-between text-muted">
                                     <span>
                                     <span>
-                                        @switch($log->description)
-                                            @case('created')
-                                                <small><i class="fas text-success fa-plus mr-2"></i></small>
-                                            @break
-                                            @case('redeemed')
-                                                <small><i class="fas text-success fa-money-check-alt mr-2"></i></small>
-                                            @break
-                                            @case('deleted')
-                                                <small><i class="fas text-danger fa-times mr-2"></i></small>
-                                            @break
-                                            @case('updated')
-                                                <small><i class="fas text-info fa-pen mr-2"></i></small>
-                                            @break
-                                        @endswitch
-                                        {{ ucfirst($log->description) }}
+                                        @if(str_starts_with($log->description,"created"))
+                                            <small><i class="fas text-success fa-plus mr-2"></i></small>
+                                        @elseif(str_starts_with($log->description,"redeemed"))
+                                            <small><i class="fas text-success fa-money-check-alt mr-2"></i></small>
+                                        @elseif(str_starts_with($log->description,"deleted"))
+                                            <small><i class="fas text-danger fa-times mr-2"></i></small>
+                                        @elseif(str_starts_with($log->description,"gained"))
+                                            <small><i class="fas text-success fa-money-bill mr-2"></i></small>
+                                        @elseif(str_starts_with($log->description,"updated"))
+                                            <small><i class="fas text-info fa-pen mr-2"></i></small>
+                                        @endif
                                         {{ explode('\\', $log->subject_type)[2] }}
                                         {{ explode('\\', $log->subject_type)[2] }}
+                                        {{ ucfirst($log->description) }}
                                     </span>
                                     </span>
                                     <small>
                                     <small>
                                         {{ $log->created_at->diffForHumans() }}
                                         {{ $log->created_at->diffForHumans() }}

+ 4 - 1
resources/views/layouts/main.blade.php

@@ -112,6 +112,9 @@
                         <div class="dropdown-divider"></div>
                         <div class="dropdown-divider"></div>
                         <a href="{{ route('notifications.index') }}"
                         <a href="{{ route('notifications.index') }}"
                             class="dropdown-item dropdown-footer">{{ __('See all Notifications') }}</a>
                             class="dropdown-item dropdown-footer">{{ __('See all Notifications') }}</a>
+                        <div class="dropdown-divider"></div>
+                        <a href="{{ route('notifications.readAll') }}"
+                           class="dropdown-item dropdown-footer">{{ __('Mark all as read') }}</a>
                     </div>
                     </div>
                 </li>
                 </li>
 
 
@@ -182,7 +185,7 @@
             <!-- Brand Logo -->
             <!-- Brand Logo -->
             <a href="{{ route('home') }}" class="brand-link">
             <a href="{{ route('home') }}" class="brand-link">
                 <img width="64" height="64"
                 <img width="64" height="64"
-                    src="{{ \Illuminate\Support\Facades\Storage::disk('public')->exists('icon.png')? asset('storage/icon.png'): asset('images/bitsec.png') }}"
+                    src="{{ \Illuminate\Support\Facades\Storage::disk('public')->exists('icon.png')? asset('storage/icon.png'): asset('images/controlpanel_logo.png') }}"
                     alt="{{ config('app.name', 'Laravel') }} Logo" class="brand-image img-circle"
                     alt="{{ config('app.name', 'Laravel') }} Logo" class="brand-image img-circle"
                     style="opacity: .8">
                     style="opacity: .8">
                 <span class="brand-text font-weight-light">{{ config('app.name', 'Laravel') }}</span>
                 <span class="brand-text font-weight-light">{{ config('app.name', 'Laravel') }}</span>

+ 4 - 0
resources/views/notifications/index.blade.php

@@ -29,6 +29,10 @@
                 <div class="col-md-8">
                 <div class="col-md-8">
                     <p>{{__('All notifications')}}</p>
                     <p>{{__('All notifications')}}</p>
                 </div>
                 </div>
+                    <a class="float-right">
+                        <a href="{{route('notifications.readAll')}}"><button class="btn btn-info btn-xs">{{__('Mark all as read')}}</button></a>
+
+
                 @foreach($notifications as $notification)
                 @foreach($notifications as $notification)
                     <div class="col-md-8">
                     <div class="col-md-8">
                         <div class="card">
                         <div class="card">

+ 189 - 141
resources/views/profile/index.blade.php

@@ -12,7 +12,7 @@
                     <ol class="breadcrumb float-sm-right">
                     <ol class="breadcrumb float-sm-right">
                         <li class="breadcrumb-item"><a href="{{ route('home') }}">{{ __('Dashboard') }}</a></li>
                         <li class="breadcrumb-item"><a href="{{ route('home') }}">{{ __('Dashboard') }}</a></li>
                         <li class="breadcrumb-item"><a class="text-muted"
                         <li class="breadcrumb-item"><a class="text-muted"
-                                href="{{ route('profile.index') }}">{{ __('Profile') }}</a>
+                                                       href="{{ route('profile.index') }}">{{ __('Profile') }}</a>
                         </li>
                         </li>
                     </ol>
                     </ol>
                 </div>
                 </div>
@@ -33,7 +33,7 @@
                             </h5>
                             </h5>
                             {{ __('You have not yet verified your email address') }}
                             {{ __('You have not yet verified your email address') }}
                             <a class="text-primary"
                             <a class="text-primary"
-                                href="{{ route('verification.send') }}">{{ __('Click here to resend verification email') }}</a>
+                               href="{{ route('verification.send') }}">{{ __('Click here to resend verification email') }}</a>
                             <br>
                             <br>
                             {{ __('Please contact support If you didnt receive your verification email.') }}
                             {{ __('Please contact support If you didnt receive your verification email.') }}
 
 
@@ -43,16 +43,18 @@
                     @if (is_null(Auth::user()->discordUser) && strtolower($force_discord_verification) == 'true')
                     @if (is_null(Auth::user()->discordUser) && strtolower($force_discord_verification) == 'true')
                         @if (!empty(config('SETTINGS::DISCORD:CLIENT_ID')) && !empty(config('SETTINGS::DISCORD:CLIENT_SECRET')))
                         @if (!empty(config('SETTINGS::DISCORD:CLIENT_ID')) && !empty(config('SETTINGS::DISCORD:CLIENT_SECRET')))
                             <div class="alert alert-warning p-2 m-2">
                             <div class="alert alert-warning p-2 m-2">
-                                <h5><i class="icon fas fa-exclamation-circle"></i>{{ __('Required Discord verification!') }}
+                                <h5>
+                                    <i class="icon fas fa-exclamation-circle"></i>{{ __('Required Discord verification!') }}
                                 </h5>
                                 </h5>
                                 {{ __('You have not yet verified your discord account') }}
                                 {{ __('You have not yet verified your discord account') }}
                                 <a class="text-primary"
                                 <a class="text-primary"
-                                    href="{{ route('auth.redirect') }}">{{ __('Login with discord') }}</a> <br>
+                                   href="{{ route('auth.redirect') }}">{{ __('Login with discord') }}</a> <br>
                                 {{ __('Please contact support If you face any issues.') }}
                                 {{ __('Please contact support If you face any issues.') }}
                             </div>
                             </div>
                         @else
                         @else
                             <div class="alert alert-danger p-2 m-2">
                             <div class="alert alert-danger p-2 m-2">
-                                <h5><i class="icon fas fa-exclamation-circle"></i>{{ __('Required Discord verification!') }}
+                                <h5>
+                                    <i class="icon fas fa-exclamation-circle"></i>{{ __('Required Discord verification!') }}
                                 </h5>
                                 </h5>
                                 {{ __('Due to system settings you are required to verify your discord account!') }} <br>
                                 {{ __('Due to system settings you are required to verify your discord account!') }} <br>
                                 {{ __('It looks like this hasnt been set-up correctly! Please contact support.') }}'
                                 {{ __('It looks like this hasnt been set-up correctly! Please contact support.') }}'
@@ -72,9 +74,10 @@
                             <div class="row">
                             <div class="row">
                                 <div class="col-12 col-sm-auto mb-4">
                                 <div class="col-12 col-sm-auto mb-4">
                                     <div class="slim rounded-circle  border-secondary border text-gray-dark"
                                     <div class="slim rounded-circle  border-secondary border text-gray-dark"
-                                        data-label="Change your avatar" data-max-file-size="3"
-                                        data-save-initial-image="true" style="width: 140px;height:140px; cursor: pointer"
-                                        data-size="140,140">
+                                         data-label="Change your avatar" data-max-file-size="3"
+                                         data-save-initial-image="true"
+                                         style="width: 140px;height:140px; cursor: pointer"
+                                         data-size="140,140">
                                         <img src="{{ $user->getAvatar() }}" alt="avatar">
                                         <img src="{{ $user->getAvatar() }}" alt="avatar">
                                     </div>
                                     </div>
                                 </div>
                                 </div>
@@ -84,10 +87,11 @@
                                         <p class="mb-0">{{ $user->email }}
                                         <p class="mb-0">{{ $user->email }}
                                             @if ($user->hasVerifiedEmail())
                                             @if ($user->hasVerifiedEmail())
                                                 <i data-toggle="popover" data-trigger="hover" data-content="Verified"
                                                 <i data-toggle="popover" data-trigger="hover" data-content="Verified"
-                                                    class="text-success fas fa-check-circle"></i>
+                                                   class="text-success fas fa-check-circle"></i>
                                             @else
                                             @else
-                                                <i data-toggle="popover" data-trigger="hover" data-content="Not verified"
-                                                    class="text-danger fas fa-exclamation-circle"></i>
+                                                <i data-toggle="popover" data-trigger="hover"
+                                                   data-content="Not verified"
+                                                   class="text-danger fas fa-exclamation-circle"></i>
                                             @endif
                                             @endif
 
 
                                         </p>
                                         </p>
@@ -95,193 +99,237 @@
                                             <span class="badge badge-primary"><i
                                             <span class="badge badge-primary"><i
                                                     class="fa fa-coins mr-2"></i>{{ $user->Credits() }}</span>
                                                     class="fa fa-coins mr-2"></i>{{ $user->Credits() }}</span>
                                         </div>
                                         </div>
-                                    </div>
 
 
-                                    <div class="text-center text-sm-right"><span
-                                            class="badge badge-secondary">{{ $user->role }}</span>
-                                        <div class="text-muted">
-                                            <small>{{ $user->created_at->isoFormat('LL') }}</small>
+                                    @if(config('SETTINGS::REFERRAL::ENABLED') == "true")
+                                        @if((config('SETTINGS::REFERRAL::ALLOWED') == "client" && $user->role != "member") || config('SETTINGS::REFERRAL::ALLOWED') == "everyone")
+                                            <div class="mt-1">
+                                                    <span class="badge badge-success"><i
+                                                            class="fa fa-user-check mr-2"></i>
+                                                        {{_("Referral URL")}} :
+                                                        <span onclick="onClickCopy()" id="RefLink" style="cursor: pointer;">
+                                                            {{route("register")}}?ref={{$user->referral_code}}</span>
+                                                    </span>
+                                                @else
+                                                    <span class="badge badge-warning"><i
+                                                            class="fa fa-user-check mr-2"></i>
+                                                        {{_("Make a purchase to reveal your referral-URL")}}</span>
+                                        @endif
+                                            </div>
+                                        @endif
+                                        </div>
+
+                                        <div class="text-center text-sm-right"><span
+                                                class="badge {{$badgeColor}}">{{ $user->role }}</span>
+                                            <div class="text-muted">
+                                                <small>{{ $user->created_at->isoFormat('LL') }}</small>
+                                            </div>
                                         </div>
                                         </div>
                                     </div>
                                     </div>
                                 </div>
                                 </div>
-                            </div>
-                            <ul class="nav nav-tabs">
-                                <li class="nav-item"><a href="javasript:void(0)"
-                                        class="active nav-link">{{ __('Settings') }}</a>
-                                </li>
-                            </ul>
-                            <div class="tab-content pt-3">
-                                <div class="tab-pane active">
-                                    <div class="row">
-                                        <div class="col">
-                                            <div class="row">
-                                                <div class="col">
-                                                    @if( $errors->has('pterodactyl_error_message') )
-                                                        @foreach( $errors->get('pterodactyl_error_message') as $err )
-                                                            <span class="text-danger" role="alert">
-                                                                <small><strong>{{ $err }}</strong></small>
-                                                            </span>
-                                                        @endforeach
-                                                    @endif
-                                                        @if( $errors->has('pterodactyl_error_status') )
-                                                            @foreach( $errors->get('pterodactyl_error_status') as $err )
+                                <ul class="nav nav-tabs">
+                                    <li class="nav-item"><a href="javasript:void(0)"
+                                                            class="active nav-link">{{ __('Settings') }}</a>
+                                    </li>
+                                </ul>
+                                <div class="tab-content pt-3">
+                                    <div class="tab-pane active">
+                                        <div class="row">
+                                            <div class="col">
+                                                <div class="row">
+                                                    <div class="col">
+                                                        @if( $errors->has('pterodactyl_error_message') )
+                                                            @foreach( $errors->get('pterodactyl_error_message') as $err )
                                                                 <span class="text-danger" role="alert">
                                                                 <span class="text-danger" role="alert">
                                                                     <small><strong>{{ $err }}</strong></small>
                                                                     <small><strong>{{ $err }}</strong></small>
                                                                 </span>
                                                                 </span>
                                                             @endforeach
                                                             @endforeach
                                                         @endif
                                                         @endif
-                                                    <div class="form-group"><label>{{__('Name')}}</label> <input
-                                                            class="form-control @error('name') is-invalid @enderror"
-                                                            type="text" name="name" placeholder="{{ $user->name }}"
-                                                            value="{{ $user->name }}">
+                                                        @if( $errors->has('pterodactyl_error_status') )
+                                                            @foreach( $errors->get('pterodactyl_error_status') as $err )
+                                                                <span class="text-danger" role="alert">
+                                                                        <small><strong>{{ $err }}</strong></small>
+                                                                    </span>
+                                                            @endforeach
+                                                        @endif
+                                                        <div class="form-group"><label>{{__('Name')}}</label> <input
+                                                                class="form-control @error('name') is-invalid @enderror"
+                                                                type="text" name="name" placeholder="{{ $user->name }}"
+                                                                value="{{ $user->name }}">
 
 
-                                                        @error('name')
+                                                            @error('name')
                                                             <div class="invalid-feedback">
                                                             <div class="invalid-feedback">
                                                                 {{ $message }}
                                                                 {{ $message }}
                                                             </div>
                                                             </div>
-                                                        @enderror
+                                                            @enderror
+                                                        </div>
                                                     </div>
                                                     </div>
                                                 </div>
                                                 </div>
-                                            </div>
-                                            <div class="row">
-                                                <div class="col">
-                                                    <div class="form-group"><label>{{ __('Email') }}</label> <input
-                                                            class="form-control @error('email') is-invalid @enderror"
-                                                            type="text" placeholder="{{ $user->email }}" name="email"
-                                                            value="{{ $user->email }}">
+                                                <div class="row">
+                                                    <div class="col">
+                                                        <div class="form-group"><label>{{ __('Email') }}</label> <input
+                                                                class="form-control @error('email') is-invalid @enderror"
+                                                                type="text" placeholder="{{ $user->email }}" name="email"
+                                                                value="{{ $user->email }}">
 
 
-                                                        @error('email')
+                                                            @error('email')
                                                             <div class="invalid-feedback">
                                                             <div class="invalid-feedback">
                                                                 {{ $message }}
                                                                 {{ $message }}
                                                             </div>
                                                             </div>
-                                                        @enderror
+                                                            @enderror
+                                                        </div>
                                                     </div>
                                                     </div>
                                                 </div>
                                                 </div>
                                             </div>
                                             </div>
                                         </div>
                                         </div>
-                                    </div>
-                                    <div class="row">
-                                        <div class="col-12 col-sm-6 mb-3">
-                                            <div class="mb-3"><b>{{ __('Change Password') }}</b></div>
-                                            <div class="row">
-                                                <div class="col">
-                                                    <div class="form-group">
-                                                        <label>{{ __('Current Password') }}</label>
-                                                        <input
-                                                            class="form-control @error('current_password') is-invalid @enderror"
-                                                            name="current_password" type="password" placeholder="••••••">
+                                        <div class="row">
+                                            <div class="col-12 col-sm-6 mb-3">
+                                                <div class="mb-3"><b>{{ __('Change Password') }}</b></div>
+                                                <div class="row">
+                                                    <div class="col">
+                                                        <div class="form-group">
+                                                            <label>{{ __('Current Password') }}</label>
+                                                            <input
+                                                                class="form-control @error('current_password') is-invalid @enderror"
+                                                                name="current_password" type="password"
+                                                                placeholder="••••••">
 
 
-                                                        @error('current_password')
+                                                            @error('current_password')
                                                             <div class="invalid-feedback">
                                                             <div class="invalid-feedback">
                                                                 {{ $message }}
                                                                 {{ $message }}
                                                             </div>
                                                             </div>
-                                                        @enderror
+                                                            @enderror
+                                                        </div>
                                                     </div>
                                                     </div>
                                                 </div>
                                                 </div>
-                                            </div>
-                                            <div class="row">
-                                                <div class="col">
-                                                    <div class="form-group"><label>{{ __('New Password') }}</label>
-                                                        <input
-                                                            class="form-control @error('new_password') is-invalid @enderror"
-                                                            name="new_password" type="password" placeholder="••••••">
+                                                <div class="row">
+                                                    <div class="col">
+                                                        <div class="form-group"><label>{{ __('New Password') }}</label>
+                                                            <input
+                                                                class="form-control @error('new_password') is-invalid @enderror"
+                                                                name="new_password" type="password" placeholder="••••••">
 
 
-                                                        @error('new_password')
+                                                            @error('new_password')
                                                             <div class="invalid-feedback">
                                                             <div class="invalid-feedback">
                                                                 {{ $message }}
                                                                 {{ $message }}
                                                             </div>
                                                             </div>
-                                                        @enderror
+                                                            @enderror
+                                                        </div>
                                                     </div>
                                                     </div>
                                                 </div>
                                                 </div>
-                                            </div>
-                                            <div class="row">
-                                                <div class="col">
-                                                    <div class="form-group">
-                                                        <label>{{ __('Confirm Password') }}</span></label>
-                                                        <input
-                                                            class="form-control @error('new_password_confirmation') is-invalid @enderror"
-                                                            name="new_password_confirmation" type="password"
-                                                            placeholder="••••••">
+                                                <div class="row">
+                                                    <div class="col">
+                                                        <div class="form-group">
+                                                            <label>{{ __('Confirm Password') }}</span></label>
+                                                            <input
+                                                                class="form-control @error('new_password_confirmation') is-invalid @enderror"
+                                                                name="new_password_confirmation" type="password"
+                                                                placeholder="••••••">
 
 
-                                                        @error('new_password_confirmation')
+                                                            @error('new_password_confirmation')
                                                             <div class="invalid-feedback">
                                                             <div class="invalid-feedback">
                                                                 {{ $message }}
                                                                 {{ $message }}
                                                             </div>
                                                             </div>
-                                                        @enderror
+                                                            @enderror
+                                                        </div>
                                                     </div>
                                                     </div>
                                                 </div>
                                                 </div>
                                             </div>
                                             </div>
-                                        </div>
-                                        @if (!empty(config('SETTINGS::DISCORD:CLIENT_ID')) && !empty(config('SETTINGS::DISCORD:CLIENT_SECRET')))
-                                            <div class="col-12 col-sm-5 offset-sm-1 mb-3">
-                                                @if (is_null(Auth::user()->discordUser))
-                                                    <b>{{ __('Link your discord account!') }}</b>
-                                                    <div class="verify-discord">
-                                                        <div class="mb-3">
-                                                            @if ($credits_reward_after_verify_discord)
-                                                                <p>{{ __('By verifying your discord account, you receive extra Credits and increased Server amounts') }}
-                                                                </p>
-                                                            @endif
+                                            @if (!empty(config('SETTINGS::DISCORD:CLIENT_ID')) && !empty(config('SETTINGS::DISCORD:CLIENT_SECRET')))
+                                                <div class="col-12 col-sm-5 offset-sm-1 mb-3">
+                                                    @if (is_null(Auth::user()->discordUser))
+                                                        <b>{{ __('Link your discord account!') }}</b>
+                                                        <div class="verify-discord">
+                                                            <div class="mb-3">
+                                                                @if ($credits_reward_after_verify_discord)
+                                                                    <p>{{ __('By verifying your discord account, you receive extra Credits and increased Server amounts') }}
+                                                                    </p>
+                                                                @endif
+                                                            </div>
                                                         </div>
                                                         </div>
-                                                    </div>
 
 
-                                                    <a class="btn btn-light" href="{{ route('auth.redirect') }}">
-                                                        <i class="fab fa-discord mr-2"></i>{{ __('Login with Discord') }}
-                                                    </a>
-                                                @else
-                                                    <div class="verified-discord">
-                                                        <div class="my-3 callout callout-info">
-                                                            <p>{{ __('You are verified!') }}</p>
+                                                        <a class="btn btn-light" href="{{ route('auth.redirect') }}">
+                                                            <i class="fab fa-discord mr-2"></i>{{ __('Login with Discord') }}
+                                                        </a>
+                                                    @else
+                                                        <div class="verified-discord">
+                                                            <div class="my-3 callout callout-info">
+                                                                <p>{{ __('You are verified!') }}</p>
+                                                            </div>
                                                         </div>
                                                         </div>
-                                                    </div>
-                                                    <div class="row pl-2">
-                                                        <div class="small-box bg-dark">
-                                                            <div class="d-flex justify-content-between">
-                                                                <div class="p-3">
-                                                                    <h3>{{ $user->discordUser->username }}
-                                                                        <sup>{{ $user->discordUser->locale }}</sup>
-                                                                    </h3>
-                                                                    <p>{{ $user->discordUser->id }}
-                                                                    </p>
+                                                        <div class="row pl-2">
+                                                            <div class="small-box bg-dark">
+                                                                <div class="d-flex justify-content-between">
+                                                                    <div class="p-3">
+                                                                        <h3>{{ $user->discordUser->username }}
+                                                                            <sup>{{ $user->discordUser->locale }}</sup>
+                                                                        </h3>
+                                                                        <p>{{ $user->discordUser->id }}
+                                                                        </p>
+                                                                    </div>
+                                                                    <div class="p-3"><img width="100px"
+                                                                                          height="100px"
+                                                                                          class="rounded-circle"
+                                                                                          src="{{ $user->discordUser->getAvatar() }}"
+                                                                                          alt="avatar"></div>
+                                                                </div>
+                                                                <div class="small-box-footer">
+                                                                    <a href="{{ route('auth.redirect') }}">
+                                                                        <i
+                                                                            class="fab fa-discord mr-1"></i>{{ __('Re-Sync Discord') }}
+                                                                    </a>
                                                                 </div>
                                                                 </div>
-                                                                <div class="p-3"><img width="100px"
-                                                                        height="100px" class="rounded-circle"
-                                                                        src="{{ $user->discordUser->getAvatar() }}"
-                                                                        alt="avatar"></div>
-                                                            </div>
-                                                            <div class="small-box-footer">
-                                                                <a href="{{ route('auth.redirect') }}">
-                                                                    <i
-                                                                        class="fab fa-discord mr-1"></i>{{ __('Re-Sync Discord') }}
-                                                                </a>
                                                             </div>
                                                             </div>
                                                         </div>
                                                         </div>
-                                                    </div>
-                                                @endif
+                                                    @endif
 
 
+                                                </div>
+                                            @endif
+                                        </div>
+                                        <div class="row">
+                                            <div class="col d-flex justify-content-end">
+                                                <button class="btn btn-primary"
+                                                        type="submit">{{ __('Save Changes') }}</button>
                                             </div>
                                             </div>
-                                        @endif
-                                    </div>
-                                    <div class="row">
-                                        <div class="col d-flex justify-content-end">
-                                            <button class="btn btn-primary"
-                                                type="submit">{{ __('Save Changes') }}</button>
                                         </div>
                                         </div>
-                                    </div>
 
 
+                                    </div>
                                 </div>
                                 </div>
                             </div>
                             </div>
                         </div>
                         </div>
                     </div>
                     </div>
-                </div>
-            </form>
+                </form>
 
 
 
 
-        </div>
-        <!-- END CUSTOM CONTENT -->
+            </div>
+            <!-- END CUSTOM CONTENT -->
 
 
-        </div>
-    </section>
-    <!-- END CONTENT -->
+            </div>
+        </section>
+        <!-- END CONTENT -->
+    <script>
+        function onClickCopy() {
+            let textToCopy = document.getElementById('RefLink').innerText;
+            if(navigator.clipboard) {
+                navigator.clipboard.writeText(textToCopy).then(() => {
+                    Swal.fire({
+                        icon: 'success',
+                        title: '{{ __("URL copied to clipboard")}}',
+                        position: 'top-middle',
+                        showConfirmButton: false,
+                        background: '#343a40',
+                        toast: false,
+                        timer: 1000,
+                        timerProgressBar: true,
+                        didOpen: (toast) => {
+                            toast.addEventListener('mouseenter', Swal.stopTimer)
+                            toast.addEventListener('mouseleave', Swal.resumeTimer)
+                        }
+                    })
+                })
+            } else {
+                console.log('Browser Not compatible')
+            }
+        }
+    </script>
+    @endsection
 
 
-@endsection

+ 1 - 0
routes/web.php

@@ -58,6 +58,7 @@ Route::middleware(['auth', 'checkSuspended'])->group(function () {
     })->middleware(['auth', 'throttle:3,1'])->name('verification.send');
     })->middleware(['auth', 'throttle:3,1'])->name('verification.send');
 
 
     #normal routes
     #normal routes
+    Route::get('notifications/readAll',[NotificationController::class,'readAll'])->name('notifications.readAll');
     Route::resource('notifications', NotificationController::class);
     Route::resource('notifications', NotificationController::class);
     Route::resource('servers', ServerController::class);
     Route::resource('servers', ServerController::class);
     Route::resource('profile', ProfileController::class);
     Route::resource('profile', ProfileController::class);