Example #1
0
def run(*args):
    """Add a card to the database from the mtgsdk."""
    if args:
        # import pdb; pdb.set_trace()
        set_str = args[0]
        cur_set = ''
        try:
            cur_set = sourceSet.find(set_str)
        except:
            print('Set id was invalid, please check id')
            return
        set_in_db = False
        all_sets = Set.objects.all()
        selected_set = ''
        for one_set in all_sets:
            if cur_set.name == one_set.name:
                set_in_db = True
                selected_set = one_set
        if set_in_db:
            cards_in_set = selected_set.card_set.all()
            cards_in_set.delete()
            gen_set(set_str, selected_set)
        else:
            new_set = Set(name=cur_set.name,
                          set_id=cur_set.code,
                          slug=slugify(cur_set.code))
            new_set.save()
            gen_set(set_str, new_set)

    else:
        all_cards = Card.objects.all()
        all_cards.delete()
        sets = Set.objects.all()
        if not sets:
            return
        cur_set = sets[0]
        rivals = SourceCard.where(set='rix')
        rivals_cards = rivals.all()
        for card in rivals_cards:
            new_card = Card.objects.create(name=card.name,
                                           colors=card.colors,
                                           cmc=card.cmc,
                                           image=card.image_url,
                                           mana_cost=card.mana_cost,
                                           rarity=card.rarity,
                                           card_type=card.types,
                                           card_subtypes=card.subtypes,
                                           card_text=card.text,
                                           number=card.number
                                           )
            if card.power:
                new_card.power = card.power
            if card.toughness:
                new_card.toughness = card.toughness
            if card.loyalty:
                new_card.loyalty = card.loyalty
            new_card.save()
            cur_set.card_set.add(new_card)
            if card.rarity == 'Common':
                pass
Example #2
0
    def test_find_returns_set(self):
        with vcr.use_cassette('fixtures/ktk.yaml'):
            set = Set.find('ktk')

            self.assertEqual('KTK', set.code)
            self.assertEqual('Khans of Tarkir', set.name)
            self.assertEqual('expansion', set.type)
            #NOTE: The API doesn't seem to be providing "border" at this time
            #self.assertEqual('black', set.border)
            self.assertTrue('common' in set.booster)
            self.assertEqual('2014-09-26', set.release_date)
Example #3
0
 def test_find_returns_set(self):
     with vcr.use_cassette('fixtures/ktk.yaml'):
         set = Set.find('ktk')
         
         self.assertEqual('KTK', set.code)
         self.assertEqual('Khans of Tarkir', set.name)
         self.assertEqual('expansion', set.type)
         self.assertEqual('black', set.border)
         self.assertTrue('common' in set.booster)
         self.assertEqual('2014-09-26', set.release_date)
         self.assertEqual('ktk', set.magic_cards_info_code)
def get_card(card_request, session):
    session_attributes = {}
    cards = Card.where(name=card_request['intent']['slots']['CardName']['value'])\
                .where(contains='imageUrl').all()
    card = cards[0]
    title = card.name
    output = card.name + " is a " + card.type + " from " + Set.find(
        card.set).name + ",  and it's text reads " + card.text
    reprompt_text = "Please try again"
    return build_response(
        session_attributes,
        build_speechlet_response(title, output, reprompt_text, False))
Example #5
0
def card_query_to_set_name(card):
    """
    Takes: a card (a line from a facebook message) which has had all other commands removed (quantity, foil, etc)
        besides the set code
    Returns: the verbose full set name of the set code given, or an empty string
    """
    if card.split()[0][0] == "!" and len(
            card.split()[0]) == 4:  # Set codes must be 3 letters long
        code = card.split()[0][1:]  # Cut off exclamation mark
        try:
            set = Set.find(code).name
        except restclient.MtgException:
            set = ""
        return set
    else:
        return ""
