c6d294385f
The send_reply function makes it easier for bots to send messages. This commit updates all bots to make use of this function, when possible.
124 lines
4.2 KiB
Python
124 lines
4.2 KiB
Python
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')
|