Initial commit

This commit is contained in:
root
2026-05-09 17:28:23 +02:00
commit 9d73f82529
5575 changed files with 281989 additions and 0 deletions
+54
View File
@@ -0,0 +1,54 @@
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Http\Requests\AccountSettingsFormRequest;
use App\Services\RconService;
use App\Services\User\SessionService;
use App\Services\User\UserService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;
class AccountSettingsController extends Controller
{
public function __construct(private readonly SessionService $sessionService, private readonly UserService $userService, private readonly RconService $rconService) {}
public function edit(): View
{
return view('user.settings.account', [
'user' => Auth::user()->load('settings:allow_name_change'),
]);
}
public function sessionLogs(Request $request): View
{
$sessions = $this->sessionService->fetchSessionLogs($request);
return view('user.settings.session-logs', [
'logs' => $sessions,
]);
}
public function update(AccountSettingsFormRequest $request): RedirectResponse
{
$user = Auth::user();
if ($user === null) {
return redirect()->back()->withErrors('User not found');
}
if ($user->mail !== $request->input('mail')) {
$this->userService->updateField($user, 'mail', $request->input('mail'));
}
if ($user->motto !== $request->input('motto')) {
$this->rconService->setMotto($user, $request->input('motto'));
$this->userService->updateField($user, 'motto', $request->input('motto'));
}
return redirect()->route('settings.account.show')->with('success', __('Your account settings has been updated'));
}
}
+23
View File
@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Models\User\Ban;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;
class BannedController extends Controller
{
public function __invoke(): View
{
$ipBan = Ban::where('ip', '=', request()->ip())
->where('ban_expire', '>', time())
->orderByDesc('id')
->first();
return view('banned', [
'ban' => $ipBan ?? Auth::user()->ban,
]);
}
}
+78
View File
@@ -0,0 +1,78 @@
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Models\PasswordResetToken;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
class ForgotPasswordController extends Controller
{
public function __invoke()
{
return view('auth.passwords.forget');
}
public function submitForgetPassword(Request $request)
{
$request->validate([
'mail' => 'required|email',
]);
// Do not tell the user that this email does not exist to prevent possible attacks
if (User::where('mail', $request->mail)->exists()) {
$token = Str::uuid();
PasswordResetToken::create([
'email' => $request->mail,
'token' => $token,
]);
Mail::send('email.forgetPassword', ['token' => $token], function ($message) use ($request) {
$message->to($request->mail);
$message->subject('Reset Password');
});
}
return back()->with('success', __('We have e-mailed your password reset link!'));
}
public function showResetPassword(Request $request, string $token)
{
$prt = PasswordResetToken::select(['token', 'created_at'])->where('token', $token)->first();
if ($prt === null) {
return to_route('forgot.password.get')->withErrors('message', __('This token has expired!'));
}
$tokenExpiration = Carbon::now()->subMinutes(config('habbo.password_reset_token_time'));
if ($prt->created_at->lt($tokenExpiration)) {
$prt->delete();
return to_route('forgot.password.get')->withErrors('message', __('This token has expired!'));
}
return view('auth.passwords.reset', [
'token' => $token,
]);
}
public function submitResetPassword(Request $request, string $token)
{
$request->validate([
'password' => 'required|min:8|confirmed',
'password_confirmation' => 'required',
]);
$prt = PasswordResetToken::select(['email', 'token'])->where('token', $token)->first();
if ($prt === null) {
return to_route('forgot.password.get')->withErrors('message', __('This token has expired!'));
}
$prt->user->changePassword($request->password);
$prt->delete();
return to_route('login')->with('success', __('Your password has been successfully reset!'));
}
}
+56
View File
@@ -0,0 +1,56 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Http\Requests\GuestbookFormRequest;
use App\Models\User;
use App\Models\User\WebsiteUserGuestbook;
use Illuminate\Support\Facades\Auth;
class GuestbookController extends Controller
{
public function store(User $user, GuestbookFormRequest $request)
{
$this->validateGuestbookPost($user, $request);
$user->profileGuestbook()->create([
'user_id' => Auth::id(),
'message' => $request->input('message'),
]);
return redirect()->back()->with('success', __('Your message has been posted.'));
}
public function destroy(User $user, WebsiteUserGuestbook $guestbook)
{
if ($guestbook->user_id !== Auth::id() && $guestbook->profile_id !== $user->id && Auth::user()->rank < (int) setting('min_staff_rank')) {
return redirect()->back()->withErrors([
'message' => __('Do do not have permission to delete this message'),
]);
}
$guestbook->delete();
return redirect()->back()->with('success', __('Your message has been deleted.'));
}
private function validateGuestbookPost(User $user, GuestbookFormRequest $request)
{
if ($user->id === $request->user()->id) {
return $this->redirectWithError(__('You cannot post a message on your own profile.'));
}
$maxAllowedPostCount = empty(setting('max_guestbook_posts_per_profile')) ? 3 : (int) setting('max_guestbook_posts_per_profile');
if ($user->profileGuestbook()->where('user_id', $request->user()->id)->count() >= $maxAllowedPostCount) {
return $this->redirectWithError(__('You have already posted :count messages on this profile.', ['count' => $maxAllowedPostCount]));
}
}
private function redirectWithError($message)
{
return redirect()->back()->withErrors(['message' => $message]);
}
}
+21
View File
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Models\Articles\WebsiteArticle;
use Illuminate\View\View;
class MeController extends Controller
{
public function __invoke(): View
{
$user = auth()->user();
return view('user.me', [
'onlineFriends' => $user->getOnlineFriends(),
'user' => $user->load('permission:id,rank_name'),
'articles' => WebsiteArticle::with('user:id,username,look')->latest()->take(5)->get(),
]);
}
}
+27
View File
@@ -0,0 +1,27 @@
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Http\Requests\PasswordSettingsFormRequest;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\View\View;
class PasswordSettingsController extends Controller
{
public function edit(): View
{
return view('user.settings.password');
}
public function update(PasswordSettingsFormRequest $request): RedirectResponse
{
Auth::user()->update([
'password' => Hash::make($request->input('password')),
]);
return redirect()->route('settings.password.show')->with('success', __('Your password has been changed!'));
}
}
+54
View File
@@ -0,0 +1,54 @@
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;
class PreferencesController extends Controller
{
public function edit(): View
{
$user = Auth::user();
$preferences = $user->preferences ?? $this->getDefaultPreferences();
return view('user.settings.preferences', [
'preferences' => $preferences,
]);
}
public function update(Request $request): RedirectResponse
{
$user = Auth::user();
$validated = $request->validate([
'radio_auto_play' => 'sometimes|boolean',
'radio_shouts' => 'sometimes|boolean',
'radio_notifications' => 'sometimes|boolean',
'friend_requests' => 'sometimes|boolean',
'room_invites' => 'sometimes|boolean',
'email_notifications' => 'sometimes|boolean',
]);
$preferences = array_merge($this->getDefaultPreferences(), $validated);
$user->preferences = $preferences;
$user->save();
return redirect()->route('settings.preferences.show')->with('success', __('Preferences updated successfully'));
}
private function getDefaultPreferences(): array
{
return [
'radio_auto_play' => false,
'radio_shouts' => true,
'radio_notifications' => true,
'friend_requests' => true,
'room_invites' => true,
'email_notifications' => false,
];
}
}
+91
View File
@@ -0,0 +1,91 @@
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Models\Miscellaneous\WebsiteSetting;
use App\Models\User;
use Carbon\Carbon;
class ProfileController extends Controller
{
public function __invoke(User $user)
{
$user->load([
'friends.friend:id,username,look',
'guilds.guild:id,name,badge',
'profileGuestbook.user:id,username,look',
'photos',
'badges',
]);
$showStats = WebsiteSetting::where('key', 'profile_show_stats')->first()?->value ?? '1';
$showOnline = WebsiteSetting::where('key', 'profile_show_online_status')->first()?->value ?? '1';
$accountAge = $this->getAccountAge($user->account_created);
$lastLogin = $this->getLastLogin($user->last_login);
$totalFriends = $user->friends()->count();
$totalGuilds = $user->guilds()->count();
return view('user.profile', [
'user' => $user,
'friends' => $user->friends->take(10),
'groups' => $user->guilds->take(5),
'guestbook' => $user->profileGuestbook->take(5),
'photos' => $user->photos->take(3),
'badges' => $user->badges->take(3),
'showStats' => $showStats,
'showOnline' => $showOnline,
'accountAge' => $accountAge,
'lastLogin' => $lastLogin,
'totalFriends' => $totalFriends,
'totalGuilds' => $totalGuilds,
]);
}
private function getAccountAge(int $timestamp): string
{
$created = Carbon::createFromTimestamp($timestamp);
$now = Carbon::now();
$days = $created->diffInDays($now);
if ($days < 7) {
return $days . ' day' . ($days !== 1 ? 's' : '');
} elseif ($days < 30) {
$weeks = floor($days / 7);
return $weeks . ' week' . ($weeks !== 1 ? 's' : '');
} elseif ($days < 365) {
$months = floor($days / 30);
return $months . ' month' . ($months !== 1 ? 's' : '');
} else {
$years = floor($days / 365);
return $years . ' year' . ($years !== 1 ? 's' : '');
}
}
private function getLastLogin(int $timestamp): string
{
$lastLogin = Carbon::createFromTimestamp($timestamp);
$now = Carbon::now();
$diff = $now->diffInMinutes($lastLogin);
if ($diff < 1) {
return 'Just now';
} elseif ($diff < 60) {
return $diff . ' minute' . ($diff !== 1 ? 's' : '') . ' ago';
} elseif ($diff < 1440) {
$hours = floor($diff / 60);
return $hours . ' hour' . ($hours !== 1 ? 's' : '') . ' ago';
} elseif ($diff < 10080) {
$days = floor($diff / 1440);
return $days . ' day' . ($days !== 1 ? 's' : '') . ' ago';
} else {
return $lastLogin->format('d M Y');
}
}
}
+33
View File
@@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Services\RconService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Auth;
class ReferralController extends Controller
{
public function __invoke(RconService $rcon): RedirectResponse
{
$user = Auth::user();
if (! $user->referrals || $user->referrals->referrals_total < setting('referrals_needed')) {
return redirect()->back()->withErrors([
'message' => __('You do not have enough referrals to claim your reward'),
]);
}
// Decrease the total amount of referrals with the amount needed to claim reward
$user->referrals->decrement('referrals_total', setting('referrals_needed'));
$rcon->giveDiamonds($user, setting('referral_reward_amount'));
// Log the claim
$user->claimedReferralLog()->create([
'ip_address' => request()->ip(),
]);
return redirect()->back()->with('success', __('Woah! You have successfully claimed your reward - Keep up the good work!'));
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
use Laravel\Fortify\Actions\DisableTwoFactorAuthentication;
use Laravel\Fortify\Actions\EnableTwoFactorAuthentication;
class TwoFactorAuthenticationController extends Controller
{
public function index(): View
{
return view('user.settings.two-factor');
}
public function store(Request $request, EnableTwoFactorAuthentication $enable): RedirectResponse
{
$enable($request->user());
return redirect()->route('settings.two-factor')->with('success', __('Two-factor authentication has been enabled. Please scan the QR code to continue.'));
}
public function verify(Request $request): RedirectResponse
{
$confirmed = $request->user()->confirmTwoFactorAuthentication($request->input('code'));
if (! $confirmed) {
return back()->withErrors('Invalid Two Factor Authentication code');
}
return redirect()->route('settings.two-factor')->with('success', __('Two-factor authentication has been confirmed.'));
}
public function destroy(Request $request, DisableTwoFactorAuthentication $disable): RedirectResponse
{
$disable($request->user());
return redirect()->route('settings.two-factor')->with('success', __('Two-factor authentication has been disabled.'));
}
}
+20
View File
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Models\User;
class UserReferralController extends Controller
{
public function __invoke(string $referralCode)
{
if (! User::where('referral_code', $referralCode)->exists()) {
abort(404);
}
return view('auth.register', [
'referral_code' => $referralCode,
]);
}
}