Example #6
0
def find_cost(decknumber, all_main_decks, carddict, legal_sets, error, player_names, total_cost):
	setname = "temp"
	possible_sets = []
	cost_of_deck = 0
	for cardnumber in range(len(all_main_decks[decknumber])):
		cardname = all_main_decks[decknumber][cardnumber][0]
		if(cardname == "Mountain" or cardname == "Island" or cardname == "Swamp" or cardname == "Forest" or cardname == "Plains" or cardname == "Wastes"):
			continue#These are free cards, no one sells them
		if cardname in carddict:#Save time, on look ups
			cost_of_deck = cost_of_deck + (carddict[cardname] * float(all_main_decks[decknumber][cardnumber][1]))
			continue
			
			
		#format the card so it can be accepted
		tempcard = cardname
		tempcard = "\"" + cardname + "\""
		tempcard = tempcard.replace("'", "\'")
		cards = Card.where(name=tempcard).all()
		possible_sets.clear()
		#clean up the raw data

		#Find all sets the card was printed in
		for x in range(len(cards)):
			possible_sets.append(Set.find(cards[x].set).name)
			possible_sets[x] = possible_sets[x].replace('\\xa0', '')
			possible_sets[x] = possible_sets[x].replace(' ', '')
			possible_sets[x] = possible_sets[x].replace(' ','')
			#for some reason, the API returns 'time spiral timeshifted' but its referred to as timeshifted
			if(possible_sets[x] == "Time Spiral Timeshifted"):
				possible_sets[x] = "Timeshifted"
		
		flag = 0
		#Find the modern legal sets the card was printed in
		for set_1 in range(len(possible_sets)):
			for set_2 in range(len(legal_sets)):
				if(possible_sets[set_1] == legal_sets[set_2]):
					setname = possible_sets[set_1]
					flag = 1
				if(flag == 1):
					break
			if(flag == 1):
				break
		if(flag == 0):
			#Dont mind the debugging.
			#print("CARD NOT FOUND IN LEGAL SET")
			#for set_1 in range(len(possible_sets)):
			#	print(possible_sets[set_1])
			error.write(cardname)
			error.write('\n')
			error.write(tempcard)
			error.write('\n')
			continue
		flag = 0#Sanity check
		
		#alter the text s.t. it fits the url format
		setname = setname.replace(" ",'+')
		setname = setname.replace(".","")
		setname = setname.replace(":","")
		setname = setname.replace("'","")
		
		#For some reason, the site Im using has 'core set' after magic 2015 and 2014 but NOT 
		#after 2013-2010
		if(setname == "Magic+2015" or setname == "Magic+2014"):
			setname = setname + "+Core+Set"
		
		tempcard = cardname
		tempcard = tempcard.replace(" // ", " ")
		tempcard = tempcard.replace(" ","+")
		tempcard = tempcard.replace(",","")
		tempcard = tempcard.replace("'","")
		
		url = 'https://www.mtggoldfish.com/price/%s/%s#paper'%(setname,tempcard)
		
		cash = urllib.request.urlopen(url).read()
		sop = bs.BeautifulSoup(cash,'lxml')
		x = 0
		for div in sop.find_all('div' , class_='price-box-price'):
			if(x == 1):#Finds the physical cost of the card
				carddict[cardname] = float(div.text)
				cost_of_deck = cost_of_deck + (float(div.text) * float(all_main_decks[decknumber][cardnumber][1]))
				x = 0
			else:#as opposed to the price of it in an online format
				x = x + 1
	print("Total cost of the deck: $" + (str(float(truncate(cost_of_deck,2)))))
	
	#Originally wrote to file with no user input
	#ditched the idea but kept non-error file writing in the off chance I want to use it
	total_cost.write(player_names[decknumber])
	total_cost.write(": $")
	total_cost.write(str(float(truncate(cost_of_deck,2))))
	total_cost.write('\n')
Example #7
0
def return_url_line_type(cardName, memoizer):
    quantity, name = cardName.split(" ", 1)
    quantity = quantity.strip()
    name = name.strip()
    if name in memoizer:
        url_string, card_type, name, _, _ = memoizer[name]
        url_string = f"{quantity} {url_string}"
        return url_string, card_type, name
    cards = Card.where(name=name.split("/")[0]).iter()
    try:
        card = next(cards)
        while (("Land" not in card.type and "Creature" not in card.type
                and "Sorcery" not in card.type and "Instant" not in card.type
                and "Enchantment" not in card.type and "Artifact"
                not in card.type and "Planeswalker" not in card.type)
               or (not card.multiverse_id)
               or (not card.name.lower().strip()
                   == name.split("/")[0].lower().strip())):
            card = next(cards)
    except:
        return cardName, "Unknown", name
    url = "http://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid={}".format(
        card.multiverse_id)
    if "Land" in card.type:
        card_type = "Land"
    elif "Creature" in card.type:
        card_type = "Creature"
    elif "Sorcery" in card.type:
        card_type = "Sorcery"
    elif "Instant" in card.type:
        card_type = "Instant"
    elif "Enchantment" in card.type:
        card_type = "Enchantment"
    elif "Artifact" in card.type:
        card_type = "Artifact"
    elif "Planeswalker" in card.type:
        card_type = "Planeswalker"
    else:
        card_type = "Unknown"
    try:
        last_set = sorted([
            x for x in card.printings if Set.find(x).type in [
                'expansion', 'core', 'draft_innovation', 'masters',
                'commander', 'archenemy', 'starter', 'planechase'
            ]
        ],
                          key=lambda x: Set.find(x).release_date,
                          reverse=True)[0]
    except:
        print(name)
        #print([Set.find(x).type for x in card.printings])
        last_set = None
    try:
        number = [
            x for x in Card.where(name=name.split("/")[0], set=last_set).all()
            if x.name == name.split("/")[0]
        ][0].number
    except:
        number = 0
    if last_set == "DOM":
        last_set = "DAR"

    memoizer[name] = ("[{}]({})".format(name, url), card_type, name, last_set,
                      number)
    return "{} [{}]({})".format(quantity, name, url), card_type, name
Example #8
0
def get_date(set_code):
    return Set.find(set_code)
Example #9
0
from mtgsdk import Card
from mtgsdk import Set

set_name = 'M20'

m20_set = Set.find(set_name).all()
m20_cards = Card.where(set=set_name).all()

for card in m20_cards:
    print(card.name)