manasimu 0.0.30 → 0.0.31

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 724aff14f6e57773ecb896037bd4eb379d9fe13ac6870c3fd37b3609682071ab
4
- data.tar.gz: 9db295c3c06234a8cd85e008e832d853f40fda0fc9341a0a5e6a8bdd98e0ed55
3
+ metadata.gz: 64a18dd83ea6eecd63bcbe76a29b33741331da0134075ccd900ea912d6bacc77
4
+ data.tar.gz: 8dcd31a698b03e8f3bbe32024e6334380682da40b83f744a38b7ca00a6f43d77
5
5
  SHA512:
6
- metadata.gz: f1b976dc510db9c4b20ce8620dceda72b8a0106d275300bb0f0d3b4413cfe862be995794155a0e02a8ac43c2a2815655342e475fe265b418f2dad6732c03f4b7
7
- data.tar.gz: 9f7a49c6b350199271151ad8adc8c5d6472def15df5210c7889c123ff849fcd1c47d017b095ae1ac06883e15dbe79ce9bec1a39ee67538d82ce6d6bac287f32c
6
+ metadata.gz: b0524f1549c37058044d8e71286814e5fe866cde702070776eb1f1cac296718202aa5f4360f732ab294849eff52a5d747f82553dd7cc21b8e149c7116ccfdbc6
7
+ data.tar.gz: ffb6a93dc2e91d7e18fc12d8a4e27f2c544d1637dae859d3a14aa23c577425dfedd54755f374a666f59055dbb4de52b1ff75bfb63d69f1ff47216b5d6c2946b7
Binary file
@@ -0,0 +1,251 @@
1
+ require 'uri'
2
+ require 'json'
3
+ require 'net/http'
4
+
5
+ API_URL = 'https://api.magicthegathering.io/v1/'
6
+ HTML_URL = 'https://gatherer.wizards.com/'
7
+
8
+ def request_cards(set_code, page)
9
+ begin
10
+ uri = URI(API_URL + "cards")
11
+ params = { page: page, pageSize: 100, set: set_code}
12
+ uri.query = URI.encode_www_form(params)
13
+ res = Net::HTTP.get_response(uri)
14
+
15
+ if not res.is_a?(Net::HTTPSuccess)
16
+ puts 'http connection fail'
17
+ exit
18
+ end
19
+
20
+ JSON.parse(res.body)
21
+ rescue => ex
22
+ p ex
23
+ sleep 30
24
+ request_cards(set_code, page)
25
+ end
26
+ end
27
+
28
+ def get_names(set_code)
29
+ page = 1
30
+ ret = []
31
+ notfounds = []
32
+
33
+ ja = 4
34
+ en = 0
35
+
36
+ while true
37
+ hash = request_cards(set_code, page)
38
+
39
+ if hash['cards'].length == 0
40
+ puts 'last page'
41
+ break
42
+ end
43
+
44
+ multiverseid_offset = nil
45
+ multiverseid_change_count = 0
46
+ ja_index = nil
47
+
48
+ unfound_cards = []
49
+ hash['cards'].each do |card|
50
+
51
+ if not card['foreignNames']
52
+ unfound_cards << card
53
+ next
54
+ end
55
+
56
+ names = card['foreignNames'].select do |f|
57
+ f['language'] == "Japanese"
58
+ end.map do |f|
59
+ f["name"]
60
+ end
61
+
62
+ ja_index = card['foreignNames'].map do |f|
63
+ f['language']
64
+ end.index('Japanese')
65
+
66
+ multiverseids = card['foreignNames'].map do |f|
67
+ f['imageUrl'] =~ /multiverseid=(\d+)&?/
68
+ $1
69
+ end
70
+
71
+ # to scrape japanese name using multiverse, get multiverse id offset
72
+ if multiverseids.length > 1
73
+ offset = multiverseids[1].to_i - multiverseids[0].to_i
74
+ if multiverseid_offset != offset
75
+ multiverseid_offset = offset
76
+ multiverseid_change_count += 1
77
+ end
78
+ end
79
+
80
+ type = create_card_type(card, ret, names)
81
+ ret = add_cardtypes_to(ret, type)
82
+ end
83
+
84
+
85
+ # if foreignNames were not found and multiverseid_offset is fixed
86
+ if unfound_cards.length > 0 and multiverseid_change_count == 1 and ja_index
87
+ puts "#{set_code} / #{unfound_cards.length} cards was not found"
88
+
89
+ unfound_cards.each do |card|
90
+ ja_multiverseid = card['multiverseid'].to_i + multiverseid_offset * (ja_index + 1)
91
+ ja_name = scrape_detail(ja_multiverseid)
92
+
93
+ p "#{ja_name}: #{card['name']}"
94
+
95
+ names = []
96
+ if not ja_name.empty?
97
+ names = [ja_name]
98
+ else
99
+ notfounds << [set_code, card['number']]
100
+ end
101
+
102
+ type = create_card_type(card, ret, names)
103
+ ret = add_cardtypes_to(ret, type)
104
+ end
105
+
106
+ elsif unfound_cards.length > 0
107
+ puts "invalid multiverseid change #{set_code} : #{unfound_cards.length}"
108
+ unfound_cards.each do |card|
109
+ notfounds << [set_code, card['number']]
110
+ type = create_card_type(card, ret, nil)
111
+ ret = add_cardtypes_to(ret, type)
112
+ end
113
+ end
114
+
115
+ p "#{ret.length}: #{ret.last}"
116
+ page +=1
117
+ end
118
+
119
+ ret.sort!
120
+
121
+ [ret, notfounds]
122
+ end
123
+
124
+ def add_cardtypes_to(card_types, card_type)
125
+ return card_types if not card_type
126
+ return card_types if card_types.find do |c|
127
+ c.number == card_type.number
128
+ end
129
+ card_types << card_type
130
+ card_types
131
+ end
132
+
133
+ def create_card_type(card, ret, names)
134
+
135
+ side_a = ret.find do |c|
136
+ c.number == card['number'].to_i
137
+ end
138
+
139
+ side = ''
140
+ if side_a
141
+ side_a.contents[0].side = 'a'
142
+ side = 'b'
143
+ end
144
+
145
+ type = [
146
+ {
147
+ name: card['name'],
148
+ names: names,
149
+ number: card['number'],
150
+ side: side,
151
+ set_code: card['set'],
152
+ mana_cost: card['manaCost'],
153
+ types: card['types'],
154
+ type: card['type'],
155
+ text: card['text'],
156
+ color_identity: card['colorIdentity'],
157
+ converted_mana_cost: card['cmc'],
158
+ multiverseid: card['multiverseid'],
159
+ }
160
+ ]
161
+
162
+ if side == ''
163
+ CardType.new type
164
+ else
165
+ side_a.contents << Content.new(type[0])
166
+ nil
167
+ end
168
+ end
169
+
170
+ def request_sets(page)
171
+ begin
172
+ params = { page: page, pageSize: 100}
173
+ uri = URI(API_URL + "sets")
174
+ uri.query = URI.encode_www_form(params)
175
+ res = Net::HTTP.get_response(uri)
176
+
177
+ if not res.is_a?(Net::HTTPSuccess)
178
+ puts 'http connection fail'
179
+ exit
180
+ end
181
+
182
+ JSON.parse(res.body)
183
+ rescue => ex
184
+ p ex
185
+ sleep 30
186
+ request_json(page)
187
+ end
188
+ end
189
+
190
+ def get_sets
191
+ ret = []
192
+ page = 1
193
+ while true
194
+ hash = request_sets(page)
195
+
196
+ if hash['sets'].length == 0
197
+ puts 'last page'
198
+ break
199
+ end
200
+ page += 1
201
+
202
+ hash['sets'].each do |set|
203
+ code = set['code']
204
+ name = set['name']
205
+ ret << [code, name]
206
+ end
207
+ end
208
+
209
+ ret.sort! do |a,b| a[0] <=> b[0] end
210
+
211
+ ret
212
+ end
213
+
214
+ def scrape_detail(multiverseid)
215
+ begin
216
+ ret = `curl -k 'https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=#{multiverseid}&printed=true'`
217
+ doc = Nokogiri::HTML.parse(ret)
218
+ doc.xpath("//*[text()[contains(., 'Card Name:')]]/parent::*").css('div.value').to_a.map do |d|
219
+ d.text.chomp.strip
220
+ end .join(" // ")
221
+ rescue => ex
222
+ puts ex
223
+ sleep 30
224
+ scrape_detail(multiverseid)
225
+ end
226
+ end
227
+
228
+ def scrape_legalities(multiverseid)
229
+ begin
230
+ ret = `curl -k 'https://gatherer.wizards.com/Pages/Card/Printings.aspx?multiverseid=#{multiverseid}'`
231
+ doc = Nokogiri::HTML.parse(ret)
232
+ legalities = {}
233
+ Format.all.each do |format|
234
+ text = doc.xpath("//*[text()[contains(., '#{format.name}')]]/parent::*/td[position() = 2]").text
235
+ legality =
236
+ if text
237
+ Legality.find(text.chomp.strip.lstrip)
238
+ else
239
+ Legality::None
240
+ end
241
+ legalities[format] = legality
242
+ end
243
+ card_info = CardInfo.new
244
+ card_info.legalities = legalities
245
+ card_info
246
+ rescue => ex
247
+ puts ex
248
+ sleep 30
249
+ scrape_legalities(multiverseid)
250
+ end
251
+ end
data/lib/manasimu/card.rb CHANGED
@@ -279,6 +279,10 @@ class CardType
279
279
  @contents[0].set_code
