diff --git a/src/me/despawningbone/discordbot/command/anime/AnimePic.java b/src/me/despawningbone/discordbot/command/anime/AnimePic.java index bfbb2f7..b9b3aa8 100644 --- a/src/me/despawningbone/discordbot/command/anime/AnimePic.java +++ b/src/me/despawningbone/discordbot/command/anime/AnimePic.java @@ -1,93 +1,108 @@ package me.despawningbone.discordbot.command.anime; import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; import java.util.concurrent.ThreadLocalRandom; import org.apache.commons.lang3.exception.ExceptionUtils; import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import me.despawningbone.discordbot.command.Command; import me.despawningbone.discordbot.command.CommandResult; import me.despawningbone.discordbot.command.CommandResult.CommandResultType; import me.despawningbone.discordbot.utils.MiscUtils; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.TextChannel; import net.dv8tion.jda.api.entities.User; public class AnimePic extends Command { public AnimePic() { this.desc = "Get anime pics!"; this.usage = "[search words] [-f] [| index]"; this.remarks = Arrays.asList("Leave the search words blank for a random pic!", "If you have not specified the index, it will be a random result from the search.", "Include `-f` if you want to load the full picture!", "However, full pictures takes a while to load in."); this.alias = Arrays.asList("apic"); this.examples = Arrays.asList("ryuZU -f", "neptune | 2"); } + //TODO migrate to another more popular image board? + @Override public CommandResult execute(TextChannel channel, User author, Message msg, String[] args) { Connection con = null; channel.sendTyping().queue(); - if(args.length < 1) { - con = Jsoup.connect("https://www.zerochan.net/?p=" + (ThreadLocalRandom.current().nextInt(1000) + 1)); - } + + //full res option boolean full = false; ArrayList amend = new ArrayList<>(Arrays.asList(args)); if(amend.contains("-f")) { amend.remove("-f"); full = true; } + + //random, use most popular last 3 months as order - should return better results + if(amend.size() < 1) { + con = Jsoup.connect("https://www.zerochan.net/?s=fav&t=2p=" + (ThreadLocalRandom.current().nextInt(1000) + 1)); + } + String stripped = String.join(" ", amend); String search; int index; if(stripped.contains("|")) { String[] split = stripped.split(" \\|"); search = split[0]; try { index = Integer.parseInt(split[1].trim()) - 1; } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) { return new CommandResult(CommandResultType.INVALIDARGS, "Invalid index inputted"); } } else { search = stripped; index = -1; } + try { if(con == null) con = Jsoup.connect("https://www.zerochan.net/search?q=" + URLEncoder.encode(search, "UTF-8")).ignoreHttpErrors(true).followRedirects(true); Document document = con.get(); Element href = document.body(); Elements resList = null; try { resList = href.select("ul[id=\"thumbs2\"]").get(0).select("li"); if (resList.size() == 0) throw new IndexOutOfBoundsException(); if (resList.size() < index) throw new IndexOutOfBoundsException(); } catch (IndexOutOfBoundsException e) { if(!href.select("ul[id=\"children\"]").isEmpty()) return new CommandResult(CommandResultType.FAILURE, "You need to specify your search words more!"); else return new CommandResult(CommandResultType.NORESULT); } + Element a = resList.get(index == -1 ? ThreadLocalRandom.current().nextInt(resList.size()) : index).select("a").first(); if(a.hasAttr("rel")) { return new CommandResult(CommandResultType.FAILURE, "This picture is not public!"); } + + EmbedBuilder eb = new EmbedBuilder(); - //System.out.println(a.parent().html()); eb.setTitle((index == -1 ? "Random" : MiscUtils.ordinal(index + 1)) + (search.isEmpty() ? " anime pic" : " pic for " + search), a.absUrl("href")); - String img = full ? (a.siblingElements().first().children().size() < 2 ? a.select("img").first().absUrl("src").replace(".240.", ".full.") : a.siblingElements().first().children().last().absUrl("href")) : a.select("img").first().absUrl("src").replace(".240.", ".600."); - //System.out.println(img); + + //fetch img - seems like discord shrinks the full image anyways nowadays, is -f really useful anymore lol + String imgName = a.nextElementSibling().child(0).attr("href").replace("+", "."); //spaces are represented as dots in the cdn for some reason + String imgPrefix = a.attr("href").substring(1); //remove prefix / + String img = full ? + "https://static.zerochan.net" + imgName + ".full." + imgPrefix + ".jpg": + "https://s1.zerochan.net" + imgName + ".600." + imgPrefix + ".jpg"; eb.setImage(img); + eb.setFooter(full ? "The image might need a while to load in." : "Include -f if you want the full resolution!", null); - //eb.setImage("https://static.zerochan.net/Clannad%3A.After.Story.full.2275059.jpg"); channel.sendMessage(eb.build()).queue(); return new CommandResult(CommandResultType.SUCCESS); } catch (IOException e) { return new CommandResult(CommandResultType.ERROR, ExceptionUtils.getStackTrace(e)); } } }