diff --git a/jbot-example/src/main/java/example/jbot/facebook/FbBot.java b/jbot-example/src/main/java/example/jbot/facebook/FbBot.java index fb55688e..d51d004a 100644 --- a/jbot-example/src/main/java/example/jbot/facebook/FbBot.java +++ b/jbot-example/src/main/java/example/jbot/facebook/FbBot.java @@ -4,20 +4,21 @@ import me.ramswaroop.jbot.core.common.EventType; import me.ramswaroop.jbot.core.common.JBot; import me.ramswaroop.jbot.core.facebook.Bot; +import me.ramswaroop.jbot.core.facebook.FacebookProperties; import me.ramswaroop.jbot.core.facebook.models.Attachment; import me.ramswaroop.jbot.core.facebook.models.Button; import me.ramswaroop.jbot.core.facebook.models.Element; import me.ramswaroop.jbot.core.facebook.models.Event; import me.ramswaroop.jbot.core.facebook.models.Message; import me.ramswaroop.jbot.core.facebook.models.Payload; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Profile; +import org.springframework.web.client.RestTemplate; /** * A simple Facebook Bot. You can create multiple bots by just * extending {@link Bot} class like this one. Though it is * recommended to create only bot per jbot instance. - * + * * @author ramswaroop * @version 17/09/2016 */ @@ -25,31 +26,23 @@ @Profile("facebook") public class FbBot extends Bot { - /** - * Set this property in {@code application.properties}. - */ - @Value("${fbBotToken}") - private String fbToken; - - /** - * Set this property in {@code application.properties}. - */ - @Value("${fbPageAccessToken}") - private String pageAccessToken; + FbBot(FacebookProperties facebookProperties, RestTemplate restTemplate) { + super(facebookProperties, restTemplate); + } @Override public String getFbToken() { - return fbToken; + return facebookProperties.getBotToken(); } @Override public String getPageAccessToken() { - return pageAccessToken; + return facebookProperties.getPageAccessToken(); } /** * Sets the "Get Started" button with a payload "hi". It also set the "Greeting Text" which the user sees when it - * opens up the chat window. Uncomment the {@code @PostConstruct} annotation only after you have verified your + * opens up the chat window. Uncomment the {@code @PostConstruct} annotation only after you have verified your * webhook. */ //@PostConstruct @@ -185,7 +178,7 @@ public void confirmTiming(Event event) { public void askTimeForMeeting(Event event) { if (event.getMessage().getText().contains("yes")) { reply(event, "Okay. Would you like me to set a reminder for you?"); - nextConversation(event); // jump to next question in conversation + nextConversation(event); // jump to next question in conversation } else { reply(event, "No problem. You can always schedule one with 'setup meeting' command."); stopConversation(event); // stop conversation only if user says no diff --git a/jbot-example/src/main/java/example/jbot/slack/SlackBot.java b/jbot-example/src/main/java/example/jbot/slack/SlackBot.java index d1164818..bf62b84b 100644 --- a/jbot-example/src/main/java/example/jbot/slack/SlackBot.java +++ b/jbot-example/src/main/java/example/jbot/slack/SlackBot.java @@ -4,10 +4,11 @@ import me.ramswaroop.jbot.core.common.EventType; import me.ramswaroop.jbot.core.common.JBot; import me.ramswaroop.jbot.core.slack.Bot; +import me.ramswaroop.jbot.core.slack.SlackProperties; +import me.ramswaroop.jbot.core.slack.SlackService; import me.ramswaroop.jbot.core.slack.models.Event; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Profile; import org.springframework.web.socket.WebSocketSession; @@ -27,12 +28,12 @@ public class SlackBot extends Bot { private static final Logger logger = LoggerFactory.getLogger(SlackBot.class); - /** - * Slack token from application.properties file. You can get your slack token - * next creating a new bot. - */ - @Value("${slackBotToken}") - private String slackToken; + private final String slackToken; + + SlackBot(SlackService slackService, SlackProperties slackProperties) { + super(slackService); + this.slackToken = slackProperties.getSlackBotToken(); + } @Override public String getSlackToken() { @@ -139,7 +140,7 @@ public void confirmTiming(WebSocketSession session, Event event) { public void askTimeForMeeting(WebSocketSession session, Event event) { if (event.getText().contains("yes")) { reply(session, event, "Okay. Would you like me to set a reminder for you?"); - nextConversation(event); // jump to next question in conversation + nextConversation(event); // jump to next question in conversation } else { reply(session, event, "No problem. You can always schedule one with 'setup meeting' command."); stopConversation(event); // stop conversation only if user says no @@ -161,4 +162,4 @@ public void askWhetherToRepeat(WebSocketSession session, Event event) { } stopConversation(event); // stop conversation } -} \ No newline at end of file +} diff --git a/jbot-example/src/main/java/example/jbot/slack/SlackSlashCommand.java b/jbot-example/src/main/java/example/jbot/slack/SlackSlashCommand.java index b24e8f78..207e551b 100644 --- a/jbot-example/src/main/java/example/jbot/slack/SlackSlashCommand.java +++ b/jbot-example/src/main/java/example/jbot/slack/SlackSlashCommand.java @@ -2,11 +2,12 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; + +import me.ramswaroop.jbot.core.slack.SlackProperties; import me.ramswaroop.jbot.core.slack.models.Attachment; import me.ramswaroop.jbot.core.slack.models.RichMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Profile; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestMapping; @@ -26,13 +27,11 @@ public class SlackSlashCommand { private static final Logger logger = LoggerFactory.getLogger(SlackSlashCommand.class); - /** - * The token you get while creating a new Slash Command. You - * should paste the token in application.properties file. - */ - @Value("${slashCommandToken}") - private String slackToken; + private final SlackProperties slackProperties; + SlackSlashCommand(SlackProperties slackProperties) { + this.slackProperties = slackProperties; + } /** * Slash Command handler. When a user types for example "/app help" @@ -65,7 +64,7 @@ public RichMessage onReceiveSlashCommand(@RequestParam("token") String token, @RequestParam("text") String text, @RequestParam("response_url") String responseUrl) { // validate token - if (!token.equals(slackToken)) { + if (!token.equals(slackProperties.getSlashCommandToken())) { return new RichMessage("Sorry! You're not lucky enough to use our slack command."); } @@ -77,7 +76,7 @@ public RichMessage onReceiveSlashCommand(@RequestParam("token") String token, attachments[0] = new Attachment(); attachments[0].setText("I will perform all tasks for you."); richMessage.setAttachments(attachments); - + // For debugging purpose only if (logger.isDebugEnabled()) { try { @@ -86,7 +85,7 @@ public RichMessage onReceiveSlashCommand(@RequestParam("token") String token, logger.debug("Error parsing RichMessage: ", e); } } - + return richMessage.encodedMessage(); // don't forget to send the encoded message to Slack } } diff --git a/jbot-example/src/main/java/example/jbot/slack/SlackWebhooks.java b/jbot-example/src/main/java/example/jbot/slack/SlackWebhooks.java index 850f0bc0..27805fda 100644 --- a/jbot-example/src/main/java/example/jbot/slack/SlackWebhooks.java +++ b/jbot-example/src/main/java/example/jbot/slack/SlackWebhooks.java @@ -2,11 +2,12 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; + +import me.ramswaroop.jbot.core.slack.SlackProperties; import me.ramswaroop.jbot.core.slack.models.Attachment; import me.ramswaroop.jbot.core.slack.models.RichMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import org.springframework.web.client.RestClientException; @@ -30,13 +31,11 @@ public class SlackWebhooks { private static final Logger logger = LoggerFactory.getLogger(SlackWebhooks.class); - /** - * The Url you get while configuring a new incoming webhook - * on Slack. You can setup a new incoming webhook - * here. - */ - @Value("${slackIncomingWebhookUrl}") - private String slackIncomingWebhookUrl; + private final SlackProperties slackProperties; + + SlackWebhooks(SlackProperties slackProperties) { + this.slackProperties = slackProperties; + } /** * Make a POST call to the incoming webhook url. @@ -60,7 +59,7 @@ public void invokeSlackWebhook() { // Always remember to send the encoded message to Slack try { - restTemplate.postForEntity(slackIncomingWebhookUrl, richMessage.encodedMessage(), String.class); + restTemplate.postForEntity(slackProperties.getSlackIncomingWebhookUrl(), richMessage.encodedMessage(), String.class); } catch (RestClientException e) { logger.error("Error posting to Slack Incoming Webhook: ", e); } diff --git a/jbot-example/src/main/resources/application.properties b/jbot-example/src/main/resources/application.properties index 24635232..1e0b91d0 100644 --- a/jbot-example/src/main/resources/application.properties +++ b/jbot-example/src/main/resources/application.properties @@ -5,14 +5,14 @@ logging.level.me.ramswaroop=DEBUG server.port=8080 # slack integrations -rtmUrl=https://slack.com/api/rtm.start?token={token}&simple_latest&no_unreads -slackBotToken= -slashCommandToken= -slackIncomingWebhookUrl= +jbot.slack.rtmUrl=https://slack.com/api/rtm.start?token={token}&simple_latest&no_unreads +jbot.slack.slackBotToken= +jbot.slack.slashCommandToken= +jbot.slack.slackIncomingWebhookUrl= # fb bot -fbSubscribeUrl=https://graph.facebook.com/v2.7/me/subscribed_apps -fbSendUrl=https://graph.facebook.com/v2.6/me/messages?access_token={PAGE_ACCESS_TOKEN} -fbMessengerProfileUrl=https://graph.facebook.com/v2.6/me/messenger_profile?access_token={PAGE_ACCESS_TOKEN} -fbBotToken=fb_token_for_jbot -fbPageAccessToken= \ No newline at end of file +jbot.facebook.subscribeUrl=https://graph.facebook.com/v2.7/me/subscribed_apps +jbot.facebook.sendUrl=https://graph.facebook.com/v2.6/me/messages?access_token={PAGE_ACCESS_TOKEN} +jbot.facebook.messengerProfileUrl=https://graph.facebook.com/v2.6/me/messenger_profile?access_token={PAGE_ACCESS_TOKEN} +jbot.facebook.botToken=fb_token_for_jbot +jbot.facebook.pageAccessToken= diff --git a/jbot-example/src/test/java/example/jbot/facebook/FbBotTest.java b/jbot-example/src/test/java/example/jbot/facebook/FbBotTest.java index 14ab03f3..26fca06f 100644 --- a/jbot-example/src/test/java/example/jbot/facebook/FbBotTest.java +++ b/jbot-example/src/test/java/example/jbot/facebook/FbBotTest.java @@ -4,6 +4,7 @@ import me.ramswaroop.jbot.core.common.Controller; import me.ramswaroop.jbot.core.common.EventType; import me.ramswaroop.jbot.core.facebook.Bot; +import me.ramswaroop.jbot.core.facebook.FacebookProperties; import me.ramswaroop.jbot.core.facebook.models.Callback; import me.ramswaroop.jbot.core.facebook.models.Event; import org.junit.Rule; @@ -11,10 +12,8 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; -import org.springframework.boot.test.context.SpringBootTest; +import org.mockito.junit.MockitoJUnitRunner; import org.springframework.boot.test.rule.OutputCapture; -import org.springframework.test.context.ActiveProfiles; import org.springframework.web.client.RestTemplate; import java.io.IOException; @@ -26,8 +25,6 @@ * @author ramswaroop * @version 11/03/2018 */ -@SpringBootTest -@ActiveProfiles("facebook") @RunWith(MockitoJUnitRunner.class) public class FbBotTest { @@ -39,7 +36,7 @@ public class FbBotTest { @Rule public OutputCapture capture = new OutputCapture(); - + @Test public void When_PostbackInCallback_Then_InvokeOnReceivePostback() throws IOException { Callback callback = new ObjectMapper().readValue("{\"object\":\"page\",\"entry\":[{\"id\":" + @@ -128,6 +125,10 @@ public void Given_InConversation_When_AnswerNoInCallback_Then_StopConversation() * Facebook Bot for unit tests. */ public static class TestBot extends Bot { + public TestBot(FacebookProperties facebookProperties, RestTemplate restTemplate) { + super(facebookProperties, restTemplate); + } + @Override public String getFbToken() { return "fb_token"; @@ -142,7 +143,7 @@ public String getPageAccessToken() { public void onReceivePostback(Event event) { reply(event, "Postback with payload `hi|hello|hey` received from facebook."); } - + @Controller(events = EventType.QUICK_REPLY, pattern = "(yes|no)") public void onReceiveQuickReply(Event event) { if ("yes".equals(event.getMessage().getQuickReply().getPayload())) { diff --git a/jbot-example/src/test/java/example/jbot/slack/SlackBotTest.java b/jbot-example/src/test/java/example/jbot/slack/SlackBotTest.java index 67e8568d..7a783888 100644 --- a/jbot-example/src/test/java/example/jbot/slack/SlackBotTest.java +++ b/jbot-example/src/test/java/example/jbot/slack/SlackBotTest.java @@ -13,10 +13,8 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; -import org.springframework.boot.test.context.SpringBootTest; +import org.mockito.junit.MockitoJUnitRunner; import org.springframework.boot.test.rule.OutputCapture; -import org.springframework.test.context.ActiveProfiles; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; @@ -31,8 +29,6 @@ * @author ramswaroop * @version 20/06/2016 */ -@SpringBootTest -@ActiveProfiles("slack") @RunWith(MockitoJUnitRunner.class) public class SlackBotTest { @@ -57,7 +53,6 @@ public void init() { // set rtm when(slackService.getDmChannels()).thenReturn(Arrays.asList("D1E79BACV", "C0NDSV5B8")); when(slackService.getCurrentUser()).thenReturn(user); - when(slackService.getWebSocketUrl()).thenReturn(""); } @Test @@ -201,6 +196,10 @@ public void Given_InConversation_When_AnswerNo_Then_StopConversation() { */ public static class TestBot extends Bot { + protected TestBot(SlackService slackService) { + super(slackService); + } + @Override public String getSlackToken() { return "slackToken"; @@ -277,4 +276,4 @@ public void askWhetherToRepeat(WebSocketSession session, Event event) { stopConversation(event); // stop conversation } } -} \ No newline at end of file +} diff --git a/jbot-example/src/test/java/example/jbot/slack/SlackSlashCommandTest.java b/jbot-example/src/test/java/example/jbot/slack/SlackSlashCommandTest.java index c6e57d57..db93c4af 100644 --- a/jbot-example/src/test/java/example/jbot/slack/SlackSlashCommandTest.java +++ b/jbot-example/src/test/java/example/jbot/slack/SlackSlashCommandTest.java @@ -4,12 +4,15 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import me.ramswaroop.jbot.core.slack.SlackProperties; + import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -25,6 +28,9 @@ public class SlackSlashCommandTest { @Autowired private MockMvc mvc; + @MockBean + private SlackProperties slackProperties; + @Test public void onReceiveSlashCommand_When_IncorrectToken_Should_ReturnSorryRichMessage() throws Exception { mvc.perform(MockMvcRequestBuilders.post("/slash-command?" + diff --git a/jbot/src/main/java/me/ramswaroop/jbot/core/facebook/Bot.java b/jbot/src/main/java/me/ramswaroop/jbot/core/facebook/Bot.java index 573a5537..a3883cf9 100644 --- a/jbot/src/main/java/me/ramswaroop/jbot/core/facebook/Bot.java +++ b/jbot/src/main/java/me/ramswaroop/jbot/core/facebook/Bot.java @@ -13,8 +13,6 @@ import me.ramswaroop.jbot.core.facebook.models.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.util.LinkedMultiValueMap; @@ -43,22 +41,23 @@ public abstract class Bot extends BaseBot { private static final Logger logger = LoggerFactory.getLogger(Bot.class); - @Value("${fbSubscribeUrl}") - private String subscribeUrl; + protected final RestTemplate restTemplate; - @Value("${fbSendUrl}") private String fbSendUrl; - @Value("${fbMessengerProfileUrl}") private String fbMessengerProfileUrl; - @Autowired - protected RestTemplate restTemplate; + protected final FacebookProperties facebookProperties; + + public Bot(FacebookProperties facebookProperties, RestTemplate restTemplate) { + this.facebookProperties = facebookProperties; + this.restTemplate = restTemplate; + } @PostConstruct private void constructFbSendUrl() { - fbSendUrl = fbSendUrl.replace("{PAGE_ACCESS_TOKEN}", getPageAccessToken()); - fbMessengerProfileUrl = fbMessengerProfileUrl.replace("{PAGE_ACCESS_TOKEN}", getPageAccessToken()); + fbSendUrl = facebookProperties.getSendUrl().replace("{PAGE_ACCESS_TOKEN}", getPageAccessToken()); + fbMessengerProfileUrl = facebookProperties.getMessengerProfileUrl().replace("{PAGE_ACCESS_TOKEN}", getPageAccessToken()); } /** @@ -231,7 +230,7 @@ public final ResponseEntity setGreetingText(Payload[] greeting) { public final void subscribeAppToPage() { MultiValueMap params = new LinkedMultiValueMap<>(); params.set("access_token", getPageAccessToken()); - restTemplate.postForEntity(subscribeUrl, params, String.class); + restTemplate.postForEntity(facebookProperties.getSubscribeUrl(), params, String.class); } /** diff --git a/jbot/src/main/java/me/ramswaroop/jbot/core/facebook/FacebookConfiguration.java b/jbot/src/main/java/me/ramswaroop/jbot/core/facebook/FacebookConfiguration.java new file mode 100644 index 00000000..9d6120b8 --- /dev/null +++ b/jbot/src/main/java/me/ramswaroop/jbot/core/facebook/FacebookConfiguration.java @@ -0,0 +1,13 @@ +package me.ramswaroop.jbot.core.facebook; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @author Maciej Walkowiak + * @version 14/04/2018 + */ +@Configuration +@EnableConfigurationProperties(FacebookProperties.class) +public class FacebookConfiguration { +} diff --git a/jbot/src/main/java/me/ramswaroop/jbot/core/facebook/FacebookProperties.java b/jbot/src/main/java/me/ramswaroop/jbot/core/facebook/FacebookProperties.java new file mode 100644 index 00000000..a855d1d0 --- /dev/null +++ b/jbot/src/main/java/me/ramswaroop/jbot/core/facebook/FacebookProperties.java @@ -0,0 +1,56 @@ +package me.ramswaroop.jbot.core.facebook; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author Maciej Walkowiak + * @version 14/04/2018 + */ +@ConfigurationProperties("jbot.facebook") +public class FacebookProperties { + private String subscribeUrl; + private String sendUrl; + private String messengerProfileUrl; + private String botToken; + private String pageAccessToken; + + public String getSubscribeUrl() { + return subscribeUrl; + } + + public void setSubscribeUrl(String subscribeUrl) { + this.subscribeUrl = subscribeUrl; + } + + public String getSendUrl() { + return sendUrl; + } + + public void setSendUrl(String sendUrl) { + this.sendUrl = sendUrl; + } + + public String getMessengerProfileUrl() { + return messengerProfileUrl; + } + + public void setMessengerProfileUrl(String messengerProfileUrl) { + this.messengerProfileUrl = messengerProfileUrl; + } + + public String getBotToken() { + return botToken; + } + + public void setBotToken(String botToken) { + this.botToken = botToken; + } + + public String getPageAccessToken() { + return pageAccessToken; + } + + public void setPageAccessToken(String pageAccessToken) { + this.pageAccessToken = pageAccessToken; + } +} diff --git a/jbot/src/main/java/me/ramswaroop/jbot/core/slack/Bot.java b/jbot/src/main/java/me/ramswaroop/jbot/core/slack/Bot.java index 514938db..1baf6c15 100644 --- a/jbot/src/main/java/me/ramswaroop/jbot/core/slack/Bot.java +++ b/jbot/src/main/java/me/ramswaroop/jbot/core/slack/Bot.java @@ -41,8 +41,11 @@ public abstract class Bot extends BaseBot { /** * Service to access Slack APIs. */ - @Autowired - protected SlackService slackService; + protected final SlackService slackService; + + protected Bot(SlackService slackService) { + this.slackService = slackService; + } /** * Class extending this must implement this as it's @@ -159,7 +162,7 @@ public final void reply(WebSocketSession session, Event event, Message reply) { logger.error("Error sending event: {}. Exception: {}", event.getText(), e.getMessage()); } } - + public final void reply(WebSocketSession session, Event event, String text) { reply(session, event, new Message(text)); } diff --git a/jbot/src/main/java/me/ramswaroop/jbot/core/slack/SlackConfiguration.java b/jbot/src/main/java/me/ramswaroop/jbot/core/slack/SlackConfiguration.java new file mode 100644 index 00000000..7db15ea0 --- /dev/null +++ b/jbot/src/main/java/me/ramswaroop/jbot/core/slack/SlackConfiguration.java @@ -0,0 +1,13 @@ +package me.ramswaroop.jbot.core.slack; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @author Maciej Walkowiak + * @version 14/04/2018 + */ +@Configuration +@EnableConfigurationProperties(SlackProperties.class) +public class SlackConfiguration { +} diff --git a/jbot/src/main/java/me/ramswaroop/jbot/core/slack/SlackDao.java b/jbot/src/main/java/me/ramswaroop/jbot/core/slack/SlackDao.java index 0e4f4029..461961ed 100644 --- a/jbot/src/main/java/me/ramswaroop/jbot/core/slack/SlackDao.java +++ b/jbot/src/main/java/me/ramswaroop/jbot/core/slack/SlackDao.java @@ -9,7 +9,6 @@ import me.ramswaroop.jbot.core.slack.models.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; @@ -30,23 +29,24 @@ public class SlackDao { private static final Logger logger = LoggerFactory.getLogger(SlackDao.class); + + private final SlackProperties slackProperties; /** - * Endpoint for RTM.start() + * Rest template to make http calls. */ - @Value("${rtmUrl}") - private String rtmUrl; + private final RestTemplate restTemplate; /** * RTM object constructed from RTM.start(). */ private RTM rtm; - /** - * Rest template to make http calls. - */ - private RestTemplate restTemplate; + + SlackDao(SlackProperties slackProperties, RestTemplate restTemplate) { + this.slackProperties = slackProperties; + this.restTemplate = restTemplate; + } public RTM startRTM(String slackToken) { try { - restTemplate = new RestTemplate(); rtm = new RTM(); // Custom Deserializers List> httpMessageConverters = new ArrayList<>(); @@ -84,8 +84,8 @@ public RTM deserialize(JsonParser p, DeserializationContext ctxt) { httpMessageConverters.add(jsonConverter); restTemplate.setMessageConverters(httpMessageConverters); - ResponseEntity response = restTemplate.getForEntity(rtmUrl, RTM.class, slackToken); - if (response.getBody() != null) { + ResponseEntity response = restTemplate.getForEntity(slackProperties.getRtmUrl(), RTM.class, slackToken); + if (response.hasBody()) { rtm.setWebSocketUrl(response.getBody().getWebSocketUrl()); rtm.setDmChannels(response.getBody().getDmChannels()); rtm.setUser(response.getBody().getUser()); diff --git a/jbot/src/main/java/me/ramswaroop/jbot/core/slack/SlackProperties.java b/jbot/src/main/java/me/ramswaroop/jbot/core/slack/SlackProperties.java new file mode 100644 index 00000000..98f79e10 --- /dev/null +++ b/jbot/src/main/java/me/ramswaroop/jbot/core/slack/SlackProperties.java @@ -0,0 +1,67 @@ +package me.ramswaroop.jbot.core.slack; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author Maciej Walkowiak + * @version 14/04/2018 + */ +@ConfigurationProperties("jbot.slack") +public class SlackProperties { + + /** + * Endpoint for RTM.start() + */ + private String rtmUrl; + + /** + * Slack token from application.properties file. You can get your slack token + * next creating a new bot. + */ + private String slackBotToken; + + /** + * The token you get while creating a new Slash Command. You + * should paste the token in application.properties file. + */ + private String slashCommandToken; + + /** + * The Url you get while configuring a new incoming webhook + * on Slack. You can setup a new incoming webhook + * here. + */ + private String slackIncomingWebhookUrl; + + public String getRtmUrl() { + return rtmUrl; + } + + public void setRtmUrl(String rtmUrl) { + this.rtmUrl = rtmUrl; + } + + public String getSlackBotToken() { + return slackBotToken; + } + + public void setSlackBotToken(String slackBotToken) { + this.slackBotToken = slackBotToken; + } + + public String getSlashCommandToken() { + return slashCommandToken; + } + + public void setSlashCommandToken(String slashCommandToken) { + this.slashCommandToken = slashCommandToken; + } + + public String getSlackIncomingWebhookUrl() { + return slackIncomingWebhookUrl; + } + + public void setSlackIncomingWebhookUrl(String slackIncomingWebhookUrl) { + this.slackIncomingWebhookUrl = slackIncomingWebhookUrl; + } +} diff --git a/jbot/src/main/java/me/ramswaroop/jbot/core/slack/SlackService.java b/jbot/src/main/java/me/ramswaroop/jbot/core/slack/SlackService.java index 9eae353f..b3e6f3a2 100644 --- a/jbot/src/main/java/me/ramswaroop/jbot/core/slack/SlackService.java +++ b/jbot/src/main/java/me/ramswaroop/jbot/core/slack/SlackService.java @@ -2,7 +2,6 @@ import me.ramswaroop.jbot.core.slack.models.RTM; import me.ramswaroop.jbot.core.slack.models.User; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; @@ -17,13 +16,16 @@ @Scope("prototype") public class SlackService { - @Autowired - private SlackDao slackDao; + private final SlackDao slackDao; private User currentUser; private List dmChannels; private String webSocketUrl; private List users; + public SlackService(SlackDao slackDao) { + this.slackDao = slackDao; + } + /** * Start a RTM connection. Fetch the web socket url to connect to, current user details * and list of channel ids where the current user has had conversation. @@ -86,5 +88,5 @@ public List getUsers() { public void setUsers(List users) { this.users = users; } - + } diff --git a/pom.xml b/pom.xml index d0f9d88b..4a0141dc 100644 --- a/pom.xml +++ b/pom.xml @@ -5,10 +5,10 @@ org.springframework.boot spring-boot-starter-parent - 1.4.0.RELEASE + 2.0.1.RELEASE - + me.ramswaroop.jbot jbot-parent 4.0.2-SNAPSHOT @@ -61,7 +61,7 @@ UTF-8 1.8 - 1.4.0.RELEASE + 2.0.1.RELEASE ${java.version} ${java.version}