SocialiteController.php 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <?php
  2. namespace App\Http\Controllers\Auth;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\Configuration;
  5. use App\Models\DiscordUser;
  6. use Illuminate\Support\Facades\Auth;
  7. use Illuminate\Support\Facades\Http;
  8. use Laravel\Socialite\Facades\Socialite;
  9. class SocialiteController extends Controller
  10. {
  11. public function redirect()
  12. {
  13. $scopes = !empty(env('DISCORD_BOT_TOKEN')) && !empty(env('DISCORD_GUILD_ID')) ? ['guilds.join'] : [];
  14. return Socialite::driver('discord')
  15. ->scopes($scopes)
  16. ->redirect();
  17. }
  18. public function callback()
  19. {
  20. if (Auth::guest()) {
  21. return abort(500);
  22. }
  23. $discord = Socialite::driver('discord')->user();
  24. $discordUser = DiscordUser::find($discord->id);
  25. $guildId = env('DISCORD_GUILD_ID');
  26. $botToken = env('DISCORD_BOT_TOKEN');
  27. //force user into discord server
  28. //TODO Add event on failure, to notify ppl involved
  29. if (!empty($guildId) && !empty($botToken)) {
  30. $response = Http::withHeaders(
  31. [
  32. 'Authorization' => 'Bot ' . $botToken,
  33. 'Content-Type' => 'application/json',
  34. ]
  35. )->put("https://discord.com/api/guilds/{$guildId}/members/{$discord->id}",
  36. ['access_token' => $discord->token]);
  37. }
  38. if (is_null($discordUser)) {
  39. //create discord user in db
  40. DiscordUser::create(array_merge($discord->user, ['user_id' => Auth::user()->id]));
  41. //update user
  42. Auth::user()->increment('credits', Configuration::getValueByKey('CREDITS_REWARD_AFTER_VERIFY_DISCORD'));
  43. Auth::user()->increment('server_limit', Configuration::getValueByKey('SERVER_LIMIT_REWARD_AFTER_VERIFY_DISCORD'));
  44. Auth::user()->update(['discord_verified_at' => now()]);
  45. } else {
  46. $discordUser->update($discord->user);
  47. }
  48. return redirect()->route('profile.index')->with(
  49. 'success',
  50. 'Discord account linked!'
  51. );
  52. }
  53. }