From 2904b7dbd39ad8ec36052507a052f8a916531dd1 Mon Sep 17 00:00:00 2001 From: Conkley Date: Thu, 21 Jul 2022 21:54:37 +1000 Subject: [PATCH 1/5] user settings --- .../Controllers/Auth/RegisterController.php | 2 + app/Http/Controllers/PageController.php | 18 --- app/Http/Controllers/SettingController.php | 119 +++++++++++++++ app/Models/User.php | 5 + app/Models/UserSetting.php | 35 +++++ ...7_19_083303_create_user_settings_table.php | 38 +++++ public/js/settings.js | 88 +++++++++++ resources/views/home.blade.php | 9 +- resources/views/misc/mergetable.blade.php | 19 +++ resources/views/misc/settings.blade.php | 142 ++++++++++++------ resources/views/pages/profile.blade.php | 2 +- routes/web.php | 11 +- 12 files changed, 420 insertions(+), 68 deletions(-) create mode 100644 app/Http/Controllers/SettingController.php create mode 100644 app/Models/UserSetting.php create mode 100644 database/migrations/2022_07_19_083303_create_user_settings_table.php create mode 100644 public/js/settings.js create mode 100644 resources/views/misc/mergetable.blade.php diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 4dff89a..f2b3384 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use App\Models\User; +use App\Models\UserSetting; use App\Models\InviteKey; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Support\Facades\Hash; @@ -71,6 +72,7 @@ class RegisterController extends Controller $invited_by = $this->getInviter($data['key']); $this->updateKeyTable($data['key']); + UserSetting::create(['user_id' => User::all()->last()->id+1]); return User::create([ 'name' => $data['name'], 'email' => $data['email'], diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index 1699259..f8d2e31 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -89,24 +89,6 @@ class PageController extends Controller return view('pages.users')->with('users', $users); } - public function settings() - { - return view('misc.settings'); - } - - public function change_settings(Request $request) - { - $request->validate([ - 'bio' => 'required|min:3|max:2000' - ]); - - $user = Auth::user(); - $user->blurb = $request->bio; - $user->save(); - - return redirect()->back()->with('success', 'Your bio has been updated.'); - } - public function download() { return view('pages.download'); diff --git a/app/Http/Controllers/SettingController.php b/app/Http/Controllers/SettingController.php new file mode 100644 index 0000000..2b61128 --- /dev/null +++ b/app/Http/Controllers/SettingController.php @@ -0,0 +1,119 @@ +activeSetting; + $changeMsg = null; + $user = Auth::user(); + $userSetting = Auth::user()->settings; + + switch ($option) { + case 1: + $request->validate([ + 'name' => ['required', 'string', 'min:3', 'max:20', 'unique:users', 'regex:/^(?!^\.)(?!.*[-_.]$)[a-zA-Z0-9-_. ]+$/'], + 'username_change_confirm' => 'accepted' + ]); + + if (Auth::user()->settings->changed_name) { + return redirect()->back()->withErrors(['You have already changed your username!']); + } + + $oldUsername = $user->name; + + $user->name = $request->name; + $user->save(); + + $userSetting->old_name = $oldUsername; + $userSetting->changed_name = true; + $userSetting->save(); + + $changeMsg = "Your username has been changed."; + break; + case 2: + $request->validate([ + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users', 'confirmed', 'email:rfc,dns'], + ]); + + $user->email = $request->email; + $user->save(); + + $changeMsg = "Your email has been changed."; + break; + case 3: + $request->validate([ + 'dob' => ['required', 'date_format:Y-m-d', 'before:today', 'after:01/01/1970'], + ]); + + $user->dob = $request->dob; + $user->save(); + + $changeMsg = "Your date of birth has been changed."; + break; + case 4: + $request->validate([ + 'password' => ['required', 'string', 'min:8', 'confirmed', 'regex:/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{6,}$/'], + ]); + + if (!Hash::check($request->old_password, Auth::user()->password)) { + return redirect()->back()->withErrors(['Your old password is incorrect!']); + } + + $user->password = Hash::make($request->password); + $user->save(); + + $changeMsg = "Your password has been changed."; + break; + case 5: + $request->validate([ + 'date_preference' => ['required', 'string', 'in:d/m/Y,m/d/Y,Y/d/m'], + ]); + + $userSetting->date_preference = $request->date_preference; + $userSetting->save(); + + $changeMsg = "Your date display preference has been changed."; + break; + case 6: + $request->validate([ + 'time_preference' => ['required', 'string', 'in:0,1'], + ]); + + $userSetting->time_preference_24hr = $request->time_preference; + $userSetting->save(); + + $changeMsg = "Your time display preference has been changed."; + break; + default: + abort(404); + } + + return redirect()->back()->with('change', $changeMsg); + } + + public function change_bio(Request $request) + { + $request->validateWithBag('bio_form', [ + 'bio' => 'required|min:3|max:2000' + ]); + + $user = Auth::user(); + $user->blurb = $request->bio; + $user->save(); + + return redirect()->back()->with('success', 'Your bio has been updated.'); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index e51a399..a2b4b03 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -65,4 +65,9 @@ class User extends Authenticatable { return $this->hasMany('App\Models\FeedPost'); } + + public function settings() + { + return $this->hasOne('App\Models\UserSetting'); + } } diff --git a/app/Models/UserSetting.php b/app/Models/UserSetting.php new file mode 100644 index 0000000..0abcab9 --- /dev/null +++ b/app/Models/UserSetting.php @@ -0,0 +1,35 @@ + + */ + protected $fillable = [ + 'user_id', + 'old_name', + 'changed_name', + 'date_preference', + 'time_preference_24hr', + 'theme', + 'message_preference', + ]; + + public function user() + { + return $this->belongsTo('App\Models\User'); + } +} diff --git a/database/migrations/2022_07_19_083303_create_user_settings_table.php b/database/migrations/2022_07_19_083303_create_user_settings_table.php new file mode 100644 index 0000000..ef622b3 --- /dev/null +++ b/database/migrations/2022_07_19_083303_create_user_settings_table.php @@ -0,0 +1,38 @@ +id(); + $table->integer('user_id'); + $table->string('old_name')->nullable(); + $table->boolean('changed_name')->default(false); + $table->string('date_preference')->default('d/m/Y'); + $table->boolean('time_preference_24hr')->default(false); + $table->integer('theme')->default(1); + $table->integer('message_preference')->default(2); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_settings'); + } +} diff --git a/public/js/settings.js b/public/js/settings.js new file mode 100644 index 0000000..b8a75f7 --- /dev/null +++ b/public/js/settings.js @@ -0,0 +1,88 @@ +var active = 0; + +function openPopup(id) { + document.querySelector('.popupcontainer').removeAttribute('id'); + + switch (id) { + case 1: + active = 1; + setActiveSetting(1); + document.querySelector('.popup .username_change').removeAttribute('id'); + document.querySelector('.popup #heading').innerHTML = "Change Username"; + document.querySelector('.popup .warningtext').innerHTML = "You can only change your username once."; + document.querySelector('.popup #desc').innerHTML = "Your new username must be from 3-20 characters long.
Spaces, periods, and underscores allowed."; + break; + case 2: + active = 2; + setActiveSetting(2); + document.querySelector('.popup .email_change').removeAttribute('id'); + document.querySelector('.popup #heading').innerHTML = "Change E-Mail"; + document.querySelector('.popup .warningtext').innerHTML = null; + document.querySelector('.popup #desc').innerHTML = "Enter your new E-Mail below as well as confirming it.
E-Mails are primarily used to reset passwords."; + break; + case 3: + active = 3; + setActiveSetting(3); + document.querySelector('.popup .dob_change').removeAttribute('id'); + document.querySelector('.popup #heading').innerHTML = "Change Date of Birth"; + document.querySelector('.popup .warningtext').innerHTML = null; + document.querySelector('.popup #desc').innerHTML = null; + break; + case 4: + active = 4; + setActiveSetting(4); + document.querySelector('.popup .password_change').removeAttribute('id'); + document.querySelector('.popup #heading').innerHTML = "Change Password"; + document.querySelector('.popup .warningtext').innerHTML = "Your password must follow ARCHBLOX's format."; + document.querySelector('.popup #desc').innerHTML = "Firstly, you need to remember your old password.
Your new password must include:
"; + break; + case 5: + active = 5; + setActiveSetting(5); + document.querySelector('.popup .date_change').removeAttribute('id'); + document.querySelector('.popup #heading').innerHTML = "Change Date Preference"; + document.querySelector('.popup .warningtext').innerHTML = null; + document.querySelector('.popup #desc').innerHTML = "Change the way you see dates on the site.
Default preference is the Australian format (dd/mm/yyyy)"; + break; + case 6: + active = 6; + setActiveSetting(6); + document.querySelector('.popup .time_change').removeAttribute('id'); + document.querySelector('.popup #heading').innerHTML = "Change Time Preference"; + document.querySelector('.popup .warningtext').innerHTML = null; + document.querySelector('.popup #desc').innerHTML = "Choose whether 12 hour or 24 hour time is displayed on the site."; + break; + default: + console.error('Invalid setting.'); + } +} + +function closePopup() { + document.querySelector('.popupcontainer').setAttribute("id", "invisible"); + switch (active) { + case 1: + document.querySelector('.popup .username_change').setAttribute("id", "invisible"); + break; + case 2: + document.querySelector('.popup .email_change').setAttribute("id", "invisible"); + break; + case 3: + document.querySelector('.popup .dob_change').setAttribute("id", "invisible"); + break; + case 4: + document.querySelector('.popup .password_change').setAttribute("id", "invisible"); + break; + case 5: + document.querySelector('.popup .date_change').setAttribute("id", "invisible"); + break; + case 6: + document.querySelector('.popup .time_change').setAttribute("id", "invisible"); + break; + default: + console.error('Invalid setting.'); + } +} + +function setActiveSetting(id) { + document.querySelector('.popup #activeSetting').setAttribute("value", id); +} \ No newline at end of file diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index c7d1e4d..dda573c 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -43,8 +43,13 @@
{{ $post->user->name }} -

"{{ $post->status }}"

-

{{ $post->created_at->format('F d, Y h:i A') }}

+

+ "{{ $post->status }}"

+ @if (!Auth::user()->settings->time_preference_24hr) +

{{ $post->created_at->format('F d, Y h:i A') }}

+ @else +

{{ $post->created_at->format('F d, Y H:i') }}

+ @endif
@endforeach diff --git a/resources/views/misc/mergetable.blade.php b/resources/views/misc/mergetable.blade.php new file mode 100644 index 0000000..0fafdf4 --- /dev/null +++ b/resources/views/misc/mergetable.blade.php @@ -0,0 +1,19 @@ +@php +use App\Models\User; +use App\Models\UserSetting; + +$userCount = User::count(); +$userSettingCount = UserSetting::count(); + +if ($userSettingCount >= $userCount) { + echo 'Already merged.'; + return; +} + +for ($i = 1; $i <= $userCount; $i++) { + UserSetting::create(['user_id' => $i]); +} + +echo 'Merged!'; + +@endphp \ No newline at end of file diff --git a/resources/views/misc/settings.blade.php b/resources/views/misc/settings.blade.php index 4698893..bd5e5b5 100644 --- a/resources/views/misc/settings.blade.php +++ b/resources/views/misc/settings.blade.php @@ -1,6 +1,12 @@ @extends('layouts.app') @section('title') Settings - {{ env('APP_NAME') }} + + @endsection @section('titlediscord') @@ -12,70 +18,118 @@ @section('popup_content')
@endsection +@section('alert') + @if ($errors->any()) +
{{ $errors->first() }}
+ @endif + @if (session()->has('change')) +
{{ session()->get('change') }} +
+ @endif +@endsection + @section('content')

Settings

-
- @csrf -
-
+
+ + @csrf +

Bio

- @if ($errors->any()) - {{ $errors->first() }} + @if ($errors->bio_form->any()) + {{ $errors->bio_form->first() }} @endif @if (session()->has('success')) {{ session()->get('success') }} @endif - -
+ +
-

Username: {{ Auth::user()->name }}

-

E-Mail: {{ Auth::user()->email }}

-

Date of Birth: {{ Auth::user()->dob }}

-

Password: ********

-

Date Display Preference: D/M/YY

-

Time Display Preference: 12 Hour

+

Username: {{ Auth::user()->name }}

+

E-Mail: {{ Auth::user()->email }}

+

Date of Birth: {{ Auth::user()->dob }} +

+

Password: ********

+

Date Display Preference: + {{ Auth::user()->settings->date_preference }} +

+

Time Display Preference: + {{ Auth::user()->settings->time_preference_24hr ? '24 Hour' : '12 Hour' }} + +

diff --git a/resources/views/pages/profile.blade.php b/resources/views/pages/profile.blade.php index 14454d5..852244f 100644 --- a/resources/views/pages/profile.blade.php +++ b/resources/views/pages/profile.blade.php @@ -57,7 +57,7 @@ {!! nl2br(e($data['user']->blurb)) !!}

-

Joined: {{ $data['user']->created_at->format('d/m/Y') }}

+

Joined: {{ $data['user']->created_at->format(Auth::user()->settings->date_preference) }}

Place Visits: 0


diff --git a/routes/web.php b/routes/web.php index 4436968..9c69657 100644 --- a/routes/web.php +++ b/routes/web.php @@ -36,8 +36,9 @@ Route::middleware(['auth'])->group(function () { }); Route::get('/user/{id}/friends/mutual', [App\Http\Controllers\PageController::class, 'mutual_friends'])->name('mutual_friends'); - Route::get('/my/settings', [App\Http\Controllers\PageController::class, 'settings'])->name('settings'); - Route::post('/my/settings', [App\Http\Controllers\PageController::class, 'change_settings'])->name('change_settings'); + Route::get('/my/settings', [App\Http\Controllers\SettingController::class, 'settings'])->name('settings'); + Route::post('/my/settings', [App\Http\Controllers\SettingController::class, 'change_bio'])->name('change_bio'); + Route::post('/my/settings/change', [App\Http\Controllers\SettingController::class, 'change_settings'])->name('change_settings'); Route::get('/my/invites', [App\Http\Controllers\KeyController::class, 'index'])->name('key_index'); Route::post('/my/invites', [App\Http\Controllers\KeyController::class, 'create'])->name('key_create'); @@ -66,4 +67,8 @@ Route::get('/ide/welcome', [App\Http\Controllers\ClientController::class, 'idela Route::get('/IDE/ClientToolbox.aspx', [App\Http\Controllers\ClientController::class, 'toolbox'])->name('toolbox'); Route::get('/UploadMedia/PostImage.aspx', [App\Http\Controllers\ClientController::class, 'postimage'])->name('postimage'); Route::get('/UploadMedia/UploadVideo.aspx', [App\Http\Controllers\ClientController::class, 'uploadvideo'])->name('uploadvideo'); -Route::get('/Game/KeepAlivePinger.ashx', [App\Http\Controllers\ClientController::class, 'keepalive'])->name('keepalive'); \ No newline at end of file +Route::get('/Game/KeepAlivePinger.ashx', [App\Http\Controllers\ClientController::class, 'keepalive'])->name('keepalive'); + +Route::get('/mergetable', function () { + return view('misc.mergetable'); +}); \ No newline at end of file From 5132b49a2b0f2294e69c333e2a614ff61fb5fd99 Mon Sep 17 00:00:00 2001 From: Conkley Date: Thu, 21 Jul 2022 21:57:27 +1000 Subject: [PATCH 2/5] remove temp merge table --- resources/views/misc/mergetable.blade.php | 19 ------------------- routes/web.php | 6 +----- 2 files changed, 1 insertion(+), 24 deletions(-) delete mode 100644 resources/views/misc/mergetable.blade.php diff --git a/resources/views/misc/mergetable.blade.php b/resources/views/misc/mergetable.blade.php deleted file mode 100644 index 0fafdf4..0000000 --- a/resources/views/misc/mergetable.blade.php +++ /dev/null @@ -1,19 +0,0 @@ -@php -use App\Models\User; -use App\Models\UserSetting; - -$userCount = User::count(); -$userSettingCount = UserSetting::count(); - -if ($userSettingCount >= $userCount) { - echo 'Already merged.'; - return; -} - -for ($i = 1; $i <= $userCount; $i++) { - UserSetting::create(['user_id' => $i]); -} - -echo 'Merged!'; - -@endphp \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 9c69657..51e0097 100644 --- a/routes/web.php +++ b/routes/web.php @@ -67,8 +67,4 @@ Route::get('/ide/welcome', [App\Http\Controllers\ClientController::class, 'idela Route::get('/IDE/ClientToolbox.aspx', [App\Http\Controllers\ClientController::class, 'toolbox'])->name('toolbox'); Route::get('/UploadMedia/PostImage.aspx', [App\Http\Controllers\ClientController::class, 'postimage'])->name('postimage'); Route::get('/UploadMedia/UploadVideo.aspx', [App\Http\Controllers\ClientController::class, 'uploadvideo'])->name('uploadvideo'); -Route::get('/Game/KeepAlivePinger.ashx', [App\Http\Controllers\ClientController::class, 'keepalive'])->name('keepalive'); - -Route::get('/mergetable', function () { - return view('misc.mergetable'); -}); \ No newline at end of file +Route::get('/Game/KeepAlivePinger.ashx', [App\Http\Controllers\ClientController::class, 'keepalive'])->name('keepalive'); \ No newline at end of file From ca136dde507e223988d7653b6e6a48a83004614b Mon Sep 17 00:00:00 2001 From: Conkley Date: Thu, 21 Jul 2022 23:53:30 +1000 Subject: [PATCH 3/5] 500 fix --- resources/views/pages/profile.blade.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/resources/views/pages/profile.blade.php b/resources/views/pages/profile.blade.php index 852244f..248acf3 100644 --- a/resources/views/pages/profile.blade.php +++ b/resources/views/pages/profile.blade.php @@ -29,8 +29,7 @@ @elseif (Auth::user()->isFriendWith($data['user'])) -
+ @csrf
@@ -57,7 +56,11 @@ {!! nl2br(e($data['user']->blurb)) !!}

-

Joined: {{ $data['user']->created_at->format(Auth::user()->settings->date_preference) }}

+ @guest +

Joined: {{ $data['user']->created_at->format('d/m/Y') }}

+ @else +

Joined: {{ $data['user']->created_at->format(Auth::user()->settings->date_preference) }}

+ @endguest

Place Visits: 0


@@ -93,7 +96,9 @@ class="bluebutton" style="margin-top: 5px">View All
@if (Auth::check() && Auth::id() != $data['user']->id && Auth::user()->getMutualFriendsCount($data['user']) > 0) - {{ Auth::user()->getMutualFriendsCount($data['user'])}} Mutual Friends + {{ Auth::user()->getMutualFriendsCount($data['user']) }} Mutual + Friends @endif
From bb4fd7cb8f68e0d8c2a0385be8fb62f011406188 Mon Sep 17 00:00:00 2001 From: Conkley Date: Fri, 22 Jul 2022 16:16:44 +1000 Subject: [PATCH 4/5] previous username on profile --- resources/views/pages/profile.blade.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/views/pages/profile.blade.php b/resources/views/pages/profile.blade.php index 248acf3..85a9473 100644 --- a/resources/views/pages/profile.blade.php +++ b/resources/views/pages/profile.blade.php @@ -12,6 +12,9 @@ @section('content')

{{ $data['user']->name }}

+ @if ($data['user']->settings->changed_name) +

Previous Username: {{ $data['user']->settings->old_name }}

+ @endif @if (Cache::has('is_online_' . $data['user']->id)) Website @else From 87e6afb61c98cd5d6f691dca832b9acb240791b0 Mon Sep 17 00:00:00 2001 From: Conkley Date: Fri, 22 Jul 2022 16:34:10 +1000 Subject: [PATCH 5/5] error 500 fix (profile page) --- app/Http/Controllers/PageController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index f8d2e31..efa0385 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -29,12 +29,13 @@ class PageController extends Controller { $user = User::find($id); $badges = DB::table('badges')->get(); - $friends = $user->getFriends($perPage = 3); if (!$user) { abort(404); } + $friends = $user->getFriends($perPage = 3); + $data = [ 'user' => $user, 'badges' => $badges,