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.
- checksums.yaml +4 -4
- data/bin/gobble +0 -1
- data/lib/cockatrice_feeder.rb +105 -15
- metadata +15 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8351da4a5eff2051048c3b0c0610167361f97ee
|
4
|
+
data.tar.gz: 56f2632308cd7bd822a9daab16741d247fbbd274
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd03bf14ebbdf4731c7acb48147dd786c87668737e06f867d1048ff2241a79b39a34deb14f806ed1abb283a0c2d479a62d176f6f5124f90e6558ff5ad3688cb9
|
7
|
+
data.tar.gz: 4777f537c2a521625396116ee1b6bb9860f62d482c6e9e61815b39cdf5996fd2df7e43979656040250435e481ab791c3616dcf45df7a94853df6b450c64f698d
|
data/bin/gobble
CHANGED
data/lib/cockatrice_feeder.rb
CHANGED
@@ -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
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
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
|
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.
|
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
|
-
|
438
|
+
if d[:cardlist].length < 0
|
439
|
+
total_decks += 1
|
440
|
+
end
|
364
441
|
}
|
365
442
|
|
366
|
-
puts "
|
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.
|
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
|