From 5973c5b2fc701b9e166119e1076a973b3e85c65d Mon Sep 17 00:00:00 2001 From: Francisco Date: Thu, 11 Jan 2024 17:28:42 -0800 Subject: [PATCH 1/2] s --- .../jointheleague/discord_bot/DiscordBot.java | 7 + .../examples/first_features/RandomNumber.java | 1 + .../examples/first_features/RandomPhrase.java | 39 ++++++ .../second_features/SentenceMaker.java | 58 ++++++++ .../third_features/AfricanAnimalFactApi.java | 60 ++++++++ .../examples/third_features/NewsApi.java | 2 +- .../plain_old_java_objects/AnimalWrapper.java | 12 ++ .../first_features/RandomPhraseTest.java | 115 ++++++++++++++++ .../second_features/SentenceMakerTest.java | 128 ++++++++++++++++++ 9 files changed, 421 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/jointheleague/features/examples/first_features/RandomPhrase.java create mode 100644 src/main/java/org/jointheleague/features/examples/second_features/SentenceMaker.java create mode 100644 src/main/java/org/jointheleague/features/examples/third_features/AfricanAnimalFactApi.java create mode 100644 src/main/java/org/jointheleague/features/examples/third_features/plain_old_java_objects/AnimalWrapper.java create mode 100644 src/test/java/org/jointheleague/features/examples/first_features/RandomPhraseTest.java create mode 100644 src/test/java/org/jointheleague/features/examples/second_features/SentenceMakerTest.java diff --git a/src/main/java/org/jointheleague/discord_bot/DiscordBot.java b/src/main/java/org/jointheleague/discord_bot/DiscordBot.java index fa40f61f..2b7b605a 100644 --- a/src/main/java/org/jointheleague/discord_bot/DiscordBot.java +++ b/src/main/java/org/jointheleague/discord_bot/DiscordBot.java @@ -3,7 +3,10 @@ import org.javacord.api.DiscordApi; import org.javacord.api.DiscordApiBuilder; import org.jointheleague.features.abstract_classes.Feature; +import org.jointheleague.features.examples.first_features.RandomPhrase; import org.jointheleague.features.examples.second_features.HighLowGame; +import org.jointheleague.features.examples.second_features.SentenceMaker; +import org.jointheleague.features.examples.third_features.AfricanAnimalFactApi; import org.jointheleague.features.examples.third_features.CatFactsApi; import org.jointheleague.features.examples.third_features.NewsApi; import org.jointheleague.features.examples.first_features.CurrentTime; @@ -48,6 +51,10 @@ public void connect(boolean printInvite) { addFeature(new HighLowGame(channelName)); addFeature(new NewsApi(channelName)); addFeature(new CatFactsApi(channelName)); + //MINE + addFeature(new RandomPhrase(channelName)); + addFeature(new SentenceMaker(channelName)); + addFeature(new AfricanAnimalFactApi(channelName)); } private void addFeature(Feature feature){ diff --git a/src/main/java/org/jointheleague/features/examples/first_features/RandomNumber.java b/src/main/java/org/jointheleague/features/examples/first_features/RandomNumber.java index 13a59481..20edd2be 100644 --- a/src/main/java/org/jointheleague/features/examples/first_features/RandomNumber.java +++ b/src/main/java/org/jointheleague/features/examples/first_features/RandomNumber.java @@ -10,6 +10,7 @@ public class RandomNumber extends Feature { public final String COMMAND = "!random"; + public RandomNumber(String channelName) { super(channelName); helpEmbed = new HelpEmbed(COMMAND, "Allows you to get a random number between 0 and 1000)"); diff --git a/src/main/java/org/jointheleague/features/examples/first_features/RandomPhrase.java b/src/main/java/org/jointheleague/features/examples/first_features/RandomPhrase.java new file mode 100644 index 00000000..6425af18 --- /dev/null +++ b/src/main/java/org/jointheleague/features/examples/first_features/RandomPhrase.java @@ -0,0 +1,39 @@ +package org.jointheleague.features.examples.first_features; + +import org.javacord.api.event.message.MessageCreateEvent; +import org.jointheleague.features.abstract_classes.Feature; +import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class RandomPhrase extends Feature { + public final String COMMAND = "!phrase"; + + public RandomPhrase (String channelName) { + super(channelName); + + //Create a help embed to describe feature when !help command is sent + helpEmbed = new HelpEmbed(COMMAND, "this gives you a random phrase"); + } + + @Override + public void handle(MessageCreateEvent event) { + String messageContent = event.getMessageContent(); + if (messageContent.startsWith(COMMAND)) { + //respond to message here + Random r = new Random(); + List phrases = new ArrayList<>(); + phrases.add("cat got ya tongue?"); + phrases.add("im all ears"); + phrases.add("you're on thin ice"); + phrases.add("it'll cost you an arm and a leg"); + + int num = r.nextInt(phrases.size()-1); + event.getChannel().sendMessage(phrases.get(num)); + } + } + + +} diff --git a/src/main/java/org/jointheleague/features/examples/second_features/SentenceMaker.java b/src/main/java/org/jointheleague/features/examples/second_features/SentenceMaker.java new file mode 100644 index 00000000..edfeee4e --- /dev/null +++ b/src/main/java/org/jointheleague/features/examples/second_features/SentenceMaker.java @@ -0,0 +1,58 @@ +package org.jointheleague.features.examples.second_features; + +import org.javacord.api.event.message.MessageCreateEvent; +import org.jointheleague.features.abstract_classes.Feature; +import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed; + +public class SentenceMaker extends Feature { + public final String COMMAND = "!maker"; + + public int check = 0; + public String name; + public String verb; + public int number; +int num = 1; + public SentenceMaker(String channelName) { + super(channelName); + helpEmbed = new HelpEmbed(COMMAND, "just do what the bot says if you cant figure it out your dumb"); + } + + @Override + public void handle(MessageCreateEvent event) { + + String messageContent = event.getMessageContent(); + if (messageContent.equals(COMMAND)) { + event.getChannel().sendMessage("ah hello give me a name, then a verb, then a number (example: !maker joe, then you say, !maker jumped)"); + check = 1; + } + else if(messageContent.contains(COMMAND) && !messageContent.contains("example")) { + if(check == 0){ + //tell them to start the game first + event.getChannel().sendMessage("Please start the game first using just the command"); + return; + } + + + String answer = messageContent.replaceAll(" ", "").replace(COMMAND, ""); + if(num == 1){ + name = answer; + event.getChannel().sendMessage("ok"); + num++; + } + else if(num ==2){ + verb = answer; + event.getChannel().sendMessage("ok 2"); + num++; + } + else if(num ==3){ + number = Integer.parseInt(answer); + event.getChannel().sendMessage("ok 3"); + event.getChannel().sendMessage("there once was a person named " + name + " who " + verb + " " + number + + " times."); + num = 0; + } + } + + + } +} diff --git a/src/main/java/org/jointheleague/features/examples/third_features/AfricanAnimalFactApi.java b/src/main/java/org/jointheleague/features/examples/third_features/AfricanAnimalFactApi.java new file mode 100644 index 00000000..0debdbc0 --- /dev/null +++ b/src/main/java/org/jointheleague/features/examples/third_features/AfricanAnimalFactApi.java @@ -0,0 +1,60 @@ +package org.jointheleague.features.examples.third_features; + +import org.javacord.api.event.message.MessageCreateEvent; +import org.jointheleague.features.abstract_classes.Feature; +import org.jointheleague.features.examples.third_features.plain_old_java_objects.AnimalWrapper; +import org.jointheleague.features.examples.third_features.plain_old_java_objects.cat_facts_api.CatWrapper; +import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +public class AfricanAnimalFactApi extends Feature{ + + + //A swagger page for this very simple API can be found here: https://app.swaggerhub.com/apis-docs/whiterabbit8/meowfacts/1.0.0 + + public final String COMMAND = "!africaFact"; + + private WebClient webClient; + private static final String baseUrl = "https://african-animal-facts.onrender.com/rand/"; + + public AfricanAnimalFactApi(String channelName) { + super(channelName); + helpEmbed = new HelpEmbed(COMMAND, "Example of using an API to get information from another service. This returns a african animal fact"); + + //build the WebClient + this.webClient = WebClient + .builder() + .baseUrl(baseUrl) + .build(); + } + + @Override + public void handle(MessageCreateEvent event) { + String messageContent = event.getMessageContent(); + if (messageContent.startsWith(COMMAND)) { + String africaFact = getAnimalFact(); + event.getChannel().sendMessage(africaFact); + } + } + + public String getAnimalFact() { + + //Make the request, accepting the response as a plain old java object you created + Mono animalWrapperMono = webClient.get() + .retrieve() + .bodyToMono(AnimalWrapper.class); + + //collect the response into a plain old java object + AnimalWrapper animalWrapper = animalWrapperMono.block(); + System.out.println(animalWrapper.fact); + //send the message + return animalWrapper.fact; + } + + public void setWebClient(WebClient webClient) { + this.webClient = webClient; + } + + } + diff --git a/src/main/java/org/jointheleague/features/examples/third_features/NewsApi.java b/src/main/java/org/jointheleague/features/examples/third_features/NewsApi.java index 67a4ef04..396a2517 100644 --- a/src/main/java/org/jointheleague/features/examples/third_features/NewsApi.java +++ b/src/main/java/org/jointheleague/features/examples/third_features/NewsApi.java @@ -62,7 +62,7 @@ public String findStory(String topic){ //Get a story from News API ApiExampleWrapper apiExampleWrapper = getNewsStoryByTopic(topic); - + System.out.println(apiExampleWrapper.toString()); //Get the first article Article article = apiExampleWrapper.getArticles().get(0); diff --git a/src/main/java/org/jointheleague/features/examples/third_features/plain_old_java_objects/AnimalWrapper.java b/src/main/java/org/jointheleague/features/examples/third_features/plain_old_java_objects/AnimalWrapper.java new file mode 100644 index 00000000..19c84650 --- /dev/null +++ b/src/main/java/org/jointheleague/features/examples/third_features/plain_old_java_objects/AnimalWrapper.java @@ -0,0 +1,12 @@ +package org.jointheleague.features.examples.third_features.plain_old_java_objects; + +import com.google.gson.annotations.SerializedName; + +public class AnimalWrapper { + @SerializedName("animal") + public String animal; + @SerializedName("fact") + public String fact; + @SerializedName("source") + public String source; +} diff --git a/src/test/java/org/jointheleague/features/examples/first_features/RandomPhraseTest.java b/src/test/java/org/jointheleague/features/examples/first_features/RandomPhraseTest.java new file mode 100644 index 00000000..68366540 --- /dev/null +++ b/src/test/java/org/jointheleague/features/examples/first_features/RandomPhraseTest.java @@ -0,0 +1,115 @@ +package org.jointheleague.features.examples.first_features; + +import org.javacord.api.entity.channel.TextChannel; +import org.javacord.api.event.message.MessageCreateEvent; +import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed; +import org.jointheleague.features.templates.FeatureTemplate; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.never; + +public class RandomPhraseTest { + private final String testChannelName = "test"; + private final RandomPhrase randomPhrase = new RandomPhrase(testChannelName); + + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private final PrintStream originalOut = System.out; + + @Mock + private MessageCreateEvent messageCreateEvent; + + @Mock + private TextChannel textChannel; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + System.setOut(new PrintStream(outContent)); + } + + @AfterEach + public void itShouldNotPrintToSystemOut() { + String expected = ""; + String actual = outContent.toString(); + + assertEquals(expected, actual); + System.setOut(originalOut); + } + + @Test + void itShouldHaveACommand() { + //Given + + //When + String command = randomPhrase.COMMAND; + + //Then + + + assertNotNull(command); + } + + @Test + void itShouldHandleMessagesWithCommand() { + //Given + HelpEmbed helpEmbed = new HelpEmbed(randomPhrase.COMMAND, "test"); + when(messageCreateEvent.getMessageContent()).thenReturn(randomPhrase.COMMAND); + when(messageCreateEvent.getChannel()).thenReturn((textChannel)); + + //When + randomPhrase.handle(messageCreateEvent); + + //Then + verify(textChannel, times(1)).sendMessage(anyString()); + } + + @Test + void itShouldNotHandleMessagesWithoutCommand() { + //Given + String command = ""; + when(messageCreateEvent.getMessageContent()).thenReturn(command); + + //When + randomPhrase.handle(messageCreateEvent); + + //Then + verify(textChannel, never()).sendMessage(); + } + + @Test + void itShouldHaveAHelpEmbed() { + //Given + + //When + HelpEmbed actualHelpEmbed = randomPhrase.getHelpEmbed(); + + //Then + assertNotNull(actualHelpEmbed); + } + + @Test + void itShouldHaveTheCommandAsTheTitleOfTheHelpEmbed() { + //Given + + //When + String helpEmbedTitle = randomPhrase.getHelpEmbed().getTitle(); + String command = randomPhrase.COMMAND; + + //Then + assertEquals(command, helpEmbedTitle); + } + + +} diff --git a/src/test/java/org/jointheleague/features/examples/second_features/SentenceMakerTest.java b/src/test/java/org/jointheleague/features/examples/second_features/SentenceMakerTest.java new file mode 100644 index 00000000..48cc2a18 --- /dev/null +++ b/src/test/java/org/jointheleague/features/examples/second_features/SentenceMakerTest.java @@ -0,0 +1,128 @@ +package org.jointheleague.features.examples.second_features; +import org.javacord.api.entity.channel.TextChannel; +import org.javacord.api.event.message.MessageCreateEvent; +import org.jointheleague.features.abstract_classes.Feature; +import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.never; + +class SentenceMakerTest { + + private final String testChannelName = "test"; + private final SentenceMaker sentenceMaker = new SentenceMaker(testChannelName); + + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private final PrintStream originalOut = System.out; + + @Mock + private MessageCreateEvent messageCreateEvent; + + @Mock + private TextChannel textChannel; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + System.setOut(new PrintStream(outContent)); + } + + @AfterEach + public void itShouldNotPrintToSystemOut() { + String expected = ""; + String actual = outContent.toString(); + + assertEquals(expected, actual); + System.setOut(originalOut); + } + @Test + void itShouldHaveACommand() { + //Given + + //When + String command = sentenceMaker.COMMAND; + + //Then + assertNotEquals("", command); + assertNotEquals("!command", command); + assertNotNull(command); + } + @Test + void itShouldHandleMessagesWithCommand() { + //Given + HelpEmbed helpEmbed = new HelpEmbed(sentenceMaker.COMMAND, "test"); + when(messageCreateEvent.getMessageContent()).thenReturn(sentenceMaker.COMMAND); + when(messageCreateEvent.getChannel()).thenReturn((textChannel)); + + //When + sentenceMaker.handle(messageCreateEvent); + + //Then + verify(textChannel, times(1)).sendMessage(anyString()); + } + @Test + void itShouldNotHandleMessagesWithoutCommand() { + //Given + String command = ""; + when(messageCreateEvent.getMessageContent()).thenReturn(command); + + //When + sentenceMaker.handle(messageCreateEvent); + + //Then + verify(textChannel, never()).sendMessage(); + } + @Test + void itShouldHaveAHelpEmbed() { + //Given + + //When + HelpEmbed actualHelpEmbed = sentenceMaker.getHelpEmbed(); + + //Then + assertNotNull(actualHelpEmbed); + } + @Test + void itShouldHaveTheCommandAsTheTitleOfTheHelpEmbed() { + //Given + + //When + String helpEmbedTitle = sentenceMaker.getHelpEmbed().getTitle(); + String command = sentenceMaker.COMMAND; + + //Then + assertEquals(command, helpEmbedTitle); + } + +//FEATURE SPECIFIC TESTS + + @Test + void itShouldSendErrorMessageIfResponseIsNotANumber() { + //Given + String guess = "ten"; + String command = "!maker " + guess; + sentenceMaker.check = 3; + when(messageCreateEvent.getMessageContent()).thenReturn(command); + when(messageCreateEvent.getChannel()).thenReturn((textChannel)); + + //When + sentenceMaker.handle(messageCreateEvent); + + //Then + verify(textChannel, times(1)).sendMessage("Please format your response like this: " + sentenceMaker.COMMAND + " 5"); + } + + +} \ No newline at end of file From a03fbf27da32ed548d011a34a077bd99021ed7d0 Mon Sep 17 00:00:00 2001 From: Francisco Date: Thu, 11 Jan 2024 18:07:10 -0800 Subject: [PATCH 2/2] deltede 2 and 3 --- .../jointheleague/discord_bot/DiscordBot.java | 6 +- .../second_features/SentenceMaker.java | 58 ------------------ .../third_features/AfricanAnimalFactApi.java | 60 ------------------- 3 files changed, 2 insertions(+), 122 deletions(-) delete mode 100644 src/main/java/org/jointheleague/features/examples/second_features/SentenceMaker.java delete mode 100644 src/main/java/org/jointheleague/features/examples/third_features/AfricanAnimalFactApi.java diff --git a/src/main/java/org/jointheleague/discord_bot/DiscordBot.java b/src/main/java/org/jointheleague/discord_bot/DiscordBot.java index 2b7b605a..2be911e3 100644 --- a/src/main/java/org/jointheleague/discord_bot/DiscordBot.java +++ b/src/main/java/org/jointheleague/discord_bot/DiscordBot.java @@ -5,8 +5,6 @@ import org.jointheleague.features.abstract_classes.Feature; import org.jointheleague.features.examples.first_features.RandomPhrase; import org.jointheleague.features.examples.second_features.HighLowGame; -import org.jointheleague.features.examples.second_features.SentenceMaker; -import org.jointheleague.features.examples.third_features.AfricanAnimalFactApi; import org.jointheleague.features.examples.third_features.CatFactsApi; import org.jointheleague.features.examples.third_features.NewsApi; import org.jointheleague.features.examples.first_features.CurrentTime; @@ -53,8 +51,8 @@ public void connect(boolean printInvite) { addFeature(new CatFactsApi(channelName)); //MINE addFeature(new RandomPhrase(channelName)); - addFeature(new SentenceMaker(channelName)); - addFeature(new AfricanAnimalFactApi(channelName)); + //addFeature(new SentenceMaker(channelName)); + //addFeature(new AfricanAnimalFactApi(channelName)); } private void addFeature(Feature feature){ diff --git a/src/main/java/org/jointheleague/features/examples/second_features/SentenceMaker.java b/src/main/java/org/jointheleague/features/examples/second_features/SentenceMaker.java deleted file mode 100644 index edfeee4e..00000000 --- a/src/main/java/org/jointheleague/features/examples/second_features/SentenceMaker.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.jointheleague.features.examples.second_features; - -import org.javacord.api.event.message.MessageCreateEvent; -import org.jointheleague.features.abstract_classes.Feature; -import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed; - -public class SentenceMaker extends Feature { - public final String COMMAND = "!maker"; - - public int check = 0; - public String name; - public String verb; - public int number; -int num = 1; - public SentenceMaker(String channelName) { - super(channelName); - helpEmbed = new HelpEmbed(COMMAND, "just do what the bot says if you cant figure it out your dumb"); - } - - @Override - public void handle(MessageCreateEvent event) { - - String messageContent = event.getMessageContent(); - if (messageContent.equals(COMMAND)) { - event.getChannel().sendMessage("ah hello give me a name, then a verb, then a number (example: !maker joe, then you say, !maker jumped)"); - check = 1; - } - else if(messageContent.contains(COMMAND) && !messageContent.contains("example")) { - if(check == 0){ - //tell them to start the game first - event.getChannel().sendMessage("Please start the game first using just the command"); - return; - } - - - String answer = messageContent.replaceAll(" ", "").replace(COMMAND, ""); - if(num == 1){ - name = answer; - event.getChannel().sendMessage("ok"); - num++; - } - else if(num ==2){ - verb = answer; - event.getChannel().sendMessage("ok 2"); - num++; - } - else if(num ==3){ - number = Integer.parseInt(answer); - event.getChannel().sendMessage("ok 3"); - event.getChannel().sendMessage("there once was a person named " + name + " who " + verb + " " + number + - " times."); - num = 0; - } - } - - - } -} diff --git a/src/main/java/org/jointheleague/features/examples/third_features/AfricanAnimalFactApi.java b/src/main/java/org/jointheleague/features/examples/third_features/AfricanAnimalFactApi.java deleted file mode 100644 index 0debdbc0..00000000 --- a/src/main/java/org/jointheleague/features/examples/third_features/AfricanAnimalFactApi.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.jointheleague.features.examples.third_features; - -import org.javacord.api.event.message.MessageCreateEvent; -import org.jointheleague.features.abstract_classes.Feature; -import org.jointheleague.features.examples.third_features.plain_old_java_objects.AnimalWrapper; -import org.jointheleague.features.examples.third_features.plain_old_java_objects.cat_facts_api.CatWrapper; -import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -public class AfricanAnimalFactApi extends Feature{ - - - //A swagger page for this very simple API can be found here: https://app.swaggerhub.com/apis-docs/whiterabbit8/meowfacts/1.0.0 - - public final String COMMAND = "!africaFact"; - - private WebClient webClient; - private static final String baseUrl = "https://african-animal-facts.onrender.com/rand/"; - - public AfricanAnimalFactApi(String channelName) { - super(channelName); - helpEmbed = new HelpEmbed(COMMAND, "Example of using an API to get information from another service. This returns a african animal fact"); - - //build the WebClient - this.webClient = WebClient - .builder() - .baseUrl(baseUrl) - .build(); - } - - @Override - public void handle(MessageCreateEvent event) { - String messageContent = event.getMessageContent(); - if (messageContent.startsWith(COMMAND)) { - String africaFact = getAnimalFact(); - event.getChannel().sendMessage(africaFact); - } - } - - public String getAnimalFact() { - - //Make the request, accepting the response as a plain old java object you created - Mono animalWrapperMono = webClient.get() - .retrieve() - .bodyToMono(AnimalWrapper.class); - - //collect the response into a plain old java object - AnimalWrapper animalWrapper = animalWrapperMono.block(); - System.out.println(animalWrapper.fact); - //send the message - return animalWrapper.fact; - } - - public void setWebClient(WebClient webClient) { - this.webClient = webClient; - } - - } -