|
@@ -29,9 +29,11 @@ import java.io.IOException;
|
|
|
import java.security.GeneralSecurityException;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.TreeMap;
|
|
|
+import java.util.Set;
|
|
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
@@ -102,9 +104,11 @@ public class BigScreenBot extends Bot
|
|
|
}
|
|
|
|
|
|
private boolean verbose;
|
|
|
- private Settings settings = new Settings();
|
|
|
private Remote remote;
|
|
|
+ private Settings settings = new Settings();
|
|
|
+ private Set<String> channels;
|
|
|
private List<Pattern> admins = new ArrayList<Pattern>();
|
|
|
+ private Map<String, Pattern> bans = new TreeMap<String, Pattern>();
|
|
|
private Map<String, Command> commands = new TreeMap<String, Command>();
|
|
|
private Action action = Action.RECONNECT;
|
|
|
|
|
@@ -140,9 +144,40 @@ public class BigScreenBot extends Bot
|
|
|
setName(settings.getProperty("nick", "bigscreenbot"));
|
|
|
setVerbose(verbose);
|
|
|
|
|
|
+ channels = new HashSet<String>(settings.getListProperty("channels", new ArrayList<String>()));
|
|
|
+
|
|
|
for (String admin : settings.getListProperty("admins"))
|
|
|
admins.add(compileNickMask(admin));
|
|
|
|
|
|
+ for (String ban : settings.getListProperty("bans", new ArrayList<String>()))
|
|
|
+ bans.put(ban, compileNickMask(ban));
|
|
|
+
|
|
|
+ commands.put("ban", new Command(true, PRIVATE, "[mask...]", "block nick masks from using commands")
|
|
|
+ {
|
|
|
+ @Override
|
|
|
+ public void execute(String channel, String sender, boolean admin, String argument)
|
|
|
+ {
|
|
|
+ String[] arguments = argument.split("\\s");
|
|
|
+
|
|
|
+ if (arguments.length == 1 && arguments[0].isEmpty())
|
|
|
+ {
|
|
|
+ listBans(channel, sender);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ synchronized (bans)
|
|
|
+ {
|
|
|
+ for (String ban : arguments)
|
|
|
+ if (bans.put(ban, compileNickMask(ban)) == null)
|
|
|
+ sendMessage(channel, sender, String.format("banned nick mask (\"%1$s\")", ban));
|
|
|
+ else
|
|
|
+ sendMessage(channel, sender, String.format("nick mask (\"%1$s\") already banned", ban));
|
|
|
+
|
|
|
+ storeBans(channel, sender);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
commands.put("googletv", new Command(false, BOTH, "url [device]", "fling url to a Google TV device")
|
|
|
{
|
|
|
@Override
|
|
@@ -162,7 +197,7 @@ public class BigScreenBot extends Bot
|
|
|
|
|
|
Command command = commands.get(argument);
|
|
|
|
|
|
- sendMessage(channel, sender, Colors.BOLD + "command arguments access description" + Colors.NORMAL);
|
|
|
+ sendMessage(channel, sender, Colors.BOLD + String.format("%1$-11s %2$-23s %3$-15s %4$s", "command", "arguments", "access", "description") + Colors.NORMAL);
|
|
|
|
|
|
if (command != null)
|
|
|
help(channel, sender, admin, argument, command);
|
|
@@ -189,6 +224,32 @@ public class BigScreenBot extends Bot
|
|
|
sendMessage(channel, sender, (unavailable ? Colors.UNDERLINE : "") + String.format("%1$-11s %2$-23s %3$-15s %4$s", name, command.getArguments(), access, command.getDescription()) + (unavailable ? Colors.NORMAL : ""));
|
|
|
}
|
|
|
});
|
|
|
+ commands.put("join", new Command(true, PRIVATE, "channel", "join a channel")
|
|
|
+ {
|
|
|
+ @Override
|
|
|
+ public void execute(String channel, String sender, boolean admin, String arguments)
|
|
|
+ {
|
|
|
+ String argument = arguments.split("\\s", 2)[0];
|
|
|
+
|
|
|
+ if (argument.isEmpty())
|
|
|
+ {
|
|
|
+ help(channel, sender, admin, "join");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ joinChannel(argument);
|
|
|
+
|
|
|
+ synchronized (channels)
|
|
|
+ {
|
|
|
+ channels.add(argument);
|
|
|
+
|
|
|
+ storeChannels(channel, sender);
|
|
|
+ }
|
|
|
+
|
|
|
+ sendMessage(channel, sender, String.format("joined channel (\"%1$s\")", argument));
|
|
|
+ }
|
|
|
+ });
|
|
|
commands.put("pair", new Command(true, PRIVATE, "[device [code]]", "pair with a Google TV device")
|
|
|
{
|
|
|
@Override
|
|
@@ -247,6 +308,35 @@ public class BigScreenBot extends Bot
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
+ commands.put("part", new Command(true, PRIVATE, "channel [message]", "part from a channel")
|
|
|
+ {
|
|
|
+ @Override
|
|
|
+ public void execute(String channel, String sender, boolean admin, String argument)
|
|
|
+ {
|
|
|
+ String[] arguments = argument.split("\\s", 2);
|
|
|
+
|
|
|
+ if (arguments.length == 1 && arguments[0].isEmpty())
|
|
|
+ {
|
|
|
+ help(channel, sender, admin, "part");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (arguments.length == 2)
|
|
|
+ partChannel(arguments[0], arguments[1]);
|
|
|
+ else
|
|
|
+ partChannel(arguments[0]);
|
|
|
+
|
|
|
+ synchronized (channels)
|
|
|
+ {
|
|
|
+ channels.remove(arguments[0]);
|
|
|
+
|
|
|
+ storeChannels(channel, sender);
|
|
|
+ }
|
|
|
+
|
|
|
+ sendMessage(channel, sender, String.format("parted channel (\"%1$s\")", arguments[0]));
|
|
|
+ }
|
|
|
+ });
|
|
|
commands.put("quit", new Command(true, PRIVATE, "[message]", "quit and do not come back")
|
|
|
{
|
|
|
@Override
|
|
@@ -298,6 +388,32 @@ public class BigScreenBot extends Bot
|
|
|
sendMessage(channel, sender, String.format("successfully sent message (\"%1$s\") to nick/channel (\"%2$s\")", arguments[1], arguments[0]));
|
|
|
}
|
|
|
});
|
|
|
+ commands.put("unban", new Command(true, PRIVATE, "[mask...]", "allow blocked nick masks to use commands again")
|
|
|
+ {
|
|
|
+ @Override
|
|
|
+ public void execute(String channel, String sender, boolean admin, String argument)
|
|
|
+ {
|
|
|
+ String[] arguments = argument.split("\\s");
|
|
|
+
|
|
|
+ if (arguments.length == 1 && arguments[0].isEmpty())
|
|
|
+ {
|
|
|
+ listBans(channel, sender);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ synchronized (bans)
|
|
|
+ {
|
|
|
+ for (String ban : arguments)
|
|
|
+ if (bans.remove(ban) != null)
|
|
|
+ sendMessage(channel, sender, String.format("unbanned nick mask (\"%1$s\")", ban));
|
|
|
+ else
|
|
|
+ sendMessage(channel, sender, String.format("nick mask (\"%1$s\") already unbanned", ban));
|
|
|
+
|
|
|
+ storeBans(channel, sender);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
|
|
|
try
|
|
|
{
|
|
@@ -321,7 +437,11 @@ public class BigScreenBot extends Bot
|
|
|
@Override
|
|
|
protected void onConnect()
|
|
|
{
|
|
|
- joinChannel("#bigscreenbot");
|
|
|
+ synchronized (channels)
|
|
|
+ {
|
|
|
+ for (String channel : channels)
|
|
|
+ joinChannel(channel);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -363,16 +483,12 @@ public class BigScreenBot extends Bot
|
|
|
@Override
|
|
|
protected void onMessage(String channel, String sender, String login, String hostname, String message)
|
|
|
{
|
|
|
- message = Colors.removeFormattingAndColors(message);
|
|
|
-
|
|
|
doCommandFromMessage(channel, sender, login, hostname, message);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
protected void onPrivateMessage(String sender, String login, String hostname, String message)
|
|
|
{
|
|
|
- message = Colors.removeFormattingAndColors(message);
|
|
|
-
|
|
|
doCommandFromMessage(null, sender, login, hostname, message);
|
|
|
}
|
|
|
|
|
@@ -380,9 +496,11 @@ public class BigScreenBot extends Bot
|
|
|
{
|
|
|
boolean admin = matchNickMasks(sender, login, hostname, admins);
|
|
|
|
|
|
- if (!admin && !isNickInChannels(sender))
|
|
|
+ if (!admin && (matchNickMasks(sender, login, hostname, bans.values()) || !isNickInChannels(sender)))
|
|
|
return;
|
|
|
|
|
|
+ message = Colors.removeFormattingAndColors(message);
|
|
|
+
|
|
|
String[] arguments = message.split("\\s", 2);
|
|
|
String argument = arguments[0].toLowerCase();
|
|
|
|
|
@@ -455,6 +573,64 @@ public class BigScreenBot extends Bot
|
|
|
commands.get("help").execute(channel, sender, admin, command);
|
|
|
}
|
|
|
|
|
|
+ private void listBans(String channel, String sender)
|
|
|
+ {
|
|
|
+ synchronized (bans)
|
|
|
+ {
|
|
|
+ if (bans.isEmpty())
|
|
|
+ {
|
|
|
+ sendMessage(channel, sender, "there are no bans");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ sendMessage(channel, sender, Colors.BOLD + "ban" + Colors.NORMAL);
|
|
|
+
|
|
|
+ for (String ban : bans.keySet())
|
|
|
+ sendMessage(channel, sender, ban);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void storeBans(String channel, String sender)
|
|
|
+ {
|
|
|
+ synchronized (bans)
|
|
|
+ {
|
|
|
+ synchronized (settings)
|
|
|
+ {
|
|
|
+ settings.setListProperty("bans", bans.keySet());
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ settings.store();
|
|
|
+ }
|
|
|
+ catch (IOException exception)
|
|
|
+ {
|
|
|
+ error(channel, sender, exception);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void storeChannels(String channel, String sender)
|
|
|
+ {
|
|
|
+ synchronized (channels)
|
|
|
+ {
|
|
|
+ synchronized (settings)
|
|
|
+ {
|
|
|
+ settings.setListProperty("channels", channels);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ settings.store();
|
|
|
+ }
|
|
|
+ catch (IOException exception)
|
|
|
+ {
|
|
|
+ error(channel, sender, exception);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public static void main(String[] args)
|
|
|
{
|
|
|
Options options = new Options();
|