From 7c67f090749d6472091123b5791169184f79eecc Mon Sep 17 00:00:00 2001 From: paul Date: Sun, 28 May 2017 00:42:44 -0400 Subject: [PATCH] scrape calc results from google since ddg is broken --- modules/calc.py | 58 ++++++++++++++++++++++++++++----------- modules/test/test_calc.py | 2 +- 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/modules/calc.py b/modules/calc.py index 8f2f409..44e9ad5 100644 --- a/modules/calc.py +++ b/modules/calc.py @@ -10,6 +10,7 @@ http://inamidst.com/phenny/ import re import web +from modules.search import generic_google subs = [ ('£', 'GBP '), @@ -20,30 +21,55 @@ subs = [ (r'\/', '/'), ] +r_google_calc = re.compile(r'calculator-40.gif.*? = (.*?)<') +r_google_calc_exp = re.compile(r'calculator-40.gif.*? = (.*?)(.*?)<') def c(phenny, input): - """DuckDuckGo calculator.""" + """Google calculator.""" if not input.group(2): return phenny.reply("Nothing to calculate.") q = input.group(2) - - try: - r = web.get( - 'https://api.duckduckgo.com/?q={}&format=json&no_html=1' - '&t=mutantmonkey/phenny'.format(web.quote(q))) - except web.HTTPError: - raise GrumbleError("Couldn't parse the result from DuckDuckGo.") - - data = web.json(r) - if data['AnswerType'] == 'calc': - answer = data['Answer'].split('=')[-1].strip() + bytes = generic_google(q) + m = r_google_calc_exp.search(bytes) + if not m: + m = r_google_calc.search(bytes) + + if not m: + num = None + elif m.lastindex == 1: + num = web.decode(m.group(1)) else: - answer = None + num = "^".join((web.decode(m.group(1)), web.decode(m.group(2)))) - if answer: - phenny.say(answer) + if num: + phenny.say(num) else: - phenny.reply('Sorry, no result.') + phenny.reply("Sorry, no result.") + + +# def c(phenny, input): +# """DuckDuckGo calculator.""" +# if not input.group(2): +# return phenny.reply("Nothing to calculate.") +# q = input.group(2) +# +# try: +# r = web.get( +# 'https://api.duckduckgo.com/?q={}&format=json&no_html=1' +# '&t=mutantmonkey/phenny'.format(web.quote(q))) +# except web.HTTPError: +# raise GrumbleError("Couldn't parse the result from DuckDuckGo.") +# +# data = web.json(r) +# if data['AnswerType'] == 'calc': +# answer = data['Answer'].split('=')[-1].strip() +# else: +# answer = None +# +# if answer: +# phenny.say(answer) +# else: +# phenny.reply('Sorry, no result.') c.commands = ['c'] c.example = '.c 5 + 3' diff --git a/modules/test/test_calc.py b/modules/test/test_calc.py index 599cc2b..15d21b9 100644 --- a/modules/test/test_calc.py +++ b/modules/test/test_calc.py @@ -29,7 +29,7 @@ class TestCalc(unittest.TestCase): input = Mock(group=lambda x: '2^64') c(self.phenny, input) - self.phenny.say.assert_called_once_with('1.84467440737096 * 10^19') + self.phenny.say.assert_called_once_with('1.84467441 × 10^19') def test_c_none(self): input = Mock(group=lambda x: 'aif')