SocialiteController.php 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <?php
  2. namespace App\Http\Controllers\Auth;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\DiscordUser;
  5. use App\Models\User;
  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(config('SETTINGS::DISCORD:BOT_TOKEN')) && ! empty(config('SETTINGS::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. /** @var User $user */
  24. $user = Auth::user();
  25. $discord = Socialite::driver('discord')->user();
  26. $botToken = config('SETTINGS::DISCORD:BOT_TOKEN');
  27. $guildId = config('SETTINGS::DISCORD:GUILD_ID');
  28. $roleId = config('SETTINGS::DISCORD:ROLE_ID');
  29. //save / update discord_users
  30. //check if discord account is already linked to an cpgg account
  31. if (is_null($user->discordUser)) {
  32. $discordLinked = DiscordUser::where('id', '=', $discord->id)->first();
  33. if ($discordLinked !== null) {
  34. return redirect()->route('profile.index')->with(
  35. 'error',
  36. 'Discord account already linked!'
  37. );
  38. }
  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', config('SETTINGS::USER:CREDITS_REWARD_AFTER_VERIFY_DISCORD'));
  43. Auth::user()->increment('server_limit', config('SETTINGS::USER:SERVER_LIMIT_REWARD_AFTER_VERIFY_DISCORD'));
  44. Auth::user()->update(['discord_verified_at' => now()]);
  45. } else {
  46. $user->discordUser->update($discord->user);
  47. }
  48. //force user into discord server
  49. //TODO Add event on failure, to notify ppl involved
  50. if (! empty($guildId) && ! empty($botToken)) {
  51. $response = Http::withHeaders(
  52. [
  53. 'Authorization' => 'Bot '.$botToken,
  54. 'Content-Type' => 'application/json',
  55. ]
  56. )->put(
  57. "https://discord.com/api/guilds/{$guildId}/members/{$discord->id}",
  58. ['access_token' => $discord->token]
  59. );
  60. //give user a role in the discord server
  61. if (! empty($roleId)) {
  62. $response = Http::withHeaders(
  63. [
  64. 'Authorization' => 'Bot '.$botToken,
  65. 'Content-Type' => 'application/json',
  66. ]
  67. )->put(
  68. "https://discord.com/api/guilds/{$guildId}/members/{$discord->id}/roles/{$roleId}",
  69. ['access_token' => $discord->token]
  70. );
  71. }
  72. }
  73. return redirect()->route('profile.index')->with(
  74. 'success',
  75. 'Discord account linked!'
  76. );
  77. }
  78. }