package org.royaldev.royalbot.commands.impl;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.pircbotx.hooks.types.GenericMessageEvent;
import org.royaldev.royalbot.BotUtils;
import org.royaldev.royalbot.commands.CallInfo;
import org.royaldev.royalbot.commands.NoticeableCommand;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class GoogleCommand extends NoticeableCommand {
private final ObjectMapper om = new ObjectMapper();
@Override
public void onCommand(GenericMessageEvent event, CallInfo callInfo, String[] args) {
if (args.length < 1) {
notice(event, "Not enough arguments.");
return;
}
final String url;
try {
url = String.format("http://ajax.googleapis.com/ajax/services/search/web?v=1.0&safe=moderate&q=%s", URLEncoder.encode(StringUtils.join(args, ' '), "UTF-8"));
} catch (UnsupportedEncodingException ex) {
notice(event, "Couldn't encode in UTF-8.");
return;
}
JsonNode jn;
try {
jn = om.readTree(BotUtils.getContent(url));
} catch (Exception ex) {
notice(event, "Couldn't parse results.");
return;
}
int responseStatus = jn.path("responseStatus").asInt(-1);
if (responseStatus < 200 || responseStatus >= 300) {
notice(event, "Error retrieving results: " + responseStatus + ".");
return;
}
if (jn.path("responseData").path("results").size() < 1) {
notice(event, "No results.");
return;
}
jn = jn.path("responseData").path("results").path(0);
String title = BotUtils.truncate(jn.path("titleNoFormatting").asText(), 60);
String resultUrl;
try {
resultUrl = BotUtils.shortenURL(jn.path("url").asText());
} catch (IOException e) {
notice(event, "Couldn't shorten URL.");
return;
}
String content = StringEscapeUtils.unescapeHtml4(jn.path("content").asText().replaceAll("<.*?>", "")).replace("\n", " ");
int oldLength = content.length();
content = BotUtils.truncate(content, 150);
if (content.length() != oldLength) content += " ...";
event.respond(String.format("(%s) %s - %s", resultUrl, title, content));
}
@Override
public String getName() {
return "google";
}
@Override
public String getUsage() {
return "<command> [query]";
}
@Override
public String getDescription() {
return "Queries Google for search results";
}
@Override
public String[] getAliases() {
return new String[]{"goog", "g"};
}
@Override
public CommandType getCommandType() {
return CommandType.BOTH;
}
@Override
public AuthLevel getAuthLevel() {
return AuthLevel.PUBLIC;
}
}