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
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)
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))
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 ""
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')
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
def get_date(set_code): return Set.find(set_code)
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)