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 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(env('DISCORD_BOT_TOKEN')) && !empty(env('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. $discord = Socialite::driver('discord')->user();
  24. $discordUser = DiscordUser::find($discord->id);
  25. $botToken = env('DISCORD_BOT_TOKEN');
  26. $guildId = env('DISCORD_GUILD_ID');
  27. $roleId = env('DISCORD_ROLE_ID');
  28. //force user into discord server
  29. //TODO Add event on failure, to notify ppl involved
  30. if (!empty($guildId) && !empty($botToken)) {
  31. $response = Http::withHeaders(
  32. [
  33. 'Authorization' => 'Bot ' . $botToken,
  34. 'Content-Type' => 'application/json',
  35. ]
  36. )->put("https://discord.com/api/guilds/{$guildId}/members/{$discord->id}",
  37. ['access_token' => $discord->token]);
  38. //give user a role in the discord server
  39. if (!empty($roleId)){
  40. $response = Http::withHeaders(
  41. [
  42. 'Authorization' => 'Bot ' . $botToken,
  43. 'Content-Type' => 'application/json',
  44. ]
  45. )->put("https://discord.com/api/guilds/{$guildId}/members/{$discord->id}/roles/{$roleId}",
  46. ['access_token' => $discord->token]);
  47. }
  48. }
  49. if (is_null($discordUser)) {
  50. //create discord user in db
  51. DiscordUser::create(array_merge($discord->user, ['user_id' => Auth::user()->id]));
  52. //update user
  53. Auth::user()->increment('credits', Configuration::getValueByKey('CREDITS_REWARD_AFTER_VERIFY_DISCORD'));
  54. Auth::user()->increment('server_limit', Configuration::getValueByKey('SERVER_LIMIT_REWARD_AFTER_VERIFY_DISCORD'));
  55. Auth::user()->update(['discord_verified_at' => now()]);
  56. } else {
  57. $discordUser->update($discord->user);
  58. }
  59. return redirect()->route('profile.index')->with(
  60. 'success',
  61. 'Discord account linked!'
  62. );
  63. }
  64. }