Make trivia functional

This commit is contained in:
Bea 2022-12-21 14:24:07 +01:00
parent eb93362d16
commit 48fdb32e15
3 changed files with 67 additions and 5 deletions

View File

@ -5,6 +5,7 @@ import net.dv8tion.jda.api.hooks.ListenerAdapter;
import wtf.beatrice.hidekobot.commands.base.CoinFlip;
import wtf.beatrice.hidekobot.commands.base.UrbanDictionary;
import wtf.beatrice.hidekobot.util.CommandUtil;
import wtf.beatrice.hidekobot.util.TriviaUtil;
public class ButtonInteractionListener extends ListenerAdapter
{
@ -25,6 +26,11 @@ public class ButtonInteractionListener extends ListenerAdapter
case "urban_nextpage" -> UrbanDictionary.changePage(event, UrbanDictionary.ChangeType.NEXT);
case "urban_previouspage" -> UrbanDictionary.changePage(event, UrbanDictionary.ChangeType.PREVIOUS);
// trivia
case "trivia_correct" -> TriviaUtil.handleAnswer(event, TriviaUtil.AnswerType.CORRECT);
case "trivia_wrong_1", "trivia_wrong_2", "trivia_wrong_3" ->
TriviaUtil.handleAnswer(event, TriviaUtil.AnswerType.WRONG);
}
}

View File

@ -20,7 +20,6 @@ import java.util.concurrent.ScheduledFuture;
public class TriviaTask implements Runnable
{
private final User author;
private final MessageChannel channel;
@ -55,14 +54,20 @@ public class TriviaTask implements Runnable
// todo: we shouldn't use this method, since it messes with the database...
CommandUtil.disableExpired(previousMessage.getId());
String previousCorrectAnswer = questions.get(iteration-1).correctAnswer();
previousMessage.reply("The correct answer was: **" + previousCorrectAnswer + "**!").queue();
// we need this to be thread-locking to avoid getting out of sync with the rest of the trivia features
previousMessage.reply("The correct answer was: **" + previousCorrectAnswer + "**!").complete();
// todo: maybe also add who replied correctly as a list
// clean the list of people who answered, so they can answer again for the new question
TriviaUtil.channelAndWhoResponded.put(previousMessage.getChannel().getId(), new ArrayList<>());
}
if(iteration >= questions.size())
{
// todo: nicer-looking embed with stats
channel.sendMessage("Trivia session is over!").queue();
// we need this to be thread-locking to avoid getting out of sync with the rest of the trivia features
channel.sendMessage("Trivia session is over!").complete();
TriviaUtil.channelsRunningTrivia.remove(channel.getId());
future.cancel(false);

View File

@ -1,10 +1,12 @@
package wtf.beatrice.hidekobot.util;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import org.apache.commons.text.StringEscapeUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONString;
import org.jsoup.Jsoup;
import wtf.beatrice.hidekobot.Cache;
import wtf.beatrice.hidekobot.objects.TriviaQuestion;
import java.io.BufferedReader;
@ -13,7 +15,9 @@ import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class TriviaUtil
{
@ -21,6 +25,9 @@ public class TriviaUtil
public static List<String> channelsRunningTrivia = new ArrayList<>();
// first string is the channelId, the list contain all users who responded there
public static HashMap<String, List<String>> channelAndWhoResponded = new HashMap<>();
public static JSONObject fetchTrivia()
{
try {
@ -71,4 +78,48 @@ public class TriviaUtil
return questions;
}
public static void handleAnswer(ButtonInteractionEvent event, AnswerType answerType)
{
if(trackResponse(event.getUser(), event.getChannel()))
{
if(answerType.equals(AnswerType.CORRECT))
{
event.reply(event.getUser().getAsMention() + " got it right!").queue();
} else {
event.reply(event.getUser().getAsMention() + ", that's not the right answer!").queue();
}
} else {
event.reply(event.getUser().getAsMention() + ", you can't answer twice!")
.queue(message ->
Cache.getTaskScheduler().schedule(() ->
message.deleteOriginal().queue(), 5, TimeUnit.SECONDS));
}
}
private static boolean trackResponse(User user, MessageChannel channel)
{
String userId = user.getId();
String channelId = channel.getId();
List<String> responders = channelAndWhoResponded.get(channelId);
if(responders == null)
{
responders = new ArrayList<>();
}
if(responders.isEmpty() || !responders.contains(userId))
{
responders.add(userId);
channelAndWhoResponded.put(channelId, responders);
return true; // response was successfully tracked
} else {
return false; // response wasn't tracked because there already was an entry
}
}
public enum AnswerType {
CORRECT, WRONG
}
}