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.'
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)
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
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)