class Lita::Handlers::Wtf

Constants

SOURCE_NAMES

Public Instance Methods

define(response) click to toggle source
# File lib/lita/handlers/wtf.rb, line 55
def define(response)
  term = response.match_data['term']
  info = response.match_data['definition']
  write(term, info, response.user.id)
  response.reply(format_definition(term, definition(term)))
end
lookup(response) click to toggle source
# File lib/lita/handlers/wtf.rb, line 39
def lookup(response)
  term = response.match_data['term']
  return response.reply(format_definition(term, definition(term))) if known?(term)

  definition, source_name = alternate_definition(term)

  if definition
    return response.reply(t('wtf.seealso',
                            term: term,
                            definition: definition,
                            source: SOURCE_NAMES[source_name]))
  end

  response.reply(t('wtf.unknown', term: term))
end

Private Instance Methods

alternate_definition(term) click to toggle source
# File lib/lita/handlers/wtf.rb, line 81
def alternate_definition(term)
  config.see_also.each do |source_name|
    definition = send("lookup_#{source_name}", term)
    return definition, source_name if definition
  end

  nil
end
definition(term) click to toggle source
# File lib/lita/handlers/wtf.rb, line 72
def definition(term)
  redis.hget(term.downcase, 'definition')
end
format_definition(term, definition) click to toggle source
# File lib/lita/handlers/wtf.rb, line 64
def format_definition(term, definition)
  t('wtf.is', term: term, definition: definition)
end
format_merriam_entries(content) click to toggle source
# File lib/lita/handlers/wtf.rb, line 104
def format_merriam_entries(content)
  nokogiri_dom = Nokogiri::XML(content) do |config|
    config.options = Nokogiri::XML::ParseOptions::STRICT |
                     Nokogiri::XML::ParseOptions::NONET
  end

  nokogiri_dom.css('//entry[1]/def/dt/text()').to_s[1..-1]
rescue StandardError
  nil
end
known?(term) click to toggle source
# File lib/lita/handlers/wtf.rb, line 68
def known?(term)
  redis.exists(term.downcase)
end
lookup_merriam(term) click to toggle source
# File lib/lita/handlers/wtf.rb, line 90
def lookup_merriam(term)
  api_key = config.api_keys['merriam']
  # FIXME: Add timeouts.
  response = http.get('http://www.dictionaryapi.com/api/v1/'\
                      "references/collegiate/xml/#{term}",
                      key: api_key)

  raise unless response.status == 200

  format_merriam_entries(response.body)
rescue StandardError
  nil
end
lookup_urbandictionary(term) click to toggle source
# File lib/lita/handlers/wtf.rb, line 115
def lookup_urbandictionary(term)
  # FIXME: Add timeouts.
  response = http.get('http://api.urbandictionary.com/v0/define',
                      term: term)

  def_list = JSON.parse(response.body)['list']
  def_text = def_list[0]['definition'].strip
  def_text[0] = def_text[0].chr.downcase
  def_text
rescue StandardError
  nil
end
write(term, definition, owner) click to toggle source
# File lib/lita/handlers/wtf.rb, line 76
def write(term, definition, owner)
  redis.hset(term.downcase, 'definition', definition)
  redis.hset(term.downcase, 'owner', owner)
end