2017-11-22 19:26:40 -05:00
|
|
|
#! /usr/bin/env python3
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
|
|
Wolfram|Alpha module for Sopel IRC bot framework
|
|
|
|
Forked from code by Max Gurela (@maxpowa):
|
|
|
|
https://github.com/maxpowa/inumuta-modules/blob/e0b195c4f1e1b788fa77ec2144d39c4748886a6a/wolfram.py
|
|
|
|
Updated and packaged for PyPI by dgw (@dgw)
|
|
|
|
"""
|
|
|
|
|
|
|
|
from config.types import StaticSection, ChoiceAttribute, ValidatedAttribute
|
|
|
|
from module import commands, example
|
|
|
|
import wolframalpha
|
|
|
|
|
|
|
|
|
|
|
|
@commands('wa', 'wolfram')
|
|
|
|
@example('.wa 2+2', '[W|A] 2+2 = 4')
|
|
|
|
@example('.wa python language release date', '[W|A] Python | date introduced = 1991')
|
|
|
|
def wa_command(bot, trigger):
|
2018-01-05 08:46:52 -05:00
|
|
|
"""
|
|
|
|
Queries WolframAlpha.
|
|
|
|
"""
|
2017-11-22 19:26:40 -05:00
|
|
|
msg = None
|
|
|
|
if not trigger.group(2):
|
|
|
|
msg = 'You must provide a query.'
|
|
|
|
if not bot.config.wolfram.app_id:
|
|
|
|
msg = 'Wolfram|Alpha API app ID not configured.'
|
|
|
|
|
|
|
|
lines = (msg or wa_query(bot.config.wolfram.app_id, trigger.group(2), bot.config.wolfram.units)).splitlines()
|
|
|
|
|
|
|
|
|
|
|
|
for line in lines:
|
|
|
|
bot.say('[\x0304Wolfram\x03] {}'.format(line))
|
|
|
|
|
|
|
|
|
|
|
|
def wa_query(app_id, query, units='nonmetric'):
|
|
|
|
if not app_id:
|
|
|
|
return 'Wolfram|Alpha API app ID not provided.'
|
|
|
|
client = wolframalpha.Client(app_id)
|
|
|
|
query = query.encode('utf-8').strip()
|
|
|
|
params = (
|
|
|
|
('format', 'plaintext'),
|
|
|
|
('units', units),
|
|
|
|
)
|
|
|
|
|
|
|
|
try:
|
|
|
|
result = client.query(input=query, params=params)
|
|
|
|
except AssertionError:
|
|
|
|
return 'Temporary API issue. Try again in a moment.'
|
|
|
|
except Exception as e:
|
|
|
|
return 'Query failed: {} ({})'.format(type(e).__name__, e.message or 'Unknown error, try again!')
|
|
|
|
|
|
|
|
num_results = 0
|
|
|
|
try:
|
|
|
|
num_results = int(result['@numpods'])
|
|
|
|
finally:
|
|
|
|
if num_results == 0:
|
|
|
|
return 'No results found.'
|
|
|
|
|
|
|
|
texts = []
|
|
|
|
try:
|
|
|
|
for pod in result.pods:
|
|
|
|
try:
|
|
|
|
texts.append(pod.text)
|
|
|
|
except AttributeError:
|
|
|
|
pass # pod with no text; skip it
|
|
|
|
except Exception:
|
|
|
|
raise # raise unexpected exceptions to outer try for bug reports
|
|
|
|
if len(texts) >= 2:
|
|
|
|
break # len() is O(1); this cheaply avoids copying more strings than needed
|
|
|
|
except Exception as e:
|
|
|
|
return 'Unhandled {}; please report this query ("{}") at https://dgw.me/wabug'.format(type(e).__name__, query)
|
|
|
|
|
|
|
|
try:
|
|
|
|
input, output = texts[0], texts[1]
|
|
|
|
except IndexError:
|
|
|
|
return 'No text-representable result found; see http://wolframalpha.com/input/?i={}'.format(query)
|
|
|
|
|
|
|
|
output = output.replace('\n', ' | ')
|
|
|
|
if not output:
|
|
|
|
return input
|
|
|
|
return '\x0310{} \x03= \x0312{}'.format(input, output)
|