lita-raindar 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []