From 1be4f92b1b0b563b65a62ac78904cb6f28f67e71 Mon Sep 17 00:00:00 2001
From: NorbiPeti <szatmari.norbert.peter@gmail.com>
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<String, String> 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<String, String> 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<String, String> 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:<br/>\ndcsetup \"" + token + "\"";
 	}
 
 	@GetMapping("/api/users/get")
 	public Map<String, String> getUser(@RequestParam String token) {
 		getSession(token); //Returns unauthorized if needed
-		return RESULT_OK;
+		return Application.RESULT_OK;
 	}
 
 	@PostMapping("/api/messages/send")
-	public Map<String, String> sendMessage(@RequestParam String token, @RequestParam String message) {
+	public DeferredResult<Map<String, String>> 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<Map<String, String>> sendMessage(long channel, long user, String message) {
+		var result = new DeferredResult<Map<String, String>>();
 		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<Long, DeferredResult<Map<String, String>>> 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);
 	}