From e1de6fbe427c6b05e2e29e8294779dcf07a18afb Mon Sep 17 00:00:00 2001 From: league Date: Thu, 24 Jul 2025 16:57:47 -0700 Subject: [PATCH 01/15] Still working on my Fishing Game Feature --- bin/.gitignore | 2 ++ .../jointheleague/discord_bot/DiscordBot.java | 2 ++ .../student/first_feature/FishingFrenzy.java | 34 +++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 bin/.gitignore create mode 100644 src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 00000000..7eed456b --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1,2 @@ +/main/ +/test/ diff --git a/src/main/java/org/jointheleague/discord_bot/DiscordBot.java b/src/main/java/org/jointheleague/discord_bot/DiscordBot.java index cefb5f79..8d0c34ea 100644 --- a/src/main/java/org/jointheleague/discord_bot/DiscordBot.java +++ b/src/main/java/org/jointheleague/discord_bot/DiscordBot.java @@ -14,6 +14,7 @@ import org.jointheleague.features.examples.first_features.RandomNumber; import org.jointheleague.features.help_embed.HelpListener; import org.jointheleague.features.student.first_feature.FeatureOne; +import org.jointheleague.features.student.first_feature.FishingFrenzy; public class DiscordBot { @@ -61,6 +62,7 @@ public void connect(boolean printInvite) throws InterruptedException { addFeature(new HighLowGame(channelName)); addFeature(new NewsApi(channelName)); addFeature(new CatFactsApi(channelName)); + addFeature(new FishingFrenzy(channelName)); } private void addFeature(Feature feature){ diff --git a/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java b/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java new file mode 100644 index 00000000..4e73aa2d --- /dev/null +++ b/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java @@ -0,0 +1,34 @@ +package org.jointheleague.features.student.first_feature; + +import org.jointheleague.api_wrapper.ReceivedMessage; +import org.jointheleague.features.abstract_classes.Feature; +import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed; + +public class FishingFrenzy extends Feature { + + public final String COMMAND = "!fishingFrenzy"; + + public FishingFrenzy(String channelName) { + super(channelName); + + //Create a help embed to describe feature when !help command is sent + helpEmbed = new HelpEmbed( + COMMAND, + "Cast your line and catch all kinds of fish — from common to legendary! Earn coins, build your collection, and compete on the leaderboard." + ); + } + + @Override + public void handle(ReceivedMessage event) { + String messageContent = event.getMessageContent(); + if (messageContent.equals(COMMAND)) { + //respond to message here + event.sendResponse("Commands:\n`!fishingFrenzy fish` to cast your line\n`!fishingFrenzy inventory` to see your inventory. \n`!fishingFrenzy leaderboard` to check out where your standings are. "); + } + else if (messageContent.endsWith("fish")) { + + event.sendResponse("You wanted to fish, but was rejected. xD"); + } + } + +} From 98ffbd7e308d530db4c35cf261873ba3186b25dd Mon Sep 17 00:00:00 2001 From: league Date: Thu, 31 Jul 2025 16:49:14 -0700 Subject: [PATCH 02/15] Still working on bot --- .../student/first_feature/FishingFrenzy.java | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java b/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java index 4e73aa2d..21c6a56b 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java @@ -4,6 +4,9 @@ import org.jointheleague.features.abstract_classes.Feature; import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed; +import net.dv8tion.jda.api.EmbedBuilder; + +import java.util.Random; public class FishingFrenzy extends Feature { public final String COMMAND = "!fishingFrenzy"; @@ -14,7 +17,7 @@ public FishingFrenzy(String channelName) { //Create a help embed to describe feature when !help command is sent helpEmbed = new HelpEmbed( COMMAND, - "Cast your line and catch all kinds of fish — from common to legendary! Earn coins, build your collection, and compete on the leaderboard." + "Cast your line and catch all kinds of fish — from common to legendary! Earn coins, buy upgrades, and compete on the leaderboard." ); } @@ -23,11 +26,32 @@ public void handle(ReceivedMessage event) { String messageContent = event.getMessageContent(); if (messageContent.equals(COMMAND)) { //respond to message here - event.sendResponse("Commands:\n`!fishingFrenzy fish` to cast your line\n`!fishingFrenzy inventory` to see your inventory. \n`!fishingFrenzy leaderboard` to check out where your standings are. "); + event.sendResponse("Commands:\n`!fishingFrenzy fish` to cast your line\n`!fishingFrenzy shop` to buy new rods. \n`!fishingFrenzy leaderboard` to check out where your standings are. "); + } + else if (messageContent.equals("!fishingFrenzy fish")) { + Random r = new Random(); + double randomNumber = r.nextDouble() * 100; + if (randomNumber < 1) { + event.sendResponse("You caught a Dragonfish! (Legendary: 1%)\nYou gained 750 coins!"); + } else if (randomNumber < 5){ + event.sendResponse("You caught a Golden Koi! (Mythic: 4%)\nYou gained 300 coins!"); + } + else if (randomNumber < 15) { + event.sendResponse("You caught a Swordfish! (Epic: 10%)\nYou gained 150 coins!"); + } + else if (randomNumber < 30) { + event.sendResponse("You caught a Salmon! (Rare: 15%)\nYou gained 75 coins!"); + } + else if (randomNumber < 55) { + event.sendResponse("You caught a Mackeral! (Uncommon: 25%)\nYou gained 30 coins!"); + } + else { + event.sendResponse("You caught a Carp! (Common: 45%)\nYou gained 10 coins!"); + } } - else if (messageContent.endsWith("fish")) { - - event.sendResponse("You wanted to fish, but was rejected. xD"); + else if (messageContent.equals("!fishingFrenzy shop")) { + event.sendResponse("Fishing Rod Shop:"); + event.sendResponse("Starter Rod (No Bonuses): Owned"); } } From 7d8817a8a158aac1c0b8b4506ee4dc2f08d984a8 Mon Sep 17 00:00:00 2001 From: league Date: Thu, 7 Aug 2025 16:58:27 -0700 Subject: [PATCH 03/15] Finished my first feature --- .../student/first_feature/CookieClicker.java | 31 +++++++++++++++++++ .../student/first_feature/FishingFrenzy.java | 18 +++++++---- 2 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java diff --git a/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java b/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java new file mode 100644 index 00000000..39f62dc7 --- /dev/null +++ b/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java @@ -0,0 +1,31 @@ +package org.jointheleague.features.student.first_feature; + +import org.jointheleague.api_wrapper.ReceivedMessage; +import org.jointheleague.features.abstract_classes.Feature; +import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed; + +public class CookieClicker extends Feature { + + public final String COMMAND = "!cookieClicker"; + + public CookieClicker(String channelName) { + super(channelName); + + //Create a help embed to describe feature when !help command is sent + helpEmbed = new HelpEmbed( + COMMAND, + "Bake cookies, buy upgrades, and climb the leaderboard to become the ultimate baker!" + ); + } + + @Override + public void handle(ReceivedMessage event) { + String messageContent = event.getMessageContent(); + if (messageContent.equals("!fishingFrenzy help")) { + //respond to message here + event.sendResponse("Commands:\n`!cookieCliker click` to bake a cookie.\n`!cookieClicker cookies` to see how much cookies you have.\n`!cookieClicker upgrades` to buy upgrades."); + } + + } + +} diff --git a/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java b/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java index 21c6a56b..326f4514 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java @@ -1,6 +1,7 @@ package org.jointheleague.features.student.first_feature; import org.jointheleague.api_wrapper.ReceivedMessage; + import org.jointheleague.features.abstract_classes.Feature; import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed; @@ -8,7 +9,7 @@ import java.util.Random; public class FishingFrenzy extends Feature { - + public int coins = 0; public final String COMMAND = "!fishingFrenzy"; public FishingFrenzy(String channelName) { @@ -24,34 +25,39 @@ public FishingFrenzy(String channelName) { @Override public void handle(ReceivedMessage event) { String messageContent = event.getMessageContent(); - if (messageContent.equals(COMMAND)) { + if (messageContent.equals("!fishingFrenzy help")) { //respond to message here - event.sendResponse("Commands:\n`!fishingFrenzy fish` to cast your line\n`!fishingFrenzy shop` to buy new rods. \n`!fishingFrenzy leaderboard` to check out where your standings are. "); + event.sendResponse("Commands:\n`!fishingFrenzy cast` to cast your line.\n`!fishingFrenzy balance` to see how much coins you have. "); } else if (messageContent.equals("!fishingFrenzy fish")) { Random r = new Random(); double randomNumber = r.nextDouble() * 100; if (randomNumber < 1) { event.sendResponse("You caught a Dragonfish! (Legendary: 1%)\nYou gained 750 coins!"); + coins+=750; } else if (randomNumber < 5){ event.sendResponse("You caught a Golden Koi! (Mythic: 4%)\nYou gained 300 coins!"); + coins+=300; } else if (randomNumber < 15) { event.sendResponse("You caught a Swordfish! (Epic: 10%)\nYou gained 150 coins!"); + coins+=150; } else if (randomNumber < 30) { event.sendResponse("You caught a Salmon! (Rare: 15%)\nYou gained 75 coins!"); + coins+=75; } else if (randomNumber < 55) { event.sendResponse("You caught a Mackeral! (Uncommon: 25%)\nYou gained 30 coins!"); + coins+=30; } else { event.sendResponse("You caught a Carp! (Common: 45%)\nYou gained 10 coins!"); + coins+=10; } } - else if (messageContent.equals("!fishingFrenzy shop")) { - event.sendResponse("Fishing Rod Shop:"); - event.sendResponse("Starter Rod (No Bonuses): Owned"); + else if (messageContent.equals("!fishingFrenzy balance")) { + event.sendResponse("You have " + coins + " coins."); } } From 0210fc338b230ef8f701464524dacb1c34c3ecd5 Mon Sep 17 00:00:00 2001 From: league Date: Thu, 14 Aug 2025 17:03:55 -0700 Subject: [PATCH 04/15] Still working on my seecond feature --- .../student/first_feature/CookieClicker.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java b/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java index 39f62dc7..c7755bcd 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java @@ -21,11 +21,40 @@ public CookieClicker(String channelName) { @Override public void handle(ReceivedMessage event) { String messageContent = event.getMessageContent(); + int cookies = 0; + int click = 1; if (messageContent.equals("!fishingFrenzy help")) { //respond to message here event.sendResponse("Commands:\n`!cookieCliker click` to bake a cookie.\n`!cookieClicker cookies` to see how much cookies you have.\n`!cookieClicker upgrades` to buy upgrades."); } - + if (messageContent.equals("!cookieClicker click")) { + event.sendResponse("You gained " + click + " cookie"); + cookies += click; + } + if (messageContent.equals("!cookieClicker cookies")) { + event.sendResponse("You have " + cookies + " cookies in total."); + } + if (messageContent.equals("!cookieClicker upgrades")) { + event.sendResponse("Upgrades: Increases cookies per click. To buy, just type `!cookieClicker [upgrade name]`\nCursor (+1): 10 cookies\nGramma (+5): 50 cookies\nFarm (+10): 100 cookies\nMine (+50): 300 cookies"); + } + if (messageContent.startsWith(COMMAND) && messageContent.endsWith("cursor")) { + click += 1; + } + if (messageContent.startsWith(COMMAND) && messageContent.endsWith("gramma")) { + click += 1; + } + if (messageContent.startsWith(COMMAND) && messageContent.endsWith("cursor")) { + click += 1; + } + if (messageContent.startsWith(COMMAND) && messageContent.endsWith("cursor")) { + click += 1; + } + if (messageContent.startsWith(COMMAND) && messageContent.endsWith("cursor")) { + click += 1; + } + if (messageContent.startsWith(COMMAND) && messageContent.endsWith("cursor")) { + click += 1; + } } } From d793fb086050908872829fccd8eb0911214f8fd7 Mon Sep 17 00:00:00 2001 From: league Date: Thu, 21 Aug 2025 16:59:14 -0700 Subject: [PATCH 05/15] Working on my 3rd feature --- .gitignore | 1 + .../jointheleague/discord_bot/DiscordBot.java | 2 ++ .../examples/help_embed/HelpListener.java | 33 +++++++++++++++++++ .../student/first_feature/CookieClicker.java | 27 +++++++-------- 4 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/jointheleague/features/examples/help_embed/HelpListener.java diff --git a/.gitignore b/.gitignore index 63db41c1..9f1ce36b 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ src/main/java/org.jointheleague.Launcher.java run.sh appspec.yml .gradle/ +/build/ diff --git a/src/main/java/org/jointheleague/discord_bot/DiscordBot.java b/src/main/java/org/jointheleague/discord_bot/DiscordBot.java index 8d0c34ea..fe54e084 100644 --- a/src/main/java/org/jointheleague/discord_bot/DiscordBot.java +++ b/src/main/java/org/jointheleague/discord_bot/DiscordBot.java @@ -13,6 +13,7 @@ import org.jointheleague.features.examples.first_features.CurrentTime; import org.jointheleague.features.examples.first_features.RandomNumber; import org.jointheleague.features.help_embed.HelpListener; +import org.jointheleague.features.student.first_feature.CookieClicker; import org.jointheleague.features.student.first_feature.FeatureOne; import org.jointheleague.features.student.first_feature.FishingFrenzy; @@ -63,6 +64,7 @@ public void connect(boolean printInvite) throws InterruptedException { addFeature(new NewsApi(channelName)); addFeature(new CatFactsApi(channelName)); addFeature(new FishingFrenzy(channelName)); + addFeature(new CookieClicker(channelName)); } private void addFeature(Feature feature){ diff --git a/src/main/java/org/jointheleague/features/examples/help_embed/HelpListener.java b/src/main/java/org/jointheleague/features/examples/help_embed/HelpListener.java new file mode 100644 index 00000000..30498cea --- /dev/null +++ b/src/main/java/org/jointheleague/features/examples/help_embed/HelpListener.java @@ -0,0 +1,33 @@ +package org.jointheleague.features.examples.help_embed; + +import java.util.ArrayList; +import java.util.List; + +import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed; +import org.jointheleague.api_wrapper.ReceivedMessage; +import org.jointheleague.features.abstract_classes.Feature; + +public class HelpListener extends Feature { + + public final String COMMAND = "!help"; + private List helpEmbeds = new ArrayList<>(); + + public HelpListener(String channelName) { + super(channelName); + } + + @Override + public void handle(ReceivedMessage event) { + if(event.getMessageContent().equalsIgnoreCase(COMMAND)) { + for(HelpEmbed helpEmbed : helpEmbeds) { + event.sendResponse(helpEmbed.getEmbed()); + } + } + } + + public void addHelpEmbed(HelpEmbed helpEmbed) { + helpEmbeds.add(helpEmbed); + } + + +} diff --git a/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java b/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java index c7755bcd..1d82cdbe 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java @@ -7,7 +7,8 @@ public class CookieClicker extends Feature { public final String COMMAND = "!cookieClicker"; - + int cookies = 0; + int click = 1; public CookieClicker(String channelName) { super(channelName); @@ -21,9 +22,7 @@ public CookieClicker(String channelName) { @Override public void handle(ReceivedMessage event) { String messageContent = event.getMessageContent(); - int cookies = 0; - int click = 1; - if (messageContent.equals("!fishingFrenzy help")) { + if (messageContent.equals("!cookieClicker help")) { //respond to message here event.sendResponse("Commands:\n`!cookieCliker click` to bake a cookie.\n`!cookieClicker cookies` to see how much cookies you have.\n`!cookieClicker upgrades` to buy upgrades."); } @@ -39,21 +38,19 @@ public void handle(ReceivedMessage event) { } if (messageContent.startsWith(COMMAND) && messageContent.endsWith("cursor")) { click += 1; + cookies -= 10; } if (messageContent.startsWith(COMMAND) && messageContent.endsWith("gramma")) { - click += 1; - } - if (messageContent.startsWith(COMMAND) && messageContent.endsWith("cursor")) { - click += 1; - } - if (messageContent.startsWith(COMMAND) && messageContent.endsWith("cursor")) { - click += 1; + click += 5; + cookies -= 50; } - if (messageContent.startsWith(COMMAND) && messageContent.endsWith("cursor")) { - click += 1; + if (messageContent.startsWith(COMMAND) && messageContent.endsWith("farm")) { + click += 10; + cookies -= 100; } - if (messageContent.startsWith(COMMAND) && messageContent.endsWith("cursor")) { - click += 1; + if (messageContent.startsWith(COMMAND) && messageContent.endsWith("mine")) { + click += 50; + cookies -= 300; } } From 3f73a93c9fbf55d78a4a12307adb55b2b0dd2661 Mon Sep 17 00:00:00 2001 From: league Date: Thu, 4 Sep 2025 16:59:54 -0700 Subject: [PATCH 06/15] still working on my api feature --- .../jointheleague/discord_bot/DiscordBot.java | 2 + .../student/first_feature/Result.java | 115 ++++++++++++++++++ .../student/first_feature/TriviaAPI.java | 100 +++++++++++++++ .../first_feature/TriviaQuestions.java | 55 +++++++++ 4 files changed, 272 insertions(+) create mode 100644 src/main/java/org/jointheleague/features/student/first_feature/Result.java create mode 100644 src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java create mode 100644 src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java diff --git a/src/main/java/org/jointheleague/discord_bot/DiscordBot.java b/src/main/java/org/jointheleague/discord_bot/DiscordBot.java index fe54e084..37923693 100644 --- a/src/main/java/org/jointheleague/discord_bot/DiscordBot.java +++ b/src/main/java/org/jointheleague/discord_bot/DiscordBot.java @@ -16,6 +16,7 @@ import org.jointheleague.features.student.first_feature.CookieClicker; import org.jointheleague.features.student.first_feature.FeatureOne; import org.jointheleague.features.student.first_feature.FishingFrenzy; +import org.jointheleague.features.student.first_feature.TriviaAPI; public class DiscordBot { @@ -65,6 +66,7 @@ public void connect(boolean printInvite) throws InterruptedException { addFeature(new CatFactsApi(channelName)); addFeature(new FishingFrenzy(channelName)); addFeature(new CookieClicker(channelName)); + addFeature(new TriviaAPI(channelName)); } private void addFeature(Feature feature){ diff --git a/src/main/java/org/jointheleague/features/student/first_feature/Result.java b/src/main/java/org/jointheleague/features/student/first_feature/Result.java new file mode 100644 index 00000000..94e70e12 --- /dev/null +++ b/src/main/java/org/jointheleague/features/student/first_feature/Result.java @@ -0,0 +1,115 @@ + +package org.jointheleague.features.student.first_feature; + +import java.util.List; +import javax.annotation.Generated; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +@Generated("jsonschema2pojo") +public class Result { + + @SerializedName("type") + @Expose + private String type; + @SerializedName("difficulty") + @Expose + private String difficulty; + @SerializedName("category") + @Expose + private String category; + @SerializedName("question") + @Expose + private String question; + @SerializedName("correct_answer") + @Expose + private String correctAnswer; + @SerializedName("incorrect_answers") + @Expose + private List incorrectAnswers; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getDifficulty() { + return difficulty; + } + + public void setDifficulty(String difficulty) { + this.difficulty = difficulty; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public String getQuestion() { + return question; + } + + public void setQuestion(String question) { + this.question = question; + } + + public String getCorrectAnswer() { + return correctAnswer; + } + + public void setCorrectAnswer(String correctAnswer) { + this.correctAnswer = correctAnswer; + } + + public List getIncorrectAnswers() { + return incorrectAnswers; + } + + public void setIncorrectAnswers(List incorrectAnswers) { + this.incorrectAnswers = incorrectAnswers; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Result.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("type"); + sb.append('='); + sb.append(((this.type == null)?"":this.type)); + sb.append(','); + sb.append("difficulty"); + sb.append('='); + sb.append(((this.difficulty == null)?"":this.difficulty)); + sb.append(','); + sb.append("category"); + sb.append('='); + sb.append(((this.category == null)?"":this.category)); + sb.append(','); + sb.append("question"); + sb.append('='); + sb.append(((this.question == null)?"":this.question)); + sb.append(','); + sb.append("correctAnswer"); + sb.append('='); + sb.append(((this.correctAnswer == null)?"":this.correctAnswer)); + sb.append(','); + sb.append("incorrectAnswers"); + sb.append('='); + sb.append(((this.incorrectAnswers == null)?"":this.incorrectAnswers)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + +} diff --git a/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java b/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java new file mode 100644 index 00000000..ef9c51aa --- /dev/null +++ b/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java @@ -0,0 +1,100 @@ +package org.jointheleague.features.student.first_feature; + +import org.jointheleague.api_wrapper.ReceivedMessage; +import org.jointheleague.features.abstract_classes.Feature; +import org.jointheleague.features.examples.third_features.plain_old_java_objects.news_api.ApiExampleWrapper; +import org.jointheleague.features.examples.third_features.plain_old_java_objects.news_api.Article; +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; + +//Documentation for the API can be found here: https://newsapi.org/docs/get-started +public class TriviaAPI extends Feature { + + public final String COMMAND = "!triviaAPI"; + + private WebClient webClient; + private static final String baseUrl = "https://opentdb.com/api.php"; + + public TriviaAPI(String channelName) { + super(channelName); + helpEmbed = new HelpEmbed(COMMAND, "TriviaAPI gives trivia questions of different topics. This returns a trivia question related to topic 3 (e.g. !triviaAPI 3)"); + + //build the WebClient + this.webClient = WebClient + .builder() + .baseUrl(baseUrl) + .build(); + } + + @Override + public void handle(ReceivedMessage event) { + String messageContent = event.getMessageContent(); + if (messageContent.startsWith(COMMAND)) { + messageContent = messageContent + .replace(COMMAND, "") + .replace(" " , ""); + if (messageContent.equals("")) { + event.sendResponse("Please put a topic after the command (e.g. " + COMMAND + " 3)"); + } + else{ + System.out.println(messageContent); + // String story = findStory(messageContent); + try { + TriviaQuestions tq = getQuestionsByTopic(messageContent); + //event.sendResponse(tq.toString()); + }catch(Exception e) { + e.printStackTrace(); + } + event.sendResponse("after tq"); + } + } + } + + public TriviaQuestions getQuestionsByTopic(String topic) { + Mono apiExampleWrapperMono = webClient.get() + .uri(uriBuilder -> uriBuilder + .queryParam("amount", 10) + .queryParam("category", "19") + .build()) + .retrieve() + .bodyToMono(TriviaQuestions.class); + System.out.println("before block"); + TriviaQuestions tq = apiExampleWrapperMono.block(); + System.out.println("after block"); + return tq; + } + +// public String findStory(int topic){ +// +// //Get a story from News API +// Result question = getQuestionByTopic(topic); +// +// //Get the first article +// Article article = apiExampleWrapper.getArticles().get(0); +// +// //Get the title of the article +// String articleTitle = article.getTitle(); +// +// //Get the content of the article +// String articleContent = article.getContent(); +// +// //Get the URL of the article +// String articleUrl = article.getUrl(); +// +// //Create the message +// String message = +// articleTitle + " -\n" +// + articleContent +// + "\nFull article: " + articleUrl; +// +// //Send the message +// return message; +// } + + public void setWebClient(WebClient webClient) { + this.webClient = webClient; + } + +} + diff --git a/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java b/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java new file mode 100644 index 00000000..2c33682d --- /dev/null +++ b/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java @@ -0,0 +1,55 @@ + +package org.jointheleague.features.student.first_feature; + +import java.util.List; +import javax.annotation.Generated; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +@Generated("jsonschema2pojo") +public class TriviaQuestions { + + @SerializedName("response_code") + @Expose + private Integer responseCode; + @SerializedName("results") + @Expose + private List results; + + public Integer getResponseCode() { + return responseCode; + } + + public void setResponseCode(Integer responseCode) { + this.responseCode = responseCode; + } + + public List getResults() { + return results; + } + + public void setResults(List results) { + this.results = results; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(TriviaQuestions.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("responseCode"); + sb.append('='); + sb.append(((this.responseCode == null)?"":this.responseCode)); + sb.append(','); + sb.append("results"); + sb.append('='); + sb.append(((this.results == null)?"":this.results)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + +} From 42fc349ac419d6f7566a788620c58cb510d23f51 Mon Sep 17 00:00:00 2001 From: league Date: Thu, 11 Sep 2025 17:01:28 -0700 Subject: [PATCH 07/15] Still working on the api --- .../student/first_feature/Result.java | 67 ++++++++++++++----- .../student/first_feature/TriviaAPI.java | 9 +-- .../first_feature/TriviaQuestions.java | 41 ++++++++++-- 3 files changed, 92 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/jointheleague/features/student/first_feature/Result.java b/src/main/java/org/jointheleague/features/student/first_feature/Result.java index 94e70e12..78ce8610 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/Result.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/Result.java @@ -1,81 +1,114 @@ package org.jointheleague.features.student.first_feature; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import javax.annotation.Generated; -import com.google.gson.annotations.Expose; -import com.google.gson.annotations.SerializedName; - +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "type", + "difficulty", + "category", + "question", + "correct_answer", + "incorrect_answers" +}) @Generated("jsonschema2pojo") public class Result { - @SerializedName("type") - @Expose + @JsonProperty("type") private String type; - @SerializedName("difficulty") - @Expose + @JsonProperty("difficulty") private String difficulty; - @SerializedName("category") - @Expose + @JsonProperty("category") private String category; - @SerializedName("question") - @Expose + @JsonProperty("question") private String question; - @SerializedName("correct_answer") - @Expose + @JsonProperty("correct_answer") private String correctAnswer; - @SerializedName("incorrect_answers") - @Expose + @JsonProperty("incorrect_answers") private List incorrectAnswers; + @JsonIgnore + private Map additionalProperties = new LinkedHashMap(); + @JsonProperty("type") public String getType() { return type; } + @JsonProperty("type") public void setType(String type) { this.type = type; } + @JsonProperty("difficulty") public String getDifficulty() { return difficulty; } + @JsonProperty("difficulty") public void setDifficulty(String difficulty) { this.difficulty = difficulty; } + @JsonProperty("category") public String getCategory() { return category; } + @JsonProperty("category") public void setCategory(String category) { this.category = category; } + @JsonProperty("question") public String getQuestion() { return question; } + @JsonProperty("question") public void setQuestion(String question) { this.question = question; } + @JsonProperty("correct_answer") public String getCorrectAnswer() { return correctAnswer; } + @JsonProperty("correct_answer") public void setCorrectAnswer(String correctAnswer) { this.correctAnswer = correctAnswer; } + @JsonProperty("incorrect_answers") public List getIncorrectAnswers() { return incorrectAnswers; } + @JsonProperty("incorrect_answers") public void setIncorrectAnswers(List incorrectAnswers) { this.incorrectAnswers = incorrectAnswers; } + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); @@ -104,6 +137,10 @@ public String toString() { sb.append('='); sb.append(((this.incorrectAnswers == null)?"":this.incorrectAnswers)); sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); if (sb.charAt((sb.length()- 1)) == ',') { sb.setCharAt((sb.length()- 1), ']'); } else { diff --git a/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java b/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java index ef9c51aa..0ec17692 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java @@ -42,11 +42,13 @@ public void handle(ReceivedMessage event) { // String story = findStory(messageContent); try { TriviaQuestions tq = getQuestionsByTopic(messageContent); - //event.sendResponse(tq.toString()); + System.out.println(tq); + for(Result r : tq.getResults()) { + event.sendResponse(r.getQuestion()); + } }catch(Exception e) { e.printStackTrace(); } - event.sendResponse("after tq"); } } } @@ -56,12 +58,11 @@ public TriviaQuestions getQuestionsByTopic(String topic) { .uri(uriBuilder -> uriBuilder .queryParam("amount", 10) .queryParam("category", "19") + .queryParam("type", "boolean") .build()) .retrieve() .bodyToMono(TriviaQuestions.class); - System.out.println("before block"); TriviaQuestions tq = apiExampleWrapperMono.block(); - System.out.println("after block"); return tq; } diff --git a/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java b/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java index 2c33682d..1fda0f91 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java @@ -1,37 +1,62 @@ package org.jointheleague.features.student.first_feature; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import javax.annotation.Generated; -import com.google.gson.annotations.Expose; -import com.google.gson.annotations.SerializedName; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "response_code", + "results" +}) @Generated("jsonschema2pojo") public class TriviaQuestions { - @SerializedName("response_code") - @Expose + @JsonProperty("response_code") private Integer responseCode; - @SerializedName("results") - @Expose + @JsonProperty("results") private List results; + @JsonIgnore + private Map additionalProperties = new LinkedHashMap(); + @JsonProperty("response_code") public Integer getResponseCode() { return responseCode; } + @JsonProperty("response_code") public void setResponseCode(Integer responseCode) { this.responseCode = responseCode; } + @JsonProperty("results") public List getResults() { return results; } + @JsonProperty("results") public void setResults(List results) { this.results = results; } + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); @@ -44,6 +69,10 @@ public String toString() { sb.append('='); sb.append(((this.results == null)?"":this.results)); sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); if (sb.charAt((sb.length()- 1)) == ',') { sb.setCharAt((sb.length()- 1), ']'); } else { From 4bdc6f1db92b2d3c1d0d814d91d62f813bfca655 Mon Sep 17 00:00:00 2001 From: league Date: Thu, 18 Sep 2025 17:10:47 -0700 Subject: [PATCH 08/15] Still working on the API --- .../{Result.java => Question.java} | 4 +- .../student/first_feature/TriviaAPI.java | 83 +++++++++++++++---- .../first_feature/TriviaQuestions.java | 6 +- 3 files changed, 72 insertions(+), 21 deletions(-) rename src/main/java/org/jointheleague/features/student/first_feature/{Result.java => Question.java} (96%) diff --git a/src/main/java/org/jointheleague/features/student/first_feature/Result.java b/src/main/java/org/jointheleague/features/student/first_feature/Question.java similarity index 96% rename from src/main/java/org/jointheleague/features/student/first_feature/Result.java rename to src/main/java/org/jointheleague/features/student/first_feature/Question.java index 78ce8610..cc3b4f4c 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/Result.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/Question.java @@ -22,7 +22,7 @@ "incorrect_answers" }) @Generated("jsonschema2pojo") -public class Result { +public class Question { @JsonProperty("type") private String type; @@ -112,7 +112,7 @@ public void setAdditionalProperty(String name, Object value) { @Override public String toString() { StringBuilder sb = new StringBuilder(); - sb.append(Result.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append(Question.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); sb.append("type"); sb.append('='); sb.append(((this.type == null)?"":this.type)); diff --git a/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java b/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java index 0ec17692..3e4019ff 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java @@ -1,5 +1,9 @@ package org.jointheleague.features.student.first_feature; +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + import org.jointheleague.api_wrapper.ReceivedMessage; import org.jointheleague.features.abstract_classes.Feature; import org.jointheleague.features.examples.third_features.plain_old_java_objects.news_api.ApiExampleWrapper; @@ -18,7 +22,7 @@ public class TriviaAPI extends Feature { public TriviaAPI(String channelName) { super(channelName); - helpEmbed = new HelpEmbed(COMMAND, "TriviaAPI gives trivia questions of different topics. This returns a trivia question related to topic 3 (e.g. !triviaAPI 3)"); + helpEmbed = new HelpEmbed(COMMAND, "TriviaAPI gives trivia true or false questions of different topics. This starts a trivia quiz related to topic 9 (e.g. !triviaAPI 9)"); //build the WebClient this.webClient = WebClient @@ -26,38 +30,85 @@ public TriviaAPI(String channelName) { .baseUrl(baseUrl) .build(); } - + boolean quizStarted = false; + TriviaQuestions tq; + int currentQuestion = 0; @Override public void handle(ReceivedMessage event) { String messageContent = event.getMessageContent(); if (messageContent.startsWith(COMMAND)) { - messageContent = messageContent - .replace(COMMAND, "") - .replace(" " , ""); - if (messageContent.equals("")) { - event.sendResponse("Please put a topic after the command (e.g. " + COMMAND + " 3)"); + if (messageContent.equals("!triviaAPI")) { + event.sendResponse("Please put a topic after the command (e.g. " + COMMAND + " 9)"); + } + if (messageContent.equals("!triviaAPI categories")) { + StringBuilder sb = new StringBuilder(); + for (Integer key : categories.keySet()) { + sb.append(key + " : " + categories.get(key) + "\n"); + } + event.sendResponse(sb.toString()); } - else{ - System.out.println(messageContent); - // String story = findStory(messageContent); + if (messageContent.equals("!triviaAPI stopQuiz")) { + quizStarted = false; + event.sendResponse("Quiz stopped."); + } + if (messageContent.startsWith("!triviaAPI startQuiz")){ + quizStarted = true; + // String story = findStory(messageContent); + + + + try { - TriviaQuestions tq = getQuestionsByTopic(messageContent); - System.out.println(tq); - for(Result r : tq.getResults()) { - event.sendResponse(r.getQuestion()); + + tq = getQuestionsByTopic(messageContent); + event.sendResponse("Starting 10 question quiz about topic: "); + // + + int questionNumber = 1; + for(Question r : tq.getResults()) { + event.sendResponse("Question #" + questionNumber + ": " + r.getQuestion() + " True or false?"); } - }catch(Exception e) { + } + catch(Exception e) { e.printStackTrace(); } } } } + Map categories = new TreeMap<>(); + { + categories.put(9, "General Knowledge"); + categories.put(10, "Books"); + categories.put(11, "Film"); + categories.put(12, "Music"); + categories.put(13, "Musical and Theater"); + categories.put(14, "Television"); + categories.put(15, "Video Games"); + categories.put(16, "Board Games"); + categories.put(17, "Science and Nature"); + categories.put(18, "Computers"); + categories.put(19, "Math"); + categories.put(20, "Mythology"); + categories.put(21, "Sports"); + categories.put(22, "Geography"); + categories.put(23, "History"); + categories.put(24, "Politics"); + categories.put(25, "Art"); + categories.put(26, "Celebrities"); + categories.put(27, "Animals"); + categories.put(28, "Vehicles"); + categories.put(29, "Comics"); + categories.put(30, "Gadgets"); + categories.put(31, "Anime"); + categories.put(32, "Cartoons"); + } + public TriviaQuestions getQuestionsByTopic(String topic) { Mono apiExampleWrapperMono = webClient.get() .uri(uriBuilder -> uriBuilder .queryParam("amount", 10) - .queryParam("category", "19") + .queryParam("category", topic) .queryParam("type", "boolean") .build()) .retrieve() diff --git a/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java b/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java index 1fda0f91..b265ada6 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java @@ -23,7 +23,7 @@ public class TriviaQuestions { @JsonProperty("response_code") private Integer responseCode; @JsonProperty("results") - private List results; + private List results; @JsonIgnore private Map additionalProperties = new LinkedHashMap(); @@ -38,12 +38,12 @@ public void setResponseCode(Integer responseCode) { } @JsonProperty("results") - public List getResults() { + public List getResults() { return results; } @JsonProperty("results") - public void setResults(List results) { + public void setResults(List results) { this.results = results; } From 2504811e0bbb51270740e39bd62a4a191f64f412 Mon Sep 17 00:00:00 2001 From: league Date: Thu, 25 Sep 2025 17:09:15 -0700 Subject: [PATCH 09/15] Still working on it --- build.gradle | 1 + .../student/first_feature/TriviaAPI.java | 94 ++++++++++++------- 2 files changed, 59 insertions(+), 36 deletions(-) diff --git a/build.gradle b/build.gradle index cf380b09..aba06559 100644 --- a/build.gradle +++ b/build.gradle @@ -23,6 +23,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-webflux:2.4.1' testImplementation "org.junit.jupiter:junit-jupiter:${jupiterVersion}" testImplementation "org.junit.jupiter:junit-jupiter-migrationsupport:${jupiterVersion}" + implementation 'org.apache.commons:commons-text:1.11.0' } group = 'org.jointheleague' diff --git a/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java b/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java index 3e4019ff..e57aa182 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java @@ -11,6 +11,7 @@ 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; +import org.apache.commons.text.StringEscapeUtils; //Documentation for the API can be found here: https://newsapi.org/docs/get-started public class TriviaAPI extends Feature { @@ -33,12 +34,40 @@ public TriviaAPI(String channelName) { boolean quizStarted = false; TriviaQuestions tq; int currentQuestion = 0; + int score = 0; + Map categories = new TreeMap<>(); + { + categories.put(9, "General Knowledge"); + categories.put(10, "Books"); + categories.put(11, "Film"); + categories.put(12, "Music"); + categories.put(13, "Musical and Theater"); + categories.put(14, "Television"); + categories.put(15, "Video Games"); + categories.put(16, "Board Games"); + categories.put(17, "Science and Nature"); + categories.put(18, "Computers"); + categories.put(19, "Math"); + categories.put(20, "Mythology"); + categories.put(21, "Sports"); + categories.put(22, "Geography"); + categories.put(23, "History"); + categories.put(24, "Politics"); + categories.put(25, "Art"); + categories.put(26, "Celebrities"); + categories.put(27, "Animals"); + categories.put(28, "Vehicles"); + categories.put(29, "Comics"); + categories.put(30, "Gadgets"); + categories.put(31, "Anime"); + categories.put(32, "Cartoons"); + } @Override public void handle(ReceivedMessage event) { String messageContent = event.getMessageContent(); if (messageContent.startsWith(COMMAND)) { - if (messageContent.equals("!triviaAPI")) { - event.sendResponse("Please put a topic after the command (e.g. " + COMMAND + " 9)"); + if (messageContent.equals("!triviaAPI help")) { + event.sendResponse("Commands:\n`!triviaAPI categories` to list all topics.\n`!triviaAPI startQuiz [topic number]` to start a quiz based on a topic.\n`!triviaAPI stopQuiz` to stop the current quiz.\n`!triviaAPI answer [answer]` to answer a question."); } if (messageContent.equals("!triviaAPI categories")) { StringBuilder sb = new StringBuilder(); @@ -49,9 +78,10 @@ public void handle(ReceivedMessage event) { } if (messageContent.equals("!triviaAPI stopQuiz")) { quizStarted = false; - event.sendResponse("Quiz stopped."); + event.sendResponse("Quiz stopped. You got a final score of " + score + "/" + currentQuestion); } if (messageContent.startsWith("!triviaAPI startQuiz")){ + messageContent = messageContent.replace("!triviaAPI startQuiz ", ""); quizStarted = true; // String story = findStory(messageContent); @@ -61,47 +91,39 @@ public void handle(ReceivedMessage event) { try { tq = getQuestionsByTopic(messageContent); - event.sendResponse("Starting 10 question quiz about topic: "); + event.sendResponse("Starting 10 question quiz about topic: " + (categories.get(Integer.parseInt(messageContent)))); // - - int questionNumber = 1; - for(Question r : tq.getResults()) { - event.sendResponse("Question #" + questionNumber + ": " + r.getQuestion() + " True or false?"); - } + event.sendResponse("Question #" + (currentQuestion+1) + ": " + StringEscapeUtils.unescapeHtml4(tq.getResults().get(currentQuestion).getQuestion() + " True or false?")); } catch(Exception e) { e.printStackTrace(); } } + if (messageContent.startsWith("!triviaAPI answer")) { + if (quizStarted) { + messageContent = messageContent.replace("!triviaAPI answer ", ""); + if (messageContent.toLowerCase().equals(tq.getResults().get(currentQuestion).getCorrectAnswer().toLowerCase())) { + event.sendResponse("Correct!"); + score++; + currentQuestion++; + } + else { + event.sendResponse("Incorrect! The answer was " + tq.getResults().get(currentQuestion).getCorrectAnswer()); + currentQuestion++; + } + if (currentQuestion == 10) { + event.sendResponse("Congrats! You have finished the quiz! You got a final score of " + score + "/" + currentQuestion); + } + else { + event.sendResponse("Question #" + (currentQuestion+1) + ": " + StringEscapeUtils.unescapeHtml4(tq.getResults().get(currentQuestion).getQuestion() + " True or false?")); + } + } + else { + event.sendResponse("There is no quiz started."); + } + } } } - Map categories = new TreeMap<>(); - { - categories.put(9, "General Knowledge"); - categories.put(10, "Books"); - categories.put(11, "Film"); - categories.put(12, "Music"); - categories.put(13, "Musical and Theater"); - categories.put(14, "Television"); - categories.put(15, "Video Games"); - categories.put(16, "Board Games"); - categories.put(17, "Science and Nature"); - categories.put(18, "Computers"); - categories.put(19, "Math"); - categories.put(20, "Mythology"); - categories.put(21, "Sports"); - categories.put(22, "Geography"); - categories.put(23, "History"); - categories.put(24, "Politics"); - categories.put(25, "Art"); - categories.put(26, "Celebrities"); - categories.put(27, "Animals"); - categories.put(28, "Vehicles"); - categories.put(29, "Comics"); - categories.put(30, "Gadgets"); - categories.put(31, "Anime"); - categories.put(32, "Cartoons"); - } public TriviaQuestions getQuestionsByTopic(String topic) { From a41918980ae0cfd0c09fc254e1ea26325470c213 Mon Sep 17 00:00:00 2001 From: league Date: Thu, 2 Oct 2025 16:59:05 -0700 Subject: [PATCH 10/15] Working on testing --- .../student/first_feature/FishingFrenzy.java | 50 +++--- .../student/first_feature/TriviaAPI.java | 9 ++ .../first_feature/CookieClickerTest.java | 116 ++++++++++++++ .../first_feature/FishingFrenzyTest.java | 151 ++++++++++++++++++ ...FeatureOneTest.java => TriviaAPITest.java} | 2 +- 5 files changed, 304 insertions(+), 24 deletions(-) create mode 100644 src/test/java/org/jointheleague/features/student/first_feature/CookieClickerTest.java create mode 100644 src/test/java/org/jointheleague/features/student/first_feature/FishingFrenzyTest.java rename src/test/java/org/jointheleague/features/student/first_feature/{FeatureOneTest.java => TriviaAPITest.java} (99%) diff --git a/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java b/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java index 326f4514..20559985 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/FishingFrenzy.java @@ -32,33 +32,37 @@ public void handle(ReceivedMessage event) { else if (messageContent.equals("!fishingFrenzy fish")) { Random r = new Random(); double randomNumber = r.nextDouble() * 100; - if (randomNumber < 1) { - event.sendResponse("You caught a Dragonfish! (Legendary: 1%)\nYou gained 750 coins!"); - coins+=750; - } else if (randomNumber < 5){ - event.sendResponse("You caught a Golden Koi! (Mythic: 4%)\nYou gained 300 coins!"); - coins+=300; - } - else if (randomNumber < 15) { - event.sendResponse("You caught a Swordfish! (Epic: 10%)\nYou gained 150 coins!"); - coins+=150; - } - else if (randomNumber < 30) { - event.sendResponse("You caught a Salmon! (Rare: 15%)\nYou gained 75 coins!"); - coins+=75; - } - else if (randomNumber < 55) { - event.sendResponse("You caught a Mackeral! (Uncommon: 25%)\nYou gained 30 coins!"); - coins+=30; - } - else { - event.sendResponse("You caught a Carp! (Common: 45%)\nYou gained 10 coins!"); - coins+=10; - } + fishdrops(event, randomNumber); } else if (messageContent.equals("!fishingFrenzy balance")) { event.sendResponse("You have " + coins + " coins."); } } + public void fishdrops(ReceivedMessage event, double randomNumber) { + if (randomNumber < 1) { + event.sendResponse("You caught a Dragonfish! (Legendary: 1%)\nYou gained 750 coins!"); + coins+=750; + } else if (randomNumber < 5){ + event.sendResponse("You caught a Golden Koi! (Mythic: 4%)\nYou gained 300 coins!"); + coins+=300; + } + else if (randomNumber < 15) { + event.sendResponse("You caught a Swordfish! (Epic: 10%)\nYou gained 150 coins!"); + coins+=150; + } + else if (randomNumber < 30) { + event.sendResponse("You caught a Salmon! (Rare: 15%)\nYou gained 75 coins!"); + coins+=75; + } + else if (randomNumber < 55) { + event.sendResponse("You caught a Mackeral! (Uncommon: 25%)\nYou gained 30 coins!"); + coins+=30; + } + else { + event.sendResponse("You caught a Carp! (Common: 45%)\nYou gained 10 coins!"); + coins+=10; + } + } + } diff --git a/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java b/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java index e57aa182..e81ddcb9 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java @@ -77,8 +77,14 @@ public void handle(ReceivedMessage event) { event.sendResponse(sb.toString()); } if (messageContent.equals("!triviaAPI stopQuiz")) { + if (!quizStarted) { + event.sendResponse("There is no quiz started."); + return; + } quizStarted = false; event.sendResponse("Quiz stopped. You got a final score of " + score + "/" + currentQuestion); + currentQuestion = 0; + score = 0; } if (messageContent.startsWith("!triviaAPI startQuiz")){ messageContent = messageContent.replace("!triviaAPI startQuiz ", ""); @@ -110,9 +116,12 @@ public void handle(ReceivedMessage event) { else { event.sendResponse("Incorrect! The answer was " + tq.getResults().get(currentQuestion).getCorrectAnswer()); currentQuestion++; + } if (currentQuestion == 10) { event.sendResponse("Congrats! You have finished the quiz! You got a final score of " + score + "/" + currentQuestion); + currentQuestion = 0; + score = 0; } else { event.sendResponse("Question #" + (currentQuestion+1) + ": " + StringEscapeUtils.unescapeHtml4(tq.getResults().get(currentQuestion).getQuestion() + " True or false?")); diff --git a/src/test/java/org/jointheleague/features/student/first_feature/CookieClickerTest.java b/src/test/java/org/jointheleague/features/student/first_feature/CookieClickerTest.java new file mode 100644 index 00000000..eede1cc0 --- /dev/null +++ b/src/test/java/org/jointheleague/features/student/first_feature/CookieClickerTest.java @@ -0,0 +1,116 @@ +package org.jointheleague.features.student.first_feature; + +import org.jointheleague.api_wrapper.ReceivedMessage; +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 CookieClickerTest { + private final String testChannelName = "test"; + private final FeatureOne featureOne = new FeatureOne(testChannelName); + + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private final PrintStream originalOut = System.out; + + @Mock + private ReceivedMessage receivedMessage; + + @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 = featureOne.COMMAND; + + //Then + + if(!(featureOne instanceof FeatureTemplate)){ + assertNotEquals("!command", command); + } + + assertNotEquals("", command); + assertNotEquals("!", command); + assertNotEquals("!command", command); + assertEquals('!', command.charAt(0)); + assertNotNull(command); + } + + @Test + void itShouldHandleMessagesWithCommand() { + //Given + HelpEmbed helpEmbed = new HelpEmbed(featureOne.COMMAND, "test"); + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND); + + //When + featureOne.handle(receivedMessage); + + //Then + verify(receivedMessage, times(1)).sendResponse(anyString()); + } + + @Test + void itShouldNotHandleMessagesWithoutCommand() { + //Given + String command = ""; + when(receivedMessage.getMessageContent()).thenReturn(command); + + //When + featureOne.handle(receivedMessage); + + //Then + verify(receivedMessage, never()).sendResponse(""); + } + + @Test + void itShouldHaveAHelpEmbed() { + //Given + + //When + HelpEmbed actualHelpEmbed = featureOne.getHelpEmbed(); + + //Then + assertNotNull(actualHelpEmbed); + } + + @Test + void itShouldHaveTheCommandAsTheTitleOfTheHelpEmbed() { + //Given + + //When + String helpEmbedTitle = featureOne.getHelpEmbed().getTitle(); + String command = featureOne.COMMAND; + + //Then + assertEquals(command, helpEmbedTitle); + } + +} diff --git a/src/test/java/org/jointheleague/features/student/first_feature/FishingFrenzyTest.java b/src/test/java/org/jointheleague/features/student/first_feature/FishingFrenzyTest.java new file mode 100644 index 00000000..084332ac --- /dev/null +++ b/src/test/java/org/jointheleague/features/student/first_feature/FishingFrenzyTest.java @@ -0,0 +1,151 @@ +package org.jointheleague.features.student.first_feature; + +import org.jointheleague.api_wrapper.ReceivedMessage; +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 FishingFrenzyTest { + private final String testChannelName = "general"; + private final FishingFrenzy fishingFrenzy = new FishingFrenzy(testChannelName); + + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private final PrintStream originalOut = System.out; + + @Mock + private ReceivedMessage receivedMessage; + + @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 = fishingFrenzy.COMMAND; + + //Then + + + + assertNotEquals("", command); + assertNotEquals("!", command); + assertNotEquals("!command", command); + assertEquals('!', command.charAt(0)); + assertNotNull(command); + } + + @Test + void itShouldHandleMessagesWithCommandAndHelp() { + //Given + when(receivedMessage.getMessageContent()).thenReturn(fishingFrenzy.COMMAND + " help"); + + //When + fishingFrenzy.handle(receivedMessage); + + //Then + verify(receivedMessage, times(1)).sendResponse("Commands:\n`!fishingFrenzy cast` to cast your line.\n`!fishingFrenzy balance` to see how much coins you have. "); + } + + @Test + void itShouldNotHandleMessagesWithoutCommand() { + //Given + String command = ""; + when(receivedMessage.getMessageContent()).thenReturn(command); + + //When + fishingFrenzy.handle(receivedMessage); + + //Then + verify(receivedMessage, never()).sendResponse(""); + } + + @Test + void itShouldHaveAHelpEmbed() { + //Given + + //When + HelpEmbed actualHelpEmbed = fishingFrenzy.getHelpEmbed(); + + //Then + assertNotNull(actualHelpEmbed); + } + + @Test + void itShouldHaveTheCommandAsTheTitleOfTheHelpEmbed() { + //Given + + //When + String helpEmbedTitle = fishingFrenzy.getHelpEmbed().getTitle(); + String command = fishingFrenzy.COMMAND; + + //Then + assertEquals(command, helpEmbedTitle); + } + @Test + void itShouldGiveFishDrops() { + //Given + fishingFrenzy.fishdrops(receivedMessage, 0); + verify(receivedMessage, times(1)).sendResponse("You caught a Dragonfish! (Legendary: 1%)\nYou gained 750 coins!"); + fishingFrenzy.fishdrops(receivedMessage, 1); + verify(receivedMessage, times(1)).sendResponse("You caught a Golden Koi! (Mythic: 4%)\nYou gained 300 coins!"); + fishingFrenzy.fishdrops(receivedMessage, 10); + verify(receivedMessage, times(1)).sendResponse("You caught a Swordfish! (Epic: 10%)\nYou gained 150 coins!"); + fishingFrenzy.fishdrops(receivedMessage, 20); + verify(receivedMessage, times(1)).sendResponse("You caught a Salmon! (Rare: 15%)\nYou gained 75 coins!"); + fishingFrenzy.fishdrops(receivedMessage, 50); + verify(receivedMessage, times(1)).sendResponse("You caught a Mackeral! (Uncommon: 25%)\nYou gained 30 coins!"); + fishingFrenzy.fishdrops(receivedMessage, 60); + verify(receivedMessage, times(1)).sendResponse("You caught a Carp! (Common: 45%)\nYou gained 10 coins!"); + + } + @Test + void itShouldFish() { + //Given + when(receivedMessage.getMessageContent()).thenReturn(fishingFrenzy.COMMAND + " fish"); + + //When + fishingFrenzy.handle(receivedMessage); + + //Then + verify(receivedMessage, times(1)).sendResponse(anyString()); + } + @Test + void itShouldBalance() { + //Given + when(receivedMessage.getMessageContent()).thenReturn(fishingFrenzy.COMMAND + " balance"); + + //When + fishingFrenzy.handle(receivedMessage); + + //Then + verify(receivedMessage, times(1)).sendResponse("You have " + fishingFrenzy.coins + " coins."); + } +} diff --git a/src/test/java/org/jointheleague/features/student/first_feature/FeatureOneTest.java b/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java similarity index 99% rename from src/test/java/org/jointheleague/features/student/first_feature/FeatureOneTest.java rename to src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java index 8c95c657..b156bcd1 100644 --- a/src/test/java/org/jointheleague/features/student/first_feature/FeatureOneTest.java +++ b/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java @@ -19,7 +19,7 @@ import static org.mockito.Mockito.*; import static org.mockito.Mockito.never; -public class FeatureOneTest { +public class TriviaAPITest { private final String testChannelName = "test"; private final FeatureOne featureOne = new FeatureOne(testChannelName); From 142a0526bf9fd794b77249ef5f3c967f8c96b9f9 Mon Sep 17 00:00:00 2001 From: league Date: Thu, 9 Oct 2025 17:00:45 -0700 Subject: [PATCH 11/15] Finished cookie test --- .../student/first_feature/CookieClicker.java | 21 ++-- .../first_feature/CookieClickerTest.java | 110 ++++++++++++++++-- 2 files changed, 114 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java b/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java index 1d82cdbe..5bf3abca 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/CookieClicker.java @@ -22,33 +22,36 @@ public CookieClicker(String channelName) { @Override public void handle(ReceivedMessage event) { String messageContent = event.getMessageContent(); - if (messageContent.equals("!cookieClicker help")) { + if (messageContent.equals(COMMAND)) { + event.sendResponse("Please type something after the command."); + } + else if (messageContent.equals("!cookieClicker help")) { //respond to message here event.sendResponse("Commands:\n`!cookieCliker click` to bake a cookie.\n`!cookieClicker cookies` to see how much cookies you have.\n`!cookieClicker upgrades` to buy upgrades."); } - if (messageContent.equals("!cookieClicker click")) { - event.sendResponse("You gained " + click + " cookie"); + else if (messageContent.equals("!cookieClicker click")) { cookies += click; + event.sendResponse("You gained " + click + " cookie"); } - if (messageContent.equals("!cookieClicker cookies")) { + else if (messageContent.equals("!cookieClicker cookies")) { event.sendResponse("You have " + cookies + " cookies in total."); } - if (messageContent.equals("!cookieClicker upgrades")) { + else if (messageContent.equals("!cookieClicker upgrades")) { event.sendResponse("Upgrades: Increases cookies per click. To buy, just type `!cookieClicker [upgrade name]`\nCursor (+1): 10 cookies\nGramma (+5): 50 cookies\nFarm (+10): 100 cookies\nMine (+50): 300 cookies"); } - if (messageContent.startsWith(COMMAND) && messageContent.endsWith("cursor")) { + else if (messageContent.equals("!cookieClicker cursor")) { click += 1; cookies -= 10; } - if (messageContent.startsWith(COMMAND) && messageContent.endsWith("gramma")) { + else if (messageContent.equals("!cookieClicker gramma")) { click += 5; cookies -= 50; } - if (messageContent.startsWith(COMMAND) && messageContent.endsWith("farm")) { + else if (messageContent.equals("!cookieClicker farm")) { click += 10; cookies -= 100; } - if (messageContent.startsWith(COMMAND) && messageContent.endsWith("mine")) { + else if (messageContent.equals("!cookieClicker mine")) { click += 50; cookies -= 300; } diff --git a/src/test/java/org/jointheleague/features/student/first_feature/CookieClickerTest.java b/src/test/java/org/jointheleague/features/student/first_feature/CookieClickerTest.java index eede1cc0..9d1c36cc 100644 --- a/src/test/java/org/jointheleague/features/student/first_feature/CookieClickerTest.java +++ b/src/test/java/org/jointheleague/features/student/first_feature/CookieClickerTest.java @@ -17,11 +17,10 @@ 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 CookieClickerTest { private final String testChannelName = "test"; - private final FeatureOne featureOne = new FeatureOne(testChannelName); + private final CookieClicker featureOne = new CookieClicker(testChannelName); private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); private final PrintStream originalOut = System.out; @@ -51,11 +50,7 @@ void itShouldHaveACommand() { //When String command = featureOne.COMMAND; - //Then - - if(!(featureOne instanceof FeatureTemplate)){ - assertNotEquals("!command", command); - } + assertNotEquals("", command); assertNotEquals("!", command); @@ -74,7 +69,7 @@ void itShouldHandleMessagesWithCommand() { featureOne.handle(receivedMessage); //Then - verify(receivedMessage, times(1)).sendResponse(anyString()); + verify(receivedMessage, times(1)).sendResponse("Please type something after the command."); } @Test @@ -112,5 +107,104 @@ void itShouldHaveTheCommandAsTheTitleOfTheHelpEmbed() { //Then assertEquals(command, helpEmbedTitle); } + @Test + void itShouldHelp() { + //Given + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " help"); + //When + featureOne.handle(receivedMessage); + + //Then + verify(receivedMessage, times(1)).sendResponse("Commands:\n`!cookieCliker click` to bake a cookie.\n`!cookieClicker cookies` to see how much cookies you have.\n`!cookieClicker upgrades` to buy upgrades."); + + } + @Test + void itShouldClick() { + //Given + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " click"); + //When + + featureOne.handle(receivedMessage); + + //Then + verify(receivedMessage, times(1)).sendResponse("You gained " + featureOne.click + " cookie"); + + } + @Test + void itShouldShowCookies() { + //Given + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " cookies"); + //When + featureOne.handle(receivedMessage); + + //Then + verify(receivedMessage, times(1)).sendResponse("You have " + featureOne.cookies + " cookies in total."); + + } + @Test + void itShouldGiveUpgrades() { + //Given + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " upgrades"); + //When + featureOne.handle(receivedMessage); + + //Then + verify(receivedMessage, times(1)).sendResponse("Upgrades: Increases cookies per click. To buy, just type `!cookieClicker [upgrade name]`\nCursor (+1): 10 cookies\nGramma (+5): 50 cookies\nFarm (+10): 100 cookies\nMine (+50): 300 cookies"); + } + @Test + void itShouldBuyCursor() { + //Given + int clicks = featureOne.click; + int cookies = featureOne.cookies; + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " cursor"); + //When + featureOne.handle(receivedMessage); + + //Then + + assertEquals(clicks+1, featureOne.click); + assertEquals(cookies-10, featureOne.cookies); + } + @Test + void itShouldBuyGramma() { + //Given + int clicks = featureOne.click; + int cookies = featureOne.cookies; + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " gramma"); + //When + featureOne.handle(receivedMessage); + + //Then + + assertEquals(clicks+5, featureOne.click); + assertEquals(cookies-50, featureOne.cookies); + } + @Test + void itShouldBuyFarm() { + //Given + int clicks = featureOne.click; + int cookies = featureOne.cookies; + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " farm"); + //When + featureOne.handle(receivedMessage); + //Then + + assertEquals(clicks+10, featureOne.click); + assertEquals(cookies-100, featureOne.cookies); + } + @Test + void itShouldBuyMine() { + //Given + int clicks = featureOne.click; + int cookies = featureOne.cookies; + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " mine"); + //When + featureOne.handle(receivedMessage); + + //Then + + assertEquals(clicks+50, featureOne.click); + assertEquals(cookies-300, featureOne.cookies); + } } From 271355b6ad15ea70847a74867eee08dfb2ca4fd7 Mon Sep 17 00:00:00 2001 From: league Date: Thu, 16 Oct 2025 16:57:50 -0700 Subject: [PATCH 12/15] Still working on TriviaAPI Test --- .../student/first_feature/TriviaAPITest.java | 101 +++++++++++------- 1 file changed, 65 insertions(+), 36 deletions(-) diff --git a/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java b/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java index b156bcd1..c29d5c12 100644 --- a/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java +++ b/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java @@ -1,6 +1,7 @@ package org.jointheleague.features.student.first_feature; import org.jointheleague.api_wrapper.ReceivedMessage; +import org.jointheleague.features.examples.third_features.plain_old_java_objects.news_api.ApiExampleWrapper; 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; @@ -8,6 +9,9 @@ import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.springframework.web.reactive.function.client.WebClient; + +import reactor.core.publisher.Mono; import java.io.ByteArrayOutputStream; import java.io.PrintStream; @@ -17,18 +21,28 @@ 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 TriviaAPITest { private final String testChannelName = "test"; - private final FeatureOne featureOne = new FeatureOne(testChannelName); + private final TriviaAPI featureOne = new TriviaAPI(testChannelName); private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); private final PrintStream originalOut = System.out; @Mock private ReceivedMessage receivedMessage; + @Mock + WebClient webClientMock; + @Mock + WebClient.RequestHeadersUriSpec requestHeadersUriSpecMock; + @Mock + WebClient.RequestHeadersSpec requestHeadersSpecMock; + + @Mock + WebClient.ResponseSpec responseSpecMock; + @Mock + Mono apiExampleWrapperMonoMock; @BeforeEach void setUp() { MockitoAnnotations.openMocks(this); @@ -43,40 +57,6 @@ public void itShouldNotPrintToSystemOut() { assertEquals(expected, actual); System.setOut(originalOut); } - - @Test - void itShouldHaveACommand() { - //Given - - //When - String command = featureOne.COMMAND; - - //Then - - if(!(featureOne instanceof FeatureTemplate)){ - assertNotEquals("!command", command); - } - - assertNotEquals("", command); - assertNotEquals("!", command); - assertNotEquals("!command", command); - assertEquals('!', command.charAt(0)); - assertNotNull(command); - } - - @Test - void itShouldHandleMessagesWithCommand() { - //Given - HelpEmbed helpEmbed = new HelpEmbed(featureOne.COMMAND, "test"); - when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND); - - //When - featureOne.handle(receivedMessage); - - //Then - verify(receivedMessage, times(1)).sendResponse(anyString()); - } - @Test void itShouldNotHandleMessagesWithoutCommand() { //Given @@ -112,5 +92,54 @@ void itShouldHaveTheCommandAsTheTitleOfTheHelpEmbed() { //Then assertEquals(command, helpEmbedTitle); } + @Test + void itShouldHelp() { + //Given + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " help"); + //When + featureOne.handle(receivedMessage); + + //Then + verify(receivedMessage, times(1)).sendResponse("Commands:\n`!triviaAPI categories` to list all topics.\n`!triviaAPI startQuiz [topic number]` to start a quiz based on a topic.\n`!triviaAPI stopQuiz` to stop the current quiz.\n`!triviaAPI answer [answer]` to answer a question."); + + } + @Test + void itShouldGiveCategories() { + //Given + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " categories"); + //When + featureOne.handle(receivedMessage); + StringBuilder sb = new StringBuilder(); + for (Integer key : featureOne.categories.keySet()) { + sb.append(key + " : " + featureOne.categories.get(key) + "\n"); + } + //Then + verify(receivedMessage, times(1)).sendResponse(sb.toString()); + + } + @Test + void itShouldStopQuiz() { + //Given + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " stopQuiz"); + //When + featureOne.handle(receivedMessage); + if (!featureOne.quizStarted) { + verify(receivedMessage, times(1)).sendResponse("There is no quiz started."); + } + featureOne.quizStarted = true; + featureOne.handle(receivedMessage); + assertEquals(featureOne.quizStarted, false); + verify(receivedMessage, times(1)).sendResponse("Quiz stopped. You got a final score of " + featureOne.score + "/" + featureOne.currentQuestion); + assertEquals(featureOne.currentQuestion, 0); + assertEquals(featureOne.score, 0); + } + @Test + void itShouldStartQuiz() { + //Given + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " startQuiz"); + //When + featureOne.handle(receivedMessage); + + } } From e7ad578a0a084b86a1a59fbafaaf2ae57bc1cada Mon Sep 17 00:00:00 2001 From: league Date: Thu, 23 Oct 2025 17:05:28 -0700 Subject: [PATCH 13/15] still working on TriviaAPITest --- .../student/first_feature/Question.java | 4 +-- .../student/first_feature/TriviaAPI.java | 10 +++--- .../first_feature/TriviaQuestions.java | 2 +- .../student/first_feature/TriviaAPITest.java | 36 ++++++++++++++++++- 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/jointheleague/features/student/first_feature/Question.java b/src/main/java/org/jointheleague/features/student/first_feature/Question.java index cc3b4f4c..1cb101af 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/Question.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/Question.java @@ -31,9 +31,9 @@ public class Question { @JsonProperty("category") private String category; @JsonProperty("question") - private String question; + public String question; @JsonProperty("correct_answer") - private String correctAnswer; + public String correctAnswer; @JsonProperty("incorrect_answers") private List incorrectAnswers; @JsonIgnore diff --git a/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java b/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java index e81ddcb9..3efd4bc8 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java @@ -94,16 +94,16 @@ public void handle(ReceivedMessage event) { - try { +// try { tq = getQuestionsByTopic(messageContent); event.sendResponse("Starting 10 question quiz about topic: " + (categories.get(Integer.parseInt(messageContent)))); // event.sendResponse("Question #" + (currentQuestion+1) + ": " + StringEscapeUtils.unescapeHtml4(tq.getResults().get(currentQuestion).getQuestion() + " True or false?")); - } - catch(Exception e) { - e.printStackTrace(); - } +// } +// catch(Exception e) { +// e.printStackTrace(); +// } } if (messageContent.startsWith("!triviaAPI answer")) { if (quizStarted) { diff --git a/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java b/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java index b265ada6..72533ace 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/TriviaQuestions.java @@ -23,7 +23,7 @@ public class TriviaQuestions { @JsonProperty("response_code") private Integer responseCode; @JsonProperty("results") - private List results; + public List results; @JsonIgnore private Map additionalProperties = new LinkedHashMap(); diff --git a/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java b/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java index c29d5c12..818b13f5 100644 --- a/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java +++ b/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java @@ -1,5 +1,6 @@ package org.jointheleague.features.student.first_feature; +import org.apache.commons.text.StringEscapeUtils; import org.jointheleague.api_wrapper.ReceivedMessage; import org.jointheleague.features.examples.third_features.plain_old_java_objects.news_api.ApiExampleWrapper; import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed; @@ -15,6 +16,7 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.util.ArrayList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -137,9 +139,41 @@ void itShouldStopQuiz() { @Test void itShouldStartQuiz() { //Given - when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " startQuiz"); + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " startQuiz 15"); //When featureOne.handle(receivedMessage); + verify(receivedMessage).sendResponse("Starting 10 question quiz about topic: " + (featureOne.categories.get(15))); + verify(receivedMessage).sendResponse("Question #" + (featureOne.currentQuestion+1) + ": " + StringEscapeUtils.unescapeHtml4(featureOne.tq.getResults().get(featureOne.currentQuestion).getQuestion() + " True or false?")); + } + @Test + void itShouldAnswer() { + Question q = new Question(); + q.question = "1+1 = 2"; + q.correctAnswer = "true"; + Question q2 = new Question(); + q.question = "2+2 = 5"; + q.correctAnswer = "false"; + TriviaQuestions tq = new TriviaQuestions(); + tq.results = new ArrayList (); + tq.results.add(q); + tq.results.add(q2); + featureOne.tq = tq; + //Given + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " answer true"); + featureOne.handle(receivedMessage); + //When + int score = featureOne.score; + int currentQuestion = featureOne.currentQuestion; + if(featureOne.quizStarted) { + if (featureOne.tq.getResults().get(featureOne.currentQuestion).getCorrectAnswer().toLowerCase().equals("true")) { + verify(receivedMessage).sendResponse("Correct"); + assertEquals(score+1, featureOne.score); + assertEquals(currentQuestion+1, featureOne.currentQuestion); + } + featureOne.handle(receivedMessage); + verify(receivedMessage).sendResponse("Incorrect! The answer was " + featureOne.tq.getResults().get(featureOne.currentQuestion).getCorrectAnswer()); + assertEquals(currentQuestion+1, featureOne.currentQuestion); + } } } From 24cb1901517f88b4b4bb86a86c24b91ce57ceb6c Mon Sep 17 00:00:00 2001 From: league Date: Thu, 30 Oct 2025 17:01:04 -0700 Subject: [PATCH 14/15] Still working on Trivia Api Test --- .../student/first_feature/TriviaAPITest.java | 70 ++++++++++++++----- 1 file changed, 53 insertions(+), 17 deletions(-) diff --git a/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java b/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java index 818b13f5..37530ce0 100644 --- a/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java +++ b/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java @@ -146,34 +146,70 @@ void itShouldStartQuiz() { verify(receivedMessage).sendResponse("Question #" + (featureOne.currentQuestion+1) + ": " + StringEscapeUtils.unescapeHtml4(featureOne.tq.getResults().get(featureOne.currentQuestion).getQuestion() + " True or false?")); } @Test - void itShouldAnswer() { + void testUserSendsAnswerWithoutQuizStarted() { + featureOne.quizStarted = false; + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " answer true"); + featureOne.handle(receivedMessage); + verify(receivedMessage).sendResponse("There is no quiz started."); + } + @Test + void itShouldHaveIncorrectAnswer() { Question q = new Question(); q.question = "1+1 = 2"; q.correctAnswer = "true"; Question q2 = new Question(); - q.question = "2+2 = 5"; - q.correctAnswer = "false"; + q2.question = "2+2 = 5"; + q2.correctAnswer = "false"; TriviaQuestions tq = new TriviaQuestions(); tq.results = new ArrayList (); tq.results.add(q); tq.results.add(q2); featureOne.tq = tq; - //Given - when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " answer true"); + int currentQuestion = featureOne.currentQuestion; + featureOne.quizStarted = true; + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " answer false"); featureOne.handle(receivedMessage); - //When + verify(receivedMessage).sendResponse("Incorrect! The answer was " + featureOne.tq.getResults().get(featureOne.currentQuestion).getCorrectAnswer()); + assertEquals(currentQuestion+1, featureOne.currentQuestion); + } + @Test + void itShouldHaveCorrectAnswer() { + Question q = new Question(); + q.question = "1+1 = 2"; + q.correctAnswer = "true"; + Question q2 = new Question(); + q2.question = "2+2 = 5"; + q2.correctAnswer = "false"; + TriviaQuestions tq = new TriviaQuestions(); + tq.results = new ArrayList (); + tq.results.add(q); + tq.results.add(q2); + featureOne.tq = tq; + //Given + featureOne.quizStarted = true; int score = featureOne.score; int currentQuestion = featureOne.currentQuestion; - if(featureOne.quizStarted) { - if (featureOne.tq.getResults().get(featureOne.currentQuestion).getCorrectAnswer().toLowerCase().equals("true")) { - verify(receivedMessage).sendResponse("Correct"); - assertEquals(score+1, featureOne.score); - assertEquals(currentQuestion+1, featureOne.currentQuestion); - } - featureOne.handle(receivedMessage); - verify(receivedMessage).sendResponse("Incorrect! The answer was " + featureOne.tq.getResults().get(featureOne.currentQuestion).getCorrectAnswer()); - assertEquals(currentQuestion+1, featureOne.currentQuestion); - } - + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " answer true"); + featureOne.handle(receivedMessage); + verify(receivedMessage).sendResponse("Correct!"); + assertEquals(currentQuestion+1, featureOne.currentQuestion); + assertEquals(score+1, featureOne.score); } +// @Test +// void itShouldEndQuiz() { +// Question q = new Question(); +// q.question = "1+1 = 2"; +// q.correctAnswer = "true"; +// TriviaQuestions tq = new TriviaQuestions(); +// tq.results = new ArrayList (); +// tq.results.add(q); +// featureOne.tq = tq; +// featureOne.currentQuestion = 9; +// featureOne.quizStarted = true; +// when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " answer true"); +// featureOne.handle(receivedMessage); +// verify(receivedMessage).sendResponse("Congrats! You have finished the quiz! You got a final score of " + featureOne.score + "/" + featureOne.currentQuestion); +// assertEquals(featureOne.score, 0); +// assertEquals(featureOne.currentQuestion, 0); +// } } From a69fc8111a53b4e765298bf1ec488d49866fab0c Mon Sep 17 00:00:00 2001 From: league Date: Wed, 19 Nov 2025 19:23:41 -0800 Subject: [PATCH 15/15] Finished Discord Bot --- .../jointheleague/discord_bot/DiscordBot.java | 5 --- .../student/first_feature/TriviaAPI.java | 7 +--- .../student/first_feature/TriviaAPITest.java | 41 +++++++++++-------- 3 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/jointheleague/discord_bot/DiscordBot.java b/src/main/java/org/jointheleague/discord_bot/DiscordBot.java index 37923693..049c1d51 100644 --- a/src/main/java/org/jointheleague/discord_bot/DiscordBot.java +++ b/src/main/java/org/jointheleague/discord_bot/DiscordBot.java @@ -59,11 +59,6 @@ public void connect(boolean printInvite) throws InterruptedException { api.addEventListener(helpListener); //add features - addFeature(new FeatureOne(channelName)); - addFeature(new CurrentTime(channelName)); - addFeature(new HighLowGame(channelName)); - addFeature(new NewsApi(channelName)); - addFeature(new CatFactsApi(channelName)); addFeature(new FishingFrenzy(channelName)); addFeature(new CookieClicker(channelName)); addFeature(new TriviaAPI(channelName)); diff --git a/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java b/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java index 3efd4bc8..5c7d9105 100644 --- a/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java +++ b/src/main/java/org/jointheleague/features/student/first_feature/TriviaAPI.java @@ -20,7 +20,7 @@ public class TriviaAPI extends Feature { private WebClient webClient; private static final String baseUrl = "https://opentdb.com/api.php"; - + public int totalNumberOfQuestions = 10; public TriviaAPI(String channelName) { super(channelName); helpEmbed = new HelpEmbed(COMMAND, "TriviaAPI gives trivia true or false questions of different topics. This starts a trivia quiz related to topic 9 (e.g. !triviaAPI 9)"); @@ -118,7 +118,7 @@ public void handle(ReceivedMessage event) { currentQuestion++; } - if (currentQuestion == 10) { + if (currentQuestion == totalNumberOfQuestions) { event.sendResponse("Congrats! You have finished the quiz! You got a final score of " + score + "/" + currentQuestion); currentQuestion = 0; score = 0; @@ -175,9 +175,6 @@ public TriviaQuestions getQuestionsByTopic(String topic) { // return message; // } - public void setWebClient(WebClient webClient) { - this.webClient = webClient; - } } diff --git a/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java b/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java index 37530ce0..7846229d 100644 --- a/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java +++ b/src/test/java/org/jointheleague/features/student/first_feature/TriviaAPITest.java @@ -169,7 +169,7 @@ void itShouldHaveIncorrectAnswer() { featureOne.quizStarted = true; when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " answer false"); featureOne.handle(receivedMessage); - verify(receivedMessage).sendResponse("Incorrect! The answer was " + featureOne.tq.getResults().get(featureOne.currentQuestion).getCorrectAnswer()); + verify(receivedMessage).sendResponse("Incorrect! The answer was " + featureOne.tq.getResults().get(currentQuestion).getCorrectAnswer()); assertEquals(currentQuestion+1, featureOne.currentQuestion); } @Test @@ -195,21 +195,26 @@ void itShouldHaveCorrectAnswer() { assertEquals(currentQuestion+1, featureOne.currentQuestion); assertEquals(score+1, featureOne.score); } -// @Test -// void itShouldEndQuiz() { -// Question q = new Question(); -// q.question = "1+1 = 2"; -// q.correctAnswer = "true"; -// TriviaQuestions tq = new TriviaQuestions(); -// tq.results = new ArrayList (); -// tq.results.add(q); -// featureOne.tq = tq; -// featureOne.currentQuestion = 9; -// featureOne.quizStarted = true; -// when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " answer true"); -// featureOne.handle(receivedMessage); -// verify(receivedMessage).sendResponse("Congrats! You have finished the quiz! You got a final score of " + featureOne.score + "/" + featureOne.currentQuestion); -// assertEquals(featureOne.score, 0); -// assertEquals(featureOne.currentQuestion, 0); -// } + @Test + void itShouldHave10Questions() { + featureOne.totalNumberOfQuestions = 1; + Question q = new Question(); + q.question = "1+1 = 2"; + q.correctAnswer = "true"; + TriviaQuestions tq = new TriviaQuestions(); + tq.results = new ArrayList (); + tq.results.add(q); + featureOne.tq = tq; + featureOne.currentQuestion = 0; + //Given + featureOne.quizStarted = true; + int score = featureOne.score; + int currentQuestion = featureOne.currentQuestion; + when(receivedMessage.getMessageContent()).thenReturn(featureOne.COMMAND + " answer false"); + featureOne.handle(receivedMessage); + verify(receivedMessage).sendResponse("Incorrect! The answer was " + tq.getResults().get(0).getCorrectAnswer()); + verify(receivedMessage).sendResponse("Congrats! You have finished the quiz! You got a final score of " + score + "/" + (currentQuestion+1)); + assertEquals(featureOne.score, 0); + assertEquals(featureOne.currentQuestion, 0); + } }