SocialiteController.php 2.6 KB

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