Example #1
0
def query(args):
    try:
        appid = common.read_lineconf(common.read_file('wolframalpha-api-key'))[0]
    except (IOError, IndexError):
        raise IOError('No appid to WolframAlpha™ was found.')

    m = re.search(r'^(.*?)( \| (.*?))?$', args)

    expr = m.group(1)
    xml = common.read_url('http://api.wolframalpha.com/v2/query?appid={0}&input='.format(appid), expr)

    output_type = 'approx' if not m.group(3) else m.group(3)

    root = ET.fromstring(xml)

    didyoumeans = root.find('didyoumeans')
    if didyoumeans:
        return 'Did you mean: \'{0}\'?'.format(didyoumeans.find('didyoumean').text)

    title = {'approx': 'Decimal approximation',
             'exact':  'Exact result'}

    for pod in root:
        if pod.tag == 'pod':
            if pod.attrib['title'] == 'Result' or pod.attrib['title'] == 'Value' or pod.attrib['title'] == title[output_type]:
                return pod.find('subpod').find('plaintext').text

    return 'WolframAlpha™ doesn\'t have the answer.'
Example #2
0
def lastfm(args):
  try:
    key = common.read_lineconf(common.read_file("lastfm-api-key"))[0]
    if not (len(key) == 32 and re.search(r'^[0-9a-f]+$', key)):
      raise IOError
  except (IOError, IndexError):
      raise IOError('Ingen nyckel för last.fm-API:et kunde hittas. Skapa filen lastfm-api-key med enbart nyckeln i sig i botens arbetskatalog.')

  try:
    content = common.read_url("http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&limit=1&api_key={0}&user={1}".format(key, common.quote(args)))
  except HTTPError:
    return "Kunde inte hitta en last.fm-användare med namnet {}.".format(args)


  dom = xml.dom.minidom.parseString(content)
  latesttrack = dom.getElementsByTagName('track')[0]
  artist = latesttrack.getElementsByTagName('artist')[0].childNodes[0].data
  title = latesttrack.getElementsByTagName('name')[0].childNodes[0].data

  returnstr = "{0}".format(args)
  if (latesttrack.hasAttribute("nowplaying")):
    playstatus = "spelar just nu"
  else:
    playstatus = "spelade senast"

  return "{0} {1} {2} ({3}) -- History: http://www.last.fm/user/{0}/tracks".format(args, playstatus, title, artist)
Example #3
0
def get_output(msg='', myname='', sender='', channel='', command_prefix='.'):
    msg = msg.strip()

    cmdsplit_re = re.compile(r'\s+->\s+')
    importline_re = re.compile(r'(\w|\.)+?(,\s+(\w|\.)+?)*\s*$')
    # helpsplit_re = re.compile(r'\s+\?>\s+')

    lines = common.read_lineconf(common.read_file('commands'))

    cmdlines = [x for x in lines if cmdsplit_re.search(x) != None]
    importlines = [x for x in lines if importline_re.match(x) != None]

    imports = get_command_imports(importlines)

    format_answer = lambda t, arg: t.format(message=msg, myname=myname,
                     channel=channel, sender=sender, arg=arg, qarg=quote(arg),
                     c='['+command_prefix+']')
    exec_answer = lambda code, arg: eval(code, imports, 
                    {'arg':arg, 'qarg':quote(arg), 'message':msg,
                     'sender':sender, 'channel':channel, 'myname':myname})

    # Fancy regexmagic!
    format_cmd = lambda t: format_answer(t, r'(?P<arg>.+?)') + '$'

    for line in cmdlines:
        try:
            rawcmd, rawanswer = cmdsplit_re.split(line)
        except ValueError:
            # TODO: some good error handling here
            continue
        cmd = format_cmd(rawcmd)
        cmd_match = re.match(cmd, msg) # ugly poc name but w/e :/
        if cmd_match:
            if 'arg' in cmd_match.groupdict():
                arg = cmd_match.group('arg')
            else:
                arg = ''
            if rawanswer.startswith('#py:'):
                answer = exec_answer(rawanswer[4:], arg)
            else:
                answer = format_answer(rawanswer, arg)
            return answer.split('[\\n]')
            
    return None
Example #4
0
def get_command_help(msg, sendernick, myname, command_prefix, plugins):
    msgparts = re.match(r'[{}]help(\s+(?P<nudgenick>@\S+)?\s*(?P<args>.+)*)?'.format(command_prefix), msg)
    if msgparts.group('args') == None:
        return ['{}: Hej Och Välkommen Till {}, En Vänlig Och Hjälpsam IRC (InterNet Relay Chat) "Bot"!'.format(sendernick, myname.title()),
                '{0}: Skriv \'{1}list commands\' eller \'{1}list plugins\' för en lista på kommandon/plugins'.format(sendernick, command_prefix),
                '{}: Skriv \'{}help <kommando>\' för hjälp med <kommando>.'.format(sendernick, command_prefix)]
    pluginname = msgparts.group('args')
    if msgparts.group('nudgenick'):
        nudgenick = msgparts.group('nudgenick')[1:]
    else:
        nudgenick = sendernick

    if pluginname in plugins:
        plugin = load_plugin(pluginname)
        try:
            info = plugin.help()
            return ['{}: {}: {}'.format(nudgenick, pluginname, info['description']),
                    '{}: Användning: {}{} {}'.format(nudgenick, command_prefix, pluginname, 
                                                info['argument'])]
        except NotImplementedError:
            return 'nån idiot har glömt att lägga in hjälptext i {}{}'.format(command_prefix, 
                                    pluginname)
    else:
        helpsplit_re = re.compile(r'\s+\?>\s+?')
        lines = common.read_lineconf(common.read_file('commands'))
        helplines = [x for x in lines if helpsplit_re.search(x) != None]
        for h in helplines:
            try:
                cmd, args, desc = helpsplit_re.split(h)
            except ValueError:
                continue
            else:
                if pluginname == cmd.format(c=''):
                    return ['{}: {}: {}'.format(nudgenick, pluginname, desc.format(myname=myname)),
                            '{}: Användning: {} {}'.format(nudgenick, cmd.format(c=command_prefix), 
                                                      args).strip()]

        return '{}: finns inget sånt kommando'.format(sendernick)