cockatrice_feeder 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/gobble +0 -1
  3. data/lib/cockatrice_feeder.rb +105 -15
  4. metadata +15 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 24f7024643afdea0db12839734cbed1c53ee4c6c
4
- data.tar.gz: 01bcde57c9f203c9fe6950fc494f69ff83c08e10
3
+ metadata.gz: b8351da4a5eff2051048c3b0c0610167361f97ee
4
+ data.tar.gz: 56f2632308cd7bd822a9daab16741d247fbbd274
5
5
  SHA512:
6
- metadata.gz: eae340d56ba6c06d767a2a4f95755c09652fbe50eb8002605dc2fec899cdd6b0d9946f73bbac41ee28dd652063230498b98001577ac89d0305a42ada5bea865c
7
- data.tar.gz: 6b389611a8499be46c93f05731e8bd7499f9745aa9a19fc14c06dd8fa354c0006576e2214044ee1d12af03dac90e967bbf78825d7eb1b2394e669f604d553645
6
+ metadata.gz: dd03bf14ebbdf4731c7acb48147dd786c87668737e06f867d1048ff2241a79b39a34deb14f806ed1abb283a0c2d479a62d176f6f5124f90e6558ff5ad3688cb9
7
+ data.tar.gz: 4777f537c2a521625396116ee1b6bb9860f62d482c6e9e61815b39cdf5996fd2df7e43979656040250435e481ab791c3616dcf45df7a94853df6b450c64f698d
data/bin/gobble CHANGED
@@ -1,4 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
-
3
2
  require 'cockatrice_feeder'
4
3
  CockatriceFeeder.gobble
@@ -1,7 +1,8 @@
1
1
  module CockatriceFeeder
2
2
  require 'httparty'
3
- require 'awesome_print'
4
3
  require 'nokogiri'
4
+ require 'fileutils'
5
+ require 'descriptive_statistics'
5
6
 
6
7
  @@app_dir = Dir.pwd+"/"
7
8
  @@deck_dir = @@app_dir+"decks/"
@@ -11,6 +12,9 @@ module CockatriceFeeder
11
12
  @@app_dir = (dir + (dir[-1] != "/" ? "/" : ""))
12
13
  @@deck_dir = @@app_dir+"decks/"
13
14
  @@meta_dir = @@app_dir+"meta/"
15
+
16
+ puts "decks will go here: #{@@deck_dir}"
17
+ puts "meta data will go here: #{@@meta_dir}"
14
18
  end
15
19
 
16
20
  def self.app_dir
@@ -19,6 +23,7 @@ module CockatriceFeeder
19
23
 
20
24
  def self.set_deck_dir(dir)
21
25
  @@deck_dir = (dir + (dir[-1] != "/" ? "/" : ""))
26
+ puts "decks will go here: #{@@deck_dir}"
22
27
  end
23
28
 
24
29
  def self.deck_dir
@@ -27,20 +32,23 @@ module CockatriceFeeder
27
32
 
28
33
  def self.set_meta_dir(dir)
29
34
  @@meta_dir = (dir + (dir[-1] != "/" ? "/" : ""))
35
+ puts "meta data will go here: #{@@meta_dir}"
30
36
  end
31
37
 
32
38
  def self.meta_dir
33
39
  @@meta_dir
34
40
  end
35
41
 
36
- def self.setup
42
+ def self.setup(skip_meta = false)
37
43
  unless File.directory?(@@meta_dir)
38
44
  Dir.mkdir(@@meta_dir)
39
45
  puts "Creating a folder at '#{@@meta_dir}' for storing meta data."
40
- puts "Fetching meta data."
41
- update_commanders()
42
- update_banned()
43
- update_commander_tiers()
46
+ unless skip_meta
47
+ puts "Fetching meta data."
48
+ update_commanders()
49
+ update_banned()
50
+ update_commander_tiers()
51
+ end
44
52
  end
45
53
 
46
54
  unless File.directory?(@@deck_dir)
@@ -61,7 +69,7 @@ module CockatriceFeeder
61
69
  end
62
70
 
63
71
  def self.update_commanders
64
- puts "Downloading a list of all commanderse from EDHREC."
72
+ puts "Downloading a list of all commanders from EDHREC."
65
73
  commander_cids = %w(
66
74
  w g r u b
67
75
  wu ub br rg gw wb ur bg rw gu
@@ -139,15 +147,24 @@ module CockatriceFeeder
139
147
  end
140
148
 
141
149
  def self.commanders
150
+ unless File.exist?(@@meta_dir+"commanders.json")
151
+ update_commanders()
152
+ end
142
153
  JSON.parse(File.read(@@meta_dir+"commanders.json"))
143
154
  end
144
155
 
145
156
  def self.banned
157
+ unless File.exist?(@@meta_dir+"banned.json")
158
+ update_banned()
159
+ end
146
160
  JSON.parse(File.read(@@meta_dir+"banned.json"))
147
161
  end
148
162
  # names = banned.map{|c| c["name"]}.uniq.sort
149
163
 
150
- def self.tiers
164
+ def self.commander_tiers
165
+ unless File.exist?(@@meta_dir+"tiers.json")
166
+ update_commander_tiers()
167
+ end
151
168
  JSON.parse(File.read(@@meta_dir+"tiers.json"))
152
169
  end
153
170
 
@@ -165,7 +182,7 @@ module CockatriceFeeder
165
182
  deck[:name],
166
183
  deck[:price],
167
184
  subfolder
168
- ].compact.reject(&:empty?).uniq.join('_')
185
+ ].compact.reject(&:empty?).uniq.join('_').gsub("/","")
169
186
 
