SocialiteController.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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 App\Settings\DiscordSettings;
  7. use App\Settings\UserSettings;
  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(DiscordSettings $discord_settings)
  14. {
  15. $scopes = !empty($discord_settings->bot_token) && !empty($discord_settings->guild_id) ? ['guilds.join'] : [];
  16. return Socialite::driver('discord')
  17. ->scopes($scopes)
  18. ->redirect();
  19. }
  20. public function callback(DiscordSettings $discord_settings, UserSettings $user_settings)
  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 = $discord_settings->bot_token;
  29. $guildId = $discord_settings->guild_id;
  30. $roleId = $discord_settings->role_id;
  31. //save / update discord_users
  32. //check if discord account is already linked to an cpgg account
  33. if (is_null($user->discordUser)) {
  34. $discordLinked = DiscordUser::where('id', '=', $discord->id)->first();
  35. if ($discordLinked !== null) {
  36. return redirect()->route('profile.index')->with(
  37. 'error',
  38. 'Discord account already linked!'
  39. );
  40. }
  41. //create discord user in db
  42. DiscordUser::create(array_merge($discord->user, ['user_id' => Auth::user()->id]));
  43. //update user
  44. Auth::user()->increment('credits', $user_settings->credits_reward_after_verify_discord);
  45. Auth::user()->increment('server_limit', $user_settings->server_limit_after_verify_discord);
  46. Auth::user()->update(['discord_verified_at' => now()]);
  47. } else {
  48. $user->discordUser->update($discord->user);
  49. }
  50. //force user into discord server
  51. //TODO Add event on failure, to notify ppl involved
  52. if (! empty($guildId) && ! empty($botToken)) {
  53. $response = Http::withHeaders(
  54. [
  55. 'Authorization' => 'Bot '.$botToken,
  56. 'Content-Type' => 'application/json',
  57. ]
  58. )->put(
  59. "https://discord.com/api/guilds/{$guildId}/members/{$discord->id}",
  60. ['access_token' => $discord->token]
  61. );
  62. //give user a role in the discord server
  63. if (! empty($roleId)) {
  64. $response = Http::withHeaders(
  65. [
  66. 'Authorization' => 'Bot '.$botToken,
  67. 'Content-Type' => 'application/json',
  68. ]
  69. )->put(
  70. "https://discord.com/api/guilds/{$guildId}/members/{$discord->id}/roles/{$roleId}",
  71. ['access_token' => $discord->token]
  72. );
  73. }
  74. }
  75. return redirect()->route('profile.index')->with(
  76. 'success',
  77. 'Discord account linked!'
  78. );
  79. }
  80. }