zetabot 0.0.22 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +25 -14
- data/Zeta.gemspec +1 -0
- data/lib/Zeta/access.rb +6 -3
- data/lib/Zeta/plugins/russian_roulette.rb +14 -8
- data/lib/Zeta/plugins/snooper.rb +3 -3
- data/lib/Zeta/plugins/weather.rb +170 -99
- data/lib/Zeta/version.rb +1 -1
- metadata +16 -3
- data/lib/Zeta/plugins/libsecure.rb +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3a554bc48199494aa6031371fb243e7eec95e0a
|
4
|
+
data.tar.gz: 5ba2388b7dbb81343831c5023afc5c28bf463be8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 01db01f70640a77d5193f1fe6837188472439c10221cd67d7228538bc63a072fc4e7b7941626b7537ad52ca797975afd31ff4f91b6bf87d52ed56345519e7cb8
|
7
|
+
data.tar.gz: 3df65259b967710e7454a5ce87f926b72e8d46a3341974ed84b35e2091b3906b56ce20dac730517e03416a612f1c1251b30a4febafb64f432cf3a395b7fbba11
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
zetabot (0.0
|
4
|
+
zetabot (1.0.0)
|
5
5
|
actionview
|
6
6
|
chronic
|
7
7
|
chronic_duration
|
@@ -33,6 +33,7 @@ PATH
|
|
33
33
|
rest-client
|
34
34
|
tag_formatter
|
35
35
|
tzinfo
|
36
|
+
unitwise
|
36
37
|
video_info
|
37
38
|
wolfram
|
38
39
|
wolfram-alpha
|
@@ -79,8 +80,8 @@ GEM
|
|
79
80
|
concurrent-ruby (1.0.5)
|
80
81
|
crack (0.4.3)
|
81
82
|
safe_yaml (~> 1.0.0)
|
82
|
-
crass (1.0.
|
83
|
-
daemons (1.2.
|
83
|
+
crass (1.0.3)
|
84
|
+
daemons (1.2.5)
|
84
85
|
debugging (1.1.1)
|
85
86
|
binding.repl (~> 3.0)
|
86
87
|
paint (>= 0.9, < 3.0)
|
@@ -88,7 +89,7 @@ GEM
|
|
88
89
|
thread_safe (~> 0.3, >= 0.3.1)
|
89
90
|
destructor (0.1.0)
|
90
91
|
diff-lcs (1.3)
|
91
|
-
discourse_api (0.
|
92
|
+
discourse_api (0.19.0)
|
92
93
|
faraday (~> 0.9)
|
93
94
|
faraday_middleware (~> 0.10)
|
94
95
|
rack (>= 1.6)
|
@@ -109,13 +110,13 @@ GEM
|
|
109
110
|
faraday_middleware (0.12.2)
|
110
111
|
faraday (>= 0.7.4, < 1.0)
|
111
112
|
ffi (1.9.18)
|
112
|
-
geocoder (1.4.
|
113
|
+
geocoder (1.4.5)
|
113
114
|
gist (4.6.1)
|
114
|
-
github_api (0.18.
|
115
|
+
github_api (0.18.2)
|
115
116
|
addressable (~> 2.4)
|
116
117
|
descendants_tracker (~> 0.0.4)
|
117
118
|
faraday (~> 0.8)
|
118
|
-
hashie (>= 3.
|
119
|
+
hashie (~> 3.5, >= 3.5.2)
|
119
120
|
oauth2 (~> 1.0)
|
120
121
|
haml (5.0.4)
|
121
122
|
temple (>= 0.8.0)
|
@@ -128,13 +129,13 @@ GEM
|
|
128
129
|
httparty (0.15.6)
|
129
130
|
multi_xml (>= 0.5.2)
|
130
131
|
humanize-bytes (2.2.0)
|
131
|
-
i18n (0.9.
|
132
|
+
i18n (0.9.1)
|
132
133
|
concurrent-ruby (~> 1.0)
|
133
134
|
instance (0.2.0)
|
134
|
-
interactive_editor (0.0.
|
135
|
+
interactive_editor (0.0.11)
|
135
136
|
spoon (>= 0.0.1)
|
136
137
|
ipaddress (0.8.3)
|
137
|
-
irbtools (2.
|
138
|
+
irbtools (2.2.0)
|
138
139
|
binding.repl (~> 3.0)
|
139
140
|
clipboard (~> 1.1)
|
140
141
|
code (~> 0.9)
|
@@ -156,6 +157,7 @@ GEM
|
|
156
157
|
wirb (~> 2.0)
|
157
158
|
iso8601 (0.9.1)
|
158
159
|
jwt (1.5.6)
|
160
|
+
liner (0.2.4)
|
159
161
|
loofah (2.1.1)
|
160
162
|
crass (~> 1.0.2)
|
161
163
|
nokogiri (>= 1.5.9)
|
@@ -168,9 +170,11 @@ GEM
|
|
168
170
|
nokogiri (~> 1.6)
|
169
171
|
ntlm-http (~> 0.1, >= 0.1.1)
|
170
172
|
webrobots (>= 0.0.9, < 0.2)
|
173
|
+
memoizable (0.4.2)
|
174
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
171
175
|
method_locator (0.0.4)
|
172
176
|
method_source (0.9.0)
|
173
|
-
methodfinder (2.1.
|
177
|
+
methodfinder (2.1.1)
|
174
178
|
mime-types (3.1)
|
175
179
|
mime-types-data (~> 3.2015)
|
176
180
|
mime-types-data (3.2016.0521)
|
@@ -199,7 +203,8 @@ GEM
|
|
199
203
|
ruby-ll (~> 2.1)
|
200
204
|
ori (0.1.0)
|
201
205
|
os (1.0.0)
|
202
|
-
paint (2.0.
|
206
|
+
paint (2.0.1)
|
207
|
+
parslet (1.8.1)
|
203
208
|
pdf-reader (2.0.0)
|
204
209
|
Ascii85 (~> 1.0.0)
|
205
210
|
afm (~> 0.2.1)
|
@@ -207,7 +212,7 @@ GEM
|
|
207
212
|
ruby-rc4
|
208
213
|
ttfunk
|
209
214
|
persist (1.0.0)
|
210
|
-
public_suffix (3.0.
|
215
|
+
public_suffix (3.0.1)
|
211
216
|
rack (2.0.3)
|
212
217
|
rails-dom-testing (2.0.3)
|
213
218
|
activesupport (>= 4.2.0)
|
@@ -241,6 +246,7 @@ GEM
|
|
241
246
|
ruby_info (1.0.1)
|
242
247
|
ruby_version (1.0.1)
|
243
248
|
safe_yaml (1.0.4)
|
249
|
+
signed_multiset (0.2.1)
|
244
250
|
spoon (0.0.6)
|
245
251
|
ffi
|
246
252
|
tag_formatter (0.0.3)
|
@@ -249,12 +255,17 @@ GEM
|
|
249
255
|
tilt (2.0.8)
|
250
256
|
time-lord (1.0.1)
|
251
257
|
ttfunk (1.5.1)
|
252
|
-
tzinfo (1.2.
|
258
|
+
tzinfo (1.2.4)
|
253
259
|
thread_safe (~> 0.1)
|
254
260
|
unf (0.1.4)
|
255
261
|
unf_ext
|
256
262
|
unf_ext (0.0.7.4)
|
257
263
|
unicode-display_width (1.3.0)
|
264
|
+
unitwise (2.2.0)
|
265
|
+
liner (~> 0.2)
|
266
|
+
memoizable (~> 0.4)
|
267
|
+
parslet (~> 1.5)
|
268
|
+
signed_multiset (~> 0.2)
|
258
269
|
video_info (2.7)
|
259
270
|
iso8601 (~> 0.9.1)
|
260
271
|
net_http_timeout_errors (~> 0.3.0)
|
data/Zeta.gemspec
CHANGED
data/lib/Zeta/access.rb
CHANGED
@@ -30,9 +30,12 @@ module Cinch
|
|
30
30
|
|
31
31
|
# Oper Overide
|
32
32
|
if Config.oper_overide
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
# Do Not overide in #services
|
34
|
+
unless channel.to_s == "#services"
|
35
|
+
if user.oper
|
36
|
+
user.refresh
|
37
|
+
return true
|
38
|
+
end
|
36
39
|
end
|
37
40
|
end
|
38
41
|
|
@@ -34,8 +34,8 @@ module Plugins
|
|
34
34
|
match 'rr', method: :russian
|
35
35
|
|
36
36
|
def russian(m)
|
37
|
-
#return m.reply "I am sorry comrade, but I do not have pistol on me." unless
|
38
|
-
|
37
|
+
# return m.reply "I am sorry comrade, but I do not have pistol on me." unless m.channel.ops.include?(@bot)
|
38
|
+
return m.user.notice "Sorry comrade, but there is already game going on." if @games.include?(m.channel.name)
|
39
39
|
|
40
40
|
# player setup
|
41
41
|
player = m.user
|
@@ -47,7 +47,9 @@ module Plugins
|
|
47
47
|
@games << m.channel.name
|
48
48
|
|
49
49
|
turns, round_location = Array.new(2) { |i| Random.new.rand(1..6) }
|
50
|
-
m.channel.action "
|
50
|
+
m.channel.action "takes #{player.nick} into the back room for a #{turns} turn game"
|
51
|
+
m.action_reply "pulls out her pistol"
|
52
|
+
# m.channel.action "starts a %d-turn game of Russian Roulette with %s." % [turns, player.nick]
|
51
53
|
|
52
54
|
phrases = PHRASES.dup.shuffle
|
53
55
|
|
@@ -56,20 +58,24 @@ module Plugins
|
|
56
58
|
turns.times do |chamber|
|
57
59
|
return end_game(m.channel, true) unless m.channel.users.include?(player)
|
58
60
|
if round_location == chamber.succ
|
59
|
-
|
61
|
+
player.notice "*click*"
|
60
62
|
sleep 5
|
61
63
|
m.channel.kick(player, "*BLAM*")
|
62
|
-
m.
|
63
|
-
m.channel.action "watches %s's brain splatter across the wall." % player.nick
|
64
|
+
m.channel.action "walks back into the room *Alone*"
|
64
65
|
break
|
65
66
|
else
|
66
67
|
phrase = phrases.pop
|
67
|
-
|
68
|
+
player.notice "*click* %s" % phrase
|
68
69
|
end
|
69
70
|
sleep 5
|
70
71
|
end
|
71
72
|
|
72
|
-
|
73
|
+
if turns < round_location
|
74
|
+
m.channel.action "walks back into the room with #{player}"
|
75
|
+
m.reply "Looks like you get to live another day."
|
76
|
+
m.channel.voice(player) # Voice the player because they survived
|
77
|
+
end
|
78
|
+
|
73
79
|
sleep 1 if turns < round_location
|
74
80
|
end_game(m.channel)
|
75
81
|
end
|
data/lib/Zeta/plugins/snooper.rb
CHANGED
@@ -140,9 +140,9 @@ module Plugins
|
|
140
140
|
msg.reply("‡ #{node.text.lstrip.gsub(/\r|\n|\n\r/, ' ')[0..300]}")
|
141
141
|
end
|
142
142
|
|
143
|
-
if node = html.at_xpath('html/head/meta[@name="description"]')
|
144
|
-
|
145
|
-
end
|
143
|
+
# if node = html.at_xpath('html/head/meta[@name="description"]')
|
144
|
+
# msg.reply("» #{node[:content].lines.first(3).join.gsub(/\r|\n|\n\r/, ' ')[0..300]}")
|
145
|
+
# end
|
146
146
|
|
147
147
|
info "[200] #{msg.user} - #{url}"
|
148
148
|
rescue Timeout::Error
|
data/lib/Zeta/plugins/weather.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
require 'ostruct'
|
2
2
|
require 'persist'
|
3
|
+
require 'open-uri'
|
4
|
+
require 'json'
|
5
|
+
require 'unitwise'
|
3
6
|
|
4
7
|
module Plugins
|
5
8
|
# Forecast is a Cinch plugin for getting the weather forecast.
|
@@ -15,7 +18,6 @@ module Plugins
|
|
15
18
|
help: "Get the Weather?.\nUsage: `?weather`\nUsage: `?wx zip` `?w zip` `?setw zip` `?forecast zip`",
|
16
19
|
)
|
17
20
|
|
18
|
-
match /forecast (.+)/, method: :forecast
|
19
21
|
match /w (.+)/, method: :weather
|
20
22
|
match 'w', method: :weather
|
21
23
|
match /setw (.+)/, method: :set_location
|
@@ -26,61 +28,61 @@ module Plugins
|
|
26
28
|
|
27
29
|
#####
|
28
30
|
def initialize(*args)
|
29
|
-
@
|
31
|
+
@api_src = %w{wu noaa darksky owm}
|
32
|
+
@store = Persist.new(File.join(Dir.home, '.zeta', 'cache', 'weather.pstore'))
|
30
33
|
super
|
31
34
|
end
|
32
35
|
|
33
|
-
# ?forecast <location>
|
34
|
-
def forecast(msg, query)
|
35
|
-
location = geolookup(query)
|
36
|
-
return msg.reply "No results found for #{query}." if location.nil?
|
37
|
-
|
38
|
-
data = get_conditions(location)
|
39
|
-
return msg.reply 'Problem getting data. Try again later.' if data.nil?
|
40
|
-
|
41
|
-
msg.user.msg(weather_summary(data))
|
42
|
-
end
|
43
|
-
|
44
36
|
# ?w <location>
|
45
37
|
def weather(msg, query=nil)
|
38
|
+
# Pull data source and scrub query
|
39
|
+
# Lookup user from pstore
|
46
40
|
if !@store[msg.user.to_s].nil? && query.nil?
|
47
|
-
|
41
|
+
stored_location, stored_source = @store[msg.user.to_s].split('::')
|
42
|
+
stored_source = @api_src.include?(stored_source) ? stored_source : 'wu'
|
43
|
+
data = send("#{stored_source}_src", stored_location)
|
44
|
+
# location = geolookup(@store[msg.user.to_s])
|
45
|
+
# data = wunderground_src(stored_location, false)
|
48
46
|
elsif query.nil?
|
49
|
-
return msg.reply 'No location set. ?setw <location>'
|
47
|
+
return msg.reply 'No location set. ?setw <location> :(wu|darkscy|noaa|apixu|owm)'
|
50
48
|
else
|
51
|
-
|
49
|
+
# data = wu_src(query, true)
|
50
|
+
src = query[/:\w+/].gsub(/:/, '') if query[/:\w+/]
|
51
|
+
query = query.gsub(/:\w+/, '').strip if query
|
52
|
+
true_src = @api_src.include?(src) ? src : 'wu'
|
53
|
+
data = send("#{true_src}_src", query)
|
52
54
|
end
|
53
|
-
return msg.reply "No results found for #{query}." if
|
54
|
-
|
55
|
-
data
|
56
|
-
return msg.reply 'Problem getting data. Try again later.' if data.nil?
|
57
|
-
|
58
|
-
#[ Clarkston, WA, United States | Cloudy | Temp: 34 F (1 C) | Humidity: 73% | Winds: 8 mph ]
|
59
|
-
reply_data = "∴ #{data.county}, #{data.country} " \
|
60
|
-
"≈ #{data.weather} #{data.temperature} " \
|
61
|
-
"≈ Feels like #{data.feels_like} " \
|
62
|
-
"≈ Humidity: #{data.relative_humidity} " \
|
63
|
-
"≈ Pressure: #{data.pressure_in} psi (#{data.pressure_mb} mb) " \
|
64
|
-
"≈ Wind: #{data.wind} ≈ Alerts: #{data.alerts} ∴"
|
65
|
-
msg.reply(reply_data)
|
55
|
+
# return msg.reply "No results found for #{query}." if data.nil?
|
56
|
+
# return msg.reply 'Problem getting data. Try again later.' if data.nil?
|
57
|
+
msg.reply(data.reply)
|
66
58
|
end
|
67
59
|
|
68
60
|
# ?setw <location>
|
69
|
-
def set_location(msg,query)
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
61
|
+
def set_location(msg, query)
|
62
|
+
# Establish source
|
63
|
+
src = query[/:\w+/].gsub(/:/, '') if query[/:\w+/]
|
64
|
+
query = query.gsub(/:\w+/, '').strip if query
|
65
|
+
|
66
|
+
# Sanity Check
|
67
|
+
true_src = @api_src.include?(src) ? src : 'wu'
|
68
|
+
data = send("#{true_src}_src", query)
|
69
|
+
|
70
|
+
# Error
|
71
|
+
return msg.reply "No results found for #{query}." if data.nil?
|
72
|
+
|
73
|
+
# Store and display general location
|
74
|
+
serial_location = "#{query}::#{src}"
|
75
|
+
@store[msg.user.to_s] = serial_location unless data.nil?
|
76
|
+
msg.reply "Your location is now set to #{data.ac.name}, #{data.ac.c}!"
|
75
77
|
end
|
76
78
|
|
77
79
|
# ?hurricane
|
78
80
|
def hurricane(msg)
|
79
81
|
url = URI.encode "http://api.wunderground.com/api/#{Zsec.wunderground}/currenthurricane/view.json"
|
80
82
|
location = JSON.parse(
|
81
|
-
|
82
|
-
|
83
|
-
|
83
|
+
# RestClient.get(url)
|
84
|
+
open(url).read
|
85
|
+
)
|
84
86
|
return msg.reply "No results found for #{query}." if location.nil?
|
85
87
|
reply_msg = "∴ #{location['currenthurricane'][0]['stormInfo']['stormName_Nice']} " \
|
86
88
|
"(#{location['currenthurricane'][0]['stormInfo']['stormNumber']}) "\
|
@@ -94,13 +96,13 @@ module Plugins
|
|
94
96
|
end
|
95
97
|
|
96
98
|
# ?almanac <location>
|
97
|
-
def almanac(msg,locale)
|
98
|
-
autocomplete = JSON.parse(
|
99
|
+
def almanac(msg, locale)
|
100
|
+
autocomplete = JSON.parse(open(URI.encode("http://autocomplete.wunderground.com/aq?query=#{locale}")).read)
|
99
101
|
url = URI.encode("http://api.wunderground.com/api/#{Config.secrets[:wunderground]}/almanac/#{autocomplete['RESULTS'][0]['l']}.json")
|
100
102
|
location = JSON.parse(
|
101
|
-
|
102
|
-
|
103
|
-
|
103
|
+
# RestClient.get(url)
|
104
|
+
open(url).read
|
105
|
+
)
|
104
106
|
return msg.reply "No results found for #{query}." if location.nil?
|
105
107
|
|
106
108
|
time = Time.now()
|
@@ -130,70 +132,139 @@ module Plugins
|
|
130
132
|
|
131
133
|
|
132
134
|
# -private
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
135
|
+
private
|
136
|
+
#### Weather Sources
|
137
|
+
# Weather Underground - https://wunderground.com
|
138
|
+
def wu_src(location)
|
139
|
+
# Fuzzy location lookup
|
140
|
+
ac = JSON.parse(
|
141
|
+
open(URI.encode("https://autocomplete.wunderground.com/aq?query=#{location}")).read,
|
142
|
+
object_class: OpenStruct
|
143
|
+
)
|
144
|
+
ac = ac.RESULTS[0]
|
145
|
+
geolookup = JSON.parse(
|
146
|
+
open(URI.encode("https://api.wunderground.com/api/#{Config.secrets[:wunderground]}/geolookup/#{ac.l}.json")).read,
|
147
|
+
object_class: OpenStruct
|
148
|
+
).location.l rescue nil
|
149
|
+
# Get Data
|
150
|
+
data = JSON.parse(
|
151
|
+
open("https://api.wunderground.com/api/#{Config.secrets[:wunderground]}/alerts/conditions#{geolookup}.json").read,
|
152
|
+
object_class: OpenStruct
|
138
153
|
)
|
139
|
-
|
140
|
-
|
141
|
-
|
154
|
+
|
155
|
+
debug "DATA: #{data}"
|
156
|
+
data.ac = ac
|
157
|
+
current = data.current_observation
|
158
|
+
alerts = data.alerts.empty? ? 'none' : data.alerts.map {|l| l['type']}.join(',')
|
159
|
+
pressure_si = current.pressure_mb.to_i / 10
|
160
|
+
|
161
|
+
data.reply = "WU ∴ #{ac.name}, #{ac.c} " \
|
162
|
+
"≈ #{current.weather} #{current.temperature_string} " \
|
163
|
+
"≈ Feels like #{current.feelslike_string} " \
|
164
|
+
"≈ Humidity: #{current.relative_humidity} " \
|
165
|
+
"≈ Pressure: #{current.pressure_in} psi (#{pressure_si} kPa) " \
|
166
|
+
"≈ Wind: #{current.wind_string} ≈ Alerts: #{alerts} ∴"
|
167
|
+
return data
|
168
|
+
# rescue
|
169
|
+
# return nil
|
142
170
|
end
|
143
171
|
|
144
|
-
|
172
|
+
# Open Weather map - https://openweathermap.org/api
|
173
|
+
def owm_src(location)
|
174
|
+
ac = JSON.parse(
|
175
|
+
open(URI.encode("https://autocomplete.wunderground.com/aq?query=#{location}")).read,
|
176
|
+
object_class: OpenStruct
|
177
|
+
)
|
178
|
+
ac = ac.RESULTS[0]
|
145
179
|
data = JSON.parse(
|
146
|
-
open(
|
180
|
+
open(
|
181
|
+
URI.encode("https://api.openweathermap.org/data/2.5/weather?lat=#{ac.lat}&lon=#{ac.lon}&APPID=#{Config.secrets[:owm]}")
|
182
|
+
).read,
|
183
|
+
object_class: OpenStruct
|
184
|
+
)
|
185
|
+
|
186
|
+
temp = Unitwise(data.main.temp, 'K') # Data is given in kelvin
|
187
|
+
pressure = Unitwise(data.main.pressure, '[psi]')
|
188
|
+
wind = Unitwise(data.wind.speed, 'kilometer')
|
189
|
+
|
190
|
+
data.reply = "OWM ∴ #{ac.name}, #{ac.c} " \
|
191
|
+
"≈ #{data.weather[0].description}, #{temp.convert_to('[degF]').to_i.round(2)} F (#{temp.convert_to('Cel').to_i.round(2)} C) " \
|
192
|
+
"≈ Humidity: #{data.main.humidity}% " \
|
193
|
+
"≈ Pressure: #{pressure.to_i.round(2)} psi (#{pressure.convert_to('kPa').to_i.round(2)} kPa) " \
|
194
|
+
"≈ Wind: #{wind.convert_to('mile').to_i.round(2)} mph (#{wind.to_i.round(2)} km/h) ∴"
|
195
|
+
|
196
|
+
return data
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
# DarkSky - https://darksky.net/dev
|
201
|
+
def darksky_src(location)
|
202
|
+
ac = JSON.parse(
|
203
|
+
open(URI.encode("https://autocomplete.wunderground.com/aq?query=#{location}")).read,
|
204
|
+
object_class: OpenStruct
|
147
205
|
)
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
country: location_data['country'],
|
155
|
-
|
156
|
-
lat: location_data['latitude'],
|
157
|
-
lng: location_data['longitude'],
|
158
|
-
|
159
|
-
observation_time: current['observation_time'],
|
160
|
-
weather: current['weather'],
|
161
|
-
temp_fahrenheit: current['temp_f'],
|
162
|
-
temp_celcius: current['temp_c'],
|
163
|
-
temperature: current['temperature_string'],
|
164
|
-
relative_humidity: current['relative_humidity'],
|
165
|
-
feels_like: current['feelslike_string'],
|
166
|
-
uv_level: current['UV'],
|
167
|
-
|
168
|
-
wind: current['wind_string'],
|
169
|
-
wind_direction: current['wind_dir'],
|
170
|
-
wind_degrees: current['wind_degrees'],
|
171
|
-
wind_mph: current['wind_mph'],
|
172
|
-
wind_gust_mph: current['wind_gust_mph'],
|
173
|
-
wind_kph: current['wind_kph'],
|
174
|
-
pressure_in: current['pressure_in'],
|
175
|
-
pressure_mb: current['pressure_mb'],
|
176
|
-
|
177
|
-
alerts: alerts,
|
178
|
-
|
179
|
-
forecast_url: current['forecast_url']
|
206
|
+
ac = ac.RESULTS[0]
|
207
|
+
data = JSON.parse(
|
208
|
+
open(
|
209
|
+
URI.encode("https://api.darksky.net/forecast/#{Config.secrets[:darksky]}/#{ac.lat},#{ac.lon}")
|
210
|
+
).read,
|
211
|
+
object_class: OpenStruct
|
180
212
|
)
|
181
|
-
|
182
|
-
|
213
|
+
data.ac = ac
|
214
|
+
current = data.currently
|
215
|
+
alerts = data.alerts.count rescue 0
|
216
|
+
c = Unitwise(current.temperature, '[degF]').convert_to('Cel').to_i
|
217
|
+
c_feels = Unitwise(current.apparentTemperature, '[degF]').convert_to('Cel').to_i
|
218
|
+
p = Unitwise(current.pressure, '[psi]').convert_to('kPa').to_i
|
219
|
+
gusts = Unitwise(current.windGust, 'mile').convert_to('kilometer').to_i
|
220
|
+
|
221
|
+
tempstring = "#{current.temperature.to_i} F (#{c} C)"
|
222
|
+
feelslike = "#{current.apparentTemperature.to_i} F (#{c_feels} C)"
|
223
|
+
|
224
|
+
data.reply = "DS ∴ #{ac.name}, #{ac.c} " \
|
225
|
+
"≈ #{current.summary} #{tempstring} " \
|
226
|
+
"≈ Feels like #{feelslike} " \
|
227
|
+
"≈ Humidity: #{current.relative_humidity} " \
|
228
|
+
"≈ Pressure: #{current.pressure} psi (#{p} kPa) " \
|
229
|
+
"≈ Wind: gusts upto #{current.windGust} mph (#{gusts} km/h) ≈ Alerts: #{alerts} ∴"
|
230
|
+
|
231
|
+
return data
|
232
|
+
# rescue
|
233
|
+
# return nil
|
183
234
|
end
|
184
235
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
236
|
+
# NOAA - https://graphical.weather.gov/xml/
|
237
|
+
def noaa_src(location)
|
238
|
+
ac = JSON.parse(
|
239
|
+
open(URI.encode("https://autocomplete.wunderground.com/aq?query=#{location}")).read,
|
240
|
+
object_class: OpenStruct
|
241
|
+
)
|
242
|
+
ac = ac.RESULTS[0]
|
243
|
+
stations = JSON.parse(
|
244
|
+
open(URI.encode("https://api.weather.gov/points/#{ac.lat},#{ac.lon}/stations/")).read)
|
245
|
+
parsed = JSON.parse(
|
246
|
+
open(URI.encode("#{stations['observationStations'][0]}/observations/current")).read,
|
247
|
+
object_class: OpenStruct
|
248
|
+
)
|
249
|
+
|
250
|
+
data = parsed.properties
|
251
|
+
data.ac = ac
|
252
|
+
f = data.temperature.value * 9/5
|
253
|
+
temp = "#{f.round(2)} F (#{data.temperature.value.to_i.round(2)} C) "
|
254
|
+
wind = "Gusts: #{data.windGust.value} avg: #{data.windSpeed.value.to_i.round(2)}"
|
255
|
+
feelslike = "#{data.windChill.value.to_i.round(2)} C"
|
256
|
+
pressure_in = ((data.barometricPressure.value.to_i * 0.00014503773773) * 100).round(2)
|
257
|
+
pressure = (data.barometricPressure.value.to_i / 100).round(2)
|
258
|
+
|
259
|
+
data.reply = "NOAA ∴ #{ac.name} " \
|
260
|
+
"≈ #{data.textDescription} #{temp} " \
|
261
|
+
"≈ Feels like #{feelslike} " \
|
262
|
+
"≈ Humidity: #{data.relativeHumidity.value.round(2)} " \
|
263
|
+
"≈ Pressure: #{pressure_in} psi (#{pressure} kPa) " \
|
264
|
+
"≈ Wind: #{wind} ≈ Alerts: ∴"
|
265
|
+
return data
|
266
|
+
# rescue
|
267
|
+
# data.reply = "Error fetching data"
|
197
268
|
end
|
198
269
|
|
199
270
|
end
|
data/lib/Zeta/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zetabot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Liothen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: unitwise
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: cinch
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -603,7 +617,6 @@ files:
|
|
603
617
|
- lib/Zeta/plugins/gem.rb
|
604
618
|
- lib/Zeta/plugins/gif.rb
|
605
619
|
- lib/Zeta/plugins/help.rb
|
606
|
-
- lib/Zeta/plugins/libsecure.rb
|
607
620
|
- lib/Zeta/plugins/macros.rb
|
608
621
|
- lib/Zeta/plugins/movie.rb
|
609
622
|
- lib/Zeta/plugins/pdfinfo.rb
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'uri'
|
2
|
-
require 'net/http'
|
3
|
-
require 'ostruct'
|
4
|
-
require 'discourse_api'
|
5
|
-
require 'action_view'
|
6
|
-
|
7
|
-
module Plugins
|
8
|
-
class Libsecure
|
9
|
-
include Cinch::Plugin
|
10
|
-
include Cinch::Helpers
|
11
|
-
include ActionView::Helpers::DateHelper
|
12
|
-
|
13
|
-
enable_acl(:nobody)
|
14
|
-
|
15
|
-
self.plugin_name = 'DarkScience #libsecure'
|
16
|
-
self.help = '?latest'
|
17
|
-
|
18
|
-
match 'latest', method: :fetch_latest
|
19
|
-
|
20
|
-
def fetch_latest(m)
|
21
|
-
return unless m.channel == '#libsecure' || m.channel == '#bots'
|
22
|
-
|
23
|
-
client = DiscourseApi::Client.new('https://libsecure.so', Config.secrets[:libsecure], Config.secrets[:libsecure_user] )
|
24
|
-
parser = client.latest_topics.sort_by { |hash| hash['last_posted_at'] }
|
25
|
-
data = parser.last
|
26
|
-
|
27
|
-
m.reply "Latest → #{data['title']} -- https://libsecure.so/t/#{data['id']}"
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
# AutoLoad
|
34
|
-
Bot.config.plugins.plugins.push Plugins::Libsecure
|