diff --git a/src/main/java/xyz/etztech/qol/commands/WikiCommand.java b/src/main/java/xyz/etztech/qol/commands/WikiCommand.java index c8d4742..cc00363 100644 --- a/src/main/java/xyz/etztech/qol/commands/WikiCommand.java +++ b/src/main/java/xyz/etztech/qol/commands/WikiCommand.java @@ -1,25 +1,24 @@ package xyz.etztech.qol.commands; import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.bukkit.ChatColor; import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; +import org.bukkit.command.TabExecutor; import org.bukkit.command.CommandSender; import xyz.etztech.qol.QoL; import xyz.etztech.qol.EtzTechUtil; import xyz.etztech.qol.Lang; import java.io.BufferedReader; -import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; -import java.util.Date; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; -public class WikiCommand implements CommandExecutor { +public class WikiCommand implements TabExecutor { QoL plugin; public WikiCommand(QoL paramQoL) { @@ -28,7 +27,7 @@ public class WikiCommand implements CommandExecutor { } @Override - public boolean onCommand(CommandSender commandSender, Command command, String s, String[] args) { + public boolean onCommand(CommandSender commandSender, Command command, String label, String[] args) { if (!commandSender.hasPermission("qol.wiki")) { EtzTechUtil.sms(commandSender, Lang.NO_PERMISSION.getDef()); return true; @@ -38,23 +37,61 @@ public class WikiCommand implements CommandExecutor { return true; } - try { - Date changedToAt; - JsonObject obj; - InputStream response = new URL(String.format("https://minecraft.gamepedia.com/api.php?action=opensearch&format=json&formatversion=2&search=%s&namespace=0&limit=1", args[0])).openStream(); - BufferedReader reader = new BufferedReader(new InputStreamReader(response)); - JsonArray jsonArray = new JsonParser().parse(reader.readLine()).getAsJsonArray(); - StringBuilder message = new StringBuilder(ChatColor.GREEN + jsonArray.get(1).getAsJsonArray().get(0).getAsString()); - message.append(": "); - message.append(ChatColor.WHITE + jsonArray.get(3).getAsJsonArray().get(0).getAsString()); + String query = String.join(" ", args); + List> result = getWikiResults(query, 1); - EtzTechUtil.sms(commandSender, message.toString()); - } catch (IOException e) { - EtzTechUtil.sms(commandSender, ChatColor.RED + "Minecraft wiki API returned nothing."); - } catch (IndexOutOfBoundsException e) { - EtzTechUtil.sms(commandSender, ChatColor.RED + String.format("Nothing was found on the wiki using: %s", args[0])); + if (result.isEmpty()) + { + EtzTechUtil.sms(commandSender, ChatColor.RED + String.format("Nothing was found on the wiki using: %s", query)); + return true; } - + + String message = ChatColor.GREEN + result.get(0).get(0) + ": " + ChatColor.WHITE + result.get(0).get(1); + EtzTechUtil.sms(commandSender, message); + return true; } + + @Override + public List onTabComplete(CommandSender commandSender, Command command, String label, String[] args) { + String query = String.join(" ", args); + + if (query.isEmpty()) return null; + + List> results = getWikiResults(query, 10); + + if (results.isEmpty()) return null; + + List completions = new ArrayList<>(); + results.forEach((result) -> completions.add(result.get(0))); + return completions; + } + + private List> getWikiResults(String query, Integer numOfResults) { + try { + InputStream response = new URL(String.format(plugin.getConfig().getString("wiki-base-url", "https://minecraft.wiki:") + "/api.php?action=opensearch&format=json&formatversion=2&search=%s&namespace=0&limit=%d", query, numOfResults)).openStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(response)); + JsonArray jsonArray = new JsonParser().parse(reader.readLine()).getAsJsonArray(); + + JsonArray names = jsonArray.get(1).getAsJsonArray(); + JsonArray links = jsonArray.get(3).getAsJsonArray(); + + // Check if we got any result + if (names.size() < 1) + return Collections.emptyList(); + + List> results = new ArrayList<>(); + for (int i = 0; i < names.size(); i++) + { + List e = new ArrayList<>(); + e.add(names.get(i).getAsString()); + e.add(links.get(i).getAsString()); + results.add(e); + } + + return results; + } catch(Exception e) { + return Collections.emptyList(); + } + } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 6f949ef..1c8f706 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -124,3 +124,5 @@ head_shop: # Diamond price of a head in the shop, default is 2 diamonds price: 2 +# Base URL for the /wiki command. Should support a https://www.mediawiki.org/wiki/API:Opensearch request +wiki-base-url: 'https://minecraft.wiki'