2010-01-17 04:24:36 +00:00
|
|
|
from lxml import html
|
|
|
|
import re
|
|
|
|
import urllib2
|
|
|
|
|
|
|
|
from util import hook
|
|
|
|
|
|
|
|
|
|
|
|
@hook.command
|
|
|
|
def mtg(inp):
|
2010-03-01 02:32:41 +00:00
|
|
|
".mtg <name> -- gets information about Magic the Gathering card <name>"
|
2010-01-17 04:24:36 +00:00
|
|
|
url = 'http://magiccards.info/query.php?cardname='
|
|
|
|
url += urllib2.quote(inp, safe='')
|
|
|
|
h = html.parse(url)
|
2010-03-16 19:46:45 +00:00
|
|
|
|
|
|
|
name = h.find('/body/table/tr/td/span/a')
|
2010-01-17 04:24:36 +00:00
|
|
|
if name is None:
|
|
|
|
return "no cards found"
|
2010-03-16 19:46:45 +00:00
|
|
|
card = name.getparent().getparent().getparent()
|
|
|
|
|
|
|
|
type = card.find('td/p').text.replace('\n', '')
|
2010-01-17 04:24:36 +00:00
|
|
|
|
2010-03-16 19:46:45 +00:00
|
|
|
# this is ugly
|
|
|
|
text = html.tostring(card.xpath("//p[@class='ctext']/b")[0])
|
|
|
|
text = text.replace('<br>', '$')
|
|
|
|
text = html.fromstring(text).text_content()
|
|
|
|
text = re.sub(r'(\w+\s*)\$+(\s*\w+)', r'\1. \2', text)
|
|
|
|
text = text.replace('$', ' ')
|
2010-03-01 02:32:41 +00:00
|
|
|
text = re.sub(r'\(.*?\)', '', text) # strip parenthetical explanations
|
|
|
|
text = re.sub(r'\.(\S)', r'. \1', text) # fix spacing
|
2010-01-17 04:24:36 +00:00
|
|
|
|
2010-03-16 19:46:45 +00:00
|
|
|
printings = card.find('td/small').text_content()
|
|
|
|
printings = re.search(r'Editions:(.*)Languages:', printings).group(1)
|
2010-03-01 02:32:41 +00:00
|
|
|
printings = re.findall(r'\s*(.+?(?: \([^)]+\))*) \((.*?)\)',
|
2010-01-17 04:24:36 +00:00
|
|
|
' '.join(printings.split()))
|
2010-03-16 19:46:45 +00:00
|
|
|
|
2010-01-17 04:24:36 +00:00
|
|
|
printing_out = ', '.join('%s (%s)' % (set_abbrevs.get(x[0], x[0]),
|
|
|
|
rarity_abbrevs.get(x[1], x[1]))
|
|
|
|
for x in printings)
|
|
|
|
|
|
|
|
name.make_links_absolute()
|
2010-03-16 19:46:45 +00:00
|
|
|
link = name.attrib['href']
|
2010-01-17 04:24:36 +00:00
|
|
|
name = name.text_content().strip()
|
|
|
|
type = type.strip()
|
|
|
|
text = ' '.join(text.split())
|
|
|
|
|
|
|
|
return ' | '.join((name, type, text, printing_out, link))
|
|
|
|
|
|
|
|
|
|
|
|
set_abbrevs = {
|
|
|
|
'15th Anniversary': '15ANN',
|
|
|
|
'APAC Junior Series': 'AJS',
|
|
|
|
'Alara Reborn': 'ARB',
|
|
|
|
'Alliances': 'AI',
|
|
|
|
'Anthologies': 'AT',
|
|
|
|
'Antiquities': 'AQ',
|
|
|
|
'Apocalypse': 'AP',
|
|
|
|
'Arabian Nights': 'AN',
|
|
|
|
'Arena League': 'ARENA',
|
|
|
|
'Asia Pacific Land Program': 'APAC',
|
|
|
|
'Battle Royale': 'BR',
|
2010-03-16 19:46:45 +00:00
|
|
|
'Battle Royale Box Set': 'BRB',
|
|
|
|
'Beatdown': 'BTD',
|
|
|
|
'Beatdown Box Set': 'BTD',
|
2010-01-17 04:24:36 +00:00
|
|
|
'Betrayers of Kamigawa': 'BOK',
|
|
|
|
'Celebration Cards': 'UQC',
|
|
|
|
'Champions of Kamigawa': 'CHK',
|
|
|
|
'Champs': 'CP',
|
|
|
|
'Chronicles': 'CH',
|
|
|
|
'Classic Sixth Edition': '6E',
|
|
|
|
'Coldsnap': 'CS',
|
|
|
|
'Coldsnap Theme Decks': 'CSTD',
|
|
|
|
'Conflux': 'CFX',
|
|
|
|
'Core Set - Eighth Edition': '8E',
|
|
|
|
'Core Set - Ninth Edition': '9E',
|
|
|
|
'Darksteel': 'DS',
|
|
|
|
'Deckmasters': 'DM',
|
|
|
|
'Dissension': 'DI',
|
|
|
|
'Dragon Con': 'DRC',
|
|
|
|
'Duel Decks: Divine vs. Demonic': 'DVD',
|
|
|
|
'Duel Decks: Elves vs. Goblins': 'EVG',
|
|
|
|
'Duel Decks: Garruk vs. Liliana': 'GVL',
|
|
|
|
'Duel Decks: Jace vs. Chandra': 'JVC',
|
2010-03-16 19:46:45 +00:00
|
|
|
'Eighth Edition': '8ED',
|
2010-01-17 04:24:36 +00:00
|
|
|
'Eighth Edition Box Set': '8EB',
|
|
|
|
'European Land Program': 'EURO',
|
|
|
|
'Eventide': 'EVE',
|
|
|
|
'Exodus': 'EX',
|
|
|
|
'Fallen Empires': 'FE',
|
|
|
|
'Fifth Dawn': '5DN',
|
|
|
|
'Fifth Edition': '5E',
|
|
|
|
'Fourth Edition': '4E',
|
|
|
|
'Friday Night Magic': 'FNMP',
|
|
|
|
'From the Vault: Dragons': 'FVD',
|
|
|
|
'From the Vault: Exiled': 'FVE',
|
|
|
|
'Future Sight': 'FUT',
|
|
|
|
'Gateway': 'GRC',
|
|
|
|
'Grand Prix': 'GPX',
|
|
|
|
'Guildpact': 'GP',
|
|
|
|
'Guru': 'GURU',
|
|
|
|
'Happy Holidays': 'HHO',
|
|
|
|
'Homelands': 'HL',
|
|
|
|
'Ice Age': 'IA',
|
|
|
|
'Introductory Two-Player Set': 'ITP',
|
|
|
|
'Invasion': 'IN',
|
|
|
|
'Judge Gift Program': 'JR',
|
|
|
|
'Judgment': 'JU',
|
|
|
|
'Junior Series': 'JSR',
|
|
|
|
'Legend Membership': 'DCILM',
|
|
|
|
'Legends': 'LG',
|
|
|
|
'Legions': 'LE',
|
2010-03-16 19:46:45 +00:00
|
|
|
'Limited Edition (Alpha)': 'LEA',
|
|
|
|
'Limited Edition (Beta)': 'LEB',
|
|
|
|
'Limited Edition Alpha': 'LEA',
|
|
|
|
'Limited Edition Beta': 'LEB',
|
2010-01-17 04:24:36 +00:00
|
|
|
'Lorwyn': 'LW',
|
|
|
|
'MTGO Masters Edition': 'MED',
|
|
|
|
'MTGO Masters Edition II': 'ME2',
|
|
|
|
'MTGO Masters Edition III': 'ME3',
|
|
|
|
'Magic 2010': 'M10',
|
|
|
|
'Magic Game Day Cards': 'MGDC',
|
|
|
|
'Magic Player Rewards': 'MPRP',
|
|
|
|
'Magic Scholarship Series': 'MSS',
|
|
|
|
'Magic: The Gathering Launch Parties': 'MLP',
|
|
|
|
'Media Inserts': 'MBP',
|
|
|
|
'Mercadian Masques': 'MM',
|
|
|
|
'Mirage': 'MR',
|
|
|
|
'Mirrodin': 'MI',
|
|
|
|
'Morningtide': 'MT',
|
|
|
|
'Multiverse Gift Box Cards': 'MGBC',
|
|
|
|
'Nemesis': 'NE',
|
|
|
|
'Ninth Edition Box Set': '9EB',
|
|
|
|
'Odyssey': 'OD',
|
|
|
|
'Onslaught': 'ON',
|
|
|
|
'Planar Chaos': 'PC',
|
|
|
|
'Planechase': 'PCH',
|
|
|
|
'Planeshift': 'PS',
|
|
|
|
'Portal': 'PO',
|
|
|
|
'Portal Demogame': 'POT',
|
|
|
|
'Portal Second Age': 'PO2',
|
|
|
|
'Portal Three Kingdoms': 'P3K',
|
|
|
|
'Premium Deck Series: Slivers': 'PDS',
|
|
|
|
'Prerelease Events': 'PTC',
|
|
|
|
'Pro Tour': 'PRO',
|
|
|
|
'Prophecy': 'PR',
|
|
|
|
'Ravnica: City of Guilds': 'RAV',
|
|
|
|
'Release Events': 'REP',
|
|
|
|
'Revised Edition': 'RV',
|
|
|
|
'Saviors of Kamigawa': 'SOK',
|
|
|
|
'Scourge': 'SC',
|
|
|
|
'Seventh Edition': '7E',
|
|
|
|
'Shadowmoor': 'SHM',
|
|
|
|
'Shards of Alara': 'ALA',
|
|
|
|
'Starter': 'ST',
|
2010-03-16 19:46:45 +00:00
|
|
|
'Starter 1999': 'S99',
|
2010-01-17 04:24:36 +00:00
|
|
|
'Starter 2000 Box Set': 'ST2K',
|
|
|
|
'Stronghold': 'SH',
|
|
|
|
'Summer of Magic': 'SOM',
|
|
|
|
'Super Series': 'SUS',
|
|
|
|
'Tempest': 'TP',
|
|
|
|
'Tenth Edition': '10E',
|
|
|
|
'The Dark': 'DK',
|
|
|
|
'Time Spiral': 'TS',
|
|
|
|
'Time Spiral Timeshifted': 'TSTS',
|
|
|
|
'Torment': 'TR',
|
|
|
|
'Two-Headed Giant Tournament': 'THGT',
|
|
|
|
'Unglued': 'UG',
|
|
|
|
'Unhinged': 'UH',
|
|
|
|
'Unhinged Alternate Foils': 'UHAA',
|
|
|
|
'Unlimited Edition': 'UN',
|
|
|
|
"Urza's Destiny": 'UD',
|
|
|
|
"Urza's Legacy": 'UL',
|
|
|
|
"Urza's Saga": 'US',
|
|
|
|
'Visions': 'VI',
|
|
|
|
'Weatherlight': 'WL',
|
|
|
|
'Worlds': 'WRL',
|
|
|
|
'WotC Online Store': 'WOTC',
|
|
|
|
'Zendikar': 'ZEN'}
|
|
|
|
|
|
|
|
rarity_abbrevs = {
|
2010-02-02 04:42:34 +00:00
|
|
|
'Land': 'L',
|
2010-01-17 04:24:36 +00:00
|
|
|
'Common': 'C',
|
|
|
|
'Uncommon': 'UC',
|
|
|
|
'Rare': 'R',
|
|
|
|
'Special': 'S',
|
|
|
|
'Mythic Rare': 'MR'}
|