co2-notify 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 +7 -0
- data/.gitignore +9 -0
- data/Gemfile +3 -0
- data/README.md +14 -0
- data/Rakefile +2 -0
- data/bin/co2-notify +6 -0
- data/co2-notify.gemspec +25 -0
- data/lib/co2-notify/config.rb +44 -0
- data/lib/co2-notify/hipchat_client.rb +13 -0
- data/lib/co2-notify/notifier.rb +37 -0
- data/lib/co2-notify/status.rb +101 -0
- data/lib/co2-notify/version.rb +3 -0
- data/lib/co2-notify.rb +22 -0
- metadata +113 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a52c578e28a7d5ca006be753377076e25f28fd00
|
4
|
+
data.tar.gz: d6f47971b1c818c585a93fbc9aa41f8158792225
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 87d221ceb2483397304c17ca7b77a4e42a95c91ca0abb91a548ad8fdd04acd1b6d267f6633c3d08a58da5ad79e6bea7eb6f0c1f59bef8f371fbc643715f7e529
|
7
|
+
data.tar.gz: ac3fc9fed3cfff9d1e2fe8f0c3108b1bbb734b285d3e22bd2f0ad0a7a8dacf3b0576134d913d4390e8ee060d0649af58461c9101a1a64f81fd6d2712a6b8a71b
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
data/Rakefile
ADDED
data/bin/co2-notify
ADDED
data/co2-notify.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'co2-notify/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "co2-notify"
|
8
|
+
spec.version = Co2Notify::VERSION
|
9
|
+
spec.authors = ["Arkadiy Butermanov"]
|
10
|
+
spec.email = ["arkadiy.butermanov@flatstack.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Hipchat CO2 level notifier}
|
13
|
+
spec.homepage = "https://github.com/arkadiybutermanov/co2mon-notifier"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
+
spec.bindir = "bin"
|
18
|
+
spec.executables << "co2-notify"
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "thor"
|
22
|
+
spec.add_dependency "hipchat"
|
23
|
+
spec.add_dependency "activesupport"
|
24
|
+
spec.add_dependency "co2mon"
|
25
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "yaml"
|
2
|
+
|
3
|
+
class Co2Notify::Config < OpenStruct
|
4
|
+
CONFIG_FILE_NAME = ".co2-notify.yml".freeze
|
5
|
+
DEFAULT_TIMEOUT = 5.freeze
|
6
|
+
DEFAULT_COOLDOWN = 15.freeze
|
7
|
+
DEFAULT_HIGH_LEVEL = 800.freeze
|
8
|
+
DEFAULT_VERY_HIGH_LEVEL = 1200.freeze
|
9
|
+
|
10
|
+
def self.get
|
11
|
+
new YAML.load_file(config_file)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.set
|
15
|
+
data = {}.tap do |h|
|
16
|
+
print "Monitor location (required): "
|
17
|
+
h["location"] = STDIN.gets.chomp
|
18
|
+
print "Monitor user (required): "
|
19
|
+
h["user"] = STDIN.gets.chomp
|
20
|
+
print "Hipchat API token (required): "
|
21
|
+
h["api_token"] = STDIN.gets.chomp
|
22
|
+
print "Hipchat room name (required): "
|
23
|
+
h["room"] = STDIN.gets.chomp
|
24
|
+
print "Timeout (default: #{DEFAULT_TIMEOUT} mins): "
|
25
|
+
h["timeout"] = STDIN.gets.chomp.presence || DEFAULT_TIMEOUT
|
26
|
+
print "Cooldown (default: #{DEFAULT_COOLDOWN} mins): "
|
27
|
+
h["cooldown"] = STDIN.gets.chomp.presence || DEFAULT_COOLDOWN
|
28
|
+
print "High CO2 level (default: #{DEFAULT_HIGH_LEVEL}): "
|
29
|
+
h["high_level"] = STDIN.gets.chomp.presence || DEFAULT_HIGH_LEVEL
|
30
|
+
print "Very High CO2 level (default: #{DEFAULT_VERY_HIGH_LEVEL}): "
|
31
|
+
h["very_high_level"] = STDIN.gets.chomp.presence || DEFAULT_VERY_HIGH_LEVEL
|
32
|
+
print "Mention (optional): "
|
33
|
+
h["mention"] = STDIN.gets.chomp
|
34
|
+
end
|
35
|
+
|
36
|
+
File.open(config_file, "w") do |f|
|
37
|
+
YAML.dump(data, f)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.config_file
|
42
|
+
File.join(ENV['HOME'], CONFIG_FILE_NAME)
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Co2Notify::HipchatClient
|
2
|
+
attr_reader :client, :config
|
3
|
+
delegate :room, :location, :api_token, to: :config
|
4
|
+
|
5
|
+
def initialize(config)
|
6
|
+
@config = config
|
7
|
+
@client = HipChat::Client.new(api_token, api_version: "v2")
|
8
|
+
end
|
9
|
+
|
10
|
+
def send(status)
|
11
|
+
client[room].send("Co2 (#{location})", status.message, color: status.color, message_format: "text")
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class Co2Notify::Notifier
|
2
|
+
def self.start
|
3
|
+
new(Co2Notify::Config.get).start
|
4
|
+
end
|
5
|
+
|
6
|
+
attr_reader :config, :client, :status
|
7
|
+
delegate :timeout, to: :status
|
8
|
+
|
9
|
+
def initialize(config)
|
10
|
+
@config = config
|
11
|
+
@client = Co2Notify::HipchatClient.new(config)
|
12
|
+
@status = Co2Notify::Status::Empty.new(config)
|
13
|
+
end
|
14
|
+
|
15
|
+
def start
|
16
|
+
loop do
|
17
|
+
notify
|
18
|
+
sleep timeout * 60
|
19
|
+
end
|
20
|
+
rescue Interrupt
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def get_data
|
26
|
+
Co2mon.get_data[:co2]
|
27
|
+
end
|
28
|
+
|
29
|
+
def notify
|
30
|
+
new_status = Co2Notify::Status.build(get_data, config, status)
|
31
|
+
|
32
|
+
if status.changed?(new_status)
|
33
|
+
client.send(new_status)
|
34
|
+
@status = new_status
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
class Co2Notify::Status
|
2
|
+
class Base
|
3
|
+
attr_reader :co2, :config, :previous
|
4
|
+
delegate :timeout, :cooldown, :mention, :user, to: :config
|
5
|
+
|
6
|
+
def initialize(config, previous = nil, co2 = nil)
|
7
|
+
@config, @co2, @previous = config, co2, previous
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def hc_mention
|
13
|
+
"@#{mention} " if mention.present?
|
14
|
+
end
|
15
|
+
|
16
|
+
def hc_user
|
17
|
+
"@#{user} " if user.present?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class VeryHigh < Base
|
22
|
+
def message
|
23
|
+
"#{hc_mention}CO2 level is very high - #{co2}. Please open the windows!"
|
24
|
+
end
|
25
|
+
|
26
|
+
def color
|
27
|
+
:red
|
28
|
+
end
|
29
|
+
|
30
|
+
def changed?(new_status)
|
31
|
+
new_status.is_a?(Empty) || new_status.is_a?(Normal) || new_status.is_a?(VeryHigh)
|
32
|
+
end
|
33
|
+
|
34
|
+
def timeout
|
35
|
+
previous.is_a?(Empty) || previous.is_a?(Normal) ? cooldown : super
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class High < Base
|
40
|
+
def message
|
41
|
+
"#{hc_mention}CO2 level is high - #{co2}. Please open the windows!"
|
42
|
+
end
|
43
|
+
|
44
|
+
def color
|
45
|
+
previous.is_a?(High) ? :red : :yellow
|
46
|
+
end
|
47
|
+
|
48
|
+
def changed?(new_status)
|
49
|
+
new_status.is_a?(Empty) || new_status.is_a?(Normal) || new_status.is_a?(High) || new_status.is_a?(VeryHigh)
|
50
|
+
end
|
51
|
+
|
52
|
+
def timeout
|
53
|
+
previous.is_a?(Empty) || previous.is_a?(Normal) ? cooldown : super
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class Normal < Base
|
58
|
+
def message
|
59
|
+
"#{hc_mention}CO2 level is normalized - #{co2}. You can close the windows."
|
60
|
+
end
|
61
|
+
|
62
|
+
def color
|
63
|
+
:green
|
64
|
+
end
|
65
|
+
|
66
|
+
def changed?(new_status)
|
67
|
+
new_status.is_a?(Empty) || new_status.is_a?(High) || new_status.is_a?(VeryHigh)
|
68
|
+
end
|
69
|
+
|
70
|
+
def timeout
|
71
|
+
previous.is_a?(High) || previous.is_a?(VeryHigh) ? cooldown : super
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
class Empty < Base
|
76
|
+
def message
|
77
|
+
"#{hc_user}Please check that CO2 monitor is connected."
|
78
|
+
end
|
79
|
+
|
80
|
+
def color
|
81
|
+
:purple
|
82
|
+
end
|
83
|
+
|
84
|
+
def changed?(new_status)
|
85
|
+
new_status.is_a?(Empty) || new_status.is_a?(High) || new_status.is_a?(VeryHigh)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.build(co2, config, previous = nil)
|
90
|
+
case co2
|
91
|
+
when 1..config.high_level
|
92
|
+
Normal.new(config, previous, co2)
|
93
|
+
when config.high_level..config.very_high_level
|
94
|
+
High.new(config, previous, co2)
|
95
|
+
when proc { |n| n >= config.very_high_level }
|
96
|
+
VeryHigh.new(config, previous, co2)
|
97
|
+
else
|
98
|
+
Empty.new(config)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
data/lib/co2-notify.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require "thor"
|
2
|
+
require "co2mon"
|
3
|
+
require "hipchat"
|
4
|
+
require "active_support/core_ext/object/blank"
|
5
|
+
require "active_support/core_ext/module/delegation"
|
6
|
+
|
7
|
+
class Co2Notify < Thor
|
8
|
+
desc "start", "start notifier"
|
9
|
+
def start
|
10
|
+
Notifier.start
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "init", "setup config"
|
14
|
+
def init
|
15
|
+
Config.set
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
require_relative "co2-notify/config"
|
20
|
+
require_relative "co2-notify/status"
|
21
|
+
require_relative "co2-notify/hipchat_client"
|
22
|
+
require_relative "co2-notify/notifier"
|
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: co2-notify
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Arkadiy Butermanov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: thor
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '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'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: hipchat
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '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'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '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'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: co2mon
|
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
|
+
description:
|
70
|
+
email:
|
71
|
+
- arkadiy.butermanov@flatstack.com
|
72
|
+
executables:
|
73
|
+
- co2-notify
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- ".gitignore"
|
78
|
+
- Gemfile
|
79
|
+
- README.md
|
80
|
+
- Rakefile
|
81
|
+
- bin/co2-notify
|
82
|
+
- co2-notify.gemspec
|
83
|
+
- lib/co2-notify.rb
|
84
|
+
- lib/co2-notify/config.rb
|
85
|
+
- lib/co2-notify/hipchat_client.rb
|
86
|
+
- lib/co2-notify/notifier.rb
|
87
|
+
- lib/co2-notify/status.rb
|
88
|
+
- lib/co2-notify/version.rb
|
89
|
+
homepage: https://github.com/arkadiybutermanov/co2mon-notifier
|
90
|
+
licenses:
|
91
|
+
- MIT
|
92
|
+
metadata: {}
|
93
|
+
post_install_message:
|
94
|
+
rdoc_options: []
|
95
|
+
require_paths:
|
96
|
+
- lib
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
requirements: []
|
108
|
+
rubyforge_project:
|
109
|
+
rubygems_version: 2.5.1
|
110
|
+
signing_key:
|
111
|
+
specification_version: 4
|
112
|
+
summary: Hipchat CO2 level notifier
|
113
|
+
test_files: []
|