Files
chomens-bot-java/src/main/java/me/chayapak1/chomens_bot/commands/WikipediaCommand.java
2025-01-06 17:05:03 +07:00

124 lines
5.3 KiB
Java

package me.chayapak1.chomens_bot.commands;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import me.chayapak1.chomens_bot.Bot;
import me.chayapak1.chomens_bot.command.Command;
import me.chayapak1.chomens_bot.command.CommandContext;
import me.chayapak1.chomens_bot.command.CommandException;
import me.chayapak1.chomens_bot.command.TrustLevel;
import me.chayapak1.chomens_bot.util.ColorUtilities;
import me.chayapak1.chomens_bot.util.HttpUtilities;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextDecoration;
import java.net.URI;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
public class WikipediaCommand extends Command {
public static final String pageIDStringURL = "https://en.wikipedia.org/w/api.php?prop=info%%7Cpageprops&inprop=url&ppprop=disambiguation&titles=%s&format=json&redirects=&action=query&origin=*&";
public static final String outputStringURL = "https://en.wikipedia.org/w/api.php?prop=extracts&explaintext=&exintro=&pageids=%d&format=json&redirects=&action=query&origin=*&";
public WikipediaCommand () {
super(
"wikipedia",
"Wikipedia in Minecraft",
new String[] { "<page>" },
new String[] { "wiki" },
TrustLevel.PUBLIC,
false
);
}
public Component execute (CommandContext context) throws CommandException {
final Bot bot = context.bot;
final String page = context.getString(true, true);
final Gson gson = new Gson();
bot.executorService.submit(() -> {
try {
Component component = Component.empty();
final URL pageIDUrl = new URI(String.format(pageIDStringURL, URLEncoder.encode(page, StandardCharsets.UTF_8))).toURL();
final JsonObject pageIDJsonOutput = gson.fromJson(HttpUtilities.getRequest(pageIDUrl), JsonObject.class);
final JsonObject query = pageIDJsonOutput.getAsJsonObject("query");
final JsonElement redirectsElement = query.get("redirects");
if (redirectsElement != null) {
final JsonArray normalized = redirectsElement.getAsJsonArray();
for (JsonElement element : normalized) {
final JsonObject redirect = element.getAsJsonObject();
final String redirectedTo = redirect.get("to").getAsString();
component = component.append(
Component
.translatable("Redirected to %s")
.arguments(Component.text(redirectedTo))
.style(
Style.style()
.decorate(TextDecoration.ITALIC)
.color(NamedTextColor.GRAY)
)
).append(Component.newline());
}
}
final JsonObject pages = query.getAsJsonObject("pages");
final int pageID = Integer.parseInt(pages.entrySet().iterator().next().getKey());
if (pageID == -1) {
context.sendOutput(Component.text("Cannot find page: " + page).color(NamedTextColor.RED));
return;
}
final URL outputUrl = new URI(String.format(outputStringURL, pageID)).toURL();
final JsonObject outputJsonOutput = gson.fromJson(HttpUtilities.getRequest(outputUrl), JsonObject.class);
final JsonObject pageOutput = outputJsonOutput
.getAsJsonObject("query")
.getAsJsonObject("pages")
.getAsJsonObject(String.valueOf(pageID));
final String title = pageOutput.get("title").getAsString();
final String extract = pageOutput.get("extract").getAsString();
component = component
.append(
Component
.text(title)
.style(
Style.style()
.decorate(TextDecoration.BOLD)
.color(ColorUtilities.getColorByString(bot.config.colorPalette.secondary))
)
)
.append(Component.newline())
.append(Component.text(extract).color(NamedTextColor.GREEN));
context.sendOutput(component);
} catch (NumberFormatException e) {
context.sendOutput(Component.text("Failed parsing page ID").color(NamedTextColor.RED));
e.printStackTrace();
} catch (Exception e) {
context.sendOutput(Component.text(e.toString()).color(NamedTextColor.RED));
}
});
return null;
}
}