SocialiteController.php 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <?php
  2. namespace App\Http\Controllers\Auth;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\DiscordUser;
  5. use App\Models\Settings;
  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(config("SETTINGS::DISCORD:BOT_TOKEN")) && !empty(config("SETTINGS::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 = config("SETTINGS::DISCORD:BOT_TOKEN");
  29. $guildId = config("SETTINGS::DISCORD:GUILD_ID");
  30. $roleId = config("SETTINGS::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', config('SETTINGS::USER:CREDITS_REWARD_AFTER_VERIFY_DISCORD'));
  37. Auth::user()->increment('server_limit', config('SETTINGS::USER: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(
  51. "https://discord.com/api/guilds/{$guildId}/members/{$discord->id}",
  52. ['access_token' => $discord->token]
  53. );
  54. //give user a role in the discord server
  55. if (!empty($roleId)) {
  56. $response = Http::withHeaders(
  57. [
  58. 'Authorization' => 'Bot ' . $botToken,
  59. 'Content-Type' => 'application/json',
  60. ]
  61. )->put(
  62. "https://discord.com/api/guilds/{$guildId}/members/{$discord->id}/roles/{$roleId}",
  63. ['access_token' => $discord->token]
  64. );
  65. }
  66. }
  67. return redirect()->route('profile.index')->with(
  68. 'success',
  69. 'Discord account linked!'
  70. );
  71. }
  72. }