ctrlpanel/app/Http/Controllers/Auth/SocialiteController.php

92 lines
3.1 KiB
PHP
Raw Normal View History

2021-06-05 09:26:32 +00:00
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\DiscordUser;
2021-11-18 18:22:09 +00:00
use App\Models\User;
2021-06-05 09:26:32 +00:00
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Http;
2021-06-05 09:26:32 +00:00
use Laravel\Socialite\Facades\Socialite;
class SocialiteController extends Controller
{
public function redirect()
2021-06-05 09:26:32 +00:00
{
$scopes = ! empty(config('SETTINGS::DISCORD:BOT_TOKEN')) && ! empty(config('SETTINGS::DISCORD:GUILD_ID')) ? ['guilds.join'] : [];
return Socialite::driver('discord')
->scopes($scopes)
->redirect();
2021-06-05 09:26:32 +00:00
}
public function callback()
2021-06-05 09:26:32 +00:00
{
if (Auth::guest()) {
return abort(500);
}
2021-06-05 09:26:32 +00:00
2021-11-18 18:22:09 +00:00
/** @var User $user */
$user = Auth::user();
2021-06-05 09:26:32 +00:00
$discord = Socialite::driver('discord')->user();
$botToken = config('SETTINGS::DISCORD:BOT_TOKEN');
$guildId = config('SETTINGS::DISCORD:GUILD_ID');
$roleId = config('SETTINGS::DISCORD:ROLE_ID');
//save / update discord_users
2022-05-31 06:39:45 +00:00
//check if discord account is already linked to an cpgg account
if (is_null($user->discordUser)) {
$discordLinked = DiscordUser::where('id', '=', $discord->id)->first();
if ($discordLinked !== null) {
return redirect()->route('profile.index')->with(
2022-05-31 06:39:45 +00:00
'error',
'Discord account already linked!'
);
}
2022-05-31 06:39:45 +00:00
//create discord user in db
DiscordUser::create(array_merge($discord->user, ['user_id' => Auth::user()->id]));
2022-05-31 06:39:45 +00:00
//update user
Auth::user()->increment('credits', config('SETTINGS::USER:CREDITS_REWARD_AFTER_VERIFY_DISCORD'));
Auth::user()->increment('server_limit', config('SETTINGS::USER:SERVER_LIMIT_REWARD_AFTER_VERIFY_DISCORD'));
Auth::user()->update(['discord_verified_at' => now()]);
} else {
$user->discordUser->update($discord->user);
}
//force user into discord server
//TODO Add event on failure, to notify ppl involved
if (! empty($guildId) && ! empty($botToken)) {
$response = Http::withHeaders(
[
'Authorization' => 'Bot '.$botToken,
'Content-Type' => 'application/json',
]
)->put(
"https://discord.com/api/guilds/{$guildId}/members/{$discord->id}",
['access_token' => $discord->token]
);
//give user a role in the discord server
if (! empty($roleId)) {
$response = Http::withHeaders(
[
'Authorization' => 'Bot '.$botToken,
'Content-Type' => 'application/json',
]
)->put(
"https://discord.com/api/guilds/{$guildId}/members/{$discord->id}/roles/{$roleId}",
['access_token' => $discord->token]
);
}
}
return redirect()->route('profile.index')->with(
'success',
'Discord account linked!'
);
2021-06-05 09:26:32 +00:00
}
}