170
187
  builder = Nokogiri::XML::Builder.new do |xml|
171
188
  xml.cockatrice_deck(:version => "1"){
@@ -280,12 +297,70 @@ module CockatriceFeeder
280
297
  output_cod(deck,"edhrecavg")
281
298
  end
282
299
 
283
- def self.deckstats_decklist
284
300
 
301
+ #order ["views,desc", "price,desc", "likes,desc", "updated,desc"]
302
+ #commander should be a name attribute from the commanders array of objects
303
+ def self.deckstats_decklist(commander = "nil", pages = (1..1), order = "likes,desc", price_min = "", price_max = "")
304
+ decklist = []
305
+ pages.each do |page|
306
+ url = [
307
+ "https://deckstats.net/decks/search/?lng=en",
308
+ "&search_title=",
309
+ "&search_format=10",
310
+ "&search_season=0",
311
+ "&search_cards_commander%5B%5D=#{URI.encode_www_form_component(commander)}",
312
+ "&search_cards_commander%5B%5D=",
313
+ "&search_price_min=#{price_min}",
314
+ "&search_price_max=#{price_max}",
315
+ "&search_colors%5B%5D=",
316
+ "&search_number_cards_main=100",
317
+ "&search_number_cards_sideboard=",
318
+ "&search_cards%5B%5D=",
319
+ "&search_tags=",
320
+ "&search_order=#{URI.encode_www_form_component(order)}",
321
+ "&utf8=%E2%9C%94",
322
+ "&page=#{page}"
323
+ ].join("")
324
+
325
+ doc = Nokogiri::HTML(HTTParty.get(url).body)
326
+
327
+ doc.css(".deck_row").each do |dr|
328
+ link = dr.css("td")[1].css("a").first.attribute("href").value
329
+ decklist << {
330
+ link: link,
331
+ name: link.split("/")[-2],
332
+ commanders: [commander].reject(&:empty?),
333
+ price: nil,
334
+ date: nil,
335
+ cardlist: []
336
+ }
337
+ end
338
+ end
339
+
340
+ decklist
285
341
  end
286
342
 
287
- def self.deckstats_deck
343
+ def self.deckstats_deck(deck)
344
+ docstring = HTTParty.get(deck[:link]).body
345
+
346
+ doc = Nokogiri::HTML(docstring)
347
+
348
+ legal = (doc.css(".fa-exclamation-triangle").count == 0)
349
+
350
+ if legal
351
+ deck_data = JSON.parse(docstring.split("init_deck_data(").last.split(");deck_display();").first)
352
+ deck[:date] = DateTime.strptime(deck_data["updated"].to_s,'%s')
353
+ unless deck_data["highlight_cards"].nil?
354
+ deck[:commanders] = deck_data["highlight_cards"]
355
+ end
356
+ deck[:cardlist] = deck_data["sections"].map do |sec|
357
+ sec["cards"].map{|c| "#{c["amount"]} #{c["name"]}"}
358
+ end.flatten
359
+
360
+ deck[:price] = doc.css(".deck_overview_price").first.content.gsub("$","").strip.split(".").first
288
361
 
362
+ output_cod(deck,'deckstats')
363
+ end
289
364
  end
290
365
 
291
366
  def self.mtgdecks_decklist(pages = (1..1))
@@ -313,7 +388,6 @@ module CockatriceFeeder
313
388
  end
314
389
 
315
390
  def self.mtgdecks_deck(deck)
316
- puts deck[:link]
317
391
  doc = Nokogiri::HTML(HTTParty.get(deck[:link]).body)
318
392
 
319
393
  cardlist = []
@@ -335,7 +409,8 @@ module CockatriceFeeder
335
409
  end
336
410
 
337
411
  def self.gobble
338
- setup()
412
+ setup(skip_meta = true)
413
+ update_commanders()
339
414
 
340
415
  total_decks = 0
341
416
 
@@ -360,10 +435,25 @@ module CockatriceFeeder
360
435
  puts "#{decks.length} decks found."
361
436
  decks.each {|d|
362
437
  CockatriceFeeder.mtgdecks_deck(d)
363
- total_decks += 1
438
+ if d[:cardlist].length < 0
439
+ total_decks += 1
440
+ end
364
441
  }
365
442
 
366
- puts "#{total_decks} decks created."
443
+ puts "Fetching the first 5 pages of edh decks from deckstats ordered by likes"
444
+ decks = CockatriceFeeder.deckstats_decklist("", (1..5))
445
+ puts "#{decks.length} decks found."
446
+ decks.each {|d|
447
+ CockatriceFeeder.deckstats_deck(d)
448
+ if d[:cardlist].length < 0
449
+ total_decks += 1
450
+ end
451
+ }
452
+
453
+ puts "#{total_decks} decks created at #{@@deck_dir}."
454
+
455
+ puts "cleaning up"
456
+ FileUtils.remove_dir(@@meta_dir)
367
457
  puts "Scraw!"
368
458
  end
369
459
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cockatrice_feeder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Steinwachs
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0.18'
41
+ - !ruby/object:Gem::Dependency
42
+ name: descriptive_statistics
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.5'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.5'
41
55
  description: A tool to scrape MTG decks from the internet along with some meta information
42
56
  and create Cockatrice compatible deck files.
43
57
  email: matt.steinwachs@gmail.com