You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.9KB

  1. package io.github.norbipeti.gcdc.controller;
  2. import bell.oauth.discord.main.OAuthBuilder;
  3. import bell.oauth.discord.main.Response;
  4. import discord4j.core.object.entity.Message;
  5. import discord4j.core.object.util.Snowflake;
  6. import io.github.norbipeti.gcdc.model.Session;
  7. import io.github.norbipeti.gcdc.service.DiscordService;
  8. import io.github.norbipeti.gcdc.service.SessionService;
  9. import lombok.RequiredArgsConstructor;
  10. import org.springframework.beans.factory.annotation.Value;
  11. import org.springframework.http.HttpStatus;
  12. import org.springframework.web.bind.annotation.*;
  13. import org.springframework.web.context.request.async.DeferredResult;
  14. import org.springframework.web.server.ResponseStatusException;
  15. import javax.servlet.http.HttpServletRequest;
  16. import javax.validation.Valid;
  17. import java.security.Principal;
  18. import java.util.Collections;
  19. import java.util.Map;
  20. import java.util.UUID;
  21. @RestController
  22. @RequiredArgsConstructor
  23. public class DCController {
  24. private static final Map<String, String> RESULT_OK = Collections.singletonMap("response", "OK");
  25. private final SessionService service;
  26. private final DiscordService discordService;
  27. @Value("${discord.secret}")
  28. private String secret;
  29. private final OAuthBuilder builder = new OAuthBuilder("680138144812892371", secret);
  30. @GetMapping("/api/users/register")
  31. public Map<String, String> register(@RequestParam String state, @RequestParam String code, HttpServletRequest request) {
  32. if (state == null || code == null) throw new ResponseStatusException(HttpStatus.BAD_REQUEST);
  33. long channel;
  34. try { channel = Long.parseLong(state); } catch (NumberFormatException e) {
  35. throw new ResponseStatusException(HttpStatus.BAD_REQUEST);
  36. }
  37. builder.setRedirectURI(request.getRequestURL().toString());
  38. if (builder.exchange(code) == Response.ERROR)
  39. throw new ResponseStatusException(HttpStatus.BAD_REQUEST);
  40. long user = Snowflake.of(builder.getUser().getId()).asLong();
  41. service.deleteSession(user);
  42. service.insertSession(new Session(UUID.randomUUID().toString(), Snowflake.of(channel), user));
  43. return RESULT_OK;
  44. }
  45. @GetMapping("/api/users/get")
  46. public Map<String, String> getUser(@RequestParam String token) {
  47. getSession(token); //Returns unauthorized if needed
  48. return RESULT_OK;
  49. }
  50. @PostMapping("/api/messages/send")
  51. public Map<String, String> sendMessage(@RequestParam String token, @RequestParam String message) {
  52. var sess = getSession(token);
  53. discordService.sendMessage(sess.getChannel().asLong(), sess.getUser(), message);
  54. return RESULT_OK;
  55. }
  56. @GetMapping("/api/messages/get")
  57. public DeferredResult<Map<String, String>> getMessage(@RequestParam String token) {
  58. var sess = getSession(token);
  59. return discordService.getMessage(sess.getChannel().asLong());
  60. }
  61. private Session getSession(String token) {
  62. var sess = service.getSession(token);
  63. if (sess == null)
  64. throw new ResponseStatusException(HttpStatus.UNAUTHORIZED);
  65. return sess;
  66. }
  67. }