From 1be4f92b1b0b563b65a62ac78904cb6f28f67e71 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Tue, 28 Apr 2020 00:17:37 +0200 Subject: [PATCH] Finished Spring application - and it works! --- .../io/github/norbipeti/gcdc/Application.java | 5 +++ .../gcdc/controller/DCController.java | 33 +++++++++++-------- .../gcdc/service/DiscordService.java | 11 ++++--- .../gcdc/service/SessionService.java | 9 ++--- 4 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/main/java/io/github/norbipeti/gcdc/Application.java b/src/main/java/io/github/norbipeti/gcdc/Application.java index 2265e10..52bf4e1 100644 --- a/src/main/java/io/github/norbipeti/gcdc/Application.java +++ b/src/main/java/io/github/norbipeti/gcdc/Application.java @@ -3,8 +3,13 @@ package io.github.norbipeti.gcdc; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import java.util.Collections; +import java.util.Map; + @SpringBootApplication public class Application { + public static final Map RESULT_OK = Collections.singletonMap("response", "OK"); + public static void main(String[] args) { SpringApplication.run(Application.class, args); } diff --git a/src/main/java/io/github/norbipeti/gcdc/controller/DCController.java b/src/main/java/io/github/norbipeti/gcdc/controller/DCController.java index a3c8c69..b17cd4e 100644 --- a/src/main/java/io/github/norbipeti/gcdc/controller/DCController.java +++ b/src/main/java/io/github/norbipeti/gcdc/controller/DCController.java @@ -2,37 +2,42 @@ package io.github.norbipeti.gcdc.controller; import bell.oauth.discord.main.OAuthBuilder; import bell.oauth.discord.main.Response; -import discord4j.core.object.entity.Message; import discord4j.core.object.util.Snowflake; +import io.github.norbipeti.gcdc.Application; import io.github.norbipeti.gcdc.model.Session; import io.github.norbipeti.gcdc.service.DiscordService; import io.github.norbipeti.gcdc.service.SessionService; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.async.DeferredResult; import org.springframework.web.server.ResponseStatusException; +import javax.annotation.PostConstruct; import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; -import java.security.Principal; -import java.util.Collections; import java.util.Map; import java.util.UUID; @RestController @RequiredArgsConstructor public class DCController { - private static final Map RESULT_OK = Collections.singletonMap("response", "OK"); private final SessionService service; private final DiscordService discordService; @Value("${discord.secret}") private String secret; - private final OAuthBuilder builder = new OAuthBuilder("680138144812892371", secret); + private OAuthBuilder builder; + + @PostConstruct + public void init() { + builder = new OAuthBuilder("680138144812892371", secret); + } @GetMapping("/api/users/register") - public Map register(@RequestParam String state, @RequestParam String code, HttpServletRequest request) { + public String register(@RequestParam String state, @RequestParam String code, HttpServletRequest request) { if (state == null || code == null) throw new ResponseStatusException(HttpStatus.BAD_REQUEST); long channel; try { channel = Long.parseLong(state); } catch (NumberFormatException e) { @@ -43,21 +48,21 @@ public class DCController { throw new ResponseStatusException(HttpStatus.BAD_REQUEST); long user = Snowflake.of(builder.getUser().getId()).asLong(); service.deleteSession(user); - service.insertSession(new Session(UUID.randomUUID().toString(), Snowflake.of(channel), user)); - return RESULT_OK; + String token = UUID.randomUUID().toString(); + service.insertSession(new Session(token, Snowflake.of(channel), user)); + return "Run the following command:
\ndcsetup \"" + token + "\""; } @GetMapping("/api/users/get") public Map getUser(@RequestParam String token) { getSession(token); //Returns unauthorized if needed - return RESULT_OK; + return Application.RESULT_OK; } @PostMapping("/api/messages/send") - public Map sendMessage(@RequestParam String token, @RequestParam String message) { + public DeferredResult> sendMessage(@RequestParam String token, @RequestParam String message) { var sess = getSession(token); - discordService.sendMessage(sess.getChannel().asLong(), sess.getUser(), message); - return RESULT_OK; + return discordService.sendMessage(sess.getChannel().asLong(), sess.getUser(), message); } @GetMapping("/api/messages/get") diff --git a/src/main/java/io/github/norbipeti/gcdc/service/DiscordService.java b/src/main/java/io/github/norbipeti/gcdc/service/DiscordService.java index f75158d..f222fae 100644 --- a/src/main/java/io/github/norbipeti/gcdc/service/DiscordService.java +++ b/src/main/java/io/github/norbipeti/gcdc/service/DiscordService.java @@ -5,9 +5,8 @@ import discord4j.core.DiscordClientBuilder; import discord4j.core.event.domain.message.MessageCreateEvent; import discord4j.core.object.entity.GuildMessageChannel; import discord4j.core.object.entity.Member; -import discord4j.core.object.entity.Message; -import discord4j.core.object.entity.MessageChannel; import discord4j.core.object.util.Snowflake; +import io.github.norbipeti.gcdc.Application; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.context.request.async.DeferredResult; @@ -39,11 +38,15 @@ public class DiscordService { client.login().subscribe(); } - public void sendMessage(long channel, long user, String message) { + public DeferredResult> sendMessage(long channel, long user, String message) { + var result = new DeferredResult>(); client.getChannelById(Snowflake.of(channel)).cast(GuildMessageChannel.class) .flatMap(ch -> getUsername(user, ch) .flatMap(name -> ch.createEmbed(ecs -> ecs.setAuthor(name, null, null) - .setColor(Color.BLUE).setDescription(message)))).subscribe(); + .setColor(Color.BLUE).setDescription(message)))) + .doOnError(result::setErrorResult) + .subscribe(msg -> result.setResult(Application.RESULT_OK)); + return result; } private final HashMap>> requests = new HashMap<>(); diff --git a/src/main/java/io/github/norbipeti/gcdc/service/SessionService.java b/src/main/java/io/github/norbipeti/gcdc/service/SessionService.java index 76034c3..1d42c4b 100644 --- a/src/main/java/io/github/norbipeti/gcdc/service/SessionService.java +++ b/src/main/java/io/github/norbipeti/gcdc/service/SessionService.java @@ -23,8 +23,8 @@ public class SessionService extends JdbcDaoSupport { } public void insertSession(Session session) { - String sql = "INSERT INTO sessions(token, channel) VALUES (?, ?)"; - getJdbcTemplate().update(sql, session.getToken(), session.getChannel().asLong()); + String sql = "INSERT INTO sessions(token, channel, \"user\") VALUES (?, ?, ?)"; + getJdbcTemplate().update(sql, session.getToken(), session.getChannel().asLong(), session.getUser()); } public Session getSession(String token) { @@ -33,7 +33,7 @@ public class SessionService extends JdbcDaoSupport { } public Session getSession(long user) { - String sql = "SELECT * FROM sessions WHERE user=? LIMIT 1"; + String sql = "SELECT * FROM sessions WHERE \"user\"=? LIMIT 1"; return getSession(getJdbcTemplate().queryForList(sql, user)); } @@ -49,8 +49,9 @@ public class SessionService extends JdbcDaoSupport { String sql = "DELETE FROM sessions WHERE token=?"; getJdbcTemplate().update(sql, token); } + public void deleteSession(long user) { - String sql = "DELETE FROM sessions WHERE user=?"; + String sql = "DELETE FROM sessions WHERE \"user\"=?"; getJdbcTemplate().update(sql, user); }