package pl.shockah.shocky;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Random;
import java.util.StringTokenizer;
import org.pircbotx.Channel;
import org.pircbotx.PircBotX;
import org.pircbotx.User;
import pl.shockah.StringTools;
import pl.shockah.shocky.cmds.AuthorizationException;
import pl.shockah.shocky.cmds.Command;
import pl.shockah.shocky.cmds.CommandCallback;
import pl.shockah.shocky.cmds.Parameters;
import pl.shockah.shocky.sql.Factoid;
public abstract class ScriptModule extends Module {
public abstract String identifier();
public abstract String parse(Cache cache, PircBotX bot, Channel channel, User sender, Factoid factoid, String code, String message);
public char stringCharacter() {return '"';}
public void appendEscape(StringBuilder sb, String str) {
char quote = stringCharacter();
sb.append(quote);
char c = 0;
int x = 0;
int y = 0;
while (true) {
int a = str.indexOf(quote, x);
int b = str.indexOf('\\', x);
if (a == -1 && b == -1)
break;
if (b != -1 && (a == -1 || b < a)) {
c = '\\';
y = b;
}
else if (a != -1 && (b == -1 || a < b)) {
c = quote;
y = a;
}
sb.append(str.substring(x, y)).append('\\').append(c);
x = y+1;
}
sb.append(str.substring(x)).append(quote);
}
public Map<String,Object> getParams(PircBotX bot, Channel channel, User sender, String message, Factoid factoid) {
User[] users;
Map<String,Object> map = new LinkedHashMap<String,Object>();
if (channel == null)
users = new User[]{bot.getUserBot(),sender};
else {
users = channel.getUsers().toArray(new User[0]);
map.put("channel", channel.getName());
}
map.put("bot", bot.getNick());
map.put("sender", sender.getNick());
map.put("host", sender.getHostmask());
map.put("login", Whois.getWhoisLogin(sender));
map.put("randnick", users[new Random().nextInt(users.length)].getNick());
map.put("time", System.currentTimeMillis());
if (message == null)
message = "";
StringTokenizer strtok = new StringTokenizer(message," ");
String[] args = new String[strtok.countTokens()];
int i = 0;
while (strtok.hasMoreTokens())
args[i++] = strtok.nextToken();
map.put("argc", args.length);
map.put("args", message);
map.put("arg", args);
map.put("ioru", (args.length == 0) ? sender.getNick() : message);
if (factoid != null && factoid.registry != null)
map.put("map", factoid.registry.getMap());
return map;
}
public abstract class ScriptCommand extends Command {
public void doCommand(Parameters params, CommandCallback callback) {
if (params.tokenCount < 1) {
callback.type = EType.Notice;
callback.append(help(params));
return;
}
String output;
try {
output = parse(new Cache(), params.bot, params.channel, params.sender, null, params.input, null);
} catch (Throwable e) {
while (e.getCause() != null)
e = e.getCause();
if (e instanceof AuthorizationException && params.sender != null)
callback.type = EType.Notice;
output = e.getMessage();
}
if (output != null && !output.isEmpty())
callback.append(StringTools.limitLength(StringTools.formatLines(output)));
}
}
}