Browse Source

Join/part and ban/unban.

Douglas William Thrift 13 years ago
parent
commit
4c8cb41bdf

+ 3 - 3
bigscreenbot

@@ -25,11 +25,11 @@
 cd `dirname $0`
 
 code=2
-cp=(bin lib/*jar)
-cp=`IFS=':'; echo "${cp[*]}"`
 
 while [[ $code -eq 2 ]]; do
-	java -cp $cp net.douglasthrift.bigscreenbot.BigScreenBot "$@"
+	cp=(bin lib/*jar)
+
+	java -cp `IFS=':'; echo "${cp[*]}"` net.douglasthrift.bigscreenbot.BigScreenBot "$@"
 
 	code=$?
 done

BIN
lib/commons-lang3-3.0-beta.jar


+ 184 - 8
src/net/douglasthrift/bigscreenbot/BigScreenBot.java

@@ -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();

+ 2 - 2
src/net/douglasthrift/bigscreenbot/Bot.java

@@ -27,7 +27,7 @@ package net.douglasthrift.bigscreenbot;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 
-import java.util.List;
+import java.util.Collection;
 
 import java.util.regex.Pattern;
 
@@ -53,7 +53,7 @@ public abstract class Bot extends PircBot
         return Pattern.compile(GlobCompiler.globToPerl5(mask.toCharArray(), GlobCompiler.DEFAULT_MASK), Pattern.CASE_INSENSITIVE);
     }
 
-    protected static boolean matchNickMasks(String sender, String login, String hostname, List<Pattern> masks)
+    protected static boolean matchNickMasks(String sender, String login, String hostname, Collection<Pattern> masks)
     {
         String nick = sender + "!" + login + "@" + hostname;
 

+ 1 - 1
src/net/douglasthrift/bigscreenbot/Remote.java

@@ -97,7 +97,7 @@ public class Remote
     {
         KeyManagerFactory factory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
 
-        factory.init(store, "".toCharArray());
+        //factory.init(store, "".toCharArray());
 
         return factory.getKeyManagers();
     }

+ 42 - 1
src/net/douglasthrift/bigscreenbot/Settings.java

@@ -26,12 +26,16 @@ package net.douglasthrift.bigscreenbot;
 
 import java.io.FileNotFoundException;
 import java.io.FileReader;
+import java.io.FileWriter;
 import java.io.IOException;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.Properties;
 
+import org.apache.commons.lang3.StringUtils;
+
 public class Settings extends Properties
 {
     private static final String SETTINGS = "bigscreenbot.properties";
@@ -61,7 +65,27 @@ public class Settings extends Properties
         String value = getProperty(key);
 
         if (value != null)
-            return Arrays.asList(value.split("\\s"));
+            return Arrays.asList(StringUtils.split(value));
+        else
+            return null;
+    }
+
+    public List<String> getListProperty(String key, List<String> defaultValue)
+    {
+        String value = getProperty(key);
+
+        if (value != null)
+            return Arrays.asList(StringUtils.split(value));
+        else
+            return defaultValue;
+    }
+
+    public List<String> setListProperty(String key, Collection<String> value)
+    {
+        String oldValue = (String)setProperty(key, StringUtils.join(value, ' '));
+
+        if (oldValue != null)
+            return Arrays.asList(StringUtils.split(oldValue));
         else
             return null;
     }
@@ -82,6 +106,23 @@ public class Settings extends Properties
                 reader.close();
         }
     }
+
+    public void store() throws IOException
+    {
+        FileWriter writer = null;
+
+        try
+        {
+            writer = new FileWriter(SETTINGS);
+
+            store(writer, null);
+        }
+        finally
+        {
+            if (writer != null)
+                writer.close();
+        }
+    }
 }
 
 // vim: expandtab