Пример #1
0
 public void run(
     String server,
     String channel,
     boolean pm,
     UserMessenger sender,
     Messenger source,
     String arguments) {
   Server dServer = JZBot.storage.getServer(server);
   // if (!pm)
   // {
   // JZBot.bot.sendMessage(sender, "Join only works in a pm");
   // return;
   // }
   if (arguments.endsWith(" frominvite")) {
     if (!sender.isSuperop())
       throw new ResponseException(
           "You're not a superop. Right now, I "
               + "will only join channels when the person that invited me "
               + "is a superop. For reference, the room you just invited "
               + "me to is "
               + arguments.split(" ")[0]);
   } else sender.verifySuperop();
   String name = arguments.split(" ")[0];
   if (!name.startsWith("#"))
     throw new ResponseException(
         "Right now, only channel names that " + "start with a \"#\" sign are supported.");
   if (dServer.getChannel(name) != null) {
     Channel c = dServer.getChannel(name);
     if (c.isSuspended()) {
       c.setSuspended(false);
       source.sendMessage(
           "Ok, I'll come back to that channel. I remember all "
               + "of my factoids and such from there.");
       JZBot.getServer(server).joinChannel(name);
       // JZBot.bot.sendMessage(name, "I've come back (courtesy of " + sender
       // + ")");
       // JZBot.bot.sendMessage(name, "I still remember all of my factoids and "
       // + "settings from this channel, and I'm still only "
       // + "allowing ops to create factoids here.");
     } else {
       JZBot.getServer(server).joinChannel(name);
       source.sendMessage(
           "I'm already at that channel, but I just made an attempt "
               + "to rejoin it, just in case.");
     }
     return;
   }
   Channel c = JZBot.storage.createChannel();
   c.setName(name);
   c.setTrigger("~");
   dServer.getChannels().add(c);
   Notify.channelAdded.fireListeners(ScopeLevel.channel, "@" + dServer.getName() + name, false);
   JZBot.getServer(server).joinChannel(name);
   source.sendMessage("Successful. I'm only allowing superops to create stuff here.");
   // JZBot.bot.sendMessage(name, "Here I am (courtesy of " + sender
   // + "). I'm only allowing ops to create factoids here.");
 }
Пример #2
0
 private static ConfigStorage getConfigStorage(String scope, boolean create) {
   scope = normalizeScope(scope);
   StorageContainer container = JZBot.getCheckedStorageContainer(scope);
   ConfigStorage storage = container.getConfiguration();
   if (storage == null && create) {
     storage = container.createConfiguration();
     container.setConfiguration(storage);
   }
   return storage;
 }
