blinkenstein 0.1.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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