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 ADDED
@@ -0,0 +1,17 @@
1
+ .bundle
2
+ .yardoc
3
+ Gemfile.lock
4
+ InstalledFiles
5
+ _yardoc
6
+ coverage
7
+ doc/
8
+ lib/bundler/man
9
+ pkg
10
+ rdoc
11
+ spec/reports
12
+ test/tmp
13
+ test/version_tmp
14
+ tmp
15
+ bin/*
16
+ !bin/blinkenstein
17
+ bin
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 1.9.3-p362-railsexpress
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ bundler_args: --without development
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ before_install:
7
+ - sudo apt-get install -qq gcc-avr avr-libc
8
+ - sudo apt-get install -qq libusb-1.0-0-dev
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
@@ -0,0 +1,6 @@
1
+ guard 'rspec' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
6
+
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Blinkenstein
2
2
 
3
+ [![Build Status](https://travis-ci.org/BugRoger/blinkenstein.png)](https://travis-ci.org/BugRoger/blinkenstein)
4
+
3
5
  TODO: Write a gem description
4
6
 
5
7
  ## Installation
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
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 = Dir['Gemfile', 'Gemfile.lock', 'LICENSE.txt', 'README.md', 'lib/**/*', 'bin/blinkenstein', 'blinkenstein.gemspec']
16
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
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('nokogiri')
26
+ gem.add_dependency('blink1-patterns')
24
27
  end
data/exe/blinkenstein ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), "/../lib"))
4
+ require "blinkenstein"
5
+
6
+ Blinkenstein::SupervisionGroup.run
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/eve"
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,14 @@
1
+ module Blinkenstein
2
+ module Monitor
3
+ extend Logging
4
+
5
+ def self.repository
6
+ @repository ||= []
7
+ end
8
+
9
+ def self.included(klass)
10
+ logger.info "Registering monitor #{klass}"
11
+ repository << klass.new
12
+ end
13
+ end
14
+ 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
@@ -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
- @monitors = []
12
- @blink = Blink.new
9
+ refresh_all
13
10
 
14
- register(EveMonitor.new(blink))
11
+ every(15) do
12
+ refresh_all
13
+ end
15
14
  end
16
15
 
17
- def register(monitor)
18
- @monitors << monitor
19
- monitor.refresh
16
+ def refresh_all
17
+ logger.debug "Refreshing all monitors"
18
+ Monitor.repository.each(&:refresh)
20
19
  end
21
20
  end
22
21
  end
@@ -1,3 +1,3 @@
1
1
  module Blinkenstein
2
- VERSION = "0.1.5"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/eve.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'eve/base'
2
+ require 'eve/skill_queue'
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
@@ -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
@@ -0,0 +1,6 @@
1
+ require 'vcr'
2
+
3
+ VCR.configure do |c|
4
+ c.cassette_library_dir = 'spec/fixtures'
5
+ c.hook_into :webmock
6
+ end
metadata CHANGED
@@ -2,79 +2,95 @@
2
2
  name: blinkenstein
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.5
5
+ version: 0.2.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Michael Schmidt
9
9
  autorequire:
10
- bindir: bin
10
+ bindir: exe
11
11
  cert_chain: []
12
- date: 2013-02-15 00:00:00.000000000 Z
12
+ date: 2013-02-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: celluloid
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
- prerelease: false
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: rb-blink1
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
- prerelease: false
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: nokogiri
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
- prerelease: false
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
- - Gemfile.lock
107
+ - Guardfile
88
108
  - LICENSE.txt
89
109
  - README.md
90
- - lib/blinkenstein/blink.rb
91
- - lib/blinkenstein/monitors/eve.rb
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/blinkenstein.rb
95
- - bin/blinkenstein
96
- - blinkenstein.gemspec
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
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env ruby
2
- lib = File.expand_path('../../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
-
5
- require "bundler/setup"
6
- require "blinkenstein"
7
-
8
- Blinkenstein::SupervisionGroup.run
@@ -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