mirror of
https://github.com/sp-tarkov/forge.git
synced 2025-02-12 12:10:41 -05:00
Discord Avatar Import
Imports the user's avatar from discord when a new user is created through OAuth.
This commit is contained in:
parent
746fed1746
commit
caefd6dbb2
4
.gitignore
vendored
4
.gitignore
vendored
@ -16,6 +16,10 @@ public/build
|
||||
public/hot
|
||||
public/storage
|
||||
storage/*.key
|
||||
storage/app/livewire-tmp
|
||||
storage/app/public
|
||||
!storage/app/public/cover-photos/.gitkeep
|
||||
!storage/app/public/profile-photos/.gitkeep
|
||||
vendor
|
||||
auth.json
|
||||
frankenphp
|
||||
|
@ -7,6 +7,9 @@ use App\Models\User;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
use Laravel\Socialite\Contracts\User as ProviderUser;
|
||||
use Laravel\Socialite\Facades\Socialite;
|
||||
|
||||
@ -80,11 +83,13 @@ class SocialiteController extends Controller
|
||||
// If one exists, connect that account. Otherwise, create a new one.
|
||||
|
||||
return DB::transaction(function () use ($providerUser, $provider) {
|
||||
|
||||
$user = User::firstOrCreate(['email' => $providerUser->getEmail()], [
|
||||
'name' => $providerUser->getName() ?? $providerUser->getNickname(),
|
||||
'password' => null,
|
||||
]);
|
||||
$user->oAuthConnections()->create([
|
||||
|
||||
$connection = $user->oAuthConnections()->create([
|
||||
'provider' => $provider,
|
||||
'provider_id' => $providerUser->getId(),
|
||||
'token' => $providerUser->token,
|
||||
@ -95,7 +100,43 @@ class SocialiteController extends Controller
|
||||
'avatar' => $providerUser->getAvatar() ?? '',
|
||||
]);
|
||||
|
||||
$this->updateAvatar($user, $connection->avatar);
|
||||
|
||||
return $user;
|
||||
});
|
||||
}
|
||||
|
||||
private function updateAvatar(User $user, string $avatarUrl): void
|
||||
{
|
||||
// Determine the disk to use based on the environment.
|
||||
$disk = match (config('app.env')) {
|
||||
'production' => 'r2', // Cloudflare R2 Storage
|
||||
default => 'public', // Local
|
||||
};
|
||||
|
||||
$curl = curl_init();
|
||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
|
||||
curl_setopt($curl, CURLOPT_URL, $avatarUrl);
|
||||
$image = curl_exec($curl);
|
||||
|
||||
if ($image === false) {
|
||||
Log::error('There was an error attempting to download the image. cURL error: '.curl_error($curl));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Generate a random path for the image and ensure that it doesn't already exist.
|
||||
do {
|
||||
$relativePath = User::profilePhotoStoragePath().'/'.Str::random(40).'.webp';
|
||||
} while (Storage::disk($disk)->exists($relativePath));
|
||||
|
||||
// Store the image on the disk.
|
||||
Storage::disk($disk)->put($relativePath, $image);
|
||||
|
||||
// Update the user's profile photo path.
|
||||
$user->forceFill([
|
||||
'profile_photo_path' => $relativePath,
|
||||
])->save();
|
||||
}
|
||||
}
|
||||
|
@ -392,7 +392,7 @@ class ImportHubDataJob implements ShouldBeUnique, ShouldQueue
|
||||
$hashShort = substr($avatar->fileHash, 0, 2);
|
||||
$fileName = $avatar->fileHash.'.'.$avatar->avatarExtension;
|
||||
$hubUrl = 'https://hub.sp-tarkov.com/images/avatars/'.$hashShort.'/'.$avatar->avatarID.'-'.$fileName;
|
||||
$relativePath = 'user-avatars/'.$fileName;
|
||||
$relativePath = User::profilePhotoStoragePath().'/'.$fileName;
|
||||
|
||||
return $this->fetchAndStoreImage($curl, $hubUrl, $relativePath);
|
||||
}
|
||||
|
@ -44,6 +44,14 @@ class User extends Authenticatable implements MustVerifyEmail
|
||||
'profile_photo_url',
|
||||
];
|
||||
|
||||
/**
|
||||
* Get the storage path for profile photos.
|
||||
*/
|
||||
public static function profilePhotoStoragePath(): string
|
||||
{
|
||||
return 'profile-photos';
|
||||
}
|
||||
|
||||
/**
|
||||
* The relationship between a user and their mods.
|
||||
*
|
||||
|
@ -45,7 +45,7 @@ return [
|
||||
'client_secret' => env('DISCORD_CLIENT_SECRET'),
|
||||
'redirect' => env('DISCORD_REDIRECT_URI'),
|
||||
'allow_gif_avatars' => (bool) env('DISCORD_AVATAR_GIF', true),
|
||||
'avatar_default_extension' => env('DISCORD_EXTENSION_DEFAULT', 'png'),
|
||||
'avatar_default_extension' => env('DISCORD_EXTENSION_DEFAULT', 'webp'),
|
||||
],
|
||||
|
||||
];
|
||||
|
3
storage/app/.gitignore
vendored
3
storage/app/.gitignore
vendored
@ -1,3 +0,0 @@
|
||||
*
|
||||
!public/
|
||||
!.gitignore
|
2
storage/app/public/.gitignore
vendored
2
storage/app/public/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
*
|
||||
!.gitignore
|
0
storage/app/public/cover-photos/.gitkeep
Normal file
0
storage/app/public/cover-photos/.gitkeep
Normal file
0
storage/app/public/profile-photos/.gitkeep
Normal file
0
storage/app/public/profile-photos/.gitkeep
Normal file
Loading…
x
Reference in New Issue
Block a user