doesMatch = async function doesMatch(gambit, message, options) {
  if (gambit.conditions && gambit.conditions.length > 0) {
    const conditionsMatch = processConditions(gambit.conditions, options);
    if (!conditionsMatch) {
      debug.verbose('Conditions did not match');
      return false;
    }
  }

  let match = false;

  // Replace <noun1>, <adverb1> etc. with the actual words in user message
  const regexp = postParse(gambit.trigger, message, options.user);

  const pattern = new RegExp(`^${regexp}$`, 'i');

  debug.verbose(`Try to match (clean)'${message.clean}' against '${gambit.trigger}' (${pattern})`);
  debug.verbose(`Try to match (lemma)'${message.lemString}' against '${gambit.trigger}' (${pattern})`);

  // Match on isQuestion
  if (gambit.isQuestion && message.isQuestion) {
    debug.verbose('Gambit and message are questions, testing against question types');
    match = message.clean.match(pattern);
    if (!match) {
      match = message.lemString.match(pattern);
    }
  } else if (!gambit.isQuestion) {
    match = message.clean.match(pattern);
    if (!match) {
      match = message.lemString.match(pattern);
    }
  }

  debug.verbose(`Match at the end of doesMatch was: ${match}`);

  return match;
}
Takes a gambit and a message, and returns non-null if they match.