import json from slackclient import SlackClient import logging log = logging.getLogger('luigi_slack') log.setLevel(logging.DEBUG) class ChannelNotFoundError(Exception): pass class ChannelListNotLoadedError(Exception): pass class SlackAPI(object): def __init__(self, token, username='Luigi-slack Bot', as_user=False, use_private_channels=True): self.client = SlackClient(token) self._all_channels = self._get_channels(use_private_channels) self.username = username self.as_user = as_user def _get_channels(self, use_private_channels): response = self.client.api_call('channels.list') if not response['ok']: raise ChannelListNotLoadedError("Error while loading channels: {}".format(response['error'])) channels = response.get('channels', []) if not channels: raise ChannelListNotLoadedError("Channel list is empty") if use_private_channels: response = self.client.api_call('groups.list') if not response['ok']: raise ChannelListNotLoadedError("Error while loading private channels: {}".format(response['error'])) channels += response.get('groups', []) return channels def get_channels(self, reload_channels=False): if not self._all_channels or reload_channels: self._all_channels = self._get_channels() return self._all_channels def channel_name_to_id(self, channel_name): for channel in self._all_channels: if channel['name'] == channel_name: return channel['id'] raise ChannelNotFoundError("Channel {} not in the list of available channels".format(channel_name)) def bulk_message(self, message, post_to=[]): log.debug("Posting bulk message={}".format(message.title)) for channel in post_to: if not channel.startswith('@'): channel = self.channel_name_to_id(channel) log.debug("Posting message to {}".format(channel)) success_color = 'good' if message.success else 'danger' attachments = {'color': success_color} fields = [] for label, msg in message.fields.items(): fields.append({'title': label, 'value': "\n".join(msg), 'short': False}) attachments['fields'] = fields attachments = json.dumps([attachments]) response = self.client.api_call('chat.postMessage', text=message.title, attachments=attachments, channel=channel, username=self.username, as_user=self.as_user) log.debug(response) if not response['ok']: log.debug("Error while posting message to {}: {}".format(channel, response['error'])) return True