vaccine-spotter 0.2.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ee6ea9690334fd97f64cccafb4d4a22a59d36ba4e6b999a52b77f5f4128d9cd8
4
+ data.tar.gz: afd75efd6acd1ce70c8a73cbd7ed401e1cf4a2fe650efabec901c599a2a012fd
5
+ SHA512:
6
+ metadata.gz: 12ddd6dcf1befc1d1a2379e9b614e7508988194304016c80115788c546bab9d85f43c89f663dee02d85244abd9c2c2920d615e406529bf7c2b2c93b10c1a6127
7
+ data.tar.gz: d7552b9a5621c004d52a21c8eff20cb3e2663a0139d6fe47126a460c82d85685a37b820ca72e910b540a4a8ee827cee36ba43cc09ed5b1e9bfd4bc271327c3d7
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'vaccine-spotter'
@@ -0,0 +1,102 @@
1
+ #################################################################
2
+ # This is basically a wrapper around https://vaccinespotter.org #
3
+ #################################################################
4
+
5
+ require "open-uri"
6
+ require "json"
7
+ require "net/http"
8
+ require "terminal-notifier"
9
+ require "pastel"
10
+ require "toml"
11
+ require "tty-config"
12
+ require "tty-prompt"
13
+ require "launchy"
14
+
15
+ pastel = Pastel.new
16
+ config = TTY::Config.new
17
+ prompt = TTY::Prompt.new
18
+
19
+ config.filename = "vaccine-spotter"
20
+ config.extname = ".toml"
21
+ config.append_path "#{Dir.home}/.config"
22
+
23
+ if !config.exist?
24
+ puts
25
+ puts pastel.bold "Hi, welcome to the unofficial vaccinespotter.org CLI notifier thing!"
26
+ puts "It looks like you don't have a configuration file yet. Would you like to create one?"
27
+ create_config = prompt.yes? "Create `~/.config/vaccine-spotter.toml`?"
28
+ if create_config
29
+ set_state = prompt.ask("What state would you like to monitor? (Two-letter postal code, please)", required: true) do |q|
30
+ q.modify :up, :remove
31
+ end
32
+ config.set(:state, value: set_state)
33
+ puts "Ok, time to set zip codes…"
34
+ if prompt.yes? "freemaptools.com has a really helpful tool for getting the zip codes around a radius. Would you like to open it?"
35
+ Launchy.open "https://www.freemaptools.com/find-zip-codes-inside-radius.htm"
36
+ end
37
+ set_zips = prompt.ask("What zip codes would you like to track? You can paste here from freemaptools.com, if you used it (comma-separated list of integers, please)", convert: :int_list, required: true)
38
+ config.set(:zips, value: set_zips)
39
+ set_vaccine_types = prompt.multi_select("Which types of vaccines would you like to include?", %w(pfizer moderna jj unknown), min: 1, show_help: :always)
40
+ config.set(:vaccine_types, value: set_vaccine_types)
41
+ set_refresh_rate = prompt.ask("How often should the script check for updates? (seconds)", convert: :int, required: true)
42
+ config.set(:refresh_rate, value: set_refresh_rate)
43
+ puts "Perfect; writing to `~/.config/vaccine-spotter.toml`…"
44
+ config.write
45
+ end
46
+ end
47
+
48
+ zips = config.read["zips"]
49
+ state = config.read["state"]
50
+ refresh_rate = config.read["refresh_rate"].to_i
51
+ vaccine_types = config.read["vaccine_types"]
52
+
53
+ puts
54
+ print pastel.bold "vaccinespotter.org CLI notifier thing"
55
+ begin
56
+ print " v#{Gem.loaded_specs["vaccine-spotter"].version}"
57
+ rescue
58
+ print " [error loading version]"
59
+ end
60
+ puts pastel.dim ", by Jack MapelLentz (jltml.me)"
61
+ puts pastel.dim "This script uses the wonderful vaccinespotter.org, by Nick Muerdter (github.com/GUI)"
62
+ puts "Checking #{pastel.underline zips.length} zip codes in #{pastel.underline state} every #{pastel.underline refresh_rate} seconds"
63
+ puts "Filtering appointments for #{pastel.underline vaccine_types.to_s.tr("[]\"", "")}"
64
+ puts pastel.dim "Press control-C to quit"
65
+
66
+ excluded = Array.new
67
+
68
+ loop do
69
+
70
+ number_excluded = excluded.length
71
+
72
+ json = Net::HTTP.get(URI("https://www.vaccinespotter.org/api/v0/states/#{state}.json"))
73
+ parsed_json = JSON.parse(json)
74
+
75
+ puts
76
+
77
+ if (Time.now.strftime("%M").to_i%5 == 0) && (Time.now.strftime("%S").to_i < refresh_rate)
78
+ excluded.clear
79
+ puts "List of excluded/checked stores cleared"
80
+ end
81
+
82
+ parsed_json["features"].each_index do |i|
83
+ current = parsed_json["features"][i]["properties"]
84
+ if (current["appointments_available"] == true) and (zips.include?(current["postal_code"].to_i) and (!excluded.include? current["id"].to_i) and !(vaccine_types & current["appointment_vaccine_types"].keys).empty?)
85
+ puts "- #{pastel.green.bold current["city"]} #{pastel.green.bold current["provider_brand_name"]}: #{current["url"]}"
86
+ puts " - #{current["appointment_vaccine_types"]} as of #{Time.parse(current["appointments_last_fetched"]).localtime.strftime("%H:%M:%S")}"
87
+ TerminalNotifier.notify("#{current["provider_brand_name"]} - #{current["city"]}", :title => "vaccine-spotter", :open => "#{current["url"]}")
88
+ excluded.append current["id"].to_i
89
+ end
90
+ end
91
+
92
+ print pastel.dim "Checked at #{Time.now.strftime("%H:%M:%S")} on #{Time.now.strftime("%Y-%m-%d")}"
93
+ if number_excluded == 1
94
+ print pastel.dim " (#{number_excluded} checked location excluded)"
95
+ elsif number_excluded != 0
96
+ print pastel.dim " (#{number_excluded} checked locations excluded)"
97
+ end
98
+ puts
99
+
100
+ sleep refresh_rate
101
+
102
+ end
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vaccine-spotter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Jack MapelLentz
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-04-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: tty-logger
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.6.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.6.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: tty-prompt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.23.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.23.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: tty-config
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.4.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.4.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: toml
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.2.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.2.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: pastel
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.8.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.8.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: terminal-notifier
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: launchy
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.5'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.5'
111
+ description: This gem will notify you when COVID-19 vaccine appointments are available
112
+ matching certain criteria (a list of zip codes, type of vaccine, etc). It currently
113
+ pretty much just wraps the very beta API from the absolutely wonderful vaccinespotter.org,
114
+ though I hope to add my own website scraping soon too so as to improve response
115
+ times.
116
+ email:
117
+ executables:
118
+ - vaccine-spotter
119
+ extensions: []
120
+ extra_rdoc_files: []
121
+ files:
122
+ - bin/vaccine-spotter
123
+ - lib/vaccine-spotter.rb
124
+ homepage: https://github.com/jltml/vaccine-spotter-cli
125
+ licenses:
126
+ - MIT
127
+ metadata: {}
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
+ rubygems_version: 3.2.16
144
+ signing_key:
145
+ specification_version: 4
146
+ summary: Get notified of vaccine availability
147
+ test_files: []