import os import aiohttp from redbot.core import Config, commands, checks import xml.etree.ElementTree as ET BaseCog = getattr(commands, "Cog", object) class Wolfram(BaseCog): """Ask Wolfram Alpha a question.""" def __init__(self, bot): self.bot = bot default_global = {"WOLFRAM_API_KEY": None} self.config = Config.get_conf(self, 2788801004) self.config.register_guild(**default_global) @commands.command(name="wolfram", aliases=["ask"]) async def _wolfram(self, ctx, *arguments: str): """ Ask Wolfram Alpha any question. """ api_key = await self.config.WOLFRAM_API_KEY() if api_key: url = "http://api.wolframalpha.com/v2/query?" query = " ".join(arguments) payload = {"input": query, "appid": api_key} headers = {"user-agent": "Red-cog/2.0.0"} conn = aiohttp.TCPConnector(verify_ssl=False) session = aiohttp.ClientSession(connector=conn) async with session.get(url, params=payload, headers=headers) as r: result = await r.text() session.close() root = ET.fromstring(result) a = [] for pt in root.findall(".//plaintext"): if pt.text: a.append(pt.text.capitalize()) if len(a) < 1: message = "There is as yet insufficient data for a meaningful answer." else: message = "\n".join(a[0:3]) else: message = ( "No API key set for Wolfram Alpha. Get one at http://products.wolframalpha.com/api/" ) await ctx.send("```{0}```".format(message)) @commands.command(name="setwolframapi", aliases=["setwolfram"]) @checks.is_owner() async def _setwolframapi(self, ctx, key: str): """ Set the api-key. """ if key: await self.config.WOLFRAM_API_KEY.set(key) await ctx.send("Key set.")