henrrrik/lita-imgflip

View on GitHub
lib/lita/handlers/imgflip.rb

Summary

Maintainability
B
4 hrs
Test Coverage
require "lita"

module Lita
  module Handlers
    class Imgflip < Handler

      config :command_only, default: true
      config :username, default: nil
      config :password, default: nil

      route %r{(Y U NO) (.+)}i,                                    :meme_y_u_no,             help: { "Y U NO..." => "generates Y U NO meme"}
      route %r{(I DON'?T ALWAYS .*) (BUT WHEN I DO,? .*)}i,        :meme_i_dont_always,      help: { "I DON'T ALWAYS .. BUT WHEN I DO, .." => "generates The Most Interesting Man in the World meme"}
      route %r{(.*)\b(O\s?RLY\??.*)}i,                             :meme_orly,               help: { "..O RLY.." => "generates O RLY meme" }
      route %r{(.*)(SUCCESS|NAILED IT.*)},                         :meme_success,            help: { "..SUCCESS.." => "(case sensitive) generates SUCCESS meme", "..NAILED IT.." => "generates NAILED IT meme" }
      route %r{(.*) (ALL the .*)} ,                                :meme_all_the,            help: { "ALL the.." => "(case sensitive) generates ALL the <things> meme" }
      route %r{(.*) (\w+\sTOO DAMN .*)}i,                          :meme_too_damn,           help: { "TOO DAMN.." => "generates TOO DAMN meme" }
      route %r{(GOOD NEWS EVERYONE[,.!]?) (.*)}i,                  :meme_good_news,          help: { "GOOD NEWS EVERYONE.." => "generates GOOD NEWS EVERYONE meme" }
      route %r{(NOT SURE IF .*) (OR .*)}i,                         :meme_not_sure_if,        help: { "NOT SURE IF.. OR.." => "generates NOT SURE IF .. OR meme" }
      route %r{(YO DAWG .*) (SO .*)}i,                             :meme_yo_dawg,            help: { "YO DAWG.." => "generates YO DAWG meme" }
      route %r{(ALL YOUR .*) (ARE BELONG TO US)}i,                 :meme_are_belong,         help: { "ALL YOUR.. ARE BELONG TO US" => "generates ALL YOUR.. ARE BELONG TO US meme" }
      route %r{(.*) (You'?re gonna have a bad time)}i,             :meme_bad_time,           help: { ".. You're gonna have a bad time" => "generates You're gonna have a bad time meme" }
      route %r{(one does not simply) (.*)}i,                       :meme_simply,             help: { "one does not simply.." => "generates one does not simply.. meme" }
      route %r{(grumpy cat) (.*),(.*)}i,                           :meme_grumpy_cat,         help: { "grumpy cat .. , .." => "generates grumpy cat .. , .. meme" }
      route %r{(it looks like you're|it looks like you) (.*)}i,    :meme_looks_like,         help: { "it looks like you're .." => "generates it looks like you're .. meme", "it looks like you.." => "(case insensitive) generates it looks like you.. meme" }
      route %r{(AM I THE ONLY ONE AROUND HERE) (.*)}i,             :meme_am_i_only,          help: { "AM I THE ONLY ONE AROUND HERE.." => "generates AM I THE ONLY ONE AROUND HERE.. meme" }
      route %r{(.*)(NOT IMPRESSED*)}i,                             :meme_not_impressed,      help: { "..NOT IMPRESSED" => "generates ..NOT IMPRESSED meme" }
      route %r{(PREPARE YOURSELF) (.*)}i,                          :meme_prepare_yourself,   help: { "PREPARE YOURSELF.." => "generates PREPARE YOURSELF.. meme" }
      route %r{(WHAT IF I TOLD YOU) (.*)}i,                        :meme_what_if_i,          help: { "WHAT IF I TOLD YOU.." => "generates WHAT IF I TOLD YOU.. meme" }
      route %r{(.*) (BETTER DRINK MY OWN PISS)}i,                  :meme_better_drink,       help: { "..BETTER DRINK MY OWN PISS" => "generates ..BETTER DRINK MY OWN PISS meme" }
      route %r{^khanify (.*)}i,                                    :meme_khanify,            help: { "khanify ..." => "generates khan meme" }
      route %r{(.*,) (.* EVERYWHERE)}i,                            :meme_everywhere,         help: { ".., .. EVERYWHERE" => "generates X, X everywhere meme" }
      route %r{(.*) (THAT WOULD BE GREAT)}i,                       :meme_would_be_great,     help: { ".. THAT WOULD BE GREAT" => "generates Bill Lumbergh meme" }
      route %r{(.*) (AIN'?T NOBODY GOT TIME FOR THAT)}i,           :meme_time_for_that,      help: { ".. AIN'T NOBODY GOT TIME FOR THAT" => "generates Sweet Brown meme." }
      route %r{(.*) (I TOO LIKE TO LIVE DANGEROUSLY)}i,            :meme_live_dangerously,   help: { ".. I TOO LIKE TO LIVE DANGEROUSLY" => "generates I Too Like to Live Dangerously meme." }
      route %r{(.*) (SHUT UP AND TAKE MY MONEY)}i,                 :meme_take_my_money,      help: { ".. SHUT UP AND TAKE MY MONEY" => "generates Shut Up and Take My Money Fry meme." }
      route %r{(YOU KNOW WHAT REALLY GRINDS MY GEARS[?,]?) (.*)}i, :meme_grinds_my_gears,    help: { "YOU KNOW WHAT REALLY GRINDS MY GEARS? .." => "generates Peter Griffin News meme." }
      route %r{(.*) (CHALLENGE ACCEPTED)}i,                        :meme_challenge_accepted, help: { ".. CHALLENGE ACCEPTED" => "generated Challenge Accepted face meme." }
      route %r{(YOUR\b.*)\b(IS BAD)(.*)}i,                         :meme_zoidberg_feel_bad,  help: { "YOUR.. IS BAD AND YOU SHOULD FEEL BAD" => "generates Zoidberg Your .. is bad and you should feel bad meme" }

      def meme_y_u_no(response)
        generate_meme(response, 61527)
      end

      def meme_i_dont_always(response)
        generate_meme(response, 61532)
      end

      def meme_success(response)
        generate_meme(response, 61544)
      end

      def meme_all_the(response)
        generate_meme(response, 61533)
      end

      def meme_too_damn(response)
        generate_meme(response, 61580)
      end

      def meme_good_news(response)
        generate_meme(response, 7163250)
      end

      def meme_not_sure_if(response)
        generate_meme(response, 61520)
      end

      def meme_yo_dawg(response)
        generate_meme(response, 101716)
      end

      def meme_are_belong(response)
        generate_meme(response, 4503404)
      end

      def meme_fuck_you(response)
        generate_meme(response, 165248)
      end

      def meme_bad_time(response)
        generate_meme(response, 100951)
      end

      def meme_simply(response)
        generate_meme(response, 61579)
      end

      def meme_grumpy_cat(response)
        generate_meme(response, 405658, text0:response.matches[0][1], text1:response.matches[0][2])
      end

      def meme_looks_like(response)
        generate_meme(response, 7842373)
      end

      def meme_am_i_only(response)
        generate_meme(response, 259680)
      end

      def meme_not_impressed(response)
        generate_meme(response, 117402)
      end

      def meme_prepare_yourself(response)
        generate_meme(response, 6774155)
      end

      def meme_what_if_i(response)
        generate_meme(response, 100947)
      end

      def meme_better_drink(response)
        generate_meme(response, 61548)
      end

      def meme_khanify(response)
        generate_meme(response, 2743696, text0: "", text1: khanify(response.matches[0][0]))
      end

      def meme_everywhere(response)
        generate_meme(response, 347390)
      end

      def meme_would_be_great(response)
        generate_meme(response, 563423)
      end

      def meme_time_for_that(response)
        generate_meme(response, 442575)
      end

      def meme_live_dangerously(response)
        generate_meme(response, 8680117)
      end

      def meme_take_my_money(response)
        generate_meme(response, 176908)
      end

      def meme_grinds_my_gears(response)
        generate_meme(response, 356615)
      end

      def meme_orly(response)
        generate_meme(response, 12361203)
      end

      def meme_challenge_accepted(response)
        generate_meme(response, 24792)
      end

      def meme_zoidberg_feel_bad(response)
        generate_meme(response, 35747)
      end

      private

      def khanify(phrase)
        shouty_phrase = phrase.upcase
        last_vowel_index = shouty_phrase.rindex(/[AEIOU]/) || -1 # default to final consonant
        last_vowel = shouty_phrase[last_vowel_index]
        "#{shouty_phrase[0..last_vowel_index]}#{10.times.map{ last_vowel }.join}#{shouty_phrase[last_vowel_index..-1]}!!!!"
      end

      def generate_meme(response, template_id, text0: nil, text1: nil)

        text0 ||= response.matches[0][0]
        text1 ||= response.matches[0][1]

        http_resp = http.post(
          'https://api.imgflip.com/caption_image',
          username: Lita.config.handlers.imgflip.username,
          password: Lita.config.handlers.imgflip.password,
          template_id: template_id,
          text0: text0,
          text1: text1
        )

        if http_resp.status == 200
          result = MultiJson.load(http_resp.body)

          if result['success']
            response.reply result['data']['url']
          else
            Lita.logger.error "#{self.class}: Unable to generate a meme image: #{result['error_message']}"
            response.reply "Error: #{result['error_message']}"
          end

        else
          Lita.logger.error "#{self.class}: Unable to generate a meme image: #{http_resp.body}"
          response.reply "Error: Unable to generate a meme image"
        end

      end

    end

    Lita.register_handler(Imgflip)
  end
end