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 @@
+
+
+
+
+
+
+ {{ __('Enable 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])
-
+
+
+
+
+
+
+ @foreach($referrals as $referral)
+
+
+
+ User ID: {{$referral->id}}
+
+
+
+
+ {{$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
@@ -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">
@@ -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
@@ -151,9 +170,9 @@
value="{{ $user->email }}">
@error('email')
-
- {{ $message }}
-
+
+ {{ $message }}
+
@enderror
@@ -169,12 +188,13 @@
{{ __('Current Password') }}
+ 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 @@
+ height="100px"
+ class="rounded-circle"
+ src="{{ $user->discordUser->getAvatar() }}"
+ alt="avatar">