import java.io.File; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Map; import java.util.Map.Entry; import org.pircbotx.Channel; import org.pircbotx.PircBotX; import org.pircbotx.User; import pl.shockah.HTTPQuery; import pl.shockah.shocky.Cache; import pl.shockah.shocky.Data; import pl.shockah.shocky.ScriptModule; import pl.shockah.shocky.cmds.Command; import pl.shockah.shocky.cmds.Parameters; import pl.shockah.shocky.sql.Factoid; public class ModulePython extends ScriptModule { protected Command cmd; public String name() {return "python";} public String identifier() {return "py";} public void onEnable(File dir) { Data.config.setNotExists("python-url","http://eval.appspot.com/eval"); Command.addCommands(this, cmd = new CmdPython()); Data.protectedKeys.add("python-url"); } public void onDisable() { Command.removeCommands(cmd); } public String parse(Cache cache, PircBotX bot, Channel channel, User sender, Factoid factoid, String code, String message) { if (code == null) return ""; StringBuilder sb = new StringBuilder(); buildInit(sb,getParams(bot, channel, sender, message, factoid).entrySet()); sb.append(code); HTTPQuery q; try { q = HTTPQuery.create(Data.forChannel(channel).getString("python-url")+'?'+HTTPQuery.parseArgs("statement",sb.toString())); } catch (MalformedURLException e) { return "python-url is invalid"; } q.connect(true,false); sb = new StringBuilder(); ArrayList<String> result = q.readLines(); q.close(); if (result.size()>0 && result.get(0).contentEquals("Traceback (most recent call last):")) return result.get(result.size()-1); for (String line : result) { if (sb.length() != 0) sb.append('\n'); sb.append(line); } return sb.toString(); } private void buildInit(StringBuilder sb, Iterable<Map.Entry<String,Object>> set) { for (Map.Entry<String,Object> pair : set) { sb.append(pair.getKey()).append('='); appendObject(sb, pair.getValue()); sb.append(';'); } } private void appendObject(StringBuilder sb, Object obj) { if (obj == null) { sb.append("None"); } else if (obj.getClass().isArray()) { Object[] a = (Object[])obj; sb.append("["); for (int i = 0; i < a.length; ++i) { if (i > 0) sb.append(','); appendObject(sb, a[i]); } sb.append(']'); } else if (obj instanceof Map) { Map<?,?> a = (Map<?,?>)obj; sb.append("{"); int i = 0; for (Entry<?, ?> entry : a.entrySet()) { if (i++ > 0) sb.append(','); appendObject(sb, entry.getKey()); sb.append(':'); appendObject(sb, entry.getValue()); } sb.append('}'); } else if (obj instanceof String) { String s = (String)obj; boolean unicode = false; for (int i = s.length()-1; i >= 0; --i) { if (s.charAt(i) >= 128) { unicode = true; break; } } if (unicode) sb.append('u'); appendEscape(sb,s); } else if (obj instanceof Number) { sb.append(obj.toString()); } } public class CmdPython extends ScriptCommand { public String command() {return "python";} public String help(Parameters params) { return "python\npython {code} - runs Python code"; } } }