def times_from_location(q: str, twentyfour: bool) -> Dict[str, List[str]]:
    api_key = configuration.get('google_maps_api_key')
    if not api_key:
        raise NotConfiguredException('No value found for google_maps_api_key')
    url = 'https://maps.googleapis.com/maps/api/geocode/json?address={q}&key={api_key}&sensor=false'.format(
        q=internal.escape(q), api_key=api_key)
    info = internal.fetch_json(url)
    if 'error_message' in info:
        return info['error_message']
    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}&key={api_key}&sensor=false'.format(
        lat=internal.escape(str(location['lat'])),
        lng=internal.escape(str(location['lng'])),
        timestamp=internal.escape(str(dtutil.dt2ts(dtutil.now()))),
        api_key=api_key)
    timezone_info = internal.fetch_json(url)
    if 'error_message' in timezone_info:
        return timezone_info['error_message']
    if timezone_info['status'] == 'ZERO_RESULTS':
        raise TooFewItemsException(timezone_info['status'])
    try:
        timezone = dtutil.timezone(timezone_info['timeZoneId'])
    except KeyError as e:
        raise TooFewItemsException(
            f'Unable to find a timezone in {timezone_info}')
    return {current_time(timezone, twentyfour): [q]}
Beispiel #2
0
def scryfall_image(card: Card, version: str = '', face: str = None) -> str:
    if face == 'meld':
        name = card.names[1]
    elif ' // ' in card.name:
        name = card.name.replace(' // ', '/')
    else:
        name = card.name
    u = 'https://api.scryfall.com/cards/named?exact={c}&format=image'.format(c=escape(name))
    if version:
        u += '&version={v}'.format(v=escape(version))
    if face and face != 'meld':
        u += '&face={f}'.format(f=escape(face))
    return u
Beispiel #3
0
def search_scryfall(query):
    """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, []
    print(f'Searching scryfall for `{query}`')
    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)
    result_data = result_json['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'] 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, result_json.get('warnings', [])
def search_scryfall(query: str,
                    exhaustive: bool = False) -> 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.
       Supply exhaustive=True to instead retrieve the full list (potentially very slow)."""
    if query == '':
        return False, []
    redis_key = f'scryfall:query:{query}:' + ('exhaustive' if exhaustive else
                                              'nonexhaustive')
    cached = redis.get_list(redis_key)
    result_data: List[Dict]
    if cached:
        total_cards, result_data = int(cached[0]), cached[1]
    else:
        url = 'https://api.scryfall.com/cards/search?q=' + internal.escape(
            query)
        result_data = []
        while True:
            result_json = internal.fetch_json(url, 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']
            total_cards = int(result_json['total_cards'])
            if not exhaustive or len(result_data) >= total_cards:
                break
            sleep(0.1)
            url = result_json['next_page']
        redis.store(redis_key, [total_cards, result_data], ex=3600)
    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 total_cards, result_cardnames
def scryfall_image(card: Card, version: str = '') -> 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
def bluebones_image(cards: List[Card]) -> str:
    c = '|'.join(card.name for card in cards)
    return 'http://magic.bluebones.net/proxies/index2.php?c={c}'.format(c=escape(c))
Beispiel #7
0
def time(q: str) -> str:
    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'])
        try:
            timezone = dtutil.timezone(timezone_info['timeZoneId'])
        except KeyError as e:
            raise TooFewItemsException(f'Unable to find a timezone in {timezone_info}')
    else:
        try:
            timezone = dtutil.timezone(q.upper())
        except pytz.exceptions.UnknownTimeZoneError: # type: ignore
            raise TooFewItemsException('Not a recognized timezone: {q}'.format(q=q))
    return dtutil.now(timezone).strftime('%l:%M %p')