cockatrice_feeder 0.0.2 → 0.0.3

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.
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