import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import org.json.JSONException;
import org.json.JSONObject;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.Varargs;
import org.luaj.vm2.lib.VarArgFunction;
import org.pircbotx.Colors;
import pl.shockah.HTTPQuery;
import pl.shockah.StringTools;
import pl.shockah.shocky.Module;
import pl.shockah.shocky.Utils;
import pl.shockah.shocky.cmds.Command;
import pl.shockah.shocky.cmds.CommandCallback;
import pl.shockah.shocky.cmds.Parameters;
import pl.shockah.shocky.interfaces.ILua;
public class ModuleUrban extends Module implements ILua {
protected Command cmd;
@Override
public String name() {return "urban";}
@Override
public void onEnable(File dir) {
Command.addCommands(this, cmd = new CmdUrban());
}
@Override
public void onDisable() {
Command.removeCommands(cmd);
}
public JSONObject getJSON(String input) throws IOException, JSONException {
HTTPQuery q = HTTPQuery.create("http://api.urbandictionary.com/v0/define?term=" + URLEncoder.encode(input, "UTF8"));
q.connect(true, false);
String line = q.readWhole();
q.close();
JSONObject json = new JSONObject(line);
String resulttype = json.getString("result_type");
if (resulttype.contentEquals("no_results"))
return null;
return json.getJSONArray("list").getJSONObject(0);
}
public class CmdUrban extends Command {
public String command() {return "urban";}
public String help(Parameters params) {
StringBuilder sb = new StringBuilder();
sb.append("urban");
sb.append("\nurban {query} - returns the first Urban dictionary search result");
return sb.toString();
}
public void doCommand(Parameters params, CommandCallback callback) {
if (params.tokenCount == 0) {
callback.type = EType.Notice;
callback.append(help(params));
return;
}
try {
JSONObject entry = getJSON(params.input);
if (entry == null) {
callback.append("No results.");
return;
}
String word = entry.getString("word");
String definition = entry.getString("definition");
String example = entry.getString("example");
String permalink = entry.getString("permalink");
StringBuilder result = new StringBuilder();
result.append(Utils.shortenUrl(permalink));
result.append(" ");
result.append(Colors.BOLD);
result.append(word);
result.append(Colors.BOLD);
result.append(": ");
result.append(definition);
if (example != null && example.length()>0) {
result.append(" Example: ");
result.append(example);
}
String output = StringTools.ircFormatted(result, true);
callback.append(output);
} catch (Exception e) {e.printStackTrace();}
}
}
public class Function extends VarArgFunction {
@Override
public Varargs invoke(Varargs arg) {
try {
JSONObject entry = getJSON(arg.arg1().checkjstring());
if (entry != null) {
LuaValue[] a = new LuaValue[] {
valueOf(entry.getString("definition")),
valueOf(entry.getString("example")),
valueOf(entry.getString("permalink"))
};
return varargsOf(a);
}
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return NONE;
}
}
@Override
public void setupLua(LuaTable env) {
env.rawset("urban", new Function());
}
}