From e273df2850e65d91e22cadcc8cac5895dacf22e6 Mon Sep 17 00:00:00 2001 From: friarsol Date: Tue, 19 Dec 2023 23:50:21 -0500 Subject: [PATCH] Update scraper --- forge-gui/res/draft/rankings/lci.rnk | 529 +++++++++--------- .../gamemodes/limited/ReadDraftRankings.java | 1 - forge-gui/tools/RankingScraper.py | 103 +--- 3 files changed, 292 insertions(+), 341 deletions(-) diff --git a/forge-gui/res/draft/rankings/lci.rnk b/forge-gui/res/draft/rankings/lci.rnk index 0bbe95cfd21..1a233920887 100644 --- a/forge-gui/res/draft/rankings/lci.rnk +++ b/forge-gui/res/draft/rankings/lci.rnk @@ -1,292 +1,291 @@ -//Rank|Name|Rarity|Set #1|Aclazotz, Deepest Betrayal|M|LCI #2|Bonehoard Dracosaur|M|LCI -#3|Unstable Glyphbridge|R|LCI -#4|Palani's Hatcher|R|LCI -#5|Kitesail Larcenist|R|LCI -#6|Sanguine Evangelist|R|LCI -#7|Breeches, Eager Pillager|R|LCI -#8|Huatli, Poet of Unity|M|LCI +#3|Palani's Hatcher|R|LCI +#4|Sanguine Evangelist|R|LCI +#5|Breeches, Eager Pillager|R|LCI +#6|Huatli, Poet of Unity|M|LCI +#7|Unstable Glyphbridge|R|LCI +#8|Kitesail Larcenist|R|LCI #9|Magmatic Galleon|R|LCI #10|Pugnacious Hammerskull|R|LCI #11|Sentinel of the Nameless City|R|LCI -#12|Trumpeting Carnosaur|R|LCI -#13|Spyglass Siren|U|LCI -#14|Quintorius Kand|M|LCI -#15|Thousand Moons Smithy|R|LCI -#16|Zoetic Glyph|U|LCI -#17|Ojer Kaslem, Deepest Growth|M|LCI -#18|Warden of the Inner Sky|R|LCI -#19|Preacher of the Schism|R|LCI +#12|Zoetic Glyph|U|LCI +#13|Ojer Kaslem, Deepest Growth|M|LCI +#14|Trumpeting Carnosaur|R|LCI +#15|Warden of the Inner Sky|R|LCI +#16|Spyglass Siren|U|LCI +#17|Quintorius Kand|M|LCI +#18|Preacher of the Schism|R|LCI +#19|Thousand Moons Smithy|R|LCI #20|Akal Pakal, First Among Equals|R|LCI #21|Deep-Cavern Bat|U|LCI -#22|Resplendent Angel|M|LCI -#23|Inti, Seneschal of the Sun|R|LCI -#24|Subterranean Schooner|R|LCI -#25|Chimil, the Inner Sun|M|LCI -#26|Anim Pakal, Thousandth Moon|R|LCI -#27|Malcolm, Alluring Scoundrel|R|LCI -#28|The Skullspore Nexus|M|LCI -#29|Staunch Crewmate|U|LCI -#30|Ruin-Lurker Bat|U|LCI -#31|Intrepid Paleontologist|R|LCI +#22|The Skullspore Nexus|M|LCI +#23|Resplendent Angel|M|LCI +#24|Inti, Seneschal of the Sun|R|LCI +#25|Subterranean Schooner|R|LCI +#26|Chimil, the Inner Sun|M|LCI +#27|Anim Pakal, Thousandth Moon|R|LCI +#28|Malcolm, Alluring Scoundrel|R|LCI +#29|Intrepid Paleontologist|R|LCI +#30|Staunch Crewmate|U|LCI +#31|Ruin-Lurker Bat|U|LCI #32|Itzquinth, Firstborn of Gishath|U|LCI -#33|Spring-Loaded Sawblades|U|LCI -#34|Geological Appraiser|U|LCI -#35|Clay-Fired Bricks|U|LCI -#36|Ojer Pakpatiq, Deepest Epoch|M|LCI -#37|Bedrock Tortoise|R|LCI -#38|Restless Anchorage|R|LCI -#39|Deepfathom Echo|R|LCI +#33|Clay-Fired Bricks|U|LCI +#34|Bedrock Tortoise|R|LCI +#35|Spring-Loaded Sawblades|U|LCI +#36|Geological Appraiser|U|LCI +#37|Ojer Pakpatiq, Deepest Epoch|M|LCI +#38|Captain Storm, Cosmium Raider|U|LCI +#39|Chupacabra Echo|U|LCI #40|Miner's Guidewing|C|LCI #41|Oltec Cloud Guard|C|LCI #42|Waterwind Scout|C|LCI #43|Kellan, Daring Traveler|R|LCI -#44|Captain Storm, Cosmium Raider|U|LCI -#45|The Everflowing Well|R|LCI -#46|Restless Ridgeline|R|LCI -#47|Chupacabra Echo|U|LCI -#48|Jadelight Spelunker|R|LCI -#49|Poetic Ingenuity|R|LCI -#50|Dusk Rose Reliquary|U|LCI -#51|Dire Flail|R|LCI -#52|Cogwork Wrestler|C|LCI -#53|Lodestone Needle|U|LCI -#54|Starving Revenant|R|LCI -#55|The Ancient One|M|LCI -#56|Hulking Raptor|R|LCI -#57|Oaken Siren|C|LCI -#58|Ojer Axonil, Deepest Might|M|LCI +#44|Restless Anchorage|R|LCI +#45|Restless Ridgeline|R|LCI +#46|Deepfathom Echo|R|LCI +#47|Jadelight Spelunker|R|LCI +#48|Starving Revenant|R|LCI +#49|Hulking Raptor|R|LCI +#50|Oaken Siren|C|LCI +#51|The Everflowing Well|R|LCI +#52|Bringer of the Last Gift|R|LCI +#53|Throne of the Grim Captain|R|LCI +#54|Dusk Rose Reliquary|U|LCI +#55|Dire Flail|R|LCI +#56|Cogwork Wrestler|C|LCI +#57|Lodestone Needle|U|LCI +#58|Cenote Scout|U|LCI #59|Abuelo, Ancestral Echo|R|LCI -#60|Vito, Fanatic of Aclazotz|M|LCI -#61|Throne of the Grim Captain|R|LCI +#60|Poetic Ingenuity|R|LCI +#61|Pathfinding Axejaw|C|LCI #62|Petrify|C|LCI #63|Inverted Iceberg|C|LCI -#64|Restless Reef|R|LCI -#65|Etali's Favor|C|LCI -#66|Bringer of the Last Gift|R|LCI -#67|Thrashing Brontodon|U|LCI -#68|Threefold Thunderhulk|R|LCI -#69|Market Gnome|U|LCI -#70|Belligerent Yearling|U|LCI -#71|Pathfinding Axejaw|C|LCI -#72|Roaming Throne|R|LCI -#73|Dreadmaw's Ire|U|LCI -#74|Kinjalli's Dawnrunner|U|LCI -#75|Unlucky Drop|C|LCI -#76|Brackish Blunder|C|LCI -#77|Tinker's Tote|C|LCI -#78|Cenote Scout|U|LCI -#79|Defossilize|U|LCI -#80|Diamond Pick-Axe|U|LCI -#81|Earthshaker Dreadmaw|U|LCI -#82|Master's Guide-Mural|U|LCI -#83|Staggering Size|C|LCI -#84|Goblin Tomb Raider|C|LCI -#85|Waylaying Pirates|C|LCI -#86|Souls of the Lost|R|LCI -#87|Poison Dart Frog|C|LCI -#88|Restless Prairie|R|LCI -#89|The Belligerent|R|LCI -#90|Braided Net|R|LCI -#91|Scytheclaw Raptor|U|LCI -#92|Colossadactyl|U|LCI -#93|Guardian of the Great Door|U|LCI -#94|Vanguard of the Rose|U|LCI -#95|Corpses of the Lost|R|LCI -#96|Triumphant Chomp|U|LCI -#97|Caparocti Sunborn|U|LCI -#98|Abrade|C|LCI -#99|Huatli's Final Strike|C|LCI -#100|Malamet Battle Glyph|U|LCI -#101|Cavern Stomper|C|LCI -#102|Volatile Wanderglyph|C|LCI -#103|Plundering Pirate|C|LCI -#104|Chart a Course|U|LCI -#105|Stalactite Stalker|R|LCI -#106|Tishana's Tidebinder|R|LCI -#107|Explorer's Cache|U|LCI -#108|Saheeli's Lattice|U|LCI -#109|Jade Seedstones|U|LCI -#110|Kutzil, Malamet Exemplar|U|LCI -#111|Orazca Puzzle-Door|C|LCI -#112|Bitter Triumph|U|LCI -#113|Scampering Surveyor|U|LCI -#114|Armored Kincaller|C|LCI -#115|Sunshot Militia|C|LCI -#116|Ancestors' Aid|C|LCI -#117|Tithing Blade|C|LCI -#118|Quicksand Whirlpool|C|LCI -#119|Ironpaw Aspirant|C|LCI -#120|Deconstruction Hammer|C|LCI -#121|Acrobatic Leap|C|LCI -#122|Hidden Courtyard|C|LCI -#123|Ojer Taq, Deepest Foundation|M|LCI -#124|Bloodletter of Aclazotz|M|LCI -#125|Dinotomaton|C|LCI -#126|Hermitic Nautilus|U|LCI -#127|Council of Echoes|U|LCI -#128|Ixalli's Lorekeeper|U|LCI -#129|Tendril of the Mycotyrant|U|LCI -#130|Fanatical Offering|C|LCI -#131|Panicked Altisaur|C|LCI -#132|Another Chance|C|LCI -#133|River Herald Scout|C|LCI -#134|Attentive Sunscribe|C|LCI -#135|Hidden Cataract|C|LCI -#136|Sinuous Benthisaur|U|LCI -#137|Cosmium Confluence|R|LCI -#138|Malamet War Scribe|U|LCI -#139|Terror Tide|R|LCI -#140|Sunfire Torch|C|LCI -#141|Join the Dead|C|LCI -#142|Deathcap Marionette|C|LCI -#143|Dead Weight|C|LCI -#144|Shipwreck Sentry|C|LCI -#145|Eaten by Piranhas|U|LCI -#146|Oltec Archaeologists|C|LCI -#147|Might of the Ancestors|U|LCI -#148|Captivating Cave|C|LCI -#149|Hidden Necropolis|C|LCI -#150|Hidden Nursery|C|LCI -#151|Hidden Volcano|C|LCI -#152|Idol of the Deep King|C|LCI +#64|Dreadmaw's Ire|U|LCI +#65|The Ancient One|M|LCI +#66|Etali's Favor|C|LCI +#67|Bloodletter of Aclazotz|M|LCI +#68|Ojer Axonil, Deepest Might|M|LCI +#69|Poison Dart Frog|C|LCI +#70|Thrashing Brontodon|U|LCI +#71|Vito, Fanatic of Aclazotz|M|LCI +#72|Defossilize|U|LCI +#73|Belligerent Yearling|U|LCI +#74|Roaming Throne|R|LCI +#75|Restless Reef|R|LCI +#76|Staggering Size|C|LCI +#77|Malamet Battle Glyph|U|LCI +#78|Goblin Tomb Raider|C|LCI +#79|Kinjalli's Dawnrunner|U|LCI +#80|Unlucky Drop|C|LCI +#81|Brackish Blunder|C|LCI +#82|Tinker's Tote|C|LCI +#83|Souls of the Lost|R|LCI +#84|Restless Prairie|R|LCI +#85|Threefold Thunderhulk|R|LCI +#86|Market Gnome|U|LCI +#87|Diamond Pick-Axe|U|LCI +#88|Colossadactyl|U|LCI +#89|Earthshaker Dreadmaw|U|LCI +#90|Master's Guide-Mural|U|LCI +#91|Triumphant Chomp|U|LCI +#92|Abrade|C|LCI +#93|Huatli's Final Strike|C|LCI +#94|Scampering Surveyor|U|LCI +#95|Volatile Wanderglyph|C|LCI +#96|Tithing Blade|C|LCI +#97|Waylaying Pirates|C|LCI +#98|Stalactite Stalker|R|LCI +#99|The Belligerent|R|LCI +#100|Braided Net|R|LCI +#101|Guardian of the Great Door|U|LCI +#102|Corpses of the Lost|R|LCI +#103|Caparocti Sunborn|U|LCI +#104|Kutzil, Malamet Exemplar|U|LCI +#105|Bitter Triumph|U|LCI +#106|Cavern Stomper|C|LCI +#107|Armored Kincaller|C|LCI +#108|Plundering Pirate|C|LCI +#109|Ancestors' Aid|C|LCI +#110|Quicksand Whirlpool|C|LCI +#111|Ironpaw Aspirant|C|LCI +#112|Ojer Taq, Deepest Foundation|M|LCI +#113|Tishana's Tidebinder|R|LCI +#114|Terror Tide|R|LCI +#115|Scytheclaw Raptor|U|LCI +#116|Explorer's Cache|U|LCI +#117|Vanguard of the Rose|U|LCI +#118|Saheeli's Lattice|U|LCI +#119|Ixalli's Lorekeeper|U|LCI +#120|Jade Seedstones|U|LCI +#121|Tendril of the Mycotyrant|U|LCI +#122|Wail of the Forgotten|R|LCI +#123|Orazca Puzzle-Door|C|LCI +#124|Sunshot Militia|C|LCI +#125|Panicked Altisaur|C|LCI +#126|Another Chance|C|LCI +#127|Deconstruction Hammer|C|LCI +#128|Acrobatic Leap|C|LCI +#129|Hidden Courtyard|C|LCI +#130|Hidden Nursery|C|LCI +#131|Chart a Course|U|LCI +#132|Dinotomaton|C|LCI +#133|Hermitic Nautilus|U|LCI +#134|Council of Echoes|U|LCI +#135|Molten Collapse|R|LCI +#136|Fanatical Offering|C|LCI +#137|Sunfire Torch|C|LCI +#138|Join the Dead|C|LCI +#139|Echo of Dusk|C|LCI +#140|Deathcap Marionette|C|LCI +#141|Dead Weight|C|LCI +#142|River Herald Scout|C|LCI +#143|Attentive Sunscribe|C|LCI +#144|Captivating Cave|C|LCI +#145|Hidden Cataract|C|LCI +#146|Hidden Necropolis|C|LCI +#147|Hidden Volcano|C|LCI +#148|Sinuous Benthisaur|U|LCI +#149|Idol of the Deep King|C|LCI +#150|Cosmium Confluence|R|LCI +#151|Saheeli, the Sun's Brilliance|M|LCI +#152|Sovereign Okinec Ahau|M|LCI #153|Skullcap Snail|C|LCI -#154|Dauntless Dismantler|U|LCI -#155|Confounding Riddle|U|LCI -#156|Brass's Tunnel-Grinder|R|LCI -#157|Twists and Turns|U|LCI -#158|Restless Vents|R|LCI -#159|Visage of Dread|U|LCI -#160|Molten Collapse|R|LCI -#161|Wail of the Forgotten|R|LCI -#162|River Herald Guide|C|LCI -#163|Echo of Dusk|C|LCI -#164|Pirate Hat|C|LCI -#165|Soaring Sandwing|C|LCI -#166|Adaptive Gemguard|C|LCI -#167|Saheeli, the Sun's Brilliance|M|LCI -#168|Careening Mine Cart|U|LCI -#169|Rampaging Ceratops|U|LCI -#170|Nurturing Bristleback|C|LCI -#171|Akawalli, the Seething Tower|U|LCI -#172|Kutzil's Flanker|R|LCI -#173|Stinging Cave Crawler|U|LCI -#174|Synapse Necromage|U|LCI -#175|In the Presence of Ages|C|LCI -#176|Rumbling Rockslide|C|LCI -#177|Burning Sun Cavalry|C|LCI -#178|Ray of Ruin|C|LCI -#179|Cosmium Blast|C|LCI +#154|Malamet War Scribe|U|LCI +#155|Twists and Turns|U|LCI +#156|Visage of Dread|U|LCI +#157|River Herald Guide|C|LCI +#158|Shipwreck Sentry|C|LCI +#159|Eaten by Piranhas|U|LCI +#160|Soaring Sandwing|C|LCI +#161|Oltec Archaeologists|C|LCI +#162|Ghalta, Stampede Tyrant|M|LCI +#163|Bat Colony|U|LCI +#164|Dauntless Dismantler|U|LCI +#165|Confounding Riddle|U|LCI +#166|Rampaging Ceratops|U|LCI +#167|Nurturing Bristleback|C|LCI +#168|Akawalli, the Seething Tower|U|LCI +#169|Restless Vents|R|LCI +#170|Synapse Necromage|U|LCI +#171|Malamet Scythe|C|LCI +#172|In the Presence of Ages|C|LCI +#173|Burning Sun Cavalry|C|LCI +#174|Ray of Ruin|C|LCI +#175|Sage of Days|C|LCI +#176|Pirate Hat|C|LCI +#177|Might of the Ancestors|U|LCI +#178|Cosmium Blast|C|LCI +#179|Adaptive Gemguard|C|LCI #180|Rampaging Spiketail|C|LCI -#181|Goldfury Strider|U|LCI -#182|Ghalta, Stampede Tyrant|M|LCI -#183|Uchbenbak, the Great Mistake|U|LCI -#184|Bat Colony|U|LCI -#185|Helping Hand|U|LCI -#186|Enterprising Scallywag|U|LCI -#187|Digsite Conservator|U|LCI -#188|Oteclan Landmark|C|LCI -#189|Merfolk Cave-Diver|U|LCI -#190|Zoyowa Lava-Tongue|U|LCI -#191|Hoverstone Pilgrim|U|LCI -#192|Malamet Scythe|C|LCI -#193|Primordial Gnawer|C|LCI -#194|Sage of Days|C|LCI -#195|Sovereign Okinec Ahau|M|LCI -#196|Sunken Citadel|R|LCI -#197|Abyssal Gorestalker|U|LCI -#198|Tarrian's Soulcleaver|R|LCI -#199|Forgotten Monument|U|LCI -#200|Promising Vein|C|LCI +#181|Uchbenbak, the Great Mistake|U|LCI +#182|Careening Mine Cart|U|LCI +#183|Brass's Tunnel-Grinder|R|LCI +#184|Kutzil's Flanker|R|LCI +#185|Stinging Cave Crawler|U|LCI +#186|Zoyowa Lava-Tongue|U|LCI +#187|Forgotten Monument|U|LCI +#188|Rumbling Rockslide|C|LCI +#189|Primordial Gnawer|C|LCI +#190|Tarrian's Journal|R|LCI +#191|Goldfury Strider|U|LCI +#192|Coati Scavenger|U|LCI +#193|Sunbird Standard|U|LCI +#194|Enterprising Scallywag|U|LCI +#195|Digsite Conservator|U|LCI +#196|Oteclan Landmark|C|LCI +#197|Merfolk Cave-Diver|U|LCI +#198|Hoverstone Pilgrim|U|LCI +#199|Promising Vein|C|LCI +#200|Walk with the Ancestors|C|LCI #201|Mineshaft Spider|C|LCI -#202|Malamet Veteran|C|LCI -#203|Seismic Monstrosaur|C|LCI -#204|Daring Discovery|C|LCI -#205|Mischievous Pup|U|LCI -#206|Out of Air|C|LCI -#207|Ancestral Reminiscence|C|LCI -#208|Thousand Moons Crackshot|C|LCI -#209|Envoy of Okinec Ahau|C|LCI -#210|Tarrian's Journal|R|LCI -#211|Coati Scavenger|U|LCI -#212|Sunbird Standard|U|LCI -#213|Cavernous Maw|U|LCI -#214|Soulcoil Viper|U|LCI -#215|Hurl into History|U|LCI -#216|Nicanzil, Current Conductor|U|LCI -#217|Cartographer's Companion|C|LCI -#218|Walk with the Ancestors|C|LCI -#219|Fungal Fortitude|C|LCI -#220|Glorifier of Suffering|C|LCI -#221|Family Reunion|C|LCI +#202|Seismic Monstrosaur|C|LCI +#203|Daring Discovery|C|LCI +#204|Mischievous Pup|U|LCI +#205|Thousand Moons Crackshot|C|LCI +#206|Envoy of Okinec Ahau|C|LCI +#207|The Mycotyrant|M|LCI +#208|Cavern of Souls|M|LCI +#209|Cavernous Maw|U|LCI +#210|Soulcoil Viper|U|LCI +#211|Sunken Citadel|R|LCI +#212|Helping Hand|U|LCI +#213|Abyssal Gorestalker|U|LCI +#214|Gargantuan Leech|U|LCI +#215|Calamitous Cave-In|U|LCI +#216|Tarrian's Soulcleaver|R|LCI +#217|Malamet Veteran|C|LCI +#218|Fungal Fortitude|C|LCI +#219|Out of Air|C|LCI +#220|Ancestral Reminiscence|C|LCI +#221|Glorifier of Suffering|C|LCI #222|Didact Echo|C|LCI -#223|Bartolome del Presidio|U|LCI -#224|Amalia Benavides Aguirre|R|LCI -#225|Gargantuan Leech|U|LCI -#226|Dowsing Device|U|LCI +#223|Amalia Benavides Aguirre|R|LCI +#224|Hurl into History|U|LCI +#225|Dowsing Device|U|LCI +#226|Nicanzil, Current Conductor|U|LCI #227|Runaway Boulder|C|LCI -#228|Mephitic Draught|C|LCI -#229|Relic's Roar|C|LCI -#230|Gishath, Sun's Avatar|M|LCI -#231|The Mycotyrant|M|LCI -#232|Cavern of Souls|M|LCI -#233|Glimpse the Core|U|LCI -#234|Compass Gnome|C|LCI -#235|Calamitous Cave-In|U|LCI -#236|Over the Edge|C|LCI -#237|Malamet Brawler|C|LCI -#238|Hotfoot Gnome|C|LCI -#239|Greedy Freebooter|C|LCI +#228|Cartographer's Companion|C|LCI +#229|Family Reunion|C|LCI +#230|Bartolome del Presidio|U|LCI +#231|Gishath, Sun's Avatar|M|LCI +#232|Glimpse the Core|U|LCI +#233|Compass Gnome|C|LCI +#234|Over the Edge|C|LCI +#235|Malamet Brawler|C|LCI +#236|Hotfoot Gnome|C|LCI +#237|Mephitic Draught|C|LCI +#238|Greedy Freebooter|C|LCI +#239|Relic's Roar|C|LCI #240|Marauding Brinefang|C|LCI -#241|Thousand Moons Infantry|C|LCI -#242|Treasure Map|R|LCI -#243|Queen's Bay Paladin|R|LCI -#244|Self-Reflection|U|LCI -#245|Hunter's Blowgun|C|LCI -#246|Seeker of Sunlight|C|LCI -#247|Brazen Blademaster|C|LCI -#248|Screaming Phantom|C|LCI -#249|Song of Stupefaction|C|LCI -#250|Curator of Sun's Creation|U|LCI -#251|Waterlogged Hulk|U|LCI -#252|Broodrage Mycoid|C|LCI -#253|Get Lost|R|LCI -#254|Frilled Cave-Wurm|C|LCI -#255|Basking Capybara|C|LCI -#256|Deep Goblin Skulltaker|C|LCI -#257|Acolyte of Aclazotz|C|LCI -#258|Deeproot Pilgrimage|R|LCI -#259|Growing Rites of Itlimoc|R|LCI -#260|Spelunking|U|LCI -#261|Matzalantli, the Great Door|R|LCI -#262|Bloodthorn Flail|U|LCI -#263|The Millennium Calendar|M|LCI -#264|Pit of Offerings|U|LCI -#265|Zoyowa's Justice|U|LCI -#266|Glowcap Lantern|U|LCI -#267|Squirming Emergence|R|LCI -#268|Echoing Deeps|R|LCI -#269|Abuelo's Awakening|R|LCI -#270|Canonized in Blood|U|LCI -#271|Malicious Eclipse|U|LCI -#272|Kaslem's Stonetree|C|LCI -#273|Swashbuckler's Whip|U|LCI -#274|Volatile Fault|U|LCI -#275|Disruptor Wanderglyph|C|LCI -#276|Buried Treasure|C|LCI -#277|Disturbed Slumber|C|LCI -#278|Tectonic Hazard|C|LCI -#279|Child of the Volcano|C|LCI -#280|Vito's Inquisitor|C|LCI -#281|Grasping Shadows|U|LCI -#282|The Enigma Jewel|M|LCI -#283|Hit the Mother Lode|R|LCI -#284|Fabrication Foundry|R|LCI +#241|Queen's Bay Paladin|R|LCI +#242|Seeker of Sunlight|C|LCI +#243|Brazen Blademaster|C|LCI +#244|Screaming Phantom|C|LCI +#245|Treasure Map|R|LCI +#246|Get Lost|R|LCI +#247|Curator of Sun's Creation|U|LCI +#248|Self-Reflection|U|LCI +#249|Waterlogged Hulk|U|LCI +#250|Hunter's Blowgun|C|LCI +#251|Thousand Moons Infantry|C|LCI +#252|Song of Stupefaction|C|LCI +#253|Broodrage Mycoid|C|LCI +#254|Spelunking|U|LCI +#255|Squirming Emergence|R|LCI +#256|Frilled Cave-Wurm|C|LCI +#257|Basking Capybara|C|LCI +#258|Deep Goblin Skulltaker|C|LCI +#259|Acolyte of Aclazotz|C|LCI +#260|Deeproot Pilgrimage|R|LCI +#261|Growing Rites of Itlimoc|R|LCI +#262|Matzalantli, the Great Door|R|LCI +#263|Bloodthorn Flail|U|LCI +#264|The Millennium Calendar|M|LCI +#265|Pit of Offerings|U|LCI +#266|Fabrication Foundry|R|LCI +#267|Zoyowa's Justice|U|LCI +#268|Glowcap Lantern|U|LCI +#269|Echoing Deeps|R|LCI +#270|Abuelo's Awakening|R|LCI +#271|Canonized in Blood|U|LCI +#272|Malicious Eclipse|U|LCI +#273|Kaslem's Stonetree|C|LCI +#274|Swashbuckler's Whip|U|LCI +#275|Volatile Fault|U|LCI +#276|Disruptor Wanderglyph|C|LCI +#277|Buried Treasure|C|LCI +#278|Disturbed Slumber|C|LCI +#279|Tectonic Hazard|C|LCI +#280|Child of the Volcano|C|LCI +#281|Vito's Inquisitor|C|LCI +#282|Grasping Shadows|U|LCI +#283|The Enigma Jewel|M|LCI +#284|Hit the Mother Lode|R|LCI #285|Sorcerous Spyglass|U|LCI #286|Contested Game Ball|U|LCI #287|Plains|C|LCI #288|Island|C|LCI #289|Swamp|C|LCI #290|Mountain|C|LCI -#291|Forest|C|LCI \ No newline at end of file +#291|Forest|C|LCI diff --git a/forge-gui/src/main/java/forge/gamemodes/limited/ReadDraftRankings.java b/forge-gui/src/main/java/forge/gamemodes/limited/ReadDraftRankings.java index 561667f5bf7..9cda5a11631 100644 --- a/forge-gui/src/main/java/forge/gamemodes/limited/ReadDraftRankings.java +++ b/forge-gui/src/main/java/forge/gamemodes/limited/ReadDraftRankings.java @@ -1,7 +1,6 @@ package forge.gamemodes.limited; import java.io.File; -import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/forge-gui/tools/RankingScraper.py b/forge-gui/tools/RankingScraper.py index b8b23019532..fc87257643f 100644 --- a/forge-gui/tools/RankingScraper.py +++ b/forge-gui/tools/RankingScraper.py @@ -1,92 +1,50 @@ import json -import sys import requests import argparse -import BeautifulSoup -BESTIAIRE = False -SMDS = True - -def bestiaireRanking(code='EMN', name='Eldritch Moon'): - # POST http://draft.bestiaire.org/ranking.php - # Params: - # edition: ORI - data, code = idToNameLoops(name, code) - #r = requests.post("http://draft.bestiaire.org/ranking.php", data={'edition': code}) - pass - # Output to file - -def smdsRankings(edition='EldritchMoon', name='Eldritch Moon'): - # get http://syunakira.com/smd/pointranking/index.php?packname=MAGICORIGINS&language=English - r = requests.get("http://syunakira.com/smd/pointranking/index.php?packname=%s&language=English" % edition) - bs = BeautifulSoup.BeautifulSoup(r.text) - images = bs.findAll('img') - cards = [] - data, code = idToNameLoops(name) - with open(name + ' Rankings.txt', 'w') as out: - # Output to file - out.write('//Rank|Name|Rarity|Set\n') - # #1|Sphinx of the Final Word|M|OGW - - c = 1 - for i in images: - img = i.get('src') - idx = img.find(edition) - if idx > -1: - parsed = img[idx:-4].split("/")[-1] - if parsed in data: - # Basic lands are weird - card = data[parsed] - l = [str(c), card['name'], card['rarity'], code] - c += 1 - out.write('#') - out.write('|'.join(l)) - out.write('\n') - - return True - -def draftsimRankings(edition='KHM', name='Kalheim'): - r = requests.get("http://draftsim.com/generated/%s.js" % edition) +def draftsimRankings(edition='KHM', extra=None): + url1 = 'https://draftsim.com/generated/%s/' % (edition) + url2 = '%s' % edition + url = url1 + url2 + '.js' + r = requests.get(url) tx = r.text start = tx.find('[') end = tx.rfind(']') - # Deal with illegal JSON :( - replaceList = ['name', 'castingcost1', 'castingcost2', 'type', 'rarity', 'myrating', 'image', 'cmc', 'colors', 'creaturesort', 'colorsort', 'chase_card'] + replaceList = ['name', 'castingcost1', 'castingcost2', 'type', 'rarity', 'myrating', 'image', "image2", 'cmc', 'colors', 'creaturesort', 'colorsort', 'chase_card'] # Has an extra comma that json loader doesn't like txt = tx[start:end-1]+']' for rpl in replaceList: txt = txt.replace('%s:'%rpl, '"%s":'%rpl) + txt2 = "" + if extra: + url3 = '%s' % extra + urlx = url1 + url3 + '.js' + x = requests.get(urlx) + tx2 = x.text + start = tx2.find('[') + end = tx2.rfind(']') + txt2 = tx2[start:end-1]+']' + for rpl in replaceList: + txt2 = txt2.replace('%s:'%rpl, '"%s":'%rpl) + txt2 = txt2.replace('[', '', 1) + trim = txt.rfind(']') + txt = txt[:trim] + ', ' + txt[trim+1:] - cardlist = json.loads(txt) + txt3 = txt + txt2 + txt3 = txt3.replace(u'\xa9', '') + print(txt3) + + cardlist = json.loads(txt3) cardlist.sort(key=lambda k:k['myrating'], reverse=True) - with open(name + '_Rankings.txt', 'w') as out: + with open("../res/draft/rankings/" + edition.lower() + '.rnk', 'w') as out: for counter, card in enumerate(cardlist): l = [str(counter+1), card['name'].replace('_', ' '), card['rarity'], edition] out.write('#') out.write('|'.join(l)) out.write('\n') -def editionsRankssim(edition='SOI', name='Shadows over Innistrad'): - r = requests.get("http://draftsim.com/%s.js" % edition) - tx = r.text - start = tx.find('[') - end = tx.rfind(']') - - # Deal with illegal JSON :( - replaceList = ['name', 'castingcost1', 'castingcost2', 'type', 'rarity', 'myrating', 'image', 'cmc', 'colors', 'creaturesort', 'colorsort'] - # Has an extra comma that json loader doesn't like - txt = tx[start:end-1]+']' - for rpl in replaceList: - txt = txt.replace('%s:'%rpl, '"%s":'%rpl) - - cardlist = json.loads(txt) - out = open('%s.txt' % name, 'w') - for idx, card in enumerate(cardlist): - out.write('%s %s %s\n' % (idx+1, card['rarity'], card['name'])) - out.close() - def idToNameLoops(name, code=None): metadata = True @@ -109,14 +67,9 @@ def idToNameLoops(name, code=None): if __name__ == "__main__": parser = argparse.ArgumentParser(description='Edition File Generator') - # TODO Split setcode and smds "name" parser.add_argument('-c', action='store', dest='setcode', help='Required setcode', required=True) - parser.add_argument('-n', action='store', dest='name', help='Required Name of edition', required=True) + parser.add_argument('-x', action='store', dest='altpage', help='Additional rankings page', required=False) result = parser.parse_args() - if len(result.setcode) < 4: - draftsimRankings(result.setcode, result.name) - - else: - smdsRankings(result.setcode, result.name) + draftsimRankings(result.setcode, result.name)