lita-onewheel-aqi 0.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.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.travis.yml +8 -0
- data/Gemfile +3 -0
- data/README.rst +39 -0
- data/Rakefile +6 -0
- data/lib/lita/handlers/onewheel_aqi.rb +94 -0
- data/lib/lita-onewheel-aqi.rb +12 -0
- data/lita-onewheel-aqi.gemspec +31 -0
- data/locales/en.yml +4 -0
- data/spec/lita/handlers/onewheel_aqi_spec.rb +4 -0
- data/spec/spec_helper.rb +14 -0
- data/templates/.gitkeep +0 -0
- metadata +199 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d355e45af5fc8775a7c08939f7c81a63f59084da
|
4
|
+
data.tar.gz: 051780599d1e0888967cf907ba8346bbe704d2a5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3ec765efe29f4ee61d90b6573e3882c2fb3fd32233783cf54965f8d0a6ecba592e6261ec61c9cd9af3d5e97dff79788583c6917ba100ca3cb6471d4e1593a261
|
7
|
+
data.tar.gz: dd2ce1ed30034365359412947d157f56651ac009d8b1a47f6f26a5c40976062b9aae3878492bfb07e1a07413dad931e1de985770466d419a94ad2ffd2120b6d0
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.rst
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
lita-onewheel-aqi
|
2
|
+
=================
|
3
|
+
|
4
|
+
.. image:: https://coveralls.io/repos/onewheelskyward/lita-onewheel-aqi/badge.svg?branch=master&service=github :target: https://coveralls.io/github/onewheelskyward/lita-onewheel-aqi?branch=master
|
5
|
+
.. image:: https://travis-ci.org/onewheelskyward/lita-onewheel-aqi.svg?branch=master :target: https://travis-ci.org/onewheelskyward/lita-onewheel-aqi
|
6
|
+
|
7
|
+
I built this on a plane on day where wildfire smoke had caused Portland, OR's air quality to be worse than Hong Kong's.
|
8
|
+
The data is a little spotty, but it worked good enough for an hour at the stick.
|
9
|
+
|
10
|
+
http://airnowapi.org/aq101
|
11
|
+
|
12
|
+
http://airnowapi.org/webservices
|
13
|
+
|
14
|
+
http://airnowapi.org/forecastsbylatlon/docs
|
15
|
+
|
16
|
+
Installation
|
17
|
+
============
|
18
|
+
Add lita-onewheel-aqi to your Lita instance's Gemfile:
|
19
|
+
|
20
|
+
``` ruby
|
21
|
+
gem 'lita-onewheel-aqi'
|
22
|
+
```
|
23
|
+
|
24
|
+
Configuration
|
25
|
+
=============
|
26
|
+
|
27
|
+
Add your API key to your lita_config.rb:
|
28
|
+
|
29
|
+
`config.handlers.onewheel_aqi.api_key`
|
30
|
+
|
31
|
+
It can be procured here: http://airnowapi.org/account/request/
|
32
|
+
|
33
|
+
Usage
|
34
|
+
=====
|
35
|
+
|
36
|
+
bot: aqi Portland, OR
|
37
|
+
|
38
|
+
^^ should return your PM2.5 number.
|
39
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'geocoder'
|
2
|
+
require 'rest-client'
|
3
|
+
|
4
|
+
module Lita
|
5
|
+
module Handlers
|
6
|
+
class OnewheelAqi < Handler
|
7
|
+
config :api_key
|
8
|
+
config :distance
|
9
|
+
|
10
|
+
route /^aqi (.*)/i,
|
11
|
+
:get_aqi,
|
12
|
+
command: true,
|
13
|
+
help: "!aqi [location] gives you available data for air quality (PM2.5) forecast and latest observation."
|
14
|
+
|
15
|
+
def get_aqi(response)
|
16
|
+
loc = geo_lookup(response.matches[0][0])
|
17
|
+
puts loc.inspect
|
18
|
+
|
19
|
+
parameters = {
|
20
|
+
latitude: loc[:lat],
|
21
|
+
longitude: loc[:lng],
|
22
|
+
api_key: config.api_key,
|
23
|
+
format: 'application/json'
|
24
|
+
}
|
25
|
+
|
26
|
+
query_string = (parameters.map { |k, v| "#{k}=#{v}" }).join "&"
|
27
|
+
forecast_response = RestClient.get('http://airnowapi.org/aq/forecast/latLong/?' + query_string)
|
28
|
+
forecasted_aqi = JSON.parse(forecast_response)
|
29
|
+
Lita.logger.debug "Forecast response: " + forecasted_aqi.inspect
|
30
|
+
|
31
|
+
observed_response = RestClient.get('http://airnowapi.org/aq/observation/latLong/current/?' + query_string)
|
32
|
+
observed_aqi = JSON.parse(observed_response)
|
33
|
+
Lita.logger.debug "Observed response: " + observed_aqi.inspect
|
34
|
+
|
35
|
+
if forecasted_aqi.nil? and observed_aqi.nil?
|
36
|
+
response.reply "No AQI data for #{loc[:name]}."
|
37
|
+
Lita.logger.info "No data found for #{response.matches[0][0]}"
|
38
|
+
return
|
39
|
+
end
|
40
|
+
|
41
|
+
# [{"DateObserved":"2015-08-23 ","HourObserved":14,"LocalTimeZone":"PST","ReportingArea":"Portland","StateCode":"OR","Latitude":45.538,"Longitude":-122.656,"ParameterName":"O3","AQI":49,"Category":{"Number":1,"Name":"Good"}},{"DateObserved":"2015-08-23 ","HourObserved":14,"LocalTimeZone":"PST","ReportingArea":"Portland","StateCode":"OR","Latitude":45.538,"Longitude":-122.656,"ParameterName":"PM2.5","AQI":167,"Category":{"Number":4,"Name":"Unhealthy"}}]
|
42
|
+
# todo: extract today's forecast, not tomorrow's.
|
43
|
+
forecasted_aqi = extract_pmtwofive(forecasted_aqi)
|
44
|
+
observed_aqi = extract_pmtwofive(observed_aqi)
|
45
|
+
|
46
|
+
reply = "AQI for #{loc[:name]}, "
|
47
|
+
unless forecasted_aqi == []
|
48
|
+
reply += "Forecasted: #{(forecasted_aqi['ActionDay'] == 'true')? 'Action Day! ' : ''}#{forecasted_aqi['AQI']} #{forecasted_aqi['Category']['Name']} "
|
49
|
+
end
|
50
|
+
unless observed_aqi == []
|
51
|
+
reply += "Observed: #{observed_aqi['AQI']} #{observed_aqi['Category']['Name']} at #{observed_aqi['DateObserved']}#{observed_aqi['HourObserved']}00 hours."
|
52
|
+
end
|
53
|
+
response.reply reply
|
54
|
+
end
|
55
|
+
|
56
|
+
def extract_pmtwofive(aqi)
|
57
|
+
returned_aqi = aqi
|
58
|
+
aqi.each do |a|
|
59
|
+
if a['ParameterName'] == 'PM2.5'
|
60
|
+
returned_aqi = a
|
61
|
+
end
|
62
|
+
end
|
63
|
+
returned_aqi
|
64
|
+
end
|
65
|
+
|
66
|
+
# Geographical stuffs
|
67
|
+
# Now with less caching!
|
68
|
+
def optimistic_geo_wrapper(query)
|
69
|
+
geocoded = nil
|
70
|
+
result = ::Geocoder.search(query)
|
71
|
+
if result[0]
|
72
|
+
geocoded = result[0].data
|
73
|
+
end
|
74
|
+
geocoded
|
75
|
+
end
|
76
|
+
|
77
|
+
def geo_lookup(query)
|
78
|
+
geocoded = optimistic_geo_wrapper query
|
79
|
+
|
80
|
+
if (query.nil? or query.empty?) and geocoded.nil?
|
81
|
+
query = 'Portland, OR'
|
82
|
+
end
|
83
|
+
|
84
|
+
{name: geocoded['formatted_address'],
|
85
|
+
lat: geocoded['geometry']['location']['lat'],
|
86
|
+
lng: geocoded['geometry']['location']['lng']
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
Lita.register_handler(OnewheelAqi)
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require "lita"
|
2
|
+
|
3
|
+
Lita.load_locales Dir[File.expand_path(
|
4
|
+
File.join("..", "..", "locales", "*.yml"), __FILE__
|
5
|
+
)]
|
6
|
+
|
7
|
+
require "lita/handlers/onewheel_aqi"
|
8
|
+
|
9
|
+
Lita::Handlers::OnewheelAqi.template_root File.expand_path(
|
10
|
+
File.join("..", "..", "templates"),
|
11
|
+
__FILE__
|
12
|
+
)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = 'lita-onewheel-aqi'
|
3
|
+
spec.version = '0.0.0'
|
4
|
+
spec.authors = ['Andrew Kreps']
|
5
|
+
spec.email = ['andrew.kreps@gmail.com']
|
6
|
+
spec.description = 'AQI data retrival bot'
|
7
|
+
spec.summary = 'Reads the current AQI from aqinowapi.org and displays it.'
|
8
|
+
spec.homepage = 'https://github.com/onewheelskyward/lita-onewheel-aqi'
|
9
|
+
spec.license = 'MIT'
|
10
|
+
spec.metadata = { 'lita_plugin_type' => 'handler'}
|
11
|
+
|
12
|
+
spec.files = `git ls-files`.split($/)
|
13
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
14
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
15
|
+
spec.require_paths = ['lib']
|
16
|
+
|
17
|
+
spec.add_runtime_dependency 'lita', '~> 4.4'
|
18
|
+
|
19
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
20
|
+
# spec.add_development_dependency 'pry-byebug', '~> 3.1'
|
21
|
+
spec.add_development_dependency 'rake', '~> 10.4'
|
22
|
+
spec.add_development_dependency 'rack-test', '~> 0.6'
|
23
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
24
|
+
|
25
|
+
spec.add_runtime_dependency 'geocoder', '~> 1.2'
|
26
|
+
spec.add_runtime_dependency 'multi_json', '~> 1.11'
|
27
|
+
spec.add_runtime_dependency 'rest-client', '~> 1.8'
|
28
|
+
|
29
|
+
spec.add_development_dependency 'simplecov', '~> 0.10'
|
30
|
+
spec.add_development_dependency 'coveralls', '~> 0.8'
|
31
|
+
end
|
data/locales/en.yml
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "simplecov"
|
2
|
+
require "coveralls"
|
3
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
4
|
+
SimpleCov::Formatter::HTMLFormatter,
|
5
|
+
Coveralls::SimpleCov::Formatter
|
6
|
+
]
|
7
|
+
SimpleCov.start { add_filter "/spec/" }
|
8
|
+
|
9
|
+
require "lita-onewheel-aqi"
|
10
|
+
require "lita/rspec"
|
11
|
+
|
12
|
+
# A compatibility mode is provided for older plugins upgrading from Lita 3. Since this plugin
|
13
|
+
# was generated with Lita 4, the compatibility mode should be left disabled.
|
14
|
+
Lita.version_3_compatibility_mode = false
|
data/templates/.gitkeep
ADDED
File without changes
|
metadata
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lita-onewheel-aqi
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andrew Kreps
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-10-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: lita
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.4'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.4'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.4'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.4'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rack-test
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.6'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.6'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: geocoder
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.2'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.2'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: multi_json
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.11'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.11'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rest-client
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.8'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.8'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: simplecov
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0.10'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0.10'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: coveralls
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0.8'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0.8'
|
153
|
+
description: AQI data retrival bot
|
154
|
+
email:
|
155
|
+
- andrew.kreps@gmail.com
|
156
|
+
executables: []
|
157
|
+
extensions: []
|
158
|
+
extra_rdoc_files: []
|
159
|
+
files:
|
160
|
+
- ".gitignore"
|
161
|
+
- ".travis.yml"
|
162
|
+
- Gemfile
|
163
|
+
- README.rst
|
164
|
+
- Rakefile
|
165
|
+
- lib/lita-onewheel-aqi.rb
|
166
|
+
- lib/lita/handlers/onewheel_aqi.rb
|
167
|
+
- lita-onewheel-aqi.gemspec
|
168
|
+
- locales/en.yml
|
169
|
+
- spec/lita/handlers/onewheel_aqi_spec.rb
|
170
|
+
- spec/spec_helper.rb
|
171
|
+
- templates/.gitkeep
|
172
|
+
homepage: https://github.com/onewheelskyward/lita-onewheel-aqi
|
173
|
+
licenses:
|
174
|
+
- MIT
|
175
|
+
metadata:
|
176
|
+
lita_plugin_type: handler
|
177
|
+
post_install_message:
|
178
|
+
rdoc_options: []
|
179
|
+
require_paths:
|
180
|
+
- lib
|
181
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
182
|
+
requirements:
|
183
|
+
- - ">="
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: '0'
|
186
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
|
+
requirements:
|
188
|
+
- - ">="
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: '0'
|
191
|
+
requirements: []
|
192
|
+
rubyforge_project:
|
193
|
+
rubygems_version: 2.4.5
|
194
|
+
signing_key:
|
195
|
+
specification_version: 4
|
196
|
+
summary: Reads the current AQI from aqinowapi.org and displays it.
|
197
|
+
test_files:
|
198
|
+
- spec/lita/handlers/onewheel_aqi_spec.rb
|
199
|
+
- spec/spec_helper.rb
|