diff --git a/plugins/bible.py b/plugins/bible.py index bc6b8e4..d7860ea 100644 --- a/plugins/bible.py +++ b/plugins/bible.py @@ -19,4 +19,3 @@ def bible(inp): text = text[:text.rfind(' ', 0, 400)] + '...' return text - diff --git a/plugins/weather.py b/plugins/weather.py index b19d786..bad60fb 100755 --- a/plugins/weather.py +++ b/plugins/weather.py @@ -1,19 +1,52 @@ #!/usr/bin/python "weather, thanks to google" +from __future__ import with_statement + +import os +import codecs +import thread import urllib from lxml import etree import hook +lock = thread.allocate_lock() +stalk = {} + +def load_stalk(filename, mtimes={}): + if not os.path.exists(filename): + return {} + mtime = os.stat(filename).st_mtime + if mtimes.get(filename, 0) != mtime: + mtimes[filename] = mtime + return dict(x.split(None, 1) for x in + codecs.open(filename, 'r', 'utf-8')) + +def save_stalk(filename, houses): + out = codecs.open(filename, 'w', 'utf-8') + out.write('\n'.join('%s %s' % x for x in sorted(houses.iteritems()))) #_heh_ + out.flush() + out.close() + @hook.command def weather(bot, input): ".weather -- queries the google weather API for weather data" + global stalk - if not input.inp.strip(): # blank line - return "welp" + filename = os.path.join(bot.persist_dir, 'weather') + if not stalk: + with lock: + stalk = load_stalk(filename) + + nick = input.nick.lower() + loc = input.inp.strip().lower() + if not loc: # blank line + loc = stalk.get(nick, '') + if not loc: + return weather.__doc__ - data = urllib.urlencode({'weather':input.inp.encode('utf-8')}) + data = urllib.urlencode({'weather':loc.encode('utf-8')}) url = 'http://www.google.com/ig/api?' + data w = etree.parse(url).find('weather') @@ -26,5 +59,10 @@ def weather(bot, input): info['high'] = w.find('forecast_conditions/high').get('data') info['low'] = w.find('forecast_conditions/low').get('data') - return '%(city)s: %(condition)s, %(temp_f)sF/%(temp_c)sC (H:%(high)sF, ' \ - 'L:%(low)sF), %(humidity)s, %(wind_condition)s.' % info + bot.reply('%(city)s: %(condition)s, %(temp_f)sF/%(temp_c)sC (H:%(high)sF'\ + ', L:%(low)sF), %(humidity)s, %(wind_condition)s.' % info) + + if loc != stalk.get(nick, ''): + with lock: + stalk[nick] = loc + save_stalk(filename, stalk)