Make trivia have a functional scoreboard
This commit is contained in:
@@ -9,13 +9,12 @@ import net.dv8tion.jda.api.interactions.components.buttons.Button;
|
||||
import org.json.JSONObject;
|
||||
import wtf.beatrice.hidekobot.Cache;
|
||||
import wtf.beatrice.hidekobot.objects.TriviaQuestion;
|
||||
import wtf.beatrice.hidekobot.objects.TriviaScore;
|
||||
import wtf.beatrice.hidekobot.objects.comparators.TriviaScoreComparator;
|
||||
import wtf.beatrice.hidekobot.util.CommandUtil;
|
||||
import wtf.beatrice.hidekobot.util.TriviaUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
|
||||
public class TriviaTask implements Runnable
|
||||
@@ -47,12 +46,13 @@ public class TriviaTask implements Runnable
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
public void run()
|
||||
{
|
||||
if(previousMessage != null)
|
||||
{
|
||||
// todo: we shouldn't use this method, since it messes with the database...
|
||||
CommandUtil.disableExpired(previousMessage.getId());
|
||||
|
||||
String previousCorrectAnswer = questions.get(iteration-1).correctAnswer();
|
||||
|
||||
// we need this to be thread-locking to avoid getting out of sync with the rest of the trivia features
|
||||
@@ -65,11 +65,73 @@ public class TriviaTask implements Runnable
|
||||
|
||||
if(iteration >= questions.size())
|
||||
{
|
||||
// todo: nicer-looking embed with stats
|
||||
// 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();
|
||||
|
||||
String scoreboardText = "\uD83D\uDC23 Trivia session is over!";
|
||||
|
||||
List<String> winners = new ArrayList<>();
|
||||
int topScore = 0;
|
||||
StringBuilder othersBuilder = new StringBuilder();
|
||||
|
||||
LinkedList<TriviaScore> triviaScores = new LinkedList<>(TriviaUtil.channelAndScores.get(channel.getId()));
|
||||
triviaScores.sort(new TriviaScoreComparator());
|
||||
|
||||
int pos = 0;
|
||||
Integer previousScore = null;
|
||||
for(TriviaScore triviaScore : triviaScores)
|
||||
{
|
||||
if(pos > 10) break; // cap at top 10
|
||||
|
||||
String user = triviaScore.getUser().getAsMention();
|
||||
int score = triviaScore.getScore();
|
||||
if(previousScore == null)
|
||||
{
|
||||
previousScore = score;
|
||||
topScore = score;
|
||||
pos = 1;
|
||||
} else {
|
||||
if(score != previousScore) pos++;
|
||||
}
|
||||
|
||||
if(pos == 1) winners.add(user);
|
||||
else {
|
||||
othersBuilder.append("\n").append(pos)
|
||||
.append(" | ").append(user)
|
||||
.append(": ").append(score).append(" points");
|
||||
}
|
||||
}
|
||||
|
||||
StringBuilder winnersBuilder = new StringBuilder();
|
||||
for(int i = 0; i < winners.size(); i++)
|
||||
{
|
||||
String winner = winners.get(i);
|
||||
winnersBuilder.append(winner);
|
||||
if(i + 1 != winners.size())
|
||||
{
|
||||
winnersBuilder.append(", "); // separate with comma except on last run
|
||||
} else {
|
||||
winnersBuilder.append(": ").append(topScore).append(" points \uD83C\uDF89");
|
||||
}
|
||||
}
|
||||
|
||||
String winnersTitle = "\uD83D\uDCAB ";
|
||||
winnersTitle += winners.size() == 1 ? "Winner" : "Winners";
|
||||
|
||||
|
||||
EmbedBuilder scoreboardBuilder = new EmbedBuilder();
|
||||
scoreboardBuilder.setColor(Cache.getBotColor());
|
||||
scoreboardBuilder.setTitle("\uD83C\uDF1F Trivia Scoreboard");
|
||||
scoreboardBuilder.addField(winnersTitle, winnersBuilder.toString(), false);
|
||||
scoreboardBuilder.addField("☁️ Others", othersBuilder.toString(), false);
|
||||
|
||||
channel.sendMessage(scoreboardText).addEmbeds(scoreboardBuilder.build()).queue();
|
||||
|
||||
|
||||
|
||||
// remove all cached data
|
||||
TriviaUtil.channelsRunningTrivia.remove(channel.getId());
|
||||
TriviaUtil.channelAndWhoResponded.remove(channel.getId());
|
||||
TriviaUtil.channelAndScores.remove(channel.getId());
|
||||
|
||||
future.cancel(false);
|
||||
// we didn't implement null checks on the future on purpose, because we need to know if we were unable
|
||||
// to cancel it (and console errors should make it clear enough).
|
||||
@@ -110,9 +172,9 @@ public class TriviaTask implements Runnable
|
||||
EmbedBuilder embedBuilder = new EmbedBuilder();
|
||||
|
||||
embedBuilder.setColor(Cache.getBotColor());
|
||||
embedBuilder.setTitle("Trivia (" + (iteration+1) + "/" + questions.size() + ")");
|
||||
embedBuilder.setTitle("\uD83C\uDFB2 Trivia (" + (iteration+1) + "/" + questions.size() + ")");
|
||||
|
||||
embedBuilder.addField("Question", currentTriviaQuestion.question(), false);
|
||||
embedBuilder.addField("❓ Question", currentTriviaQuestion.question(), false);
|
||||
|
||||
previousMessage = channel
|
||||
.sendMessageEmbeds(embedBuilder.build())
|
||||
|
Reference in New Issue
Block a user