コード例 #1
0
 def __init__(self,
              flask_app: Flask,
              config: Config):
     """Initialize the object."""
     self.default_channel = config.slack_announcement_channel
     self.bot = Bot(WebClient(config.slack_api_token),
                    config.slack_notification_channel)
コード例 #2
0
class RandomChannelPromoter(ModuleBase):
    """Module that promotes a random channel every Saturday."""

    NAME = 'Feature random channels'

    def __init__(self, flask_app: Flask, config: Config):
        """Initialize the object."""
        self.default_channel = config.slack_announcement_channel
        self.bot = Bot(WebClient(config.slack_api_token),
                       config.slack_notification_channel)

    def get_job_args(self) -> Dict[str, Any]:
        """Get job configuration arguments for apscheduler."""
        return {
            'trigger': 'cron',
            'day_of_week': 'sat',
            'hour': 12,
            'name': self.NAME
        }

    def do_it(self):
        """Select and post random channels to #general."""
        channels = list(
            filter(lambda c: not c['is_archived'], self.bot.get_channels()))
        rand_channel = choice(channels)
        channel_id, channel_name = rand_channel['id'], rand_channel['name']
        self.bot.send_to_channel(
            'Featured channel of the week: ' +
            f'<#{channel_id}|{channel_name}>!', self.default_channel)

        logging.info(f'Featured #{channel_name}')
コード例 #3
0
def make_command_parser(config: Config,
                        gh: Optional[GithubInterface] = None) \
        -> CommandParser:
    """
    Initialize and returns a :class:`CommandParser` object.

    :return: a new ``CommandParser`` object, freshly initialized
    """
    slack_api_token, slack_notification_channel = "", ""
    signing_key = ""
    if not config.testing:
        slack_api_token = config.slack_api_token
        github_auth_key = config.github_key
        github_app_id = config.github_app_id
        github_organization = config.github_org_name
        slack_notification_channel = config.slack_notification_channel
        gh = GithubInterface(DefaultGithubFactory(github_app_id,
                                                  github_auth_key),
                             github_organization)
        signing_key = config.github_key
    facade = DBFacade(DynamoDB(config))
    bot = Bot(WebClient(slack_api_token), slack_notification_channel)
    # TODO: make token config expiry configurable
    token_config = TokenCommandConfig(timedelta(days=7), signing_key)
    return CommandParser(facade, bot, cast(GithubInterface, gh), token_config)
コード例 #4
0
def make_slack_events_handler(config: Config) -> SlackEventsHandler:
    """
    Initialize a :class:`SlackEventsHandler` object.

    :return: a new ``SlackEventsHandler`` object, freshly initialized
    """
    facade = DBFacade(DynamoDB(config))
    bot = Bot(WebClient(config.slack_api_token),
              config.slack_notification_channel)
    return SlackEventsHandler(facade, bot)
コード例 #5
0
ファイル: __init__.py プロジェクト: ubclaunchpad/rocket2
def make_command_parser(config: Config, gh: GithubInterface) \
        -> CommandParser:
    # Initialize database
    facade = make_dbfacade(config)
    # Create Slack bot
    bot = Bot(WebClient(config.slack_api_token),
              config.slack_notification_channel)
    # TODO: make token config expiry configurable
    token_config = TokenCommandConfig(timedelta(days=7), config.github_key)
    # Metrics
    metrics = CWMetrics(config)
    # Create GCP client (optional)
    gcp_client = make_gcp_client(config)
    return CommandParser(config,
                         facade,
                         bot,
                         gh,
                         token_config,
                         metrics,
                         gcp=gcp_client)
コード例 #6
0
 def __init__(self,
              flask_app: Flask,
              config: Config):
     """Initialize the object."""
     self.bot = Bot(WebClient(config.slack_api_token),
                    config.slack_bot_channel)
コード例 #7
0
 def setUp(self):
     """Set up the test case environment."""
     self.mock_sc = mock.MagicMock(WebClient)
     self.bot = Bot(self.mock_sc, "#general")
