blinkenstein 0.1.5 → 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.
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/.travis.yml +8 -0
- data/Gemfile +25 -2
- data/Guardfile +6 -0
- data/README.md +2 -0
- data/Rakefile +6 -0
- data/blinkenstein.gemspec +8 -5
- data/exe/blinkenstein +6 -0
- data/lib/blinkenstein.rb +3 -4
- data/lib/blinkenstein/logging.rb +21 -0
- data/lib/blinkenstein/monitor.rb +14 -0
- data/lib/blinkenstein/monitors/eve_skill_queue_monitor.rb +48 -0
- data/lib/blinkenstein/runner.rb +8 -9
- data/lib/blinkenstein/version.rb +1 -1
- data/lib/eve.rb +2 -0
- data/lib/eve/base.rb +45 -0
- data/lib/eve/skill_queue.rb +66 -0
- data/spec/blinkenstein/monitors/eve_skill_queue_monitor_spec.rb +34 -0
- data/spec/eve/base_spec.rb +13 -0
- data/spec/eve/skill_queue_spec.rb +76 -0
- data/spec/fixtures/skillqueue_blocked.yml +32 -0
- data/spec/fixtures/skillqueue_empty.yml +29 -0
- data/spec/fixtures/skillqueue_many.yml +35 -0
- data/spec/fixtures/skillqueue_one.yml +31 -0
- data/spec/fixtures/skillqueue_paused.yml +31 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/support/vcr.rb +6 -0
- metadata +71 -20
- data/Gemfile.lock +0 -85
- data/bin/blinkenstein +0 -8
- data/lib/blinkenstein/blink.rb +0 -83
- data/lib/blinkenstein/monitors/eve.rb +0 -81
data/.gitignore
ADDED
data/.rspec
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.3-p362-railsexpress
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
@@ -1,5 +1,28 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem "knife-solo"
|
4
|
-
|
5
3
|
gemspec
|
4
|
+
|
5
|
+
|
6
|
+
gem 'rake'
|
7
|
+
|
8
|
+
%w[blink1-patterns].each do |lib|
|
9
|
+
library_path = File.expand_path("../../#{lib}", __FILE__)
|
10
|
+
if File.exist?(library_path)
|
11
|
+
gem lib, :path => library_path
|
12
|
+
else
|
13
|
+
gem lib, :git => "git://github.com/BugRoger/#{lib}.git"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
group :development do
|
18
|
+
gem 'guard'
|
19
|
+
gem 'guard-rspec'
|
20
|
+
gem 'rake'
|
21
|
+
gem 'rb-fsevent', :require => false
|
22
|
+
end
|
23
|
+
|
24
|
+
group :test do
|
25
|
+
gem 'vcr'
|
26
|
+
gem 'webmock'
|
27
|
+
gem 'rspec'
|
28
|
+
end
|
data/Guardfile
ADDED
data/README.md
CHANGED
data/Rakefile
ADDED
data/blinkenstein.gemspec
CHANGED
@@ -12,13 +12,16 @@ Gem::Specification.new do |gem|
|
|
12
12
|
gem.summary = %q{Currently monitors Eve Online's skill queue and messes with Blink(1)'}
|
13
13
|
gem.homepage = ""
|
14
14
|
|
15
|
-
gem.files =
|
16
|
-
gem.
|
17
|
-
gem.
|
15
|
+
gem.files = `git ls-files`.split("\n")
|
16
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
gem.executables = `git ls-files -- exe/*`.split("\n").map{ |f| File.basename(f) }
|
18
18
|
gem.require_paths = ["lib"]
|
19
|
+
gem.bindir = 'exe'
|
20
|
+
|
21
|
+
gem.add_development_dependency('bundler')
|
22
|
+
gem.add_development_dependency('rspec')
|
19
23
|
|
20
24
|
gem.add_dependency('celluloid')
|
21
|
-
gem.add_dependency('rb-blink1')
|
22
25
|
gem.add_dependency('httparty')
|
23
|
-
gem.add_dependency('
|
26
|
+
gem.add_dependency('blink1-patterns')
|
24
27
|
end
|
data/exe/blinkenstein
ADDED
data/lib/blinkenstein.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require "celluloid"
|
2
2
|
|
3
3
|
require "blinkenstein/version"
|
4
|
+
require "blinkenstein/logging"
|
5
|
+
require "blinkenstein/monitor"
|
4
6
|
require "blinkenstein/runner"
|
5
|
-
require "blinkenstein/blink"
|
6
7
|
|
7
8
|
module Blinkenstein
|
8
9
|
class SupervisionGroup < Celluloid::SupervisionGroup
|
@@ -10,6 +11,4 @@ module Blinkenstein
|
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
13
|
-
require "blinkenstein/monitors/
|
14
|
-
|
15
|
-
|
14
|
+
require "blinkenstein/monitors/eve_skill_queue_monitor"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Blinkenstein
|
2
|
+
module Logging
|
3
|
+
def logger
|
4
|
+
@logger ||= Logging.logger_for(self.class.name)
|
5
|
+
end
|
6
|
+
|
7
|
+
@loggers = {}
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def logger_for(classname)
|
11
|
+
@loggers[classname] ||= configure_logger_for(classname)
|
12
|
+
end
|
13
|
+
|
14
|
+
def configure_logger_for(classname)
|
15
|
+
logger = Logger.new(STDOUT)
|
16
|
+
logger.progname = classname
|
17
|
+
logger
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'blinkenstein'
|
2
|
+
require 'blink1-patterns'
|
3
|
+
require 'eve'
|
4
|
+
|
5
|
+
module Blinkenstein
|
6
|
+
class EveSkillQueueMonitor
|
7
|
+
include Monitor
|
8
|
+
include Logging
|
9
|
+
|
10
|
+
def refresh
|
11
|
+
update_blink
|
12
|
+
end
|
13
|
+
|
14
|
+
def hours_left
|
15
|
+
@skillQueue ||= Eve::SkillQueue.new
|
16
|
+
@skillQueue.hours_left
|
17
|
+
end
|
18
|
+
|
19
|
+
def update_blink
|
20
|
+
case
|
21
|
+
when hours_left < 0 then error
|
22
|
+
when hours_left < 8 && hours_left >= 0 then panic
|
23
|
+
when hours_left > 8 && hours_left <= 24 then nervous
|
24
|
+
when hours_left > 24 then cool
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def cool
|
29
|
+
logger.info "Everything is cool. #{hours_left}h left."
|
30
|
+
Blink::Patterns.breath("#00ff00", 4, 0.2)
|
31
|
+
end
|
32
|
+
|
33
|
+
def nervous
|
34
|
+
logger.info "There's room in the queue. #{hours_left}h left."
|
35
|
+
Blink::Patterns.breath("#ff0000", 3, 0.3)
|
36
|
+
end
|
37
|
+
|
38
|
+
def panic
|
39
|
+
logger.info "Queue runs out soon. #{hours_left}h left."
|
40
|
+
Blink::Patterns.police
|
41
|
+
end
|
42
|
+
|
43
|
+
def error
|
44
|
+
logger.info "Ehm. Something is wrong"
|
45
|
+
Blink::Patterns.breath("#ff0000", 0.25, 0.75)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/blinkenstein/runner.rb
CHANGED
@@ -3,20 +3,19 @@ require 'celluloid'
|
|
3
3
|
module Blinkenstein
|
4
4
|
class Runner
|
5
5
|
include Celluloid
|
6
|
-
|
7
|
-
attr_reader :blink
|
8
|
-
attr_reader :monitors
|
6
|
+
include Logging
|
9
7
|
|
10
8
|
def initialize
|
11
|
-
|
12
|
-
@blink = Blink.new
|
9
|
+
refresh_all
|
13
10
|
|
14
|
-
|
11
|
+
every(15) do
|
12
|
+
refresh_all
|
13
|
+
end
|
15
14
|
end
|
16
15
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
16
|
+
def refresh_all
|
17
|
+
logger.debug "Refreshing all monitors"
|
18
|
+
Monitor.repository.each(&:refresh)
|
20
19
|
end
|
21
20
|
end
|
22
21
|
end
|
data/lib/blinkenstein/version.rb
CHANGED
data/lib/eve.rb
ADDED
data/lib/eve/base.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
|
3
|
+
module Eve
|
4
|
+
|
5
|
+
class Base
|
6
|
+
include HTTParty
|
7
|
+
base_uri 'https://api.eveonline.com'
|
8
|
+
|
9
|
+
VALID_KEYS = [:characterID, :keyID, :vCode]
|
10
|
+
|
11
|
+
def load_config
|
12
|
+
config = {}
|
13
|
+
|
14
|
+
begin
|
15
|
+
config = YAML.load(File.read(File.expand_path('~/.eve-api')))
|
16
|
+
rescue Errno::ENOENT
|
17
|
+
raise "No ~/.eve-monitor config. The skill queue monitor can't start..."
|
18
|
+
rescue Psych::SyntaxError
|
19
|
+
raise "Invalid syntax in ~/.eve-api. The skill queue monitor can't start..."
|
20
|
+
end
|
21
|
+
|
22
|
+
config
|
23
|
+
end
|
24
|
+
|
25
|
+
def configure
|
26
|
+
config = load_config
|
27
|
+
query = {}
|
28
|
+
|
29
|
+
config.each do |k,v|
|
30
|
+
query[k.to_sym] = v if VALID_KEYS.include? k.to_sym
|
31
|
+
end
|
32
|
+
|
33
|
+
query
|
34
|
+
end
|
35
|
+
|
36
|
+
def query
|
37
|
+
@query ||= configure
|
38
|
+
end
|
39
|
+
|
40
|
+
def parse_date(eve_date)
|
41
|
+
DateTime.strptime(eve_date, '%Y-%m-%d %H:%M:%S') rescue nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "eve/base"
|
2
|
+
|
3
|
+
class Eve::SkillQueue < Eve::Base
|
4
|
+
attr_reader :expire_time
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@expire_time = Time.now - 1
|
8
|
+
end
|
9
|
+
|
10
|
+
def hours_left
|
11
|
+
refresh
|
12
|
+
|
13
|
+
return ((end_time - current_time) * 24).to_i if end_time
|
14
|
+
return 0 if paused? || empty?
|
15
|
+
return -1 if blocked?
|
16
|
+
-1
|
17
|
+
end
|
18
|
+
|
19
|
+
def paused?
|
20
|
+
return false if blocked?
|
21
|
+
|
22
|
+
last_skill.fetch("endTime", false) == ""
|
23
|
+
end
|
24
|
+
|
25
|
+
def blocked?
|
26
|
+
@response.fetch("eveapi", {}).fetch("error", false)
|
27
|
+
end
|
28
|
+
|
29
|
+
def empty?
|
30
|
+
return false if blocked?
|
31
|
+
|
32
|
+
last_skill.empty?
|
33
|
+
end
|
34
|
+
|
35
|
+
def last_skill
|
36
|
+
@last_skill ||= Array[@response.fetch("eveapi", {}).fetch("result", {}).fetch("rowset", {}).fetch("row", {})].flatten.last
|
37
|
+
end
|
38
|
+
|
39
|
+
def current_time
|
40
|
+
parse_date(@response.fetch("eveapi", {}).fetch("currentTime", {}))
|
41
|
+
end
|
42
|
+
|
43
|
+
def cached_until
|
44
|
+
parse_date(@response.fetch("eveapi", {}).fetch("cachedUntil", {}))
|
45
|
+
end
|
46
|
+
|
47
|
+
def end_time
|
48
|
+
parse_date(last_skill.fetch("endTime", ""))
|
49
|
+
end
|
50
|
+
|
51
|
+
def update_cache
|
52
|
+
if current_time && cached_until
|
53
|
+
@expire_time = Time.now + ((cached_until - current_time) * 24 * 60 * 60).to_i
|
54
|
+
else
|
55
|
+
@expire_time = Time.now + 60
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def refresh
|
60
|
+
return if @response && Time.now < @expire_time
|
61
|
+
|
62
|
+
@response = self.class.get('/char/SkillQueue.xml.aspx', query: query)
|
63
|
+
update_cache
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "blinkenstein/monitors/eve_skill_queue_monitor"
|
3
|
+
|
4
|
+
module Blinkenstein
|
5
|
+
describe EveSkillQueueMonitor do
|
6
|
+
let(:monitor) { EveSkillQueueMonitor.new }
|
7
|
+
|
8
|
+
describe "refresh" do
|
9
|
+
it "goes into error mode if queue left is < 0" do
|
10
|
+
monitor.stub(:hours_left).and_return(-1)
|
11
|
+
monitor.should_receive(:error)
|
12
|
+
monitor.refresh
|
13
|
+
end
|
14
|
+
|
15
|
+
it "is cool if the skill queue is longer than 24h" do
|
16
|
+
monitor.stub(:hours_left).and_return(25)
|
17
|
+
monitor.should_receive(:cool)
|
18
|
+
monitor.refresh
|
19
|
+
end
|
20
|
+
|
21
|
+
it "is nervous if the skill queue is between 9h and 24h long" do
|
22
|
+
monitor.stub(:hours_left).and_return(9)
|
23
|
+
monitor.should_receive(:nervous)
|
24
|
+
monitor.refresh
|
25
|
+
end
|
26
|
+
|
27
|
+
it "is panicing if the skill queue is below 8h long" do
|
28
|
+
monitor.stub(:hours_left).and_return(0)
|
29
|
+
monitor.should_receive(:panic)
|
30
|
+
monitor.refresh
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Eve
|
2
|
+
describe Base do
|
3
|
+
describe "parse_date" do
|
4
|
+
it "returns nil on unexpected input" do
|
5
|
+
Base.new.parse_date("HohOhO").should == nil
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should parse eve formated dates" do
|
9
|
+
Base.new.parse_date("1976-11-04 09:17:23").should == DateTime.new(1976, 11, 4, 9, 17, 23)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "eve/skill_queue"
|
3
|
+
|
4
|
+
module Eve
|
5
|
+
describe SkillQueue do
|
6
|
+
let(:skillQueue) { SkillQueue.new }
|
7
|
+
|
8
|
+
before(:each) {
|
9
|
+
skillQueue.stub(:query).and_return({characterID: "123", keyID: "123", vCode: "abc"})
|
10
|
+
}
|
11
|
+
|
12
|
+
describe "hours_left" do
|
13
|
+
context "when more than one skill is qeueued" do
|
14
|
+
it "calculates hours left by using the last queued skill" do
|
15
|
+
VCR.use_cassette('skillqueue_many') do
|
16
|
+
skillQueue.hours_left.should == 49
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when exactly one skill is queued" do
|
22
|
+
it "calculates hours left by using the last queued skill" do
|
23
|
+
VCR.use_cassette('skillqueue_one') do
|
24
|
+
skillQueue.hours_left.should == 44
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "when queue is empty" do
|
30
|
+
it "returns 0" do
|
31
|
+
VCR.use_cassette('skillqueue_empty') do
|
32
|
+
skillQueue.hours_left.should == 0
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when queue is paused" do
|
38
|
+
it "returns 0" do
|
39
|
+
VCR.use_cassette('skillqueue_paused') do
|
40
|
+
skillQueue.hours_left.should == 0
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "when api is blocked" do
|
46
|
+
it "returns -1h left" do
|
47
|
+
VCR.use_cassette('skillqueue_blocked') do
|
48
|
+
skillQueue.hours_left.should == -1
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it "respects the cacheUntil setting" do
|
55
|
+
SkillQueue.should_receive(:get).once.and_call_original
|
56
|
+
|
57
|
+
VCR.use_cassette('skillqueue_one') do
|
58
|
+
2.times { skillQueue.hours_left }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
it "fetches new data when the cache expires" do
|
63
|
+
SkillQueue.should_receive(:get).twice.and_call_original
|
64
|
+
|
65
|
+
VCR.use_cassette('skillqueue_one') do
|
66
|
+
skillQueue.hours_left
|
67
|
+
end
|
68
|
+
|
69
|
+
skillQueue.instance_variable_set("@expire_time", (Time.now - 1))
|
70
|
+
|
71
|
+
VCR.use_cassette('skillqueue_empty') do
|
72
|
+
skillQueue.hours_left
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.eveonline.com/char/SkillQueue.xml.aspx?characterID=123&keyID=123&vCode=abc
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers: {}
|
10
|
+
response:
|
11
|
+
status:
|
12
|
+
code: 200
|
13
|
+
message: OK
|
14
|
+
headers:
|
15
|
+
Content-Type:
|
16
|
+
- application/xml; charset=utf-8
|
17
|
+
Date:
|
18
|
+
- Sun, 17 Feb 2013 15:35:11 GMT
|
19
|
+
Content-Length:
|
20
|
+
- '507'
|
21
|
+
body:
|
22
|
+
encoding: US-ASCII
|
23
|
+
string: ! "<?xml version='1.0' encoding='UTF-8'?>\r\n<eveapi version=\"2\">\r\n
|
24
|
+
\ <currentTime>2013-02-17 15:35:11</currentTime>\r\n <error code=\"904\">Your
|
25
|
+
IP address has been temporarily blocked because it is causing too many errors.
|
26
|
+
See the cacheUntil timestamp for when it will be opened again. IPs that continually
|
27
|
+
cause a lot of errors in the API will be permanently banned, please take measures
|
28
|
+
to minimize problematic API calls from your application.</error>\r\n <cachedUntil>2013-02-17
|
29
|
+
15:44:37</cachedUntil>\r\n</eveapi>"
|
30
|
+
http_version:
|
31
|
+
recorded_at: Sun, 17 Feb 2013 15:35:11 GMT
|
32
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,29 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.eveonline.com/char/SkillQueue.xml.aspx?characterID=123&keyID=123&vCode=abc
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers: {}
|
10
|
+
response:
|
11
|
+
status:
|
12
|
+
code: 200
|
13
|
+
message: OK
|
14
|
+
headers:
|
15
|
+
Transfer-Encoding:
|
16
|
+
- chunked
|
17
|
+
Content-Type:
|
18
|
+
- application/xml; charset=utf-8
|
19
|
+
Date:
|
20
|
+
- Sat, 16 Feb 2013 18:56:00 GMT
|
21
|
+
body:
|
22
|
+
encoding: US-ASCII
|
23
|
+
string: ! "<?xml version='1.0' encoding='UTF-8'?>\r\n<eveapi version=\"2\">\r\n
|
24
|
+
\ <currentTime>2013-02-16 18:56:01</currentTime>\r\n <result>\r\n <rowset
|
25
|
+
name=\"skillqueue\" key=\"queuePosition\" columns=\"queuePosition,typeID,level,startSP,endSP,startTime,endTime\">\r\n
|
26
|
+
</rowset>\r\n </result>\r\n <cachedUntil>2013-02-16 19:44:22</cachedUntil>\r\n</eveapi>"
|
27
|
+
http_version:
|
28
|
+
recorded_at: Sat, 16 Feb 2013 18:56:01 GMT
|
29
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,35 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.eveonline.com/char/SkillQueue.xml.aspx?characterID=123&keyID=123&vCode=abc
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers: {}
|
10
|
+
response:
|
11
|
+
status:
|
12
|
+
code: 200
|
13
|
+
message: OK
|
14
|
+
headers:
|
15
|
+
Transfer-Encoding:
|
16
|
+
- chunked
|
17
|
+
Content-Type:
|
18
|
+
- application/xml; charset=utf-8
|
19
|
+
Date:
|
20
|
+
- Sun, 17 Feb 2013 15:44:34 GMT
|
21
|
+
body:
|
22
|
+
encoding: US-ASCII
|
23
|
+
string: ! "<?xml version='1.0' encoding='UTF-8'?>\r\n<eveapi version=\"2\">\r\n
|
24
|
+
\ <currentTime>2013-02-17 15:44:34</currentTime>\r\n <result>\r\n <rowset
|
25
|
+
name=\"skillqueue\" key=\"queuePosition\" columns=\"queuePosition,typeID,level,startSP,endSP,startTime,endTime\">\r\n
|
26
|
+
\ <row queuePosition=\"0\" typeID=\"3425\" level=\"2\" startSP=\"500\"
|
27
|
+
endSP=\"2829\" startTime=\"2013-02-17 15:39:54\" endTime=\"2013-02-17 16:57:32\"
|
28
|
+
/>\r\n <row queuePosition=\"1\" typeID=\"3425\" level=\"3\" startSP=\"2829\"
|
29
|
+
endSP=\"16000\" startTime=\"2013-02-17 16:57:32\" endTime=\"2013-02-18 00:16:34\"
|
30
|
+
/>\r\n <row queuePosition=\"2\" typeID=\"3425\" level=\"4\" startSP=\"16000\"
|
31
|
+
endSP=\"90510\" startTime=\"2013-02-18 00:16:34\" endTime=\"2013-02-19 17:40:14\"
|
32
|
+
/>\r\n </rowset>\r\n </result>\r\n <cachedUntil>2013-02-17 16:41:34</cachedUntil>\r\n</eveapi>"
|
33
|
+
http_version:
|
34
|
+
recorded_at: Sun, 17 Feb 2013 15:44:33 GMT
|
35
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,31 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.eveonline.com/char/SkillQueue.xml.aspx?characterID=123&keyID=123&vCode=abc
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers: {}
|
10
|
+
response:
|
11
|
+
status:
|
12
|
+
code: 200
|
13
|
+
message: OK
|
14
|
+
headers:
|
15
|
+
Transfer-Encoding:
|
16
|
+
- chunked
|
17
|
+
Content-Type:
|
18
|
+
- application/xml; charset=utf-8
|
19
|
+
Date:
|
20
|
+
- Sat, 16 Feb 2013 18:56:00 GMT
|
21
|
+
body:
|
22
|
+
encoding: US-ASCII
|
23
|
+
string: ! "<?xml version='1.0' encoding='UTF-8'?>\r\n<eveapi version=\"2\">\r\n
|
24
|
+
\ <currentTime>2013-02-16 18:56:01</currentTime>\r\n <result>\r\n <rowset
|
25
|
+
name=\"skillqueue\" key=\"queuePosition\" columns=\"queuePosition,typeID,level,startSP,endSP,startTime,endTime\">\r\n
|
26
|
+
\ <row queuePosition=\"0\" typeID=\"3437\" level=\"5\" startSP=\"185408\"
|
27
|
+
endSP=\"256000\" startTime=\"2013-02-16 00:20:10\" endTime=\"2013-02-18 15:33:14\"
|
28
|
+
/>\r\n </rowset>\r\n </result>\r\n <cachedUntil>2013-02-16 19:44:22</cachedUntil>\r\n</eveapi>"
|
29
|
+
http_version:
|
30
|
+
recorded_at: Sat, 16 Feb 2013 18:56:01 GMT
|
31
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,31 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.eveonline.com/char/SkillQueue.xml.aspx?characterID=123&keyID=123&vCode=abc
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers: {}
|
10
|
+
response:
|
11
|
+
status:
|
12
|
+
code: 200
|
13
|
+
message: OK
|
14
|
+
headers:
|
15
|
+
Transfer-Encoding:
|
16
|
+
- chunked
|
17
|
+
Content-Type:
|
18
|
+
- application/xml; charset=utf-8
|
19
|
+
Date:
|
20
|
+
- Sat, 16 Feb 2013 18:56:00 GMT
|
21
|
+
body:
|
22
|
+
encoding: US-ASCII
|
23
|
+
string: ! "<?xml version='1.0' encoding='UTF-8'?>\r\n<eveapi version=\"2\">\r\n
|
24
|
+
\ <currentTime>2013-02-16 18:56:01</currentTime>\r\n <result>\r\n <rowset
|
25
|
+
name=\"skillqueue\" key=\"queuePosition\" columns=\"queuePosition,typeID,level,startSP,endSP,startTime,endTime\">\r\n
|
26
|
+
\ <row queuePosition=\"0\" typeID=\"3437\" level=\"5\" startSP=\"185408\"
|
27
|
+
endSP=\"256000\" startTime=\"2013-02-16 00:20:10\" endTime=\"\"
|
28
|
+
/>\r\n </rowset>\r\n </result>\r\n <cachedUntil>2013-02-16 19:44:22</cachedUntil>\r\n</eveapi>"
|
29
|
+
http_version:
|
30
|
+
recorded_at: Sat, 16 Feb 2013 18:56:01 GMT
|
31
|
+
recorded_with: VCR 2.4.0
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f}
|
2
|
+
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
5
|
+
config.run_all_when_everything_filtered = true
|
6
|
+
config.filter_run :focus
|
7
|
+
|
8
|
+
# Run specs in random order to surface order dependencies. If you find an
|
9
|
+
# order dependency and want to debug it, you can fix the order by providing
|
10
|
+
# the seed, which is printed after each run.
|
11
|
+
# --seed 1234
|
12
|
+
config.order = 'random'
|
13
|
+
end
|
data/spec/support/vcr.rb
ADDED
metadata
CHANGED
@@ -2,79 +2,95 @@
|
|
2
2
|
name: blinkenstein
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.2.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Michael Schmidt
|
9
9
|
autorequire:
|
10
|
-
bindir:
|
10
|
+
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
type: :runtime
|
15
|
+
name: bundler
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
17
|
none: false
|
19
18
|
requirements:
|
20
19
|
- - ! '>='
|
21
20
|
- !ruby/object:Gem::Version
|
22
21
|
version: '0'
|
23
|
-
|
22
|
+
type: :development
|
24
23
|
version_requirements: !ruby/object:Gem::Requirement
|
25
24
|
none: false
|
26
25
|
requirements:
|
27
26
|
- - ! '>='
|
28
27
|
- !ruby/object:Gem::Version
|
29
28
|
version: '0'
|
29
|
+
prerelease: false
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
|
-
name:
|
32
|
-
type: :runtime
|
31
|
+
name: rspec
|
33
32
|
requirement: !ruby/object:Gem::Requirement
|
34
33
|
none: false
|
35
34
|
requirements:
|
36
35
|
- - ! '>='
|
37
36
|
- !ruby/object:Gem::Version
|
38
37
|
version: '0'
|
38
|
+
type: :development
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
39
45
|
prerelease: false
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: celluloid
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
40
55
|
version_requirements: !ruby/object:Gem::Requirement
|
41
56
|
none: false
|
42
57
|
requirements:
|
43
58
|
- - ! '>='
|
44
59
|
- !ruby/object:Gem::Version
|
45
60
|
version: '0'
|
61
|
+
prerelease: false
|
46
62
|
- !ruby/object:Gem::Dependency
|
47
63
|
name: httparty
|
48
|
-
type: :runtime
|
49
64
|
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
53
68
|
- !ruby/object:Gem::Version
|
54
69
|
version: '0'
|
55
|
-
|
70
|
+
type: :runtime
|
56
71
|
version_requirements: !ruby/object:Gem::Requirement
|
57
72
|
none: false
|
58
73
|
requirements:
|
59
74
|
- - ! '>='
|
60
75
|
- !ruby/object:Gem::Version
|
61
76
|
version: '0'
|
77
|
+
prerelease: false
|
62
78
|
- !ruby/object:Gem::Dependency
|
63
|
-
name:
|
64
|
-
type: :runtime
|
79
|
+
name: blink1-patterns
|
65
80
|
requirement: !ruby/object:Gem::Requirement
|
66
81
|
none: false
|
67
82
|
requirements:
|
68
83
|
- - ! '>='
|
69
84
|
- !ruby/object:Gem::Version
|
70
85
|
version: '0'
|
71
|
-
|
86
|
+
type: :runtime
|
72
87
|
version_requirements: !ruby/object:Gem::Requirement
|
73
88
|
none: false
|
74
89
|
requirements:
|
75
90
|
- - ! '>='
|
76
91
|
- !ruby/object:Gem::Version
|
77
92
|
version: '0'
|
93
|
+
prerelease: false
|
78
94
|
description: Blink(1) Monitoring Thinggy
|
79
95
|
email:
|
80
96
|
- michael.j.schmidt@gmail.com
|
@@ -83,17 +99,36 @@ executables:
|
|
83
99
|
extensions: []
|
84
100
|
extra_rdoc_files: []
|
85
101
|
files:
|
102
|
+
- .gitignore
|
103
|
+
- .rspec
|
104
|
+
- .ruby-version
|
105
|
+
- .travis.yml
|
86
106
|
- Gemfile
|
87
|
-
-
|
107
|
+
- Guardfile
|
88
108
|
- LICENSE.txt
|
89
109
|
- README.md
|
90
|
-
-
|
91
|
-
-
|
110
|
+
- Rakefile
|
111
|
+
- blinkenstein.gemspec
|
112
|
+
- exe/blinkenstein
|
113
|
+
- lib/blinkenstein.rb
|
114
|
+
- lib/blinkenstein/logging.rb
|
115
|
+
- lib/blinkenstein/monitor.rb
|
116
|
+
- lib/blinkenstein/monitors/eve_skill_queue_monitor.rb
|
92
117
|
- lib/blinkenstein/runner.rb
|
93
118
|
- lib/blinkenstein/version.rb
|
94
|
-
- lib/
|
95
|
-
-
|
96
|
-
-
|
119
|
+
- lib/eve.rb
|
120
|
+
- lib/eve/base.rb
|
121
|
+
- lib/eve/skill_queue.rb
|
122
|
+
- spec/blinkenstein/monitors/eve_skill_queue_monitor_spec.rb
|
123
|
+
- spec/eve/base_spec.rb
|
124
|
+
- spec/eve/skill_queue_spec.rb
|
125
|
+
- spec/fixtures/skillqueue_blocked.yml
|
126
|
+
- spec/fixtures/skillqueue_empty.yml
|
127
|
+
- spec/fixtures/skillqueue_many.yml
|
128
|
+
- spec/fixtures/skillqueue_one.yml
|
129
|
+
- spec/fixtures/skillqueue_paused.yml
|
130
|
+
- spec/spec_helper.rb
|
131
|
+
- spec/support/vcr.rb
|
97
132
|
homepage: ''
|
98
133
|
licenses: []
|
99
134
|
post_install_message:
|
@@ -105,12 +140,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
105
140
|
requirements:
|
106
141
|
- - ! '>='
|
107
142
|
- !ruby/object:Gem::Version
|
143
|
+
segments:
|
144
|
+
- 0
|
145
|
+
hash: 4488431557902824984
|
108
146
|
version: '0'
|
109
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
148
|
none: false
|
111
149
|
requirements:
|
112
150
|
- - ! '>='
|
113
151
|
- !ruby/object:Gem::Version
|
152
|
+
segments:
|
153
|
+
- 0
|
154
|
+
hash: 4488431557902824984
|
114
155
|
version: '0'
|
115
156
|
requirements: []
|
116
157
|
rubyforge_project:
|
@@ -118,4 +159,14 @@ rubygems_version: 1.8.23
|
|
118
159
|
signing_key:
|
119
160
|
specification_version: 3
|
120
161
|
summary: Currently monitors Eve Online's skill queue and messes with Blink(1)'
|
121
|
-
test_files:
|
162
|
+
test_files:
|
163
|
+
- spec/blinkenstein/monitors/eve_skill_queue_monitor_spec.rb
|
164
|
+
- spec/eve/base_spec.rb
|
165
|
+
- spec/eve/skill_queue_spec.rb
|
166
|
+
- spec/fixtures/skillqueue_blocked.yml
|
167
|
+
- spec/fixtures/skillqueue_empty.yml
|
168
|
+
- spec/fixtures/skillqueue_many.yml
|
169
|
+
- spec/fixtures/skillqueue_one.yml
|
170
|
+
- spec/fixtures/skillqueue_paused.yml
|
171
|
+
- spec/spec_helper.rb
|
172
|
+
- spec/support/vcr.rb
|
data/Gemfile.lock
DELETED
@@ -1,85 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
blinkenstein (0.1.4)
|
5
|
-
celluloid
|
6
|
-
httparty
|
7
|
-
nokogiri
|
8
|
-
rb-blink1
|
9
|
-
|
10
|
-
GEM
|
11
|
-
remote: https://rubygems.org/
|
12
|
-
specs:
|
13
|
-
archive-tar-minitar (0.5.2)
|
14
|
-
celluloid (0.12.4)
|
15
|
-
facter (>= 1.6.12)
|
16
|
-
timers (>= 1.0.0)
|
17
|
-
chef (11.4.0)
|
18
|
-
erubis
|
19
|
-
highline (>= 1.6.9)
|
20
|
-
json (>= 1.4.4, <= 1.7.7)
|
21
|
-
mixlib-authentication (>= 1.3.0)
|
22
|
-
mixlib-cli (~> 1.3.0)
|
23
|
-
mixlib-config (>= 1.1.2)
|
24
|
-
mixlib-log (>= 1.3.0)
|
25
|
-
mixlib-shellout
|
26
|
-
net-ssh (~> 2.6)
|
27
|
-
net-ssh-multi (~> 1.1.0)
|
28
|
-
ohai (>= 0.6.0)
|
29
|
-
rest-client (>= 1.0.4, < 1.7.0)
|
30
|
-
yajl-ruby (~> 1.1)
|
31
|
-
erubis (2.7.0)
|
32
|
-
facter (1.6.17)
|
33
|
-
highline (1.6.15)
|
34
|
-
httparty (0.10.2)
|
35
|
-
multi_json (~> 1.0)
|
36
|
-
multi_xml (>= 0.5.2)
|
37
|
-
ipaddress (0.8.0)
|
38
|
-
json (1.7.7)
|
39
|
-
knife-solo (0.2.0)
|
40
|
-
chef (>= 10.12)
|
41
|
-
librarian (~> 0.0.20)
|
42
|
-
net-ssh (>= 2.2.2, < 3.0)
|
43
|
-
librarian (0.0.26)
|
44
|
-
archive-tar-minitar (>= 0.5.2)
|
45
|
-
chef (>= 0.10)
|
46
|
-
highline
|
47
|
-
thor (~> 0.15)
|
48
|
-
mime-types (1.21)
|
49
|
-
mixlib-authentication (1.3.0)
|
50
|
-
mixlib-log
|
51
|
-
mixlib-cli (1.3.0)
|
52
|
-
mixlib-config (1.1.2)
|
53
|
-
mixlib-log (1.4.1)
|
54
|
-
mixlib-shellout (1.1.0)
|
55
|
-
multi_json (1.5.0)
|
56
|
-
multi_xml (0.5.3)
|
57
|
-
net-ssh (2.6.5)
|
58
|
-
net-ssh-gateway (1.2.0)
|
59
|
-
net-ssh (>= 2.6.5)
|
60
|
-
net-ssh-multi (1.1)
|
61
|
-
net-ssh (>= 2.1.4)
|
62
|
-
net-ssh-gateway (>= 0.99.0)
|
63
|
-
nokogiri (1.5.6)
|
64
|
-
ohai (6.16.0)
|
65
|
-
ipaddress
|
66
|
-
mixlib-cli
|
67
|
-
mixlib-config
|
68
|
-
mixlib-log
|
69
|
-
mixlib-shellout
|
70
|
-
systemu
|
71
|
-
yajl-ruby
|
72
|
-
rb-blink1 (0.0.6)
|
73
|
-
rest-client (1.6.7)
|
74
|
-
mime-types (>= 1.16)
|
75
|
-
systemu (2.5.2)
|
76
|
-
thor (0.17.0)
|
77
|
-
timers (1.1.0)
|
78
|
-
yajl-ruby (1.1.0)
|
79
|
-
|
80
|
-
PLATFORMS
|
81
|
-
ruby
|
82
|
-
|
83
|
-
DEPENDENCIES
|
84
|
-
blinkenstein!
|
85
|
-
knife-solo
|
data/bin/blinkenstein
DELETED
data/lib/blinkenstein/blink.rb
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
require 'blink1'
|
2
|
-
require 'celluloid'
|
3
|
-
|
4
|
-
class Blinkenstein::Blink
|
5
|
-
include Celluloid
|
6
|
-
|
7
|
-
attr_reader :timer
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
blink.open
|
11
|
-
end
|
12
|
-
|
13
|
-
def finalize
|
14
|
-
puts "Closing Blink1 Connection"
|
15
|
-
blink.off
|
16
|
-
blink.close
|
17
|
-
end
|
18
|
-
|
19
|
-
def breath(hex = "#0000ff", duration = 5, depth = 0.2)
|
20
|
-
play(animate_breath(hex, duration, depth))
|
21
|
-
end
|
22
|
-
|
23
|
-
def police
|
24
|
-
animation = animate_breath("#ff0000", 0.5, 1) + animate_breath("#0000ff", 0.5, 1)
|
25
|
-
play(animation)
|
26
|
-
end
|
27
|
-
|
28
|
-
def play(animation, step = 0)
|
29
|
-
timer.cancel if timer
|
30
|
-
|
31
|
-
step = 0 if step >= animation.length
|
32
|
-
r, g, b, t = animation[step]
|
33
|
-
|
34
|
-
@timer = after(t) do
|
35
|
-
play(animation, step + 1)
|
36
|
-
end
|
37
|
-
|
38
|
-
blink.fade_to_rgb(t*1000, r, g, b)
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
|
-
# Amount should be a decimal between 0 and 1. Lower means darker
|
43
|
-
def darken_color(hex_color, amount=0.4)
|
44
|
-
hex_color = hex_color.gsub('#','')
|
45
|
-
rgb = hex_color.scan(/../).map {|color| color.hex}
|
46
|
-
rgb[0] = (rgb[0].to_i * amount).round
|
47
|
-
rgb[1] = (rgb[1].to_i * amount).round
|
48
|
-
rgb[2] = (rgb[2].to_i * amount).round
|
49
|
-
rgb
|
50
|
-
end
|
51
|
-
|
52
|
-
# Amount should be a decimal between 0 and 1. Higher means lighter
|
53
|
-
def lighten_color(hex_color, amount=0.6)
|
54
|
-
hex_color = hex_color.gsub('#','')
|
55
|
-
rgb = hex_color.scan(/../).map {|color| color.hex}
|
56
|
-
rgb[0] = [(rgb[0].to_i + 255 * amount).round, 255].min
|
57
|
-
rgb[1] = [(rgb[1].to_i + 255 * amount).round, 255].min
|
58
|
-
rgb[2] = [(rgb[2].to_i + 255 * amount).round, 255].min
|
59
|
-
rgb
|
60
|
-
end
|
61
|
-
|
62
|
-
|
63
|
-
def animate_breath(hex = "#0000ff", duration = 5, depth = 0.2)
|
64
|
-
breath_in_duration = 1.0
|
65
|
-
breath_out_duration = 1.3
|
66
|
-
|
67
|
-
breath_in_interval = 0.1 * duration * breath_in_duration / (breath_in_duration + breath_out_duration)
|
68
|
-
breath_out_interval = 0.1 * duration * breath_out_duration / (breath_in_duration + breath_out_duration)
|
69
|
-
|
70
|
-
ease_in = [1.0000, 0.9933, 0.9707, 0.9277, 0.8573, 0.7487, 0.5872, 0.3685, 0.1541, 0.0325, 0.0000].map{|v| [v, breath_in_interval] }
|
71
|
-
ease_out = [1.0000, 0.9859, 0.9426, 0.8694, 0.7666, 0.6362, 0.4841, 0.3212, 0.1664, 0.0476, 0.0000].reverse.map{|v| [v, breath_out_interval] }
|
72
|
-
|
73
|
-
(ease_in + ease_out).map do |v, t|
|
74
|
-
darken_color(hex, 1 - (v * depth)) << t
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
private
|
79
|
-
|
80
|
-
def blink
|
81
|
-
@@blink ||= Blink1.new
|
82
|
-
end
|
83
|
-
end
|
@@ -1,81 +0,0 @@
|
|
1
|
-
require 'celluloid'
|
2
|
-
require 'httparty'
|
3
|
-
require 'nokogiri'
|
4
|
-
|
5
|
-
module Blinkenstein
|
6
|
-
class EveMonitor
|
7
|
-
include Celluloid
|
8
|
-
include HTTParty
|
9
|
-
|
10
|
-
base_uri 'https://api.eveonline.com'
|
11
|
-
|
12
|
-
def initialize(blink)
|
13
|
-
@blink = blink
|
14
|
-
@options = YAML.load(File.read(File.expand_path('~/.blinkenstein')))
|
15
|
-
end
|
16
|
-
|
17
|
-
def refresh
|
18
|
-
response = self.class.get('/char/SkillQueue.xml.aspx', query: @options)
|
19
|
-
cached_for_seconds, hours_until_empty = parse(response)
|
20
|
-
|
21
|
-
puts "Cached for #{cached_for_seconds} seconds"
|
22
|
-
puts "Skill queue empty in #{hours_until_empty} hours"
|
23
|
-
|
24
|
-
update_blink(hours_until_empty)
|
25
|
-
ensure
|
26
|
-
after(cached_for_seconds || 60) do
|
27
|
-
refresh
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def parse(response)
|
32
|
-
skills_for_hours = -1
|
33
|
-
cached_for_seconds = 60
|
34
|
-
|
35
|
-
currentTime = DateTime.strptime(response["eveapi"]['currentTime'], '%Y-%m-%d %H:%M:%S')
|
36
|
-
cachedUntil = DateTime.strptime(response["eveapi"]['cachedUntil'], '%Y-%m-%d %H:%M:%S')
|
37
|
-
skills = ([] << response["eveapi"]["result"]["rowset"]["row"]).flatten.last
|
38
|
-
|
39
|
-
cached_for_seconds = ((cachedUntil - currentTime) * 24 * 60 * 60).to_i
|
40
|
-
|
41
|
-
puts skills.inspect
|
42
|
-
if skills && skills["endTime"] && skills['endTime'] != ''
|
43
|
-
endTime = DateTime.strptime(skills["endTime"], '%Y-%m-%d %H:%M:%S')
|
44
|
-
skills_for_hours = ((endTime - currentTime) * 24).to_i
|
45
|
-
end
|
46
|
-
[cached_for_seconds, skills_for_hours]
|
47
|
-
ensure
|
48
|
-
[cached_for_seconds, skills_for_hours]
|
49
|
-
end
|
50
|
-
|
51
|
-
|
52
|
-
def update_blink(hours_until_empty)
|
53
|
-
case hours_until_empty
|
54
|
-
when -1..8 then panic
|
55
|
-
when 9..24 then nervous
|
56
|
-
when Integer then cool
|
57
|
-
else error
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def cool
|
62
|
-
puts "Everything is cool"
|
63
|
-
@blink.breath("#00ff00", 4, 0.2)
|
64
|
-
end
|
65
|
-
|
66
|
-
def nervous
|
67
|
-
puts "There's room in the queue"
|
68
|
-
@blink.breath("#ff0000", 3, 0.3)
|
69
|
-
end
|
70
|
-
|
71
|
-
def panic
|
72
|
-
puts "Queue runs out soon."
|
73
|
-
@blink.police
|
74
|
-
end
|
75
|
-
|
76
|
-
def error
|
77
|
-
puts "Ehm. Something is wrong"
|
78
|
-
@blink.breath("#ff0000", 0.25, 0.75)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|