SocialiteController.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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 App\Models\User;
  7. use App\Models\Voucher;
  8. use Illuminate\Support\Facades\Auth;
  9. use Illuminate\Support\Facades\Http;
  10. use Laravel\Socialite\Facades\Socialite;
  11. class SocialiteController extends Controller
  12. {
  13. public function redirect()
  14. {
  15. $scopes = !empty(env('DISCORD_BOT_TOKEN')) && !empty(env('DISCORD_GUILD_ID')) ? ['guilds.join'] : [];
  16. return Socialite::driver('discord')
  17. ->scopes($scopes)
  18. ->redirect();
  19. }
  20. public function callback()
  21. {
  22. if (Auth::guest()) {
  23. return abort(500);
  24. }
  25. /** @var User $user */
  26. $user = Auth::user();
  27. $discord = Socialite::driver('discord')->user();
  28. $botToken = env('DISCORD_BOT_TOKEN');
  29. $guildId = env('DISCORD_GUILD_ID');
  30. $roleId = env('DISCORD_ROLE_ID');
  31. //save / update discord_users
  32. if (is_null($user->discordUser)) {
  33. //create discord user in db
  34. DiscordUser::create(array_merge($discord->user, ['user_id' => Auth::user()->id]));
  35. //update user
  36. Auth::user()->increment('credits', Configuration::getValueByKey('CREDITS_REWARD_AFTER_VERIFY_DISCORD'));
  37. Auth::user()->increment('server_limit', Configuration::getValueByKey('SERVER_LIMIT_REWARD_AFTER_VERIFY_DISCORD'));
  38. Auth::user()->update(['discord_verified_at' => now()]);
  39. } else {
  40. $user->discordUser->update($discord->user);
  41. }
  42. //force user into discord server
  43. //TODO Add event on failure, to notify ppl involved
  44. if (!empty($guildId) && !empty($botToken)) {
  45. $response = Http::withHeaders(
  46. [
  47. 'Authorization' => 'Bot ' . $botToken,
  48. 'Content-Type' => 'application/json',
  49. ]
  50. )->put("https://discord.com/api/guilds/{$guildId}/members/{$discord->id}",
  51. ['access_token' => $discord->token]);
  52. //give user a role in the discord server
  53. if (!empty($roleId)){
  54. $response = Http::withHeaders(
  55. [
  56. 'Authorization' => 'Bot ' . $botToken,
  57. 'Content-Type' => 'application/json',
  58. ]
  59. )->put("https://discord.com/api/guilds/{$guildId}/members/{$discord->id}/roles/{$roleId}",
  60. ['access_token' => $discord->token]);
  61. }
  62. }
  63. return redirect()->route('profile.index')->with(
  64. 'success',
  65. 'Discord account linked!'
  66. );
  67. }
  68. }