ubot2/service.py

87 lines
2.4 KiB
Python
Raw Permalink Normal View History

2016-09-05 19:14:28 -04:00
# service.py
# Eryn Wells <eryn@erynwells.me>
2016-11-19 00:53:01 -05:00
import logging
2016-09-05 19:14:28 -04:00
import requests
slack = None
class SlackService(object):
'''Handles requests at the Slack API.'''
_API_BASE = 'https://slack.com/api'
def __init__(self, token, host):
2016-09-05 19:14:28 -04:00
self.token = token
self.host = host
2016-11-19 00:53:01 -05:00
self.logger = logging.getLogger('service')
def permalink(self, channel, message):
'''
Generate a permalink to the given message object in the given channel.
Channel should be the name of the channel, without the leading '#'.
`message` should have a `ts` field.
'''
try:
ts = message['ts']
except KeyError:
return
ts = ts.replace('.', '')
return 'https://{}/archives/{}/p{}'.format(self.host, channel, ts)
2016-09-05 19:14:28 -04:00
#
# Endpoints
#
def channels(self):
params = self.__params()
r = requests.get(self.__url('channels.list'), params=params)
json = self.__extract_json(r)
return json['channels'] if json else None
def pins(self, channel):
params = self.__params(channel=channel)
r = requests.get(self.__url('pins.list'), params=params)
json = self.__extract_json(r)
return json['items'] if json else None
2016-11-19 00:53:01 -05:00
def remove_pin(self, pin, channel):
2016-09-05 19:14:28 -04:00
params = self.__params()
2016-11-19 00:53:01 -05:00
params['channel'] = channel
2016-09-05 19:14:28 -04:00
if pin['type'] == 'message':
params['timestamp'] = pin['message']['ts']
2016-11-19 00:53:01 -05:00
elif pin['type'] == 'file':
params['file'] = pin['file']['id']
2016-09-05 19:14:28 -04:00
r = requests.get(self.__url('pins.remove'), params=params)
json = self.__extract_json(r)
return json is not None
2016-09-11 20:01:21 -04:00
def users(self):
params = self.__params()
r = requests.get(self.__url('users.list'), params=params)
json = self.__extract_json(r)
return json['members'] if json else None
2016-09-05 19:14:28 -04:00
#
# Private
#
def __url(self, verb):
return SlackService._API_BASE + '/' + verb
def __params(self, **kwargs):
self.__append_token_param(kwargs)
return kwargs
def __append_token_param(self, params):
params['token'] = self.token
def __extract_json(self, response, code=200):
if response.status_code != code:
return None
json = response.json()
if not json['ok']:
2016-11-19 00:53:01 -05:00
self.logger.info('Response not okay: %s', json['error'])
2016-09-05 19:14:28 -04:00
return None
return json