def call_command(self, user, channel, message):
        # Keep track of whether we called a command for logging purposes
        called_command = False

        # Perform a regex match of the message to our command regexes, since
        # only one of these can match, and the matching groups are in the same
        # order, we only need to check the second one if the first fails, and
        # we only need to use one variable to track this.
        get_command = re.match(self.command_regex, message)
        if not get_command:
            get_command = re.match(
                self.natural_command_regex % re.escape(self.cardinal.nickname),
                message, flags=re.IGNORECASE)

        # Iterate through all loaded commands
        for command in self.itercommands(channel):

            # Check whether the current command has a regex to match by, and if
            # it does, and the message given to us matches the regex, then call
            # the command.
            if hasattr(command, 'regex') and re.search(command.regex, message):
                command(self.cardinal, user, channel, message)
                called_command = True
                continue

            # If the message didn't match a typical command regex, then we can
            # skip to the next command without checking whether this one
            # matches the message.
            if not get_command:
                continue

            # Check if the plugin defined any standard commands and whether any
            # of them match the command we found in the message.
            if (hasattr(command, 'commands') and
                    get_command.group(1) in command.commands):
                # Matched this command, so call it.
                called_command = True
                command(self.cardinal, user, channel, message)
                continue

        # Since standard command regex wasn't found, there's no need to raise
        # an exception - we weren't exactly expecting to find a command anyway.
        # Alternatively, if we called a command, no need to raise an exception.
        if not get_command or called_command:
            return

        # Since we found something that matched a command regex, yet no plugins
        # that were loaded had a command matching, we can raise an exception.
        raise CommandNotFoundError(
            "Command syntax detected, but no matching command found: %s" %
            message
        )
Compares the datetime_processed of the dataset on disk with that on
dataset/ETHPy150Open JohnMaguire/Cardinal/cardinal/plugins.py/PluginManager.call_command--crossover with--dataset/ETHPy150Open GeoscienceAustralia/agdc/src/abstract_ingester/ingest_db_wrapper.py/IngestDBWrapper.dataset_older_than_database