from __future__ import print_function from __future__ import absolute_import import datetime as dt import re import requests from os.path import expanduser from six.moves import configparser as cp from six.moves import range home = expanduser('~') CONFIG_PATH = home + '/zulip/contrib_bots/bots/foursquare/foursquare.config' def get_api_key(): # foursquare.config must have been moved from # ~/zulip/contrib_bots/bots/foursquare/foursquare.config into # ~/foursquare.config for program to work # see readme.md for more information with open(CONFIG_PATH) as settings: config = cp.ConfigParser() config.readfp(settings) return config.get('Foursquare', 'api_key') class FoursquareHandler(object): def __init__(self): self.api_key = get_api_key() def usage(self): return ''' This plugin allows users to search for restaurants nearby an inputted location to a limit of 3 venues for every location. The name, address and description of the restaurant will be outputted. It looks for messages starting with '@mention-bot'. If you need help, simply type: @mention-bot /help into the Compose Message box Sample input: @mention-bot Chicago, IL @mention-bot help ''' help_info = ''' The Foursquare bot can receive keyword limiters that specify the location, distance (meters) and cusine of a restaurant in that exact order. Please note the required use of quotes in the search location. Example Inputs: @mention-bot 'Millenium Park' 8000 donuts @mention-bot 'Melbourne, Australia' 40000 seafood ''' def format_json(self, venues): def format_venue(venue): name = venue['name'] address = ', '.join(venue['location']['formattedAddress']) keyword = venue['categories'][0]['pluralName'] blurb = '\n'.join([name, address, keyword]) return blurb return '\n'.join(format_venue(venue) for venue in venues) def send_info(self, message, letter, client): client.send_reply(message, letter) def handle_message(self, message, client, state_handler): words = message['content'].split() if "/help" in words: self.send_info(message, self.help_info, client) return # These are required inputs for the HTTP request. try: params = {'limit': '3'} params['near'] = re.search('\'[A-Za-z]\w+[,]?[\s\w+]+?\'', message['content']).group(0) params['v'] = 20170108 params['oauth_token'] = self.api_key except AttributeError: pass # Optional params for HTTP request. if len(words) >= 1: try: params['radius'] = re.search('([0-9]){3,}', message['content']).group(0) except AttributeError: pass try: params['query'] = re.search('\s([A-Za-z]+)$', message['content']).group(0)[1:] except AttributeError: params['query'] = 'food' response = requests.get('https://api.foursquare.com/v2/venues/search?', params=params) print(response.url) if response.status_code == 200: received_json = response.json() else: self.send_info(message, "Invalid Request\nIf stuck, try '@mention-bot help'.", client) return if received_json['meta']['code'] == 200: response_msg = ('Food nearby ' + params['near'] + ' coming right up:\n' + self.format_json(received_json['response']['venues'])) self.send_info(message, response_msg, client) return self.send_info(message, "Invalid Request\nIf stuck, try '@mention-bot help'.", client) return handler_class = FoursquareHandler def test_get_api_key(): # must change to your own api key for test to work result = get_api_key() assert result == 'abcdefghijksm' if __name__ == '__main__': test_get_api_key() print('Success')