SocialiteController.php 3.2 KB

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