package org.royaldev.royalbot.commands.impl; import org.apache.commons.lang3.StringUtils; import org.pircbotx.hooks.types.GenericMessageEvent; import org.royaldev.royalbot.BotUtils; import org.royaldev.royalbot.RoyalBot; import org.royaldev.royalbot.commands.CallInfo; import org.royaldev.royalbot.commands.NoticeableCommand; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilderFactory; import java.io.StringReader; import java.net.URLEncoder; public class WolframAlphaCommand extends NoticeableCommand { private final RoyalBot rb = RoyalBot.getInstance(); @Override public void onCommand(GenericMessageEvent event, CallInfo callInfo, String[] args) { if (!rb.getConfig().isWolframAlphaEnabled()) { notice(event, "WolframAlpha is disabled on this bot."); return; } if (args.length < 1) { notice(event, "Not enough arguments."); return; } final String query = StringUtils.join(args, ' '); final String content; try { content = BotUtils.getContent(String.format("http://api.wolframalpha.com/v2/query?appid=%s&input=%s", rb.getConfig().getWolframAlphaAPIKey(), URLEncoder.encode(query, "UTF-8"))); } catch (Exception e) { notice(event, "An error occurred while contacting WolframAlpha."); return; } final Document d; try { d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(content))); } catch (Exception ex) { notice(event, BotUtils.formatException(ex)); return; } Element root = d.getDocumentElement(); root.normalize(); if (!root.hasAttribute("success") || !root.getAttribute("success").equalsIgnoreCase("true")) { StringBuilder sb = new StringBuilder("WolframAlpha returned with an error!"); if (!root.getAttribute("error").equalsIgnoreCase("false")) sb.append(" ").append(root.getAttribute("error")); notice(event, sb.toString()); return; } final String toSend; try { Element e = (Element) root.getElementsByTagName("pod").item(1); e = (Element) e.getElementsByTagName("subpod").item(0); e = (Element) e.getElementsByTagName("plaintext").item(0); toSend = e.getTextContent(); } catch (Exception e) { notice(event, BotUtils.formatException(e)); return; } event.respond(toSend.replaceAll("(\r)?\n", " / ")); } @Override public String getName() { return "wolframalpha"; } @Override public String getUsage() { return "<command> [query]"; } @Override public String getDescription() { return "Sends the provided query to WolframAlpha"; } @Override public String[] getAliases() { return new String[]{"wa"}; } @Override public CommandType getCommandType() { return CommandType.BOTH; } @Override public AuthLevel getAuthLevel() { return AuthLevel.PUBLIC; } }