From 2b9e9b752c35fa32212f91d736e3f757f15c75a6 Mon Sep 17 00:00:00 2001 From: Jeff Ammons Date: Fri, 27 May 2016 17:59:40 -0700 Subject: [PATCH 01/18] Add tests and bugfix for b'' messages appearing in python3. I added unicode and non-unicode message testing for the output() method on RTMBot. I'm concerned about why the encode('ascii', 'ignore') was there in the first place, but not having it seems to do the right thing... --- requirements-dev.txt | 1 + rtmbot/core.py | 2 +- tests/test_example.py | 2 -- tests/test_rtmbot_core.py | 51 ++++++++++++++++++++++++++++++++++----- 4 files changed, 47 insertions(+), 9 deletions(-) delete mode 100644 tests/test_example.py diff --git a/requirements-dev.txt b/requirements-dev.txt index 8e69fc4..b011dfe 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,6 +1,7 @@ coveralls==1.1 ipdb==0.9.3 ipython==4.1.2 +mock==2.0.0 pdbpp==0.8.3 pytest>=2.8.2 pytest-cov==2.2.1 diff --git a/rtmbot/core.py b/rtmbot/core.py index 049bb77..9cc507d 100755 --- a/rtmbot/core.py +++ b/rtmbot/core.py @@ -101,7 +101,7 @@ class RtmBot(object): if limiter: time.sleep(.1) limiter = False - message = output[1].encode('ascii', 'ignore') + message = output[1] channel.send_message("{}".format(message)) limiter = True diff --git a/tests/test_example.py b/tests/test_example.py deleted file mode 100644 index c8d72d0..0000000 --- a/tests/test_example.py +++ /dev/null @@ -1,2 +0,0 @@ -def test_example(): - assert True \ No newline at end of file diff --git a/tests/test_rtmbot_core.py b/tests/test_rtmbot_core.py index 0353147..85d7563 100644 --- a/tests/test_rtmbot_core.py +++ b/tests/test_rtmbot_core.py @@ -1,15 +1,25 @@ +# -*- coding: utf-8 -*- +try: + from unittest.mock import Mock +except ImportError: + from mock import Mock + from testfixtures import LogCapture from rtmbot.core import RtmBot +def init_rtmbot(): + ''' Initializes an instance of RTMBot with some default values ''' + rtmbot = RtmBot({ + 'SLACK_TOKEN': 'test-12345', + 'BASE_PATH': '/tmp/', + 'LOGFILE': '/tmp/rtmbot.log', + 'DEBUG': True + }) + return rtmbot def test_init(): with LogCapture() as l: - rtmbot = RtmBot({ - 'SLACK_TOKEN': 'test-12345', - 'BASE_PATH': '/tmp/', - 'LOGFILE': '/tmp/rtmbot.log', - 'DEBUG': True - }) + rtmbot = init_rtmbot() assert rtmbot.token == 'test-12345' assert rtmbot.directory == '/tmp/' @@ -18,3 +28,32 @@ def test_init(): l.check( ('root', 'INFO', 'Initialized in: /tmp/') ) + +def test_output(): + ''' Test that sending a message behaves as expected ''' + rtmbot = init_rtmbot() + + # Mock the slack_client object + slackclient_mock = Mock() + channel_mock = Mock() + slackclient_mock.server.channels.find.return_value = channel_mock + rtmbot.slack_client = slackclient_mock + + # mock the plugin object to return a sample response + plugin_mock = Mock() + plugin_mock.do_output.return_value = [['C12345678', 'test message']] + rtmbot.bot_plugins.append(plugin_mock) + + rtmbot.output() + + + # test that the output matches the expected value + channel_mock.send_message.assert_called_with('test message') + + # test that unicode messages work as expected + channel_mock.reset_mock() + plugin_mock.reset_mock() + plugin_mock.do_output.return_value = [['C12345678', '🚀 testing']] + rtmbot.output() + + channel_mock.send_message.assert_called_with('🚀 testing') From c81bdfec99e580d62bc6fdff9127fa167e927ccc Mon Sep 17 00:00:00 2001 From: Jeff Ammons Date: Sun, 5 Jun 2016 13:28:28 -0700 Subject: [PATCH 02/18] Fix unicode error in py2.7 for example plugin Strings should now be passed to the plugins as unicode values in py2.7 so we have to make sure that we don't convert those into ascii by using python str instead of u'' strings. --- README.md | 2 ++ doc/example-plugins/canary.py | 3 +++ doc/example-plugins/counter.py | 3 +++ doc/example-plugins/repeat.py | 3 +++ doc/example-plugins/todo.py | 3 +++ rtmbot/core.py | 4 ++-- setup.py | 2 +- tests/test_rtmbot_core.py | 32 ++++++++++++++++++++++++-------- 8 files changed, 41 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 19e1aa3..062c3d2 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,8 @@ This will print the incoming message json (dict) to the screen where the bot is Plugins having a method defined as ```catch_all(data)``` will receive ALL events from the websocket. This is useful for learning the names of events and debugging. +Note: If you're using Python 2.x, the incoming data should be a unicode string, be careful you don't coerce it into a normal str object as it will cause errors on output. You can add `from __future__ import unicode_literals` to your plugin file to avoid this. + ####Outgoing data Plugins can send messages back to any channel, including direct messages. This is done by appending a two item array to the outputs global array. The first item in the array is the channel ID and the second is the message text. Example that writes "hello world" when the plugin is started: diff --git a/doc/example-plugins/canary.py b/doc/example-plugins/canary.py index b2cea10..5a03a00 100644 --- a/doc/example-plugins/canary.py +++ b/doc/example-plugins/canary.py @@ -1,3 +1,6 @@ +from __future__ import unicode_literals +# don't convert to ascii in py2.7 when creating string to return + import time outputs = [] diff --git a/doc/example-plugins/counter.py b/doc/example-plugins/counter.py index 00fac1a..1b03305 100644 --- a/doc/example-plugins/counter.py +++ b/doc/example-plugins/counter.py @@ -1,3 +1,6 @@ +from __future__ import unicode_literals +# don't convert to ascii in py2.7 when creating string to return + import time crontable = [] outputs = [] diff --git a/doc/example-plugins/repeat.py b/doc/example-plugins/repeat.py index 3106457..a288eb3 100644 --- a/doc/example-plugins/repeat.py +++ b/doc/example-plugins/repeat.py @@ -1,3 +1,6 @@ +from __future__ import unicode_literals +# don't convert to ascii in py2.7 when creating string to return + crontable = [] outputs = [] diff --git a/doc/example-plugins/todo.py b/doc/example-plugins/todo.py index cd1db8d..3fba6cd 100644 --- a/doc/example-plugins/todo.py +++ b/doc/example-plugins/todo.py @@ -1,4 +1,7 @@ from __future__ import print_function +from __future__ import unicode_literals +# don't convert to ascii in py2.7 when creating string to return + import os import pickle diff --git a/rtmbot/core.py b/rtmbot/core.py index 9cc507d..1b391a3 100755 --- a/rtmbot/core.py +++ b/rtmbot/core.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from __future__ import unicode_literals import sys import glob import os @@ -101,8 +102,7 @@ class RtmBot(object): if limiter: time.sleep(.1) limiter = False - message = output[1] - channel.send_message("{}".format(message)) + channel.send_message(output[1]) limiter = True def crons(self): diff --git a/setup.py b/setup.py index ef6cfc3..3f670ef 100755 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ from distutils.core import setup setup( name='rtmbot', - version='0.10', + version='0.2.0', description='A Slack bot written in python that connects via the RTM API.', author='Ryan Huber', author_email='rhuber@gmail.com', diff --git a/tests/test_rtmbot_core.py b/tests/test_rtmbot_core.py index 85d7563..ef0a8ca 100644 --- a/tests/test_rtmbot_core.py +++ b/tests/test_rtmbot_core.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- try: - from unittest.mock import Mock + from unittest.mock import Mock, create_autospec except ImportError: - from mock import Mock + from mock import Mock, create_autospec from testfixtures import LogCapture -from rtmbot.core import RtmBot +from slackclient import SlackClient, _channel, _server, _util +from rtmbot.core import RtmBot, Plugin def init_rtmbot(): ''' Initializes an instance of RTMBot with some default values ''' @@ -33,14 +34,21 @@ def test_output(): ''' Test that sending a message behaves as expected ''' rtmbot = init_rtmbot() - # Mock the slack_client object - slackclient_mock = Mock() - channel_mock = Mock() + # Mock the slack_client object with Server, Channel objects and needed methods + slackclient_mock = create_autospec(SlackClient) + server_mock = create_autospec(_server.Server) + + # Mock Server with channels method and correct return value + slackclient_mock.server = server_mock + searchlist_mock = create_autospec(_util.SearchList) + server_mock.channels = searchlist_mock + channel_mock = create_autospec(_channel.Channel) slackclient_mock.server.channels.find.return_value = channel_mock + rtmbot.slack_client = slackclient_mock # mock the plugin object to return a sample response - plugin_mock = Mock() + plugin_mock = create_autospec(Plugin) plugin_mock.do_output.return_value = [['C12345678', 'test message']] rtmbot.bot_plugins.append(plugin_mock) @@ -50,10 +58,18 @@ def test_output(): # test that the output matches the expected value channel_mock.send_message.assert_called_with('test message') - # test that unicode messages work as expected + # test that emoji messages work as expected channel_mock.reset_mock() plugin_mock.reset_mock() plugin_mock.do_output.return_value = [['C12345678', '🚀 testing']] rtmbot.output() channel_mock.send_message.assert_called_with('🚀 testing') + + # test that unicode messages work as expected + channel_mock.reset_mock() + plugin_mock.reset_mock() + plugin_mock.do_output.return_value = [['C12345678', 'ù hœø3ö']] + rtmbot.output() + + channel_mock.send_message.assert_called_with('ù hœø3ö') \ No newline at end of file From 05f5e73aeb0afea9687ecb65b05da030db4fc7b8 Mon Sep 17 00:00:00 2001 From: Kevin Schiroo Date: Thu, 30 Jun 2016 23:19:51 -0500 Subject: [PATCH 03/18] Fixing important typo in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index da826f1..d39f0c2 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Plugins can be installed as .py files in the ```plugins/``` directory OR as a .p To install the example 'repeat' plugin mkdir plugins/repeat - cp doc/example-plugins/repeat.py plugins/repeat + cp doc/example-plugins/repeat.py plugins/repeat.py The repeat plugin will now be loaded by the bot on startup. From eae682a8956503bb7c7c17e1a0c446aff656f351 Mon Sep 17 00:00:00 2001 From: Gavin Sherry Date: Sun, 3 Jul 2016 15:48:24 -0700 Subject: [PATCH 04/18] Doc fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d39f0c2..ce1c025 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Plugins can be installed as .py files in the ```plugins/``` directory OR as a .p To install the example 'repeat' plugin mkdir plugins/repeat - cp doc/example-plugins/repeat.py plugins/repeat.py + cp doc/example-plugins/repeat.py plugins/repeat/ The repeat plugin will now be loaded by the bot on startup. From 3cd9b9a82825c74f9b7d9f3508ebb868379bf645 Mon Sep 17 00:00:00 2001 From: Jeff Ammons Date: Sat, 9 Jul 2016 10:02:53 -0700 Subject: [PATCH 05/18] Standardizing docs between python-slackclient and rtmbot Added copyright to License File Added standard format for issues/PRs Added Code of Conduct Moved doc/ to docs/ --- .github/CONTRIBUTING.md | 33 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE.md | 29 +++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 15 ++++++++++ .github/contributing_header_slack.png | Bin 0 -> 100989 bytes CHANGELOG.md | 9 ++++++ CODE_OF_CONDUCT.md | 34 +++++++++++++++++++++++ LICENSE.txt => LICENSE | 4 +++ {doc => docs}/example-config/rtmbot.conf | 0 {doc => docs}/example-init/rtmbot.init | 0 {doc => docs}/example-plugins/canary.py | 0 {doc => docs}/example-plugins/counter.py | 0 {doc => docs}/example-plugins/repeat.py | 0 {doc => docs}/example-plugins/todo.py | 0 13 files changed, 124 insertions(+) create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/contributing_header_slack.png create mode 100644 CHANGELOG.md create mode 100644 CODE_OF_CONDUCT.md rename LICENSE.txt => LICENSE (93%) rename {doc => docs}/example-config/rtmbot.conf (100%) rename {doc => docs}/example-init/rtmbot.init (100%) rename {doc => docs}/example-plugins/canary.py (100%) rename {doc => docs}/example-plugins/counter.py (100%) rename {doc => docs}/example-plugins/repeat.py (100%) rename {doc => docs}/example-plugins/todo.py (100%) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..245d134 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,33 @@ +# Contributing at Slack + +![Header Image](contributing_header_slack.png) + +## Before Contributing + +Before contributing, please read our [Code of Conduct](./CODE_OF_CONDUCT.md). We take it very seriously, and expect that you will as well. + +## New Issues + +Before opening a new issue, please consider: + + - Reading [the documentation](https://github.com/slackhq/python-rtmbot/blob/master/README.md) and [the changelog](https://github.com/slackhq/python-rtmbot/blob/master/CHANGELOG.md) first. + - Searching for any related issues and avoid creating duplicated issues. + - Adding details, diagnoses, screenshots or any type of useful information in existing issues, even if they are marked as closed. The team will still review it. + - Trying out the examples [provided in this repository](https://github.com/slackhq/python-rtmbot/tree/master/examples). + - Taking the time to think of a solution and [**open a pull request**](#new-pull-requests) for either improving the documentation, fixing a bug or suggesting a feature. + - Finally, **[open an issue]**(https://github.com/slackhq/python-rtmbot/issues/new) to report a bug, ask for help or suggest a feature. The more information you give, the better people can help you. + + +## New Pull Requests + +We love pull requests and we are generally very receptive to contributions. Things to keep in mind: + +- [Fork the repository](https://github.com/slackhq/python-rtmbot) and make sure to work on a branch up to date with origin master. +- Do your thing! +- Be mindful about doing atomic commits, adding documentation to your changes, not refactoring too much. +- Add tests covering the new code or functionality you are adding. +- Add a descriptive title and add any useful information for the reviewer. If your contribution is a user facing thing, please attach a screenshot and/or screencast (gif preferrably). +- Read and agree to our [Contributor License Agreement (CLA)](https://docs.google.com/a/slack-corp.com/forms/d/1q_w8rlJG_x_xJOoSUMNl7R35rkpA7N6pUkKhfHHMD9c/viewform). _We cannot accept your PR without your agreement to our CLA_. +- Create your pull request (yay!). If it is in relation to an existing issue, please mention it on the title or description. + +[Interested in knowing more about about pull requests at Slack?](https://slack.engineering/on-empathy-pull-requests-979e4257d158#.awxtvmb2z) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..54db76f --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,29 @@ +* [ ] I've read and understood the [Contributing guidelines](./CONTRIBUTING.md) and have done my best effort to follow them. +* [ ] I've read and agree to the [Code of Conduct](./CODE_OF_CONDUCT.md). +* [ ] I've searched for any related issues and avoided creating a duplicate issue. + +#### Description +> e.g. Description of the bug or feature + +#### Reproducible in: +* [ ] This is reproducible in the sample project. +RTMBot version: +Python version: +OS Version: + +#### Steps to reproduce: + +1. +2. +3. + +### Expected result: +> e.g. What you expected to happen + +### Actual result: +> e.g. What actually happened + +### Attachments: +> e.g. Logs, screenshots, screencast, sample project, funny gif, etc. + + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..972608a --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,15 @@ +* [ ] I've read and understood the [Contributing guidelines](./CONTRIBUTING.md) and have done my best effort to follow them. +* [ ] I've read and agree to the [Code of Conduct](./CODE_OF_CONDUCT.md). +* [ ] I've been mindful about doing atomic commits, adding documentation to my changes, not refactoring too much. +* [ ] I've a descriptive title and added any useful information for the reviewer. Where appropriate, I've attached a screenshot and/or screencast (gif preferrably). +* [ ] I've written tests to cover the new code and functionality included in this PR. +* [ ] I've read, agree to, and signed the [Contributor License Agreement (CLA)](https://docs.google.com/a/slack-corp.com/forms/d/1q_w8rlJG_x_xJOoSUMNl7R35rkpA7N6pUkKhfHHMD9c/viewform). + +#### PR Summary +> e.g. New functionality for producing whatsits. + +#### Related Issues +> e.g. Fixes #206 and closes #230 + +#### Test strategy +> e.g. Add tests around whatsit production. \ No newline at end of file diff --git a/.github/contributing_header_slack.png b/.github/contributing_header_slack.png new file mode 100644 index 0000000000000000000000000000000000000000..478540ad5ed7443fbfd58cf09526153da639aed6 GIT binary patch literal 100989 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

Mx>q96tBW=xwD8dWI|JhKtq_ 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 Os=A8K)AA=T-~JbmgVl%t literal 0 HcmV?d00001 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..57c8940 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,9 @@ +### v0.2.0 (2016-03-25) + + * Fixed unicode handling to make things work in python 2.7 and 3.5. + * Changed versioning scheme to Semver. + +### v0.10 (2016-02-28) + + * Refactored the RTMBot Class to make it more isolated from the script that runs the bot + diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..96ef6fc --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,34 @@ +# Slack open source code of conduct + + +## Introduction +Diversity and inclusion make our community strong. We encourage participation from the most varied and diverse backgrounds possible and want to be very clear about where we stand. + +Our goal is to maintain a safe, helpful and friendly community for everyone, regardless of experience, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, nationality, or other defining characteristic. + +This code and related procedures also apply to unacceptable behavior occurring outside the scope of community activities, in all community venues (online and in-person) as well as in all one-on-one communications, and anywhere such behavior has the potential to adversely affect the safety and well-being of community members. + +## Expected Behavior + * Be welcoming. + * Be kind. + * Look out for each other. + +## Unacceptable Behavior + * Conduct or speech which might be considered sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory or offensive in nature. + * Unwelcome, suggestive, derogatory or inappropriate nicknames or terms. + * Disrespect towards others. (Jokes, innuendo, dismissive attitudes.) + * Intimidation or harassment (online or in-person). Please read the [Citizen Code of Conduct](http://citizencodeofconduct.org/) for how we interpret harassment. + * Disrespect towards differences of opinion. + * Inappropriate attention or contact. Be aware of how your actions affect others. If it makes someone uncomfortable, stop. + * Not understanding the differences between constructive criticism and disparagement. + * Sustained disruptions. + * Violence, threats of violence or violent language. + +## Enforcement +Understand that speech and actions have consequences, and unacceptable behavior will not be tolerated. + +If you are the subject of, or witness to any violations of this Code of Conduct, please contact us by submitting a form [here](https://docs.google.com/a/slack-corp.com/forms/d/1NVqj2S2Q49XVIOT5N3L6Tx1oihvk9CpMa_UX8T_6ESo/viewform), or email conduct@slack.com. + +If violations occur, organizers will take any action they deem appropriate for the infraction, up to and including expulsion. + +_Thanks to the [Django Code of Conduct](https://www.djangoproject.com/conduct/), [The Citizen Code of Conduct](http://citizencodeofconduct.org/), [The Rust Code of Conduct](https://www.rust-lang.org/conduct.html) and [The Ada Initiative](http://adainitiative.org/2014/02/18/howto-design-a-code-of-conduct-for-your-community/)._ \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE similarity index 93% rename from LICENSE.txt rename to LICENSE index 89de354..73da6e9 100644 --- a/LICENSE.txt +++ b/LICENSE @@ -1,3 +1,7 @@ +The MIT License (MIT) + +Copyright (c) 2015-2016 Slack Technologies, Inc + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights diff --git a/doc/example-config/rtmbot.conf b/docs/example-config/rtmbot.conf similarity index 100% rename from doc/example-config/rtmbot.conf rename to docs/example-config/rtmbot.conf diff --git a/doc/example-init/rtmbot.init b/docs/example-init/rtmbot.init similarity index 100% rename from doc/example-init/rtmbot.init rename to docs/example-init/rtmbot.init diff --git a/doc/example-plugins/canary.py b/docs/example-plugins/canary.py similarity index 100% rename from doc/example-plugins/canary.py rename to docs/example-plugins/canary.py diff --git a/doc/example-plugins/counter.py b/docs/example-plugins/counter.py similarity index 100% rename from doc/example-plugins/counter.py rename to docs/example-plugins/counter.py diff --git a/doc/example-plugins/repeat.py b/docs/example-plugins/repeat.py similarity index 100% rename from doc/example-plugins/repeat.py rename to docs/example-plugins/repeat.py diff --git a/doc/example-plugins/todo.py b/docs/example-plugins/todo.py similarity index 100% rename from doc/example-plugins/todo.py rename to docs/example-plugins/todo.py From 012fb83d2cd680b972215947f900c8c047551c29 Mon Sep 17 00:00:00 2001 From: Jeff Ammons Date: Mon, 11 Jul 2016 09:32:30 -0700 Subject: [PATCH 06/18] Fix doc->docs move in linting command --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 63b4d9b..d15011f 100644 --- a/tox.ini +++ b/tox.ini @@ -30,4 +30,4 @@ commands= {toxinidir}/rtmbot.py \ {toxinidir}/rtmbot/core.py \ {toxinidir}/setup.py \ - {toxinidir}/doc/example-plugins \ No newline at end of file + {toxinidir}/docs/example-plugins From 22901290ce3ca43babb903a666a8ce3503f7d183 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 15 Jul 2016 17:59:13 +0200 Subject: [PATCH 07/18] README.md: Fix paths after doc->docs move Adjust doc paths in README.md after the doc->docs move in 3cd9b9a8 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ce1c025..eb621fe 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Installation 3. Configure rtmbot (https://api.slack.com/bot-users) - cp doc/example-config/rtmbot.conf . + cp docs/example-config/rtmbot.conf . vi rtmbot.conf SLACK_TOKEN: "xoxb-11111111111-222222222222222" @@ -48,7 +48,7 @@ Plugins can be installed as .py files in the ```plugins/``` directory OR as a .p To install the example 'repeat' plugin mkdir plugins/repeat - cp doc/example-plugins/repeat.py plugins/repeat/ + cp docs/example-plugins/repeat.py plugins/repeat/ The repeat plugin will now be loaded by the bot on startup. From 1fb557b178c77a4f5ff76899a0fa73442d2d75b2 Mon Sep 17 00:00:00 2001 From: philipyun103 Date: Sun, 7 Aug 2016 00:42:37 -0700 Subject: [PATCH 08/18] Add API Context to Plugin Context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updated idea of @zbarahal’s PR (PR #20) to reflect the current master. --- client.py | 10 ++++++++++ docs/example-plugins/directAPIcall.py | 5 +++++ rtmbot.py | 7 +++++-- rtmbot/core.py | 3 +-- 4 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 client.py create mode 100644 docs/example-plugins/directAPIcall.py diff --git a/client.py b/client.py new file mode 100644 index 0000000..bbf9314 --- /dev/null +++ b/client.py @@ -0,0 +1,10 @@ +from slackclient import SlackClient +from rtmbot import RtmBot + +client = None + +def init(config): + global client + bot = RtmBot(config) + client = bot.slack_client + return bot diff --git a/docs/example-plugins/directAPIcall.py b/docs/example-plugins/directAPIcall.py new file mode 100644 index 0000000..0ddebd5 --- /dev/null +++ b/docs/example-plugins/directAPIcall.py @@ -0,0 +1,5 @@ +from __future__ import unicode_literals +from client import client as sc + +for user in sc.api_call("users.list")["members"]: + print(user["name"], user["id"]) diff --git a/rtmbot.py b/rtmbot.py index 77c7fa3..a1ecc0c 100755 --- a/rtmbot.py +++ b/rtmbot.py @@ -1,9 +1,12 @@ #!/usr/bin/env python import sys +import os +sys.path.append(os.getcwd()) + from argparse import ArgumentParser import yaml -from rtmbot import RtmBot +import client def parse_args(): @@ -19,7 +22,7 @@ def parse_args(): # load args with config path args = parse_args() config = yaml.load(open(args.config or 'rtmbot.conf', 'r')) -bot = RtmBot(config) +bot = client.init(config) try: bot.start() except KeyboardInterrupt: diff --git a/rtmbot/core.py b/rtmbot/core.py index 1b391a3..dd33e19 100755 --- a/rtmbot/core.py +++ b/rtmbot/core.py @@ -48,7 +48,7 @@ class RtmBot(object): # initialize stateful fields self.last_ping = 0 self.bot_plugins = [] - self.slack_client = None + self.slack_client = SlackClient(self.token) def _dbg(self, debug_string): if self.debug: @@ -56,7 +56,6 @@ class RtmBot(object): def connect(self): """Convenience method that creates Server instance""" - self.slack_client = SlackClient(self.token) self.slack_client.rtm_connect() def _start(self): From 9f71ca3a36c49dfda8e60c5de15a658c71791a88 Mon Sep 17 00:00:00 2001 From: philipyun103 Date: Sun, 7 Aug 2016 01:09:23 -0700 Subject: [PATCH 09/18] Documentation and Naming Update Naming conventions and Docs --- README.md | 13 +++++++++++++ client.py | 4 ++-- docs/example-plugins/directAPIcall.py | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index eb621fe..00ce0b6 100644 --- a/README.md +++ b/README.md @@ -89,5 +89,18 @@ Plugins can also run methods on a schedule. This allows a plugin to poll for upd ####Plugin misc The data within a plugin persists for the life of the rtmbot process. If you need persistent data, you should use something like sqlite or the python pickle libraries. +####Direct API Calls +You can directly call the Slack web API in your plugins by allowing the following import: + + from client import client + +You can also rename the client on import so it can be easily referenced like shown below: + + from client import client as sc + +Direct API calls can be called in your plugins in the following form: + + sc.api_call("API.method", "parameters") + ####Todo: Some rtm data should be handled upstream, such as channel and user creation. These should create the proper objects on-the-fly. diff --git a/client.py b/client.py index bbf9314..dcb7f5d 100644 --- a/client.py +++ b/client.py @@ -1,10 +1,10 @@ from slackclient import SlackClient from rtmbot import RtmBot -client = None +slack_client = None def init(config): global client bot = RtmBot(config) - client = bot.slack_client + slack_client = bot.slack_client return bot diff --git a/docs/example-plugins/directAPIcall.py b/docs/example-plugins/directAPIcall.py index 0ddebd5..30d82a0 100644 --- a/docs/example-plugins/directAPIcall.py +++ b/docs/example-plugins/directAPIcall.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from client import client as sc +from client import slack_client as sc for user in sc.api_call("users.list")["members"]: print(user["name"], user["id"]) From 0fe3cb6bac52da398c1e5208128538139a69f143 Mon Sep 17 00:00:00 2001 From: philipyun103 Date: Sun, 7 Aug 2016 01:11:04 -0700 Subject: [PATCH 10/18] grammar --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 00ce0b6..527c577 100644 --- a/README.md +++ b/README.md @@ -90,13 +90,13 @@ Plugins can also run methods on a schedule. This allows a plugin to poll for upd The data within a plugin persists for the life of the rtmbot process. If you need persistent data, you should use something like sqlite or the python pickle libraries. ####Direct API Calls -You can directly call the Slack web API in your plugins by allowing the following import: +You can directly call the Slack web API in your plugins by including the following import: - from client import client + from client import slack_client You can also rename the client on import so it can be easily referenced like shown below: - from client import client as sc + from client import slack_client as sc Direct API calls can be called in your plugins in the following form: From 0285f67db287334fc64017805fdb27dda0ea71f9 Mon Sep 17 00:00:00 2001 From: Philip Yun Date: Sun, 7 Aug 2016 01:46:20 -0700 Subject: [PATCH 11/18] Update client.py small bug with global extension --- client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client.py b/client.py index dcb7f5d..079ef33 100644 --- a/client.py +++ b/client.py @@ -4,7 +4,7 @@ from rtmbot import RtmBot slack_client = None def init(config): - global client + global slack_client bot = RtmBot(config) slack_client = bot.slack_client return bot From 65c1af42d26383c6993ac1893b1c9b9462dbc0ed Mon Sep 17 00:00:00 2001 From: philipyun103 Date: Sun, 7 Aug 2016 01:56:00 -0700 Subject: [PATCH 12/18] flake8 fixing rulings to pass build tests --- rtmbot.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/rtmbot.py b/rtmbot.py index a1ecc0c..e38517f 100755 --- a/rtmbot.py +++ b/rtmbot.py @@ -1,13 +1,11 @@ #!/usr/bin/env python +from argparse import ArgumentParser import sys import os -sys.path.append(os.getcwd()) - -from argparse import ArgumentParser - import yaml import client +sys.path.append(os.getcwd()) def parse_args(): parser = ArgumentParser() From 80dd994671331e27ef9b4953af0206e0dca68d59 Mon Sep 17 00:00:00 2001 From: philipyun103 Date: Sun, 7 Aug 2016 01:58:44 -0700 Subject: [PATCH 13/18] flake8 for reals this time --- rtmbot.py | 1 + 1 file changed, 1 insertion(+) diff --git a/rtmbot.py b/rtmbot.py index e38517f..f2ebc21 100755 --- a/rtmbot.py +++ b/rtmbot.py @@ -7,6 +7,7 @@ import client sys.path.append(os.getcwd()) + def parse_args(): parser = ArgumentParser() parser.add_argument( From 6a4b3ea84239d28701fc07fedfc806fe7a7d0703 Mon Sep 17 00:00:00 2001 From: Philip Yun Date: Sun, 7 Aug 2016 02:51:18 -0700 Subject: [PATCH 14/18] Update client.py for flake8 flake8 wasn't checking this file. ran flake8 against it to make sure it was compliant with coding guidelines --- client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client.py b/client.py index 079ef33..c16ac56 100644 --- a/client.py +++ b/client.py @@ -1,8 +1,8 @@ -from slackclient import SlackClient from rtmbot import RtmBot slack_client = None + def init(config): global slack_client bot = RtmBot(config) From 5e7daffadbd523e1d2a457d10977b1c8a2880d9d Mon Sep 17 00:00:00 2001 From: Jeff Ammons Date: Thu, 25 Aug 2016 15:35:37 -0700 Subject: [PATCH 15/18] Add a bit more info into the example plugin. --- docs/example-plugins/directAPIcall.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/example-plugins/directAPIcall.py b/docs/example-plugins/directAPIcall.py index 30d82a0..9e4e52d 100644 --- a/docs/example-plugins/directAPIcall.py +++ b/docs/example-plugins/directAPIcall.py @@ -1,5 +1,11 @@ from __future__ import unicode_literals from client import slack_client as sc -for user in sc.api_call("users.list")["members"]: - print(user["name"], user["id"]) + +def process_message(data): + '''If a user passes 'print users' in a message, print the users in the slack + team to the console. (Don't run this in production probably)''' + + if 'print users' in data['text']: + for user in sc.api_call("users.list")["members"]: + print(user["name"], user["id"]) From a8ee0a44773a7f50d747d413f4b944240dff63fa Mon Sep 17 00:00:00 2001 From: Jeff Ammons Date: Thu, 25 Aug 2016 16:08:00 -0700 Subject: [PATCH 16/18] Change to using sys.path and other windows compatibility changes --- rtmbot/core.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/rtmbot/core.py b/rtmbot/core.py index dd33e19..84ad838 100755 --- a/rtmbot/core.py +++ b/rtmbot/core.py @@ -31,7 +31,7 @@ class RtmBot(object): self.token = config.get('SLACK_TOKEN') # set working directory for loading plugins or other files - working_directory = os.path.dirname(sys.argv[0]) + working_directory = os.path.abspath(os.path.dirname(sys.argv[0])) self.directory = self.config.get('BASE_PATH', working_directory) if not self.directory.startswith('/'): path = '{}/{}'.format(os.getcwd(), self.directory) @@ -109,13 +109,14 @@ class RtmBot(object): plugin.do_jobs() def load_plugins(self): - for plugin in glob.glob(self.directory + '/plugins/*'): + plugin_dir = os.path.join(self.directory, 'plugins') + for plugin in glob.glob(os.path.join(plugin_dir, '*')): sys.path.insert(0, plugin) - sys.path.insert(0, self.directory + '/plugins/') - for plugin in glob.glob(self.directory + '/plugins/*.py') + \ - glob.glob(self.directory + '/plugins/*/*.py'): + sys.path.insert(0, plugin_dir) + for plugin in glob.glob(os.path.join(plugin_dir, '*.py')) + \ + glob.glob(os.path.join(plugin_dir, '*', '*.py')): logging.info(plugin) - name = plugin.split('/')[-1][:-3] + name = plugin.split(os.sep)[-1][:-3] if name in self.config: logging.info("config found for: " + name) plugin_config = self.config.get(name, {}) From d384c8fda5678d1e53149545b6b35c7efe49eecd Mon Sep 17 00:00:00 2001 From: Joe Smith Date: Thu, 25 Aug 2016 19:14:15 -0700 Subject: [PATCH 17/18] Fix up another unix-path-ism --- rtmbot/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtmbot/core.py b/rtmbot/core.py index 84ad838..86e17f6 100755 --- a/rtmbot/core.py +++ b/rtmbot/core.py @@ -34,7 +34,7 @@ class RtmBot(object): working_directory = os.path.abspath(os.path.dirname(sys.argv[0])) self.directory = self.config.get('BASE_PATH', working_directory) if not self.directory.startswith('/'): - path = '{}/{}'.format(os.getcwd(), self.directory) + path = os.path.join(os.getcwd(), self.directory) self.directory = os.path.abspath(path) # establish logging From f3ce1c655cfca00f13fa8cf96ab8e1a68f34617c Mon Sep 17 00:00:00 2001 From: Joe Smith Date: Thu, 25 Aug 2016 19:24:22 -0700 Subject: [PATCH 18/18] Small documentation typo --- .github/PULL_REQUEST_TEMPLATE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 972608a..4d869eb 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,7 +1,7 @@ * [ ] I've read and understood the [Contributing guidelines](./CONTRIBUTING.md) and have done my best effort to follow them. * [ ] I've read and agree to the [Code of Conduct](./CODE_OF_CONDUCT.md). * [ ] I've been mindful about doing atomic commits, adding documentation to my changes, not refactoring too much. -* [ ] I've a descriptive title and added any useful information for the reviewer. Where appropriate, I've attached a screenshot and/or screencast (gif preferrably). +* [ ] I've a descriptive title and added any useful information for the reviewer. Where appropriate, I've attached a screenshot and/or screencast (gif preferably). * [ ] I've written tests to cover the new code and functionality included in this PR. * [ ] I've read, agree to, and signed the [Contributor License Agreement (CLA)](https://docs.google.com/a/slack-corp.com/forms/d/1q_w8rlJG_x_xJOoSUMNl7R35rkpA7N6pUkKhfHHMD9c/viewform). @@ -12,4 +12,4 @@ > e.g. Fixes #206 and closes #230 #### Test strategy -> e.g. Add tests around whatsit production. \ No newline at end of file +> e.g. Add tests around whatsit production.