Пример #3
0
 @Override
 public void run(
     String server,
     String channel,
     boolean pm,
     UserMessenger sender,
     Messenger source,
     String arguments) {
   // TODO: make a config var that, when set to a certain value, allows the list of
   // servers to be read by non-superops, too.
   if (arguments.equals("")) {
     source.sendMessage(
         "You need to specify one of add, delete, details, activate, "
             + "deactivate, cycle, edit, list, priority, or current.");
     return;
   }
   String[] tokens = arguments.split(" ", 2);
   String subcommand = tokens[0];
   arguments = (tokens.length > 1 ? tokens[1] : "");
   tokens = arguments.split(" ", 2);
   String serverName = tokens[0];
   arguments = (tokens.length > 1 ? tokens[1] : "");
   tokens = arguments.split(" ");
   if (subcommand.equals("add")) {
     if (serverName.equals(""))
       throw new ResponseException(
           "Syntax: \"server add <name> <protocol> "
               + "<hostname> <port> "
               + "<nick> <password>\" <password> is optional. <protocol> "
               + "is one of irc, bzflag, TODO: complete this list");
     sender.verifySuperop();
     verifyOkChars(serverName);
     if (JZBot.storage.getServer(serverName) != null)
       throw new ResponseException("A server with that name already exists.");
     if (!ProtocolManager.hasProtocol(tokens[0]))
       throw new ResponseException(
           "The protocol \""
               + tokens[0]
               + "\" is not a valid protocol. Valid protocols "
               + "are: "
               + StringUtils.delimited(ProtocolManager.getProtocolNames(), " "));
     Server newServer = JZBot.storage.createServer();
     newServer.setActive(true);
     newServer.setName(serverName);
     newServer.setProtocol(tokens[0]);
     newServer.setServer(tokens[1]);
     newServer.setPort(Integer.parseInt(tokens[2]));
     newServer.setNick(tokens[3]);
     if (tokens.length > 4) newServer.setPassword(tokens[4]);
     JZBot.storage.getServers().add(newServer);
     Notify.serverAdded.fireListeners(ScopeLevel.server, "@" + newServer.getName(), false);
     JZBot.notifyConnectionCycleThread();
     source.sendMessage(
         "That server has been added and activated. The bot "
             + "will connect to it within a few seconds.");
   } else if (subcommand.equals("delete")) {
     sender.verifySuperop();
     Server s = server(serverName);
     JZBot.storage.getServers().remove(s);
     JZBot.notifyConnectionCycleThread();
     source.sendMessage(
         "The server and its factoids and settings have been " + "successfully deleted.");
   } else if (subcommand.equals("details")) {
     Server s = JZBot.storage.getServer(serverName);
     if (s == null)
       throw new ResponseException(
           "There isn't such a server by that name. Try \"server list\" "
               + "to get a list of servers, and then do "
               + "\"server details <name>\".");
     String passwordString = s.getPassword();
     if (passwordString == null) passwordString = "";
     source.sendMessage(
         "protocol:"
             + s.getProtocol()
             + "  host:"
             + s.getServer()
             + "  port:"
             + s.getPort()
             + "  nick:"
             + s.getNick()
             + "  password:"******".", "*"));
   } else if (subcommand.equals("activate")) {
     sender.verifySuperop();
     String[] serverNames = buildIntoMultipleServers(serverName, arguments);
     boolean serversWereActivated = false;
     boolean multipleServersWereActivated = false;
     for (String name : serverNames) {
       Server s = server(name);
       if (s.isActive()) {
         source.sendSpaced("That server (" + name + ") is already active.");
         continue;
       }
       s.setActive(true);
       if (serversWereActivated) multipleServersWereActivated = true;
       else serversWereActivated = true;
     }
     if (serversWereActivated) {
       if (multipleServersWereActivated)
         source.sendMessage(
             "Those servers were successfully "
                 + "activated. The bot will connect to them within a few seconds.");
       else
         source.sendMessage(
             "The server was successfully "
                 + "activated. The bot will connect to it within a few seconds.");
     }
     JZBot.notifyConnectionCycleThread();
   } else if (subcommand.equals("deactivate")) {
     sender.verifySuperop();
     String[] serverNames = buildIntoMultipleServers(serverName, arguments);
     boolean serversWereDeactivated = false;
     boolean multipleServersWereDeactivated = false;
     for (String name : serverNames) {
       Server s = server(name);
       if (!s.isActive()) {
         source.sendSpaced("That server (" + name + ") is not currently active.");
         continue;
       }
       s.setActive(false);
       if (serversWereDeactivated) multipleServersWereDeactivated = true;
       else serversWereDeactivated = true;
     }
     if (serversWereDeactivated) {
       if (multipleServersWereDeactivated)
         source.sendMessage(
             "Those servers were successfully "
                 + "deactivated. The bot will disconnect "
                 + "from them within a few seconds.");
       else
         source.sendMessage(
             "The server was successfully "
                 + "deactivated. The bot will disconnect "
                 + "from it within a few seconds.");
     }
     JZBot.notifyConnectionCycleThread();
   } else if (subcommand.equals("cycle")) {
     sender.verifySuperop();
     JZBot.notifyConnectionCycleThread();
     source.sendMessage(
         "A connection cycle has been started. Disconnected servers in the retry quiet period "
             + "will immediately reconnect.");
   } else if (subcommand.equals("edit")) {
     sender.verifySuperop();
     Server s = JZBot.storage.getServer(serverName);
     if (s == null)
       throw new ResponseException(
           "There isn't such a server by that name. Try \"server list\" "
               + "to get a list of servers, and then do "
               + "\"server edit <name>\".");
     ConnectionContext realCon = JZBot.getRealConnection(s.getName());
     // if (s.isActive() || (realCon != null &&
     // realCon.getConnection().isConnected()))
     // throw new ResponseException(
     // "You can't edit servers that are connected or activated. "
     // + "So, when running \"server list\", you can only "
     // + "edit servers that do not have flags 1 and 3.");
     if (tokens[0].equals(""))
       // Yes, I'm lazy - one of these days I might allow online server renames, but I don't
       // care enough to do it right now
       throw new ResponseException(
           "You need to specify the name of the property "
               + "to edit, like \"server edit "
               + serverName
               + " <propname> <propvalue>\". Allowed names are "
               + "name, protocol, host, port, nick, and password. Changing a server's name "
               + "will result in the bot restarting immediately after.");
     String key = tokens[0];
     if (tokens.length < 2)
       throw new ResponseException(
           "You need to specify the new value "
               + "for this property, "
               + "like \"server edit "
               + serverName
               + " "
               + key
               + " <newvalue>\".");
     String value = tokens[1];
     if (key.equals("name")) {
       if ("".equals(value)) {
         throw new ResponseException("The server name can't be set to the empty string.");
       } else if (JZBot.storage.getServer(value) != null)
         throw new ResponseException("A server with that name already exists.");
       s.setName(value);
     }
     if (key.equals("protocol")) s.setProtocol(value);
     else if (key.equals("host")) s.setServer(value);
     else if (key.equals("port")) s.setPort(Integer.parseInt(value));
     else if (key.equals("nick")) s.setNick(value);
     // In the future, the bot should switch the server's nick, if the server
     // supports nick switching.
     else if (key.equals("password")) s.setPassword(value);
     else
       throw new ResponseException(
           "That's not a valid property name. "
               + "Try \"server edit "
               + serverName
               + "\" for a list of valid property names.");
     source.sendMessage(
         "The server was successfully updated. If "
             + "the server is connected, deactivate and then reactivate "
             + "it as soon as possible.");
     if (key.equals("name")) {
       source.sendMessage("The bot will restart now.");
       JZBot.restart();
     }
   } else if (subcommand.equals("list")) {
     source.sendSpaced(
         "Here's the list. Servers in this list are in the format "
             + "<flags>:<name>, where <flags> are some flags and <name> is the "
             + "name of the server. Flags are A: active, O: has a connection "
             + "object, C: currently connected, E: error occurred during last "
             + "connection attempt (use \"server error\" to read the error message).");
     List<String> items = new ArrayList<String>();
     for (Server s : JZBot.storage.getServers().isolate()) {
       String sName = s.getName();
       String flags = "";
       if (s.isActive()) flags += "A";
       ConnectionContext c = JZBot.getRealConnection(sName);
       if (c != null) {
         flags += "O";
         if (c.getConnection().isConnected()) flags += "C";
       }
       if (JZBot.connectionLastErrorMap.get(sName) != null) flags += "E";
       // if (flags.equals(""))
       // flags = "0";
       items.add(flags + ":" + sName);
     }
     Utils.ircSendDelimited(items.toArray(new String[0]), "  ", source);
   } else if (subcommand.equals("error")) {
     Server s = JZBot.storage.getServer(serverName);
     if (s == null)
       throw new ResponseException(
           "There isn't a server by that name. Use "
               + "\"server error <name>\" to get the error "
               + "message for a server that failed to connect.");
     Throwable t = JZBot.connectionLastErrorMap.get(serverName);
     if (t == null)
       source.sendMessage(
           "This server did not encounter an error " + "since the last time it tried to connect.");
     else
       source.sendMessage(
           "Details of the last connection error: " + PastebinUtils.pastebinStack(t));
   } else if (subcommand.equals("current")) {
     source.sendMessage("Your current server is " + server + ".");
   } else if (subcommand.equals("priority")) {
     if (serverName.equals(""))
       throw new ResponseException(
           "Use \"server priority <name>\" to get "
               + "the current priority of a server or \"server priority "
               + "<name> <priority>\" to set a new priority for the specified "
               + "server. Servers with higher priority will be connected first "
               + "when the bot starts up or restarts.");
     Server s = JZBot.storage.getServer(serverName);
     if (s == null)
       throw new ResponseException("There isn't a server with the name \"" + serverName + "\".");
     if (arguments.equals("")) {
       source.sendMessage("That server's current priority is " + s.getPriority() + ".");
       return;
     }
     arguments = translateMemeNumbers(arguments);
     try {
       s.setPriority(Integer.parseInt(arguments));
       source.sendMessage(
           "That server's priority has been successfully set to " + s.getPriority() + ".");
       return;
     } catch (NumberFormatException e) {
       throw new ResponseException(
           "The new priority you just tried to set, \""
               + arguments
               + "\", is not a number. The new priority for a server "
               + "must be a whole number between "
               + Integer.MAX_VALUE
               + " and "
               + Integer.MIN_VALUE
               + ", inclusive. The server's priority has "
               + "been left at "
               + s.getPriority()
               + ".");
     }
   } else {
     throw new ResponseException(
         "Invalid command. Try running the \"server\" command "
             + "without arguments to see a list of all valid commands.");
   }
 }