summaryrefslogtreecommitdiff
path: root/data
diff options
context:
space:
mode:
authorGiuseppe Bilotta <giuseppe.bilotta@gmail.com>2007-08-29 20:55:33 +0000
committerGiuseppe Bilotta <giuseppe.bilotta@gmail.com>2007-08-29 20:55:33 +0000
commit5cb051d0ba8e32f4e044c3c1a6e8d11a5a57e3d9 (patch)
tree7aefdf7f37e84dbd5aacdb052b7c4f8e6d63d3a0 /data
parentfa245be7a491647dd03852f5f6e362455c05a5b3 (diff)
forecast plugin: thread, don't block
Diffstat (limited to 'data')
-rw-r--r--data/rbot/plugins/forecast.rb45
1 files changed, 28 insertions, 17 deletions
diff --git a/data/rbot/plugins/forecast.rb b/data/rbot/plugins/forecast.rb
index d0847b59..80790728 100644
--- a/data/rbot/plugins/forecast.rb
+++ b/data/rbot/plugins/forecast.rb
@@ -7,7 +7,8 @@
# Copyright:: (C) 2006 Ralph M. Churchill
require 'soap/wsdlDriver'
-require 'open-uri'
+# TODO why not use HttpUtil instead of open-uri?
+require 'open-uri'
require 'rexml/document'
require 'erb'
@@ -87,6 +88,7 @@ class ForecastPlugin < Plugin
end
end
@forecast_cache = Hash.new
+ @cache_mutex = Mutex.new
end
def forecast(m,params)
@@ -105,31 +107,40 @@ class ForecastPlugin < Plugin
end
def get_forecast(m,loc)
+ Thread.new {
begin
+ @cache_mutex.synchronize do
if @forecast_cache.has_key?(loc) and
Time.new - @forecast_cache[loc][:date] < 3600
forecast = @forecast_cache[loc][:forecast]
- forecast_date = @forecast_cache[loc][:date]
- else
- begin
- l = LatLong.new
- f = Forecast.new(*l.get_lat_long(loc))
- forecast,forecast_date = f.forecast
- rescue => err
- m.reply err
+ if forecast
+ m.reply forecast
+ Thread.exit
end
end
- if forecast
- m.reply forecast
- @forecast_cache[loc] = {}
- @forecast_cache[loc][:forecast] = forecast
- @forecast_cache[loc][:date] = forecast_date
- else
- m.reply "Couldn't find forecast for #{loc}"
+ end
+ begin
+ l = LatLong.new
+ f = Forecast.new(*l.get_lat_long(loc))
+ forecast,forecast_date = f.forecast
+ rescue => err
+ m.reply err
+ end
+ if forecast
+ m.reply forecast
+ @cache_mutex.synchronize do
+ @forecast_cache[loc] = {
+ :forecast => forecast,
+ :date => forecast_date
+ }
end
+ else
+ m.reply "Couldn't find forecast for #{loc}"
+ end
rescue => e
- m.reply "ERROR: #{e}"
+ m.reply "ERROR: #{e}"
end
+ }
end
end
plugin = ForecastPlugin.new