コード例 #8
0
class TestBot(TestCase):
    """Test Case for Bot class."""

    def setUp(self):
        """Set up the test case environment."""
        self.mock_sc = mock.MagicMock(WebClient)
        self.bot = Bot(self.mock_sc, "#general")

    def test_send_dm(self):
        """Test the Bot class method send_dm()."""
        self.mock_sc.chat_postMessage = mock.MagicMock(return_value=OK_RESP)

        self.bot.send_dm("Hahahaha", "UD8UCTN05")
        self.mock_sc.chat_postMessage.assert_called_with(
            text="Hahahaha",
            channel="UD8UCTN05",
            as_user=True
        )

    def test_send_dm_failure(self):
        """Test send_dm() when the Slack API call fails."""
        self.mock_sc.chat_postMessage = mock.MagicMock(return_value=BAD_RESP)

        try:
            self.bot.send_dm("Hahahaha", "UD8UCTN05")
        except SlackAPIError as e:
            assert e.error == "Error"
        finally:
            self.mock_sc.chat_postMessage.assert_called_with(
                text="Hahahaha",
                channel="UD8UCTN05",
                as_user=True
            )

    def test_send_to_channel(self):
        """Test the Bot class method send_to_channel()."""
        self.mock_sc.chat_postMessage = mock.MagicMock(return_value=OK_RESP)

        self.bot.send_to_channel("Hahahaha", "#random")
        self.mock_sc.chat_postMessage.assert_called_with(
            text="Hahahaha",
            attachments=[],
            channel="#random"
        )

    def test_send_to_channel_failure(self):
        """Test send_to_channel() when the Slack API call fails."""
        self.mock_sc.chat_postMessage = mock.MagicMock(return_value=BAD_RESP)

        try:
            self.bot.send_to_channel("Hahahaha", "#random")
        except SlackAPIError as e:
            assert e.error == "Error"
        finally:
            self.mock_sc.chat_postMessage.assert_called_with(
                text="Hahahaha",
                attachments=[],
                channel="#random"
            )

    def test_send_event_notif(self):
        """Test send_event_notif()."""
        self.mock_sc.chat_postMessage.return_value = OK_RESP
        self.bot.send_event_notif("Good work everyone")
        self.mock_sc.chat_postMessage.assert_called_with(
            text="Good work everyone",
            attachments=[],
            channel=self.bot.slack_channel
        )

    def test_send_event_notif_error(self):
        """Test send_event_notif() that errors out."""
        self.mock_sc.chat_postMessage.return_value = BAD_RESP
        self.bot.send_event_notif("Good work everyone")
        self.mock_sc.chat_postMessage.assert_called_with(
            text="Good work everyone",
            attachments=[],
            channel=self.bot.slack_channel
        )

    def test_get_channels_error(self):
        """Test get_channels() with errors."""
        resp = {'ok': False, 'error': 'bad bad bad'}
        self.mock_sc.conversations_list.return_value = resp
        with self.assertRaises(SlackAPIError):
            self.bot.get_channels()

    def test_get_channels(self):
        """Test get_channel_names() method."""
        resp = {'ok': True, 'channels': [{'name': 'happy'}]}
        self.mock_sc.conversations_list = mock.MagicMock(return_values=resp)
        names = self.bot.get_channel_names()

        self.assertEqual(len(names), 0)

    def test_get_channel_users(self):
        """Test the bot method get_channel_users()."""
        ids = ["U12314", "U42839", "U31055"]
        self.mock_sc.conversations_members.return_value = {'ok': True,
                                                           'members': [
                                                               "U12314",
                                                               "U42839",
                                                               "U31055"
                                                           ]}
        assert self.bot.get_channel_users("C1234441") == ids
        self.mock_sc.conversations_members.assert_called_with(
            channel="C1234441"
        )

    def test_get_channel_users_failure(self):
        """Test get_channel_users() when Slack API call fails."""
        self.mock_sc.conversations_members =\
            mock.MagicMock(return_value={"ok": False, "error": "Error"})

        with self.assertRaises(SlackAPIError):
            self.bot.get_channel_users('C1234441')
        self.mock_sc.conversations_members.assert_called_with(
            channel='C1234441'
        )

    def test_create_same_channel_thrice(self):
        """Test create_channel() thrice, with the third call throwing up."""
        name: str = "#rocket2"
        self.mock_sc.channels_create.return_value = {"ok": True,
                                                     "name": name}
        assert self.bot.create_channel(name) == name
        try:
            self.mock_sc.channels_create.return_value =\
                {"ok": False, "error": "name_taken"}
            assert self.bot.create_channel(name) == name
            self.mock_sc.channels_create.return_value =\
                {"ok": False, "error": "invalid_name"}
            self.bot.create_channel(name)
        except SlackAPIError as e:
            assert e.error == "invalid_name"
コード例 #9
0
app = Flask(__name__)
# HTTP security header middleware for Flask
talisman = Talisman(app)
talisman.force_https = False
github_interface = make_github_interface(config)
command_parser = make_command_parser(config, github_interface)
github_webhook_handler = make_github_webhook_handler(github_interface, config)
slack_events_handler = make_slack_events_handler(config)
slack_events_adapter = SlackEventAdapter(config.slack_signing_secret,
                                         "/slack/events", app)
sched = Scheduler(BackgroundScheduler(timezone="America/Los_Angeles"),
                  (app, config))
sched.start()

bot = Bot(WebClient(config.slack_api_token), config.slack_notification_channel)
bot.send_to_channel('rocket2 has restarted successfully! :clap: :clap:',
                    config.slack_notification_channel)


@app.route('/')
def check():
    """Display a Rocket status image."""
    logging.debug('Served check()')
    return "🚀"


@app.route('/slack/commands', methods=['POST'])
def handle_commands():
    """Handle rocket slash commands."""
    logging.info("Slash command received")
コード例 #10
0
ファイル: __init__.py プロジェクト: ubclaunchpad/rocket2
def make_slack_events_handler(config: Config) -> SlackEventsHandler:
    facade = make_dbfacade(config)
    bot = Bot(WebClient(config.slack_api_token),
              config.slack_notification_channel)
    return SlackEventsHandler(facade, bot)