lita-raindar 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/imgur_gateway.rb +29 -0
- data/lib/lita-raindar.rb +79 -0
- data/lib/radar_generator.rb +58 -0
- data/lib/template_generator.rb +36 -0
- data/lib/url_cache.rb +17 -0
- metadata +149 -0
checksums.yaml
ADDED
@@ -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
|
data/lib/lita-raindar.rb
ADDED
@@ -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
|
data/lib/url_cache.rb
ADDED
@@ -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: []
|