package org.royaldev.royalbot.commands.impl;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
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.UnsupportedEncodingException;
import java.net.URLEncoder;
public class UrbanDictionaryCommand 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://api.urbandictionary.com/v0/define?term=%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) {
String stackURL = BotUtils.linkToStackTrace(ex);
notice(event, BotUtils.formatException(ex) + ((stackURL != null) ? " (" + stackURL + ")" : ""));
return;
}
if (jn.path("result_type").asText().equalsIgnoreCase("no_results")) {
notice(event, "No results.");
return;
}
jn = jn.path("list").path(0);
String permalink;
try {
permalink = BotUtils.shortenURL(jn.path("permalink").asText());
} catch (Exception e) {
permalink = "no url";
}
String definition = jn.path("definition").asText().replaceAll("(\r)?\n", " ");
if (definition.length() > 200) definition = definition.substring(0, 200) + " ...";
event.respond(String.format("(%s) %s", permalink, definition));
}
@Override
public String getName() {
return "urbandictionary";
}
@Override
public String getUsage() {
return "<command> [query]";
}
@Override
public String getDescription() {
return "Queries UrbanDictionary for definitions";
}
@Override
public String[] getAliases() {
return new String[]{"ud", "urban", "urbandict"};
}
@Override
public CommandType getCommandType() {
return CommandType.BOTH;
}
@Override
public AuthLevel getAuthLevel() {
return AuthLevel.PUBLIC;
}
}