#!/usr/local/bin/python

import common
import imp
import re
import SOAPpy
import string
import sys

module_triggers = ['ud']

YOUR_URBANDICTIONARY_KEY='cf222e71ad118baf1800d629658af542'
OK_CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789 .,!?:-_\\/:;\'"'


def Gather(keyword, msg, irc = None, channel = None):
  module_location = imp.find_module('common')
  module = imp.load_module('common', *module_location)
  msg = common.NormalizeMessage(msg, irc, keyword)
  if keyword == 'ud':
    result = UDLookup(msg)
  common.DeliverMessage(result, irc, channel)


def UDLookup(query):
  """Get answers from Urban Dictionary!
  
  Args:
    msg: string

  Returns:
    str: Success or failure message
  """

  for char in query:
    if char.lower() not in OK_CHARS:
      return []
  server = SOAPpy.SOAPProxy("http://api.urbandictionary.com/soap")
  lookup = server.lookup(YOUR_URBANDICTIONARY_KEY, query)
  try:
    lookup[0]['definition']
  except IndexError:
    result = ['No results found for %s' % query]
  else:
    result = []
    max_msgs = 5
    for entry in 0, 1:
      try:
        msglist = string.split(lookup[entry]['definition'], '\n')
        for line in range(max_msgs-1):
          result.append(msglist[line].encode('latin-1'))
        try:
          msglist[max_msgs]
        except IndexError:
          continue
        else:
          result.append('Long result returned. For full result, please '
                        'see http://urbandictionary.com/define.php?term=%s' %
                        re.compile('\s+').sub('+', query))
      except IndexError:
        continue
  return result


def main():
  try:
    keyword = sys.argv[1]
  except IndexError:
    sys.exit(1)
  try:
    argument = sys.argv[2]
  except IndexError:
    sys.exit(1)

  if keyword in module_triggers:
    Gather(keyword, argument)

if __name__ == '__main__':
  main()

