diff options
author | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2007-08-29 20:55:33 +0000 |
---|---|---|
committer | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2007-08-29 20:55:33 +0000 |
commit | 5cb051d0ba8e32f4e044c3c1a6e8d11a5a57e3d9 (patch) | |
tree | 7aefdf7f37e84dbd5aacdb052b7c4f8e6d63d3a0 /data | |
parent | fa245be7a491647dd03852f5f6e362455c05a5b3 (diff) |
forecast plugin: thread, don't block
Diffstat (limited to 'data')
-rw-r--r-- | data/rbot/plugins/forecast.rb | 45 |
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 |