manasimu 0.0.30 → 0.0.31

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