silentrob/superscript

View on GitHub
src/plugins/alpha.js

Summary

Maintainability
C
1 day
Test Coverage
import rhyme from 'rhymes';
import syllablistic from 'syllablistic';
import debuglog from 'debug';
import _ from 'lodash';

const debug = debuglog('AlphaPlugins');

const getRandomInt = (min, max) => Math.floor(Math.random() * ((max - min) + 1)) + min;

// TODO: deprecate oppisite and replace with opposite
const oppisite = function oppisite(word, cb) {
  debug('oppisite', word);

  this.facts.db.get({ subject: word, predicate: 'opposite' }, (err, opp) => {
    if (!_.isEmpty(opp)) {
      let oppositeWord = opp[0].object;
      oppositeWord = oppositeWord.replace(/_/g, ' ');
      cb(null, oppositeWord);
    } else {
      cb(null, '');
    }
  });
};

const rhymes = function rhymes(word, cb) {
  debug('rhyming', word);

  const rhymedWords = rhyme(word);
  const i = getRandomInt(0, rhymedWords.length - 1);

  if (rhymedWords.length !== 0) {
    cb(null, rhymedWords[i].word.toLowerCase());
  } else {
    cb(null, null);
  }
};

const syllable = (word, cb) => cb(null, syllablistic.text(word));

const letterLookup = function letterLookup(cb) {
  let reply = '';

  const lastWord = this.message.lemWords.slice(-1)[0];
  debug('--LastWord', lastWord);
  debug('LemWords', this.message.lemWords);
  const alpha = 'abcdefghijklmonpqrstuvwxyz'.split('');
  const pos = alpha.indexOf(lastWord);
  debug('POS', pos);
  if (this.message.lemWords.indexOf('before') !== -1) {
    if (alpha[pos - 1]) {
      reply = alpha[pos - 1].toUpperCase();
    } else {
      reply = "Don't be silly, there is nothing before A";
    }
  } else if (this.message.lemWords.indexOf('after') !== -1) {
    if (alpha[pos + 1]) {
      reply = alpha[pos + 1].toUpperCase();
    } else {
      reply = 'haha, funny.';
    }
  } else {
    const i = this.message.lemWords.indexOf('letter');
    const loc = this.message.lemWords[i - 1];

    if (loc === 'first') {
      reply = 'It is A.';
    } else if (loc === 'last') {
      reply = 'It is Z.';
    } else {
      // Number or word number
      // 1st, 2nd, 3rd, 4th or less then 99
      if ((loc === 'st' || loc === 'nd' || loc === 'rd' || loc === 'th') && this.message.numbers.length !== 0) {
        const num = parseInt(this.message.numbers[0]);
        if (num > 0 && num <= 26) {
          reply = `It is ${alpha[num - 1].toUpperCase()}`;
        } else {
          reply = 'seriously...';
        }
      }
    }
  }
  cb(null, reply);
};

const wordLength = function wordLength(cap, cb) {
  if (typeof cap === 'string') {
    const parts = cap.split(' ');
    if (parts.length === 1) {
      cb(null, cap.length);
    } else if (parts[0].toLowerCase() === 'the' && parts.length === 3) {
        // name bill, word bill
      cb(null, parts.pop().length);
    } else if (parts[0] === 'the' && parts[1].toLowerCase() === 'alphabet') {
      cb(null, '26');
    } else if (parts[0] === 'my' && parts.length === 2) {
        // Varible lookup
      const lookup = parts[1];
      this.user.getVar(lookup, (e, v) => {
        if (v !== null && v.length) {
          cb(null, `There are ${v.length} letters in your ${lookup}.`);
        } else {
          cb(null, "I don't know");
        }
      });
    } else if (parts[0] == 'this' && parts.length == 2) {
        // this phrase, this sentence
      cb(null, `That phrase has ${this.message.raw.length} characters. I think.`);
    } else {
      cb(null, 'I think there is about 10 characters. :)');
    }
  } else {
    cap(null, '');
  }
};

const nextNumber = function nextNumber(cb) {
  let reply = '';
  const num = this.message.numbers.slice(-1)[0];

  if (num) {
    if (this.message.lemWords.indexOf('before') !== -1) {
      reply = parseInt(num) - 1;
    }
    if (this.message.lemWords.indexOf('after') !== -1) {
      reply = parseInt(num) + 1;
    }
  }

  cb(null, reply);
};

export default {
  letterLookup,
  nextNumber,
  oppisite,
  rhymes,
  syllable,
  wordLength,
};