280
280
  end
281
281
 
282
+ def multiverseid
283
+ @contents[0].multiverseid
284
+ end
285
+
282
286
  def is_land?(side = nil)
283
287
  return @is_land if @is_land
284
288
  arr = if side == 'a'
@@ -459,7 +463,7 @@ class CardTypeAggregate
459
463
  end
460
464
 
461
465
  class Content
462
- attr_accessor :name, :names, :number, :side, :set_code, :mana_cost, :type, :types, :color_identity, :converted_mana_cost, :text
466
+ attr_accessor :name, :names, :number, :side, :set_code, :mana_cost, :type, :types, :color_identity, :converted_mana_cost, :text, :multiverseid
463
467
 
464
468
  def initialize(hash)
465
469
  @name = hash[:name]
@@ -473,6 +477,7 @@ class Content
473
477
  @text = hash[:text]
474
478
  @color_identity = hash[:color_identity]
475
479
  @converted_mana_cost = hash[:converted_mana_cost].to_i
480
+ @multiverseid = hash[:multiverseid].to_i
476
481
  end
477
482
 
478
483
  def mana_source?
@@ -497,12 +502,101 @@ class Content
497
502
  text { '#{@text}'}
498
503
  color_identity { '#{@color_identity}'}
499
504
  converted_mana_cost {#{@converted_mana_cost}}
505
+ converted_mana_cost { #{@multiverseid} }
500
506
  end
501
507
  EOF
502
508
  end
503
509
 
504
510
  end
505
511
 
512
+ class CardInfo
513
+ attr_accessor :legalities, :sets
514
+ end
515
+
516
+ class Legality
517
+ attr_accessor :name
518
+ @@legalities = nil
519
+
520
+ def initialize(name)
521
+ @name = name
522
+ end
523
+
524
+ def to_s
525
+ @name
526
+ end
527
+
528
+ None = Legality.new("Legality")
529
+ Banned = Legality.new("Banned")
530
+ Restricted = Legality.new("Restricted")
531
+ Legal = Legality.new("Legal")
532
+
533
+ def self.all
534
+ return @@legalities if @@legalities
535
+ @@legalities= [
536
+ None,
537
+ Banned,
538
+ Restricted,
539
+ Legal,
540
+ ].sort! do |a,b| a.name <=> b.name end
541
+ end
542
+
543
+ def self.find(name)
544
+ self.all.bsearch do |a|
545
+ a.name >= name
546
+ end
547
+ end
548
+
549
+ end
550
+
551
+ class Format
552
+ attr_accessor :name
553
+ @@formats = nil
554
+
555
+ def initialize(name)
556
+ @name = name
557
+ end
558
+
559
+ def to_s
560
+ @name
561
+ end
562
+
563
+ Standard = Format.new("Standard")
564
+ Brawl = Format.new("Brawl")
565
+ Pioneer = Format .new("Pioneer")
566
+ Modern = Format .new("Modern")
567
+ Legacy = Format .new("Legacy")
568
+ Vintage = Format .new("Vintage")
569
+ Commander = Format .new("Commander")
570
+ Pauper = Format .new("Pauper")
571
+ Historic = Format .new("Historic")
572
+ Alchemy = Format .new("Alchemy")
573
+ Explorer = Format .new("Explorer")
574
+
575
+ def self.all
576
+ return @@formats if @@formats
577
+ @@formats = [
578
+ Standard ,
579
+ Brawl ,
580
+ Pioneer ,
581
+ Modern ,
582
+ Legacy ,
583
+ Vintage ,
584
+ Commander ,
585
+ Pauper ,
586
+ Historic ,
587
+ Alchemy ,
588
+ Explorer ,
589
+ ].sort! do |a,b| a.name <=> b.name end
590
+ end
591
+
592
+ def self.find(name)
593
+ self.all.bsearch do |a|
594
+ a.name >= name
595
+ end
596
+ end
597
+
598
+ end
599
+
506
600
  class FordFulkersonSingleton
507
601
  include Singleton
508
602
  def obj
data/lib/manasimu/data.rb CHANGED
@@ -329,4 +329,5 @@ class Deck
329
329
  end
330
330
  return matrix.last.last
331
331
  end
332
+
332
333
  end
data/lib/manasimu.rb CHANGED
@@ -14,4 +14,5 @@ require_relative './manasimu/game.rb'
14
14
  require_relative './manasimu/simulator.rb'
15
15
  require_relative './manasimu/data.rb'
16
16
  require_relative './manasimu/expansion.rb'
17
+ require_relative './manasimu/api_util.rb'
17
18
  require_relative '../ext/ford_fulkerson.so'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: manasimu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.30
4
+ version: 0.0.31
5
5
  platform: ruby
6
6
  authors:
7
7
  - so1itaryrove
@@ -19,6 +19,7 @@ files:
19
19
  - db/card_type_aggregate
20
20
  - ext/ford_fulkerson.so
21
21
  - lib/manasimu.rb
22
+ - lib/manasimu/api_util.rb
22
23
  - lib/manasimu/card.rb
23
24
  - lib/manasimu/card/basicland.rb
24
25
  - lib/manasimu/card/fetchland.rb