summaryrefslogtreecommitdiffstats
path: root/modules/calc.py
diff options
context:
space:
mode:
Diffstat (limited to 'modules/calc.py')
-rw-r--r--modules/calc.py66
1 files changed, 66 insertions, 0 deletions
diff --git a/modules/calc.py b/modules/calc.py
new file mode 100644
index 0000000..6768035
--- /dev/null
+++ b/modules/calc.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+# coding=utf-8
+"""
+calc.py - Phenny Calculator Module
+Copyright 2008, Sean B. Palmer, inamidst.com
+Licensed under the Eiffel Forum License 2.
+
+http://inamidst.com/phenny/
+"""
+
+import re
+import web
+
+r_result = re.compile(r'(?i)<A NAME=results>(.*?)</A>')
+r_tag = re.compile(r'<\S+.*?>')
+
+subs = [
+ (' in ', ' -> '),
+ (' over ', ' / '),
+ (u'£', 'GBP '),
+ (u'€', 'EUR '),
+ ('\$', 'USD '),
+ (r'\bKB\b', 'kilobytes'),
+ (r'\bMB\b', 'megabytes'),
+ (r'\bGB\b', 'kilobytes'),
+ ('kbps', '(kilobits / second)'),
+ ('mbps', '(megabits / second)')
+]
+
+def calc(phenny, input):
+ q = input.group(2)
+
+ query = q[:]
+ for a, b in subs:
+ query = re.sub(a, b, query)
+ query = query.rstrip(' \t')
+
+ precision = 5
+ if query[-3:] in ('GBP', 'USD', 'EUR', 'NOK'):
+ precision = 2
+ query = web.urllib.quote(query.encode('utf-8'))
+
+ uri = 'http://futureboy.homeip.net/fsp/frink.fsp?fromVal='
+ bytes = web.get(uri + query)
+ m = r_result.search(bytes)
+ if m:
+ result = m.group(1)
+ result = r_tag.sub('', result) # strip span.warning tags
+ result = result.replace('&gt;', '>')
+ result = result.replace('(undefined symbol)', '(?) ')
+
+ if '.' in result:
+ try: result = str(round(float(result), precision))
+ except ValueError: pass
+
+ if not result.strip():
+ result = '?'
+ elif ' in ' in q:
+ result += ' ' + q.split(' in ', 1)[1]
+
+ phenny.say(q + ' = ' + result)
+ else: phenny.reply("Sorry, can't calculate that.")
+calc.commands = ['calc']
+
+if __name__ == '__main__':
+ print __doc__.strip()