def cardhoarder_url(d):
    cs = {}
    for entry in d.maindeck + d.sideboard:
        name = entry['card'].name
        cs[name] = cs.get(name, 0) + entry['n']
    deck_s = '||'.join([str(v) + ' ' + k.replace(' // ', '/').replace('"', '') for k, v in cs.items()])
    return 'https://www.cardhoarder.com/decks/upload?deck={deck}'.format(deck=internal.escape(deck_s))
Exemple #2
0
def search_scryfall(query: str) -> Tuple[int, List[str]]:
    """Returns a tuple. First member is an integer indicating how many cards match the query total,
       second member is a list of card names up to the maximum that could be fetched in a timely fashion."""
    if query == '':
        return False, []
    result_json = internal.fetch_json('https://api.scryfall.com/cards/search?q=' + internal.escape(query), character_encoding='utf-8')
    if 'code' in result_json.keys(): # The API returned an error
        if result_json['status'] == 404: # No cards found
            return False, []
        print('Error fetching scryfall data:\n', result_json)
        return False, []
    for warning in result_json.get('warnings', []): #scryfall-provided human-readable warnings
        print(warning) # Why aren't we displaying these to the user?
    result_data = result_json['data']
    result_data.sort(key=lambda x: x['legalities']['penny'])

    def get_frontside(scr_card: Dict) -> str:
        """If card is transform, returns first name. Otherwise, returns name.
        This is to make sure cards are later found in the database"""
        #not sure how to handle meld cards
        if scr_card['layout'] in ['transform', 'flip']:
            return scr_card['card_faces'][0]['name']
        return scr_card['name']
    result_cardnames = [get_frontside(obj) for obj in result_data]
    return result_json['total_cards'], result_cardnames
def time(q):
    if len(q) > 3:
        url = 'http://maps.googleapis.com/maps/api/geocode/json?address={q}&sensor=false'.format(
            q=internal.escape(q))
        info = internal.fetch_json(url)
        try:
            location = info['results'][0]['geometry']['location']
        except IndexError as e:
            raise TooFewItemsException(e)
        url = 'https://maps.googleapis.com/maps/api/timezone/json?location={lat},{lng}&timestamp={timestamp}&sensor=false'.format(
            lat=internal.escape(str(location['lat'])),
            lng=internal.escape(str(location['lng'])),
            timestamp=internal.escape(str(dtutil.dt2ts(dtutil.now()))))
        timezone_info = internal.fetch_json(url)
        if timezone_info['status'] == 'ZERO_RESULTS':
            raise TooFewItemsException(timezone_info['status'])
        timezone = dtutil.timezone(timezone_info['timeZoneId'])
    else:
        try:
            timezone = dtutil.timezone(q.upper())
        except pytz.exceptions.UnknownTimeZoneError:
            raise TooFewItemsException(
                'Not a recognized timezone: {q}'.format(q=q))
    return dtutil.now(timezone).strftime('%l:%M %p')
def search_scryfall(query):
    """Returns a tuple. First member is bool indicating whether there were too many cards to search,
    second member is a list of card names."""
    max_n_queries = 2 #API returns 60 cards at once. Indicate how many pages max should be shown.
    if query == '':
        return False, []
    result_json = internal.fetch_json('https://api.scryfall.com/cards/search?q=' + internal.escape(query), character_encoding='utf-8')
    if 'code' in result_json.keys(): #the API returned an error
        if result_json['status'] == 404: #no cards found
            print('Scryfall search yielded 0 results.')
            return False, []
        print('Error fetching scryfall data:\n', result_json)
        return False, []
    for warning in result_json.get('warnings', []): #scryfall-provided human-readable warnings
        print(warning)
    too_many_cards = result_json['total_cards'] > max_n_queries * 60
    result_data = result_json['data']
    for _ in range(max_n_queries - 1): #fetch the remaining pages
        if not result_json['has_more']:
            break
        result_json = internal.fetch_json(result_json['next_page'])
        result_data.extend(result_json.get('data', []))

    result_data.sort(key=lambda x: x['legalities']['penny'])

    def get_frontside(scr_card):
        """If card is transform, returns first name. Otherwise, returns name.
        This is to make sure cards are later found in the database"""
        #not sure how to handle meld cards
        if scr_card['layout'] == 'transform':
            return scr_card['all_parts'][0]['name']
        if scr_card['layout'] == 'flip':
            return scr_card['card_faces'][0]['name']
        return scr_card['name']
    result_cardnames = [get_frontside(obj) for obj in result_data]
    return too_many_cards, result_cardnames
Exemple #5
0
def scryfall_image(card, version='') -> str:
    u = 'https://api.scryfall.com/cards/named?exact={c}&format=image'.format(
        c=escape(card.name))
    if version:
        u += '&version={v}'.format(v=escape(version))
    return u
Exemple #6
0
def bluebones_image(cards) -> str:
    c = '|'.join(card.name for card in cards)
    return 'http://magic.bluebones.net/proxies/index2.php?c={c}'.format(
        c=escape(c))
def time(q):
    no_results_msg = 'Location unknown.'
    url = 'http://maps.googleapis.com/maps/api/geocode/json?address={q}&sensor=false'.format(q=internal.escape(q))
    info = internal.fetch_json(url)
    try:
        location = info['results'][0]['geometry']['location']
    except IndexError:
        return no_results_msg
    url = 'https://maps.googleapis.com/maps/api/timezone/json?location={lat},{lng}&timestamp={timestamp}&sensor=false'.format(lat=internal.escape(str(location['lat'])), lng=internal.escape(str(location['lng'])), timestamp=internal.escape(str(dtutil.dt2ts(dtutil.now()))))
    timezone_info = internal.fetch_json(url)
    if timezone_info['status'] == 'ZERO_RESULTS':
        return no_results_msg
    return dtutil.now(dtutil.timezone(timezone_info['timeZoneId'])).strftime('%l:%M %p')
Exemple #8
0
def scryfall_image(card) -> str:
    return "https://api.scryfall.com/cards/named?exact={c}&format=image".format(
        c=escape(card.name))