Source code for slack_functions

"""
slack functions

These are shared slack functions that are required in multiple modules.
"""
import logging
import traceback

import settings

# @modified 20200701 - Task #3612: Upgrade to slack v2
#                      Task #3608: Update Skyline to Python 3.8.3 and deps
#                      Task #3556: Update deps
# from slackclient import SlackClient
# slackclient v2 has a version function, < v2 does not
try:
    from slack import version as slackVersion
    slack_version = slackVersion.__version__
except:
    slack_version = '1.3'
if slack_version == '1.3':
    from slackclient import SlackClient
else:
    from slack import WebClient

token = settings.SLACK_OPTS['bot_user_oauth_access_token']
try:
    icon_emoji = settings.SLACK_OPTS['icon_emoji']
except:
    icon_emoji = ':chart_with_upwards_trend:'


[docs]def slack_post_message(current_skyline_app, channel, thread_ts, message): """ Post a message to a slack channel or thread. :param current_skyline_app: the skyline app using this function :param channel: the slack channel :param thread_ts: the slack thread timestamp :param message: message :type current_skyline_app: str :type channel: str :type thread_ts: str or None :type message: str :return: slack response dict :rtype: dict """ current_skyline_app_logger = str(current_skyline_app) + 'Log' current_logger = logging.getLogger(current_skyline_app_logger) try: # @modified 20200701 - Task #3612: Upgrade to slack v2 # Task #3608: Update Skyline to Python 3.8.3 and deps # Task #3556: Update deps if slack_version == '1.3': sc = SlackClient(token) else: sc = WebClient(token, timeout=10) except: current_logger.error(traceback.format_exc()) current_logger.error( 'error :: slack_post_message :: falied to connect slack') return False if thread_ts: if thread_ts == 'None': thread_ts = None slack_post = None # In terms of the generated Slack URLS for threads the # timestamps have no dots e.g.: # https://<an_org>.slack.com/archives/<a_channel>/p1543994173000700 # However in terms of the sc.api_call the thread_ts # needs the format declared in the dict response e.g. # u'ts': u'1543994173.000700'}]} with the dot so in this # case '1543994173.000700' if thread_ts: try: # @modified 20200701 - Task #3612: Upgrade to slack v2 if slack_version == '1.3': slack_post = sc.api_call( 'chat.postMessage', channel=channel, icon_emoji=icon_emoji, text=message, thread_ts=thread_ts ) else: slack_post = sc.chat_postMessage( channel=channel, icon_emoji=icon_emoji, text=message, thread_ts=thread_ts ) except: current_logger.error(traceback.format_exc()) current_logger.error( 'error :: slack_post_to_thread :: falied to post message to thread %s - %s' % ( thread_ts, message)) return False else: try: # @modified 20200701 - Task #3612: Upgrade to slack v2 if slack_version == '1.3': slack_post = sc.api_call( 'chat.postMessage', channel=channel, icon_emoji=icon_emoji, text=message ) else: slack_post = sc.chat_postMessage( channel=channel, icon_emoji=icon_emoji, text=message ) except: current_logger.error(traceback.format_exc()) current_logger.error( 'error :: slack_post_message :: falied to post message to thread %s - %s' % ( thread_ts, message)) return False if slack_post['ok']: current_logger.info( 'slack_post_message :: posted message to channel %s, thread %s - %s' % ( channel, str(thread_ts), message)) else: current_logger.error( 'error :: slack_post_message :: falied to post message to channel %s, thread %s - %s' % ( channel, str(thread_ts), message)) current_logger.error( 'error :: slack_post_message :: slack response dict follows') try: current_logger.error(str(slack_post)) except: current_logger.error('error :: slack_post_message :: no slack response dict found') return False return slack_post
[docs]def slack_post_reaction(current_skyline_app, channel, thread_ts, emoji): """ Post a message to a slack channel or thread. :param current_skyline_app: the skyline app using this function :param channel: the slack channel :param thread_ts: the slack thread timestamp :param emoji: emoji e.g. thumbsup :type current_skyline_app: str :type channel: str :type thread_ts: str :type emoji: str :return: slack response dict :rtype: dict """ current_skyline_app_logger = str(current_skyline_app) + 'Log' current_logger = logging.getLogger(current_skyline_app_logger) try: # @modified 20200701 - Task #3612: Upgrade to slack v2 # Task #3608: Update Skyline to Python 3.8.3 and deps # Task #3556: Update deps # sc = SlackClient(token) if slack_version == '1.3': sc = SlackClient(token) else: sc = WebClient(token, timeout=10) except: current_logger.error(traceback.format_exc()) current_logger.error( 'error :: slack_post_message :: falied to connect slack') return False slack_response = None try: # @modified 20200701 - Task #3612: Upgrade to slack v2 # Task #3608: Update Skyline to Python 3.8.3 and deps # Task #3556: Update deps if slack_version == '1.3': slack_response = sc.api_call( 'reactions.add', channel=channel, name=emoji, timestamp=thread_ts ) else: slack_response = sc.reactions_add( channel=channel, name=emoji, timestamp=thread_ts ) except: current_logger.error(traceback.format_exc()) current_logger.error( 'error :: slack_post_reaction :: falied to post reaction to thread %s - %s' % ( thread_ts, emoji)) return False if not slack_response['ok']: if str(slack_response['error']) == 'already_reacted': current_logger.info( 'slack_post_reaction :: already_reacted to channel %s, thread %s, ok' % ( channel, str(thread_ts))) else: current_logger.error( 'error :: slack_post_reaction :: falied to post reaction to channel %s, thread %s - %s' % ( channel, str(thread_ts), emoji)) current_logger.error( 'error :: slack_post_reaction :: slack response dict follows') try: current_logger.error(str(slack_response)) except: current_logger.error('error :: slack_post_reaction :: no slack response dict found') return False return slack_response