| @@ -71,6 +71,8 @@ class BaseCommand(object): | |||
| Given a Data() instance, return True if we should respond to this | |||
| activity, or False if we should ignore it or it doesn't apply to us. | |||
| Be aware that since this is called for each message sent on IRC, it | |||
| should not be cheap to execute and unlikely to throw exceptions. | |||
| Most commands return True if data.command == self.name, otherwise they | |||
| return False. This is the default behavior of check(); you need only | |||
| @@ -97,6 +99,10 @@ class CommandManager(object): | |||
| self._commands = {} | |||
| self._command_access_lock = Lock() | |||
| def __iter__(self): | |||
| for name in self._commands: | |||
| yield name | |||
| def _load_command(self, name, path): | |||
| """Load a specific command from a module, identified by name and path. | |||
| @@ -148,10 +154,6 @@ class CommandManager(object): | |||
| commands = ", ".join(self._commands.keys()) | |||
| self.logger.info(msg.format(len(self._commands), commands)) | |||
| def get_all(self): | |||
| """Return our dict of all loaded commands.""" | |||
| return self._commands | |||
| def check(self, hook, data): | |||
| """Given an IRC event, check if there's anything we can respond to.""" | |||
| with self._command_access_lock: | |||
| @@ -164,3 +166,10 @@ class CommandManager(object): | |||
| e = "Error executing command '{0}':" | |||
| self.logger.exception(e.format(data.command)) | |||
| break | |||
| def get(self, command_name): | |||
| """Return the class instance associated with a certain command name. | |||
| Will raise KeyError if the command is not found. | |||
| """ | |||
| return self._command[command_name] | |||
| @@ -30,7 +30,6 @@ class Command(BaseCommand): | |||
| name = "help" | |||
| def process(self, data): | |||
| self.cmnds = self.bot.commands.get_all() | |||
| if not data.args: | |||
| self.do_main_help(data) | |||
| else: | |||
| @@ -39,7 +38,7 @@ class Command(BaseCommand): | |||
| def do_main_help(self, data): | |||
| """Give the user a general help message with a list of all commands.""" | |||
| msg = "Hi, I'm a bot! I have {0} commands loaded: {1}. You can get help for any command with '!help <command>'." | |||
| cmnds = sorted(self.cmnds.keys()) | |||
| cmnds = sorted(self.bot.commands) | |||
| msg = msg.format(len(cmnds), ', '.join(cmnds)) | |||
| self.connection.reply(data, msg) | |||
| @@ -53,13 +52,14 @@ class Command(BaseCommand): | |||
| dummy.command = command.lower() | |||
| dummy.is_command = True | |||
| for cmnd in self.cmnds.values(): | |||
| for cmnd_name in self.bot.commands: | |||
| cmnd = self.bot.commands.get(cmnd_name) | |||
| if not cmnd.check(dummy): | |||
| continue | |||
| if cmnd.__doc__: | |||
| doc = cmnd.__doc__.replace("\n", "") | |||
| doc = re.sub("\s\s+", " ", doc) | |||
| msg = "info for command \x0303{0}\x0301: \"{1}\"" | |||
| msg = "help for command \x0303{0}\x0301: \"{1}\"" | |||
| self.connection.reply(data, msg.format(command, doc)) | |||
| return | |||
| break | |||
| @@ -103,13 +103,9 @@ class Command(BaseCommand): | |||
| def do_listall(self): | |||
| """With !tasks listall or !tasks all, list all loaded tasks, and report | |||
| whether they are currently running or idle.""" | |||
| all_tasks = self.bot.tasks.get_all().keys() | |||
| threads = threading.enumerate() | |||
| tasklist = [] | |||
| all_tasks.sort() | |||
| for task in all_tasks: | |||
| for task in sorted(self.bot.tasks): | |||
| threadlist = [t for t in threads if t.name.startswith(task)] | |||
| ids = [str(t.ident) for t in threadlist] | |||
| if not ids: | |||
| @@ -144,9 +140,9 @@ class Command(BaseCommand): | |||
| self.connection.reply(data, msg) | |||
| return | |||
| if task_name not in self.bot.tasks.get_all().keys(): | |||
| if task_name not in self.bot.tasks: | |||
| # This task does not exist or hasn't been loaded: | |||
| msg = "task could not be found; either tasks/{0}.py doesn't exist, or it wasn't loaded correctly." | |||
| msg = "task could not be found; either it doesn't exist, or it wasn't loaded correctly." | |||
| self.connection.reply(data, msg.format(task_name)) | |||
| return | |||
| @@ -139,6 +139,10 @@ class TaskManager(object): | |||
| self._tasks = {} | |||
| self._task_access_lock = Lock() | |||
| def __iter__(self): | |||
| for name in self._tasks: | |||
| yield name | |||
| def _wrapper(self, task, **kwargs): | |||
| """Wrapper for task classes: run the task and catch any errors.""" | |||
| try: | |||
| @@ -239,7 +243,3 @@ class TaskManager(object): | |||
| Will raise KeyError if the task is not found. | |||
| """ | |||
| return self._tasks[task_name] | |||
| def get_all(self): | |||
| """Return our dict of all loaded tasks.""" | |||
| return self._tasks | |||