lita-raindar 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 51a68d049f34c5463d1ee554288e7b3178915f49
4
+ data.tar.gz: ad7a43f2fe5e49777237efbc6ca0a2873d7184ae
5
+ SHA512:
6
+ metadata.gz: d079cd0f62960e9b759e70eb219cc40046809cb9f050496fab198d2782ec3b4a8f395f8536476aa45e04a120391ecf9feda23d95dd222675b7a2b00000cad148
7
+ data.tar.gz: 5338bfc6faacc5de7d5e057dde973bb31a6521b93db965d17ef6ae8a58955b12659b98c00f9e7458b6e0c63bb595c4e1e6e4a0c6602a48303414a1c41241a4ee
@@ -0,0 +1,29 @@
1
+ require 'imgur'
2
+
3
+ class ImgurGateway
4
+ IMGUR_API_KEY = ENV['IMGUR_API_KEY']
5
+
6
+ attr_accessor :filename, :title, :url
7
+
8
+ def initialize(filename: nil, title: nil)
9
+ @filename = filename
10
+ @title = title || image_title
11
+ end
12
+
13
+ def upload
14
+ return false unless filename
15
+ client = Imgur.new(IMGUR_API_KEY)
16
+ image = Imgur::LocalImage.new(filename, title: title)
17
+ uploaded = client.upload(image)
18
+ @url = uploaded.link
19
+ rescue
20
+ return false
21
+ end
22
+
23
+ private
24
+
25
+ def image_title
26
+ "Raindar #{Time.now.strftime('%A, %B %d, %Y')}"
27
+ end
28
+
29
+ end
@@ -0,0 +1,79 @@
1
+ require "lita"
2
+ require_relative "url_cache"
3
+
4
+ module Lita
5
+ module Handlers
6
+ class Raindar < Handler
7
+
8
+ route(/^weather ([a-zA-Z0-9\s]*)$/i, :radar, command: true, help: { "weather LOCATION" => "Returns GIF of recent weather radar" })
9
+
10
+ RADARS = {
11
+ "melbourne" => "IDR023",
12
+ "bairnsdale" => "IDR683",
13
+ "mildura" => "IDR303",
14
+ "yarrawonga" => "IDR493",
15
+ "canberra" => "IDR403",
16
+ "sydney" => "IDR713",
17
+ "grafton" => "IDR283",
18
+ "newcastle" => "IDR043",
19
+ "moree" => "IDR533",
20
+ "namoi" => "IDR693",
21
+ "wagga wagga" => "IDR553",
22
+ "wollongong" => "IDR033",
23
+ "brisbane" => "IDR663",
24
+ "bowen" => "IDR243",
25
+ "cairns" => "IDR193",
26
+ "emerald" => "IDR723",
27
+ "gladstone" => "IDR233",
28
+ "gulf of carpentaria" => "IDR363",
29
+ "gympie" => "IDR083",
30
+ "longreach" => "IDR563",
31
+ "mackay" => "IDR223",
32
+ "mount isa" => "IDR753",
33
+ "townsville" => "IDR733",
34
+ "warrego" => "IDR673",
35
+ "weipa" => "IDR783",
36
+ "willis island" => "IDR413",
37
+ "perth" => "IDR703",
38
+ "albany" => "IDR313",
39
+ "broome" => "IDR173",
40
+ "carnarvon" => "IDR053",
41
+ "dampier" => "IDR153",
42
+ "esperance" => "IDR323",
43
+ "geraldton" => "IDR063",
44
+ "giles" => "IDR443",
45
+ "halls creek" => "IDR393",
46
+ "kalgoorlie" => "IDR483",
47
+ "learmonth" => "IDR293",
48
+ "port headland" => "IDR163",
49
+ "wyndham" => "IDR073",
50
+ "hobart" => "IDR763",
51
+ "west takone" => "IDR523",
52
+ "adelaide" => "IDR643",
53
+ "ceduna" => "IDR333",
54
+ "mt gambier" => "IDR143",
55
+ "woomera" => "IDR273",
56
+ "darwin" => "IDR633",
57
+ "alice springs" => "IDR253",
58
+ "gove" => "IDR093",
59
+ "katherine" => "IDR423",
60
+ "warruwi" => "IDR773",
61
+ }
62
+
63
+ def radar(response)
64
+ requested_location = response.match_data[1].to_s
65
+ code = RADARS[requested_location.downcase]
66
+
67
+ if code.nil?
68
+ response.reply("Location not currently available")
69
+ else
70
+ response.reply(UrlCache.cached_radar_url(code))
71
+ end
72
+
73
+ end
74
+
75
+ Lita.register_handler(self)
76
+
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,58 @@
1
+ require 'httparty'
2
+ require_relative 'imgur_gateway'
3
+ require 'json'
4
+ require 'tempfile'
5
+ require_relative 'template_generator'
6
+
7
+ class RadarGenerator
8
+ IMGUR_API_KEY = ENV['IMGUR_API_KEY']
9
+
10
+ def self.gif(radar_code)
11
+ template = TemplateGenerator.template(radar_code)
12
+
13
+ temporary_image_files = recent_image_filenames(radar_code).map do |radar_image|
14
+ tempfile = Tempfile.new('composed')
15
+
16
+ system "convert -layers flatten #{template} #{raindar_url_for(radar_image)} #{tempfile.path}"
17
+ tempfile
18
+ end
19
+ composed_file_paths = temporary_image_files.map { |tempfile|
20
+ tempfile.path
21
+ }.join(' ')
22
+
23
+ temporary_radar_gif = Tempfile.new(['radar', '.gif'])
24
+ system "convert -delay 50 -loop 0 #{composed_file_paths} #{temporary_radar_gif.path}"
25
+ temporary_image_files.each(&:unlink)
26
+
27
+ imgur_gateway = ImgurGateway.new(filename: temporary_radar_gif.path)
28
+ if imgur_gateway.upload
29
+ temporary_radar_gif.unlink
30
+ imgur_gateway.url
31
+ else
32
+ 'http://bit.ly/1OrtWKX'
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def self.raindar_url
39
+ "http://m.bom.gov.au/radar/"
40
+ end
41
+
42
+ def self.raindar_image_json_url(radar_code)
43
+ "#{raindar_url}#{radar_code}.T.filenames.json"
44
+ end
45
+
46
+ def self.raindar_url_for(radar_image)
47
+ raindar_url + radar_image
48
+ end
49
+
50
+ def self.most_recent_radar_image_json(radar_code)
51
+ HTTParty.get(raindar_image_json_url(radar_code)).response.body
52
+ end
53
+
54
+ def self.recent_image_filenames(radar_code)
55
+ JSON.parse(most_recent_radar_image_json(radar_code))["image_files"].values
56
+ end
57
+
58
+ end
@@ -0,0 +1,36 @@
1
+ require 'tempfile'
2
+
3
+ class TemplateGenerator
4
+
5
+ def self.template(radar_code)
6
+ temporary_template = Tempfile.new(['temp_named_template', '.png'])
7
+
8
+ system "convert -layers flatten #{background(radar_code)} #{topography(radar_code)} #{range(radar_code)} #{locations(radar_code)} #{temporary_template.path}"
9
+
10
+ temporary_template.path
11
+
12
+ end
13
+
14
+ private
15
+
16
+ def self.template_url(radar_code)
17
+ "http://ws.cdn.bom.gov.au/products/radar_transparencies/#{radar_code}"
18
+ end
19
+
20
+ def self.background(radar_code)
21
+ "#{template_url(radar_code)}.background.png"
22
+ end
23
+
24
+ def self.topography(radar_code)
25
+ "#{template_url(radar_code)}.topography.png"
26
+ end
27
+
28
+ def self.range(radar_code)
29
+ "#{template_url(radar_code)}.range.png"
30
+ end
31
+
32
+ def self.locations(radar_code)
33
+ "#{template_url(radar_code)}.locations.png"
34
+ end
35
+
36
+ end
@@ -0,0 +1,17 @@
1
+ require 'redis'
2
+ require_relative "radar_generator"
3
+
4
+ class UrlCache
5
+ REDIS = Redis.new(url: URI.parse(ENV["REDISTOGO_URL"] || "redis://127.0.0.1"))
6
+ CACHE_EXPIRY = 300 # seconds
7
+
8
+ def self.cached_radar_url(radar_code)
9
+ radar_url = REDIS.get("#{radar_code}_gif")
10
+ unless radar_url
11
+ radar_url = RadarGenerator.gif(radar_code)
12
+ REDIS.set("#{radar_code}_gif", radar_url, ex: CACHE_EXPIRY)
13
+ end
14
+ radar_url
15
+ end
16
+
17
+ end
metadata ADDED
@@ -0,0 +1,149 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lita-raindar
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Eleanor Kiefel Haggerty
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-03-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: httparty
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: imgur-api
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: lita
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: redis
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Response is limited to locations around Australia that have a radar
112
+ email:
113
+ - eleanorakh@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - lib/imgur_gateway.rb
119
+ - lib/lita-raindar.rb
120
+ - lib/radar_generator.rb
121
+ - lib/template_generator.rb
122
+ - lib/url_cache.rb
123
+ homepage: https://github.com/eleanorakh/raindar.git
124
+ licenses:
125
+ - MIT
126
+ metadata:
127
+ lita_plugin_type: handler
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ requirements: []
143
+ rubyforge_project:
144
+ rubygems_version: 2.5.1
145
+ signing_key:
146
+ specification_version: 4
147
+ summary: A slackbot that posts a GIF of the most recent weather radar of a given location
148
+ in Australia
149
+ test_files: []