From 378187aea0811ab2d7abbe18331807da33c1899c Mon Sep 17 00:00:00 2001 From: 1Day Date: Thu, 2 Jun 2022 16:11:24 +0200 Subject: [PATCH] Referal System --- app/Classes/Settings/Misc.php | 5 + app/Http/Controllers/Admin/UserController.php | 18 +++- .../Controllers/Auth/RegisterController.php | 35 +++++++ app/Models/User.php | 3 +- app/Notifications/ReferralNotification.php | 59 ++++++++++++ .../2022_06_02_081655_referral_code.php | 53 +++++++++++ ...2022_06_02_091921_table-user-referrals.php | 35 +++++++ database/seeders/Seeds/SettingsSeeder.php | 14 +++ .../views/admin/settings/tabs/misc.blade.php | 26 +++++ resources/views/admin/users/index.blade.php | 2 + resources/views/admin/users/show.blade.php | 31 +++++- resources/views/auth/register.blade.php | 11 ++- resources/views/profile/index.blade.php | 95 +++++++++++-------- 13 files changed, 345 insertions(+), 42 deletions(-) create mode 100644 app/Notifications/ReferralNotification.php create mode 100644 database/migrations/2022_06_02_081655_referral_code.php create mode 100644 database/migrations/2022_06_02_091921_table-user-referrals.php diff --git a/app/Classes/Settings/Misc.php b/app/Classes/Settings/Misc.php index beaa3a44..e0404f7a 100644 --- a/app/Classes/Settings/Misc.php +++ b/app/Classes/Settings/Misc.php @@ -37,6 +37,8 @@ class Misc 'mailencryption' => 'nullable|string', 'mailfromadress' => 'nullable|string', 'mailfromname' => 'nullable|string', + 'enable_referral' => 'nullable|string', + 'referral_reward' => 'nullable|numeric', ]); if ($validator->fails()) { @@ -69,6 +71,9 @@ class Misc "SETTINGS::MAIL:ENCRYPTION" => "mailencryption", "SETTINGS::MAIL:FROM_ADDRESS" => "mailfromadress", "SETTINGS::MAIL:FROM_NAME" => "mailfromname", + "SETTINGS::REFERRAL::ENABLED" => "enable_referral", + "SETTINGS::REFERRAL::REWARD" => "referral_reward" + ]; diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 7c293a58..963069ad 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -8,6 +8,7 @@ use App\Http\Controllers\Controller; use App\Models\Settings; use App\Models\User; use App\Notifications\DynamicNotification; +use Illuminate\Support\Facades\DB; use Spatie\QueryBuilder\QueryBuilder; use Exception; use Illuminate\Contracts\Foundation\Application; @@ -52,8 +53,18 @@ class UserController extends Controller */ 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([ - 'user' => $user + 'user' => $user, + 'referrals' => $allReferals ]); } @@ -258,6 +269,9 @@ class UserController extends Controller ->addColumn('servers', function (User $user) { 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) { return $user->discordUser ? $user->discordUser->id : ''; }) @@ -307,7 +321,7 @@ class UserController extends Controller ->orderColumn('last_seen', function ($query) { $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); } } diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index c4c3ba2a..580781aa 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -6,9 +6,13 @@ use App\Classes\Pterodactyl; use App\Http\Controllers\Controller; use App\Models\Settings; use App\Models\User; +use App\Notifications\ReferralNotification; use App\Providers\RouteServiceProvider; +use Carbon\Carbon; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; use Illuminate\Support\Str; @@ -78,6 +82,18 @@ class RegisterController extends Controller 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. * @@ -92,6 +108,8 @@ class RegisterController extends Controller 'credits' => config('SETTINGS::USER:INITIAL_CREDITS', 150), 'server_limit' => config('SETTINGS::USER:INITIAL_SERVER_LIMIT', 1), 'password' => Hash::make($data['password']), + 'referral_code' => $this->createReferralCode(), + ]); $response = Pterodactyl::client()->post('/application/users', [ @@ -116,7 +134,24 @@ class RegisterController extends Controller '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()) { + $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() + ]); + } + + } return $user; } diff --git a/app/Models/User.php b/app/Models/User.php index 3767cf4e..84d87f76 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -60,7 +60,8 @@ class User extends Authenticatable implements MustVerifyEmail 'pterodactyl_id', 'discord_verified_at', 'avatar', - 'suspended' + 'suspended', + 'referral_code' ]; /** diff --git a/app/Notifications/ReferralNotification.php b/app/Notifications/ReferralNotification.php new file mode 100644 index 00000000..1f48df37 --- /dev/null +++ b/app/Notifications/ReferralNotification.php @@ -0,0 +1,59 @@ +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' => " +

You received ".config('SETTINGS::REFERRAL::REWARD')." ".config('SETTINGS::SYSTEM:CREDITS_DISPLAY_NAME')."

+

because ".$this->ref_user->name." registered with your Referral-Code!

+

Thank you very much for supporting us!.

+

".config('app.name', 'Laravel')."

+ ", + ]; + } +} diff --git a/database/migrations/2022_06_02_081655_referral_code.php b/database/migrations/2022_06_02_081655_referral_code.php new file mode 100644 index 00000000..e29d1493 --- /dev/null +++ b/database/migrations/2022_06_02_081655_referral_code.php @@ -0,0 +1,53 @@ +string('referral_code')->lenght(8)->nullable(); + }); + + $existing_user = User::where('referral_code', '')->get(); + + foreach ($existing_user as $user) { + $random = STR::random(8); + if (User::where('referral_code', '=', $random)->doesntExist()) { + DB::table("users") + ->where("id", "=", $user->id) + ->update(['referral_code' => $random]); + }else{ + $random = STR::random(8); + DB::table("users") + ->where("id", "=", $user->id) + ->update(['referral_code' => $random]); + } + } + } + + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('referral_code'); + }); + } + +} diff --git a/database/migrations/2022_06_02_091921_table-user-referrals.php b/database/migrations/2022_06_02_091921_table-user-referrals.php new file mode 100644 index 00000000..2734511b --- /dev/null +++ b/database/migrations/2022_06_02_091921_table-user-referrals.php @@ -0,0 +1,35 @@ +unsignedBigInteger('referral_id'); + $table->unsignedBigInteger('registered_user_id'); + $table->foreign('referral_id')->references('id')->on('users'); + $table->foreign('registered_user_id')->references('id')->on('users'); + $table->timestamps(); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_referrals'); + } +} diff --git a/database/seeders/Seeds/SettingsSeeder.php b/database/seeders/Seeds/SettingsSeeder.php index 31ada4a3..69abd413 100644 --- a/database/seeders/Seeds/SettingsSeeder.php +++ b/database/seeders/Seeds/SettingsSeeder.php @@ -465,5 +465,19 @@ class SettingsSeeder extends Seeder 'type' => 'string', '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' + ]); } } diff --git a/resources/views/admin/settings/tabs/misc.blade.php b/resources/views/admin/settings/tabs/misc.blade.php index bbbddb2a..a126b927 100644 --- a/resources/views/admin/settings/tabs/misc.blade.php +++ b/resources/views/admin/settings/tabs/misc.blade.php @@ -184,7 +184,33 @@ +
+
+
+

Referral

+
+
+
+
+
+ + +
+
+
+ +
+
+ + +
+
+
diff --git a/resources/views/admin/users/index.blade.php b/resources/views/admin/users/index.blade.php index 959e12a9..d22f4d11 100644 --- a/resources/views/admin/users/index.blade.php +++ b/resources/views/admin/users/index.blade.php @@ -47,6 +47,7 @@ {{__('Email')}} {{CREDITS_DISPLAY_NAME}} {{__('Servers')}} + {{__("Referrals")}} {{__('Verified')}} {{__('Last seen')}} @@ -90,6 +91,7 @@ {data: 'email', name: 'users.email'}, {data: 'credits' , name : 'users.credits'}, {data: 'servers' , sortable : false}, + {data: 'referrals'}, {data: 'verified' , sortable : false}, {data: 'last_seen'}, {data: 'actions' , sortable : false}, diff --git a/resources/views/admin/users/show.blade.php b/resources/views/admin/users/show.blade.php index a49e7f51..32202fde 100644 --- a/resources/views/admin/users/show.blade.php +++ b/resources/views/admin/users/show.blade.php @@ -244,8 +244,37 @@ @include('admin.servers.table' , ['filter' => '?user=' . $user->id])
- + +
+
+
{{__('Referals')}}
+
+
+ + + @foreach($referrals as $referral) +
+
+
+ +
+ +
+ + {{$referral->created_at->diffForHumans()}} + +
+
+
+ @endforeach +
+ +
diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index 30396d5e..ec6e44d4 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -91,7 +91,16 @@ - + @if(config('SETTINGS::REFERRAL::ENABLED') == "true") +
+ +
+
+ +
+
+
+ @endif
{!! htmlFormSnippet() !!} @error('g-recaptcha-response') diff --git a/resources/views/profile/index.blade.php b/resources/views/profile/index.blade.php index e6ca8edb..b471e14e 100644 --- a/resources/views/profile/index.blade.php +++ b/resources/views/profile/index.blade.php @@ -12,7 +12,7 @@
@@ -33,7 +33,7 @@ {{ __('You have not yet verified your email address') }} {{ __('Click here to resend verification email') }} + href="{{ route('verification.send') }}">{{ __('Click here to resend 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 (!empty(config('SETTINGS::DISCORD:CLIENT_ID')) && !empty(config('SETTINGS::DISCORD:CLIENT_SECRET')))
-
{{ __('Required Discord verification!') }} +
+ {{ __('Required Discord verification!') }}
{{ __('You have not yet verified your discord account') }} {{ __('Login with discord') }}
+ href="{{ route('auth.redirect') }}">{{ __('Login with discord') }}
{{ __('Please contact support If you face any issues.') }}
@else
-
{{ __('Required Discord verification!') }} +
+ {{ __('Required Discord verification!') }}
{{ __('Due to system settings you are required to verify your discord account!') }}
{{ __('It looks like this hasnt been set-up correctly! Please contact support.') }}' @@ -72,9 +74,10 @@
+ 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"> avatar
@@ -84,10 +87,11 @@

{{ $user->email }} @if ($user->hasVerifiedEmail()) + class="text-success fas fa-check-circle"> @else - + @endif

@@ -95,8 +99,23 @@ {{ $user->Credits() }}
+ + +
+ @if(config('SETTINGS::REFERRAL::ENABLED') == "true" && $user->role != "member") + + {{_("Referral URL")}} : {{route("register")}}?ref={{$user->referral_code}} + @else + + {{_("Make a purchase to reveal your referral-URL")}} + @endif +
+
+
{{ $user->role }}
@@ -107,7 +126,7 @@
@@ -123,22 +142,22 @@ @endforeach @endif - @if( $errors->has('pterodactyl_error_status') ) - @foreach( $errors->get('pterodactyl_error_status') as $err ) - + @if( $errors->has('pterodactyl_error_status') ) + @foreach( $errors->get('pterodactyl_error_status') as $err ) + {{ $err }} - @endforeach - @endif + @endforeach + @endif
@error('name') -
- {{ $message }} -
+
+ {{ $message }} +
@enderror
@@ -151,9 +170,9 @@ value="{{ $user->email }}"> @error('email') -
- {{ $message }} -
+
+ {{ $message }} +
@enderror
@@ -169,12 +188,13 @@ + name="current_password" type="password" + placeholder="••••••"> @error('current_password') -
- {{ $message }} -
+
+ {{ $message }} +
@enderror @@ -187,9 +207,9 @@ name="new_password" type="password" placeholder="••••••"> @error('new_password') -
- {{ $message }} -
+
+ {{ $message }} +
@enderror @@ -204,9 +224,9 @@ placeholder="••••••"> @error('new_password_confirmation') -
- {{ $message }} -
+
+ {{ $message }} +
@enderror @@ -245,9 +265,10 @@

avatar
+ height="100px" + class="rounded-circle" + src="{{ $user->discordUser->getAvatar() }}" + alt="avatar">