From afd8457ba9e6a688f25e688ff5a0bfef6a4cba05 Mon Sep 17 00:00:00 2001 From: Adam Papai Date: Sun, 8 Oct 2017 12:46:16 +0900 Subject: [PATCH 001/200] Fix world time plugin The old world weather API is no more. The replacement does not provide the local time in the JSON output. The solution is migrating the plugin to use the google apis which provides the timeZoneId, which is definitely enough for the `pytz` to generate a datetime object. --- will/plugins/productivity/world_time.py | 52 +++++++++++-------------- 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/will/plugins/productivity/world_time.py b/will/plugins/productivity/world_time.py index 7b2dc7c4..6b7b63b3 100644 --- a/will/plugins/productivity/world_time.py +++ b/will/plugins/productivity/world_time.py @@ -1,44 +1,38 @@ import datetime +import pytz import requests +import time + from will.plugin import WillPlugin from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings from will import settings +def get_location(place): + payload = {'address': place, 'sensor': False} + r = requests.get('http://maps.googleapis.com/maps/api/geocode/json', params=payload) + resp = r.json() + location = resp["results"][0]["geometry"]["location"] + return location + + +def get_timezone(lat, lng): + payload = {'location': "%s,%s" % (lat, lng), 'timestamp': int(time.time()), 'sensor': False} + r = requests.get('https://maps.googleapis.com/maps/api/timezone/json', params=payload) + resp = r.json() + tz = resp['timeZoneId'] + return tz + + class TimePlugin(WillPlugin): @respond_to("what time is it in (?P.*)") def what_time_is_it_in(self, message, place): """what time is it in ___: Say the time in almost any city on earth.""" - if ( - not hasattr(settings, "WORLD_WEATHER_ONLINE_KEY") and - not hasattr(settings, "WORLD_WEATHER_ONLINE_V2_KEY") - ): - self.say( - "I need a world weather online key to do that.\n" - "You can get one at http://developer.worldweatheronline.com, " - "and then set the key as WORLD_WEATHER_ONLINE_V2_KEY", - message=message - ) - else: - if hasattr(settings, "WORLD_WEATHER_ONLINE_V2_KEY"): - r = requests.get( - "http://api2.worldweatheronline.com/free/v2/tz.ashx?q=%s&format=json&key=%s" % - (place, settings.WORLD_WEATHER_ONLINE_V2_KEY) - ) - elif hasattr(settings, "WORLD_WEATHER_ONLINE_KEY"): - r = requests.get( - "http://api2.worldweatheronline.com/free/v1/tz.ashx?q=%s&format=json&key=%s" % - (place, settings.WORLD_WEATHER_ONLINE_KEY) - ) - resp = r.json() - if "request" in resp["data"] and len(resp["data"]["request"]) > 0: - place = resp["data"]["request"][0]["query"] - current_time = self.parse_natural_time(resp["data"]["time_zone"][0]["localtime"]) - - self.say("It's %s in %s." % (self.to_natural_day_and_time(current_time), place), message=message) - else: - self.say("I couldn't find anywhere named %s." % (place, ), message=message) + location = get_location(place) + tz = get_timezone(location['lat'], location['lng']) + ct = datetime.datetime.now(tz=pytz.timezone(tz)) + self.say("It's %s in %s." % (self.to_natural_day_and_time(ct), place), message=message) @respond_to("what time is it(\?)?$", multiline=False) def what_time_is_it(self, message): From 16b325f3204d2a8240476008f49223143509c87f Mon Sep 17 00:00:00 2001 From: Adam Papai Date: Sun, 8 Oct 2017 12:55:39 +0900 Subject: [PATCH 002/200] WorldTime plugin does not require API keys --- config.py | 1 - docs/plugins/bundled.md | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/config.py b/config.py index 21b31400..1213ccd0 100644 --- a/config.py +++ b/config.py @@ -62,7 +62,6 @@ # Don't load any of the plugins in this list. Same options as above. PLUGIN_BLACKLIST = [ "will.plugins.productivity.hangout", # Because it requires a HANGOUT_URL - "will.plugins.productivity.world_time", # Because it requires a WORLD_WEATHER_ONLINE_V2_KEY key "will.plugins.productivity.bitly", # Because it requires a BITLY_ACCESS_TOKEN key and the bitly_api library "will.plugins.devops.bitbucket_is_up", # Because most folks use github. "will.plugins.devops.pagerduty", # Because it requires a PAGERDUTY_SUBDOMAIN and PAGERDUTY_API_KEY key diff --git a/docs/plugins/bundled.md b/docs/plugins/bundled.md index 179b4174..f09ad4b6 100644 --- a/docs/plugins/bundled.md +++ b/docs/plugins/bundled.md @@ -234,8 +234,7 @@ You can also remind others as well. We're a remote company. Maybe you are too. Or your clients are. Or the light/dark cycle of the world just fascinates you. If any of these are you, -1. Get a free `WORLD_WEATHER_ONLINE_V2_KEY` from [world weather online](http://developer.worldweatheronline.com). -2. Get the time in pretty much any city on earth. Even our globe-trotting CEO hasn't been able to stump him. +1. Get the time in pretty much any city on earth. Even our globe-trotting CEO hasn't been able to stump him. ![World time](../img/world_time.gif) From b774d831a7e3d31a89879af5d62edc48a9cc43e5 Mon Sep 17 00:00:00 2001 From: Adam Papai Date: Sun, 8 Oct 2017 13:22:13 +0900 Subject: [PATCH 003/200] Handle errors/exceptions too --- will/plugins/productivity/world_time.py | 55 +++++++++++++++++++------ 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/will/plugins/productivity/world_time.py b/will/plugins/productivity/world_time.py index 6b7b63b3..bce46b8b 100644 --- a/will/plugins/productivity/world_time.py +++ b/will/plugins/productivity/world_time.py @@ -1,4 +1,5 @@ import datetime +import logging import pytz import requests import time @@ -7,21 +8,42 @@ from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings from will import settings +logger = logging.getLogger(__name__) + def get_location(place): - payload = {'address': place, 'sensor': False} - r = requests.get('http://maps.googleapis.com/maps/api/geocode/json', params=payload) - resp = r.json() - location = resp["results"][0]["geometry"]["location"] - return location + try: + payload = {'address': place, 'sensor': False} + r = requests.get('http://maps.googleapis.com/maps/api/geocode/json', params=payload) + resp = r.json() + if resp["status"] != "OK": + return None + else: + location = resp["results"][0]["geometry"]["location"] + return location + except Exception as e: + logger.error("Failed to fetch geocode for %(place)s. Error %(error)s" % {'place': place, 'error': e}) + return None def get_timezone(lat, lng): - payload = {'location': "%s,%s" % (lat, lng), 'timestamp': int(time.time()), 'sensor': False} - r = requests.get('https://maps.googleapis.com/maps/api/timezone/json', params=payload) - resp = r.json() - tz = resp['timeZoneId'] - return tz + try: + payload = {'location': "%(latitude)s,%(longitude)s" % {'latitude': lat, + 'longitude': lng}, + 'timestamp': int(time.time()), + 'sensor': False} + r = requests.get('https://maps.googleapis.com/maps/api/timezone/json', params=payload) + resp = r.json() + if resp["status"] == "OK": + tz = resp['timeZoneId'] + return tz + else: + return None + except Exception as e: + logger.error("Failed to fetch timezone for %(lat)s,%(lng)s. Error %(error)s" % {'lat': lat, + 'lng': lng, + 'error': e}) + return None class TimePlugin(WillPlugin): @@ -30,9 +52,16 @@ class TimePlugin(WillPlugin): def what_time_is_it_in(self, message, place): """what time is it in ___: Say the time in almost any city on earth.""" location = get_location(place) - tz = get_timezone(location['lat'], location['lng']) - ct = datetime.datetime.now(tz=pytz.timezone(tz)) - self.say("It's %s in %s." % (self.to_natural_day_and_time(ct), place), message=message) + if location is not None: + tz = get_timezone(location['lat'], location['lng']) + if tz is not None: + ct = datetime.datetime.now(tz=pytz.timezone(tz)) + self.say("It's %(time)s in %(place)s." % {'time': self.to_natural_day_and_time(ct), + 'place': place}, message=message) + else: + self.say("I couldn't find timezone for %(place)s." % {'place': place}, message=message) + else: + self.say("I couldn't find anywhere named %(place)s." % {'place': place}, message=message) @respond_to("what time is it(\?)?$", multiline=False) def what_time_is_it(self, message): From 5f866696a8320f5a853203cd7c69a287a68e18aa Mon Sep 17 00:00:00 2001 From: Adam Papai Date: Sun, 8 Oct 2017 16:23:11 +0900 Subject: [PATCH 004/200] strip HTML tags for shell backend In the console the HTML tags look pretty uggly and it's better to eliminate them completely. --- requirements.base.txt | 1 + will/backends/io_adapters/shell.py | 35 ++++++++++++++++++------------ 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/requirements.base.txt b/requirements.base.txt index 96b2953f..804718c9 100644 --- a/requirements.base.txt +++ b/requirements.base.txt @@ -1,4 +1,5 @@ APScheduler==2.1.2 +beautifulsoup4==4.6.0 bottle==0.12.7 CherryPy==3.6.0 clint==0.3.7 diff --git a/will/backends/io_adapters/shell.py b/will/backends/io_adapters/shell.py index 77d4eca6..30058c71 100644 --- a/will/backends/io_adapters/shell.py +++ b/will/backends/io_adapters/shell.py @@ -7,12 +7,16 @@ import threading import readline import traceback +import warnings +from bs4 import BeautifulSoup from will import settings from will.utils import Bunch, UNSURE_REPLIES from will.abstractions import Message, Person, Channel from .base import StdInOutIOBackend +warnings.filterwarnings("ignore", category=UserWarning, module='bs4') + class ShellBackend(StdInOutIOBackend): friendly_name = "Interactive Shell" @@ -24,11 +28,14 @@ class ShellBackend(StdInOutIOBackend): name="Friend", ) + def _strip_html_tags(self, message_body): + return BeautifulSoup(message_body, 'html.parser').get_text() + def send_direct_message(self, message_body, **kwargs): - print("Will: %s" % message_body) + print("Will: %s" % self._strip_html_tags(message_body)) def send_room_message(self, room_id, message_body, html=False, color="green", notify=False, **kwargs): - print("Will: %s" % message_body) + print("Will: %s" % self._strip_html_tags(message_body)) def set_room_topic(self, room_id, topic): print("Will: Setting the Topic to %s" & topic) @@ -90,16 +97,16 @@ def bootstrap(self): # Do this to get the first "you" prompt. self.pubsub.publish('message.incoming.stdin', (Message( - content="", - type="message.incoming", - is_direct=True, - is_private_chat=True, - is_group_chat=False, - backend=self.internal_name, - sender=self.partner, - will_is_mentioned=False, - will_said_it=False, - backend_supports_acl=False, - source={} - )) + content="", + type="message.incoming", + is_direct=True, + is_private_chat=True, + is_group_chat=False, + backend=self.internal_name, + sender=self.partner, + will_is_mentioned=False, + will_said_it=False, + backend_supports_acl=False, + source={} + )) ) From 2ed44880344d81f1a14345d5380659961a8b2a8d Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 10 Oct 2017 10:52:10 +1300 Subject: [PATCH 005/200] v1.0.1 release, with credits --- AUTHORS | 2 ++ docs/improve.md | 13 +++++++++++-- will/__init__.py | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index d0d77bfd..0508f5f8 100644 --- a/AUTHORS +++ b/AUTHORS @@ -44,3 +44,5 @@ Jose Cueto, https://github.com/pepedocs Derek Adair, https://github.com/derek-adair Antony Gelberg, https://github.com/antgel/ bykof, https://github.com/bykof/ +Mike Love, https://github.com/mike-love/ + diff --git a/docs/improve.md b/docs/improve.md index fbd165cd..dd3ab26e 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -112,6 +112,7 @@ Will's also has had help from lots of coders. Alphabetically: - [keNzi](https://github.com/keNzej) added shorten url function using bitly service. - [levithomason](http://github.com/levithomason) was one of the original contributors, when will was first built at GreenKahuna. - [mark-adams](https://github.com/mark-adams) cleaned up a Bitbucket typo. +- [mike-love](https://github.com/mike-love) added Docker support to make running Will easier! - [hobson](http://github.com/hobson) made setup.py more robust across operating systems, and improved the docs. - [neronmoon](https://github.com/neronmoon) made it easier to mention will with non-standard case - [michaeljoseph](https://github.com/michaeljoseph) suggested improvements to setup and requirements.txt format. @@ -129,7 +130,7 @@ Will's also has had help from lots of coders. Alphabetically: - [tomokas](https://github.com/tomokas) fixed a bug in the `@randomly` decorator. - [tophsic](https://github.com/tophsic) made help friendlier, including plugin-specific help. - [wohali](https://github.com/wohali) tracked down the annoying DNS thread issue, and got will on the right path. -- [woohgit](https://github.com/woohgit) added support for the v2 WorldWeatherOnline API, and fixed it when I broke it, and then fixed it again when they changed their endpoint. He also taught will how to say his version number. And `remind ___ to ___ at ___`. Awesome. And fixed lots of docs. And put the time zone with "what time is it?". And then added an entire Pagerduty workflow. And made message parsing more reliable. And wrote the ACL support. And even more doc fixes. And improvements on uptime monitoring edge cases. And kept Pagerduty working. And added `append` and `pop` list support. Yep. +- [woohgit](https://github.com/woohgit) added support for the v2 WorldWeatherOnline API, and fixed it when I broke it, and then fixed it again when they changed their endpoint. He also taught will how to say his version number. And `remind ___ to ___ at ___`. Awesome. And fixed lots of docs. And put the time zone with "what time is it?". And then added an entire Pagerduty workflow. And made message parsing more reliable. And wrote the ACL support. And even more doc fixes. And improvements on uptime monitoring edge cases. And kept Pagerduty working. And added `append` and `pop` list support. And ditched WorldWeatherOnline when it started to hurt. Yep. - [woparry](https://github.com/woparry) made sure that Will could handle organizations with a massive (>2000) number of rooms. @@ -146,9 +147,17 @@ If you're looking for plugin inspiration, here are some wills that are open-sour ## Releases +#### 1.0.1 - October 10, 2017 + +Fixes and features in this release: + +* Fixes up time plugin to not require World Weather's old API, thanks to [woohgit](https://github.com/woohgit). +* Adds docker support, thanks to [mike-love](https://github.com/mike-love). + + #### 1.0.0 - September 29, 2017 -This is the end of major feature development for the hipchat-only version of Will. Future development will be on 2.x, and while backwards compatability will be aimed for, it's not 100% guaranteed. +**This is the end of major feature development for the hipchat-only version of Will. Future development will be on 2.x, and while backwards compatability will be aimed for, it's not 100% guaranteed.** Fixes and features in this release: diff --git a/will/__init__.py b/will/__init__.py index 3277f64c..50b5ea95 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "1.0.0" +VERSION = "1.0.1" From db3b48373fb7a7774b7e2d7a6e7fcaffa6a8d487 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 10 Oct 2017 10:59:43 +1300 Subject: [PATCH 006/200] Adds tox to dev reqs, and circle --- circle.yml | 1 + requirements.dev.txt | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index 8fdde781..421f3841 100644 --- a/circle.yml +++ b/circle.yml @@ -5,4 +5,5 @@ test: override: - /home/ubuntu/will/will/scripts/test_run.sh - coverage run -m nose + - tox - flake8 \ No newline at end of file diff --git a/requirements.dev.txt b/requirements.dev.txt index 68a95b35..97f0a401 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -7,4 +7,5 @@ fabric flake8 mock nose -coverage \ No newline at end of file +coverage +tox \ No newline at end of file From d3c3c4e4fd323e38e1abad06a70b71aaae51732c Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 10 Oct 2017 11:08:32 +1300 Subject: [PATCH 007/200] Adds symlink support for cleanup --- fabfile.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fabfile.py b/fabfile.py index bec9b1c2..35d01c18 100644 --- a/fabfile.py +++ b/fabfile.py @@ -61,7 +61,11 @@ def deploy_docs(): for name in dirs: if name not in WHITELIST_DIRS and not any([r in WHITELIST_DIRS for r in _splitpath(root)]): print "removing %s" % (os.path.join(root, name)) - os.rmdir(os.path.join(root, name)) + try: + os.rmdir(os.path.join(root, name)) + except: + # Handle symlinks + os.remove(os.path.join(root, name)) local("cp -rv %s/* ." % tempdir) with settings(warn_only=True): From fb37ac9c9d77b94a84f55e4d15a12ab89ed7cd69 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 10 Oct 2017 11:55:07 +1300 Subject: [PATCH 008/200] Merges in py3 and master changes. (MASSIVE CONFLICTS) --- AUTHORS | 2 + circle.yml | 1 + config.py | 1 - docker/default.env | 17 +++++ docker/docker-compose.yml | 19 +++++ docker/will/Dockerfile | 16 ++++ docs/deploy.md | 37 +++++++++ docs/improve.md | 18 ++++- docs/plugins/bundled.md | 5 +- fabfile.py | 8 +- requirements.base.txt | 2 + requirements.dev.txt | 3 +- tox.ini | 4 +- will/__init__.py | 2 +- will/acl.py | 4 +- will/backends/storage/couchbase_backend.py | 8 +- will/backends/storage/file_backend.py | 6 +- will/backends/storage/redis_backend.py | 6 +- will/decorators.py | 2 +- will/listener.py | 2 +- will/main.py | 48 ++++++------ will/mixins/email.py | 3 +- will/mixins/hipchat.py | 12 +-- will/mixins/plugins_library.py | 2 +- will/mixins/room.py | 2 +- will/mixins/roster.py | 4 +- will/mixins/schedule.py | 5 +- will/mixins/storage.py | 1 - will/plugin.py | 9 ++- will/plugins/admin/ping.py | 1 - will/plugins/admin/version.py | 16 ++-- will/plugins/devops/bitbucket_is_up.py | 2 +- will/plugins/devops/emergency_contacts.py | 1 - will/plugins/devops/heroku_is_up.py | 3 +- will/plugins/devops/hipchat_is_up.py | 2 +- will/plugins/devops/pagerduty.py | 2 +- will/plugins/help/help.py | 4 +- will/plugins/productivity/bitly.py | 5 +- will/plugins/productivity/hangout.py | 3 +- will/plugins/productivity/remind.py | 9 +-- will/plugins/productivity/world_time.py | 87 +++++++++++++--------- will/scheduler.py | 16 ++-- will/scripts/generate_will_project.py | 26 +++---- will/settings.py | 6 +- will/utils.py | 9 +-- 45 files changed, 278 insertions(+), 163 deletions(-) create mode 100644 docker/default.env create mode 100644 docker/docker-compose.yml create mode 100755 docker/will/Dockerfile diff --git a/AUTHORS b/AUTHORS index d0d77bfd..64c6e6f5 100644 --- a/AUTHORS +++ b/AUTHORS @@ -43,4 +43,6 @@ danbourke, https://github.com/danbourke Jose Cueto, https://github.com/pepedocs Derek Adair, https://github.com/derek-adair Antony Gelberg, https://github.com/antgel/ +Jeppe Toustrup, https://github.com/Tenzer bykof, https://github.com/bykof/ +Mike Love, https://github.com/mike-love/ diff --git a/circle.yml b/circle.yml index 8fdde781..421f3841 100644 --- a/circle.yml +++ b/circle.yml @@ -5,4 +5,5 @@ test: override: - /home/ubuntu/will/will/scripts/test_run.sh - coverage run -m nose + - tox - flake8 \ No newline at end of file diff --git a/config.py b/config.py index fcd8824c..f388df89 100644 --- a/config.py +++ b/config.py @@ -62,7 +62,6 @@ # Don't load any of the plugins in this list. Same options as above. PLUGIN_BLACKLIST = [ "will.plugins.productivity.hangout", # Because it requires a HANGOUT_URL - # "will.plugins.productivity.world_time", # Because it requires a WORLD_WEATHER_ONLINE_V2_KEY key "will.plugins.productivity.bitly", # Because it requires a BITLY_ACCESS_TOKEN key and the bitly_api library "will.plugins.devops.bitbucket_is_up", # Because most folks use github. "will.plugins.devops.pagerduty", # Because it requires a PAGERDUTY_SUBDOMAIN and PAGERDUTY_API_KEY key diff --git a/docker/default.env b/docker/default.env new file mode 100644 index 00000000..3c3fd535 --- /dev/null +++ b/docker/default.env @@ -0,0 +1,17 @@ + +# REDIS Settings +WILL_REDIS_URL=redis://redis:6379/ + +# Hipchat Settings +WILL_HIPCHAT_SERVER= +WILL_USERNAME= +WILL_PASSWORD= +WILL_V2_TOKEN= +WILL_V1_TOKEN= +WILL_ALLOW_INSECURE_HIPCHAT_SERVER= + +# WILL Settings + +WILL_HTTPSERVER_PORT=8080 +WILL_LOGLEVEL=DEBUG + diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 00000000..cb1ddb0e --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3.2' + +services: + redis: + image: redis:alpine + volumes: + - ./data/redis:/data + will: + build: ./will/. + ports: + - 8080:8080 + env_file: + - default.env + volumes: + - ./plugins:/opt/will/plugins + - ./templates:/opt/will/templates + depends_on: + - redis + diff --git a/docker/will/Dockerfile b/docker/will/Dockerfile new file mode 100755 index 00000000..166421db --- /dev/null +++ b/docker/will/Dockerfile @@ -0,0 +1,16 @@ +#Pull CENTOS +FROM python:2.7-stretch + +# Maintainer +# ---------- +MAINTAINER mlove@columnit.com + +ENV _WILL_HOME=/opt/will + +RUN mkdir -p $_WILL_HOME + +RUN pip install will + +WORKDIR $_WILL_HOME +RUN generate_will_project +CMD $_WILL_HOME/run_will.py diff --git a/docs/deploy.md b/docs/deploy.md index 4b9d19fb..b274c913 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -75,6 +75,43 @@ git push heroku Simple. For best-practices, see our continuous deployment recommendations below. +## Deploy in Docker +Will is packaged with a Dockerfile and docker-compose files to allow deploying in a container with redis. + +### Pre-requisites +You should have docker already installed; additionally, the instructions require docker-compose. If you're not using docker-compose, you must start the image via the docker command with the correct arguments. + +### Step 1: Configure your container's environment variables +In Will's docker directory, update the default.env file with your environment's settings. At a minimum, this should contain: +```bash +WILL_USERNAME +WILL_PASSWORD +WILL_V2_TOKEN +``` +Note, we've pre-defined the redis url and the HTTP Server port; if you update these values, make sure you update the docker-compose file accordingly. + +### Step 2: Deploy your plugins and templates +If you have any custom templates, create directories for your plugins and templates, and load your plugins and templates they'll be mounted when the container starts up giving your contanerized bot access to your templates. +```bash +mkdir ./plugins ./templates +``` + +### Step 3: Build will. +Run build your docker image locally. +```bash +docker-compose build +``` + +### Step 4: Start the container +Start your image from docker-compose using: +```bash +docker-compose up +``` +or to run the container in the background, +```bash +docker-compose up -d +``` + ## Deploy Everywhere Else #### Will is Just Python diff --git a/docs/improve.md b/docs/improve.md index 1b15c4fa..7e669775 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -113,6 +113,8 @@ Will's also has had help from lots of coders. Alphabetically: - [keNzi](https://github.com/keNzej) added shorten url function using bitly service. - [levithomason](http://github.com/levithomason) was one of the original contributors, when will was first built at GreenKahuna. - [mark-adams](https://github.com/mark-adams) cleaned up a Bitbucket typo. +- [mike-love](https://github.com/mike-love) added Docker support to make running Will easier! +- [hobson](http://github.com/hobson) made setup.py more robust across operating systems, and improved the docs. - [neronmoon](https://github.com/neronmoon) made it easier to mention will with non-standard case - [michaeljoseph](https://github.com/michaeljoseph) suggested improvements to setup and requirements.txt format. - [mrgrue](https://github.com/mrgrue) added support for the hipchat server beta. @@ -126,10 +128,11 @@ Will's also has had help from lots of coders. Alphabetically: - [rbp](https://github.com/rbp) added the `admin_only` argument, and fixed a bug with `room` not being passed along properly to messages. - [shadow7412](https://github/shadow7412) cleaned up a bunch of regex, and fixed up `image me` after google pulled the free API. - [sivy](https://github.com/sivy) added a config flag for disabling SSL, and the ability to look up a user by nickname. +- [tenzer](https://github.com/tenzer) added python 3 support! - [tomokas](https://github.com/tomokas) fixed a bug in the `@randomly` decorator. - [tophsic](https://github.com/tophsic) made help friendlier, including plugin-specific help. - [wohali](https://github.com/wohali) tracked down the annoying DNS thread issue, and got will on the right path. -- [woohgit](https://github.com/woohgit) added support for the v2 WorldWeatherOnline API, and fixed it when I broke it, and then fixed it again when they changed their endpoint. He also taught will how to say his version number. And `remind ___ to ___ at ___`. Awesome. And fixed lots of docs. And put the time zone with "what time is it?". And then added an entire Pagerduty workflow. And made message parsing more reliable. And wrote the ACL support. And even more doc fixes. And improvements on uptime monitoring edge cases. And kept Pagerduty working. And added `append` and `pop` list support. Yep. +- [woohgit](https://github.com/woohgit) added support for the v2 WorldWeatherOnline API, and fixed it when I broke it, and then fixed it again when they changed their endpoint. He also taught will how to say his version number. And `remind ___ to ___ at ___`. Awesome. And fixed lots of docs. And put the time zone with "what time is it?". And then added an entire Pagerduty workflow. And made message parsing more reliable. And wrote the ACL support. And even more doc fixes. And improvements on uptime monitoring edge cases. And kept Pagerduty working. And added `append` and `pop` list support. And ditched WorldWeatherOnline when it started to hurt. Yep. - [woparry](https://github.com/woparry) made sure that Will could handle organizations with a massive (>2000) number of rooms. @@ -146,6 +149,7 @@ If you're looking for plugin inspiration, here are some wills that are open-sour ## Releases + #### 2.0 - ??? TODO: Finish these @@ -162,9 +166,19 @@ This release addresses a number of bugs and smaller features, including: * Chatoms support fixed by [bykof](https://github.com/bykof). + +#### 1.0.1 - October 10, 2017 + +Fixes and features in this release: + +* Fixes what time plugin to not require World Weather's old API, thanks to [woohgit](https://github.com/woohgit). +* Adds Docker support, thanks to [mike-love](https://github.com/mike-love). +* Adds Python 3 support, thanks to [tenzer](https://github.com/tenzer). + + #### 1.0.0 - September 29, 2017 -This is the end of major feature development for the hipchat-only version of Will. Future development will be on 2.x, and while backwards compatability will be aimed for, it's not 100% guaranteed. +**This is the end of major feature development for the hipchat-only version of Will. Future development will be on 2.x, and while backwards compatability will be aimed for, it's not 100% guaranteed.** Fixes and features in this release: diff --git a/docs/plugins/bundled.md b/docs/plugins/bundled.md index 179b4174..357ca4fb 100644 --- a/docs/plugins/bundled.md +++ b/docs/plugins/bundled.md @@ -232,10 +232,7 @@ You can also remind others as well. #### World time -We're a remote company. Maybe you are too. Or your clients are. Or the light/dark cycle of the world just fascinates you. If any of these are you, - -1. Get a free `WORLD_WEATHER_ONLINE_V2_KEY` from [world weather online](http://developer.worldweatheronline.com). -2. Get the time in pretty much any city on earth. Even our globe-trotting CEO hasn't been able to stump him. +We're a remote company. Maybe you are too. Or your clients are. Or the light/dark cycle of the world just fascinates you. If any of these are you, just ask Will to get the time in pretty much any city on earth. Even our globe-trotting CEO hasn't been able to stump him. ![World time](../img/world_time.gif) diff --git a/fabfile.py b/fabfile.py index b84e7615..35d01c18 100644 --- a/fabfile.py +++ b/fabfile.py @@ -61,7 +61,11 @@ def deploy_docs(): for name in dirs: if name not in WHITELIST_DIRS and not any([r in WHITELIST_DIRS for r in _splitpath(root)]): print "removing %s" % (os.path.join(root, name)) - os.rmdir(os.path.join(root, name)) + try: + os.rmdir(os.path.join(root, name)) + except: + # Handle symlinks + os.remove(os.path.join(root, name)) local("cp -rv %s/* ." % tempdir) with settings(warn_only=True): @@ -72,5 +76,5 @@ def deploy_docs(): local("git commit -m 'Auto-update of docs: %s'" % last_commit) local("git push") else: - print "No changes to the docs." + print("No changes to the docs.") local("git checkout %s" % current_branch) diff --git a/requirements.base.txt b/requirements.base.txt index 804718c9..7f12f2a3 100644 --- a/requirements.base.txt +++ b/requirements.base.txt @@ -21,3 +21,5 @@ PyYAML==3.10 regex==2017.9.23 redis==2.10.6 requests==2.4.1 +six==1.10.0 + diff --git a/requirements.dev.txt b/requirements.dev.txt index f1d948aa..1c34fec6 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -8,4 +8,5 @@ flake8 mock nose coverage -yappi \ No newline at end of file +yappi +tox diff --git a/tox.ini b/tox.ini index 598d479a..a389561c 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py27, flake8 +envlist = py27, 35, flake8 [testenv] @@ -10,4 +10,4 @@ commands = commands = flake8 deps = - flake8 \ No newline at end of file + flake8 diff --git a/will/__init__.py b/will/__init__.py index 3277f64c..50b5ea95 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "1.0.0" +VERSION = "1.0.1" diff --git a/will/acl.py b/will/acl.py index b06a8ef0..747e7c84 100644 --- a/will/acl.py +++ b/will/acl.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from . import settings +from will import settings def get_acl_members(acl): @@ -9,7 +9,7 @@ def get_acl_members(acl): if getattr(settings, "ACL", None): try: # Case-insensitive checks - for k, v in settings.ACL.items(): + for k in settings.ACL.keys(): if k.lower() == acl: acl_members = settings.ACL[k] break diff --git a/will/backends/storage/couchbase_backend.py b/will/backends/storage/couchbase_backend.py index 756765d2..429661a1 100644 --- a/will/backends/storage/couchbase_backend.py +++ b/will/backends/storage/couchbase_backend.py @@ -1,4 +1,4 @@ -import urlparse +from six.moves.urllib import parse from couchbase import Couchbase, exceptions as cb_exc from .base import BaseStorageBackend @@ -8,7 +8,7 @@ class CouchbaseStorage(BaseStorageBackend): """ A storage backend using Couchbase - You must supply a COUCHBASE_URL setting that is passed through urlparse. + You must supply a COUCHBASE_URL setting that is passed through parse. All parameters supplied get passed through to Couchbase Examples: @@ -22,7 +22,7 @@ class CouchbaseStorage(BaseStorageBackend): required_settings = [ { "name": "COUCHBASE_URL", - "obtain_at": """You must supply a COUCHBASE_URL setting that is passed through urlparse. + "obtain_at": """You must supply a COUCHBASE_URL setting that is passed through parse. All parameters supplied get passed through to Couchbase Examples: @@ -36,7 +36,7 @@ class CouchbaseStorage(BaseStorageBackend): def __init__(self, settings): self.verify_settings(quiet=True) - url = urlparse.urlparse(settings.COUCHBASE_URL) + url = parse(settings.COUCHBASE_URL) params = dict([ param.split('=') for param in url.query.split('&') diff --git a/will/backends/storage/file_backend.py b/will/backends/storage/file_backend.py index d2053af3..1f39ce54 100644 --- a/will/backends/storage/file_backend.py +++ b/will/backends/storage/file_backend.py @@ -46,18 +46,18 @@ def __init__(self, settings): if not os.path.exists(self.dirname): # the directory doesn't exist, try to create it - os.makedirs(self.dirname, mode=0700) + os.makedirs(self.dirname, mode=0x700) elif not os.path.exists(self.dotfile): # the directory exists, but doesn't have our dot file in it # if it has any other files in it then we bail out since we want to # have full control over wiping out the contents of the directory - if len(self._all_setting_files()) > 0: + if self._all_setting_files(): raise FileStorageException("%s is not empty, " "will needs an empty directory for " "settings" % (self.dirname,)) # update our dir & dotfile - os.chmod(self.dirname, 0700) + os.chmod(self.dirname, 0o700) with open(self.dotfile, 'a'): os.utime(self.dotfile, None) diff --git a/will/backends/storage/redis_backend.py b/will/backends/storage/redis_backend.py index 8e2ff573..361749af 100644 --- a/will/backends/storage/redis_backend.py +++ b/will/backends/storage/redis_backend.py @@ -1,5 +1,5 @@ import redis -import urlparse +from six.moves.urllib import parse from .base import BaseStorageBackend @@ -19,7 +19,7 @@ class RedisStorage(BaseStorageBackend): """ A storage backend using Redis. - You must supply a REDIS_URL setting that is passed through urlparse. + You must supply a REDIS_URL setting that is passed through parse. Examples: @@ -28,7 +28,7 @@ class RedisStorage(BaseStorageBackend): """ def __init__(self, settings): self.verify_settings(quiet=True) - url = urlparse.urlparse(settings.REDIS_URL) + url = parse(settings.REDIS_URL) if hasattr(url, "path"): db = url.path[1:] diff --git a/will/decorators.py b/will/decorators.py index 2f250240..929dd72f 100644 --- a/will/decorators.py +++ b/will/decorators.py @@ -88,7 +88,7 @@ def rendered_template(template_name, context=None): def wrap(f): def wrapped_f(*args, **kwargs): context = f(*args, **kwargs) - if type(context) == type({}): + if isinstance(context, dict): template = env.get_template(template_name) return template.render(**context) else: diff --git a/will/listener.py b/will/listener.py index 12061a8c..67df29cc 100644 --- a/will/listener.py +++ b/will/listener.py @@ -3,7 +3,7 @@ import threading import traceback -import settings +from will import settings from utils import Bunch diff --git a/will/main.py b/will/main.py index b944fa6e..73afed70 100644 --- a/will/main.py +++ b/will/main.py @@ -21,9 +21,7 @@ from multiprocessing import Process, Queue import bottle - from listener import ListenerMixin - from mixins import ScheduleMixin, StorageMixin, ErrorMixin, SleepMixin,\ RoomMixin, PluginModulesLibraryMixin, EmailMixin, PubSubMixin from backends import analysis, execution, generation, io_adapters @@ -35,7 +33,7 @@ # Force UTF8 if sys.version_info < (3, 0): - reload(sys) + reload(sys) # flake8: noqa sys.setdefaultencoding('utf8') else: raw_input = input @@ -201,7 +199,7 @@ def bootstrap(self): except (KeyboardInterrupt, SystemExit): self.handle_sys_exit() - def verify_individual_setting(self, test_setting, quiet=False): + def verify_individual_setting(self, test_setting): if not test_setting.get("only_if", True): return True @@ -260,7 +258,7 @@ def verify_io(self): c = cls() show_valid(c.friendly_name) c.verify_settings() - except Exception, e: + except Exception as e: error_message = ( "IO backend %s is missing. Please either remove it \nfrom config.py " "or WILL_IO_BACKENDS, or provide it somehow (pip install, etc)." @@ -303,7 +301,7 @@ def verify_analysis(self): one_valid_backend = True show_valid("%s" % b) - except ImportError, e: + except ImportError as e: error_message = ( "Analysis backend %s is missing. Please either remove it \nfrom config.py " "or WILL_ANALYZE_BACKENDS, or provide it somehow (pip install, etc)." @@ -346,7 +344,7 @@ def verify_generate(self): one_valid_backend = True show_valid("%s" % b) - except ImportError, e: + except ImportError as e: error_message = ( "Generation backend %s is missing. Please either remove it \nfrom config.py " "or WILL_GENERATION_BACKENDS, or provide it somehow (pip install, etc)." @@ -389,7 +387,7 @@ def verify_execution(self): one_valid_backend = True show_valid("%s" % b) - except ImportError, e: + except ImportError as e: error_message = ( "Execution backend %s is missing. Please either remove it \nfrom config.py " "or WILL_EXECUTION_BACKENDS, or provide it somehow (pip install, etc)." @@ -428,7 +426,7 @@ def bootstrap_execution(self): ): c = cls(bot=self) self.execution_backends.append(c) - except ImportError, e: + except ImportError as e: error_message = ( "Execution backend %s is missing. Please either remove it \nfrom config.py " "or WILL_EXECUTION_BACKENDS, or provide it somehow (pip install, etc)." @@ -481,7 +479,7 @@ def verify_plugin_settings(self): def handle_sys_exit(self, *args, **kwargs): # if not self.exiting: try: - print '\n\nReceived keyboard interrupt, quitting threads.', + print('\n\nReceived keyboard interrupt, quitting threads.',) self.exiting = True if self.scheduler_thread: @@ -639,12 +637,12 @@ def bootstrap_storage_mixin(self): with indent(2): show_valid("Bootstrapped!") puts("") - except ImportError, e: + except ImportError as e: module_name = traceback.format_exc(e).split(" ")[-1] error("Unable to bootstrap storage - attempting to load %s" % module_name) puts(traceback.format_exc(e)) sys.exit(1) - except Exception, e: + except Exception as e: error("Unable to bootstrap storage!") puts(traceback.format_exc(e)) sys.exit(1) @@ -659,12 +657,12 @@ def bootstrap_pubsub_mixin(self): with indent(2): show_valid("Bootstrapped!") puts("") - except ImportError, e: + except ImportError as e: module_name = traceback.format_exc(e).split(" ")[-1] error("Unable to bootstrap pubsub - attempting to load %s" % module_name) puts(traceback.format_exc(e)) sys.exit(1) - except Exception, e: + except Exception as e: error("Unable to bootstrap pubsub!") puts(traceback.format_exc(e)) sys.exit(1) @@ -699,7 +697,7 @@ def bootstrap_scheduler(self): meta["num_times_per_day"] ) bootstrapped = True - except Exception, e: + except Exception as e: self.startup_error("Error bootstrapping scheduler", e) if bootstrapped: show_valid("Scheduler started.") @@ -718,7 +716,7 @@ def bootstrap_bottle(self): bottle_route_args[k[len("bottle_"):]] = v bottle.route(instantiated_fn.will_fn_metadata["bottle_route"], **bottle_route_args)(instantiated_fn) bootstrapped = True - except Exception, e: + except Exception as e: self.startup_error("Error bootstrapping bottle", e) if bootstrapped: show_valid("Web server started.") @@ -762,7 +760,7 @@ def bootstrap_io(self): self.io_threads.append(thread) show_valid("IO: %s Backend started." % cls.friendly_name) - except Exception, e: + except Exception as e: self.startup_error("Error bootstrapping %s io" % b, e) self.io_backends.append(b) @@ -791,7 +789,7 @@ def bootstrap_analysis(self): thread.start() self.analysis_threads.append(thread) show_valid("Analysis: %s Backend started." % cls.__name__) - except Exception, e: + except Exception as e: self.startup_error("Error bootstrapping %s io" % b, e) self.analysis_backends.append(b) @@ -820,7 +818,7 @@ def bootstrap_generation(self): thread.start() self.generation_threads.append(thread) show_valid("Generation: %s Backend started." % cls.__name__) - except Exception, e: + except Exception as e: self.startup_error("Error bootstrapping %s io" % b, e) self.generation_backends.append(b) @@ -879,7 +877,7 @@ def bootstrap_plugins(self): "parent_help_text": parent_help_text, "blacklisted": blacklisted, } - except Exception, e: + except Exception as e: self.startup_error("Error loading %s" % (module_path,), e) self.plugins = [] @@ -899,9 +897,9 @@ def bootstrap_plugins(self): "parent_help_text": plugin_modules_library[name]["parent_help_text"], "blacklisted": plugin_modules_library[name]["blacklisted"], }) - except Exception, e: + except Exception as e: self.startup_error("Error bootstrapping %s" % (class_name,), e) - except Exception, e: + except Exception as e: self.startup_error("Error bootstrapping %s" % (name,), e) self._plugin_modules_library = plugin_modules_library @@ -941,7 +939,7 @@ def bootstrap_plugins(self): plugin_instances = {} for function_name, fn in inspect.getmembers( plugin_info["class"], - predicate=inspect.ismethod + predicate=lambda x: inspect.ismethod(x) or inspect.isfunction(x) ): try: # Check for required_settings @@ -1019,7 +1017,7 @@ def bootstrap_plugins(self): elif "bottle_route" in meta: # puts("- %s" % function_name) self.bottle_routes.append((plugin_info["class"], function_name)) - except Exception, e: + except Exception as e: error(plugin_name) self.startup_error( "Error bootstrapping %s.%s" % ( @@ -1028,7 +1026,7 @@ def bootstrap_plugins(self): ), e ) show_valid(plugin_name) - except Exception, e: + except Exception as e: self.startup_error("Error bootstrapping %s" % (plugin_info["class"],), e) puts("") diff --git a/will/mixins/email.py b/will/mixins/email.py index 5891bc6a..efe656ef 100644 --- a/will/mixins/email.py +++ b/will/mixins/email.py @@ -1,7 +1,6 @@ import requests from will import settings -from will.decorators import require_settings class EmailMixin(object): @@ -16,7 +15,7 @@ def send_email(self, from_email=None, email_list=[], subject="", message=""): else: raise ValueError("Couldn't send email, from_email was None and there was no DEFAULT_FROM_EMAIL") - if email_list is None or len(email_list) == 0: + if not email_list: raise ValueError("Email list wasn't specified. Expecting a list of emails, got %s" % email_list) api_url = getattr(settings, 'MAILGUN_API_URL', None) diff --git a/will/mixins/hipchat.py b/will/mixins/hipchat.py index 3ee9bb20..639fdb40 100644 --- a/will/mixins/hipchat.py +++ b/will/mixins/hipchat.py @@ -18,7 +18,7 @@ class HipChatMixin(object): def send_direct_message(self, user_id, message_body, html=False, notify=False, **kwargs): if kwargs: - logging.warn("Unknown keyword args for send_direct_message: %s" % kwargs) + logging.warning("Unknown keyword args for send_direct_message: %s", kwargs) format = "text" if html: @@ -37,17 +37,17 @@ def send_direct_message(self, user_id, message_body, html=False, notify=False, * headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} requests.post(url, headers=headers, data=json.dumps(data), **settings.REQUESTS_OPTIONS) except: - logging.critical("Error in send_direct_message: \n%s" % traceback.format_exc()) + logging.critical("Error in send_direct_message: \n%s", traceback.format_exc()) def send_direct_message_reply(self, message, message_body): try: message.reply(message_body).send() except: - logging.critical("Error in send_direct_message_reply: \n%s" % traceback.format_exc()) + logging.critical("Error in send_direct_message_reply: \n%s", traceback.format_exc()) def send_room_message(self, room_id, message_body, html=False, color="green", notify=False, card=None, **kwargs): if kwargs: - logging.warn("Unknown keyword args for send_room_message: %s" % kwargs) + logging.warning("Unknown keyword args for send_room_message: %s", kwargs) format = "text" if html: @@ -69,7 +69,7 @@ def send_room_message(self, room_id, message_body, html=False, color="green", no r = requests.post(url, headers=headers, data=json.dumps(data), **settings.REQUESTS_OPTIONS) r.raise_for_status() except: - logging.critical("Error in send_room_message: \n%s" % traceback.format_exc()) + logging.critical("Error in send_room_message: \n%s", traceback.format_exc()) def set_room_topic(self, room_id, topic): try: @@ -83,7 +83,7 @@ def set_room_topic(self, room_id, topic): headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} requests.put(url, headers=headers, data=json.dumps(data), **settings.REQUESTS_OPTIONS) except: - logging.critical("Error in set_room_topic: \n%s" % traceback.format_exc()) + logging.critical("Error in set_room_topic: \n%s", traceback.format_exc()) def get_hipchat_user(self, user_id, q=None): url = USER_DETAILS_URL % {"server": settings.HIPCHAT_SERVER, diff --git a/will/mixins/plugins_library.py b/will/mixins/plugins_library.py index 005352e8..d44f1560 100644 --- a/will/mixins/plugins_library.py +++ b/will/mixins/plugins_library.py @@ -13,6 +13,6 @@ def plugin_modules_library(self): else: self._plugin_modules_library = self.load("plugin_modules_library", {}) except: - logging.critical("Error loading plugin_modules_library: \n%s" % traceback.format_exc()) + logging.critical("Error loading plugin_modules_library: \n%s", traceback.format_exc()) return {} return self._plugin_modules_library diff --git a/will/mixins/room.py b/will/mixins/room.py index 068c5ded..6dc3cca7 100644 --- a/will/mixins/room.py +++ b/will/mixins/room.py @@ -111,7 +111,7 @@ def available_rooms(self): return self._available_rooms def get_room_by_jid(self, jid): - for name, room in self.available_rooms.items(): + for room in self.available_rooms.values(): if "xmpp_jid" in room and room["xmpp_jid"] == jid: return room return None diff --git a/will/mixins/roster.py b/will/mixins/roster.py index 87097066..8f4b7027 100644 --- a/will/mixins/roster.py +++ b/will/mixins/roster.py @@ -1,6 +1,6 @@ import logging -from ..utils import is_admin -from ..acl import is_acl_allowed +from will.utils import is_admin +from will.acl import is_acl_allowed from will import settings diff --git a/will/mixins/schedule.py b/will/mixins/schedule.py index a23daa4b..a19977da 100644 --- a/will/mixins/schedule.py +++ b/will/mixins/schedule.py @@ -72,8 +72,9 @@ def add_to_schedule(self, when, item, periodic_list=False, ignore_scheduler_lock except: logging.critical( - "Error adding to schedule at %s. \n\n%s\nContinuing...\n" % - (when, traceback.format_exc()) + "Error adding to schedule at %s. \n\n%s\nContinuing...\n", + when, + traceback.format_exc() ) self.save("scheduler_add_lock", False) diff --git a/will/mixins/storage.py b/will/mixins/storage.py index 76b2bebf..5b0a0098 100644 --- a/will/mixins/storage.py +++ b/will/mixins/storage.py @@ -1,7 +1,6 @@ import importlib import logging import dill as pickle -import functools from will import settings from will.abstractions import Person, Event, Channel, Message diff --git a/will/plugin.py b/will/plugin.py index 0e7cd364..bd8ae3dc 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -1,7 +1,7 @@ import re import logging -import settings +from will import settings from bottle import request from mixins import NaturalTimeMixin, RosterMixin, RoomMixin, ScheduleMixin, StorageMixin, SettingsMixin, \ EmailMixin, PubSubMixin @@ -38,7 +38,7 @@ def _rooms_from_message_and_room(self, message, room): rooms = [self.get_room_from_name_or_id(settings.HIPCHAT_DEFAULT_ROOM), ] return rooms - def _prepared_content(self, content, message, kwargs): + def _prepared_content(self, content): content = re.sub(r'>\s+<', '><', content) return content @@ -88,7 +88,7 @@ def say(self, content, message=None, room=None, card=None, **kwargs): source_message=message, kwargs=kwargs, )) - + # content = self._prepared_content(content, message, kwargs) # rooms = [] # if room is not None: @@ -143,6 +143,7 @@ def reply(self, event, content, **kwargs): # sender = message.sender # self.send_direct_message(sender["hipchat_id"], content, **kwargs) + def set_topic(self, topic, message=None, room=None): if message is None or message["type"] == "groupchat": @@ -157,7 +158,7 @@ def set_topic(self, topic, message=None, room=None): def schedule_say(self, content, when, message=None, room=None, *args, **kwargs): - content = self._prepared_content(content, message, kwargs) + content = self._prepared_content(content) if message is None or message["type"] == "groupchat": rooms = self._rooms_from_message_and_room(message, room) for r in rooms: diff --git a/will/plugins/admin/ping.py b/will/plugins/admin/ping.py index 09130e50..e2e627f7 100644 --- a/will/plugins/admin/ping.py +++ b/will/plugins/admin/ping.py @@ -1,4 +1,3 @@ -import datetime from will.plugin import WillPlugin from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings diff --git a/will/plugins/admin/version.py b/will/plugins/admin/version.py index a2f939b9..ff92858c 100644 --- a/will/plugins/admin/version.py +++ b/will/plugins/admin/version.py @@ -1,11 +1,11 @@ -# import pkg_resources -# from will.plugin import WillPlugin -# from will.decorators import respond_to +import pkg_resources +from will.plugin import WillPlugin +from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings -# class VersionPlugin(WillPlugin): +class VersionPlugin(WillPlugin): -# @respond_to("^version$") -# def say_version(self, message): -# version = pkg_resources.get_distribution("will").version -# self.say("I'm running version %s" % version, message=message) + @respond_to("^version$") + def say_version(self, message): + version = pkg_resources.get_distribution("will").version + self.say("I'm running version %s" % version, message=message) diff --git a/will/plugins/devops/bitbucket_is_up.py b/will/plugins/devops/bitbucket_is_up.py index 4917b0f9..8d303541 100644 --- a/will/plugins/devops/bitbucket_is_up.py +++ b/will/plugins/devops/bitbucket_is_up.py @@ -11,7 +11,7 @@ def bitbucket_is_up(self): try: r = requests.get("http://bqlf8qjztdtr.statuspage.io/api/v2/status.json") last_status = self.load("last_bb_status") - if r.json()["status"]["indicator"] != last_status: + if last_status and r.json()["status"]["indicator"] != last_status: if r.json()["status"]["indicator"] != "none": self.say("FYI everyone, Bitbucket is having trouble: %s" % r.json()["status"]["description"]) else: diff --git a/will/plugins/devops/emergency_contacts.py b/will/plugins/devops/emergency_contacts.py index 9bf0d0bb..b9f10be5 100644 --- a/will/plugins/devops/emergency_contacts.py +++ b/will/plugins/devops/emergency_contacts.py @@ -1,6 +1,5 @@ from will.plugin import WillPlugin from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings -from will import settings class EmergencyContactsPlugin(WillPlugin): diff --git a/will/plugins/devops/heroku_is_up.py b/will/plugins/devops/heroku_is_up.py index ee64892e..6d93c984 100644 --- a/will/plugins/devops/heroku_is_up.py +++ b/will/plugins/devops/heroku_is_up.py @@ -1,8 +1,7 @@ import requests from will.plugin import WillPlugin -from will.decorators import respond_to, periodic, hear, randomly,\ - route, rendered_template, require_settings +from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings class HerokuIsUpPlugin(WillPlugin): diff --git a/will/plugins/devops/hipchat_is_up.py b/will/plugins/devops/hipchat_is_up.py index 6cb5add0..7d66a6db 100644 --- a/will/plugins/devops/hipchat_is_up.py +++ b/will/plugins/devops/hipchat_is_up.py @@ -11,7 +11,7 @@ def hipchat_is_up(self): try: r = requests.get("https://status.hipchat.com/api/v2/status.json") last_status = self.load("last_hipchat_status") - if r.json()["status"]["indicator"] != last_status: + if last_status and r.json()["status"]["indicator"] != last_status: if r.json()["status"]["indicator"] != "none": self.say("FYI everyone, HipChat is having trouble: %s" % r.json()["status"]["description"]) else: diff --git a/will/plugins/devops/pagerduty.py b/will/plugins/devops/pagerduty.py index 28a292d8..610d017f 100644 --- a/will/plugins/devops/pagerduty.py +++ b/will/plugins/devops/pagerduty.py @@ -1,5 +1,5 @@ from will.plugin import WillPlugin -from will.decorators import respond_to, require_settings +from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings from will import settings import datetime diff --git a/will/plugins/help/help.py b/will/plugins/help/help.py index e7b497da..f8fa760a 100644 --- a/will/plugins/help/help.py +++ b/will/plugins/help/help.py @@ -1,5 +1,5 @@ from will.plugin import WillPlugin -from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template +from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings class HelpPlugin(WillPlugin): @@ -20,7 +20,7 @@ def help(self, message, plugin=None): for k in sorted(selected_modules, key=lambda x: x[0]): help_data = selected_modules[k] - if help_data and len(help_data) > 0: + if help_data: help_text += "

%s:" % k for line in help_data: if line: diff --git a/will/plugins/productivity/bitly.py b/will/plugins/productivity/bitly.py index 2345e5b8..c6dffdf3 100644 --- a/will/plugins/productivity/bitly.py +++ b/will/plugins/productivity/bitly.py @@ -1,9 +1,6 @@ # coding: utf-8 -from will.utils import show_valid, error, warn, print_head - from will.plugin import WillPlugin -from will.decorators import (respond_to, periodic, hear, randomly, route, - rendered_template, require_settings) +from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings from will import settings diff --git a/will/plugins/productivity/hangout.py b/will/plugins/productivity/hangout.py index c9322411..2e5d0da0 100644 --- a/will/plugins/productivity/hangout.py +++ b/will/plugins/productivity/hangout.py @@ -1,6 +1,5 @@ from will.plugin import WillPlugin -from will.decorators import respond_to, periodic, hear, randomly, route,\ - rendered_template, require_settings +from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings from will import settings diff --git a/will/plugins/productivity/remind.py b/will/plugins/productivity/remind.py index 9598c6af..74b682eb 100644 --- a/will/plugins/productivity/remind.py +++ b/will/plugins/productivity/remind.py @@ -1,6 +1,5 @@ -import datetime from will.plugin import WillPlugin -from will.decorators import respond_to +from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings class RemindPlugin(WillPlugin): @@ -8,7 +7,6 @@ class RemindPlugin(WillPlugin): @respond_to("remind me to (?P.*?) (at|on|in) (?P.*)") def remind_me_at(self, message, reminder_text=None, remind_time=None): """remind me to ___ at ___: Set a reminder for a thing, at a time.""" - now = datetime.datetime.now() parsed_time = self.parse_natural_time(remind_time) natural_datetime = self.to_natural_day_and_time(parsed_time) @@ -17,12 +15,11 @@ def remind_me_at(self, message, reminder_text=None, remind_time=None): "reminder_text": reminder_text, } self.schedule_say(formatted_reminder_text, parsed_time, message=message) - self.say("%(reminder_text)s %(natural_datetime)s. Got it." % locals(), message=message) + self.say("%s %s. Got it." % (reminder_text, natural_datetime), message=message) @respond_to("remind (?P(?!me).*?) to (?P.*?) (at|on|in) (?P.*)") def remind_somebody_at(self, message, reminder_recipient=None, reminder_text=None, remind_time=None): """remind ___ to ___ at ___: Set a reminder for a thing, at a time for somebody else.""" - now = datetime.datetime.now() parsed_time = self.parse_natural_time(remind_time) natural_datetime = self.to_natural_day_and_time(parsed_time) @@ -34,4 +31,4 @@ def remind_somebody_at(self, message, reminder_recipient=None, reminder_text=Non } self.schedule_say(formatted_reminder_text, parsed_time, message=message) - self.say("%(reminder_text)s %(natural_datetime)s. Got it." % locals(), message=message) + self.say("%s %s. Got it." % (reminder_text, natural_datetime), message=message) diff --git a/will/plugins/productivity/world_time.py b/will/plugins/productivity/world_time.py index 429258b6..bce46b8b 100644 --- a/will/plugins/productivity/world_time.py +++ b/will/plugins/productivity/world_time.py @@ -1,52 +1,67 @@ import datetime +import logging +import pytz import requests +import time + from will.plugin import WillPlugin from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings from will import settings +logger = logging.getLogger(__name__) + + +def get_location(place): + try: + payload = {'address': place, 'sensor': False} + r = requests.get('http://maps.googleapis.com/maps/api/geocode/json', params=payload) + resp = r.json() + if resp["status"] != "OK": + return None + else: + location = resp["results"][0]["geometry"]["location"] + return location + except Exception as e: + logger.error("Failed to fetch geocode for %(place)s. Error %(error)s" % {'place': place, 'error': e}) + return None + + +def get_timezone(lat, lng): + try: + payload = {'location': "%(latitude)s,%(longitude)s" % {'latitude': lat, + 'longitude': lng}, + 'timestamp': int(time.time()), + 'sensor': False} + r = requests.get('https://maps.googleapis.com/maps/api/timezone/json', params=payload) + resp = r.json() + if resp["status"] == "OK": + tz = resp['timeZoneId'] + return tz + else: + return None + except Exception as e: + logger.error("Failed to fetch timezone for %(lat)s,%(lng)s. Error %(error)s" % {'lat': lat, + 'lng': lng, + 'error': e}) + return None + class TimePlugin(WillPlugin): @respond_to("what time is it in (?P.*)") def what_time_is_it_in(self, message, place): """what time is it in ___: Say the time in almost any city on earth.""" - if ( - not hasattr(settings, "WORLD_WEATHER_ONLINE_KEY") and - not hasattr(settings, "WORLD_WEATHER_ONLINE_V2_KEY") - ): - self.say( - "I need a world weather online key to do that.\n" - "You can get one at http://developer.worldweatheronline.com, " - "and then set the key as WORLD_WEATHER_ONLINE_V2_KEY", - message=message - ) - else: - if hasattr(settings, "WORLD_WEATHER_ONLINE_V2_KEY"): - r = requests.get( - "http://api2.worldweatheronline.com/free/v2/tz.ashx?q=%s&format=json&key=%s" % - (place, settings.WORLD_WEATHER_ONLINE_V2_KEY) - ) - elif hasattr(settings, "WORLD_WEATHER_ONLINE_KEY"): - r = requests.get( - "http://api2.worldweatheronline.com/free/v1/tz.ashx?q=%s&format=json&key=%s" % - (place, settings.WORLD_WEATHER_ONLINE_KEY) - ) - resp = r.json() - if r.status_code is not 200: - if "data" in resp and "error" in resp["data"]: - self.say("Looks like my Weather Online key isn't working. I got '%s' when I tried to search." % resp["data"]["error"][0]["msg"]) - else: - self.say("Sorry, the website I use to find that out looks like it's down.") - self.say("Maybe update WORLD_WEATHER_ONLINE_V2_KEY?.") - + location = get_location(place) + if location is not None: + tz = get_timezone(location['lat'], location['lng']) + if tz is not None: + ct = datetime.datetime.now(tz=pytz.timezone(tz)) + self.say("It's %(time)s in %(place)s." % {'time': self.to_natural_day_and_time(ct), + 'place': place}, message=message) else: - if "request" in resp["data"] and len(resp["data"]["request"]) > 0: - place = resp["data"]["request"][0]["query"] - current_time = self.parse_natural_time(resp["data"]["time_zone"][0]["localtime"]) - - self.say("It's %s in %s." % (self.to_natural_day_and_time(current_time), place), message=message) - else: - self.say("I couldn't find anywhere named %s." % (place, ), message=message) + self.say("I couldn't find timezone for %(place)s." % {'place': place}, message=message) + else: + self.say("I couldn't find anywhere named %(place)s." % {'place': place}, message=message) @respond_to("what time is it(\?)?$", multiline=False) def what_time_is_it(self, message): diff --git a/will/scheduler.py b/will/scheduler.py index b7d37dea..9df9b3e4 100644 --- a/will/scheduler.py +++ b/will/scheduler.py @@ -5,7 +5,7 @@ import traceback import threading -from mixins import ScheduleMixin, PluginModulesLibraryMixin +from will.mixins import ScheduleMixin, PluginModulesLibraryMixin class Scheduler(ScheduleMixin, PluginModulesLibraryMixin): @@ -55,14 +55,14 @@ def _run_applicable_actions_in_list(self, now, periodic_list=False): # Iterate through times_list first, before loading the full schedule_list into memory (big pickled stuff, etc) a_task_needs_run = False - for task_hash, task_time in times_list.items(): + for task_time in times_list.values(): if task_time < now: a_task_needs_run = True break if a_task_needs_run: sched_list = self.bot.get_schedule_list(periodic_list=periodic_list) - for item_hash, item in sched_list.items(): + for item in sched_list.values(): running_task = False try: @@ -72,7 +72,9 @@ def _run_applicable_actions_in_list(self, now, periodic_list=False): except: logging.critical( "Error running task %s. \n\n%s\n" - "Trying to delete it and recover...\n" % (item, traceback.format_exc()) + "Trying to delete it and recover...\n", + item, + traceback.format_exc() ) if running_task: @@ -81,7 +83,9 @@ def _run_applicable_actions_in_list(self, now, periodic_list=False): except: logging.critical( "Unable to remove task. Leaving it in, you'll have to clean it out by hand." - "Sorry! \n\n%s\nContinuing...\n" % (traceback.format_exc(),)) + "Sorry! \n\n%s\nContinuing...\n", + traceback.format_exc() + ) def check_scheduled_actions(self): now = datetime.datetime.now() @@ -112,7 +116,7 @@ def check_scheduled_actions(self): self._run_applicable_actions_in_list(now, periodic_list=True) self.bot.save("scheduler_lock", False) except: - logging.critical("Scheduler run blew up.\n\n%s\nContinuing...\n" % (traceback.format_exc(), )) + logging.critical("Scheduler run blew up.\n\n%s\nContinuing...\n", traceback.format_exc()) def run_action(self, task): if task["type"] == "room_message": diff --git a/will/scripts/generate_will_project.py b/will/scripts/generate_will_project.py index 2343b49c..7db5523d 100644 --- a/will/scripts/generate_will_project.py +++ b/will/scripts/generate_will_project.py @@ -34,23 +34,23 @@ def main(): puts("Welcome to the will project generator.") puts("") - print "\nGenerating will scaffold..." + print("\nGenerating will scaffold...") current_dir = os.getcwd() plugins_dir = os.path.join(current_dir, "plugins") templates_dir = os.path.join(current_dir, "templates") - print " /plugins" + print(" /plugins") # Set up the directories if not os.path.exists(plugins_dir): os.makedirs(plugins_dir) - print " __init__.py" + print(" __init__.py") # Create the plugins __init__.py with open(os.path.join(plugins_dir, "__init__.py"), 'w+') as f: pass - print " morning.py" + print(" morning.py") # Create the morning plugin morning_file_path = os.path.join(plugins_dir, "morning.py") if not os.path.exists(morning_file_path): @@ -66,16 +66,16 @@ def good_morning(self, message): self.reply(message, "oh, g'morning!") """) - print " /templates" + print(" /templates") if not os.path.exists(templates_dir): os.makedirs(templates_dir) - print " blank.html" + print(" blank.html") # Create the plugins __init__.py with open(os.path.join(templates_dir, "blank.html"), 'w+') as f: pass - print " .gitignore" + print(" .gitignore") # Create .gitignore, or at least add shelf.db gitignore_path = os.path.join(current_dir, ".gitignore") if not os.path.exists(gitignore_path): @@ -94,7 +94,7 @@ def good_morning(self, message): f.write("\nshelf.db\n") # Create run_will.py - print " run_will.py" + print(" run_will.py") run_will_path = os.path.join(current_dir, "run_will.py") if not os.path.exists(run_will_path): with open(run_will_path, 'w+') as f: @@ -110,7 +110,7 @@ def good_morning(self, message): os.chmod("run_will.py", st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) # Create config.py - print " config.py" + print(" config.py") config_path = os.path.join(current_dir, "config.py") if not os.path.exists(config_path): with open(config_path, 'w+') as f: @@ -253,21 +253,21 @@ def good_morning(self, message): """) - print " requirements.txt" + print(" requirements.txt") # Create requirements.txt requirements_path = os.path.join(current_dir, "requirements.txt") if not os.path.exists(requirements_path): with open(requirements_path, 'w+') as f: f.write("will") - print " Procfile" + print(" Procfile") # Create Procfile requirements_path = os.path.join(current_dir, "Procfile") if not os.path.exists(requirements_path): with open(requirements_path, 'w+') as f: f.write("web: python run_will.py") - print " README.md" + print(" README.md") # Create the readme readme_path = os.path.join(current_dir, "README.md") if not os.path.exists(readme_path): @@ -276,7 +276,7 @@ def good_morning(self, message): This is our bot, a [will](https://github.com/skoczen/will) bot. """) - print "\nDone." + print("\nDone.") if __name__ == '__main__': diff --git a/will/settings.py b/will/settings.py index d7e1d414..7911b87d 100644 --- a/will/settings.py +++ b/will/settings.py @@ -1,7 +1,7 @@ import os -from utils import show_valid, warn, note, error +from will.utils import show_valid, warn, note, error from clint.textui import puts, indent -from urlparse import urlparse +from six.moves.urllib import parse def import_settings(quiet=True): @@ -208,7 +208,7 @@ def import_settings(quiet=True): settings["ADMINS"] = [a.strip().lower() for a in settings.get('ADMINS', '').split(';') if a.strip()] if "PROXY_URL" in settings: - parsed_proxy_url = urlparse(settings["PROXY_URL"]) + parsed_proxy_url = parse(settings["PROXY_URL"]) settings["USE_PROXY"] = True settings["PROXY_HOSTNAME"] = parsed_proxy_url.hostname settings["PROXY_USERNAME"] = parsed_proxy_url.username diff --git a/will/utils.py b/will/utils.py index 641fa1dc..a38d966d 100644 --- a/will/utils.py +++ b/will/utils.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- -from clint.textui import puts, indent -from clint.textui import colored -from HTMLParser import HTMLParser +from clint.textui import puts, colored +from six.moves import html_parser UNSURE_REPLIES = [ @@ -51,7 +50,7 @@ def clean_for_pickling(d): # Via http://stackoverflow.com/a/925630 -class HTMLStripper(HTMLParser): +class HTMLStripper(html_parser.HTMLParser): def __init__(self): self.reset() self.fed = [] @@ -73,7 +72,7 @@ def html_to_text(html): def is_admin(nick): - from . import settings + from will import settings return settings.ADMINS == '*' or nick.lower() in settings.ADMINS From 576073c9beca914468e83e8ecff55ea9bac989c2 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 10 Oct 2017 12:09:04 +1300 Subject: [PATCH 009/200] Cleanup from style choices I didn't quite agree with, prints in 2.x, and spelling errors. --- docs/deploy.md | 2 +- fabfile.py | 4 ++-- will/backends/analysis/history.py | 4 ++-- will/backends/io_adapters/base.py | 8 ++++---- will/backends/io_adapters/hipchat.py | 20 ++++++++++---------- will/backends/io_adapters/shell.py | 2 +- will/backends/io_adapters/slack.py | 6 +++--- will/backends/pubsub/base.py | 4 +--- will/backends/pubsub/redis_pubsub.py | 4 ++-- will/backends/storage/file_backend.py | 4 ++-- will/main.py | 6 +++--- will/plugin.py | 5 ++--- will/plugins/productivity/remind.py | 4 ++-- will/scheduler.py | 9 +++------ 14 files changed, 38 insertions(+), 44 deletions(-) diff --git a/docs/deploy.md b/docs/deploy.md index b274c913..ce5de68c 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -91,7 +91,7 @@ WILL_V2_TOKEN Note, we've pre-defined the redis url and the HTTP Server port; if you update these values, make sure you update the docker-compose file accordingly. ### Step 2: Deploy your plugins and templates -If you have any custom templates, create directories for your plugins and templates, and load your plugins and templates they'll be mounted when the container starts up giving your contanerized bot access to your templates. +If you have any custom templates, create directories for your plugins and templates, and load your plugins and templates they'll be mounted when the container starts up giving your containerized bot access to your templates. ```bash mkdir ./plugins ./templates ``` diff --git a/fabfile.py b/fabfile.py index 35d01c18..339d1ec9 100644 --- a/fabfile.py +++ b/fabfile.py @@ -56,11 +56,11 @@ def deploy_docs(): for root, dirs, files in os.walk(root_dir, topdown=False): for name in files: if name not in WHITELIST_FILES and not any([r in WHITELIST_DIRS for r in _splitpath(root)]): - # print "removing %s" % (os.path.join(root, name)) + # print("removing %s" % (os.path.join(root, name))) os.remove(os.path.join(root, name)) for name in dirs: if name not in WHITELIST_DIRS and not any([r in WHITELIST_DIRS for r in _splitpath(root)]): - print "removing %s" % (os.path.join(root, name)) + print("removing %s" % (os.path.join(root, name))) try: os.rmdir(os.path.join(root, name)) except: diff --git a/will/backends/analysis/history.py b/will/backends/analysis/history.py index 2ddd0a9b..05050cf4 100644 --- a/will/backends/analysis/history.py +++ b/will/backends/analysis/history.py @@ -10,8 +10,8 @@ class HistoryAnalysis(AnalysisBackend, StorageMixin): def do_analyze(self, message): # Load the last few messages, add it to the context under "history" - # print "history analysize" - # print message + # print("history analyze") + # print(message) history = self.load("message_history", []) max_history_context = getattr(settings, "HISTORY_CONTEXT_LENGTH", 20) diff --git a/will/backends/io_adapters/base.py b/will/backends/io_adapters/base.py index 2b02cbc9..bb4b8068 100644 --- a/will/backends/io_adapters/base.py +++ b/will/backends/io_adapters/base.py @@ -41,8 +41,8 @@ def normalize_incoming_event(self, event): def handle_incoming_event(self, event): m = self.normalize_incoming_event(event) if m: - # print "\n\n\n\nhandle_incoming_event" - # print m + # print("\n\n\n\nhandle_incoming_event") + # print(m) self.pubsub.publish("message.incoming", m, reference_message=m) def handle_outgoing_event(self, event): @@ -52,8 +52,8 @@ def terminate(self): pass def __publish_incoming_message(self, message): - # print "__publish_incoming_message" - # print message + # print("__publish_incoming_message") + # print(message) return self.pubsub.publish("message.incoming", message, reference_message=message) def __start_event_listeners(self): diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index 56f68b5f..d8563376 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -202,17 +202,17 @@ def _send_to_backend(self, msg): pass for k in msg.xml.keys(): try: - # print k - # print msg.xml.get(k) + # print(k) + # print(msg.xml.get(k)) pickle.dumps(msg.xml.get(k)) stripped_msg[k] = msg.xml.get(k) except: - # print "failed to parse %s" % k + # print("failed to parse %s" % k) pass stripped_msg.xmpp_jid = msg.getMucroom() stripped_msg.body = msg["body"] - # print "putting in bridge queue" + # print("putting in bridge queue") self.xmpp_bridge_queue.put(stripped_msg) @@ -370,7 +370,7 @@ def channels(self): "max_results": 1000} r = requests.get(url, **settings.REQUESTS_OPTIONS) for room in r.json()['items']: - # print room + # print(room) all_rooms["%s" % (room['xmpp_jid'],)] = Channel( id=room["id"], name=room["name"], @@ -395,7 +395,7 @@ def channels(self): return self._channels def normalize_incoming_event(self, event): - # print "hipchat: normalize_incoming_event - %s" % event + # print("hipchat: normalize_incoming_event - %s" % event) if event["type"] in ("chat", "normal", "groupchat") and "from_jid" in event: # Sample of group message @@ -446,13 +446,13 @@ def normalize_incoming_event(self, event): backend_supports_acl=True, source=clean_for_pickling(event), ) - # print "normalized:" - # print m.__dict__ + # print("normalized:") + # print(m.__dict__) return m else: - # print "Unknown event type" - # print event + # print("Unknown event type") + # print(event) return None def handle_outgoing_event(self, event): diff --git a/will/backends/io_adapters/shell.py b/will/backends/io_adapters/shell.py index 30058c71..aaeb384b 100644 --- a/will/backends/io_adapters/shell.py +++ b/will/backends/io_adapters/shell.py @@ -67,7 +67,7 @@ def handle_outgoing_event(self, event): elif event.type == "message.no_response": # TODO: Seriously fix this. It's gross and confusing. - # print event.data["source"].data.content + # print(event.data["source"].data.content) if event.data and "source" in event.data and len(event.data["source"].data.content) > 0: self.send_direct_message(random.choice(UNSURE_REPLIES)) diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index dc2a3296..cacc9342 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -44,7 +44,7 @@ def normalize_incoming_event(self, event): event["type"] == "message" and ("subtype" not in event or event["subtype"] != "message_changed") ): - # print "slack: normalize_incoming_event - %s" % event + # print("slack: normalize_incoming_event - %s" % event) # Sample of group message # {u'source_team': u'T5ACF70KV', u'text': u'test', # u'ts': u'1495661121.838366', u'user': u'U5ACF70RH', @@ -195,7 +195,7 @@ def send_message(self, event): ) resp_json = r.json() if not resp_json["ok"]: - # print resp_json + # print(resp_json) assert resp_json["ok"] def _map_color(self, color): @@ -267,7 +267,7 @@ def _watch_slack_rtm(self): events = self.client.rtm_read() if len(events) > 0: # TODO: only handle events that are new. - # print len(events) + # print(len(events)) for e in events: self.handle_incoming_event(e) diff --git a/will/backends/pubsub/base.py b/will/backends/pubsub/base.py index a9fe71fd..7f23ee95 100644 --- a/will/backends/pubsub/base.py +++ b/will/backends/pubsub/base.py @@ -105,8 +105,6 @@ def publish(self, topic, obj, reference_message=None): and conforming to the protocol. Handles pickling for the wire, etc. This method should *not* be subclassed. """ - # print "-> publishing to %s" % topic - # print obj logging.debug("Publishing topic (%s): \n%s" % (topic, obj)) e = Event( data=obj, @@ -165,7 +163,7 @@ def get_message(self): # if len(self.recent_hashes) > 100: # self.recent_hashes = self.recent_hashes[1:] return loaded_message - # print loaded_message + # print(loaded_message) # loaded_message = pickle.loads( # dec # ) diff --git a/will/backends/pubsub/redis_pubsub.py b/will/backends/pubsub/redis_pubsub.py index d76579b4..ffa90802 100644 --- a/will/backends/pubsub/redis_pubsub.py +++ b/will/backends/pubsub/redis_pubsub.py @@ -49,11 +49,11 @@ def __init__(self, settings, *args, **kwargs): self._pubsub = self.redis.pubsub() def publish_to_backend(self, topic, body_str): - # print "publishing %s" % (topic,) + # print("publishing %s" % (topic,)) return self.redis.publish(topic, body_str) def do_subscribe(self, topic): - # print "subscribed to %s" % topic + # print("subscribed to %s" % topic) return self._pubsub.psubscribe(topic) def unsubscribe(self, topic): diff --git a/will/backends/storage/file_backend.py b/will/backends/storage/file_backend.py index 1f39ce54..14f6c195 100644 --- a/will/backends/storage/file_backend.py +++ b/will/backends/storage/file_backend.py @@ -46,12 +46,12 @@ def __init__(self, settings): if not os.path.exists(self.dirname): # the directory doesn't exist, try to create it - os.makedirs(self.dirname, mode=0x700) + os.makedirs(self.dirname, mode=0o700) elif not os.path.exists(self.dotfile): # the directory exists, but doesn't have our dot file in it # if it has any other files in it then we bail out since we want to # have full control over wiping out the contents of the directory - if self._all_setting_files(): + if len(self._all_setting_files()) > 0: raise FileStorageException("%s is not empty, " "will needs an empty directory for " "settings" % (self.dirname,)) diff --git a/will/main.py b/will/main.py index 73afed70..d1cd3ec1 100644 --- a/will/main.py +++ b/will/main.py @@ -199,7 +199,7 @@ def bootstrap(self): except (KeyboardInterrupt, SystemExit): self.handle_sys_exit() - def verify_individual_setting(self, test_setting): + def verify_individual_setting(self, test_setting, quiet=False): if not test_setting.get("only_if", True): return True @@ -521,7 +521,7 @@ def handle_sys_exit(self, *args, **kwargs): except KeyboardInterrupt: pass except: - print "\n\n\nException while exiting!!" + print("\n\n\nException while exiting!!") import traceback traceback.print_exc() sys.exit(1) @@ -541,7 +541,7 @@ def handle_sys_exit(self, *args, **kwargs): sys.stdout.write(".") sys.stdout.flush() time.sleep(0.5) - print ". done.\n" + print(". done.\n") sys.exit(1) @yappi.profile(return_callback=yappi_aggregate) diff --git a/will/plugin.py b/will/plugin.py index bd8ae3dc..4b32a544 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -38,7 +38,7 @@ def _rooms_from_message_and_room(self, message, room): rooms = [self.get_room_from_name_or_id(settings.HIPCHAT_DEFAULT_ROOM), ] return rooms - def _prepared_content(self, content): + def _prepared_content(self, content, message, kwargs): content = re.sub(r'>\s+<', '><', content) return content @@ -143,7 +143,6 @@ def reply(self, event, content, **kwargs): # sender = message.sender # self.send_direct_message(sender["hipchat_id"], content, **kwargs) - def set_topic(self, topic, message=None, room=None): if message is None or message["type"] == "groupchat": @@ -158,7 +157,7 @@ def set_topic(self, topic, message=None, room=None): def schedule_say(self, content, when, message=None, room=None, *args, **kwargs): - content = self._prepared_content(content) + content = self._prepared_content(content, message, kwargs) if message is None or message["type"] == "groupchat": rooms = self._rooms_from_message_and_room(message, room) for r in rooms: diff --git a/will/plugins/productivity/remind.py b/will/plugins/productivity/remind.py index 74b682eb..2a148467 100644 --- a/will/plugins/productivity/remind.py +++ b/will/plugins/productivity/remind.py @@ -15,7 +15,7 @@ def remind_me_at(self, message, reminder_text=None, remind_time=None): "reminder_text": reminder_text, } self.schedule_say(formatted_reminder_text, parsed_time, message=message) - self.say("%s %s. Got it." % (reminder_text, natural_datetime), message=message) + self.say("%(reminder_text)s %(natural_datetime)s. Got it." % locals(), message=message) @respond_to("remind (?P(?!me).*?) to (?P.*?) (at|on|in) (?P.*)") def remind_somebody_at(self, message, reminder_recipient=None, reminder_text=None, remind_time=None): @@ -31,4 +31,4 @@ def remind_somebody_at(self, message, reminder_recipient=None, reminder_text=Non } self.schedule_say(formatted_reminder_text, parsed_time, message=message) - self.say("%s %s. Got it." % (reminder_text, natural_datetime), message=message) + self.say("%(reminder_text)s %(natural_datetime)s. Got it." % locals(), message=message) diff --git a/will/scheduler.py b/will/scheduler.py index 9df9b3e4..c18ab5f2 100644 --- a/will/scheduler.py +++ b/will/scheduler.py @@ -72,9 +72,7 @@ def _run_applicable_actions_in_list(self, now, periodic_list=False): except: logging.critical( "Error running task %s. \n\n%s\n" - "Trying to delete it and recover...\n", - item, - traceback.format_exc() + "Trying to delete it and recover...\n" % (item, traceback.format_exc()) ) if running_task: @@ -83,8 +81,7 @@ def _run_applicable_actions_in_list(self, now, periodic_list=False): except: logging.critical( "Unable to remove task. Leaving it in, you'll have to clean it out by hand." - "Sorry! \n\n%s\nContinuing...\n", - traceback.format_exc() + "Sorry! \n\n%s\nContinuing...\n" % (traceback.format_exc(),)) ) def check_scheduled_actions(self): @@ -116,7 +113,7 @@ def check_scheduled_actions(self): self._run_applicable_actions_in_list(now, periodic_list=True) self.bot.save("scheduler_lock", False) except: - logging.critical("Scheduler run blew up.\n\n%s\nContinuing...\n", traceback.format_exc()) + logging.critical("Scheduler run blew up.\n\n%s\nContinuing...\n" % (traceback.format_exc(), )) def run_action(self, task): if task["type"] == "room_message": From 52fb8647e65ce53f8ebe5f5c881728fc5da1cdb9 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 10 Oct 2017 12:11:23 +1300 Subject: [PATCH 010/200] Uses built-in html_to_text --- will/backends/io_adapters/shell.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/will/backends/io_adapters/shell.py b/will/backends/io_adapters/shell.py index aaeb384b..4fc99de3 100644 --- a/will/backends/io_adapters/shell.py +++ b/will/backends/io_adapters/shell.py @@ -8,10 +8,9 @@ import readline import traceback import warnings -from bs4 import BeautifulSoup from will import settings -from will.utils import Bunch, UNSURE_REPLIES +from will.utils import Bunch, UNSURE_REPLIES, html_to_text from will.abstractions import Message, Person, Channel from .base import StdInOutIOBackend @@ -28,14 +27,12 @@ class ShellBackend(StdInOutIOBackend): name="Friend", ) - def _strip_html_tags(self, message_body): - return BeautifulSoup(message_body, 'html.parser').get_text() def send_direct_message(self, message_body, **kwargs): - print("Will: %s" % self._strip_html_tags(message_body)) + print("Will: %s" % html_to_text(message_body)) def send_room_message(self, room_id, message_body, html=False, color="green", notify=False, **kwargs): - print("Will: %s" % self._strip_html_tags(message_body)) + print("Will: %s" % html_to_text(message_body)) def set_room_topic(self, room_id, topic): print("Will: Setting the Topic to %s" & topic) From bc2901d41b8677c886e36a3b4c2cb7f4b10b444f Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 10 Oct 2017 12:20:39 +1300 Subject: [PATCH 011/200] Fixes up tests. --- requirements.txt | 2 +- start_profiled_will.py | 1 + will/backends/execution/__init__.py | 2 +- will/backends/generation/fuzzy_all_matches.py | 26 ++++++++++++++----- will/backends/generation/fuzzy_best_match.py | 20 +++++++++++--- will/backends/io_adapters/rocketchat.py | 4 +-- will/backends/io_adapters/shell.py | 1 - will/backends/pubsub/redis_pubsub.py | 6 ++--- will/backends/storage/couchbase_backend.py | 6 ++--- will/backends/storage/redis_backend.py | 4 +-- will/mixins/pubsub.py | 1 - will/mixins/settings.py | 5 +++- will/scheduler.py | 2 +- will/settings.py | 2 +- 14 files changed, 54 insertions(+), 28 deletions(-) diff --git a/requirements.txt b/requirements.txt index e8e9c066..2af97c1b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ hiredis==0.2.0 -redis==2.10.3 +redis==2.10.6 -r requirements.base.txt -r requirements.slack.txt diff --git a/start_profiled_will.py b/start_profiled_will.py index 87656c3d..11421be3 100755 --- a/start_profiled_will.py +++ b/start_profiled_will.py @@ -11,5 +11,6 @@ def start_will(): bot = WillBot() bot.bootstrap() + if __name__ == '__main__': start_will() diff --git a/will/backends/execution/__init__.py b/will/backends/execution/__init__.py index cb1d5fde..99b2457c 100644 --- a/will/backends/execution/__init__.py +++ b/will/backends/execution/__init__.py @@ -1,2 +1,2 @@ from .all import AllBackend -from .best import BestBackend +from .best_score import BestScoreBackend diff --git a/will/backends/generation/fuzzy_all_matches.py b/will/backends/generation/fuzzy_all_matches.py index b932bb7e..5532a0a7 100644 --- a/will/backends/generation/fuzzy_all_matches.py +++ b/will/backends/generation/fuzzy_all_matches.py @@ -22,7 +22,8 @@ def _generate_compiled_regex(self, method_meta): regex_string = "(?i)%s" % regex_string help_regex = method_meta["regex_pattern"] if method_meta["direct_mentions_only"]: - help_regex = "@%s %s" % (settings.HIPCHAT_HANDLE, help_regex) + help_regex = "@%s %s" % ( + settings.HIPCHAT_HANDLE, help_regex) # self.all_listener_regexes.append(help_regex) # if method_meta["__doc__"]: # pht = plugin_info.get("parent_help_text", None) @@ -36,14 +37,26 @@ def _generate_compiled_regex(self, method_meta): if method_meta["multiline"]: try: - self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % (regex_string, settings.FUZZY_REGEX_ALLOWABLE_ERRORS), regex.MULTILINE | regex.DOTALL | regex.ENHANCEMATCH) + self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % ( + regex_string, + settings.FUZZY_REGEX_ALLOWABLE_ERRORS + ), regex.MULTILINE | regex.DOTALL | regex.ENHANCEMATCH) except: - self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % (regex.escape(regex_string), settings.FUZZY_REGEX_ALLOWABLE_ERRORS), regex.MULTILINE | regex.DOTALL | regex.ENHANCEMATCH) + self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % ( + regex.escape(regex_string), + settings.FUZZY_REGEX_ALLOWABLE_ERRORS + ), regex.MULTILINE | regex.DOTALL | regex.ENHANCEMATCH) else: try: - self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % (regex_string, settings.FUZZY_REGEX_ALLOWABLE_ERRORS), regex.ENHANCEMATCH) + self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % ( + regex_string, + settings.FUZZY_REGEX_ALLOWABLE_ERRORS + ), regex.ENHANCEMATCH) except: - self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % (regex.escape(regex_string), settings.FUZZY_REGEX_ALLOWABLE_ERRORS), regex.ENHANCEMATCH) + self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % ( + regex.escape(regex_string), + settings.FUZZY_REGEX_ALLOWABLE_ERRORS + ), regex.ENHANCEMATCH) return self.cached_regex[method_path] @@ -69,7 +82,8 @@ def do_generate(self, event): logging.info(search_matches) for match_str, confidence in search_matches: l = self.match_methods[match_str] - logging.info(" Match (%s) - %s" % (confidence, match_str)) + logging.info(" Match (%s) - %s" % ( + confidence, match_str)) regex_matches = l["regex"].search(message.content) if ( # The search regex matches and diff --git a/will/backends/generation/fuzzy_best_match.py b/will/backends/generation/fuzzy_best_match.py index 1e76874d..ff35b3fa 100644 --- a/will/backends/generation/fuzzy_best_match.py +++ b/will/backends/generation/fuzzy_best_match.py @@ -35,14 +35,26 @@ def _generate_compiled_regex(self, method_meta): if method_meta["multiline"]: try: - self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % (regex_string, settings.FUZZY_REGEX_ALLOWABLE_ERRORS), regex.MULTILINE | regex.DOTALL | regex.ENHANCEMATCH) + self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % ( + regex_string, + settings.FUZZY_REGEX_ALLOWABLE_ERRORS + ), regex.MULTILINE | regex.DOTALL | regex.ENHANCEMATCH) except: - self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % (regex.escape(regex_string), settings.FUZZY_REGEX_ALLOWABLE_ERRORS), regex.MULTILINE | regex.DOTALL | regex.ENHANCEMATCH) + self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % ( + regex.escape(regex_string), + settings.FUZZY_REGEX_ALLOWABLE_ERRORS + ), regex.MULTILINE | regex.DOTALL | regex.ENHANCEMATCH) else: try: - self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % (regex_string, settings.FUZZY_REGEX_ALLOWABLE_ERRORS), regex.ENHANCEMATCH) + self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % ( + regex_string, + settings.FUZZY_REGEX_ALLOWABLE_ERRORS + ), regex.ENHANCEMATCH) except: - self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % (regex.escape(regex_string), settings.FUZZY_REGEX_ALLOWABLE_ERRORS), regex.ENHANCEMATCH) + self.cached_regex[method_path] = regex.compile("%s{e<=%s}" % ( + regex.escape(regex_string), + settings.FUZZY_REGEX_ALLOWABLE_ERRORS + ), regex.ENHANCEMATCH) return self.cached_regex[method_path] diff --git a/will/backends/io_adapters/rocketchat.py b/will/backends/io_adapters/rocketchat.py index cff1982a..e236a6fa 100644 --- a/will/backends/io_adapters/rocketchat.py +++ b/will/backends/io_adapters/rocketchat.py @@ -12,7 +12,7 @@ from DDPClient import DDPClient from multiprocessing import Manager from multiprocessing.dummy import Process -from urlparse import urlparse +from six.moves.urllib import parse from will import settings from will.utils import Bunch, UNSURE_REPLIES, clean_for_pickling @@ -371,7 +371,7 @@ def _rest_post_message(self, data): def _realtime_connect(self): # TODO: Consider using auto_reconnect and debug options. - up = urlparse(settings.ROCKETCHAT_URL) + up = parse.urlparse(settings.ROCKETCHAT_URL) if up.scheme == 'http': ws_proto = 'ws' else: diff --git a/will/backends/io_adapters/shell.py b/will/backends/io_adapters/shell.py index 4fc99de3..529e0e28 100644 --- a/will/backends/io_adapters/shell.py +++ b/will/backends/io_adapters/shell.py @@ -27,7 +27,6 @@ class ShellBackend(StdInOutIOBackend): name="Friend", ) - def send_direct_message(self, message_body, **kwargs): print("Will: %s" % html_to_text(message_body)) diff --git a/will/backends/pubsub/redis_pubsub.py b/will/backends/pubsub/redis_pubsub.py index ffa90802..20331d4c 100644 --- a/will/backends/pubsub/redis_pubsub.py +++ b/will/backends/pubsub/redis_pubsub.py @@ -1,5 +1,5 @@ import redis -import urlparse +from six.moves.urllib import parse from .base import BasePubSub SKIP_TYPES = ["psubscribe", "punsubscribe", ] @@ -29,12 +29,10 @@ class RedisPubSub(BasePubSub): }, ] - - def __init__(self, settings, *args, **kwargs): self.verify_settings(quiet=True) super(RedisPubSub, self).__init__(*args, **kwargs) - url = urlparse.urlparse(settings.REDIS_URL) + url = parse.urlparse(settings.REDIS_URL) if hasattr(url, "path"): db = url.path[1:] diff --git a/will/backends/storage/couchbase_backend.py b/will/backends/storage/couchbase_backend.py index 429661a1..60e1f03a 100644 --- a/will/backends/storage/couchbase_backend.py +++ b/will/backends/storage/couchbase_backend.py @@ -8,7 +8,7 @@ class CouchbaseStorage(BaseStorageBackend): """ A storage backend using Couchbase - You must supply a COUCHBASE_URL setting that is passed through parse. + You must supply a COUCHBASE_URL setting that is passed through urlparse. All parameters supplied get passed through to Couchbase Examples: @@ -22,7 +22,7 @@ class CouchbaseStorage(BaseStorageBackend): required_settings = [ { "name": "COUCHBASE_URL", - "obtain_at": """You must supply a COUCHBASE_URL setting that is passed through parse. + "obtain_at": """You must supply a COUCHBASE_URL setting that is passed through urlparse. All parameters supplied get passed through to Couchbase Examples: @@ -36,7 +36,7 @@ class CouchbaseStorage(BaseStorageBackend): def __init__(self, settings): self.verify_settings(quiet=True) - url = parse(settings.COUCHBASE_URL) + url = parse.urlparse(settings.COUCHBASE_URL) params = dict([ param.split('=') for param in url.query.split('&') diff --git a/will/backends/storage/redis_backend.py b/will/backends/storage/redis_backend.py index 361749af..7ce5723b 100644 --- a/will/backends/storage/redis_backend.py +++ b/will/backends/storage/redis_backend.py @@ -19,7 +19,7 @@ class RedisStorage(BaseStorageBackend): """ A storage backend using Redis. - You must supply a REDIS_URL setting that is passed through parse. + You must supply a REDIS_URL setting that is passed through urlparse. Examples: @@ -28,7 +28,7 @@ class RedisStorage(BaseStorageBackend): """ def __init__(self, settings): self.verify_settings(quiet=True) - url = parse(settings.REDIS_URL) + url = parse.urlparse(settings.REDIS_URL) if hasattr(url, "path"): db = url.path[1:] diff --git a/will/mixins/pubsub.py b/will/mixins/pubsub.py index 9b5f7f42..d40a1abd 100644 --- a/will/mixins/pubsub.py +++ b/will/mixins/pubsub.py @@ -26,7 +26,6 @@ def bootstrap_pubsub(self): # from within the import self.pubsub = pubsub_module.bootstrap(settings) - def subscribe(self, topic): self.bootstrap_pubsub() try: diff --git a/will/mixins/settings.py b/will/mixins/settings.py index b80ba452..d98457e8 100644 --- a/will/mixins/settings.py +++ b/will/mixins/settings.py @@ -37,5 +37,8 @@ def verify_settings(self, quiet=False): with indent(2): show_valid(s["name"]) if not passed: - raise EnvironmentError("Missing required settings when starting up %s. Please fix the error above and restart Will!" % (meta["friendly_name"], )) + raise EnvironmentError( + "Missing required settings when starting up %s." + "Please fix the error above and restart Will!" % (meta["friendly_name"], ) + ) return passed diff --git a/will/scheduler.py b/will/scheduler.py index c18ab5f2..8920b974 100644 --- a/will/scheduler.py +++ b/will/scheduler.py @@ -81,7 +81,7 @@ def _run_applicable_actions_in_list(self, now, periodic_list=False): except: logging.critical( "Unable to remove task. Leaving it in, you'll have to clean it out by hand." - "Sorry! \n\n%s\nContinuing...\n" % (traceback.format_exc(),)) + "Sorry! \n\n%s\nContinuing...\n" % (traceback.format_exc(),) ) def check_scheduled_actions(self): diff --git a/will/settings.py b/will/settings.py index 7911b87d..d81106af 100644 --- a/will/settings.py +++ b/will/settings.py @@ -208,7 +208,7 @@ def import_settings(quiet=True): settings["ADMINS"] = [a.strip().lower() for a in settings.get('ADMINS', '').split(';') if a.strip()] if "PROXY_URL" in settings: - parsed_proxy_url = parse(settings["PROXY_URL"]) + parsed_proxy_url = parse.urlparse(settings["PROXY_URL"]) settings["USE_PROXY"] = True settings["PROXY_HOSTNAME"] = parsed_proxy_url.hostname settings["PROXY_USERNAME"] = parsed_proxy_url.username From 7d173fca3fd3545eca335e1a107d56dd26ef8a9e Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 10 Oct 2017 12:33:59 +1300 Subject: [PATCH 012/200] Friendlier location output --- will/plugins/productivity/world_time.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/will/plugins/productivity/world_time.py b/will/plugins/productivity/world_time.py index bce46b8b..a1b09850 100644 --- a/will/plugins/productivity/world_time.py +++ b/will/plugins/productivity/world_time.py @@ -11,6 +11,13 @@ logger = logging.getLogger(__name__) +class GoogleLocation(object): + def __init__(self, google_results, *args, **kwargs): + self.name = google_results["results"][0]["formatted_address"] + self.lat = google_results["results"][0]["geometry"]["location"]["lat"] + self.long = google_results["results"][0]["geometry"]["location"]["lng"] + + def get_location(place): try: payload = {'address': place, 'sensor': False} @@ -19,7 +26,8 @@ def get_location(place): if resp["status"] != "OK": return None else: - location = resp["results"][0]["geometry"]["location"] + location = GoogleLocation(resp) + return location except Exception as e: logger.error("Failed to fetch geocode for %(place)s. Error %(error)s" % {'place': place, 'error': e}) @@ -48,20 +56,20 @@ def get_timezone(lat, lng): class TimePlugin(WillPlugin): - @respond_to("what time is it in (?P.*)") + @respond_to("what time is it in (?P.*)?\?+") def what_time_is_it_in(self, message, place): """what time is it in ___: Say the time in almost any city on earth.""" location = get_location(place) if location is not None: - tz = get_timezone(location['lat'], location['lng']) + tz = get_timezone(location.lat, location.long) if tz is not None: ct = datetime.datetime.now(tz=pytz.timezone(tz)) self.say("It's %(time)s in %(place)s." % {'time': self.to_natural_day_and_time(ct), - 'place': place}, message=message) + 'place': location.name}, message=message) else: - self.say("I couldn't find timezone for %(place)s." % {'place': place}, message=message) + self.say("I couldn't find timezone for %(place)s." % {'place': location.name}, message=message) else: - self.say("I couldn't find anywhere named %(place)s." % {'place': place}, message=message) + self.say("I couldn't find anywhere named %(place)s." % {'place': location.name}, message=message) @respond_to("what time is it(\?)?$", multiline=False) def what_time_is_it(self, message): From fb628394d6d92749c931ac5119e600a018b454d8 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 10 Oct 2017 15:46:36 +1300 Subject: [PATCH 013/200] Teaches will how to reply in slack threads. --- docs/improve.md | 2 +- will/backends/io_adapters/hipchat.py | 2 +- will/backends/io_adapters/slack.py | 36 +++++++++++++++++++++++++--- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/docs/improve.md b/docs/improve.md index 7e669775..341d0b6b 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -165,7 +165,7 @@ Here's what's new: This release addresses a number of bugs and smaller features, including: * Chatoms support fixed by [bykof](https://github.com/bykof). - +* Friendlier world time output. #### 1.0.1 - October 10, 2017 diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index d8563376..a81e4c80 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -244,7 +244,7 @@ class HipChatBackend(IOBackend, RoomMixin, StorageMixin): { "name": "HIPCHAT_HANDLE", "obtain_at": """1. Log into hipchat using will's user. -2. Set HIPCHAT_HANDLE to Will's users' mention name without the @, i.e. @will becomes will.""", +2. Set HIPCHAT_HANDLE to Will's users' mention name without the @, i.e. @will would be HIPCHAT_HANDLE='will'.""", }, ] diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index cacc9342..bd61ecce 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -42,7 +42,10 @@ def normalize_incoming_event(self, event): if ( event["type"] == "message" and - ("subtype" not in event or event["subtype"] != "message_changed") + ("subtype" not in event or event["subtype"] != "message_changed") and + # Ignore thread summary events (for now.) + # TODO: We should stack these into the history. + ("subtype" not in event or "thread_ts" not in event["message"]) ): # print("slack: normalize_incoming_event - %s" % event) # Sample of group message @@ -55,6 +58,17 @@ def normalize_incoming_event(self, event): # u'ts': u'1495662397.335424', u'user': u'U5ACF70RH', # u'team': u'T5ACF70KV', u'type': u'message', u'channel': u'D5HGP0YE7'} + # Threaded message + # {u'event_ts': u'1507601477.000073', u'ts': u'1507601477.000073', + # u'subtype': u'message_replied', u'message': + # {u'thread_ts': u'1507414046.000010', u'text': u'hello!', + # u'ts': u'1507414046.000010', u'unread_count': 2, + # u'reply_count': 2, u'user': u'U5GUL9D9N', u'replies': + # [{u'user': u'U5ACF70RH', u'ts': u'1507601449.000007'}, { + # u'user': u'U5ACF70RH', u'ts': u'1507601477.000063'}], + # u'type': u'message', u'bot_id': u'B5HL9ABFE'}, + # u'type': u'message', u'hidden': True, u'channel': u'D5HGP0YE7'} + sender = self.people[event["user"]] channel = clean_for_pickling(self.channels[event["channel"]]) interpolated_handle = "<@%s>" % self.me.id @@ -63,10 +77,15 @@ def normalize_incoming_event(self, event): is_private_chat = False - if len(channel.members.keys()) == 0: + thread = None + if "thread_ts" in event: + thread = event["thread_ts"] + + if len(channel.members.keys()) == 0 and not thread: is_private_chat = True # <@U5GUL9D9N> hi + # TODO: if there's a thread with just will and I on it, treat that as direct. is_direct = False if is_private_chat or event["text"].startswith(interpolated_handle): is_direct = True @@ -89,6 +108,7 @@ def normalize_incoming_event(self, event): backend=self.internal_name, sender=sender, channel=channel, + thread=thread, will_is_mentioned=will_is_mentioned, will_said_it=will_said_it, backend_supports_acl=True, @@ -100,7 +120,6 @@ def normalize_incoming_event(self, event): pass def handle_outgoing_event(self, event): - if event.type in ["say", "reply"]: if "kwargs" in event and "html" in event.kwargs and event.kwargs["html"]: event.content = SlackMarkdownConverter().convert(event.content) @@ -173,9 +192,20 @@ def send_message(self, event): channel_id = event.source_message.data.channel.id else: channel_id = event.source_message.channel.id + if hasattr(event.source_message, "thread"): + data.update({ + "thread_ts": event.source_message.thread + }) else: channel_id = event.data["source"].data.channel.id + try: + data.update({ + "thread_ts": event.data["source"].data.thread + }) + except: + pass + data.update({ "token": settings.SLACK_API_TOKEN, "channel": channel_id, From 6695210c4d2588c6ca70d3b3849e056e3ebabe2c Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 10 Oct 2017 16:33:50 +1300 Subject: [PATCH 014/200] Finishes teaching Will how to handle threads in slack, and adds a bit of friendliness. --- will/backends/io_adapters/slack.py | 27 ++++++++++++++++++++------- will/plugins/friendly/hello.py | 2 +- will/plugins/friendly/howareyou.py | 26 ++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 will/plugins/friendly/howareyou.py diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index bd61ecce..6c24e759 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -71,6 +71,7 @@ def normalize_incoming_event(self, event): sender = self.people[event["user"]] channel = clean_for_pickling(self.channels[event["channel"]]) + # print "channel: %s" % channel interpolated_handle = "<@%s>" % self.me.id will_is_mentioned = False will_said_it = False @@ -81,7 +82,10 @@ def normalize_incoming_event(self, event): if "thread_ts" in event: thread = event["thread_ts"] - if len(channel.members.keys()) == 0 and not thread: + # If the parent thread is a 1-1 between Will and I, also treat that as direct. + # Since members[] still comes in on the thread event, we can trust this, even if we're + # in a thread. + if len(channel.members.keys()) == 0: is_private_chat = True # <@U5GUL9D9N> hi @@ -120,6 +124,8 @@ def normalize_incoming_event(self, event): pass def handle_outgoing_event(self, event): + # print "outgoing" + # print event if event.type in ["say", "reply"]: if "kwargs" in event and "html" in event.kwargs and event.kwargs["html"]: event.content = SlackMarkdownConverter().convert(event.content) @@ -185,18 +191,25 @@ def send_message(self, event): "text": event.content, }) - # TODO: resolve this with a fresh brain. - # Also handle threaded messages. + # TODO: This is terrifingly ugly. Yes, it works. No, I will not have any idea how + # in a few months. Abstract this stuff out! if "source_message" in event: + # Mentions that come back via self.say() if hasattr(event.source_message, "data"): channel_id = event.source_message.data.channel.id + if hasattr(event.source_message.data, "thread"): + data.update({ + "thread_ts": event.source_message.data.thread + }) else: + # Mentions that come back via self.say() with a specific room (I think) channel_id = event.source_message.channel.id - if hasattr(event.source_message, "thread"): - data.update({ - "thread_ts": event.source_message.thread - }) + if hasattr(event.source_message, "thread"): + data.update({ + "thread_ts": event.source_message.thread + }) else: + # Mentions that come back via self.reply() channel_id = event.data["source"].data.channel.id try: diff --git a/will/plugins/friendly/hello.py b/will/plugins/friendly/hello.py index 47313bf6..89f9f288 100644 --- a/will/plugins/friendly/hello.py +++ b/will/plugins/friendly/hello.py @@ -4,7 +4,7 @@ class HelloPlugin(WillPlugin): - @respond_to("^hi$") + @respond_to("^hi|hey$") def hi(self, message): """hi: I know how to say hello!""" self.reply(message, "hello!") diff --git a/will/plugins/friendly/howareyou.py b/will/plugins/friendly/howareyou.py new file mode 100644 index 00000000..91c51523 --- /dev/null +++ b/will/plugins/friendly/howareyou.py @@ -0,0 +1,26 @@ +import datetime +import random +from will.plugin import WillPlugin +from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings + +RESPONSES = [ + "Pretty good, all things considered. You?", + "Doing alright. How are you?", + "Pretty solid for a %(day_name)s, thanks. And you?", + "Last night was crazy, but today is looking good. What about you?", + "A little bored, if I'm honest. How're you?", + "Up and down, but good overall. What about you?", +] + + +class HowAreYouPlugin(WillPlugin): + + @hear("^how are you\?") + def how_are_you(self, message): + now = datetime.datetime.now() + context = { + "day_name": now.strftime("%A") + } + reply = random.choice(RESPONSES) % context + + self.say(reply, message=message) From b497f45ac9b4a72d5f4f1e364f5f3cc33a3cb437 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 10 Oct 2017 16:55:00 +1300 Subject: [PATCH 015/200] Handles mentions, even when the slack app doesn't auto-link. --- config.py | 2 +- setup.cfg | 2 +- will/backends/execution/best_score.py | 4 ++-- will/backends/generation/fuzzy_all_matches.py | 11 ++++++----- will/backends/generation/fuzzy_best_match.py | 10 +++++----- will/backends/generation/strict_regex.py | 5 ++--- will/backends/io_adapters/slack.py | 10 +++++++--- will/plugins/productivity/remind.py | 4 ++-- 8 files changed, 26 insertions(+), 22 deletions(-) diff --git a/config.py b/config.py index f388df89..445a88f9 100644 --- a/config.py +++ b/config.py @@ -172,7 +172,7 @@ # Turn up or down Will's logging level # LOGLEVEL = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL -# LOGLEVEL = "DEBUG" +# LOGLEVEL = "INFO" # Turn on or off Will's profiling # PROFILING_ENABLED = False diff --git a/setup.cfg b/setup.cfg index 1d5dc18e..d0053740 100644 --- a/setup.cfg +++ b/setup.cfg @@ -6,4 +6,4 @@ test = pytest [flake8] ignore = F401,N812,F403,E721,E713,F405,W503,E121,E123,E126,E226,E24,E704,D100,D400,D101,D102,N806,D105,D401,D202,D103,D -max-line-length = 120 \ No newline at end of file +max-line-length = 160 \ No newline at end of file diff --git a/will/backends/execution/best_score.py b/will/backends/execution/best_score.py index 1adc6965..e1be32f9 100644 --- a/will/backends/execution/best_score.py +++ b/will/backends/execution/best_score.py @@ -41,8 +41,8 @@ def handle_execution(self, message): warnings.simplefilter("ignore") try: had_one_reply = False - logging.debug("message.generation_options") - logging.debug(message.generation_options) + logging.info("message.generation_options") + logging.info(message.generation_options) top_score = -1 for m in message.generation_options: logging.debug(m) diff --git a/will/backends/generation/fuzzy_all_matches.py b/will/backends/generation/fuzzy_all_matches.py index 5532a0a7..5b01a5a0 100644 --- a/will/backends/generation/fuzzy_all_matches.py +++ b/will/backends/generation/fuzzy_all_matches.py @@ -64,7 +64,7 @@ def do_generate(self, event): exclude_list = ["fn", ] matches = [] - self.handle_regex = regex.compile("@%s" % settings.HIPCHAT_HANDLE) + # self.handle_regex = regex.compile("@%s" % settings.HIPCHAT_HANDLE) message = event.data # TODO: add token_sort_ratio @@ -78,8 +78,9 @@ def do_generate(self, event): self.match_choices.append(l["regex_pattern"]) search_matches = fuzz_process.extract(message.content, self.match_choices) - logging.info("search_matches") - logging.info(search_matches) + # logging.info("search_matches") + # logging.info(search_matches) + for match_str, confidence in search_matches: l = self.match_methods[match_str] logging.info(" Match (%s) - %s" % ( @@ -102,8 +103,8 @@ def do_generate(self, event): and ( message.is_private_chat or ("direct_mentions_only" not in l or not l["direct_mentions_only"]) or - self.handle_regex.search(message.content) - or message.is_direct + # self.handle_regex.search(message.content) + message.is_direct ) # TODO: Get ACL working again. diff --git a/will/backends/generation/fuzzy_best_match.py b/will/backends/generation/fuzzy_best_match.py index ff35b3fa..3cc8cf53 100644 --- a/will/backends/generation/fuzzy_best_match.py +++ b/will/backends/generation/fuzzy_best_match.py @@ -19,9 +19,9 @@ def _generate_compiled_regex(self, method_meta): regex_string = method_meta["regex_pattern"] if "case_sensitive" in method_meta and not method_meta["case_sensitive"]: regex_string = "(?i)%s" % regex_string - help_regex = method_meta["regex_pattern"] - if method_meta["direct_mentions_only"]: - help_regex = "@%s %s" % (settings.HIPCHAT_HANDLE, help_regex) + # help_regex = method_meta["regex_pattern"] + # if method_meta["direct_mentions_only"]: + # help_regex = "@%s %s" % (settings.HIPCHAT_HANDLE, help_regex) # self.all_listener_regexes.append(help_regex) # if method_meta["__doc__"]: # pht = plugin_info.get("parent_help_text", None) @@ -93,8 +93,8 @@ def do_generate(self, event): and ( message.is_private_chat or ("direct_mentions_only" not in l or not l["direct_mentions_only"]) or - self.handle_regex.search(message.content) - or message.is_direct + # self.handle_regex.search(message.content) + message.is_direct ) # TODO: Get ACL working again. diff --git a/will/backends/generation/strict_regex.py b/will/backends/generation/strict_regex.py index 35b77b0d..10487161 100644 --- a/will/backends/generation/strict_regex.py +++ b/will/backends/generation/strict_regex.py @@ -11,7 +11,7 @@ def do_generate(self, event): exclude_list = ["fn", ] matches = [] - self.handle_regex = re.compile("@%s" % settings.HIPCHAT_HANDLE) + # self.handle_regex = re.compile("@%s" % settings.HIPCHAT_HANDLE) message = event.data for name, l in self.bot.message_listeners.items(): search_matches = l["regex"].search(message.content) @@ -29,8 +29,7 @@ def do_generate(self, event): and ( message.is_private_chat or ("direct_mentions_only" not in l or not l["direct_mentions_only"]) or - self.handle_regex.search(message.content) - or message.is_direct + message.is_direct ) # TOOD: Get ACL working again. diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index 6c24e759..9928368d 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -35,7 +35,7 @@ class SlackBackend(IOBackend, SleepMixin): "obtain_at": """1. Go to https://api.slack.com/tokens, and sign in. 2. Search for Will, and then add will. 3. Generate a new token (These instructions are incorrect!).""", - }, + } ] def normalize_incoming_event(self, event): @@ -73,6 +73,7 @@ def normalize_incoming_event(self, event): channel = clean_for_pickling(self.channels[event["channel"]]) # print "channel: %s" % channel interpolated_handle = "<@%s>" % self.me.id + real_handle = "@%s" % self.me.handle will_is_mentioned = False will_said_it = False @@ -91,13 +92,16 @@ def normalize_incoming_event(self, event): # <@U5GUL9D9N> hi # TODO: if there's a thread with just will and I on it, treat that as direct. is_direct = False - if is_private_chat or event["text"].startswith(interpolated_handle): + if is_private_chat or event["text"].startswith(interpolated_handle) or event["text"].startswith(real_handle): is_direct = True if event["text"].startswith(interpolated_handle): event["text"] = event["text"][len(interpolated_handle):].strip() - if interpolated_handle in event["text"]: + if event["text"].startswith(real_handle): + event["text"] = event["text"][len(real_handle):].strip() + + if interpolated_handle in event["text"] or real_handle in event["text"]: will_is_mentioned = True if event["user"] == self.me.id: diff --git a/will/plugins/productivity/remind.py b/will/plugins/productivity/remind.py index 2a148467..a83351d7 100644 --- a/will/plugins/productivity/remind.py +++ b/will/plugins/productivity/remind.py @@ -4,7 +4,7 @@ class RemindPlugin(WillPlugin): - @respond_to("remind me to (?P.*?) (at|on|in) (?P.*)") + @respond_to("(can|will you )?remind me to (?P.*?) (at|on|in) (?P.*)?\?+") def remind_me_at(self, message, reminder_text=None, remind_time=None): """remind me to ___ at ___: Set a reminder for a thing, at a time.""" parsed_time = self.parse_natural_time(remind_time) @@ -17,7 +17,7 @@ def remind_me_at(self, message, reminder_text=None, remind_time=None): self.schedule_say(formatted_reminder_text, parsed_time, message=message) self.say("%(reminder_text)s %(natural_datetime)s. Got it." % locals(), message=message) - @respond_to("remind (?P(?!me).*?) to (?P.*?) (at|on|in) (?P.*)") + @respond_to("(can|will you )?remind (?P(?!me).*?) to (?P.*?) (at|on|in) (?P.*)?\?+") def remind_somebody_at(self, message, reminder_recipient=None, reminder_text=None, remind_time=None): """remind ___ to ___ at ___: Set a reminder for a thing, at a time for somebody else.""" parsed_time = self.parse_natural_time(remind_time) From 588ab56b7c7a06ff39dad122a19a014158781bbc Mon Sep 17 00:00:00 2001 From: Roy Zheng Date: Tue, 10 Oct 2017 08:05:04 -0700 Subject: [PATCH 016/200] Minorly clean up will.plugin --- will/plugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/will/plugin.py b/will/plugin.py index 49fd0e90..be5517be 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -24,7 +24,8 @@ def _rooms_from_message_and_room(self, message, room): rooms = [self.get_room_from_name_or_id(settings.DEFAULT_ROOM), ] return rooms - def _prepared_content(self, content): + @staticmethod + def _prepared_content(content): content = re.sub(r'>\s+<', '><', content) return content @@ -36,7 +37,6 @@ def say(self, content, message=None, room=None, card=None, **kwargs): # card: Card see: https://developer.atlassian.com/hipchat/guide/sending-messages content = self._prepared_content(content) - rooms = [] if room is not None: try: room_id = room["room_id"] From 008f329b67dba713a2670fd8a6de2c4615000334 Mon Sep 17 00:00:00 2001 From: Roy Zheng Date: Tue, 10 Oct 2017 08:18:58 -0700 Subject: [PATCH 017/200] Allow will.plugin.WillPlugin.say to accept a string room param Closes #289 --- docs/plugins/reply.md | 8 ++++---- will/plugin.py | 8 +++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/docs/plugins/reply.md b/docs/plugins/reply.md index 99e98fa8..89b5f92a 100644 --- a/docs/plugins/reply.md +++ b/docs/plugins/reply.md @@ -26,7 +26,7 @@ self.say(content, message=None, room=None, html=False, color="green", notify=Fal - **`content`**: the content you want to send to the room. Any string will do, HTML or plain text. - **`message`**: (optional) The incoming message object -- **`room`**: (optional) The room object (from self.available_rooms) to send the message to. +- **`room`**: (optional) The room object (from self.available_rooms) or the room name to send the message to. - **`html`**: if the message is HTML. `True` or `False`. - **`color`**: (chat room only) the hipchat color to send. "yellow", "red", "green", "purple", "gray", or "random". Default is "green". - **`notify`**: whether the message should trigger a 'ping' notification. `True` or `False`. @@ -67,7 +67,7 @@ def ping(self): self.say("PONG!") ``` -If you want to talk to a different room, you can pass in the `room` argument with one of the rooms from `self.available_rooms`. +If you want to talk to a different room, you can pass in the `room` argument with one of the rooms from `self.available_rooms` or the string name of the room. ## Send an email @@ -116,7 +116,7 @@ self.schedule_say(content, when, message=None, room=None, html=False, color="gre - **`content`**: the content you want to send to the room. Any string will do, HTML or plain text. - **`when`**: when you want the message to be said. Python `datetime` object. - **`message`**: (optional) The incoming message object -- **`room`**: (optional) The room object (from self.available_rooms) to send the message to. +- **`room`**: (optional) The room object (from self.available_rooms), the room name, or "ALL_ROOMS" to send the message to. - **`html`**: if the message is HTML. `True` or `False`. - **`color`**: (chat room only) the hipchat color to send. "yellow", "red", "green", "purple", "gray", or "random". Default is "green". - **`notify`**: whether the message should trigger a 'ping' notification. `True` or `False`. @@ -144,7 +144,7 @@ self.set_topic(topic, message=None, room=None) - `topic`: The string you want to set the topic to - `message`: (optional) The incoming message object -- `room`: (optional) The room object (from self.available_rooms) to send the message to. +- `room`: (optional) The room object (from self.available_rooms), a room name, or "ALL_ROOMS" to send the message to. diff --git a/will/plugin.py b/will/plugin.py index be5517be..f1cb08ff 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -39,9 +39,15 @@ def say(self, content, message=None, room=None, card=None, **kwargs): content = self._prepared_content(content) if room is not None: try: + error_msg = u'"{0}" is not a valid room name.' + if isinstance(room, basestring): + room = self.get_room_from_name_or_id(room) + if not room: + raise KeyError + error_msg = u'"{0}" is not a room object.' room_id = room["room_id"] except KeyError: - logging.error(u'"%s" is not a room object.', room) + logging.error(error_msg.format(room)) else: self.send_room_message(room_id, content, card=card, **kwargs) elif message is None or message["type"] == "groupchat": From 33a76e7512983f8d0cecc63ea4f7d3d8ca2c4217 Mon Sep 17 00:00:00 2001 From: Miguel Carrera Date: Sun, 15 Oct 2017 19:00:20 +0100 Subject: [PATCH 018/200] Adding custom filters support for jinja2 rendered_template decorator --- will/decorators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/will/decorators.py b/will/decorators.py index 94b60ef3..422e49ee 100644 --- a/will/decorators.py +++ b/will/decorators.py @@ -81,7 +81,7 @@ def rendered_template(template_name, context=None, custom_filters=[]): loader = FileSystemLoader(template_dirs) env = Environment(loader=loader) - if isinstance(custom_filters, list()): + if isinstance(custom_filters, list): for custom_filter in custom_filters: env.filters[custom_filter.__name__] = custom_filter From 6131f3ba00b619430ac440b43bfb85e7aba0007a Mon Sep 17 00:00:00 2001 From: Miguel Carrera Date: Sun, 15 Oct 2017 19:11:44 +0100 Subject: [PATCH 019/200] Readme rendered_template update --- docs/plugins/builtins.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/plugins/builtins.md b/docs/plugins/builtins.md index 01fe177a..35524ce9 100644 --- a/docs/plugins/builtins.md +++ b/docs/plugins/builtins.md @@ -29,11 +29,12 @@ Will includes [Jinja](http://jinja.pocoo.org/) for powerful awesome template ren ```python -self.rendered_template(template_name, context={}) +self.rendered_template(template_name, context={}, custom_filters=[]) ``` - **`template_name`**: path to the template, relative to the `TEMPLATE_DIRS` specified in `config.py`. - **`context`**: a dictionary to render the template with. +- **`custom_filters`**: [custom filters](http://jinja.pocoo.org/docs/2.9/api/#custom-filters) support for rendering templates You can use `rendered_template()` directly in a plugin, From a7047edc6b564b61bc48495d2541d4c9b1329ae8 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Mon, 16 Oct 2017 09:28:06 +1300 Subject: [PATCH 020/200] Pulls handle_regexes --- will/backends/generation/fuzzy_all_matches.py | 2 -- will/backends/generation/fuzzy_best_match.py | 2 -- will/backends/generation/strict_regex.py | 1 - will/backends/io_adapters/hipchat.py | 1 - 4 files changed, 6 deletions(-) diff --git a/will/backends/generation/fuzzy_all_matches.py b/will/backends/generation/fuzzy_all_matches.py index 5b01a5a0..5c1b8d63 100644 --- a/will/backends/generation/fuzzy_all_matches.py +++ b/will/backends/generation/fuzzy_all_matches.py @@ -64,7 +64,6 @@ def do_generate(self, event): exclude_list = ["fn", ] matches = [] - # self.handle_regex = regex.compile("@%s" % settings.HIPCHAT_HANDLE) message = event.data # TODO: add token_sort_ratio @@ -103,7 +102,6 @@ def do_generate(self, event): and ( message.is_private_chat or ("direct_mentions_only" not in l or not l["direct_mentions_only"]) or - # self.handle_regex.search(message.content) message.is_direct ) diff --git a/will/backends/generation/fuzzy_best_match.py b/will/backends/generation/fuzzy_best_match.py index 3cc8cf53..0c86d8af 100644 --- a/will/backends/generation/fuzzy_best_match.py +++ b/will/backends/generation/fuzzy_best_match.py @@ -62,7 +62,6 @@ def do_generate(self, event): exclude_list = ["fn", ] matches = [] - self.handle_regex = regex.compile("@%s" % settings.HIPCHAT_HANDLE) message = event.data # TODO: add token_sort_ratio @@ -93,7 +92,6 @@ def do_generate(self, event): and ( message.is_private_chat or ("direct_mentions_only" not in l or not l["direct_mentions_only"]) or - # self.handle_regex.search(message.content) message.is_direct ) diff --git a/will/backends/generation/strict_regex.py b/will/backends/generation/strict_regex.py index 10487161..6ecef0bb 100644 --- a/will/backends/generation/strict_regex.py +++ b/will/backends/generation/strict_regex.py @@ -11,7 +11,6 @@ def do_generate(self, event): exclude_list = ["fn", ] matches = [] - # self.handle_regex = re.compile("@%s" % settings.HIPCHAT_HANDLE) message = event.data for name, l in self.bot.message_listeners.items(): search_matches = l["regex"].search(message.content) diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index a81e4c80..26fb4245 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -100,7 +100,6 @@ def start_xmpp_client(self, xmpp_bridge_queue=None, backend_name=""): self.nick = settings.HIPCHAT_NAME self.handle = settings.HIPCHAT_HANDLE - self.handle_regex = re.compile("@%s" % self.handle) self.whitespace_keepalive = True self.whitespace_keepalive_interval = 30 From 62aa87ba7476ab7726b846fe525a1263c9a6c5bf Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 18 Oct 2017 16:56:08 +1300 Subject: [PATCH 021/200] Renames and cleans up data.source mess, and makes SECRET_KEY automagically handled (with explanations) --- config.py | 11 ++--- will/abstractions.py | 15 ++++--- will/backends/execution/all.py | 7 +++- will/backends/execution/best_score.py | 6 ++- will/backends/io_adapters/hipchat.py | 2 +- will/backends/io_adapters/shell.py | 10 ++--- will/backends/io_adapters/slack.py | 21 ++++++---- will/backends/pubsub/base.py | 18 ++++---- will/main.py | 59 +++++++++++++++++++-------- will/settings.py | 13 ++++++ 10 files changed, 111 insertions(+), 51 deletions(-) diff --git a/config.py b/config.py index 445a88f9..409485cc 100644 --- a/config.py +++ b/config.py @@ -73,7 +73,7 @@ # Platforms and mediums messages can come in and go out on. IO_BACKENDS = [ - # "will.backends.io_adapters.hipchat", + "will.backends.io_adapters.hipchat", # "will.backends.io_adapters.rocketchat", "will.backends.io_adapters.shell", "will.backends.io_adapters.slack", @@ -146,7 +146,7 @@ # The list of rooms will should join. Default is all rooms. # TODO: Appears to be Hipchat-specific, should be renamed or # deprecated. -ROOMS = ['Will Testing', ] +# ROOMS = ['Will Testing', ] # The maximum number of milliseconds to wait for an analysis backend to finish # ANALYSIS_TIMEOUT_MS = 2000 @@ -164,10 +164,11 @@ # DEFAULT_ROOM = 'Testing, Will Kahuna' -# A secret key, used to specify this instance of will and secure pubsub contents. +# A secret key, used to namespace this instance of will and secure pubsub contents. # Do *NOT* keep it in config.py. *DO* set it in the environment, in a secured session. -# TODO: Move this to config.untracked.py -SECRET_KEY = "DXQnJ2eHD6k2w3DvBTstN6kw9d9N4CeCLbjoK" +# If a SECRET_KEY is not set, one will be auto-generated, but will limit Will to reading +# data from this excecution only. +# SECRET_KEY = "DXQnJ2eHD6k2w3DvBTstN6kw9d9N4CeCLbjoK" # Turn up or down Will's logging level diff --git a/will/abstractions.py b/will/abstractions.py index e159ca19..9733ef2b 100644 --- a/will/abstractions.py +++ b/will/abstractions.py @@ -18,7 +18,7 @@ class Message(object): "backend_supports_acl", "content", "backend", - "source", + "original_incoming_event", ] def __init__(self, *args, **kwargs): @@ -43,6 +43,11 @@ def __init__(self, *args, **kwargs): self.hash = h.hexdigest() self.metadata = Bunch() + if not "original_incoming_event_hash" in kwargs: + if hasattr(self, "original_incoming_event") and hasattr(self.original_incoming_event, "hash"): + self.original_incoming_event_hash = self.original_incoming_event.hash + else: + self.original_incoming_event_hash = self.hash def __unicode__(self, *args, **kwargs): if len(self.content) > 20: @@ -90,11 +95,11 @@ def __init__(self, *args, **kwargs): h.update(self.timestamp.strftime("%s")) h.update("%s" % self.type) self.hash = h.hexdigest() - if not "source_hash" in kwargs: - if hasattr(self, "source") and hasattr(self.source, "hash"): - self.source_hash = self.source.hash + if not "original_incoming_event_hash" in kwargs: + if hasattr(self, "original_incoming_event") and hasattr(self.original_incoming_event, "hash"): + self.original_incoming_event_hash = self.original_incoming_event.hash else: - self.source_hash = self.hash + self.original_incoming_event_hash = self.hash class Person(Bunch): diff --git a/will/backends/execution/all.py b/will/backends/execution/all.py index f7dc8324..2db6ff57 100644 --- a/will/backends/execution/all.py +++ b/will/backends/execution/all.py @@ -48,8 +48,13 @@ def handle_execution(self, message): ) logging.info("Executed") had_one_reply = True + # TODO: Abstract this into a base method (Raise?) if not had_one_reply: - self.bot.pubsub.publish("message.no_response", {'source': message}, reference_message=message) + self.bot.pubsub.publish( + "message.no_response", + message.data, + reference_message=message.data.original_incoming_event + ) return {} except: diff --git a/will/backends/execution/best_score.py b/will/backends/execution/best_score.py index e1be32f9..d8b8f183 100644 --- a/will/backends/execution/best_score.py +++ b/will/backends/execution/best_score.py @@ -58,7 +58,11 @@ def handle_execution(self, message): self.do_execute(message, m) had_one_reply = True if not had_one_reply: - self.bot.pubsub.publish("message.no_response", {'source': message}, reference_message=message) + self.bot.pubsub.publish( + "message.no_response", + message.data, + reference_message=message.data.original_incoming_event + ) return {} except: diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index 26fb4245..9bdd9268 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -443,7 +443,7 @@ def normalize_incoming_event(self, event): will_is_mentioned=will_is_mentioned, will_said_it=will_said_it, backend_supports_acl=True, - source=clean_for_pickling(event), + original_incoming_event=clean_for_pickling(event), ) # print("normalized:") # print(m.__dict__) diff --git a/will/backends/io_adapters/shell.py b/will/backends/io_adapters/shell.py index 529e0e28..ecf58a4a 100644 --- a/will/backends/io_adapters/shell.py +++ b/will/backends/io_adapters/shell.py @@ -44,12 +44,12 @@ def normalize_incoming_event(self, event): is_direct=True, is_private_chat=True, is_group_chat=False, - backend=self.name, + backend=self.internal_name, sender=self.partner, will_is_mentioned=False, will_said_it=False, backend_supports_acl=False, - source=event + original_incoming_event=event ) return m else: @@ -62,9 +62,7 @@ def handle_outgoing_event(self, event): self.send_direct_message(event.content) elif event.type == "message.no_response": - # TODO: Seriously fix this. It's gross and confusing. - # print(event.data["source"].data.content) - if event.data and "source" in event.data and len(event.data["source"].data.content) > 0: + if event.data and hasattr(event.data, "original_incoming_event") and len(event.data.original_incoming_event.data.content) > 0: self.send_direct_message(random.choice(UNSURE_REPLIES)) # Regardless of whether or not we had something to say, @@ -103,6 +101,6 @@ def bootstrap(self): will_is_mentioned=False, will_said_it=False, backend_supports_acl=False, - source={} + original_incoming_event={} )) ) diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index 9928368d..3bce6714 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -120,7 +120,7 @@ def normalize_incoming_event(self, event): will_is_mentioned=will_is_mentioned, will_said_it=will_said_it, backend_supports_acl=True, - source=clean_for_pickling(event), + original_incoming_event=clean_for_pickling(event), ) return m else: @@ -128,8 +128,6 @@ def normalize_incoming_event(self, event): pass def handle_outgoing_event(self, event): - # print "outgoing" - # print event if event.type in ["say", "reply"]: if "kwargs" in event and "html" in event.kwargs and event.kwargs["html"]: event.content = SlackMarkdownConverter().convert(event.content) @@ -164,8 +162,8 @@ def handle_outgoing_event(self, event): elif ( event.type == "message.no_response" and - event.data["source"].data.is_direct and - event.data["source"].data.will_said_it is False + event.data.is_direct and + event.data.will_said_it is False ): event.content = random.choice(UNSURE_REPLIES) self.send_message(event) @@ -214,11 +212,20 @@ def send_message(self, event): }) else: # Mentions that come back via self.reply() - channel_id = event.data["source"].data.channel.id + if hasattr(event.data, "original_incoming_event"): + if hasattr(event.data.original_incoming_event.channel, "id"): + channel_id = event.data.original_incoming_event.channel.id + else: + channel_id = event.data.original_incoming_event.channel + else: + if hasattr(event.data["original_incoming_event"].data.channel, "id"): + channel_id = event.data["original_incoming_event"].data.channel.id + else: + channel_id = event.data["original_incoming_event"].data.channel try: data.update({ - "thread_ts": event.data["source"].data.thread + "thread_ts": event.data["original_incoming_event"].data.thread }) except: pass diff --git a/will/backends/pubsub/base.py b/will/backends/pubsub/base.py index 7f23ee95..e56dc975 100644 --- a/will/backends/pubsub/base.py +++ b/will/backends/pubsub/base.py @@ -116,17 +116,17 @@ def publish(self, topic, obj, reference_message=None): e.sender = obj.sender if reference_message: - source_hash = None - if hasattr(reference_message, "source_hash"): - source_hash = reference_message.source_hash + original_incoming_event_hash = None + if hasattr(reference_message, "original_incoming_event_hash"): + original_incoming_event_hash = reference_message.original_incoming_event_hash elif hasattr(reference_message, "source") and hasattr(reference_message.source, "hash"): - source_hash = reference_message.source.hash - elif hasattr(reference_message, "source") and hasattr(reference_message.source, "source_hash"): - source_hash = reference_message.source.source_hash + original_incoming_event_hash = reference_message.source.hash + elif hasattr(reference_message, "source") and hasattr(reference_message.source, "original_incoming_event_hash"): + original_incoming_event_hash = reference_message.source.original_incoming_event_hash elif hasattr(reference_message, "hash"): - source_hash = reference_message.hash - if source_hash: - e.source_hash = source_hash + original_incoming_event_hash = reference_message.hash + if original_incoming_event_hash: + e.original_incoming_event_hash = original_incoming_event_hash return self.publish_to_backend( self._localize_topic(topic), diff --git a/will/main.py b/will/main.py index d1cd3ec1..7609f626 100644 --- a/will/main.py +++ b/will/main.py @@ -482,6 +482,10 @@ def handle_sys_exit(self, *args, **kwargs): print('\n\nReceived keyboard interrupt, quitting threads.',) self.exiting = True + if "WILL_EPHEMERAL_SECRET_KEY" in os.environ: + os.environ["WILL_SECRET_KEY"] = "" + os.environ["WILL_EPHEMERAL_SECRET_KEY"] = "" + if self.scheduler_thread: try: self.scheduler_thread.terminate() @@ -561,6 +565,7 @@ def bootstrap_event_handler(self): event = self.pubsub.get_message() if event and hasattr(event, "type"): now = datetime.datetime.now() + logging.info("%s - %s" % (event.type, event.original_incoming_event_hash)) logging.debug("\n\n *** Event (%s): %s\n\n" % (event.type, event)) # TODO: Order by most common. @@ -568,62 +573,84 @@ def bootstrap_event_handler(self): # A message just got dropped off one of the IO Backends. # Send it to analysis. - analysis_threads[event.source_hash] = { + analysis_threads[event.original_incoming_event_hash] = { "count": 0, "timeout_end": now + datetime.timedelta(seconds=self.analysis_timeout / 1000), - "source": event, + "original_incoming_event": event, + "working_event": event, } - self.pubsub.publish("analysis.start", event.data.source, reference_message=event) + self.pubsub.publish("analysis.start", event.data.original_incoming_event, reference_message=event) elif event.type == "analysis.complete": - q = analysis_threads[event.source_hash] - q["source"].update({"analysis": event.data}) + q = analysis_threads[event.original_incoming_event_hash] + q["working_event"].update({"analysis": event.data}) q["count"] += 1 + logging.info("Analysis for %s: %s/%s" % (event.original_incoming_event_hash, q["count"], num_analysis_threads)) if q["count"] >= num_analysis_threads or now > q["timeout_end"]: # done, move on. - generation_threads[event.source_hash] = { + generation_threads[event.original_incoming_event_hash] = { "count": 0, "timeout_end": ( now + datetime.timedelta(seconds=self.generation_timeout / 1000) ), - "source": q["source"], + "original_incoming_event": q["original_incoming_event"], + "working_event": q["working_event"], } try: - del analysis_threads[event.source_hash] + del analysis_threads[event.original_incoming_event_hash] except: pass - self.pubsub.publish("generation.start", q["source"], reference_message=q["source"]) + self.pubsub.publish("generation.start", q["working_event"], reference_message=q["original_incoming_event"]) elif event.type == "generation.complete": - q = generation_threads[event.source_hash] - if not hasattr(q["source"], "generation_options"): - q["source"].generation_options = [] + q = generation_threads[event.original_incoming_event_hash] + if not hasattr(q["working_event"], "generation_options"): + q["working_event"].generation_options = [] if hasattr(event, "data") and len(event.data) > 0: for d in event.data: - q["source"].generation_options.append(d) + q["working_event"].generation_options.append(d) q["count"] += 1 + logging.info("Generation for %s: %s/%s" % (event.original_incoming_event_hash, q["count"], num_generation_threads)) if q["count"] >= num_generation_threads or now > q["timeout_end"]: # done, move on to execution. for b in self.execution_backends: try: - b.handle_execution(q["source"]) + logging.info("Executing for %s on %s" % (b, event.original_incoming_event_hash)) + b.handle_execution(q["working_event"]) except: + logging.critical( + "Error running %s for %s. \n\n%s\nContinuing...\n" % ( + b, + event.original_incoming_event_hash, + traceback.format_exc() + ) + ) break try: - del generation_threads[event.source_hash] + del generation_threads[event.original_incoming_event_hash] except: pass elif event.type == "message.no_response": + logging.info("Publishing no response for %s" % (event.original_incoming_event_hash,)) + logging.info(event.data.__dict__) try: - self.publish("message.outgoing.%s" % event.data["source"].data.backend, event) + self.publish("message.outgoing.%s" % event.data.backend, event) except: + logging.critical( + "Error publishing no_response for %s. \n\n%s\nContinuing...\n" % ( + event.original_incoming_event_hash, + traceback.format_exc() + ) + ) pass else: self.sleep_for_event_loop() + # except KeyError: + # pass except: logging.exception("Error handling message") diff --git a/will/settings.py b/will/settings.py index d81106af..aad8a51f 100644 --- a/will/settings.py +++ b/will/settings.py @@ -1,4 +1,5 @@ import os +import uuid from will.utils import show_valid, warn, note, error from clint.textui import puts, indent from six.moves.urllib import parse @@ -22,6 +23,9 @@ def import_settings(quiet=True): if k[:5] == "WILL_": k = k[5:] settings[k] = v + if "HIPCHAT_ROOMS" in settings: + settings["HIPCHAT_ROOMS"] = settings["HIPCHAT_ROOMS"].split(";") + if "ROOMS" in settings: settings["ROOMS"] = settings["ROOMS"].split(";") @@ -220,6 +224,15 @@ def import_settings(quiet=True): if "EVENT_LOOP_INTERVAL" not in settings: settings["EVENT_LOOP_INTERVAL"] = 0.025 + if "SECRET_KEY" not in settings: + note( + "No SECRET_KEY specified. Auto-generating one specific to this run of Will.\n" + + " Know that will won't be able to catch up on old messages or work in a multicomponent install without one." + ) + settings["SECRET_KEY"] = uuid.uuid4().hex + os.environ["WILL_SECRET_KEY"] = settings["SECRET_KEY"] + os.environ["WILL_EPHEMERAL_SECRET_KEY"] = "True" + # Set them in the module namespace for k in sorted(settings, key=lambda x: x[0]): if not quiet: From d5f11ffb52056d0baf7c31cde436592e6fd0b9b8 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 18 Oct 2017 17:20:33 +1300 Subject: [PATCH 022/200] Adds deprecation warnings for admin_only. --- will/decorators.py | 23 ++++++++++++++++++++++- will/main.py | 13 +++++++++++-- will/utils.py | 4 ++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/will/decorators.py b/will/decorators.py index 929dd72f..082b3fb7 100644 --- a/will/decorators.py +++ b/will/decorators.py @@ -1,11 +1,21 @@ + +def deprecation_warning_for_admin(f): + err = ( + "admin_only=True is deprecated and is being used by the `%s` method.\n" % (f.__name__, ) + + " Please use ACLs instead. admin_only will be removed at the end of 2017." + ) + return err + + def respond_to(regex, include_me=False, case_sensitive=False, multiline=False, admin_only=False, acl=set()): def wrap(f): passed_args = [] + if admin_only: + f.warnings = deprecation_warning_for_admin(f) def wrapped_f(*args, **kwargs): f(*args, **kwargs) wrapped_f.will_fn_metadata = getattr(f, "will_fn_metadata", {}) - wrapped_f.will_fn_metadata["listener_regex"] = regex wrapped_f.will_fn_metadata["case_sensitive"] = case_sensitive wrapped_f.will_fn_metadata["multiline"] = multiline @@ -16,6 +26,9 @@ def wrapped_f(*args, **kwargs): wrapped_f.will_fn_metadata["listener_args"] = passed_args wrapped_f.will_fn_metadata["__doc__"] = f.__doc__ wrapped_f.will_fn_metadata["listeners_acl"] = acl + if getattr(f, "warnings", None): + wrapped_f.will_fn_metadata["warnings"] = getattr(f, "warnings") + return wrapped_f return wrap @@ -30,6 +43,8 @@ def wrapped_f(*args, **kwargs): wrapped_f.will_fn_metadata["function_name"] = f.__name__ wrapped_f.will_fn_metadata["sched_args"] = sched_args wrapped_f.will_fn_metadata["sched_kwargs"] = sched_kwargs + if getattr(f, "warnings", None): + wrapped_f.will_fn_metadata["warnings"] = getattr(f, "warnings") return wrapped_f return wrap @@ -37,6 +52,8 @@ def wrapped_f(*args, **kwargs): def hear(regex, include_me=False, case_sensitive=False, multiline=False, admin_only=False, acl=set()): def wrap(f): passed_args = [] + if admin_only: + f.warnings = deprecation_warning_for_admin(f) def wrapped_f(*args, **kwargs): f(*args, **kwargs) @@ -51,6 +68,8 @@ def wrapped_f(*args, **kwargs): wrapped_f.will_fn_metadata["listener_args"] = passed_args wrapped_f.will_fn_metadata["__doc__"] = f.__doc__ wrapped_f.will_fn_metadata["listeners_acl"] = acl + if getattr(f, "warnings", None): + wrapped_f.will_fn_metadata["warnings"] = getattr(f, "warnings") return wrapped_f @@ -68,6 +87,8 @@ def wrapped_f(*args, **kwargs): wrapped_f.will_fn_metadata["end_hour"] = int(end_hour) wrapped_f.will_fn_metadata["day_of_week"] = day_of_week wrapped_f.will_fn_metadata["num_times_per_day"] = int(num_times_per_day) + if getattr(f, "warnings", None): + wrapped_f.will_fn_metadata["warnings"] = getattr(f, "warnings") return wrapped_f return wrap diff --git a/will/main.py b/will/main.py index 7609f626..f704805c 100644 --- a/will/main.py +++ b/will/main.py @@ -28,7 +28,7 @@ from backends.io_adapters.base import Event from scheduler import Scheduler import settings -from utils import show_valid, error, warn, note, print_head, Bunch +from utils import show_valid, show_invalid, error, warn, note, print_head, Bunch # Force UTF8 @@ -957,6 +957,7 @@ def bootstrap_plugins(self): last_parent_name = plugin_info["parent_help_text"] with indent(2): plugin_name = plugin_info["name"] + plugin_warnings = [] # Just a little nicety if plugin_name[-6:] == "Plugin": plugin_name = plugin_name[:-6] @@ -973,6 +974,8 @@ def bootstrap_plugins(self): with indent(2): if hasattr(fn, "will_fn_metadata"): meta = fn.will_fn_metadata + if "warnings" in meta: + plugin_warnings.append(meta["warnings"]) if "required_settings" in meta: for s in meta["required_settings"]: self.required_settings_from_plugins[s] = { @@ -1044,6 +1047,7 @@ def bootstrap_plugins(self): elif "bottle_route" in meta: # puts("- %s" % function_name) self.bottle_routes.append((plugin_info["class"], function_name)) + except Exception as e: error(plugin_name) self.startup_error( @@ -1052,7 +1056,12 @@ def bootstrap_plugins(self): function_name, ), e ) - show_valid(plugin_name) + if len(plugin_warnings) > 0: + show_invalid(plugin_name) + for w in plugin_warnings: + warn(w) + else: + show_valid(plugin_name) except Exception as e: self.startup_error("Error bootstrapping %s" % (plugin_info["class"],), e) diff --git a/will/utils.py b/will/utils.py index a38d966d..a5a2767d 100644 --- a/will/utils.py +++ b/will/utils.py @@ -80,6 +80,10 @@ def show_valid(valid_str): puts(colored.green(u"✓ %s" % valid_str)) +def show_invalid(valid_str): + puts(colored.red(u"✗ %s" % valid_str)) + + def warn(warn_string): puts(colored.yellow("! Warning: %s" % warn_string)) From 811c4ad48fc285a9614a743b00a76de9e7df9c9f Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 18 Oct 2017 17:28:55 +1300 Subject: [PATCH 023/200] Encrypt by default --- config.py | 13 +++---------- will/settings.py | 2 +- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/config.py b/config.py index 409485cc..d4775e32 100644 --- a/config.py +++ b/config.py @@ -195,13 +195,6 @@ # } -# Deprecated - please use ACL, above, instead: User handles who are allowed to perform -# `admin_only` plugins. Defaults to everyone. -# ADMINS = [ -# "steven", -# "levi", -# ] - # Sets a different storage backend. If unset, defaults to redis. # If you use a different backend, make sure to add their required settings. # STORAGE_BACKEND = "redis" # "redis", "couchbase", or "file". @@ -216,9 +209,9 @@ # Disable SSL checks. Strongly reccomended this is not set to True. # ALLOW_INSECURE_HIPCHAT_SERVER = False -# Turn on encryption in the pub/sub layer. Causes a small speed bump, -# but secures messages in an untrusted environment. -ENABLE_INTERNAL_ENCRYPTION = True +# Turn on/off encryption in the pub/sub layer (default is on). +# Causes a small speed bump, but secures messages in an untrusted environment. +# ENABLE_INTERNAL_ENCRYPTION = False # Mailgun config, if you'd like will to send emails. # DEFAULT_FROM_EMAIL="will@example.com" diff --git a/will/settings.py b/will/settings.py index aad8a51f..c20913cb 100644 --- a/will/settings.py +++ b/will/settings.py @@ -122,7 +122,7 @@ def import_settings(quiet=True): settings["DEFAULT_BACKEND"] = settings["IO_BACKENDS"][0] if "ENABLE_INTERNAL_ENCRYPTION" not in settings: - settings["ENABLE_INTERNAL_ENCRYPTION"] = False + settings["ENABLE_INTERNAL_ENCRYPTION"] = True if "HTTPSERVER_PORT" not in settings: # For heroku From ebe836b107e4b3a2ded29294566f9558981c1e1a Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 18 Oct 2017 18:56:27 +1300 Subject: [PATCH 024/200] ACL 2.0 Updates ACLs to work with the new backends, formally deprecates admin_only, provides more consistent output, and warns on potentially unsafe actions. --- config.py | 19 +-- docs/improve.md | 5 + docs/plugins/reply.md | 2 +- will/abstractions.py | 2 +- will/acl.py | 33 +++++ will/backends/execution/all.py | 41 +------ will/backends/execution/base.py | 69 ++++++++++- will/backends/execution/best_score.py | 30 +---- will/backends/generation/fuzzy_all_matches.py | 116 +++++++++--------- will/backends/generation/fuzzy_best_match.py | 93 +++++++------- will/backends/io_adapters/shell.py | 2 +- will/main.py | 13 ++ will/plugins/admin/storage.py | 8 +- will/plugins/devops/emergency_contacts.py | 2 +- will/plugins/friendly/mornin.py | 2 +- will/plugins/help/help.py | 2 +- will/plugins/productivity/remind.py | 4 +- will/settings.py | 22 ++-- 18 files changed, 272 insertions(+), 193 deletions(-) diff --git a/config.py b/config.py index d4775e32..a64985bd 100644 --- a/config.py +++ b/config.py @@ -73,7 +73,7 @@ # Platforms and mediums messages can come in and go out on. IO_BACKENDS = [ - "will.backends.io_adapters.hipchat", + # "will.backends.io_adapters.hipchat", # "will.backends.io_adapters.rocketchat", "will.backends.io_adapters.shell", "will.backends.io_adapters.slack", @@ -173,6 +173,7 @@ # Turn up or down Will's logging level # LOGLEVEL = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL +LOGLEVEL = "WARNING" # LOGLEVEL = "INFO" # Turn on or off Will's profiling @@ -191,9 +192,12 @@ # in respond_to and hear actions. # Group names can be any string, and the list is composed of user handles. # ACL = { -# "admins": ["steven", "will"] +# "admins": ["sarah", "sue", "steven"] # } - +# +# By default, if no ACL is set, all users can perform all actions - but warnings +# will be printed to the console. To disable those warnings, set DISABLE_ACL to True +# DISABLE_ACL = False # Sets a different storage backend. If unset, defaults to redis. # If you use a different backend, make sure to add their required settings. @@ -206,7 +210,11 @@ # ZEROMQ_URL = "tcp://127.0.0.1:15555" -# Disable SSL checks. Strongly reccomended this is not set to True. +# Rocket.Chat server URL and port as necessary +# ROCKETCHAT_URL = "http://localhost:3000" + + +# Disable Hipchat SSL checks. Strongly reccomended this is not set to True. # ALLOW_INSECURE_HIPCHAT_SERVER = False # Turn on/off encryption in the pub/sub layer (default is on). @@ -230,6 +238,3 @@ # Google Application key for "image me" command # GOOGLE_API_KEY = "FILL THIS IN" # GOOGLE_CUSTOM_SEARCH_ENGINE_ID = "FILL THIS IN" - -# Rocket.Chat server URL and port as necessary -# ROCKETCHAT_URL = "http://localhost:3000" diff --git a/docs/improve.md b/docs/improve.md index 341d0b6b..cbdb4b21 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -160,8 +160,13 @@ Here's what's new: - Slack support - CLI/Shell backend - [Rocket.chat](https://rocket.chat/) support, thanks to [antgel](https://github.com/antgel) +- Lots more intelligence around required settings and verification, to make first starting and debugging Will easier. +This release also changes a few bits of behavior, to be consistent: +- `admin_only` is explicitly flagged for deprecation and removal, to be replaced by the ACL system introduced in 2015 (largely, this is because having two different access control systems is crazy and painful.) Switching is as easy as adding `ACL = {'admins': ['steven', 'will']}` to your config.py and find/replacing `admin_only=True` with `acl=['admins',] in your codebase. For now, Will handles backwards compatability by mapping the old settings into the new places, but he won't forever. Thanks for updating, and making ongoing maintenence simpler! +- If no ACLs are specified and users try to perform restricted commands, they'll be allowed as before, but Will will complain to the console. A new `DISABLE_ACL` setting has been added to turn off the complaining. + This release addresses a number of bugs and smaller features, including: * Chatoms support fixed by [bykof](https://github.com/bykof). diff --git a/docs/plugins/reply.md b/docs/plugins/reply.md index 99e98fa8..23745948 100644 --- a/docs/plugins/reply.md +++ b/docs/plugins/reply.md @@ -38,7 +38,7 @@ Sometimes you want will to ping you - that's where @name mentions are great. To ```python @respond_to("^hi") # Basic def hi(self, message): - self.reply(message, "hello, %s!" % message.sender.nick) + self.reply(message, "hello, %s!" % message.sender.handle) ``` ![Hi, Hello, username!](../img/hi_hello.gif) diff --git a/will/abstractions.py b/will/abstractions.py index 9733ef2b..09fc7a25 100644 --- a/will/abstractions.py +++ b/will/abstractions.py @@ -137,7 +137,7 @@ def __init__(self, *args, **kwargs): @property def nick(self): - logging.warn("sender.nick is deprecated, and will be removed at the end of 2017") + logging.warn("sender.nick is deprecated and will be removed eventually. Please use sender.handle instead!") return self.handle diff --git a/will/acl.py b/will/acl.py index 747e7c84..c4fc8923 100644 --- a/will/acl.py +++ b/will/acl.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import logging from will import settings @@ -20,9 +21,41 @@ def get_acl_members(acl): def is_acl_allowed(nick, acl): + if not getattr(settings, "ACL", None): + logging.warn( + "%s was just allowed to perform actions in %s because no ACL settings exist. This can be a security risk." % ( + nick, + acl, + ) + ) + return True for a in acl: acl_members = get_acl_members(a) if nick in acl_members or nick.lower() in [x.lower() for x in acl_members]: return True return False + + +def test_acl(message, acl): + try: + if settings.DISABLE_ACL: + return True + + allowed = is_acl_allowed(message.sender.handle, acl) + if allowed: + return True + if hasattr(message, "data") and hasattr(message.data, "backend_supports_acl"): + if not message.data.backend_supports_acl: + logging.warn( + "%s was just allowed to perform actions in %s because the backend does not support ACL. This can be a security risk." % ( + message.sender.handle, + acl, + ) + + "To fix this, set ACL groups in your config.py, or set DISABLE_ACL = True" + ) + return True + except: + pass + + return False diff --git a/will/backends/execution/all.py b/will/backends/execution/all.py index 2db6ff57..f81ec0b3 100644 --- a/will/backends/execution/all.py +++ b/will/backends/execution/all.py @@ -1,4 +1,4 @@ -import imp + import logging import traceback import requests @@ -18,49 +18,18 @@ def handle_execution(self, message): try: had_one_reply = False for m in message.generation_options: - logging.info("handle_execution") - logging.info(m) - logging.info(m.__dict__) - logging.info(m.context) - logging.info(m.context.full_method_name) - logging.info(self.bot) - logging.info(self.bot.pubsub) - - # Question: do we need to do this via self.bot, or can we re-instantiate - # the execution thread (and in the process, magically provide/handle self.message)? - module = imp.load_source(m.context.plugin_info["parent_name"], m.context.plugin_info["parent_path"]) - logging.info("module") - logging.info(module) - cls = getattr(module, m.context.plugin_info["name"]) - # Do we need self.bot? - instantiated_module = cls(message=message, bot=self.bot) - logging.info("instantiated_module") - logging.info(instantiated_module) - method = getattr(instantiated_module, m.context.function_name) - - # live_listener = self.bot.message_listeners[m.context.full_method_name] - thread_args = [message, ] + m.context["args"] - - self.execute( - method, - *thread_args, - **m.context.search_matches - ) - logging.info("Executed") + self.execute(message, m) had_one_reply = True + # TODO: Abstract this into a base method (Raise?) if not had_one_reply: - self.bot.pubsub.publish( - "message.no_response", - message.data, - reference_message=message.data.original_incoming_event - ) + self.no_response(message) return {} except: logging.critical( "Error running %s. \n\n%s\nContinuing...\n" % ( - m.context.full_method_name, + message.context.full_method_name, traceback.format_exc() ) ) diff --git a/will/backends/execution/base.py b/will/backends/execution/base.py index 925a32e2..602b9b6f 100644 --- a/will/backends/execution/base.py +++ b/will/backends/execution/base.py @@ -1,8 +1,11 @@ +import imp import logging import signal import traceback from will import settings from will.decorators import require_settings +from will.acl import test_acl +from will.abstractions import Event from multiprocessing import Process @@ -12,7 +15,71 @@ class ExecutionBackend(object): def handle_execution(self, message, context): raise NotImplemented - def execute(self, target, *args, **kwargs): + def no_response(self, message): + self.bot.pubsub.publish( + "message.no_response", + message.data, + reference_message=message.data.original_incoming_event + ) + + def not_allowed(self, message, explanation): + + self.bot.pubsub.publish( + "message.outgoing.%s" % message.data.backend, + Event( + type="reply", + content=explanation, + source_message=message, + ), + reference_message=message.data.original_incoming_event + ) + + def execute(self, message, option): + # TODO: Verify ACLs + acl = option.context["acl"] + if type(acl) == type("test"): + acl = [acl] + + allowed = True + if len(acl) > 0: + allowed = test_acl(message, acl) + + if not allowed: + acl_list = "" + more_than_one_s = "" + if len(acl) > 1: + more_than_one_s = "s" + for i in range(0, len(acl)): + if i == 0: + acl_list = "%s" % acl[i] + elif i == len(acl) - 1: + acl_list = "%s or %s" % (acl_list, acl[i]) + else: + acl_list = "%s, %s" % (acl_list, acl[i]) + explanation = "Sorry, but I don't have you listed in the %s group%s, which is required to do what you asked." % (acl_list, more_than_one_s) + + self.not_allowed( + message, + explanation + ) + else: + module = imp.load_source(option.context.plugin_info["parent_name"], option.context.plugin_info["parent_path"]) + cls = getattr(module, option.context.plugin_info["name"]) + + # TODO: Do we need self.bot? + # instantiated_module = cls(message=message, bot=self.bot) + instantiated_module = cls(message=message) + method = getattr(instantiated_module, option.context.function_name) + + thread_args = [message, ] + option.context["args"] + + self.run_execute( + method, + *thread_args, + **option.context.search_matches + ) + + def run_execute(self, target, *args, **kwargs): try: t = Process( target=target, diff --git a/will/backends/execution/best_score.py b/will/backends/execution/best_score.py index d8b8f183..c8b6a88d 100644 --- a/will/backends/execution/best_score.py +++ b/will/backends/execution/best_score.py @@ -13,25 +13,6 @@ class BestScoreBackend(ExecutionBackend): - def do_execute(self, message, option): - - # Question: do we need to do this via self.bot, or can we re-instantiate - # the execution thread (and in the process, magically provide/handle self.message)? - module = imp.load_source(option.context.plugin_info["parent_name"], option.context.plugin_info["parent_path"]) - cls = getattr(module, option.context.plugin_info["name"]) - # Do we need self.bot? - instantiated_module = cls(message=message, bot=self.bot) - method = getattr(instantiated_module, option.context.function_name) - - # live_listener = self.bot.message_listeners[option.context.full_method_name] - thread_args = [message, ] + option.context["args"] - - self.execute( - method, - *thread_args, - **option.context.search_matches - ) - def _publish_fingerprint(self, option, message): return "%s - %s" % (option.context.plugin_info["full_module_name"], option.context.full_method_name) @@ -55,20 +36,17 @@ def handle_execution(self, message): s = self._publish_fingerprint(m, message) if not s in published_list: published_list.append(s) - self.do_execute(message, m) + self.execute(message, m) had_one_reply = True + if not had_one_reply: - self.bot.pubsub.publish( - "message.no_response", - message.data, - reference_message=message.data.original_incoming_event - ) + self.no_response(message) return {} except: logging.critical( "Error running %s. \n\n%s\nContinuing...\n" % ( - m.context.full_method_name, + message, traceback.format_exc() ) ) diff --git a/will/backends/generation/fuzzy_all_matches.py b/will/backends/generation/fuzzy_all_matches.py index 5c1b8d63..55118a5c 100644 --- a/will/backends/generation/fuzzy_all_matches.py +++ b/will/backends/generation/fuzzy_all_matches.py @@ -67,63 +67,63 @@ def do_generate(self, event): message = event.data # TODO: add token_sort_ratio - - if not hasattr(self, "match_choices"): - self.match_choices = [] - self.match_methods = {} - for name, l in self.bot.message_listeners.items(): - if not l["regex_pattern"] in self.match_methods: - self.match_methods[l["regex_pattern"]] = l - self.match_choices.append(l["regex_pattern"]) - - search_matches = fuzz_process.extract(message.content, self.match_choices) - # logging.info("search_matches") - # logging.info(search_matches) - - for match_str, confidence in search_matches: - l = self.match_methods[match_str] - logging.info(" Match (%s) - %s" % ( - confidence, match_str)) - regex_matches = l["regex"].search(message.content) - if ( - # The search regex matches and - # regex_matches - - # We're confident enough - (confidence >= settings.FUZZY_MINIMUM_MATCH_CONFIDENCE) - - # It's not from me, or this search includes me, and - and ( - message.will_said_it is False or - ("include_me" in l and l["include_me"]) - ) - - # I'm mentioned, or this is an overheard, or we're in a 1-1 - and ( - message.is_private_chat or - ("direct_mentions_only" not in l or not l["direct_mentions_only"]) or - message.is_direct - ) - - # TODO: Get ACL working again. - # It's from admins only and sender is an admin, or it's not from admins only - # and ((l['admin_only'] and self.message_is_from_admin(msg)) or (not l['admin_only'])) - # # It's available only to the members of one or more ACLs, or no ACL in use - # and ((len(l['acl']) > 0 and self.message_is_allowed(msg, l['acl'])) or (len(l['acl']) == 0)) - ): - fuzzy_regex = self._generate_compiled_regex(l) - - regex_matches = fuzzy_regex.search(message.content) - context = Bunch() - for k, v in l.items(): - if k not in exclude_list: - context[k] = v - if regex_matches and hasattr(regex_matches, "groupdict"): - context.search_matches = regex_matches.groupdict() - else: - context.search_matches = {} - - o = GeneratedOption(context=context, backend="regex", score=confidence) - matches.append(o) + if message.content: + if not hasattr(self, "match_choices"): + self.match_choices = [] + self.match_methods = {} + for name, l in self.bot.message_listeners.items(): + if not l["regex_pattern"] in self.match_methods: + self.match_methods[l["regex_pattern"]] = l + self.match_choices.append(l["regex_pattern"]) + + search_matches = fuzz_process.extract(message.content, self.match_choices) + # logging.info("search_matches") + # logging.info(search_matches) + + for match_str, confidence in search_matches: + l = self.match_methods[match_str] + logging.info(" Match (%s) - %s" % ( + confidence, match_str)) + regex_matches = l["regex"].search(message.content) + if ( + # The search regex matches and + # regex_matches + + # We're confident enough + (confidence >= settings.FUZZY_MINIMUM_MATCH_CONFIDENCE) + + # It's not from me, or this search includes me, and + and ( + message.will_said_it is False or + ("include_me" in l and l["include_me"]) + ) + + # I'm mentioned, or this is an overheard, or we're in a 1-1 + and ( + message.is_private_chat or + ("direct_mentions_only" not in l or not l["direct_mentions_only"]) or + message.is_direct + ) + + # TODO: Get ACL working again. + # It's from admins only and sender is an admin, or it's not from admins only + # and ((l['admin_only'] and self.message_is_from_admin(msg)) or (not l['admin_only'])) + # # It's available only to the members of one or more ACLs, or no ACL in use + # and ((len(l['acl']) > 0 and self.message_is_allowed(msg, l['acl'])) or (len(l['acl']) == 0)) + ): + fuzzy_regex = self._generate_compiled_regex(l) + + regex_matches = fuzzy_regex.search(message.content) + context = Bunch() + for k, v in l.items(): + if k not in exclude_list: + context[k] = v + if regex_matches and hasattr(regex_matches, "groupdict"): + context.search_matches = regex_matches.groupdict() + else: + context.search_matches = {} + + o = GeneratedOption(context=context, backend="regex", score=confidence) + matches.append(o) return matches diff --git a/will/backends/generation/fuzzy_best_match.py b/will/backends/generation/fuzzy_best_match.py index 0c86d8af..ae98bb13 100644 --- a/will/backends/generation/fuzzy_best_match.py +++ b/will/backends/generation/fuzzy_best_match.py @@ -69,51 +69,52 @@ def do_generate(self, event): if not hasattr(self, "match_choices"): self.match_choices = [] self.match_methods = {} - for name, l in self.bot.message_listeners.items(): - if not l["regex_pattern"] in self.match_methods: - self.match_methods[l["regex_pattern"]] = l - self.match_choices.append(l["regex_pattern"]) - - match_str, confidence = fuzz_process.extractOne(message.content, self.match_choices) - l = self.match_methods[match_str] - if confidence >= settings.FUZZY_MINIMUM_MATCH_CONFIDENCE: - regex_matches = l["regex"].search(message.content) - if ( - # The search regex matches and - # regex_matches - - # It's not from me, or this search includes me, and - ( - message.will_said_it is False or - ("include_me" in l and l["include_me"]) - ) - - # I'm mentioned, or this is an overheard, or we're in a 1-1 - and ( - message.is_private_chat or - ("direct_mentions_only" not in l or not l["direct_mentions_only"]) or - message.is_direct - ) - - # TODO: Get ACL working again. - # It's from admins only and sender is an admin, or it's not from admins only - # and ((l['admin_only'] and self.message_is_from_admin(msg)) or (not l['admin_only'])) - # # It's available only to the members of one or more ACLs, or no ACL in use - # and ((len(l['acl']) > 0 and self.message_is_allowed(msg, l['acl'])) or (len(l['acl']) == 0)) - ): - fuzzy_regex = self._generate_compiled_regex(l) - - regex_matches = fuzzy_regex.search(message.content) - context = Bunch() - for k, v in l.items(): - if k not in exclude_list: - context[k] = v - if regex_matches and hasattr(regex_matches, "groupdict"): - context.search_matches = regex_matches.groupdict() - else: - context.search_matches = {} - - o = GeneratedOption(context=context, backend="regex", score=confidence) - matches.append(o) + if message.content: + for name, l in self.bot.message_listeners.items(): + if not l["regex_pattern"] in self.match_methods: + self.match_methods[l["regex_pattern"]] = l + self.match_choices.append(l["regex_pattern"]) + + match_str, confidence = fuzz_process.extractOne(message.content, self.match_choices) + l = self.match_methods[match_str] + if confidence >= settings.FUZZY_MINIMUM_MATCH_CONFIDENCE: + regex_matches = l["regex"].search(message.content) + if ( + # The search regex matches and + # regex_matches + + # It's not from me, or this search includes me, and + ( + message.will_said_it is False or + ("include_me" in l and l["include_me"]) + ) + + # I'm mentioned, or this is an overheard, or we're in a 1-1 + and ( + message.is_private_chat or + ("direct_mentions_only" not in l or not l["direct_mentions_only"]) or + message.is_direct + ) + + # TODO: Get ACL working again. + # It's from admins only and sender is an admin, or it's not from admins only + # and ((l['admin_only'] and self.message_is_from_admin(msg)) or (not l['admin_only'])) + # # It's available only to the members of one or more ACLs, or no ACL in use + # and ((len(l['acl']) > 0 and self.message_is_allowed(msg, l['acl'])) or (len(l['acl']) == 0)) + ): + fuzzy_regex = self._generate_compiled_regex(l) + + regex_matches = fuzzy_regex.search(message.content) + context = Bunch() + for k, v in l.items(): + if k not in exclude_list: + context[k] = v + if regex_matches and hasattr(regex_matches, "groupdict"): + context.search_matches = regex_matches.groupdict() + else: + context.search_matches = {} + + o = GeneratedOption(context=context, backend="regex", score=confidence) + matches.append(o) return matches diff --git a/will/backends/io_adapters/shell.py b/will/backends/io_adapters/shell.py index ecf58a4a..9b75e5b5 100644 --- a/will/backends/io_adapters/shell.py +++ b/will/backends/io_adapters/shell.py @@ -22,7 +22,7 @@ class ShellBackend(StdInOutIOBackend): internal_name = "will.backends.io_adapters.shell" partner = Person( id="you", - handle="you", + handle="shelluser", source=Bunch(), name="Friend", ) diff --git a/will/main.py b/will/main.py index f704805c..85b95f62 100644 --- a/will/main.py +++ b/will/main.py @@ -572,6 +572,7 @@ def bootstrap_event_handler(self): if event.type == "message.incoming": # A message just got dropped off one of the IO Backends. # Send it to analysis. + analysis_threads[event.original_incoming_event_hash] = { "count": 0, @@ -647,6 +648,18 @@ def bootstrap_event_handler(self): ) ) pass + elif event.type == "message.not_allowed": + logging.info("Publishing not allowed for %s" % (event.original_incoming_event_hash,)) + try: + self.publish("message.outgoing.%s" % event.data.backend, event) + except: + logging.critical( + "Error publishing not_allowed for %s. \n\n%s\nContinuing...\n" % ( + event.original_incoming_event_hash, + traceback.format_exc() + ) + ) + pass else: self.sleep_for_event_loop() # except KeyError: diff --git a/will/plugins/admin/storage.py b/will/plugins/admin/storage.py index 5ed78129..df91fa05 100644 --- a/will/plugins/admin/storage.py +++ b/will/plugins/admin/storage.py @@ -4,12 +4,12 @@ class StoragePlugin(WillPlugin): - @respond_to("^How big is the db?", admin_only=True) + @respond_to("^How big is the db?", acl=["admins"]) def db_size(self, message): self.bootstrap_storage() self.say("It's %s." % self.storage.size(), message=message) - @respond_to("^SERIOUSLY. Clear (?P.*)", case_sensitive=True, admin_only=True) + @respond_to("^SERIOUSLY. Clear (?P.*)", case_sensitive=True, acl=["admins"]) def clear_storage(self, message, key=None): if not key: self.say("Sorry, you didn't say what to clear.", message=message) @@ -19,7 +19,7 @@ def clear_storage(self, message, key=None): if res not in (None, True, False): self.say("Something happened while clearing: %s" % res, message=message) - @respond_to("^SERIOUSLY. REALLY. Clear all keys.$", case_sensitive=True, admin_only=True) + @respond_to("^SERIOUSLY. REALLY. Clear all keys.$", case_sensitive=True, acl=["admins"]) def clear_all_keys_listener(self, message): self.say( "Ok, I'm clearing them. You're probably going to want to restart me." @@ -29,7 +29,7 @@ def clear_all_keys_listener(self, message): if res not in (None, True, False): self.say("Something happened while clearing all keys: %s" % res, message=message) - @respond_to("^Show (?:me )?(?:the )?storage for (?P.*)", admin_only=True) + @respond_to("^Show (?:me )?(?:the )?storage for (?P.*)", acl=["admins"]) def show_storage(self, message, key=None): if not key: self.say("Not sure what you're looking for.", message=message) diff --git a/will/plugins/devops/emergency_contacts.py b/will/plugins/devops/emergency_contacts.py index b9f10be5..d890c61d 100644 --- a/will/plugins/devops/emergency_contacts.py +++ b/will/plugins/devops/emergency_contacts.py @@ -8,7 +8,7 @@ class EmergencyContactsPlugin(WillPlugin): def set_my_info(self, message, contact_info=""): """set my contact info to ____: Set your emergency contact info.""" contacts = self.load("contact_info", {}) - contacts[message.sender.nick] = { + contacts[message.sender.handle] = { "info": contact_info, "name": message.sender.name, } diff --git a/will/plugins/friendly/mornin.py b/will/plugins/friendly/mornin.py index 80bbce62..3cfbfb33 100644 --- a/will/plugins/friendly/mornin.py +++ b/will/plugins/friendly/mornin.py @@ -7,7 +7,7 @@ class MorninEveninPlugin(WillPlugin): @hear("^(good )?(morning?)") def morning(self, message): - self.say("mornin', %s" % message.sender.nick, message=message) + self.say("mornin', %s" % message.sender.handle, message=message) @hear("^(good ?|g')?('?night)") def good_night(self, message): diff --git a/will/plugins/help/help.py b/will/plugins/help/help.py index f8fa760a..df9d50db 100644 --- a/will/plugins/help/help.py +++ b/will/plugins/help/help.py @@ -10,7 +10,7 @@ def help(self, message, plugin=None): # help_data = self.load("help_files") selected_modules = help_modules = self.load("help_modules") - self.say("Sure thing, %s." % message.sender.nick) + self.say("Sure thing, %s." % message.sender.handle) help_text = "Here's what I know how to do:" if plugin and plugin in help_modules: diff --git a/will/plugins/productivity/remind.py b/will/plugins/productivity/remind.py index a83351d7..5bf715d4 100644 --- a/will/plugins/productivity/remind.py +++ b/will/plugins/productivity/remind.py @@ -11,7 +11,7 @@ def remind_me_at(self, message, reminder_text=None, remind_time=None): natural_datetime = self.to_natural_day_and_time(parsed_time) formatted_reminder_text = "@%(from_handle)s, you asked me to remind you %(reminder_text)s" % { - "from_handle": message.sender.nick, + "from_handle": message.sender.handle, "reminder_text": reminder_text, } self.schedule_say(formatted_reminder_text, parsed_time, message=message) @@ -26,7 +26,7 @@ def remind_somebody_at(self, message, reminder_recipient=None, reminder_text=Non formatted_reminder_text = \ "@%(reminder_recipient)s, %(from_handle)s asked me to remind you %(reminder_text)s" % { "reminder_recipient": reminder_recipient, - "from_handle": message.sender.nick, + "from_handle": message.sender.handle, "reminder_text": reminder_text, } diff --git a/will/settings.py b/will/settings.py index c20913cb..d4d0fb13 100644 --- a/will/settings.py +++ b/will/settings.py @@ -211,6 +211,13 @@ def import_settings(quiet=True): if "WILL_ADMINS" in os.environ: settings["ADMINS"] = [a.strip().lower() for a in settings.get('ADMINS', '').split(';') if a.strip()] + if "ADMINS" in settings and settings["ADMINS"] != "*": + warn("ADMINS is now deprecated, and will be removed at the end of 2017. Please use ACL instead. See below for details") + note("Change your config.py to:\n ACL = {\n 'admins': %s\n }" % settings["ADMINS"]) + + if "DISABLE_ACL" not in settings: + settings["DISABLE_ACL"] = False + if "PROXY_URL" in settings: parsed_proxy_url = parse.urlparse(settings["PROXY_URL"]) settings["USE_PROXY"] = True @@ -225,13 +232,14 @@ def import_settings(quiet=True): settings["EVENT_LOOP_INTERVAL"] = 0.025 if "SECRET_KEY" not in settings: - note( - "No SECRET_KEY specified. Auto-generating one specific to this run of Will.\n" + - " Know that will won't be able to catch up on old messages or work in a multicomponent install without one." - ) - settings["SECRET_KEY"] = uuid.uuid4().hex - os.environ["WILL_SECRET_KEY"] = settings["SECRET_KEY"] - os.environ["WILL_EPHEMERAL_SECRET_KEY"] = "True" + if not quiet: + note( + "No SECRET_KEY specified. Auto-generating one specific to this run of Will.\n" + + " Know that will won't be able to catch up on old messages or work in a multicomponent install without one." + ) + settings["SECRET_KEY"] = uuid.uuid4().hex + os.environ["WILL_SECRET_KEY"] = settings["SECRET_KEY"] + os.environ["WILL_EPHEMERAL_SECRET_KEY"] = "True" # Set them in the module namespace for k in sorted(settings, key=lambda x: x[0]): From f11a4dcee480b4073ac09f716da5a9b547c8e6f9 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 18 Oct 2017 19:14:34 +1300 Subject: [PATCH 025/200] Detects and auto-moves config.py.dist to config.py --- config.py.dist | 240 +++++++++++++++++++++++++++++++++++++++++++++++ will/main.py | 8 +- will/settings.py | 24 ++++- 3 files changed, 268 insertions(+), 4 deletions(-) create mode 100644 config.py.dist diff --git a/config.py.dist b/config.py.dist new file mode 100644 index 00000000..a64985bd --- /dev/null +++ b/config.py.dist @@ -0,0 +1,240 @@ +# Welcome to Will's settings. +# + +# Config and the environment: +# --------------------------- +# Will can use settings from the environment or this file, and sets reasonable defaults. +# +# Best practices: set keys and the like in the environment, and anything you'd be ok +# with other people knowing in this file. +# +# To specify in the environment, just prefix with WILL_ +# (i.e. WILL_DEFAULT_ROOM becomes DEFAULT_ROOM). +# In case of conflict, you will see a warning message, and the value in this file will win. + +# ------------------------------------------------------------------------------------ +# Required settings +# ------------------------------------------------------------------------------------ + +# The list of plugin modules will should load. +# Will recursively loads all plugins contained in each module. + + +# This list can contain: +# +# Built-in core plugins: +# ---------------------- +# All built-in modules: will.plugins +# Built-in modules: will.plugins.module_name +# Specific plugins: will.plugins.module_name.plugin +# +# Plugins in your will: +# ---------------------- +# All modules: plugins +# A specific module: plugins.module_name +# Specific plugins: plugins.module_name.plugin +# +# Plugins anywhere else on your PYTHONPATH: +# ----------------------------------------- +# All modules: someapp +# A specific module: someapp.module_name +# Specific plugins: someapp.module_name.plugin + + +# By default, the list below includes all the core will plugins and +# all your project's plugins. + +PLUGINS = [ + # Built-ins + "will.plugins.admin", + "will.plugins.chat_room", + "will.plugins.devops", + "will.plugins.friendly", + "will.plugins.fun", + "will.plugins.help", + "will.plugins.productivity", + "will.plugins.web", + + # All plugins in your project. + "plugins", +] + +# Don't load any of the plugins in this list. Same options as above. +PLUGIN_BLACKLIST = [ + "will.plugins.productivity.hangout", # Because it requires a HANGOUT_URL + "will.plugins.productivity.bitly", # Because it requires a BITLY_ACCESS_TOKEN key and the bitly_api library + "will.plugins.devops.bitbucket_is_up", # Because most folks use github. + "will.plugins.devops.pagerduty", # Because it requires a PAGERDUTY_SUBDOMAIN and PAGERDUTY_API_KEY key +] + +# ------------------------------------------------------------------------------------ +# Platform and Decision-making +# ------------------------------------------------------------------------------------ + +# Platforms and mediums messages can come in and go out on. +IO_BACKENDS = [ + # "will.backends.io_adapters.hipchat", + # "will.backends.io_adapters.rocketchat", + "will.backends.io_adapters.shell", + "will.backends.io_adapters.slack", +] + +# Backends to analyze messages and generate useful metadata +ANALYZE_BACKENDS = [ + "will.backends.analysis.nothing", + "will.backends.analysis.history", +] + +# Backends to generate possible actions, and metadata about them. +GENERATION_BACKENDS = [ + # "will.backends.generation.fuzzy_best_match", + "will.backends.generation.fuzzy_all_matches", + "will.backends.generation.strict_regex", +] + +# The "decision making" backends that look among the generated choices, +# and decide which to follow. Backends are executed in order, and any +# backend can stop further evaluation. +EXECUTION_BACKENDS = [ + "will.backends.execution.best_score", + # "will.backends.execution.all", +] + +# ------------------------------------------------------------------------------------ +# Backend-specific settings +# ------------------------------------------------------------------------------------ + +# Confidence fuzzy generation backends require before Will responds +# https://pypi.python.org/pypi/fuzzywuzzy +FUZZY_MINIMUM_MATCH_CONFIDENCE = 90 +FUZZY_REGEX_ALLOWABLE_ERRORS = 3 + + +# ------------------------------------------------------------------------------------ +# Hipchat settings +# ------------------------------------------------------------------------------------ + +# Ideally, set these in the environment with the WILL_ prefix. +# HIPCHAT_HANDLE = 'will' + + +# ------------------------------------------------------------------------------------ +# Slack settings +# ------------------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------------------ +# Rocket.chat settings +# ------------------------------------------------------------------------------------ + +# ------------------------------------------------------------------------------------ +# Potentially required settings +# ------------------------------------------------------------------------------------ + +# If will isn't accessible at localhost, you must set this for his keepalive to work. +# Note no trailing slash. +# PUBLIC_URL = "http://my-will.herokuapp.com" + +# Port to bind the web server to (defaults to $PORT, then 80.) +# Set > 1024 to run without elevated permission. +# HTTPSERVER_PORT = "9000" + +# ------------------------------------------------------------------------------------ +# Optional settings +# ------------------------------------------------------------------------------------ + +# The list of rooms will should join. Default is all rooms. +# TODO: Appears to be Hipchat-specific, should be renamed or +# deprecated. +# ROOMS = ['Will Testing', ] + +# The maximum number of milliseconds to wait for an analysis backend to finish +# ANALYSIS_TIMEOUT_MS = 2000 + +# The maximum number of milliseconds to wait for a generation backend to finish +# GENERATION_TIMEOUT_MS = 2000 + +# The interval will checks his internal cross-thread messaging queues, in seconds. +# Increasing the value will make will slower, but consume fewer resources. +# EVENT_LOOP_INTERVAL = 0.025 + +# The backend and room will will talk to if the trigger is a webhook and he isn't told +# a specific one. Default is the first of IO_BACKENDS and ROOMS. +# DEFAULT_BACKEND = "will.backends.io_adapters.hipchat" +# DEFAULT_ROOM = 'Testing, Will Kahuna' + + +# A secret key, used to namespace this instance of will and secure pubsub contents. +# Do *NOT* keep it in config.py. *DO* set it in the environment, in a secured session. +# If a SECRET_KEY is not set, one will be auto-generated, but will limit Will to reading +# data from this excecution only. +# SECRET_KEY = "DXQnJ2eHD6k2w3DvBTstN6kw9d9N4CeCLbjoK" + + +# Turn up or down Will's logging level +# LOGLEVEL = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL +LOGLEVEL = "WARNING" +# LOGLEVEL = "INFO" + +# Turn on or off Will's profiling +# PROFILING_ENABLED = False + +# Fully-qualified folders to look for templates in, beyond the two that +# are always included: core will's templates folder, your project's templates folder, and +# all templates folders in included plugins, if they exist. +# +# TEMPLATE_DIRS = [ +# os.path.abspath("other_folder/templates") +# ] + + +# Access Control: Specify groups of users to be used in the acl=["admins","ceos"] parameter +# in respond_to and hear actions. +# Group names can be any string, and the list is composed of user handles. +# ACL = { +# "admins": ["sarah", "sue", "steven"] +# } +# +# By default, if no ACL is set, all users can perform all actions - but warnings +# will be printed to the console. To disable those warnings, set DISABLE_ACL to True +# DISABLE_ACL = False + +# Sets a different storage backend. If unset, defaults to redis. +# If you use a different backend, make sure to add their required settings. +# STORAGE_BACKEND = "redis" # "redis", "couchbase", or "file". + + +# Sets a different storage backend. If unset, defaults to redis. +# If you use a different backend, make sure to add their required settings. +# PUBSUB_BACKEND = "zeromq" # "redis", or "zeromq" (beta). +# ZEROMQ_URL = "tcp://127.0.0.1:15555" + + +# Rocket.Chat server URL and port as necessary +# ROCKETCHAT_URL = "http://localhost:3000" + + +# Disable Hipchat SSL checks. Strongly reccomended this is not set to True. +# ALLOW_INSECURE_HIPCHAT_SERVER = False + +# Turn on/off encryption in the pub/sub layer (default is on). +# Causes a small speed bump, but secures messages in an untrusted environment. +# ENABLE_INTERNAL_ENCRYPTION = False + +# Mailgun config, if you'd like will to send emails. +# DEFAULT_FROM_EMAIL="will@example.com" +# Set in your environment: +# export WILL_MAILGUN_API_KEY="key-12398912329381" +# export WILL_MAILGUN_API_URL="example.com" + + +# Proxy settings +# Use proxy to access hipchat servers +# Make sure your proxy allows CONNECT method to port 5222 +# PROXY_URL = "http://user:pass@corpproxy.example.com:3128" +# or +# PROXY_URL = "http://myproxy:80 + +# Google Application key for "image me" command +# GOOGLE_API_KEY = "FILL THIS IN" +# GOOGLE_CUSTOM_SEARCH_ENGINE_ID = "FILL THIS IN" diff --git a/will/main.py b/will/main.py index 85b95f62..e2b16715 100644 --- a/will/main.py +++ b/will/main.py @@ -79,8 +79,12 @@ def __init__(self, **kwargs): self.exiting = False # Find all the PLUGINS modules - plugins = settings.PLUGINS - self.plugins_dirs = {} + try: + plugins = settings.PLUGINS + self.plugins_dirs = {} + except: + # We're missing settings. They handle that. + sys.exit(1) # Set template dirs. full_path_template_dirs = [] diff --git a/will/settings.py b/will/settings.py index d4d0fb13..b9ce2e51 100644 --- a/will/settings.py +++ b/will/settings.py @@ -1,8 +1,10 @@ import os +import sys import uuid from will.utils import show_valid, warn, note, error from clint.textui import puts, indent from six.moves.urllib import parse +from six.moves import input def import_settings(quiet=True): @@ -51,7 +53,25 @@ def import_settings(quiet=True): with indent(2): try: had_warning = False - import config + try: + import config + except ImportError: + # Missing config.py. Check for config.py.dist + if os.path.isfile("config.py.dist"): + confirm = input( + "Hi, looks like you're just starting up!\nI didn't find a config.py, but I do see config.py.dist here. Want me to use that? (y/n) " + ).lower() + if confirm in ["y", "yes"]: + print("Great! One moment.\n\n") + os.rename("config.py.dist", "config.py") + import config + else: + print("Ok. I can't start without one though. Quitting now!") + sys.exit(1) + else: + error("I'm missing my config.py file. Usually one comes with the installation - maybe it got lost?") + sys.exit(1) + for k, v in config.__dict__.items(): # Ignore private variables if "__" not in k: @@ -73,7 +93,7 @@ def import_settings(quiet=True): puts("Verifying settings... ") with indent(2): - # Deprecation and backwards-compatability for Will 1.x-> 2.x + # Deprecation and backwards-compatibility for Will 1.x-> 2.x DEPRECATED_BUT_MAPPED_SETTINGS = { "USERNAME": "HIPCHAT_USERNAME", "PASSWORD": "HIPCHAT_PASSWORD", From 534bf9ba939d8271e1b8f2a690be015fa7734306 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 18 Oct 2017 20:07:54 +1300 Subject: [PATCH 026/200] Daaaamn. Will now auto-tracks replies. Simple as self.reply("Oh, hi!") --- will/abstractions.py | 4 +++ will/plugin.py | 56 ++++++++++++++++++++-------------- will/plugins/friendly/hello.py | 4 +-- 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/will/abstractions.py b/will/abstractions.py index 09fc7a25..206866d3 100644 --- a/will/abstractions.py +++ b/will/abstractions.py @@ -8,6 +8,7 @@ class Message(object): + will_internal_type = "Message" REQUIRED_FIELDS = [ "is_direct", "is_private_chat", @@ -72,6 +73,7 @@ def _clean_message_content(self, s): class Event(Bunch): + will_internal_type = "Event" REQUIRED_FIELDS = [ "type", @@ -104,6 +106,7 @@ def __init__(self, *args, **kwargs): class Person(Bunch): will_is_person = True + will_internal_type = "Person" REQUIRED_FIELDS = [ "id", "handle", @@ -142,6 +145,7 @@ def nick(self): class Channel(Bunch): + will_internal_type = "Channel" REQUIRED_FIELDS = [ "id", "name", diff --git a/will/plugin.py b/will/plugin.py index 4b32a544..db9d5558 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -109,7 +109,39 @@ def say(self, content, message=None, room=None, card=None, **kwargs): # sender = message.sender # self.send_direct_message(sender["hipchat_id"], content, **kwargs) - def reply(self, event, content, **kwargs): + def reply(self, event, content=None, **kwargs): + # Be really smart about what we're getting back. + if ( + ( + (event and hasattr(event, "will_internal_type") and event.will_internal_type == "Message") or + (event and hasattr(event, "will_internal_type") and event.will_internal_type == "Event") + ) and type(content) == type("words") + ): + # 1.x world - user passed a message and a string. Keep rolling. + pass + elif ( + ( + (content and hasattr(content, "will_internal_type") and content.will_internal_type == "Message") or + (content and hasattr(content, "will_internal_type") and content.will_internal_type == "Event") + ) and type(event) == type("words") + ): + # User passed the string and message object backwards, and we're in a 1.x world + temp_content = content + content = event + event = temp_content + del temp_content + elif ( + type(event) == type("words") and + not content + ): + # We're in the Will 2.0 automagic event finding. + content = event + event = self.message + + else: + # Who knows what happened. Let it blow up. + pass + # Be smart about backend. message = event.data @@ -121,28 +153,6 @@ def reply(self, event, content, **kwargs): kwargs=kwargs, )) - # # Valid kwargs: - # # color: yellow, red, green, purple, gray, random. Default is green. - # # html: Display HTML or not. Default is False - # # notify: Ping everyone. Default is False - # content = self._prepared_content(content, message, kwargs) - # if message is None or message["type"] == "groupchat": - # # Reply, speaking to the room. - # try: - # content = "@%s %s" % (message.sender["nick"], content) - # except TypeError: - # content = "%s\nNote: I was told to reply, but this message didn't come from a person!" % (content,) - - # self.say(content, message=message, **kwargs) - - # elif message['type'] in ('chat', 'normal'): - # # Reply to the user (1-1 chat) - # if "sender" in message: - # sender = message["sender"] - # else: - # sender = message.sender - # self.send_direct_message(sender["hipchat_id"], content, **kwargs) - def set_topic(self, topic, message=None, room=None): if message is None or message["type"] == "groupchat": diff --git a/will/plugins/friendly/hello.py b/will/plugins/friendly/hello.py index 89f9f288..fc96491a 100644 --- a/will/plugins/friendly/hello.py +++ b/will/plugins/friendly/hello.py @@ -7,8 +7,8 @@ class HelloPlugin(WillPlugin): @respond_to("^hi|hey$") def hi(self, message): """hi: I know how to say hello!""" - self.reply(message, "hello!") + self.reply("hello!") @respond_to("^hello$") def hello(self, message): - self.reply(message, "hi!") + self.reply("hi!") From 6e3774079983505912a9cbe4dc9fbfd0a12c28eb Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 18 Oct 2017 20:13:19 +1300 Subject: [PATCH 027/200] Wipes all the old .reply(message, "actual reply") syntax out of the built-ins :) --- docs/improve.md | 1 + docs/plugins/basics.md | 2 +- docs/plugins/builtins.md | 8 ++++---- docs/plugins/create.md | 2 +- docs/plugins/reply.md | 15 +++++---------- will/plugins/admin/ping.py | 4 ++-- will/plugins/devops/pagerduty.py | 22 +++++++++++----------- will/plugins/friendly/bonjour.py | 2 +- will/plugins/friendly/talk_back.py | 2 +- will/plugins/friendly/thanks.py | 2 +- will/plugins/web/home.py | 2 +- will/scripts/generate_will_project.py | 2 +- 12 files changed, 30 insertions(+), 34 deletions(-) diff --git a/docs/improve.md b/docs/improve.md index cbdb4b21..4a38717b 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -164,6 +164,7 @@ Here's what's new: This release also changes a few bits of behavior, to be consistent: +- `self.reply()` *finally* no longer requires you to tediously pass the `message` back to it. It's also smart, and backwards compatable with existing plugins. - `admin_only` is explicitly flagged for deprecation and removal, to be replaced by the ACL system introduced in 2015 (largely, this is because having two different access control systems is crazy and painful.) Switching is as easy as adding `ACL = {'admins': ['steven', 'will']}` to your config.py and find/replacing `admin_only=True` with `acl=['admins',] in your codebase. For now, Will handles backwards compatability by mapping the old settings into the new places, but he won't forever. Thanks for updating, and making ongoing maintenence simpler! - If no ACLs are specified and users try to perform restricted commands, they'll be allowed as before, but Will will complain to the console. A new `DISABLE_ACL` setting has been added to turn off the complaining. diff --git a/docs/plugins/basics.md b/docs/plugins/basics.md index bb1cc385..33de941b 100644 --- a/docs/plugins/basics.md +++ b/docs/plugins/basics.md @@ -37,7 +37,7 @@ class BonjourPlugin(WillPlugin): @respond_to("bonjour") def say_bonjour_will(self, message): """bonjour: I know how to say bonjour! In French!""" - self.reply(message, "bonjour!") + self.reply("bonjour!") ``` diff --git a/docs/plugins/builtins.md b/docs/plugins/builtins.md index 01fe177a..8cb5f0d2 100644 --- a/docs/plugins/builtins.md +++ b/docs/plugins/builtins.md @@ -72,7 +72,7 @@ class BonjourPlugin(WillPlugin): @respond_to("bonjour") def say_bonjour_will(self, message): """bonjour: I know how to say bonjour! In French!""" - self.reply(message, "bonjour!") + self.reply("bonjour!") ``` ![Bonjour help](../img/bonjour_help.gif) @@ -145,7 +145,7 @@ class BonjourPlugin(WillPlugin): @respond_to("bonjour") def say_bonjour_will(self, message): - self.reply(message, settings.HELLO_MESSAGE) + self.reply(settings.HELLO_MESSAGE) ``` You can also mark one or more settings as required for your plugin with the `require_settings` decorator, and they'll be checked on startup. @@ -158,7 +158,7 @@ class BonjourPlugin(WillPlugin): @require_settings("HELLO_MESSAGE", "ANOTHER_SETTING") @respond_to("bonjour") def say_bonjour_will(self, message): - self.reply(message, settings.HELLO_MESSAGE) + self.reply(settings.HELLO_MESSAGE) ``` When will starts up, he'll make sure they've been set: @@ -177,7 +177,7 @@ class HistoryPlugin(WillPlugin): @respond_to("^get last message") def get_history(self, message): room = self.get_room_from_message(message) - self.reply(message, room.history[-1]["message"]) + self.reply(room.history[-1]["message"]) ``` `.history` is pretty much what's returned from the [HipChat room history API](https://www.hipchat.com/docs/apiv2/method/view_room_history) - the lone exception is that the date has been converted to a python datetime. diff --git a/docs/plugins/create.md b/docs/plugins/create.md index 1d507ccb..d4288176 100644 --- a/docs/plugins/create.md +++ b/docs/plugins/create.md @@ -74,7 +74,7 @@ class PingPlugin(WillPlugin): @respond_to("^ping$") def ping(self, message): - self.reply(message, "PONG") + self.reply("PONG") ``` diff --git a/docs/plugins/reply.md b/docs/plugins/reply.md index 23745948..3f144b25 100644 --- a/docs/plugins/reply.md +++ b/docs/plugins/reply.md @@ -11,21 +11,18 @@ Like any normal person, will can talk to the chat room, or in 1-1 chats. To tal @respond_to("bonjour") def say_bonjour_will(self, message): # Awesome stuff - self.say("Bonjour!", message=message) + self.say("Bonjour!") ``` ![Bonjour!](../img/only_bonjour.gif) -Note that we pass `messsage` along. This allows will to route his reply to the correct room. Without it, he'll just speak to the `DEFAULT_ROOM`. - `say()` comes with a number of options, including color, html, and ping notify. ```python -self.say(content, message=None, room=None, html=False, color="green", notify=False) +self.say(content, room=None, html=False, color="green", notify=False) ``` - **`content`**: the content you want to send to the room. Any string will do, HTML or plain text. -- **`message`**: (optional) The incoming message object - **`room`**: (optional) The room object (from self.available_rooms) to send the message to. - **`html`**: if the message is HTML. `True` or `False`. - **`color`**: (chat room only) the hipchat color to send. "yellow", "red", "green", "purple", "gray", or "random". Default is "green". @@ -38,18 +35,16 @@ Sometimes you want will to ping you - that's where @name mentions are great. To ```python @respond_to("^hi") # Basic def hi(self, message): - self.reply(message, "hello, %s!" % message.sender.handle) + self.reply("hello, %s!" % message.sender.handle) ``` ![Hi, Hello, username!](../img/hi_hello.gif) -Note the order of arguments is different here, and `messsage` is required. All the options: +All the options: ```python -self.reply(message, content, html=False, color="green", notify=False) +self.reply(content, html=False, color="green", notify=False) ``` - -- **`message`**: The incoming message object. Required - **`content`**: the content you want to send to the room. HTML or plain text. - **`html`**: if the message is HTML. `True` or `False`. - **`color`**: (chat room only) the hipchat color to send. "yellow", "red", "green", "purple", "gray", or "random". Default is "green". diff --git a/will/plugins/admin/ping.py b/will/plugins/admin/ping.py index e2e627f7..96630dd1 100644 --- a/will/plugins/admin/ping.py +++ b/will/plugins/admin/ping.py @@ -6,8 +6,8 @@ class PingPlugin(WillPlugin): @respond_to("^ping$") def ping(self, message): - self.reply(message, "PONG") + self.reply("PONG") @respond_to("^pong$") def pong(self, message): - self.reply(message, "PING") + self.reply("PING") diff --git a/will/plugins/devops/pagerduty.py b/will/plugins/devops/pagerduty.py index 610d017f..67d807dd 100644 --- a/will/plugins/devops/pagerduty.py +++ b/will/plugins/devops/pagerduty.py @@ -29,7 +29,7 @@ def _update_incident(self, message, incidents, action, assign_to_email=None): email_address = self.get_user(message.sender['hipchat_id'])['email'] user = self._associate_pd_user(email_address, pager) if user is None: - self.reply(message, "I couldn't find your user :(") + self.reply("I couldn't find your user :(") return # if incident(s) are given @@ -40,28 +40,28 @@ def _update_incident(self, message, incidents, action, assign_to_email=None): incident = pager.incidents.show(entity_id=i) except pygerduty.BadRequest as e: if e.code == 5001: - self.reply(message, "Incident %s was not found." % i, color="yellow") + self.reply("Incident %s was not found." % i, color="yellow") continue if action == 'ack': try: incident.acknowledge(requester_id=user.id) except pygerduty.BadRequest as e: if e.code == 1001: - self.reply(message, "%s has been already resolved." % i, color="yellow") + self.reply("%s has been already resolved." % i, color="yellow") continue elif action == 'resolve': try: incident.resolve(requester_id=user.id) except pygerduty.BadRequest as e: if e.code == 1001: - self.reply(message, "%s has been already resolved." % i, color="yellow") + self.reply("%s has been already resolved." % i, color="yellow") continue elif action == 'reassign': try: if assign_to_email is not None: assign_to = self._associate_pd_user(assign_to_email, pager) if assign_to is None: - self.reply(message, "Coudn't find the PD user for %s :(" % assign_to_email) + self.reply("Coudn't find the PD user for %s :(" % assign_to_email) return else: incident.reassign(user_ids=[assign_to.id], requester_id=user.id) @@ -69,7 +69,7 @@ def _update_incident(self, message, incidents, action, assign_to_email=None): # ignore any error, maybe it worth to log it somewhere # in the future continue - self.reply(message, "Ok.") + self.reply("Ok.") # if incident(s) are not given else: try: @@ -89,7 +89,7 @@ def _update_incident(self, message, incidents, action, assign_to_email=None): elif action == 'resolve_all': for incident in pager.incidents.list(status='acknowledged'): incident.resolve(requester_id=user.id) - self.reply(message, "Ok.") + self.reply("Ok.") except pygerduty.BadRequest: # ignore any error, might be acked/resolved pass @@ -134,7 +134,7 @@ def set_service_maintenance(self, message, service_name=None, interval=None): if service.name == service_name: user = self._associate_pd_user(self.get_user(message.sender['hipchat_id'])['email'], pager) if user is None: - self.reply(message, "I couldn't find your user :(", color="yellow") + self.reply("I couldn't find your user :(", color="yellow") return now = datetime.datetime.utcnow() start_time = now.strftime("%Y-%m-%dT%H:%MZ") @@ -143,9 +143,9 @@ def set_service_maintenance(self, message, service_name=None, interval=None): pager.maintenance_windows.create(service_ids=[service.id], requester_id=user.id, start_time=start_time, end_time=end_time) - self.reply(message, "Ok.") + self.reply("Ok.") except pygerduty.BadRequest as e: - self.reply(message, "Failed: %s" % e.message, color="yellow") + self.reply("Failed: %s" % e.message, color="yellow") @respond_to("^pd reassign (?P[0-9 ]+)( )(?P[a-zA-Z@]+)$") def reassign_incidents(self, message, incidents, mention_name): @@ -153,4 +153,4 @@ def reassign_incidents(self, message, incidents, mention_name): if email_address: self._update_incident(message, incidents.split(" "), 'reassign', email_address) else: - self.reply(message, "Can't find email address for %s" % mention_name) + self.reply("Can't find email address for %s" % mention_name) diff --git a/will/plugins/friendly/bonjour.py b/will/plugins/friendly/bonjour.py index 45b3b8c9..d2bea794 100644 --- a/will/plugins/friendly/bonjour.py +++ b/will/plugins/friendly/bonjour.py @@ -8,4 +8,4 @@ class BonjourPlugin(WillPlugin): @respond_to("^bonjour$") def bonjour(self, message): """bonjour: Je parle un petit français aussi!""" - self.reply(message, "bonjour!") + self.reply("bonjour!") diff --git a/will/plugins/friendly/talk_back.py b/will/plugins/friendly/talk_back.py index 63a08d6f..78802029 100644 --- a/will/plugins/friendly/talk_back.py +++ b/will/plugins/friendly/talk_back.py @@ -36,4 +36,4 @@ def talk_back(self, message): """that's what she said: Tells you some things she actually said. :)""" quote = self.get_quote() if quote: - self.reply(message, "Actually, she said things like this: \n%s" % quote) + self.reply("Actually, she said things like this: \n%s" % quote) diff --git a/will/plugins/friendly/thanks.py b/will/plugins/friendly/thanks.py index f9516982..cd1cf356 100644 --- a/will/plugins/friendly/thanks.py +++ b/will/plugins/friendly/thanks.py @@ -6,7 +6,7 @@ class ThanksPlugin(WillPlugin): @respond_to("^(?:thanks|thank you|tx|thx|ty|tyvm)") def respond_to_thanks(self, message): - self.reply(message, "You're welcome!") + self.reply("You're welcome!") @hear("(thanks|thank you|tx|thx|ty|tyvm),? (will|william)") def hear_thanks(self, message): diff --git a/will/plugins/web/home.py b/will/plugins/web/home.py index 24e38d58..3708d100 100644 --- a/will/plugins/web/home.py +++ b/will/plugins/web/home.py @@ -12,4 +12,4 @@ def homepage_listener(self): @respond_to("(what is|what's) your (website|url)") def what_is_website(self, message): - self.reply(message, "It's %s" % settings.PUBLIC_URL) + self.reply("It's %s" % settings.PUBLIC_URL) diff --git a/will/scripts/generate_will_project.py b/will/scripts/generate_will_project.py index 7db5523d..18dc8c33 100644 --- a/will/scripts/generate_will_project.py +++ b/will/scripts/generate_will_project.py @@ -63,7 +63,7 @@ class MorningPlugin(WillPlugin): @respond_to("^good morning") def good_morning(self, message): - self.reply(message, "oh, g'morning!") + self.reply("oh, g'morning!") """) print(" /templates") From ca22f97ea6616f633a962dcc030685c39a5f1e1f Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 18 Oct 2017 20:38:55 +1300 Subject: [PATCH 028/200] Moves Roster to HipchatRoster, provides defaults for WILL_HANDLE, cleans things up. --- config.py | 4 ++ config.py.dist | 3 - will/backends/generation/fuzzy_all_matches.py | 14 ---- will/backends/generation/fuzzy_best_match.py | 13 ---- will/backends/io_adapters/hipchat.py | 67 ++++++++++++++++++- will/main.py | 2 +- will/mixins/__init__.py | 2 +- will/mixins/roster.py | 65 +----------------- will/plugin.py | 5 +- will/settings.py | 12 ++++ 10 files changed, 86 insertions(+), 101 deletions(-) diff --git a/config.py b/config.py index a64985bd..76fc6b9a 100644 --- a/config.py +++ b/config.py @@ -139,6 +139,10 @@ # Set > 1024 to run without elevated permission. # HTTPSERVER_PORT = "9000" +# Your will's mention handle. (aka @will) Note that this is not backend-specific, +# and is only used for the generation of help text. +# WILL_HANDLE = "will" + # ------------------------------------------------------------------------------------ # Optional settings # ------------------------------------------------------------------------------------ diff --git a/config.py.dist b/config.py.dist index a64985bd..bc18fbee 100644 --- a/config.py.dist +++ b/config.py.dist @@ -114,9 +114,6 @@ FUZZY_REGEX_ALLOWABLE_ERRORS = 3 # Hipchat settings # ------------------------------------------------------------------------------------ -# Ideally, set these in the environment with the WILL_ prefix. -# HIPCHAT_HANDLE = 'will' - # ------------------------------------------------------------------------------------ # Slack settings diff --git a/will/backends/generation/fuzzy_all_matches.py b/will/backends/generation/fuzzy_all_matches.py index 55118a5c..d6f53df7 100644 --- a/will/backends/generation/fuzzy_all_matches.py +++ b/will/backends/generation/fuzzy_all_matches.py @@ -20,20 +20,6 @@ def _generate_compiled_regex(self, method_meta): regex_string = method_meta["regex_pattern"] if "case_sensitive" in method_meta and not method_meta["case_sensitive"]: regex_string = "(?i)%s" % regex_string - help_regex = method_meta["regex_pattern"] - if method_meta["direct_mentions_only"]: - help_regex = "@%s %s" % ( - settings.HIPCHAT_HANDLE, help_regex) - # self.all_listener_regexes.append(help_regex) - # if method_meta["__doc__"]: - # pht = plugin_info.get("parent_help_text", None) - # if pht: - # if pht in self.help_modules: - # self.help_modules[pht].append(method_meta["__doc__"]) - # else: - # self.help_modules[pht] = [method_meta["__doc__"]] - # else: - # self.help_modules[OTHER_HELP_HEADING].append(method_meta["__doc__"]) if method_meta["multiline"]: try: diff --git a/will/backends/generation/fuzzy_best_match.py b/will/backends/generation/fuzzy_best_match.py index ae98bb13..9ddc36fc 100644 --- a/will/backends/generation/fuzzy_best_match.py +++ b/will/backends/generation/fuzzy_best_match.py @@ -19,19 +19,6 @@ def _generate_compiled_regex(self, method_meta): regex_string = method_meta["regex_pattern"] if "case_sensitive" in method_meta and not method_meta["case_sensitive"]: regex_string = "(?i)%s" % regex_string - # help_regex = method_meta["regex_pattern"] - # if method_meta["direct_mentions_only"]: - # help_regex = "@%s %s" % (settings.HIPCHAT_HANDLE, help_regex) - # self.all_listener_regexes.append(help_regex) - # if method_meta["__doc__"]: - # pht = plugin_info.get("parent_help_text", None) - # if pht: - # if pht in self.help_modules: - # self.help_modules[pht].append(method_meta["__doc__"]) - # else: - # self.help_modules[pht] = [method_meta["__doc__"]] - # else: - # self.help_modules[OTHER_HELP_HEADING].append(method_meta["__doc__"]) if method_meta["multiline"]: try: diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index 9bdd9268..e790b824 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -12,13 +12,15 @@ from sleekxmpp import ClientXMPP from sleekxmpp.exceptions import IqError, IqTimeout -from will import settings from .base import IOBackend +from will import settings +from will.utils import is_admin +from will.acl import is_acl_allowed from multiprocessing import Process, Queue from will.abstractions import Event, Message, Person, Channel from multiprocessing.queues import Empty from will.utils import Bunch, UNSURE_REPLIES, clean_for_pickling -from will.mixins import RosterMixin, RoomMixin, StorageMixin, PubSubMixin +from will.mixins import RoomMixin, StorageMixin, PubSubMixin # TODO: Cleanup unused urls ROOM_NOTIFICATION_URL = "https://%(server)s/v2/room/%(room_id)s/notification?auth_token=%(token)s" @@ -33,7 +35,66 @@ "=%(start_index)s&max-results=%(max_results)s&expand=items") -class HipchatXMPPClient(ClientXMPP, RosterMixin, RoomMixin, StorageMixin, PubSubMixin): +class HipChatRosterMixin(object): + @property + def people(self): + if not hasattr(self, "_people"): + self._people = self.load('will_hipchat_people', {}) + return self._people + + @property + def internal_roster(self): + logging.warn( + "mixin.internal_roster has been deprecated. Please use mixin.people instead. " + "internal_roster will be removed at the end of 2017" + ) + return self.people + + def get_user_by_full_name(self, name): + # TODO: Fix this better for shell, etc + for jid, info in self.people.items(): + if info["name"] == name: + return info + + return {"jid": "123", "hipchat_id": "123"} + + def get_user_by_nick(self, nick): + for jid, info in self.people.items(): + if info["nick"] == nick: + return info + return {"jid": "123", "hipchat_id": "123"} + + def get_user_by_jid(self, jid): + if jid in self.people: + return self.people[jid] + + return {"jid": "123", "hipchat_id": "123"} + + def get_user_from_message(self, message): + if message["type"] == "groupchat": + return self.get_user_by_full_name(message["mucnick"]) + elif message['type'] in ('chat', 'normal'): + jid = ("%s" % message["from"]).split("/")[0] + return self.get_user_by_jid(jid) + else: + return {"jid": "123", "hipchat_id": "123"} + + def message_is_from_admin(self, message): + nick = self.get_user_from_message(message)['nick'] + return is_admin(nick) + + def message_is_allowed(self, message, acl): + nick = self.get_user_from_message(message)['nick'] + return is_acl_allowed(nick, acl) + + def get_user_by_hipchat_id(self, id): + for jid, info in self.people.items(): + if info["hipchat_id"] == id: + return info + return None + + +class HipchatXMPPClient(ClientXMPP, HipChatRosterMixin, RoomMixin, StorageMixin, PubSubMixin): def start_xmpp_client(self, xmpp_bridge_queue=None, backend_name=""): logger = logging.getLogger(__name__) diff --git a/will/main.py b/will/main.py index e2b16715..d150e24a 100644 --- a/will/main.py +++ b/will/main.py @@ -1011,7 +1011,7 @@ def bootstrap_plugins(self): regex = "(?i)%s" % regex help_regex = meta["listener_regex"] if meta["listens_only_to_direct_mentions"]: - help_regex = "@%s %s" % (settings.HIPCHAT_HANDLE, help_regex) + help_regex = "@%s %s" % (settings.WILL_HANDLE, help_regex) self.all_listener_regexes.append(help_regex) if meta["__doc__"]: pht = plugin_info.get("parent_help_text", None) diff --git a/will/mixins/__init__.py b/will/mixins/__init__.py index 19267a8d..3988b2e9 100644 --- a/will/mixins/__init__.py +++ b/will/mixins/__init__.py @@ -2,7 +2,7 @@ from email import EmailMixin from naturaltime import NaturalTimeMixin from room import RoomMixin -from roster import RosterMixin +# from roster import RosterMixin from plugins_library import PluginModulesLibraryMixin from schedule import ScheduleMixin from settings import SettingsMixin diff --git a/will/mixins/roster.py b/will/mixins/roster.py index 8f4b7027..7ab3691a 100644 --- a/will/mixins/roster.py +++ b/will/mixins/roster.py @@ -1,64 +1 @@ -import logging -from will.utils import is_admin -from will.acl import is_acl_allowed - -from will import settings - - -class RosterMixin(object): - @property - def people(self): - if not hasattr(self, "_people"): - self._people = self.load('will_hipchat_people', {}) - return self._people - - @property - def internal_roster(self): - logging.warn( - "mixin.internal_roster has been deprecated. Please use mixin.people instead. " - "internal_roster will be removed at the end of 2017" - ) - return self.people - - def get_user_by_full_name(self, name): - # TODO: Fix this better for shell, etc - for jid, info in self.people.items(): - if info["name"] == name: - return info - - return {"jid": "123", "hipchat_id": "123"} - - def get_user_by_nick(self, nick): - for jid, info in self.people.items(): - if info["nick"] == nick: - return info - return {"jid": "123", "hipchat_id": "123"} - - def get_user_by_jid(self, jid): - if jid in self.people: - return self.people[jid] - - return {"jid": "123", "hipchat_id": "123"} - - def get_user_from_message(self, message): - if message["type"] == "groupchat": - return self.get_user_by_full_name(message["mucnick"]) - elif message['type'] in ('chat', 'normal'): - jid = ("%s" % message["from"]).split("/")[0] - return self.get_user_by_jid(jid) - else: - return {"jid": "123", "hipchat_id": "123"} - - def message_is_from_admin(self, message): - nick = self.get_user_from_message(message)['nick'] - return is_admin(nick) - - def message_is_allowed(self, message, acl): - nick = self.get_user_from_message(message)['nick'] - return is_acl_allowed(nick, acl) - - def get_user_by_hipchat_id(self, id): - for jid, info in self.people.items(): - if info["hipchat_id"] == id: - return info - return None +from will.backends.io_adapters.hipchat import HipChatRosterMixin as RosterMixin diff --git a/will/plugin.py b/will/plugin.py index db9d5558..43f6491f 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -3,13 +3,14 @@ from will import settings from bottle import request -from mixins import NaturalTimeMixin, RosterMixin, RoomMixin, ScheduleMixin, StorageMixin, SettingsMixin, \ +from mixins import NaturalTimeMixin, RoomMixin, ScheduleMixin, StorageMixin, SettingsMixin, \ EmailMixin, PubSubMixin +from will.backends.io_adapters.hipchat import HipChatRosterMixin from utils import html_to_text from will.abstractions import Event, Message -class WillPlugin(EmailMixin, StorageMixin, NaturalTimeMixin, RoomMixin, RosterMixin, +class WillPlugin(EmailMixin, StorageMixin, NaturalTimeMixin, RoomMixin, HipChatRosterMixin, ScheduleMixin, SettingsMixin, PubSubMixin): is_will_plugin = True request = request diff --git a/will/settings.py b/will/settings.py index b9ce2e51..505d5017 100644 --- a/will/settings.py +++ b/will/settings.py @@ -212,6 +212,18 @@ def import_settings(quiet=True): else: settings["TEMPLATE_DIRS"] = [] + if "WILL_HANDLE" not in settings: + if "HANDLE" in settings: + settings["WILL_HANDLE"] = settings["HANDLE"] + elif "SLACK_HANDLE" in settings: + settings["WILL_HANDLE"] = settings["SLACK_HANDLE"] + elif "HIPCHAT_HANDLE" in settings: + settings["WILL_HANDLE"] = settings["HIPCHAT_HANDLE"] + elif "ROCKETCHAT_HANDLE" in settings: + settings["WILL_HANDLE"] = settings["ROCKETCHAT_HANDLE"] + else: + settings["WILL_HANDLE"] = "will" + if "ALLOW_INSECURE_HIPCHAT_SERVER" in settings and\ (settings["ALLOW_INSECURE_HIPCHAT_SERVER"] is True or settings["ALLOW_INSECURE_HIPCHAT_SERVER"].lower() == "true"): From 230f6d3cdb10d49c8941d68b0b35ad5fe23b5ae6 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 19 Oct 2017 11:34:28 +1300 Subject: [PATCH 029/200] Moves RosterMixin, cleans up docs --- config.py | 3 +++ docs/improve.md | 6 +++++- will/backends/generation/fuzzy_all_matches.py | 6 ------ will/backends/generation/fuzzy_best_match.py | 6 ------ will/backends/generation/strict_regex.py | 6 ------ will/backends/io_adapters/slack.py | 1 + will/mixins/__init__.py | 5 ++++- will/mixins/roster.py | 10 +++++++++- will/settings.py | 3 ++- 9 files changed, 24 insertions(+), 22 deletions(-) diff --git a/config.py b/config.py index 76fc6b9a..d07b9a36 100644 --- a/config.py +++ b/config.py @@ -242,3 +242,6 @@ # Google Application key for "image me" command # GOOGLE_API_KEY = "FILL THIS IN" # GOOGLE_CUSTOM_SEARCH_ENGINE_ID = "FILL THIS IN" + +# Internal, used for helpful output when upgrades are installed +WILL_RELEASE_VERSION = 2.0 diff --git a/docs/improve.md b/docs/improve.md index 4a38717b..2725b0b2 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -165,9 +165,13 @@ Here's what's new: This release also changes a few bits of behavior, to be consistent: - `self.reply()` *finally* no longer requires you to tediously pass the `message` back to it. It's also smart, and backwards compatable with existing plugins. -- `admin_only` is explicitly flagged for deprecation and removal, to be replaced by the ACL system introduced in 2015 (largely, this is because having two different access control systems is crazy and painful.) Switching is as easy as adding `ACL = {'admins': ['steven', 'will']}` to your config.py and find/replacing `admin_only=True` with `acl=['admins',] in your codebase. For now, Will handles backwards compatability by mapping the old settings into the new places, but he won't forever. Thanks for updating, and making ongoing maintenence simpler! +- `admin_only` is explicitly flagged for deprecation and removal, to be replaced by the ACL system introduced in 2015 (largely, this is because having two different access control systems is crazy and painful.) Switching is as easy as adding `ACL = {'admins': ['steven', 'will']}` to your config.py and find/replacing `admin_only=True` with `acl=['admins',] in your codebase. For now, Will handles backwards compatibility by mapping the old settings into the new places, but he won't forever. Thanks for updating, and making ongoing maintenence simpler! - If no ACLs are specified and users try to perform restricted commands, they'll be allowed as before, but Will will complain to the console. A new `DISABLE_ACL` setting has been added to turn off the complaining. +There are a couple *internal* backwards-incompatible changes: +- `RosterMixin` has been renamed `HipChatRosterMixin` and moved to `will.backends.io_adapters.hipchat`. This change should not affect you unless you were specifically importing RosterMixin in your own plugins - everything in `WillPlugin` has been automatically routed to the right place, in a backwards-compatible way. + + This release addresses a number of bugs and smaller features, including: * Chatoms support fixed by [bykof](https://github.com/bykof). diff --git a/will/backends/generation/fuzzy_all_matches.py b/will/backends/generation/fuzzy_all_matches.py index d6f53df7..fba2fe59 100644 --- a/will/backends/generation/fuzzy_all_matches.py +++ b/will/backends/generation/fuzzy_all_matches.py @@ -90,12 +90,6 @@ def do_generate(self, event): ("direct_mentions_only" not in l or not l["direct_mentions_only"]) or message.is_direct ) - - # TODO: Get ACL working again. - # It's from admins only and sender is an admin, or it's not from admins only - # and ((l['admin_only'] and self.message_is_from_admin(msg)) or (not l['admin_only'])) - # # It's available only to the members of one or more ACLs, or no ACL in use - # and ((len(l['acl']) > 0 and self.message_is_allowed(msg, l['acl'])) or (len(l['acl']) == 0)) ): fuzzy_regex = self._generate_compiled_regex(l) diff --git a/will/backends/generation/fuzzy_best_match.py b/will/backends/generation/fuzzy_best_match.py index 9ddc36fc..dba595c9 100644 --- a/will/backends/generation/fuzzy_best_match.py +++ b/will/backends/generation/fuzzy_best_match.py @@ -82,12 +82,6 @@ def do_generate(self, event): ("direct_mentions_only" not in l or not l["direct_mentions_only"]) or message.is_direct ) - - # TODO: Get ACL working again. - # It's from admins only and sender is an admin, or it's not from admins only - # and ((l['admin_only'] and self.message_is_from_admin(msg)) or (not l['admin_only'])) - # # It's available only to the members of one or more ACLs, or no ACL in use - # and ((len(l['acl']) > 0 and self.message_is_allowed(msg, l['acl'])) or (len(l['acl']) == 0)) ): fuzzy_regex = self._generate_compiled_regex(l) diff --git a/will/backends/generation/strict_regex.py b/will/backends/generation/strict_regex.py index 6ecef0bb..c8d8ed19 100644 --- a/will/backends/generation/strict_regex.py +++ b/will/backends/generation/strict_regex.py @@ -30,12 +30,6 @@ def do_generate(self, event): ("direct_mentions_only" not in l or not l["direct_mentions_only"]) or message.is_direct ) - - # TOOD: Get ACL working again. - # It's from admins only and sender is an admin, or it's not from admins only - # and ((l['admin_only'] and self.message_is_from_admin(msg)) or (not l['admin_only'])) - # # It's available only to the members of one or more ACLs, or no ACL in use - # and ((len(l['acl']) > 0 and self.message_is_allowed(msg, l['acl'])) or (len(l['acl']) == 0)) ): context = Bunch() for k, v in l.items(): diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index 3bce6714..2bb11365 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -41,6 +41,7 @@ class SlackBackend(IOBackend, SleepMixin): def normalize_incoming_event(self, event): if ( + "type" in event and event["type"] == "message" and ("subtype" not in event or event["subtype"] != "message_changed") and # Ignore thread summary events (for now.) diff --git a/will/mixins/__init__.py b/will/mixins/__init__.py index 3988b2e9..7d7806c1 100644 --- a/will/mixins/__init__.py +++ b/will/mixins/__init__.py @@ -2,10 +2,13 @@ from email import EmailMixin from naturaltime import NaturalTimeMixin from room import RoomMixin -# from roster import RosterMixin from plugins_library import PluginModulesLibraryMixin from schedule import ScheduleMixin from settings import SettingsMixin from sleep import SleepMixin from storage import StorageMixin from pubsub import PubSubMixin + +# RosterMixin has been moved to from will.backends.io_adapters.hipchat import HipChatRosterMixin +# This is just for logging a warning for people who have used it internally +from roster import RosterMixin diff --git a/will/mixins/roster.py b/will/mixins/roster.py index 7ab3691a..0f54c229 100644 --- a/will/mixins/roster.py +++ b/will/mixins/roster.py @@ -1 +1,9 @@ -from will.backends.io_adapters.hipchat import HipChatRosterMixin as RosterMixin +class RosterMixin(object): + + def __init__(self, *args, **kwargs): + import logging + logging.critical( + "RosterMixin has been moved to the hipchat backend.\n" + + "Please change all your imports to from will.backends.io_adapters.hipchat import HipChatRosterMixin" + ) + super(RosterMixin, self).__init__(*args, **kwargs) diff --git a/will/settings.py b/will/settings.py index 505d5017..12d8a014 100644 --- a/will/settings.py +++ b/will/settings.py @@ -267,7 +267,8 @@ def import_settings(quiet=True): if not quiet: note( "No SECRET_KEY specified. Auto-generating one specific to this run of Will.\n" + - " Know that will won't be able to catch up on old messages or work in a multicomponent install without one." + " Know that Will won't be able to catch up on old messages\n" + + " or work in a multicomponent install without one." ) settings["SECRET_KEY"] = uuid.uuid4().hex os.environ["WILL_SECRET_KEY"] = settings["SECRET_KEY"] From 2f1cbc27809318eb978b555ebc98e3ed4f3708a8 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 19 Oct 2017 13:11:32 +1300 Subject: [PATCH 030/200] Sorts a couple of the rocketchat TODOs --- will/backends/io_adapters/hipchat.py | 35 ++++++++++++++++++++----- will/backends/io_adapters/rocketchat.py | 22 ++++++++-------- will/plugin.py | 31 +--------------------- 3 files changed, 40 insertions(+), 48 deletions(-) diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index e790b824..c8c15207 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -172,6 +172,7 @@ def start_xmpp_client(self, xmpp_bridge_queue=None, backend_name=""): self.add_event_handler("session_start", self.session_start) self.add_event_handler("message", self.message_recieved) self.add_event_handler("groupchat_message", self.room_message) + self.add_event_handler("groupchat_invite", self.room_invite) self.register_plugin('xep_0045') # MUC @@ -195,6 +196,14 @@ def join_rooms(self, event): if "xmpp_jid" in r: self.plugin['xep_0045'].joinMUC(r["xmpp_jid"], self.nick, wait=True) + def room_invite(self, event): + # TODO: Pull this and related. + # self.update_will_roster_and_rooms() + logging.info("Invite recieved for %s" % event) + for r in self.rooms: + if "xmpp_jid" in r: + self.plugin['xep_0045'].joinMUC(r["xmpp_jid"], self.nick, wait=True) + def update_will_roster_and_rooms(self): people = self.load('will_hipchat_people', {}) @@ -236,6 +245,9 @@ def room_message(self, msg): self._send_to_backend(msg) def message_recieved(self, msg): + print "message_recieved" + print msg.__dict__ + print msg['type'] if msg['type'] in ('chat', 'normal'): self._send_to_backend(msg) @@ -272,7 +284,8 @@ def _send_to_backend(self, msg): stripped_msg.xmpp_jid = msg.getMucroom() stripped_msg.body = msg["body"] - # print("putting in bridge queue") + print("putting in bridge queue") + print(stripped_msg) self.xmpp_bridge_queue.put(stripped_msg) @@ -455,9 +468,9 @@ def channels(self): return self._channels def normalize_incoming_event(self, event): - # print("hipchat: normalize_incoming_event - %s" % event) + logging.debug("hipchat: normalize_incoming_event - %s" % event) - if event["type"] in ("chat", "normal", "groupchat") and "from_jid" in event: + if event["type"] in ("chat", "normal", "groupchat") and ("from_jid" in event or "from" in event): # Sample of group message # {u'source_team': u'T5ACF70KV', u'text': u'test', # u'ts': u'1495661121.838366', u'user': u'U5ACF70RH', @@ -467,7 +480,13 @@ def normalize_incoming_event(self, event): # {u'source_team': u'T5ACF70KV', u'text': u'test', # u'ts': u'1495662397.335424', u'user': u'U5ACF70RH', # u'team': u'T5ACF70KV', u'type': u'message', u'channel': u'D5HGP0YE7'} - event_sender_id = event["from_jid"].split("@")[0].split("_")[1] + if "from_jid" in event: + sender = event["from_jid"] + else: + sender = event["from"] + + event_sender_id = sender.split("@")[0].split("_")[1] + sender = self.people[event_sender_id] channel = clean_for_pickling(self.channels[event["xmpp_jid"]]) interpolated_handle = "@%s" % self.me.handle @@ -490,7 +509,7 @@ def normalize_incoming_event(self, event): if interpolated_handle in event["body"]: will_is_mentioned = True - if event["from_jid"] == self.me.id: + if sender == self.me.id: will_said_it = True m = Message( @@ -511,8 +530,8 @@ def normalize_incoming_event(self, event): return m else: - # print("Unknown event type") - # print(event) + print("Unknown event type") + print(event) return None def handle_outgoing_event(self, event): @@ -582,6 +601,8 @@ def __handle_bridge_queue(self): try: input_event = self.xmpp_bridge_queue.get(timeout=settings.EVENT_LOOP_INTERVAL) if input_event: + print "input_event" + print input_event self.handle_incoming_event(input_event) except Empty: diff --git a/will/backends/io_adapters/rocketchat.py b/will/backends/io_adapters/rocketchat.py index e236a6fa..305475ed 100644 --- a/will/backends/io_adapters/rocketchat.py +++ b/will/backends/io_adapters/rocketchat.py @@ -39,6 +39,12 @@ class RocketChatBackend(IOBackend): "http://localhost:3000" ), }, + { + "name": "ROCKETCHAT_HANDLE", + "obtain_at": ( + "Will's mention name in Rocket.chat, e.g. @will is 'will'" + ), + }, ] pp = pprint.PrettyPrinter(indent=4) @@ -122,8 +128,6 @@ def normalize_incoming_event(self, event): logging.debug('Will didnt say it') will_said_it = False - # TODO: Find out where backend_supports_acl is used. - # Perhaps it's useful. m = Message( content=event['msg'], type=event.type, @@ -135,7 +139,7 @@ def normalize_incoming_event(self, event): channel=channel, will_is_mentioned=will_is_mentioned, will_said_it=will_said_it, - backend_supports_acl=False, + backend_supports_acl=True, source=clean_for_pickling(event) ) return m @@ -244,8 +248,8 @@ def _get_realtime_metadata(self): # https://rocket.chat/docs/developer-guides/rest-api/ def _rest_login(self): - params = {'username': settings.HIPCHAT_USERNAME, - 'password': settings.HIPCHAT_PASSWORD} + params = {'username': settings.ROCKETCHAT_USERNAME, + 'password': settings.ROCKETCHAT_PASSWORD} r = requests.post('{}login'.format(self.rcapi), data=params) rj = r.json() @@ -263,10 +267,7 @@ def _rest_users_list(self): fetched = 0 total = 0 - # TODO: Why do I need to set handle here as done in slack.py? - # It should have been set as an envvar (otherwise how did - # we get this far?). - self.handle = settings.HIPCHAT_USERNAME + self.handle = settings.ROCKETCHAT_HANDLE people = {} @@ -384,7 +385,7 @@ def _realtime_connect(self): time.sleep(5) def _realtime_login(self): - params = [{'user': {'username': settings.HIPCHAT_USERNAME}, 'password': settings.HIPCHAT_PASSWORD}] + params = [{'user': {'username': settings.ROCKETCHAT_USERNAME}, 'password': settings.ROCKETCHAT_PASSWORD}] self.rc.call('login', params, self._login_callback) def _login_callback(self, error, result): @@ -428,7 +429,6 @@ def _stream_room_message_callback(self, error, event): # Gets updates from REST and Realtime APIs. def _get_updates(self): try: - polling_interval_seconds = 5 self.rc.on('changed', self._changed_callback) self._get_rest_metadata() diff --git a/will/plugin.py b/will/plugin.py index 43f6491f..0a39a792 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -43,22 +43,13 @@ def _prepared_content(self, content, message, kwargs): content = re.sub(r'>\s+<', '><', content) return content - def say(self, content, message=None, room=None, card=None, **kwargs): - # Valid kwargs: - # color: yellow, red, green, purple, gray, random. Default is green. - # html: Display HTML or not. Default is False - # notify: Ping everyone. Default is False + def say(self, content, message=None, room=None, **kwargs): logging.info("self.say") logging.info(content) if not "room" in kwargs and room: kwargs["room"] = room - # TODO: Get this abstracted and working. - # card: Card see: https://developer.atlassian.com/hipchat/guide/sending-messages - if not "card" in kwargs and card: - kwargs["card"] = card - backend = False if not message: message = self.message @@ -90,26 +81,6 @@ def say(self, content, message=None, room=None, card=None, **kwargs): kwargs=kwargs, )) - # content = self._prepared_content(content, message, kwargs) - # rooms = [] - # if room is not None: - # try: - # room_id = room["room_id"] - # except KeyError: - # logging.error(u'"{0}" is not a room object.'.format(room)) - # else: - # self.send_room_message(room_id, content, card=card, **kwargs) - # elif message is None or message["type"] == "groupchat": - # rooms = self._rooms_from_message_and_room(message, room) - # for r in rooms: - # self.send_room_message(r["room_id"], content, card=card, **kwargs) - # else: - # if "sender" in message: - # sender = message["sender"] - # else: - # sender = message.sender - # self.send_direct_message(sender["hipchat_id"], content, **kwargs) - def reply(self, event, content=None, **kwargs): # Be really smart about what we're getting back. if ( From 984bd5e43ad84e5801b5419eb3f2ab987aad4cc3 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 19 Oct 2017 16:33:06 +1300 Subject: [PATCH 031/200] Partway to fixed tests --- config.py | 4 +-- requirements.hipchat.txt | 2 +- tox.ini | 2 ++ will/acl.py | 2 +- will/backends/execution/all.py | 1 - will/backends/execution/best_score.py | 1 - will/backends/io_adapters/rocketchat.py | 2 +- will/backends/io_adapters/slack.py | 2 +- will/mixins/schedule.py | 19 +++++----- will/tests/test_acl.py | 48 +++++++++++++------------ 10 files changed, 43 insertions(+), 40 deletions(-) diff --git a/config.py b/config.py index d07b9a36..c064625a 100644 --- a/config.py +++ b/config.py @@ -73,7 +73,7 @@ # Platforms and mediums messages can come in and go out on. IO_BACKENDS = [ - # "will.backends.io_adapters.hipchat", + "will.backends.io_adapters.hipchat", # "will.backends.io_adapters.rocketchat", "will.backends.io_adapters.shell", "will.backends.io_adapters.slack", @@ -177,7 +177,7 @@ # Turn up or down Will's logging level # LOGLEVEL = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL -LOGLEVEL = "WARNING" +LOGLEVEL = "DEBUG" # LOGLEVEL = "INFO" # Turn on or off Will's profiling diff --git a/requirements.hipchat.txt b/requirements.hipchat.txt index 058e357a..d5a9c55c 100644 --- a/requirements.hipchat.txt +++ b/requirements.hipchat.txt @@ -1 +1 @@ -sleekxmpp>=1.3.1<1.4.0 +sleekxmpp>=1.3.1 diff --git a/tox.ini b/tox.ini index a389561c..42cb4ade 100644 --- a/tox.ini +++ b/tox.ini @@ -11,3 +11,5 @@ commands = flake8 deps = flake8 + -rrequirements.hipchat.txt + -rrequirements.txt \ No newline at end of file diff --git a/will/acl.py b/will/acl.py index c4fc8923..1cc48df2 100644 --- a/will/acl.py +++ b/will/acl.py @@ -51,7 +51,7 @@ def test_acl(message, acl): "%s was just allowed to perform actions in %s because the backend does not support ACL. This can be a security risk." % ( message.sender.handle, acl, - ) + + ) + "To fix this, set ACL groups in your config.py, or set DISABLE_ACL = True" ) return True diff --git a/will/backends/execution/all.py b/will/backends/execution/all.py index f81ec0b3..023018c7 100644 --- a/will/backends/execution/all.py +++ b/will/backends/execution/all.py @@ -6,7 +6,6 @@ from will import settings from will.decorators import require_settings -from will.plugin import Event from .base import ExecutionBackend diff --git a/will/backends/execution/best_score.py b/will/backends/execution/best_score.py index c8b6a88d..5a7ce4f3 100644 --- a/will/backends/execution/best_score.py +++ b/will/backends/execution/best_score.py @@ -6,7 +6,6 @@ from will import settings from will.decorators import require_settings -from will.plugin import Event from will.utils import Bunch from .base import ExecutionBackend diff --git a/will/backends/io_adapters/rocketchat.py b/will/backends/io_adapters/rocketchat.py index 305475ed..d965e408 100644 --- a/will/backends/io_adapters/rocketchat.py +++ b/will/backends/io_adapters/rocketchat.py @@ -429,7 +429,7 @@ def _stream_room_message_callback(self, error, event): # Gets updates from REST and Realtime APIs. def _get_updates(self): try: - + polling_interval_seconds = 5 self.rc.on('changed', self._changed_callback) self._get_rest_metadata() diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index 2bb11365..5124de79 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -174,8 +174,8 @@ def send_message(self, event): if hasattr(event, "kwargs"): data.update(event.kwargs) + # Add slack-specific functionality if "color" in event.kwargs: - data.update({ "attachments": json.dumps([ { diff --git a/will/mixins/schedule.py b/will/mixins/schedule.py index a19977da..ddb5e078 100644 --- a/will/mixins/schedule.py +++ b/will/mixins/schedule.py @@ -30,15 +30,16 @@ def get_times_list(self, periodic_list=False): def save_times_list(self, new_list, periodic_list=False): return self.save(self.times_key(periodic_list=periodic_list), new_list) - def add_direct_message_to_schedule(self, when, content, message, *args, **kwargs): - target_user = self.get_user_from_message(message) - self.add_to_schedule(when, { - "type": "direct_message", - "content": content, - "target_jid": target_user["jid"], - "args": args, - "kwargs": kwargs, - }) + # TODO: Create new version of this that's properly abstracted, instead of get_user_from_message + # def add_direct_message_to_schedule(self, when, content, message, *args, **kwargs): + # target_user = self.get_user_from_message(message) + # self.add_to_schedule(when, { + # "type": "direct_message", + # "content": content, + # "target_jid": target_user["jid"], + # "args": args, + # "kwargs": kwargs, + # }) def add_room_message_to_schedule(self, when, content, room, *args, **kwargs): self.add_to_schedule(when, { diff --git a/will/tests/test_acl.py b/will/tests/test_acl.py index 0fa87723..ce6212a1 100644 --- a/will/tests/test_acl.py +++ b/will/tests/test_acl.py @@ -11,29 +11,31 @@ class TestIsAdmin(unittest.TestCase): def setUp(self): self.message = {'nick': 'WoOh'} - @patch('will.mixins.roster.RosterMixin.get_user_from_message') - def test_message_is_from_admin_true_if_not_set(self, mock_get_user_from_message): - settings.ADMINS = '*' - mock_get_user_from_message.return_value = self.message - self.assertTrue(RosterMixin().message_is_from_admin(self.message)) - - @patch('will.mixins.roster.RosterMixin.get_user_from_message') - def test_message_is_from_admin_true_if_enlisted(self, mock_get_user_from_message): - settings.ADMINS = ['wooh'] - mock_get_user_from_message.return_value = self.message - self.assertTrue(RosterMixin().message_is_from_admin(self.message)) - - @patch('will.mixins.roster.RosterMixin.get_user_from_message') - def test_message_is_from_admin_false_if_not_enlisted(self, mock_get_user_from_message): - settings.ADMINS = ['skoczen'] - mock_get_user_from_message.return_value = self.message - self.assertFalse(RosterMixin().message_is_from_admin(self.message)) - - @patch('will.mixins.roster.RosterMixin.get_user_from_message') - def test_message_is_from_admin_false_if_not_lowercase(self, mock_get_user_from_message): - settings.ADMINS = ['WoOh'] - mock_get_user_from_message.return_value = self.message - self.assertFalse(RosterMixin().message_is_from_admin(self.message)) + # TODO: Decide if we're keeping is_admin at all, and if so, + # create new version of this that's properly abstracted, instead of get_user_from_message + # @patch('will.mixins.roster.RosterMixin.get_user_from_message') + # def test_message_is_from_admin_true_if_not_set(self, mock_get_user_from_message): + # settings.ADMINS = '*' + # mock_get_user_from_message.return_value = self.message + # self.assertTrue(RosterMixin().message_is_from_admin(self.message)) + + # @patch('will.mixins.roster.RosterMixin.get_user_from_message') + # def test_message_is_from_admin_true_if_enlisted(self, mock_get_user_from_message): + # settings.ADMINS = ['wooh'] + # mock_get_user_from_message.return_value = self.message + # self.assertTrue(RosterMixin().message_is_from_admin(self.message)) + + # @patch('will.mixins.roster.RosterMixin.get_user_from_message') + # def test_message_is_from_admin_false_if_not_enlisted(self, mock_get_user_from_message): + # settings.ADMINS = ['skoczen'] + # mock_get_user_from_message.return_value = self.message + # self.assertFalse(RosterMixin().message_is_from_admin(self.message)) + + # @patch('will.mixins.roster.RosterMixin.get_user_from_message') + # def test_message_is_from_admin_false_if_not_lowercase(self, mock_get_user_from_message): + # settings.ADMINS = ['WoOh'] + # mock_get_user_from_message.return_value = self.message + # self.assertFalse(RosterMixin().message_is_from_admin(self.message)) class TestVerifyAcl(unittest.TestCase): From f9c7f50bb80ab08b4a7f797baca9a28c3c19e8e8 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 19 Oct 2017 16:45:34 +1300 Subject: [PATCH 032/200] Adds pytz, locks sleekxmpp to 1.3.2 --- requirements.base.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.base.txt b/requirements.base.txt index 7bef4c71..ba396ca1 100644 --- a/requirements.base.txt +++ b/requirements.base.txt @@ -7,12 +7,13 @@ requests==2.4.1 parsedatetime==1.1.2 pyasn1==0.1.7 pyasn1-modules==0.0.5 -sleekxmpp==1.3.1 +sleekxmpp==1.3.2 APScheduler==2.1.2 CherryPy==3.6.0 Jinja2==2.7.3 Markdown==2.3.1 MarkupSafe==0.23 PyYAML==3.10 +pytz==2017.2 pygerduty==0.28 six==1.10.0 From 1fc32cddc8d70155615a2ab09e2bb5df6fb56d7e Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 19 Oct 2017 18:03:34 +1300 Subject: [PATCH 033/200] Main-room hipchat working. --- config.py | 2 +- will/backends/io_adapters/hipchat.py | 72 +++++++++++----------------- 2 files changed, 30 insertions(+), 44 deletions(-) diff --git a/config.py b/config.py index c064625a..07861de9 100644 --- a/config.py +++ b/config.py @@ -177,7 +177,7 @@ # Turn up or down Will's logging level # LOGLEVEL = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL -LOGLEVEL = "DEBUG" +# LOGLEVEL = "DEBUG" # LOGLEVEL = "INFO" # Turn on or off Will's profiling diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index 6558b1f5..c9e59542 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -56,28 +56,40 @@ def get_user_by_full_name(self, name): if info["name"] == name: return info - return {"jid": "123", "hipchat_id": "123"} + return None def get_user_by_nick(self, nick): for jid, info in self.people.items(): if info["nick"] == nick: return info - return {"jid": "123", "hipchat_id": "123"} + return None def get_user_by_jid(self, jid): if jid in self.people: return self.people[jid] - return {"jid": "123", "hipchat_id": "123"} + return None def get_user_from_message(self, message): if message["type"] == "groupchat": - return self.get_user_by_full_name(message["mucnick"]) + if "xmpp_jid" in message: + user = self.get_user_by_jid(message["xmpp_jid"]) + if user: + return user + elif "from" in message: + full_name = message["from"].split("/")[1] + user = self.get_user_by_full_name(full_name) + if user: + return user + + if "mucnick" in message: + return self.get_user_by_full_name(message["mucnick"]) + elif message['type'] in ('chat', 'normal'): jid = ("%s" % message["from"]).split("/")[0] return self.get_user_by_jid(jid) else: - return {"jid": "123", "hipchat_id": "123"} + return None def message_is_from_admin(self, message): nick = self.get_user_from_message(message)['nick'] @@ -245,9 +257,6 @@ def room_message(self, msg): self._send_to_backend(msg) def message_recieved(self, msg): - print "message_recieved" - print msg.__dict__ - print msg['type'] if msg['type'] in ('chat', 'normal'): self._send_to_backend(msg) @@ -284,12 +293,10 @@ def _send_to_backend(self, msg): stripped_msg.xmpp_jid = msg.getMucroom() stripped_msg.body = msg["body"] - print("putting in bridge queue") - print(stripped_msg) self.xmpp_bridge_queue.put(stripped_msg) -class HipChatBackend(IOBackend, RoomMixin, StorageMixin): +class HipChatBackend(IOBackend, HipChatRosterMixin, RoomMixin, StorageMixin): friendly_name = "HipChat" internal_name = "will.backends.io_adapters.hipchat" required_settings = [ @@ -471,23 +478,8 @@ def normalize_incoming_event(self, event): logging.debug("hipchat: normalize_incoming_event - %s" % event) if event["type"] in ("chat", "normal", "groupchat") and ("from_jid" in event or "from" in event): - # Sample of group message - # {u'source_team': u'T5ACF70KV', u'text': u'test', - # u'ts': u'1495661121.838366', u'user': u'U5ACF70RH', - # u'team': u'T5ACF70KV', u'type': u'message', u'channel': u'C5JDAR2S3'} - - # Sample of 1-1 message - # {u'source_team': u'T5ACF70KV', u'text': u'test', - # u'ts': u'1495662397.335424', u'user': u'U5ACF70RH', - # u'team': u'T5ACF70KV', u'type': u'message', u'channel': u'D5HGP0YE7'} - if "from_jid" in event: - sender = event["from_jid"] - else: - sender = event["from"] - event_sender_id = sender.split("@")[0].split("_")[1] - - sender = self.people[event_sender_id] + sender = self.get_user_from_message(event) channel = clean_for_pickling(self.channels[event["xmpp_jid"]]) interpolated_handle = "@%s" % self.me.handle will_is_mentioned = False @@ -530,8 +522,8 @@ def normalize_incoming_event(self, event): return m else: - print("Unknown event type") - print(event) + # print("Unknown event type") + # print(event) return None def handle_outgoing_event(self, event): @@ -542,14 +534,10 @@ def handle_outgoing_event(self, event): if event.type in ["say", "reply"]: event.content = re.sub(r'>\s+<', '><', event.content) - if hasattr(event, "source_message") and event.source_message: - if event.source_message.original_incoming_event.type == "groupchat": - - sys.stdout.write("\n\n\n") - sys.stdout.write("%s" % event.source_message.channel) - sys.stdout.flush() + if hasattr(event, "source_message") and event.source_message and hasattr(event.source_message, "data"): + if event.source_message.data.is_group_chat: self.send_room_message( - event.source_message.channel.id, + event.source_message.data.channel.id, event.content, **kwargs ) @@ -579,18 +567,18 @@ def handle_outgoing_event(self, event): elif ( event.type == "message.no_response" and - event.source_message.is_direct and - event.source_message.will_said_it is False + event.data.is_direct and + event.data.will_said_it is False ): - if event.source_message.original_incoming_event.type == "groupchat": + if event.data.original_incoming_event.type == "groupchat": self.send_room_message( - event.source_message.original_incoming_event.room.room_id, + event.data.channel.id, random.choice(UNSURE_REPLIES), **kwargs ) else: self.send_direct_message( - event.source_message.original_incoming_event.sender["hipchat_id"], + event.data.sender.id, random.choice(UNSURE_REPLIES), **kwargs ) @@ -601,8 +589,6 @@ def __handle_bridge_queue(self): try: input_event = self.xmpp_bridge_queue.get(timeout=settings.EVENT_LOOP_INTERVAL) if input_event: - print "input_event" - print input_event self.handle_incoming_event(input_event) except Empty: From cf9106c2db49f72cc8cf183b95725d072ef6c73d Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 19 Oct 2017 19:13:55 +1300 Subject: [PATCH 034/200] Wires will up to hipchat private rooms with current spec --- will/backends/generation/fuzzy_all_matches.py | 6 +-- will/backends/io_adapters/hipchat.py | 48 ++++++++++--------- will/plugin.py | 10 ++++ will/plugins/friendly/hello.py | 2 +- 4 files changed, 37 insertions(+), 29 deletions(-) diff --git a/will/backends/generation/fuzzy_all_matches.py b/will/backends/generation/fuzzy_all_matches.py index fba2fe59..30d40e61 100644 --- a/will/backends/generation/fuzzy_all_matches.py +++ b/will/backends/generation/fuzzy_all_matches.py @@ -63,14 +63,9 @@ def do_generate(self, event): self.match_choices.append(l["regex_pattern"]) search_matches = fuzz_process.extract(message.content, self.match_choices) - # logging.info("search_matches") - # logging.info(search_matches) for match_str, confidence in search_matches: l = self.match_methods[match_str] - logging.info(" Match (%s) - %s" % ( - confidence, match_str)) - regex_matches = l["regex"].search(message.content) if ( # The search regex matches and # regex_matches @@ -91,6 +86,7 @@ def do_generate(self, event): message.is_direct ) ): + logging.info(" Match (%s) - %s" % (confidence, match_str)) fuzzy_regex = self._generate_compiled_regex(l) regex_matches = fuzzy_regex.search(message.content) diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index c9e59542..e8221279 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -26,8 +26,8 @@ ROOM_NOTIFICATION_URL = "https://%(server)s/v2/room/%(room_id)s/notification?auth_token=%(token)s" ROOM_TOPIC_URL = "https://%(server)s/v2/room/%(room_id)s/topic?auth_token=%(token)s" ROOM_URL = "https://%(server)s/v2/room/%(room_id)s/?auth_token=%(token)s" -PRIVATE_MESSAGE_URL = "https://%(server)s/v2/user/%(user_id)s/message?auth_token=%(token)s" SET_TOPIC_URL = "https://%(server)s/v2/room/%(room_id)s/topic?auth_token=%(token)s" +PRIVATE_MESSAGE_URL = "https://%(server)s/v2/user/%(user_id)s/message?auth_token=%(token)s" USER_DETAILS_URL = "https://%(server)s/v2/user/%(user_id)s?auth_token=%(token)s" ALL_USERS_URL = ("https://%(server)s/v2/user?auth_token=%(token)s&start-index" "=%(start_index)s&max-results=%(max_results)s") @@ -86,7 +86,7 @@ def get_user_from_message(self, message): return self.get_user_by_full_name(message["mucnick"]) elif message['type'] in ('chat', 'normal'): - jid = ("%s" % message["from"]).split("/")[0] + jid = ("%s" % message["from"]).split("@")[0].split("_")[1] return self.get_user_by_jid(jid) else: return None @@ -347,7 +347,8 @@ def send_direct_message(self, user_id, message_body, html=False, notify=False, * "notify": notify, } headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} - requests.post(url, headers=headers, data=json.dumps(data), **settings.REQUESTS_OPTIONS) + r = requests.post(url, headers=headers, data=json.dumps(data), **settings.REQUESTS_OPTIONS) + r.raise_for_status() except: logging.critical("Error in send_direct_message: \n%s" % traceback.format_exc()) @@ -476,21 +477,20 @@ def channels(self): def normalize_incoming_event(self, event): logging.debug("hipchat: normalize_incoming_event - %s" % event) - if event["type"] in ("chat", "normal", "groupchat") and ("from_jid" in event or "from" in event): sender = self.get_user_from_message(event) - channel = clean_for_pickling(self.channels[event["xmpp_jid"]]) interpolated_handle = "@%s" % self.me.handle will_is_mentioned = False will_said_it = False + channel = None + if "xmpp_jid" in event and event["xmpp_jid"]: + channel = clean_for_pickling(self.channels[event["xmpp_jid"]]) + is_private_chat = False + else: + if event["type"] in ("chat", "normal"): + is_private_chat = True - is_private_chat = False - - if event["type"] in ("chat", "normal"): - is_private_chat = True - - # <@U5GUL9D9N> hi is_direct = False if is_private_chat or event["body"].startswith(interpolated_handle): is_direct = True @@ -501,7 +501,7 @@ def normalize_incoming_event(self, event): if interpolated_handle in event["body"]: will_is_mentioned = True - if sender == self.me.id: + if sender.id == self.me.id: will_said_it = True m = Message( @@ -534,21 +534,23 @@ def handle_outgoing_event(self, event): if event.type in ["say", "reply"]: event.content = re.sub(r'>\s+<', '><', event.content) - if hasattr(event, "source_message") and event.source_message and hasattr(event.source_message, "data"): - if event.source_message.data.is_group_chat: - self.send_room_message( - event.source_message.data.channel.id, - event.content, - **kwargs - ) + if hasattr(event, "source_message") and event.source_message: + send_source = event.source_message + if hasattr(event.source_message, "data"): + send_source = event.source_message.data + + if send_source.is_private_chat: + # Private, 1-1 chats. + self.send_direct_message(send_source.sender.id, event.content, **kwargs) + else: - event.source_message - user_id = event.source_message.sender.id - self.send_direct_message( - user_id, + # We're in a public room + self.send_room_message( + send_source.channel.id, event.content, **kwargs ) + else: # Came from webhook/etc if "room" in kwargs: diff --git a/will/plugin.py b/will/plugin.py index 0a39a792..ab3afa85 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -43,6 +43,14 @@ def _prepared_content(self, content, message, kwargs): content = re.sub(r'>\s+<', '><', content) return content + def _trim_for_execution(self, message): + # Trim it down + if hasattr(message, "analysis"): + message.analysis = None + if hasattr(message, "source_message") and hasattr(message.source_message, "analysis"): + message.source_message.analysis = None + return message + def say(self, content, message=None, room=None, **kwargs): logging.info("self.say") logging.info(content) @@ -53,6 +61,7 @@ def say(self, content, message=None, room=None, **kwargs): backend = False if not message: message = self.message + message = self._trim_for_execution(message) logging.info(message) if hasattr(message, "backend"): @@ -72,6 +81,7 @@ def say(self, content, message=None, room=None, **kwargs): backend = settings.DEFAULT_BACKEND logging.info("backend: %s" % backend) + if backend: logging.info("putting in queue: %s" % content) self.publish("message.outgoing.%s" % backend, Event( diff --git a/will/plugins/friendly/hello.py b/will/plugins/friendly/hello.py index fc96491a..d35033e4 100644 --- a/will/plugins/friendly/hello.py +++ b/will/plugins/friendly/hello.py @@ -4,7 +4,7 @@ class HelloPlugin(WillPlugin): - @respond_to("^hi|hey$") + @respond_to("^(?:hi|hey)$") def hi(self, message): """hi: I know how to say hello!""" self.reply("hello!") From 35e57545a7212c67960254722c537c386f3da2c8 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 19 Oct 2017 19:16:42 +1300 Subject: [PATCH 035/200] Makes sure card is added. --- will/backends/io_adapters/hipchat.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index e8221279..718a7979 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -328,7 +328,7 @@ class HipChatBackend(IOBackend, HipChatRosterMixin, RoomMixin, StorageMixin): }, ] - def send_direct_message(self, user_id, message_body, html=False, notify=False, **kwargs): + def send_direct_message(self, user_id, message_body, html=False, card=None, notify=False, **kwargs): if kwargs: logging.warn("Unknown keyword args for send_direct_message: %s" % kwargs) @@ -345,6 +345,7 @@ def send_direct_message(self, user_id, message_body, html=False, notify=False, * "message": message_body, "message_format": format, "notify": notify, + "card": card, } headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} r = requests.post(url, headers=headers, data=json.dumps(data), **settings.REQUESTS_OPTIONS) @@ -370,6 +371,7 @@ def send_room_message(self, room_id, message_body, html=False, color="green", no "message_format": format, "color": color, "notify": notify, + "card": card, } headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} r = requests.post(url, headers=headers, data=json.dumps(data), **settings.REQUESTS_OPTIONS) From d1d342cb1f8f1aa664dc43ec6c957d7faf98c1e3 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 20 Oct 2017 12:22:46 +1300 Subject: [PATCH 036/200] Remind me working on all platforms, adds mention_handle to take care of platform-specific handle implementations. --- will/__init__.py | 2 +- will/abstractions.py | 1 + will/backends/io_adapters/hipchat.py | 3 ++ will/backends/io_adapters/rocketchat.py | 2 + will/backends/io_adapters/shell.py | 2 + will/backends/io_adapters/slack.py | 14 +++++-- will/mixins/schedule.py | 24 +++++++----- will/plugin.py | 50 +++++++++++++++---------- will/plugins/productivity/remind.py | 11 +++--- will/scheduler.py | 6 ++- 10 files changed, 74 insertions(+), 41 deletions(-) diff --git a/will/__init__.py b/will/__init__.py index b46c2e74..52bac6fd 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "2.0.1" +VERSION = "2.0.1-beta" diff --git a/will/abstractions.py b/will/abstractions.py index 206866d3..cda95cf0 100644 --- a/will/abstractions.py +++ b/will/abstractions.py @@ -110,6 +110,7 @@ class Person(Bunch): REQUIRED_FIELDS = [ "id", "handle", + "mention_handle", "source", "name", "first_name" diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index 718a7979..d231955c 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -173,6 +173,7 @@ def start_xmpp_client(self, xmpp_bridge_queue=None, backend_name=""): self.nick = settings.HIPCHAT_NAME self.handle = settings.HIPCHAT_HANDLE + self.mention_handle = "@%s" %settings.HIPCHAT_HANDLE self.whitespace_keepalive = True self.whitespace_keepalive_interval = 30 @@ -419,6 +420,7 @@ def people(self): full_roster["%s" % (user['id'],)] = Person( id=user["id"], handle=user["mention_name"], + mention_handle="@%s" % user["mention_name"], source=clean_for_pickling(user), name=user["name"], ) @@ -431,6 +433,7 @@ def people(self): full_roster["%s" % (user['id'],)] = Person( id=user["id"], handle=user["mention_name"], + mention_handle="@%s" % user["mention_name"], source=clean_for_pickling(user), name=user["name"], ) diff --git a/will/backends/io_adapters/rocketchat.py b/will/backends/io_adapters/rocketchat.py index d965e408..63df4688 100644 --- a/will/backends/io_adapters/rocketchat.py +++ b/will/backends/io_adapters/rocketchat.py @@ -268,6 +268,7 @@ def _rest_users_list(self): total = 0 self.handle = settings.ROCKETCHAT_HANDLE + self.mention_handle = "@%s" % settings.ROCKETCHAT_HANDLE people = {} @@ -291,6 +292,7 @@ def _rest_users_list(self): person = Person( id=user['_id'], handle=user['username'], + mention_handle="@%s" % user["username"], source=clean_for_pickling(user)['username'], name=user['name'], timezone='GMT' diff --git a/will/backends/io_adapters/shell.py b/will/backends/io_adapters/shell.py index 9b75e5b5..cde65599 100644 --- a/will/backends/io_adapters/shell.py +++ b/will/backends/io_adapters/shell.py @@ -23,6 +23,7 @@ class ShellBackend(StdInOutIOBackend): partner = Person( id="you", handle="shelluser", + mention_handle="@shelluser", source=Bunch(), name="Friend", ) @@ -85,6 +86,7 @@ def bootstrap(self): self.me = Person( id="will", handle="will", + mention_handle="@will", source=Bunch(), name="William T. Botterton", ) diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index 5124de79..785244cc 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -231,6 +231,11 @@ def send_message(self, event): except: pass + # Auto-link mention names + if data["text"].find("<@") != -1: + data["text"] = data["text"].replace("<@", "<@") + data["text"] = data["text"].replace(">", ">") + data.update({ "token": settings.SLACK_API_TOKEN, "channel": channel_id, @@ -250,7 +255,6 @@ def send_message(self, event): ) resp_json = r.json() if not resp_json["ok"]: - # print(resp_json) assert resp_json["ok"] def _map_color(self, color): @@ -281,6 +285,8 @@ def _update_channels(self): def _update_people(self): people = {} + if not hasattr(self, "client"): + self.client = SlackClient(settings.SLACK_API_TOKEN) self.handle = self.client.server.username @@ -290,6 +296,7 @@ def _update_people(self): user_timezone = v.tz people[k] = Person( id=v.id, + mention_handle="<@%s>" % v.id, handle=v.name, source=clean_for_pickling(v), name=v.real_name, @@ -297,6 +304,7 @@ def _update_people(self): if v.name == self.handle: self.me = Person( id=v.id, + mention_handle="<@%s>" % v.id, handle=v.name, source=clean_for_pickling(v), name=v.real_name, @@ -316,7 +324,7 @@ def _watch_slack_rtm(self): if self.client.rtm_connect(): self._update_backend_metadata() - num_polls_between_updates = 20 + num_polls_between_updates = 30 / settings.EVENT_LOOP_INTERVAL # Every 30 seconds current_poll_count = 0 while True: events = self.client.rtm_read() @@ -328,7 +336,7 @@ def _watch_slack_rtm(self): # Update channels/people/me/etc every 10s or so. current_poll_count += 1 - if current_poll_count < num_polls_between_updates: + if current_poll_count > num_polls_between_updates: self._update_backend_metadata() current_poll_count = 0 diff --git a/will/mixins/schedule.py b/will/mixins/schedule.py index ddb5e078..1901e282 100644 --- a/will/mixins/schedule.py +++ b/will/mixins/schedule.py @@ -4,9 +4,10 @@ import time import traceback from apscheduler.triggers.cron import CronTrigger +from will.mixins.pubsub import PubSubMixin -class ScheduleMixin(object): +class ScheduleMixin(PubSubMixin, object): def times_key(self, periodic_list=False): if periodic_list: @@ -31,15 +32,15 @@ def save_times_list(self, new_list, periodic_list=False): return self.save(self.times_key(periodic_list=periodic_list), new_list) # TODO: Create new version of this that's properly abstracted, instead of get_user_from_message - # def add_direct_message_to_schedule(self, when, content, message, *args, **kwargs): - # target_user = self.get_user_from_message(message) - # self.add_to_schedule(when, { - # "type": "direct_message", - # "content": content, - # "target_jid": target_user["jid"], - # "args": args, - # "kwargs": kwargs, - # }) + def add_direct_message_to_schedule(self, when, content, message, target_user, *args, **kwargs): + # target_user = self.get_user_from_message(message) + self.add_to_schedule(when, { + "type": "direct_message", + "content": content, + "target_jid": target_user["jid"], + "args": args, + "kwargs": kwargs, + }) def add_room_message_to_schedule(self, when, content, room, *args, **kwargs): self.add_to_schedule(when, { @@ -50,6 +51,9 @@ def add_room_message_to_schedule(self, when, content, room, *args, **kwargs): "kwargs": kwargs, }) + def add_outgoing_event_to_schedule(self, when, event, *args, **kwargs): + self.add_to_schedule(when, event, *args, **kwargs) + def add_to_schedule(self, when, item, periodic_list=False, ignore_scheduler_lock=False): try: while ( diff --git a/will/plugin.py b/will/plugin.py index ab3afa85..c087365e 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -51,7 +51,7 @@ def _trim_for_execution(self, message): message.source_message.analysis = None return message - def say(self, content, message=None, room=None, **kwargs): + def say(self, content, message=None, room=None, package_for_scheduling=False, **kwargs): logging.info("self.say") logging.info(content) @@ -83,15 +83,19 @@ def say(self, content, message=None, room=None, **kwargs): logging.info("backend: %s" % backend) if backend: - logging.info("putting in queue: %s" % content) - self.publish("message.outgoing.%s" % backend, Event( + e = Event( type="say", content=content, source_message=message, kwargs=kwargs, - )) + ) + if package_for_scheduling: + return e + else: + logging.info("putting in queue: %s" % content) + self.publish("message.outgoing.%s" % backend, e) - def reply(self, event, content=None, **kwargs): + def reply(self, event, content=None, message=None, package_for_scheduling=False, **kwargs): # Be really smart about what we're getting back. if ( ( @@ -99,7 +103,7 @@ def reply(self, event, content=None, **kwargs): (event and hasattr(event, "will_internal_type") and event.will_internal_type == "Event") ) and type(content) == type("words") ): - # 1.x world - user passed a message and a string. Keep rolling. + # "1.x world - user passed a message and a string. Keep rolling." pass elif ( ( @@ -107,7 +111,7 @@ def reply(self, event, content=None, **kwargs): (content and hasattr(content, "will_internal_type") and content.will_internal_type == "Event") ) and type(event) == type("words") ): - # User passed the string and message object backwards, and we're in a 1.x world + # "User passed the string and message object backwards, and we're in a 1.x world" temp_content = content content = event event = temp_content @@ -116,24 +120,32 @@ def reply(self, event, content=None, **kwargs): type(event) == type("words") and not content ): - # We're in the Will 2.0 automagic event finding. + # "We're in the Will 2.0 automagic event finding." content = event event = self.message else: - # Who knows what happened. Let it blow up. + # "No magic needed." pass # Be smart about backend. - message = event.data + if hasattr(event, "data"): + message = event.data + elif hasattr(self, "message") and hasattr(self.message, "data"): + message = self.message.data if hasattr(message, "backend"): - self.publish("message.outgoing.%s" % message.backend, Event( + e = Event( type="reply", content=content, + topic="message.outgoing.%s" % message.backend, source_message=message, kwargs=kwargs, - )) + ) + if package_for_scheduling: + return e + else: + self.publish("message.outgoing.%s" % message.backend, e) def set_topic(self, topic, message=None, room=None): @@ -148,11 +160,9 @@ def set_topic(self, topic, message=None, room=None): ) def schedule_say(self, content, when, message=None, room=None, *args, **kwargs): - - content = self._prepared_content(content, message, kwargs) - if message is None or message["type"] == "groupchat": - rooms = self._rooms_from_message_and_room(message, room) - for r in rooms: - self.add_room_message_to_schedule(when, content, r, *args, **kwargs) - elif message['type'] in ('chat', 'normal'): - self.add_direct_message_to_schedule(when, content, message, *args, **kwargs) + packaged_event = self.reply(None, content=content, message=message, package_for_scheduling=True) + self.add_outgoing_event_to_schedule(when, { + "type": "message", + "topic": packaged_event.topic, + "event": packaged_event, + }) diff --git a/will/plugins/productivity/remind.py b/will/plugins/productivity/remind.py index 5bf715d4..02b0a622 100644 --- a/will/plugins/productivity/remind.py +++ b/will/plugins/productivity/remind.py @@ -4,29 +4,30 @@ class RemindPlugin(WillPlugin): - @respond_to("(can|will you )?remind me to (?P.*?) (at|on|in) (?P.*)?\?+") + @respond_to("(?:can |will you )?remind me(?: to)? (?P.*?) (at|on|in) (?P.*)?\??") def remind_me_at(self, message, reminder_text=None, remind_time=None): """remind me to ___ at ___: Set a reminder for a thing, at a time.""" parsed_time = self.parse_natural_time(remind_time) natural_datetime = self.to_natural_day_and_time(parsed_time) - formatted_reminder_text = "@%(from_handle)s, you asked me to remind you %(reminder_text)s" % { + formatted_reminder_text = "%(mention_handle)s, you asked me to remind you %(reminder_text)s" % { + "mention_handle": message.sender.mention_handle, "from_handle": message.sender.handle, "reminder_text": reminder_text, } self.schedule_say(formatted_reminder_text, parsed_time, message=message) self.say("%(reminder_text)s %(natural_datetime)s. Got it." % locals(), message=message) - @respond_to("(can|will you )?remind (?P(?!me).*?) to (?P.*?) (at|on|in) (?P.*)?\?+") + @respond_to("(?:can|will you )?remind (?P(?!me).*?)(?: to) ?(?P.*?) (at|on|in) (?P.*)?\??") def remind_somebody_at(self, message, reminder_recipient=None, reminder_text=None, remind_time=None): """remind ___ to ___ at ___: Set a reminder for a thing, at a time for somebody else.""" parsed_time = self.parse_natural_time(remind_time) natural_datetime = self.to_natural_day_and_time(parsed_time) formatted_reminder_text = \ - "@%(reminder_recipient)s, %(from_handle)s asked me to remind you %(reminder_text)s" % { + "%(reminder_recipient)s, %(from_handle)s asked me to remind you %(reminder_text)s" % { "reminder_recipient": reminder_recipient, - "from_handle": message.sender.handle, + "from_handle": message.sender.mention_handle, "reminder_text": reminder_text, } diff --git a/will/scheduler.py b/will/scheduler.py index f7a60e14..c4521299 100644 --- a/will/scheduler.py +++ b/will/scheduler.py @@ -118,8 +118,10 @@ def check_scheduled_actions(self): logging.critical("Scheduler run blew up.\n\n%s\nContinuing...\n", traceback.format_exc()) def run_action(self, task): - if task["type"] == "room_message": - self.bot.send_room_message(task["room"]["room_id"], task["content"], *task["args"], **task["kwargs"]) + + if task["type"] == "message" and "topic" in task: + self.publish(task["topic"], task["event"]) + # self.bot.send_room_message(task["room"]["room_id"], task["content"], *task["args"], **task["kwargs"]) elif task["type"] == "direct_message": user = self.bot.get_user_by_jid(task["target_jid"]) self.bot.send_direct_message(user["hipchat_id"], task["content"], *task["args"], **task["kwargs"]) From 5eac5b291b32e486db9442699d4ff0e00e64f490 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 20 Oct 2017 12:36:11 +1300 Subject: [PATCH 037/200] Updates readme for 2.x --- README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a73c6fe4..42a003a6 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Meet Will. -Will is the friendliest, easiest-to-teach bot you've ever used. He works on hipchat, in rooms and 1-1 chats. +Will is the friendliest, easiest-to-teach bot you've ever used. He works on Slack, Hipchat, Rocket.chat, and more - so you can build your bot without platform lock-in. He makes teaching your chat bot this simple: @@ -14,12 +14,9 @@ def say_hello(self, message): self.say("oh, hello!") ``` -The hipchat Will was first built by [Steven Skoczen](http://stevenskoczen.com) while in the Greenkahuna Skunkworks (now defunct), was extended by [Ink and Feet](https://inkandfeet.com), and has been [contributed to by lots of awesome people](http://skoczen.github.io/will/improve/#the-shoulders-of-giants). +The first version of Will was built by [Steven Skoczen](http://stevenskoczen.com) while in the Greenkahuna Skunkworks (now defunct), was extended by [Ink and Feet](https://inkandfeet.com) and has been [contributed to by lots of awesome people](http://skoczen.github.io/will/improve/#the-shoulders-of-giants). Will has docs, including a quickstart and lots of screenshots at: **[http://skoczen.github.io/will/](http://skoczen.github.io/will)** Check them out! - - -**Big Update:** I've just posted the [roadmap and future direction](https://github.com/skoczen/will/issues/257) for will. Your thoughts are welcome!! From 9468ecb30b3b2ee070d7f7825631006d1d163ebd Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 20 Oct 2017 13:31:00 +1300 Subject: [PATCH 038/200] Attempt at start of weird hipchat bug. --- will/backends/io_adapters/hipchat.py | 2 +- will/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index d231955c..2223a9b1 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -171,7 +171,7 @@ def start_xmpp_client(self, xmpp_bridge_queue=None, backend_name=""): # ) # puts("") - self.nick = settings.HIPCHAT_NAME + self.nick = settings.HIPCHAT_HANDLE self.handle = settings.HIPCHAT_HANDLE self.mention_handle = "@%s" %settings.HIPCHAT_HANDLE diff --git a/will/settings.py b/will/settings.py index 12d8a014..bc496ae4 100644 --- a/will/settings.py +++ b/will/settings.py @@ -25,7 +25,7 @@ def import_settings(quiet=True): if k[:5] == "WILL_": k = k[5:] settings[k] = v - if "HIPCHAT_ROOMS" in settings: + if "HIPCHAT_ROOMS" in settings and type(settings["HIPCHAT_ROOMS"]) is type("tes"): settings["HIPCHAT_ROOMS"] = settings["HIPCHAT_ROOMS"].split(";") if "ROOMS" in settings: From 7b01e95a7b9e88c4c284394c886577fd04bfc877 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 20 Oct 2017 13:47:31 +1300 Subject: [PATCH 039/200] Moves to EncryptionMixin, but it's not fully baked yet and I don't want to hold up release. --- config.py | 3 +- will/backends/encryption/__init__.py | 0 will/backends/encryption/aes.py | 66 ++++++++++++++++++++++ will/backends/encryption/base.py | 12 ++++ will/backends/pubsub/base.py | 62 ++------------------ will/backends/storage/base.py | 18 ++++-- will/backends/storage/couchbase_backend.py | 4 +- will/backends/storage/file_backend.py | 4 +- will/backends/storage/redis_backend.py | 4 +- will/mixins/__init__.py | 1 + will/mixins/encryption.py | 31 ++++++++++ 11 files changed, 137 insertions(+), 68 deletions(-) create mode 100644 will/backends/encryption/__init__.py create mode 100644 will/backends/encryption/aes.py create mode 100644 will/backends/encryption/base.py create mode 100644 will/mixins/encryption.py diff --git a/config.py b/config.py index 07861de9..6250ac5c 100644 --- a/config.py +++ b/config.py @@ -221,9 +221,10 @@ # Disable Hipchat SSL checks. Strongly reccomended this is not set to True. # ALLOW_INSECURE_HIPCHAT_SERVER = False -# Turn on/off encryption in the pub/sub layer (default is on). +# Turn on/off encryption in pub/sub and storage (default is on). # Causes a small speed bump, but secures messages in an untrusted environment. # ENABLE_INTERNAL_ENCRYPTION = False +# ENCRYPTION_BACKEND = "aes" # Mailgun config, if you'd like will to send emails. # DEFAULT_FROM_EMAIL="will@example.com" diff --git a/will/backends/encryption/__init__.py b/will/backends/encryption/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/will/backends/encryption/aes.py b/will/backends/encryption/aes.py new file mode 100644 index 00000000..5ccb1360 --- /dev/null +++ b/will/backends/encryption/aes.py @@ -0,0 +1,66 @@ +import binascii +import base64 +import codecs +import dill as pickle +import hashlib +import logging +from Crypto.Cipher import AES +import random +import os +import traceback + +from will import settings +from will.backends.encryption.base import WillBaseEncryptionBackend + + +BS = 16 +key = hashlib.sha256(settings.SECRET_KEY).digest() + + +def pad(s): + s = s + (BS - len(s) % BS) * "~" + return s + + +def unpad(s): + while s.endswith("~"): + s = s[:-1] + return s + + +class AESEncryption(WillBaseEncryptionBackend): + + @classmethod + def encrypt_to_b64(cls, raw): + try: + enc = binascii.b2a_base64(pickle.dumps(raw, -1)) + if settings.ENABLE_INTERNAL_ENCRYPTION: + iv = binascii.b2a_hex(os.urandom(8)) + cipher = AES.new(key, AES.MODE_CBC, iv) + enc = binascii.b2a_base64(cipher.encrypt(pad(enc))) + return "%s/%s" % (iv, enc) + else: + return enc + except: + logging.critical("Error preparing message for the wire: \n%s" % traceback.format_exc()) + return None + + @classmethod + def decrypt_from_b64(cls, enc): + try: + if settings.ENABLE_INTERNAL_ENCRYPTION: + iv = enc[:BS] + enc = enc[BS+1:] + cipher = AES.new(key, AES.MODE_CBC, iv) + enc = unpad(cipher.decrypt(binascii.a2b_base64(enc))) + obj = pickle.loads(binascii.a2b_base64(enc)) + return obj + except (KeyboardInterrupt, SystemExit): + pass + except: + logging.critical("Error unpacking message from the wire: \n%s" % traceback.format_exc()) + return None + + +def bootstrap(settings): + return AESEncryption(settings) diff --git a/will/backends/encryption/base.py b/will/backends/encryption/base.py new file mode 100644 index 00000000..da4b0824 --- /dev/null +++ b/will/backends/encryption/base.py @@ -0,0 +1,12 @@ +class WillBaseEncryptionBackend(object): + + def __init__(self, *args, **kwargs): + pass + + @staticmethod + def encrypt_to_b64(raw): + raise NotImplemented + + @staticmethod + def decrypt_from_b64(enc): + raise NotImplemented diff --git a/will/backends/pubsub/base.py b/will/backends/pubsub/base.py index e56dc975..154a3a8b 100644 --- a/will/backends/pubsub/base.py +++ b/will/backends/pubsub/base.py @@ -1,69 +1,17 @@ -import binascii -import base64 -import codecs -import dill as pickle -import hashlib import logging import os import redis import traceback import urlparse -from Crypto.Cipher import AES -import random + from will.abstractions import Event from will import settings -from will.mixins import SettingsMixin +from will.mixins import SettingsMixin, EncryptionMixin SKIP_TYPES = ["psubscribe", "punsubscribe", ] -if settings.ENABLE_INTERNAL_ENCRYPTION: - BS = 16 - key = hashlib.sha256(settings.SECRET_KEY).digest() - - -def pad(s): - s = s + (BS - len(s) % BS) * "~" - return s - - -def unpad(s): - while s.endswith("~"): - s = s[:-1] - return s - - -def pack_for_wire(raw): - try: - enc = binascii.b2a_base64(pickle.dumps(raw, -1)) - if settings.ENABLE_INTERNAL_ENCRYPTION: - iv = binascii.b2a_hex(os.urandom(8)) - cipher = AES.new(key, AES.MODE_CBC, iv) - enc = binascii.b2a_base64(cipher.encrypt(pad(enc))) - return "%s/%s" % (iv, enc) - else: - return enc - except: - logging.critical("Error preparing message for the wire: \n%s" % traceback.format_exc()) - return None - - -def unpack_from_wire(enc): - try: - if settings.ENABLE_INTERNAL_ENCRYPTION: - iv = enc[:BS] - enc = enc[BS+1:] - cipher = AES.new(key, AES.MODE_CBC, iv) - enc = unpad(cipher.decrypt(binascii.a2b_base64(enc))) - obj = pickle.loads(binascii.a2b_base64(enc)) - return obj - except (KeyboardInterrupt, SystemExit): - pass - except: - logging.critical("Error unpacking message from the wire: \n%s" % traceback.format_exc()) - return None - -class BasePubSub(SettingsMixin): +class BasePubSub(SettingsMixin, EncryptionMixin): """ The base pubsub backend. Subclassing methods must implement: @@ -130,7 +78,7 @@ def publish(self, topic, obj, reference_message=None): return self.publish_to_backend( self._localize_topic(topic), - pack_for_wire(e) + self.encrypt(e) ) def _localize_topic(self, topic): @@ -156,7 +104,7 @@ def get_message(self): try: m = self.get_from_backend() if m and m["type"] not in SKIP_TYPES: - loaded_message = unpack_from_wire(m["data"]) + loaded_message = self.decrypt(m["data"]) # Handling inconsistent backends, but appears to no longer be an issue. # if not loaded_message["hash"] in self.recent_hashes: # self.recent_hashes.append(loaded_message["hash"]) diff --git a/will/backends/storage/base.py b/will/backends/storage/base.py index 2b3ac66a..0fb51a8b 100644 --- a/will/backends/storage/base.py +++ b/will/backends/storage/base.py @@ -1,9 +1,9 @@ import redis import urlparse -from will.mixins import SettingsMixin +from will.mixins import SettingsMixin, EncryptionMixin -class BaseStorageBackend(SettingsMixin, object): +class BaseStorageBackend(SettingsMixin, EncryptionMixin, object): required_settings = [] """ @@ -15,7 +15,7 @@ class BaseStorageBackend(SettingsMixin, object): load() - gets a value from the backend """ - def save(self, key, value, expire=None): + def backend_save(self, key, value, expire=None): raise NotImplemented def clear(self, key): @@ -24,5 +24,15 @@ def clear(self, key): def clear_all_keys(self): raise NotImplemented - def load(self, key): + def backend_load(self, key): raise NotImplemented + + def save(self, key, value, *args, **kwargs): + self.backend_save(key, self.encrypt(value), *args, **kwargs) + + def load(self, key, *args, **kwargs): + try: + return self.decrypt(self.backend_load(key, *args, **kwargs)) + except: + print "error decrypting. Assuming unencrypted for %s" % key + return self.backend_load(key, *args, **kwargs) diff --git a/will/backends/storage/couchbase_backend.py b/will/backends/storage/couchbase_backend.py index 60e1f03a..6e508ac6 100644 --- a/will/backends/storage/couchbase_backend.py +++ b/will/backends/storage/couchbase_backend.py @@ -46,7 +46,7 @@ def __init__(self, settings): port=url.port or 8091, **params) - def save(self, key, value, expire=None): + def backend_save(self, key, value, expire=None): res = self.couchbase.set(key, value, ttl=expire) return res.success @@ -62,7 +62,7 @@ def clear_all_keys(self): """ return "Sorry, you must flush the Couchbase bucket from the Admin UI" - def load(self, key): + def backend_load(self, key): try: res = self.couchbase.get(key) return res.value diff --git a/will/backends/storage/file_backend.py b/will/backends/storage/file_backend.py index 14f6c195..cb6997a8 100644 --- a/will/backends/storage/file_backend.py +++ b/will/backends/storage/file_backend.py @@ -73,7 +73,7 @@ def _key_paths(self, key): expire_path = os.path.join(self.dirname, '.' + key + '.expires') return key_path, expire_path - def save(self, key, value, expire=None): + def backend_save(self, key, value, expire=None): key_path, expire_path = self._key_paths(key) with open(key_path, 'w') as f: f.write(value) @@ -95,7 +95,7 @@ def clear_all_keys(self): for filename in self._all_setting_files(): os.unlink(filename) - def load(self, key): + def backend_load(self, key): key_path, expire_path = self._key_paths(key) if os.path.exists(expire_path): diff --git a/will/backends/storage/redis_backend.py b/will/backends/storage/redis_backend.py index 7ce5723b..57bffa75 100644 --- a/will/backends/storage/redis_backend.py +++ b/will/backends/storage/redis_backend.py @@ -41,7 +41,7 @@ def __init__(self, settings): ) self.redis = redis.Redis(connection_pool=connection_pool) - def save(self, key, value, expire=None): + def backend_save(self, key, value, expire=None): return self.redis.set(key, value, ex=expire) def clear(self, key): @@ -50,7 +50,7 @@ def clear(self, key): def clear_all_keys(self): return self.redis.flushdb() - def load(self, key): + def backend_load(self, key): return self.redis.get(key) def size(self): diff --git a/will/mixins/__init__.py b/will/mixins/__init__.py index afb40d3f..63517fa5 100644 --- a/will/mixins/__init__.py +++ b/will/mixins/__init__.py @@ -1,4 +1,5 @@ from will.mixins.errors import ErrorMixin +from will.mixins.encryption import EncryptionMixin from will.mixins.email import EmailMixin from will.mixins.naturaltime import NaturalTimeMixin from will.mixins.room import RoomMixin diff --git a/will/mixins/encryption.py b/will/mixins/encryption.py new file mode 100644 index 00000000..8a592658 --- /dev/null +++ b/will/mixins/encryption.py @@ -0,0 +1,31 @@ +import importlib +import logging +import dill as pickle +import functools +from will import settings + + +class EncryptionMixin(object): + @property + def encryption_backend(self): + if not hasattr(self, "_encryption"): + if hasattr(self, "bot") and hasattr(self.bot, "_encryption"): + self._encryption = self.bot._encryption + else: + # The ENCRYPTION_BACKEND setting points to a specific module namespace + # aes => will.encryption.aes + module_name = ''.join([ + 'will.backends.encryption.', + getattr(settings, 'ENCRYPTION_BACKEND', 'aes'), + ]) + encryption_module = importlib.import_module(module_name) + self._encryption = encryption_module.bootstrap(settings) + return self._encryption + + def encrypt(self, raw): + return self.encryption_backend.encrypt_to_b64(raw) + + def decrypt(self, enc): + if enc: + return self.encryption_backend.decrypt_from_b64(enc) + return None From 65290d2e5d9086f67584769903a2179e86f0d8f9 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 20 Oct 2017 15:15:24 +1300 Subject: [PATCH 040/200] Handles history null state --- config.py | 3 ++- will/backends/analysis/history.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/config.py b/config.py index 07861de9..8d68c1e7 100644 --- a/config.py +++ b/config.py @@ -150,7 +150,8 @@ # The list of rooms will should join. Default is all rooms. # TODO: Appears to be Hipchat-specific, should be renamed or # deprecated. -# ROOMS = ['Will Testing', ] +# HIPCHAT_NAME = "will" +# HIPCHAT_ROOMS = ['Will Testing'] # The maximum number of milliseconds to wait for an analysis backend to finish # ANALYSIS_TIMEOUT_MS = 2000 diff --git a/will/backends/analysis/history.py b/will/backends/analysis/history.py index 05050cf4..3b8136d4 100644 --- a/will/backends/analysis/history.py +++ b/will/backends/analysis/history.py @@ -13,6 +13,8 @@ def do_analyze(self, message): # print("history analyze") # print(message) history = self.load("message_history", []) + if not history: + history = [] max_history_context = getattr(settings, "HISTORY_CONTEXT_LENGTH", 20) if history: From 1e544302773bb84dedaa0ca5b076d581ff32fcfd Mon Sep 17 00:00:00 2001 From: Roy Zheng Date: Fri, 20 Oct 2017 13:59:45 -0700 Subject: [PATCH 041/200] Add Roy Zheng to AUTHORS, clean up trailing slashes --- AUTHORS | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index 64c6e6f5..a7d4fc0e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -21,7 +21,7 @@ Adam Papai, https://github.com/woohgit Jessamyn Smith, https://github.com/jessamynsmith Brandon Sturgeon, https://github.com/brandonsturgeon Ryan Murfitt, https://github.com/puug -Piotr 'keNzi' Czajkowski, http://www.videotesty.pl/ +Piotr 'keNzi' Czajkowski, http://www.videotesty.pl Dmitri Muntean, https://github.com/dmuntean Ben lau, Mashery, https://github.com/netjunki Evan Borgstrom, https://github.com/borgstrom @@ -42,7 +42,8 @@ Regner Blok-Andersen, https://github.com/Regner danbourke, https://github.com/danbourke Jose Cueto, https://github.com/pepedocs Derek Adair, https://github.com/derek-adair -Antony Gelberg, https://github.com/antgel/ +Antony Gelberg, https://github.com/antgel Jeppe Toustrup, https://github.com/Tenzer bykof, https://github.com/bykof/ -Mike Love, https://github.com/mike-love/ +Mike Love, https://github.com/mike-love +Roy Zheng, https://github.com/wontonst From 775e079f12627b4abcc68128f025f1d33f95490c Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Mon, 23 Oct 2017 12:24:35 +1300 Subject: [PATCH 042/200] Provide a fallback in case yappi isn't installed. --- start_profiled_will.py | 5 ++++- will/decorators.py | 8 ++++++++ will/main.py | 38 +++++++++++++++++++++----------------- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/start_profiled_will.py b/start_profiled_will.py index 11421be3..d21e2df9 100755 --- a/start_profiled_will.py +++ b/start_profiled_will.py @@ -5,7 +5,10 @@ def start_will(): - shutil.rmtree('will_profiles') + try: + shutil.rmtree('will_profiles') + except OSError: + pass os.makedirs("will_profiles") bot = WillBot() diff --git a/will/decorators.py b/will/decorators.py index 082b3fb7..4c0f5ca1 100644 --- a/will/decorators.py +++ b/will/decorators.py @@ -7,6 +7,14 @@ def deprecation_warning_for_admin(f): return err +def passthrough_decorator(*args, **kwargs): + def wrap(f): + def wrapped_f(*args, **kwargs): + f(*args, **kwargs) + return wrapped_f + return wrap + + def respond_to(regex, include_me=False, case_sensitive=False, multiline=False, admin_only=False, acl=set()): def wrap(f): passed_args = [] diff --git a/will/main.py b/will/main.py index 8693d3bb..0a3e41b5 100644 --- a/will/main.py +++ b/will/main.py @@ -13,7 +13,11 @@ import threading import time import traceback -import yappi +try: + from yappi import profile as yappi_profile +except: + from will.decorators import passthrough_decorator as yappi_profile + from cStringIO import StringIO from importlib import import_module from clint.textui import colored, puts, indent @@ -121,7 +125,7 @@ def __init__(self, **kwargs): os.environ["WILL_TEMPLATE_DIRS_PICKLED"] =\ ";;".join(full_path_template_dirs) - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def bootstrap(self): print_head() self.load_config() @@ -229,7 +233,7 @@ def load_config(self): settings.import_settings(quiet=False) puts("") - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def verify_io(self): puts("Verifying IO backends...") missing_settings = False @@ -283,7 +287,7 @@ def verify_io(self): sys.exit(1) puts() - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def verify_analysis(self): puts("Verifying Analysis backends...") missing_settings = False @@ -326,7 +330,7 @@ def verify_analysis(self): sys.exit(1) puts() - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def verify_generate(self): puts("Verifying Generation backends...") missing_settings = False @@ -369,7 +373,7 @@ def verify_generate(self): sys.exit(1) puts() - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def verify_execution(self): puts("Verifying Execution backend...") missing_settings = False @@ -412,7 +416,7 @@ def verify_execution(self): sys.exit(1) puts() - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def bootstrap_execution(self): missing_setting_error_messages = [] self.execution_backends = [] @@ -449,7 +453,7 @@ def bootstrap_execution(self): ) sys.exit(1) - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def verify_plugin_settings(self): puts("Verifying settings requested by plugins...") @@ -551,7 +555,7 @@ def handle_sys_exit(self, *args, **kwargs): print(". done.\n") sys.exit(1) - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def bootstrap_event_handler(self): self.analysis_timeout = getattr(settings, "ANALYSIS_TIMEOUT_MS", 2000) self.generation_timeout = getattr(settings, "GENERATION_TIMEOUT_MS", 2000) @@ -670,7 +674,7 @@ def bootstrap_event_handler(self): except: logging.exception("Error handling message") - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def bootstrap_storage_mixin(self): puts("Bootstrapping storage...") try: @@ -690,7 +694,7 @@ def bootstrap_storage_mixin(self): puts(traceback.format_exc(e)) sys.exit(1) - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def bootstrap_pubsub_mixin(self): puts("Bootstrapping pubsub...") try: @@ -710,7 +714,7 @@ def bootstrap_pubsub_mixin(self): puts(traceback.format_exc(e)) sys.exit(1) - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def bootstrap_scheduler(self): bootstrapped = False try: @@ -746,7 +750,7 @@ def bootstrap_scheduler(self): show_valid("Scheduler started.") self.scheduler.start_loop(self) - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def bootstrap_bottle(self): bootstrapped = False try: @@ -765,7 +769,7 @@ def bootstrap_bottle(self): show_valid("Web server started.") bottle.run(host='0.0.0.0', port=settings.HTTPSERVER_PORT, server='cherrypy', quiet=True) - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def bootstrap_io(self): # puts("Bootstrapping IO...") self.has_stdin_io_backend = False @@ -808,7 +812,7 @@ def bootstrap_io(self): self.io_backends.append(b) - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def bootstrap_analysis(self): self.analysis_backends = [] @@ -838,7 +842,7 @@ def bootstrap_analysis(self): self.analysis_backends.append(b) pass - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def bootstrap_generation(self): self.generation_backends = [] self.generation_threads = [] @@ -867,7 +871,7 @@ def bootstrap_generation(self): self.generation_backends.append(b) pass - @yappi.profile(return_callback=yappi_aggregate) + @yappi_profile(return_callback=yappi_aggregate) def bootstrap_plugins(self): puts("Bootstrapping plugins...") OTHER_HELP_HEADING = "Other" From 858784652be88ec86808182aef778adc630651d7 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Mon, 23 Oct 2017 13:37:48 +1300 Subject: [PATCH 043/200] Adds support for slack to specify by channel name or ID, as well as the best fallbacks we can if nothing has been specified. --- config.py | 8 +- will/backends/io_adapters/slack.py | 160 ++++++++++++++++++++--------- will/main.py | 2 +- will/plugin.py | 10 +- will/settings.py | 11 ++ 5 files changed, 133 insertions(+), 58 deletions(-) diff --git a/config.py b/config.py index 8d68c1e7..d53cca58 100644 --- a/config.py +++ b/config.py @@ -73,10 +73,10 @@ # Platforms and mediums messages can come in and go out on. IO_BACKENDS = [ + "will.backends.io_adapters.slack", "will.backends.io_adapters.hipchat", # "will.backends.io_adapters.rocketchat", "will.backends.io_adapters.shell", - "will.backends.io_adapters.slack", ] # Backends to analyze messages and generate useful metadata @@ -121,7 +121,7 @@ # ------------------------------------------------------------------------------------ # Slack settings # ------------------------------------------------------------------------------------ - +# SLACK_DEFAULT_CHANNEL = "alpha" # ------------------------------------------------------------------------------------ # Rocket.chat settings @@ -150,8 +150,8 @@ # The list of rooms will should join. Default is all rooms. # TODO: Appears to be Hipchat-specific, should be renamed or # deprecated. -# HIPCHAT_NAME = "will" -# HIPCHAT_ROOMS = ['Will Testing'] +HIPCHAT_HANDLE = "will" +HIPCHAT_ROOMS = ['Will Testing', 'Will and I'] # The maximum number of milliseconds to wait for an analysis backend to finish # ANALYSIS_TIMEOUT_MS = 2000 diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index 785244cc..d1ed054f 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -12,7 +12,7 @@ from will import settings from .base import IOBackend from will.utils import Bunch, UNSURE_REPLIES, clean_for_pickling -from will.mixins import SleepMixin +from will.mixins import SleepMixin, StorageMixin from multiprocessing import Process from will.abstractions import Event, Message, Person, Channel from slackclient import SlackClient @@ -26,7 +26,7 @@ def convert_strong(self, el, text): return '*%s*' % text if text else '' -class SlackBackend(IOBackend, SleepMixin): +class SlackBackend(IOBackend, SleepMixin, StorageMixin): friendly_name = "Slack" internal_name = "will.backends.io_adapters.slack" required_settings = [ @@ -38,6 +38,11 @@ class SlackBackend(IOBackend, SleepMixin): } ] + def get_channel_from_name(self, name): + for k, c in self.channels.items(): + if c.name == name or c.id == name: + return c + def normalize_incoming_event(self, event): if ( @@ -148,18 +153,20 @@ def handle_outgoing_event(self, event): kwargs.update(**event.kwargs) if "room" in kwargs: - self.send_room_message( - kwargs["room"], - event.content, - **kwargs - ) + event.channel = self.get_channel_from_name(kwargs["room"]) + elif "channel" in kwargs: + event.channel = self.get_channel_from_name(kwargs["channel"]) else: - default_room = self.get_room_from_name_or_id(settings.HIPCHAT_DEFAULT_ROOM)["room_id"] - self.send_room_message( - default_room, - event.content, - **kwargs - ) + if hasattr(settings, "SLACK_DEFAULT_ROOM"): + event.channel = self.get_channel_from_name(settings.SLACK_DEFAULT_ROOM) + else: + # Set self.me + self.people + for c in self.channels.values(): + if c.name != c.id and self.me.id in c.members: + event.channel = c + break + self.send_message(event) elif ( event.type == "message.no_response" and @@ -196,40 +203,44 @@ def send_message(self, event): # TODO: This is terrifingly ugly. Yes, it works. No, I will not have any idea how # in a few months. Abstract this stuff out! - if "source_message" in event: - # Mentions that come back via self.say() - if hasattr(event.source_message, "data"): - channel_id = event.source_message.data.channel.id - if hasattr(event.source_message.data, "thread"): - data.update({ - "thread_ts": event.source_message.data.thread - }) - else: - # Mentions that come back via self.say() with a specific room (I think) - channel_id = event.source_message.channel.id - if hasattr(event.source_message, "thread"): - data.update({ - "thread_ts": event.source_message.thread - }) + if "channel" in event: + # We're coming off an explicit set. + channel_id = event.channel.id else: - # Mentions that come back via self.reply() - if hasattr(event.data, "original_incoming_event"): - if hasattr(event.data.original_incoming_event.channel, "id"): - channel_id = event.data.original_incoming_event.channel.id + if "source_message" in event: + # Mentions that come back via self.say() + if hasattr(event.source_message, "data"): + channel_id = event.source_message.data.channel.id + if hasattr(event.source_message.data, "thread"): + data.update({ + "thread_ts": event.source_message.data.thread + }) else: - channel_id = event.data.original_incoming_event.channel + # Mentions that come back via self.say() with a specific room (I think) + channel_id = event.source_message.channel.id + if hasattr(event.source_message, "thread"): + data.update({ + "thread_ts": event.source_message.thread + }) else: - if hasattr(event.data["original_incoming_event"].data.channel, "id"): - channel_id = event.data["original_incoming_event"].data.channel.id + # Mentions that come back via self.reply() + if hasattr(event.data, "original_incoming_event"): + if hasattr(event.data.original_incoming_event.channel, "id"): + channel_id = event.data.original_incoming_event.channel.id + else: + channel_id = event.data.original_incoming_event.channel else: - channel_id = event.data["original_incoming_event"].data.channel + if hasattr(event.data["original_incoming_event"].data.channel, "id"): + channel_id = event.data["original_incoming_event"].data.channel.id + else: + channel_id = event.data["original_incoming_event"].data.channel - try: - data.update({ - "thread_ts": event.data["original_incoming_event"].data.thread - }) - except: - pass + try: + data.update({ + "thread_ts": event.data["original_incoming_event"].data.thread + }) + except: + pass # Auto-link mention names if data["text"].find("<@") != -1: @@ -255,7 +266,18 @@ def send_message(self, event): ) resp_json = r.json() if not resp_json["ok"]: - assert resp_json["ok"] + if resp_json["error"] == "not_in_channel": + channel = self.get_channel_from_name(data["channel"]) + if not hasattr(self, "me") or not hasattr(self.me, "handle"): + self.people + + logging.critical( + "I was asked to post to the slack %s channel, but I haven't been invited. " + "Please invite me with '/invite @%s'" % (channel.name, self.me.handle) + ) + else: + logging.error("Error sending to slack: %s" % resp_json["error"]) + assert resp_json["ok"] def _map_color(self, color): # Turn colors into hex values, handling old slack colors, etc @@ -268,6 +290,30 @@ def _map_color(self, color): return color + def join_channel(self, channel_id): + return self.client.api_call( + "channels.join", + channel=channel_id, + ) + + @property + def people(self): + if not hasattr(self, "_people") or self._people is {}: + self._update_people() + return self._people + + @property + def channels(self): + if not hasattr(self, "_channels") or self._channels is {}: + self._update_channels() + return self._channels + + @property + def client(self): + if not hasattr(self, "_client"): + self._client = SlackClient(settings.SLACK_API_TOKEN) + return self._client + def _update_channels(self): channels = {} for c in self.client.server.channels: @@ -281,12 +327,16 @@ def _update_channels(self): source=clean_for_pickling(c), members=members ) - self.channels = channels + if len(channels.keys()) == 0: + # Server isn't set up yet, and we're likely in a processing thread, + if self.load("slack_channel_cache", None): + self._channels = self.load("slack_channel_cache", None) + else: + self._channels = channels + self.save("slack_channel_cache", channels) def _update_people(self): people = {} - if not hasattr(self, "client"): - self.client = SlackClient(settings.SLACK_API_TOKEN) self.handle = self.client.server.username @@ -313,7 +363,19 @@ def _update_people(self): people[k].timezone = user_timezone if v.name == self.handle: self.me.timezone = user_timezone - self.people = people + if len(people.keys()) == 0: + # Server isn't set up yet, and we're likely in a processing thread, + if self.load("slack_people_cache", None): + self._people = self.load("slack_people_cache", None) + if not hasattr(self, "me") or not self.me: + self.me = self.load("slack_me_cache", None) + if not hasattr(self, "handle") or not self.handle: + self.handle = self.load("slack_handle_cache", None) + else: + self._people = people + self.save("slack_people_cache", people) + self.save("slack_me_cache", self.me) + self.save("slack_handle_cache", self.handle) def _update_backend_metadata(self): self._update_people() @@ -356,7 +418,9 @@ def bootstrap(self): # Note that Channel asks for members, a list of People. # f) A way for self.handle, self.me, self.people, and self.channels to be kept accurate, # with a maximum lag of 60 seconds. - self.client = SlackClient(settings.SLACK_API_TOKEN) + + # Property, auto-inits. + self.client self.rtm_thread = Process(target=self._watch_slack_rtm) self.rtm_thread.start() diff --git a/will/main.py b/will/main.py index 0a3e41b5..61e6e2c4 100644 --- a/will/main.py +++ b/will/main.py @@ -766,7 +766,7 @@ def bootstrap_bottle(self): except Exception as e: self.startup_error("Error bootstrapping bottle", e) if bootstrapped: - show_valid("Web server started.") + show_valid("Web server started at %s." % (settings.PUBLIC_URL,)) bottle.run(host='0.0.0.0', port=settings.HTTPSERVER_PORT, server='cherrypy', quiet=True) @yappi_profile(return_callback=yappi_aggregate) diff --git a/will/plugin.py b/will/plugin.py index c087365e..0d607bd8 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -59,12 +59,12 @@ def say(self, content, message=None, room=None, package_for_scheduling=False, ** kwargs["room"] = room backend = False - if not message: + if not message and hasattr(self, "message"): message = self.message - message = self._trim_for_execution(message) - logging.info(message) + if message: + message = self._trim_for_execution(message) - if hasattr(message, "backend"): + if message and hasattr(message, "backend"): # Events, content/type/timestamp # { # message: message, @@ -73,7 +73,7 @@ def say(self, content, message=None, room=None, package_for_scheduling=False, ** backend = message.backend else: # TODO: need a clear, documented spec for this. - if hasattr(message, "data") and hasattr(message.data, "backend"): + if message and hasattr(message, "data") and hasattr(message.data, "backend"): logging.info(message.data) logging.info(message.data.__dict__) backend = message.data.backend diff --git a/will/settings.py b/will/settings.py index bc496ae4..3a465ec3 100644 --- a/will/settings.py +++ b/will/settings.py @@ -141,6 +141,14 @@ def import_settings(quiet=True): "Defaulting to '%s', the first one." % settings["IO_BACKENDS"][0]) settings["DEFAULT_BACKEND"] = settings["IO_BACKENDS"][0] + for b in settings["IO_BACKENDS"]: + if "slack" in b and "SLACK_DEFAULT_CHANNEL" not in settings and not quiet: + warn( + "No SLACK_DEFAULT_CHANNEL set - any messages sent without an explicit channel will go " + "to a non-deterministic channel that will has access to " + "- this is almost certainly not what you want." + ) + if "ENABLE_INTERNAL_ENCRYPTION" not in settings: settings["ENABLE_INTERNAL_ENCRYPTION"] = True @@ -263,6 +271,9 @@ def import_settings(quiet=True): if "EVENT_LOOP_INTERVAL" not in settings: settings["EVENT_LOOP_INTERVAL"] = 0.025 + if "LOGLEVEL" not in settings: + settings["LOGLEVEL"] = "ERROR" + if "SECRET_KEY" not in settings: if not quiet: note( From 5bf3298a35af3e4ebea5cae0bedb23c6c692f763 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 11:16:18 +1300 Subject: [PATCH 044/200] Adds abstracted topic support, cleans up the worst bits left. --- will/backends/io_adapters/hipchat.py | 65 +++++++++----- will/backends/io_adapters/rocketchat.py | 5 ++ will/backends/io_adapters/shell.py | 4 +- will/backends/io_adapters/slack.py | 112 +++++++++++++++--------- will/plugin.py | 90 ++++++++----------- 5 files changed, 160 insertions(+), 116 deletions(-) diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index 2223a9b1..d343b1cb 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -173,7 +173,7 @@ def start_xmpp_client(self, xmpp_bridge_queue=None, backend_name=""): self.nick = settings.HIPCHAT_HANDLE self.handle = settings.HIPCHAT_HANDLE - self.mention_handle = "@%s" %settings.HIPCHAT_HANDLE + self.mention_handle = "@%s" % settings.HIPCHAT_HANDLE self.whitespace_keepalive = True self.whitespace_keepalive_interval = 30 @@ -395,6 +395,29 @@ def set_room_topic(self, room_id, topic): except: logging.critical("Error in set_room_topic: \n%s" % traceback.format_exc()) + def get_room_from_message(self, event): + kwargs = {} + if hasattr(event, "kwargs"): + kwargs.update(event.kwargs) + if hasattr(event, "source_message") and event.source_message: + send_source = event.source_message + if hasattr(event.source_message, "data"): + send_source = event.source_message.data + + if send_source.is_private_chat: + # Private, 1-1 chats. + return False + else: + # We're in a public room + return send_source.channel.id, + else: + # Came from webhook/etc + if "room" in kwargs: + return kwargs["room"], + else: + return self.get_room_from_name_or_id(settings.HIPCHAT_DEFAULT_ROOM)["room_id"] + return False + def get_hipchat_user(self, user_id, q=None): url = USER_DETAILS_URL % {"server": settings.HIPCHAT_SERVER, "user_id": user_id, @@ -539,38 +562,36 @@ def handle_outgoing_event(self, event): if event.type in ["say", "reply"]: event.content = re.sub(r'>\s+<', '><', event.content) + room = self.get_room_from_message(event) if hasattr(event, "source_message") and event.source_message: send_source = event.source_message + if hasattr(event.source_message, "data"): send_source = event.source_message.data if send_source.is_private_chat: # Private, 1-1 chats. self.send_direct_message(send_source.sender.id, event.content, **kwargs) + return - else: - # We're in a public room - self.send_room_message( - send_source.channel.id, - event.content, - **kwargs - ) + # Otherwise trust room. + self.send_room_message( + room, + event.content, + **kwargs + ) + elif event.type in ["topic_change", ]: + room = self.get_room_from_message(event) + if room: + self.set_room_topic(room, event.content) else: - # Came from webhook/etc - if "room" in kwargs: - self.send_room_message( - kwargs["room"], - event.content, - **kwargs - ) - else: - default_room = self.get_room_from_name_or_id(settings.HIPCHAT_DEFAULT_ROOM)["room_id"] - self.send_room_message( - default_room, - event.content, - **kwargs - ) + if hasattr(event, "source_message") and event.source_message: + send_source = event.source_message + + if hasattr(event.source_message, "data"): + send_source = event.source_message.data + self.send_direct_message(send_source.sender.id, "I can't set the topic of a one-to-one chat. Let's just talk.", **kwargs) elif ( event.type == "message.no_response" and diff --git a/will/backends/io_adapters/rocketchat.py b/will/backends/io_adapters/rocketchat.py index 63df4688..52707cdd 100644 --- a/will/backends/io_adapters/rocketchat.py +++ b/will/backends/io_adapters/rocketchat.py @@ -187,6 +187,8 @@ def handle_outgoing_event(self, event): # **kwargs # ) + if event.type in ["topic_change", ]: + self.set_room_topic(event.content) elif ( event.type == "message.no_response" and event.data["source"].data.is_direct and @@ -195,6 +197,9 @@ def handle_outgoing_event(self, event): event.content = random.choice(UNSURE_REPLIES) self.send_message(event) + def set_topic(self, event): + logging.warn("Rocket.Chat doesn't support topics yet: https://github.com/RocketChat/Rocket.Chat/issues/328") + def send_message(self, event): logging.info('Sending message to Rocket.Chat') logging.debug('event: {}'.format(self.pp.pformat(event))) diff --git a/will/backends/io_adapters/shell.py b/will/backends/io_adapters/shell.py index cde65599..cf636221 100644 --- a/will/backends/io_adapters/shell.py +++ b/will/backends/io_adapters/shell.py @@ -35,7 +35,7 @@ def send_room_message(self, room_id, message_body, html=False, color="green", no print("Will: %s" % html_to_text(message_body)) def set_room_topic(self, room_id, topic): - print("Will: Setting the Topic to %s" & topic) + print("Will: Let's talk about %s" & topic) def normalize_incoming_event(self, event): if event["type"] == "message.incoming.stdin": @@ -61,6 +61,8 @@ def handle_outgoing_event(self, event): # Print any replies. if event.type in ["say", "reply"]: self.send_direct_message(event.content) + if event.type in ["topic_change", ]: + self.set_room_topic("Let's talk about %s" % event.content) elif event.type == "message.no_response": if event.data and hasattr(event.data, "original_incoming_event") and len(event.data.original_incoming_event.data.content) > 0: diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index d1ed054f..f5a0534c 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -18,6 +18,8 @@ from slackclient import SlackClient SLACK_SEND_URL = "https://slack.com/api/chat.postMessage" +SLACK_SET_TOPIC_URL = "https://slack.com/api/channels.setTopic" +SLACK_PRIVATE_SET_TOPIC_URL = "https://slack.com/api/groups.setTopic" class SlackMarkdownConverter(MarkdownConverter): @@ -51,7 +53,7 @@ def normalize_incoming_event(self, event): ("subtype" not in event or event["subtype"] != "message_changed") and # Ignore thread summary events (for now.) # TODO: We should stack these into the history. - ("subtype" not in event or "thread_ts" not in event["message"]) + ("subtype" not in event or ("message" in event and "thread_ts" not in event["message"])) ): # print("slack: normalize_incoming_event - %s" % event) # Sample of group message @@ -133,6 +135,26 @@ def normalize_incoming_event(self, event): # An event type the slack ba has no idea how to handle. pass + def set_topic(self, event): + headers = {'Accept': 'text/plain'} + data = self.set_data_channel_and_thread(event) + data.update({ + "token": settings.SLACK_API_TOKEN, + "as_user": True, + "topic": event.content, + }) + if data["channel"].startswith("G"): + url = SLACK_PRIVATE_SET_TOPIC_URL + else: + url = SLACK_SET_TOPIC_URL + r = requests.post( + url, + headers=headers, + data=data, + **settings.REQUESTS_OPTIONS + ) + self.handle_request(r, data) + def handle_outgoing_event(self, event): if event.type in ["say", "reply"]: if "kwargs" in event and "html" in event.kwargs and event.kwargs["html"]: @@ -168,6 +190,8 @@ def handle_outgoing_event(self, event): break self.send_message(event) + if event.type in ["topic_change", ]: + self.set_topic(event) elif ( event.type == "message.no_response" and event.data.is_direct and @@ -176,33 +200,24 @@ def handle_outgoing_event(self, event): event.content = random.choice(UNSURE_REPLIES) self.send_message(event) - def send_message(self, event): - data = {} - if hasattr(event, "kwargs"): - data.update(event.kwargs) + def handle_request(self, r, data): + resp_json = r.json() + if not resp_json["ok"]: + if resp_json["error"] == "not_in_channel": + channel = self.get_channel_from_name(data["channel"]) + if not hasattr(self, "me") or not hasattr(self.me, "handle"): + self.people - # Add slack-specific functionality - if "color" in event.kwargs: - data.update({ - "attachments": json.dumps([ - { - "fallback": event.content, - "color": self._map_color(event.kwargs["color"]), - "text": event.content, - } - ]), - }) + logging.critical( + "I was asked to post to the slack %s channel, but I haven't been invited. " + "Please invite me with '/invite @%s'" % (channel.name, self.me.handle) + ) else: - data.update({ - "text": event.content, - }) - else: - data.update({ - "text": event.content, - }) + logging.error("Error sending to slack: %s" % resp_json["error"]) + logging.error(resp_json) + assert resp_json["ok"] - # TODO: This is terrifingly ugly. Yes, it works. No, I will not have any idea how - # in a few months. Abstract this stuff out! + def set_data_channel_and_thread(self, event, data={}): if "channel" in event: # We're coming off an explicit set. channel_id = event.channel.id @@ -241,6 +256,37 @@ def send_message(self, event): }) except: pass + data.update({ + "channel": channel_id, + }) + return data + + def send_message(self, event): + data = {} + if hasattr(event, "kwargs"): + data.update(event.kwargs) + + # Add slack-specific functionality + if "color" in event.kwargs: + data.update({ + "attachments": json.dumps([ + { + "fallback": event.content, + "color": self._map_color(event.kwargs["color"]), + "text": event.content, + } + ]), + }) + else: + data.update({ + "text": event.content, + }) + else: + data.update({ + "text": event.content, + }) + + data = self.set_data_channel_and_thread(event, data=data) # Auto-link mention names if data["text"].find("<@") != -1: @@ -249,7 +295,6 @@ def send_message(self, event): data.update({ "token": settings.SLACK_API_TOKEN, - "channel": channel_id, "as_user": True, }) if hasattr(event, "kwargs") and "html" in event.kwargs and event.kwargs["html"]: @@ -264,20 +309,7 @@ def send_message(self, event): data=data, **settings.REQUESTS_OPTIONS ) - resp_json = r.json() - if not resp_json["ok"]: - if resp_json["error"] == "not_in_channel": - channel = self.get_channel_from_name(data["channel"]) - if not hasattr(self, "me") or not hasattr(self.me, "handle"): - self.people - - logging.critical( - "I was asked to post to the slack %s channel, but I haven't been invited. " - "Please invite me with '/invite @%s'" % (channel.name, self.me.handle) - ) - else: - logging.error("Error sending to slack: %s" % resp_json["error"]) - assert resp_json["ok"] + self.handle_request(r, data) def _map_color(self, color): # Turn colors into hex values, handling old slack colors, etc diff --git a/will/plugin.py b/will/plugin.py index 0d607bd8..8f3e0d0a 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -25,20 +25,6 @@ def __init__(self, *args, **kwargs): super(WillPlugin, self).__init__(*args, **kwargs) - # TODO: pull all the hipchat-specific logic out of this, - - def _rooms_from_message_and_room(self, message, room): - if room == "ALL_ROOMS": - rooms = self.available_rooms - elif room: - rooms = [self.get_room_from_name_or_id(room), ] - else: - if message: - rooms = [self.get_room_from_message(message), ] - else: - rooms = [self.get_room_from_name_or_id(settings.HIPCHAT_DEFAULT_ROOM), ] - return rooms - def _prepared_content(self, content, message, kwargs): content = re.sub(r'>\s+<', '><', content) return content @@ -51,6 +37,21 @@ def _trim_for_execution(self, message): message.source_message.analysis = None return message + def get_backend(self, message): + backend = False + if hasattr(message, "backend"): + backend = message.backend + elif message and hasattr(message, "data") and hasattr(message.data, "backend"): + backend = message.data.backend + else: + backend = settings.DEFAULT_BACKEND + return backend + + def get_message(self, message_passed): + if not message_passed and hasattr(self, "message"): + return self.message + return message_passed + def say(self, content, message=None, room=None, package_for_scheduling=False, **kwargs): logging.info("self.say") logging.info(content) @@ -58,30 +59,9 @@ def say(self, content, message=None, room=None, package_for_scheduling=False, ** if not "room" in kwargs and room: kwargs["room"] = room - backend = False - if not message and hasattr(self, "message"): - message = self.message - if message: - message = self._trim_for_execution(message) - - if message and hasattr(message, "backend"): - # Events, content/type/timestamp - # { - # message: message, - # type: "reply/say/topic_change/emoji/etc" - # } - backend = message.backend - else: - # TODO: need a clear, documented spec for this. - if message and hasattr(message, "data") and hasattr(message.data, "backend"): - logging.info(message.data) - logging.info(message.data.__dict__) - backend = message.data.backend - else: - backend = settings.DEFAULT_BACKEND - - logging.info("backend: %s" % backend) - + message = self.get_message(message) + message = self._trim_for_execution(message) + backend = self.get_backend(message) if backend: e = Event( type="say", @@ -96,6 +76,8 @@ def say(self, content, message=None, room=None, package_for_scheduling=False, ** self.publish("message.outgoing.%s" % backend, e) def reply(self, event, content=None, message=None, package_for_scheduling=False, **kwargs): + message = self.get_message(message) + # Be really smart about what we're getting back. if ( ( @@ -134,30 +116,32 @@ def reply(self, event, content=None, message=None, package_for_scheduling=False, elif hasattr(self, "message") and hasattr(self.message, "data"): message = self.message.data - if hasattr(message, "backend"): + backend = self.get_backend(message) + if backend: e = Event( type="reply", content=content, - topic="message.outgoing.%s" % message.backend, + topic="message.outgoing.%s" % backend, source_message=message, kwargs=kwargs, ) if package_for_scheduling: return e else: - self.publish("message.outgoing.%s" % message.backend, e) - - def set_topic(self, topic, message=None, room=None): - - if message is None or message["type"] == "groupchat": - rooms = self._rooms_from_message_and_room(message, room) - for r in rooms: - self.set_room_topic(r["room_id"], topic) - elif message['type'] in ('chat', 'normal'): - self.send_direct_message( - message.sender["hipchat_id"], - "I can't set the topic of a one-to-one chat. Let's just talk." - ) + self.publish("message.outgoing.%s" % backend, e) + + def set_topic(self, topic, message=None, room=None, **kwargs): + message = self.get_message(message) + message = self._trim_for_execution(message) + backend = self.get_backend(message) + e = Event( + type="topic_change", + content=topic, + topic="message.outgoing.%s" % backend, + source_message=message, + kwargs=kwargs, + ) + self.publish("message.outgoing.%s" % backend, e) def schedule_say(self, content, when, message=None, room=None, *args, **kwargs): packaged_event = self.reply(None, content=content, message=message, package_for_scheduling=True) From 90ecd1d4175b5ee0dec556dd945c721cc4bdd87f Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 11:32:47 +1300 Subject: [PATCH 045/200] Hipchat abstraction and cleanup --- will/backends/io_adapters/hipchat.py | 25 ----- will/backends/io_adapters/rocketchat.py | 30 ++---- will/backends/io_adapters/shell.py | 6 +- will/main.py | 2 - will/mixins/hipchat.py | 127 ++---------------------- will/settings.py | 32 +++--- 6 files changed, 36 insertions(+), 186 deletions(-) diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index d343b1cb..4fca8e08 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -51,7 +51,6 @@ def internal_roster(self): return self.people def get_user_by_full_name(self, name): - # TODO: Fix this better for shell, etc for jid, info in self.people.items(): if info["name"] == name: return info @@ -147,30 +146,6 @@ def start_xmpp_client(self, xmpp_bridge_queue=None, backend_name=""): ' "@{1} what are the rooms?" for the full list.' .format(r, settings.HIPCHAT_HANDLE)) - # TODO: Move this to the hipchat backend - # if "hipchat" in settings.CHAT_BACKENDS: - # puts("Verifying rooms...") - # # If we're missing ROOMS, join all of them. - # with indent(2): - # if settings.HIPCHAT_ROOMS is None: - # # Yup. Thanks, BSDs. - # q = Queue() - # p = Process(target=self.update_available_rooms, args=(), kwargs={"q": q, }) - # p.start() - # rooms_list = q.get() - # show_valid("Joining all %s known rooms." % len(rooms_list)) - # os.environ["WILL_ROOMS"] = ";".join(rooms_list) - # p.join() - # settings.import_settings() - # else: - # show_valid( - # "Joining the %s room%s specified." % ( - # len(settings.HIPCHAT_ROOMS), - # "s" if len(settings.HIPCHAT_ROOMS) > 1 else "" - # ) - # ) - # puts("") - self.nick = settings.HIPCHAT_HANDLE self.handle = settings.HIPCHAT_HANDLE self.mention_handle = "@%s" % settings.HIPCHAT_HANDLE diff --git a/will/backends/io_adapters/rocketchat.py b/will/backends/io_adapters/rocketchat.py index 52707cdd..ba2d1574 100644 --- a/will/backends/io_adapters/rocketchat.py +++ b/will/backends/io_adapters/rocketchat.py @@ -21,7 +21,7 @@ class RocketChatBackend(IOBackend): - friendly_name = "RocketChat" + friendly_name = "RocketChat (BETA)" internal_name = "will.backends.io_adapters.rocketchat" required_settings = [ { @@ -162,31 +162,17 @@ def handle_outgoing_event(self, event): if hasattr(event, "source_message") and event.source_message: self.send_message(event) else: - # TODO: Here lies stuff that: - # a) may not be needed or supported with Rocket.Chat, or - # b) that may need to be fixed in order to work. - # send_room_message() was removed as it doesn't appear - # useful, but the below was left in for future interest. - # The mentod wasn't even defined in slack.py at the - # time. + # TODO: Rocket.Chat backend needs to provide ways to handle and properly route: + # 1. 1-1 messages + # 2. Group (channel) messages + # 3. Ad-hoc group messages (if they exist) + # 4. Messages that have a channel/room explicitly specified that's different than + # where they came from/ + # 5. Messages without a channel (Fallback to ROCKETCHAT_DEFAULT_CHANNEL) (messages that don't have a room, ) kwargs = {} if "kwargs" in event: kwargs.update(**event.kwargs) - # if "room" in kwargs: - # self.send_room_message( - # kwargs["room"], - # event.content, - # **kwargs - # ) - # else: - # default_room = self.get_room_from_name_or_id(settings.HIPCHAT_DEFAULT_ROOM)["room_id"] - # self.send_room_message( - # default_room, - # event.content, - # **kwargs - # ) - if event.type in ["topic_change", ]: self.set_room_topic(event.content) elif ( diff --git a/will/backends/io_adapters/shell.py b/will/backends/io_adapters/shell.py index cf636221..16b57c61 100644 --- a/will/backends/io_adapters/shell.py +++ b/will/backends/io_adapters/shell.py @@ -34,8 +34,8 @@ def send_direct_message(self, message_body, **kwargs): def send_room_message(self, room_id, message_body, html=False, color="green", notify=False, **kwargs): print("Will: %s" % html_to_text(message_body)) - def set_room_topic(self, room_id, topic): - print("Will: Let's talk about %s" & topic) + def set_room_topic(self, topic): + print("Will: Let's talk about %s" % (topic, )) def normalize_incoming_event(self, event): if event["type"] == "message.incoming.stdin": @@ -62,7 +62,7 @@ def handle_outgoing_event(self, event): if event.type in ["say", "reply"]: self.send_direct_message(event.content) if event.type in ["topic_change", ]: - self.set_room_topic("Let's talk about %s" % event.content) + self.set_room_topic(event.content) elif event.type == "message.no_response": if event.data and hasattr(event.data, "original_incoming_event") and len(event.data.original_incoming_event.data.content) > 0: diff --git a/will/main.py b/will/main.py index 61e6e2c4..c3cd39e4 100644 --- a/will/main.py +++ b/will/main.py @@ -175,11 +175,9 @@ def bootstrap(self): errors = self.get_startup_errors() if len(errors) > 0: - default_room = self.get_room_from_name_or_id(settings.HIPCHAT_DEFAULT_ROOM)["room_id"] error_message = "FYI, I ran into some problems while starting up:" for err in errors: error_message += "\n%s\n" % err - self.send_room_message(default_room, error_message, color="yellow") puts(colored.red(error_message)) self.stdin_listener_thread = False diff --git a/will/mixins/hipchat.py b/will/mixins/hipchat.py index 639fdb40..9aeb7c7c 100644 --- a/will/mixins/hipchat.py +++ b/will/mixins/hipchat.py @@ -1,121 +1,10 @@ -import json -import logging -import requests -import traceback - -from will import settings - -ROOM_NOTIFICATION_URL = "https://%(server)s/v2/room/%(room_id)s/notification?auth_token=%(token)s" -ROOM_TOPIC_URL = "https://%(server)s/v2/room/%(room_id)s/topic?auth_token=%(token)s" -PRIVATE_MESSAGE_URL = "https://%(server)s/v2/user/%(user_id)s/message?auth_token=%(token)s" -SET_TOPIC_URL = "https://%(server)s/v2/room/%(room_id)s/topic?auth_token=%(token)s" -USER_DETAILS_URL = "https://%(server)s/v2/user/%(user_id)s?auth_token=%(token)s" -ALL_USERS_URL = ("https://%(server)s/v2/user?auth_token=%(token)s&start-index" - "=%(start_index)s&max-results=%(max_results)s") - - class HipChatMixin(object): - def send_direct_message(self, user_id, message_body, html=False, notify=False, **kwargs): - if kwargs: - logging.warning("Unknown keyword args for send_direct_message: %s", kwargs) - - format = "text" - if html: - format = "html" - - try: - # https://www.hipchat.com/docs/apiv2/method/private_message_user - url = PRIVATE_MESSAGE_URL % {"server": settings.HIPCHAT_SERVER, - "user_id": user_id, - "token": settings.HIPCHAT_V2_TOKEN} - data = { - "message": message_body, - "message_format": format, - "notify": notify, - } - headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} - requests.post(url, headers=headers, data=json.dumps(data), **settings.REQUESTS_OPTIONS) - except: - logging.critical("Error in send_direct_message: \n%s", traceback.format_exc()) - - def send_direct_message_reply(self, message, message_body): - try: - message.reply(message_body).send() - except: - logging.critical("Error in send_direct_message_reply: \n%s", traceback.format_exc()) - - def send_room_message(self, room_id, message_body, html=False, color="green", notify=False, card=None, **kwargs): - if kwargs: - logging.warning("Unknown keyword args for send_room_message: %s", kwargs) - - format = "text" - if html: - format = "html" - - try: - # https://www.hipchat.com/docs/apiv2/method/send_room_notification - url = ROOM_NOTIFICATION_URL % {"server": settings.HIPCHAT_SERVER, - "room_id": room_id, - "token": settings.HIPCHAT_V2_TOKEN} - data = { - "message": message_body, - "message_format": format, - "color": color, - "notify": notify, - "card": card - } - headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} - r = requests.post(url, headers=headers, data=json.dumps(data), **settings.REQUESTS_OPTIONS) - r.raise_for_status() - except: - logging.critical("Error in send_room_message: \n%s", traceback.format_exc()) - - def set_room_topic(self, room_id, topic): - try: - # https://www.hipchat.com/docs/apiv2/method/send_room_notification - url = ROOM_TOPIC_URL % {"server": settings.HIPCHAT_SERVER, - "room_id": room_id, - "token": settings.HIPCHAT_V2_TOKEN} - data = { - "topic": topic, - } - headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} - requests.put(url, headers=headers, data=json.dumps(data), **settings.REQUESTS_OPTIONS) - except: - logging.critical("Error in set_room_topic: \n%s", traceback.format_exc()) - - def get_hipchat_user(self, user_id, q=None): - url = USER_DETAILS_URL % {"server": settings.HIPCHAT_SERVER, - "user_id": user_id, - "token": settings.HIPCHAT_V2_TOKEN} - r = requests.get(url, **settings.REQUESTS_OPTIONS) - if q: - q.put(r.json()) - else: - return r.json() - - @property - def full_hipchat_user_list(self): - if not hasattr(self, "_full_hipchat_user_list"): - full_roster = {} - - # Grab the first roster page, and populate full_roster - url = ALL_USERS_URL % {"server": settings.HIPCHAT_SERVER, - "token": settings.HIPCHAT_V2_TOKEN, - "start_index": 0, - "max_results": 1000} - r = requests.get(url, **settings.REQUESTS_OPTIONS) - for user in r.json()['items']: - full_roster["%s" % (user['id'],)] = user - - # Keep going through the next pages until we're out of pages. - while 'next' in r.json()['links']: - url = "%s&auth_token=%s" % (r.json()['links']['next'], settings.HIPCHAT_V2_TOKEN) - r = requests.get(url, **settings.REQUESTS_OPTIONS) - - for user in r.json()['items']: - full_roster["%s" % (user['id'],)] = user - - self._full_hipchat_user_list = full_roster - return self._full_hipchat_user_list + def __init__(self, *args, **kwargs): + import logging + logging.critical( + "HipChatMixin functionality has been moved to the hipchat backend.\n" + + "If you need functionality that used to be on this class, please either\n" + + "publish messages, or use will.backends.io_backends.hipchat:HipChatBackend." + ) + super(HipChatMixin, self).__init__(*args, **kwargs) diff --git a/will/settings.py b/will/settings.py index 3a465ec3..0e1334b1 100644 --- a/will/settings.py +++ b/will/settings.py @@ -116,21 +116,23 @@ def import_settings(quiet=True): settings[v] = settings[k] del settings[k] - # Set defaults - if "HIPCHAT_ROOMS" not in settings: - if not quiet: - warn("no HIPCHAT_ROOMS list found in the environment or config. " - "This is ok - Will will just join all available HIPCHAT_rooms.") - settings["HIPCHAT_ROOMS"] = None - - if ( - "HIPCHAT_DEFAULT_ROOM" not in settings and "HIPCHAT_ROOMS" in settings and - settings["HIPCHAT_ROOMS"] and len(settings["HIPCHAT_ROOMS"]) > 0 - ): - if not quiet: - warn("no HIPCHAT_DEFAULT_ROOM found in the environment or config. " - "Defaulting to '%s', the first one." % settings["HIPCHAT_ROOMS"][0]) - settings["HIPCHAT_DEFAULT_ROOM"] = settings["HIPCHAT_ROOMS"][0] + # Set for hipchat + for b in settings["IO_BACKENDS"]: + if "hipchat" in b: + if "HIPCHAT_ROOMS" not in settings: + if not quiet: + warn("no HIPCHAT_ROOMS list found in the environment or config. " + "This is ok - Will will just join all available HIPCHAT_rooms.") + settings["HIPCHAT_ROOMS"] = None + + if ( + "HIPCHAT_DEFAULT_ROOM" not in settings and "HIPCHAT_ROOMS" in settings and + settings["HIPCHAT_ROOMS"] and len(settings["HIPCHAT_ROOMS"]) > 0 + ): + if not quiet: + warn("no HIPCHAT_DEFAULT_ROOM found in the environment or config. " + "Defaulting to '%s', the first one." % settings["HIPCHAT_ROOMS"][0]) + settings["HIPCHAT_DEFAULT_ROOM"] = settings["HIPCHAT_ROOMS"][0] if ( "DEFAULT_BACKEND" not in settings and "IO_BACKENDS" in settings and From 5f14c47b0da4869153032f043b7b2f75c60be838 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 12:10:47 +1300 Subject: [PATCH 046/200] Encryption mixin and storage working! --- will/backends/encryption/aes.py | 10 +++-- will/backends/storage/base.py | 3 +- will/settings.py | 76 +++++++++++++++++++++++++++------ 3 files changed, 70 insertions(+), 19 deletions(-) diff --git a/will/backends/encryption/aes.py b/will/backends/encryption/aes.py index 5ccb1360..68d4f3af 100644 --- a/will/backends/encryption/aes.py +++ b/will/backends/encryption/aes.py @@ -46,11 +46,11 @@ def encrypt_to_b64(cls, raw): return None @classmethod - def decrypt_from_b64(cls, enc): + def decrypt_from_b64(cls, raw_enc): try: if settings.ENABLE_INTERNAL_ENCRYPTION: - iv = enc[:BS] - enc = enc[BS+1:] + iv = raw_enc[:BS] + enc = raw_enc[BS+1:] cipher = AES.new(key, AES.MODE_CBC, iv) enc = unpad(cipher.decrypt(binascii.a2b_base64(enc))) obj = pickle.loads(binascii.a2b_base64(enc)) @@ -59,7 +59,9 @@ def decrypt_from_b64(cls, enc): pass except: logging.critical("Error unpacking message from the wire: \n%s" % traceback.format_exc()) - return None + logging.warn("Error decrypting. Attempting unencrypted load for %s to ease migration." % key) + obj = pickle.loads(raw_enc) + return obj def bootstrap(settings): diff --git a/will/backends/storage/base.py b/will/backends/storage/base.py index 0fb51a8b..a9659577 100644 --- a/will/backends/storage/base.py +++ b/will/backends/storage/base.py @@ -1,3 +1,4 @@ +import logging import redis import urlparse from will.mixins import SettingsMixin, EncryptionMixin @@ -34,5 +35,5 @@ def load(self, key, *args, **kwargs): try: return self.decrypt(self.backend_load(key, *args, **kwargs)) except: - print "error decrypting. Assuming unencrypted for %s" % key + logging.warn("Error decrypting. Attempting unencrypted load for %s to ease migration." % key) return self.backend_load(key, *args, **kwargs) diff --git a/will/settings.py b/will/settings.py index 0e1334b1..6b76426b 100644 --- a/will/settings.py +++ b/will/settings.py @@ -1,12 +1,46 @@ import os import sys -import uuid from will.utils import show_valid, warn, note, error from clint.textui import puts, indent from six.moves.urllib import parse from six.moves import input +def auto_key(): + """This method attempts to auto-generate a unique cryptographic key based on the hardware ID. + It should *NOT* be used in production, or to replace a proper key, but it can help get will + running in local and test environments more easily.""" + import uuid + import time + import random + import hashlib + + node = uuid.getnode() + + h = hashlib.md5() + h.update("%s" % node) + key1 = h.hexdigest() + + time.sleep(random.uniform(0, 0.5)) + node = uuid.getnode() + + h = hashlib.md5() + h.update("%s" % node) + key2 = h.hexdigest() + + time.sleep(random.uniform(0, 0.5)) + node = uuid.getnode() + + h = hashlib.md5() + h.update("%s" % node) + key3 = h.hexdigest() + + if key1 == key2 and key2 == key3: + return key1 + + return False + + def import_settings(quiet=True): """This method takes care of importing settings from the environment, and config.py file. @@ -139,7 +173,7 @@ def import_settings(quiet=True): settings["IO_BACKENDS"] and len(settings["IO_BACKENDS"]) > 0 ): if not quiet: - warn("no DEFAULT_BACKEND found in the environment or config. " + note("no DEFAULT_BACKEND found in the environment or config. " "Defaulting to '%s', the first one." % settings["IO_BACKENDS"][0]) settings["DEFAULT_BACKEND"] = settings["IO_BACKENDS"][0] @@ -151,9 +185,6 @@ def import_settings(quiet=True): "- this is almost certainly not what you want." ) - if "ENABLE_INTERNAL_ENCRYPTION" not in settings: - settings["ENABLE_INTERNAL_ENCRYPTION"] = True - if "HTTPSERVER_PORT" not in settings: # For heroku if "PORT" in os.environ: @@ -213,7 +244,7 @@ def import_settings(quiet=True): default_public = "http://localhost:%s" % settings["HTTPSERVER_PORT"] settings["PUBLIC_URL"] = default_public if not quiet: - warn("no PUBLIC_URL found in the environment or config. Defaulting to '%s'." % default_public) + note("no PUBLIC_URL found in the environment or config. Defaulting to '%s'." % default_public) if "TEMPLATE_DIRS" not in settings: if "WILL_TEMPLATE_DIRS_PICKLED" in os.environ: @@ -276,16 +307,33 @@ def import_settings(quiet=True): if "LOGLEVEL" not in settings: settings["LOGLEVEL"] = "ERROR" + if "ENABLE_INTERNAL_ENCRYPTION" not in settings: + settings["ENABLE_INTERNAL_ENCRYPTION"] = True + if "SECRET_KEY" not in settings: if not quiet: - note( - "No SECRET_KEY specified. Auto-generating one specific to this run of Will.\n" + - " Know that Will won't be able to catch up on old messages\n" + - " or work in a multicomponent install without one." - ) - settings["SECRET_KEY"] = uuid.uuid4().hex - os.environ["WILL_SECRET_KEY"] = settings["SECRET_KEY"] - os.environ["WILL_EPHEMERAL_SECRET_KEY"] = "True" + if "ENABLE_INTERNAL_ENCRYPTION" in settings and settings["ENABLE_INTERNAL_ENCRYPTION"]: + key = auto_key() + if key: + warn( + "No SECRET_KEY specified and ENABLE_INTERNAL_ENCRYPTION is on.\n" + + " Temporarily auto-generating a key specific to this computer:\n %s\n" % (key,) + + " Please set WILL_SECRET_KEY in the environment as soon as possible to ensure \n" + + " Will is able to access information from previous runs." + ) + else: + error( + "ENABLE_INTERNAL_ENCRYPTION is turned on, but a SECRET_KEY has not been given.\n" + + "We tried to automatically generate temporary SECRET_KEY, but this appears to be a \n" + + "shared or virtualized environment.\n Please set a unique secret key in the " + + "environment as WILL_SECRET_KEY to run will." + ) + print " Unable to start will without a SECRET_KEY while encryption is turned on. Shutting down." + sys.exit(1) + + settings["SECRET_KEY"] = key + os.environ["WILL_SECRET_KEY"] = settings["SECRET_KEY"] + os.environ["WILL_EPHEMERAL_SECRET_KEY"] = "True" # Set them in the module namespace for k in sorted(settings, key=lambda x: x[0]): From a777bc9b59d714009acb1521d1be3097807916e0 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 12:18:59 +1300 Subject: [PATCH 047/200] De-base64 --- config.py | 2 +- will/backends/encryption/aes.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config.py b/config.py index 38f87152..b5c935d9 100644 --- a/config.py +++ b/config.py @@ -179,7 +179,7 @@ # Turn up or down Will's logging level # LOGLEVEL = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL # LOGLEVEL = "DEBUG" -# LOGLEVEL = "INFO" +LOGLEVEL = "WARNING" # Turn on or off Will's profiling # PROFILING_ENABLED = False diff --git a/will/backends/encryption/aes.py b/will/backends/encryption/aes.py index 68d4f3af..b0319bd3 100644 --- a/will/backends/encryption/aes.py +++ b/will/backends/encryption/aes.py @@ -60,7 +60,7 @@ def decrypt_from_b64(cls, raw_enc): except: logging.critical("Error unpacking message from the wire: \n%s" % traceback.format_exc()) logging.warn("Error decrypting. Attempting unencrypted load for %s to ease migration." % key) - obj = pickle.loads(raw_enc) + obj = pickle.loads(binascii.a2b_base64(raw_enc)) return obj From 706b25684478e9a4dde691cf53b89d145b11e28b Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 12:21:17 +1300 Subject: [PATCH 048/200] Streamline, don't store in memory --- will/backends/encryption/aes.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/will/backends/encryption/aes.py b/will/backends/encryption/aes.py index b0319bd3..765326d4 100644 --- a/will/backends/encryption/aes.py +++ b/will/backends/encryption/aes.py @@ -53,15 +53,12 @@ def decrypt_from_b64(cls, raw_enc): enc = raw_enc[BS+1:] cipher = AES.new(key, AES.MODE_CBC, iv) enc = unpad(cipher.decrypt(binascii.a2b_base64(enc))) - obj = pickle.loads(binascii.a2b_base64(enc)) - return obj + return pickle.loads(binascii.a2b_base64(enc)) except (KeyboardInterrupt, SystemExit): pass except: - logging.critical("Error unpacking message from the wire: \n%s" % traceback.format_exc()) - logging.warn("Error decrypting. Attempting unencrypted load for %s to ease migration." % key) - obj = pickle.loads(binascii.a2b_base64(raw_enc)) - return obj + logging.warn("Error decrypting. Attempting unencrypted load to ease migration.") + return pickle.loads(binascii.a2b_base64(raw_enc)) def bootstrap(settings): From fe6750d9e2e0f78c5dd6903102f0dbfbed14a321 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 12:28:04 +1300 Subject: [PATCH 049/200] Cleans up config.py documentation --- config.py | 113 +++++++++++++++++++++++++++--------------------------- 1 file changed, 57 insertions(+), 56 deletions(-) diff --git a/config.py b/config.py index b5c935d9..509ccc40 100644 --- a/config.py +++ b/config.py @@ -110,14 +110,6 @@ FUZZY_REGEX_ALLOWABLE_ERRORS = 3 -# ------------------------------------------------------------------------------------ -# Hipchat settings -# ------------------------------------------------------------------------------------ - -# Ideally, set these in the environment with the WILL_ prefix. -# HIPCHAT_HANDLE = 'will' - - # ------------------------------------------------------------------------------------ # Slack settings # ------------------------------------------------------------------------------------ @@ -127,62 +119,44 @@ # Rocket.chat settings # ------------------------------------------------------------------------------------ -# ------------------------------------------------------------------------------------ -# Potentially required settings -# ------------------------------------------------------------------------------------ - -# If will isn't accessible at localhost, you must set this for his keepalive to work. -# Note no trailing slash. -# PUBLIC_URL = "http://my-will.herokuapp.com" - -# Port to bind the web server to (defaults to $PORT, then 80.) -# Set > 1024 to run without elevated permission. -# HTTPSERVER_PORT = "9000" +# Rocket.Chat server URL and port as necessary +# ROCKETCHAT_URL = "http://localhost:3000" -# Your will's mention handle. (aka @will) Note that this is not backend-specific, -# and is only used for the generation of help text. -# WILL_HANDLE = "will" # ------------------------------------------------------------------------------------ -# Optional settings +# Hipchat settings # ------------------------------------------------------------------------------------ -# The list of rooms will should join. Default is all rooms. -# TODO: Appears to be Hipchat-specific, should be renamed or -# deprecated. -HIPCHAT_HANDLE = "will" -HIPCHAT_ROOMS = ['Will Testing', 'Will and I'] - -# The maximum number of milliseconds to wait for an analysis backend to finish -# ANALYSIS_TIMEOUT_MS = 2000 +# Ideally, set these in the environment with the WILL_ prefix. +# Will's mention name, e.g. @will +# HIPCHAT_HANDLE = 'will' -# The maximum number of milliseconds to wait for a generation backend to finish -# GENERATION_TIMEOUT_MS = 2000 +# The list of rooms will should join. Default is all rooms. +# HIPCHAT_ROOMS = ['Will Testing', 'Will and I'] -# The interval will checks his internal cross-thread messaging queues, in seconds. -# Increasing the value will make will slower, but consume fewer resources. -# EVENT_LOOP_INTERVAL = 0.025 +# Will's proper name +# HIPCHAT_NAME = "William T. Botterton" -# The backend and room will will talk to if the trigger is a webhook and he isn't told -# a specific one. Default is the first of IO_BACKENDS and ROOMS. -# DEFAULT_BACKEND = "will.backends.io_adapters.hipchat" -# DEFAULT_ROOM = 'Testing, Will Kahuna' +# Disable Hipchat SSL checks. Strongly reccomended this is not set to True. +# ALLOW_INSECURE_HIPCHAT_SERVER = False -# A secret key, used to namespace this instance of will and secure pubsub contents. -# Do *NOT* keep it in config.py. *DO* set it in the environment, in a secured session. -# If a SECRET_KEY is not set, one will be auto-generated, but will limit Will to reading -# data from this excecution only. -# SECRET_KEY = "DXQnJ2eHD6k2w3DvBTstN6kw9d9N4CeCLbjoK" +# ------------------------------------------------------------------------------------ +# Potentially required settings +# ------------------------------------------------------------------------------------ +# If will isn't accessible at localhost, you must set this for his keepalive to work. +# Note no trailing slash. +# PUBLIC_URL = "http://my-will.herokuapp.com" -# Turn up or down Will's logging level -# LOGLEVEL = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL -# LOGLEVEL = "DEBUG" -LOGLEVEL = "WARNING" +# The backend and room Will should talk to if the trigger is a webhook and he isn't told +# a specific room. Default is the first of IO_BACKENDS and ROOMS. +# DEFAULT_BACKEND = "will.backends.io_adapters.slack" +# DEFAULT_ROOM = 'Notifications' -# Turn on or off Will's profiling -# PROFILING_ENABLED = False +# Port to bind the web server to (defaults to $PORT, then 80.) +# Set > 1024 to run without elevated permission. +# HTTPSERVER_PORT = "9000" # Fully-qualified folders to look for templates in, beyond the two that # are always included: core will's templates folder, your project's templates folder, and @@ -211,16 +185,43 @@ # Sets a different storage backend. If unset, defaults to redis. # If you use a different backend, make sure to add their required settings. -# PUBSUB_BACKEND = "zeromq" # "redis", or "zeromq" (beta). +# PUBSUB_BACKEND = "redis" # "redis", or "zeromq" (beta). # ZEROMQ_URL = "tcp://127.0.0.1:15555" -# Rocket.Chat server URL and port as necessary -# ROCKETCHAT_URL = "http://localhost:3000" +# Your will's mention handle. (aka @will) Note that this is not backend-specific, +# and is only used for the generation of help text. +# WILL_HANDLE = "will" -# Disable Hipchat SSL checks. Strongly reccomended this is not set to True. -# ALLOW_INSECURE_HIPCHAT_SERVER = False +# ------------------------------------------------------------------------------------ +# Optional settings +# ------------------------------------------------------------------------------------ + +# The maximum number of milliseconds to wait for an analysis backend to finish +# ANALYSIS_TIMEOUT_MS = 2000 + +# The maximum number of milliseconds to wait for a generation backend to finish +# GENERATION_TIMEOUT_MS = 2000 + +# The interval will checks his internal cross-thread messaging queues, in seconds. +# Increasing the value will make will slower, but consume fewer resources. +# EVENT_LOOP_INTERVAL = 0.025 + +# A secret key, used to namespace this instance of will and secure pubsub contents. +# Do *NOT* keep it in config.py. *DO* set it in the environment as WILL_SECRET_KEY, +# in a secured session. If a SECRET_KEY is not set, one will be auto-generated, +# but it may limit Will to reading data from this excecution only, and may not work +# on virtualized machines, or machines with many or changing MAC addresses +# SECRET_KEY = "DXQnJ2eHD6k2w3DvBTstN6kw9d9N4CeCLbjoK" + + +# Turn up or down Will's logging level +# LOGLEVEL = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL +# LOGLEVEL = "DEBUG" + +# Turn on or off Will's profiling +# PROFILING_ENABLED = False # Turn on/off encryption in pub/sub and storage (default is on). # Causes a small speed bump, but secures messages in an untrusted environment. From 6689a54edd5778412d07b1d823de4893c5a56f8c Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 13:10:48 +1300 Subject: [PATCH 050/200] Gets tests passing. --- config.py | 2 +- setup.cfg | 2 +- tox.ini | 10 +++++----- will/backends/__init__.py | 10 ++++++---- will/backends/io_adapters/hipchat.py | 4 ++-- will/main.py | 23 ++++++++++++----------- will/plugin.py | 11 ++++++----- will/tests/test_talkback.py | 2 +- 8 files changed, 34 insertions(+), 30 deletions(-) diff --git a/config.py b/config.py index 509ccc40..55c13cf5 100644 --- a/config.py +++ b/config.py @@ -210,7 +210,7 @@ # A secret key, used to namespace this instance of will and secure pubsub contents. # Do *NOT* keep it in config.py. *DO* set it in the environment as WILL_SECRET_KEY, -# in a secured session. If a SECRET_KEY is not set, one will be auto-generated, +# in a secured session. If a SECRET_KEY is not set, one will be auto-generated, # but it may limit Will to reading data from this excecution only, and may not work # on virtualized machines, or machines with many or changing MAC addresses # SECRET_KEY = "DXQnJ2eHD6k2w3DvBTstN6kw9d9N4CeCLbjoK" diff --git a/setup.cfg b/setup.cfg index d0053740..fe2577d1 100644 --- a/setup.cfg +++ b/setup.cfg @@ -5,5 +5,5 @@ addopts = --cov-report term-missing --cov-config=.coveragerc --cov . test = pytest [flake8] -ignore = F401,N812,F403,E721,E713,F405,W503,E121,E123,E126,E226,E24,E704,D100,D400,D101,D102,N806,D105,D401,D202,D103,D +ignore = F401,N812,F403,E721,E713,F405,W503,E121,E123,E126,E226,E24,E704,D100,D400,D101,D102,N806,D105,D401,D202,D103,D,E722,E741 max-line-length = 160 \ No newline at end of file diff --git a/tox.ini b/tox.ini index dbc16ab0..8998c475 100644 --- a/tox.ini +++ b/tox.ini @@ -5,11 +5,11 @@ envlist = py27, 35, flake8 [testenv] commands = python setup.py test - -[testenv:flake8] -commands = - flake8 deps = flake8 sleekxmpp==1.3.2 - -rrequirements.txt \ No newline at end of file + -rrequirements.txt + +[testenv:flake8] +commands = + flake8 \ No newline at end of file diff --git a/will/backends/__init__.py b/will/backends/__init__.py index 01928630..066ded1d 100644 --- a/will/backends/__init__.py +++ b/will/backends/__init__.py @@ -1,4 +1,6 @@ -import analysis -import execution -import generation -import io_adapters +from will.backends import analysis +from will.backends import execution +from will.backends import encryption +from will.backends import generation +from will.backends import pubsub +from will.backends import io_adapters diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index 4fca8e08..2bede827 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -1,5 +1,7 @@ import json import logging +from multiprocessing.queues import Empty +from multiprocessing import Process, Queue import random import re import requests @@ -16,9 +18,7 @@ from will import settings from will.utils import is_admin from will.acl import is_acl_allowed -from multiprocessing import Process, Queue from will.abstractions import Event, Message, Person, Channel -from multiprocessing.queues import Empty from will.utils import Bunch, UNSURE_REPLIES, clean_for_pickling from will.mixins import RoomMixin, StorageMixin, PubSubMixin diff --git a/will/main.py b/will/main.py index c3cd39e4..efac6334 100644 --- a/will/main.py +++ b/will/main.py @@ -1,12 +1,16 @@ # -*- coding: utf-8 -*- import copy +from cStringIO import StringIO import datetime import imp +from importlib import import_module import inspect import logging +from multiprocessing import Process, Queue import operator import os +from os.path import abspath, dirname import re import signal import sys @@ -18,20 +22,17 @@ except: from will.decorators import passthrough_decorator as yappi_profile -from cStringIO import StringIO -from importlib import import_module from clint.textui import colored, puts, indent -from os.path import abspath, dirname -from multiprocessing import Process, Queue - import bottle -from mixins import ScheduleMixin, StorageMixin, ErrorMixin, SleepMixin,\ + + +from will import settings +from will.backends import analysis, execution, generation, io_adapters +from will.backends.io_adapters.base import Event +from will.mixins import ScheduleMixin, StorageMixin, ErrorMixin, SleepMixin,\ RoomMixin, PluginModulesLibraryMixin, EmailMixin, PubSubMixin -from backends import analysis, execution, generation, io_adapters -from backends.io_adapters.base import Event -from scheduler import Scheduler -import settings -from utils import show_valid, show_invalid, error, warn, note, print_head, Bunch +from will.scheduler import Scheduler +from will.utils import show_valid, show_invalid, error, warn, note, print_head, Bunch # Force UTF8 diff --git a/will/plugin.py b/will/plugin.py index 8f3e0d0a..05294acf 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -1,13 +1,14 @@ import re import logging -from will import settings from bottle import request -from mixins import NaturalTimeMixin, RoomMixin, ScheduleMixin, StorageMixin, SettingsMixin, \ - EmailMixin, PubSubMixin -from will.backends.io_adapters.hipchat import HipChatRosterMixin -from utils import html_to_text + +from will import settings from will.abstractions import Event, Message +from will.backends.io_adapters.hipchat import HipChatRosterMixin +from will.mixins import NaturalTimeMixin, RoomMixin, ScheduleMixin, StorageMixin, SettingsMixin, \ + EmailMixin, PubSubMixin +from will.utils import html_to_text class WillPlugin(EmailMixin, StorageMixin, NaturalTimeMixin, RoomMixin, HipChatRosterMixin, diff --git a/will/tests/test_talkback.py b/will/tests/test_talkback.py index d97ea765..1a74a594 100644 --- a/will/tests/test_talkback.py +++ b/will/tests/test_talkback.py @@ -75,4 +75,4 @@ def test_talk_back_success(self, mock_get, mock_reply): self.plugin.talk_back("That's what she said") mock_get.assert_called_once_with(TalkBackPlugin.QUOTES_URL) - mock_reply.assert_called_once_with("That's what she said", 'Actually, she said things like this: \nHi! ~ An') + mock_reply.assert_called_once_with('Actually, she said things like this: \nHi! ~ An') From f837d9dc97cd6eb250734836601f93bddfaf4591 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 13:24:29 +1300 Subject: [PATCH 051/200] Moves Room->HipChatRoom, consistency on HipChat --- config.py | 4 +- will/backends/io_adapters/hipchat.py | 131 ++++++++++++++++++++++++- will/main.py | 4 +- will/mixins/__init__.py | 4 +- will/mixins/room.py | 139 +++------------------------ will/mixins/roster.py | 2 +- will/plugin.py | 7 +- will/plugins/chat_room/__init__.py | 2 +- 8 files changed, 153 insertions(+), 140 deletions(-) diff --git a/config.py b/config.py index 55c13cf5..9a68e90a 100644 --- a/config.py +++ b/config.py @@ -124,7 +124,7 @@ # ------------------------------------------------------------------------------------ -# Hipchat settings +# HipChat settings # ------------------------------------------------------------------------------------ # Ideally, set these in the environment with the WILL_ prefix. @@ -137,7 +137,7 @@ # Will's proper name # HIPCHAT_NAME = "William T. Botterton" -# Disable Hipchat SSL checks. Strongly reccomended this is not set to True. +# Disable HipChat SSL checks. Strongly reccomended this is not set to True. # ALLOW_INSECURE_HIPCHAT_SERVER = False diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index 2bede827..672d9385 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -1,3 +1,4 @@ +from datetime import datetime import json import logging from multiprocessing.queues import Empty @@ -20,9 +21,8 @@ from will.acl import is_acl_allowed from will.abstractions import Event, Message, Person, Channel from will.utils import Bunch, UNSURE_REPLIES, clean_for_pickling -from will.mixins import RoomMixin, StorageMixin, PubSubMixin +from will.mixins import StorageMixin, PubSubMixin -# TODO: Cleanup unused urls ROOM_NOTIFICATION_URL = "https://%(server)s/v2/room/%(room_id)s/notification?auth_token=%(token)s" ROOM_TOPIC_URL = "https://%(server)s/v2/room/%(room_id)s/topic?auth_token=%(token)s" ROOM_URL = "https://%(server)s/v2/room/%(room_id)s/?auth_token=%(token)s" @@ -34,6 +34,10 @@ ALL_ROOMS_URL = ("https://%(server)s/v2/room?auth_token=%(token)s&start-index" "=%(start_index)s&max-results=%(max_results)s&expand=items") +# From RoomsMixins +V1_TOKEN_URL = "https://%(server)s/v1/rooms/list?auth_token=%(token)s" +V2_TOKEN_URL = "https://%(server)s/v2/room?auth_token=%(token)s&expand=items" + class HipChatRosterMixin(object): @property @@ -105,7 +109,124 @@ def get_user_by_hipchat_id(self, id): return None -class HipchatXMPPClient(ClientXMPP, HipChatRosterMixin, RoomMixin, StorageMixin, PubSubMixin): +class HipChatRoom(Bunch): + + @property + def id(self): + if 'room_id' in self: + # Using API v1 + return self['room_id'] + elif 'id' in self: + # Using API v2 + return self['id'] + else: + raise TypeError('Room ID not found') + + @property + def history(self): + payload = {"auth_token": settings.HIPCHAT_V2_TOKEN} + response = requests.get("https://{1}/v2/room/{0}/history".format(str(self.id), + settings.HIPCHAT_SERVER), + params=payload, **settings.REQUESTS_OPTIONS) + data = json.loads(response.text)['items'] + for item in data: + item['date'] = datetime.strptime(item['date'][:-13], "%Y-%m-%dT%H:%M:%S") + return data + + @property + def participants(self): + payload = {"auth_token": settings.HIPCHAT_V2_TOKEN} + response = requests.get( + "https://{1}/v2/room/{0}/participant".format( + str(self.id), + settings.HIPCHAT_SERVER + ), + params=payload, + **settings.REQUESTS_OPTIONS + ).json() + data = response['items'] + while 'next' in response['links']: + response = requests.get(response['links']['next'], + params=payload, **settings.REQUESTS_OPTIONS).json() + data.extend(response['items']) + return data + + +class HipChatRoomMixin(object): + def update_available_rooms(self, q=None): + self._available_rooms = {} + # Use v1 token to grab a full room list if we can (good to avoid rate limiting) + if hasattr(settings, "V1_TOKEN"): + url = V1_TOKEN_URL % {"server": settings.HIPCHAT_SERVER, + "token": settings.HIPCHAT_V1_TOKEN} + r = requests.get(url, **settings.REQUESTS_OPTIONS) + if r.status_code == requests.codes.unauthorized: + raise Exception("V1_TOKEN authentication failed with HipChat") + for room in r.json()["rooms"]: + # Some integrations expect a particular name for the ID field. + # Better to use room.id. + room["id"] = room["room_id"] + self._available_rooms[room["name"]] = HipChatRoom(**room) + # Otherwise, grab 'em one-by-one via the v2 api. + else: + params = {} + params['start-index'] = 0 + max_results = params['max-results'] = 1000 + url = V2_TOKEN_URL % {"server": settings.HIPCHAT_SERVER, + "token": settings.HIPCHAT_V2_TOKEN} + while True: + resp = requests.get(url, params=params, + **settings.REQUESTS_OPTIONS) + if resp.status_code == requests.codes.unauthorized: + raise Exception("V2_TOKEN authentication failed with HipChat") + rooms = resp.json() + + for room in rooms["items"]: + # Some integrations expect a particular name for the ID field. + # Better to use room.id + room["room_id"] = room["id"] + self._available_rooms[room["name"]] = HipChatRoom(**room) + + logging.info('Got %d rooms', len(rooms['items'])) + if len(rooms['items']) == max_results: + params['start-index'] += max_results + else: + break + + self.save("hipchat_rooms", self._available_rooms) + if q: + q.put(self._available_rooms) + + @property + def available_rooms(self): + if not hasattr(self, "_available_rooms"): + self._available_rooms = self.load('hipchat_rooms', None) + if not self._available_rooms: + self.update_available_rooms() + + return self._available_rooms + + def get_room_by_jid(self, jid): + for room in self.available_rooms.values(): + if "xmpp_jid" in room and room["xmpp_jid"] == jid: + return room + return None + + def get_room_from_message(self, message): + return self.get_room_by_jid(message.getMucroom()) + + def get_room_from_name_or_id(self, name_or_id): + for name, room in self.available_rooms.items(): + if name_or_id == name: + return room + if "xmpp_jid" in room and name_or_id == room["xmpp_jid"]: + return room + if "room_id" in room and name_or_id == room["room_id"]: + return room + return None + + +class HipChatXMPPClient(ClientXMPP, HipChatRosterMixin, HipChatRoomMixin, StorageMixin, PubSubMixin): def start_xmpp_client(self, xmpp_bridge_queue=None, backend_name=""): logger = logging.getLogger(__name__) @@ -272,7 +393,7 @@ def _send_to_backend(self, msg): self.xmpp_bridge_queue.put(stripped_msg) -class HipChatBackend(IOBackend, HipChatRosterMixin, RoomMixin, StorageMixin): +class HipChatBackend(IOBackend, HipChatRosterMixin, HipChatRoomMixin, StorageMixin): friendly_name = "HipChat" internal_name = "will.backends.io_adapters.hipchat" required_settings = [ @@ -611,7 +732,7 @@ def bootstrap(self): # Note that Channel asks for members, a list of People. # f) A way for self.handle, self.me, self.people, and self.channels to be kept accurate, # with a maximum lag of 60 seconds. - self.client = HipchatXMPPClient("%s/bot" % settings.HIPCHAT_USERNAME, settings.HIPCHAT_PASSWORD) + self.client = HipChatXMPPClient("%s/bot" % settings.HIPCHAT_USERNAME, settings.HIPCHAT_PASSWORD) self.xmpp_bridge_queue = Queue() self.client.start_xmpp_client( xmpp_bridge_queue=self.xmpp_bridge_queue, diff --git a/will/main.py b/will/main.py index efac6334..83947cac 100644 --- a/will/main.py +++ b/will/main.py @@ -30,7 +30,7 @@ from will.backends import analysis, execution, generation, io_adapters from will.backends.io_adapters.base import Event from will.mixins import ScheduleMixin, StorageMixin, ErrorMixin, SleepMixin,\ - RoomMixin, PluginModulesLibraryMixin, EmailMixin, PubSubMixin + PluginModulesLibraryMixin, EmailMixin, PubSubMixin from will.scheduler import Scheduler from will.utils import show_valid, show_invalid, error, warn, note, print_head, Bunch @@ -65,7 +65,7 @@ def yappi_aggregate(func, stats): class WillBot(EmailMixin, StorageMixin, ScheduleMixin, PubSubMixin, SleepMixin, - ErrorMixin, RoomMixin, PluginModulesLibraryMixin): + ErrorMixin, PluginModulesLibraryMixin): def __init__(self, **kwargs): if "template_dirs" in kwargs: diff --git a/will/mixins/__init__.py b/will/mixins/__init__.py index 63517fa5..9bf30183 100644 --- a/will/mixins/__init__.py +++ b/will/mixins/__init__.py @@ -2,7 +2,6 @@ from will.mixins.encryption import EncryptionMixin from will.mixins.email import EmailMixin from will.mixins.naturaltime import NaturalTimeMixin -from will.mixins.room import RoomMixin from will.mixins.plugins_library import PluginModulesLibraryMixin from will.mixins.schedule import ScheduleMixin from will.mixins.settings import SettingsMixin @@ -10,6 +9,7 @@ from will.mixins.storage import StorageMixin from will.mixins.pubsub import PubSubMixin -# RosterMixin has been moved to from will.backends.io_adapters.hipchat import HipChatRosterMixin +# RosterMixin and RoomMixin have been moved to from will.backends.io_adapters.hipchat # This is just for logging a warning for people who have used it internally +from will.mixins.room import RoomMixin from will.mixins.roster import RosterMixin diff --git a/will/mixins/room.py b/will/mixins/room.py index 6dc3cca7..810a073b 100644 --- a/will/mixins/room.py +++ b/will/mixins/room.py @@ -1,130 +1,21 @@ -from datetime import datetime -import logging -import json -import requests +class Room(object): -from will import settings -from will.utils import Bunch - -logger = logging.getLogger(__name__) - -V1_TOKEN_URL = "https://%(server)s/v1/rooms/list?auth_token=%(token)s" -V2_TOKEN_URL = "https://%(server)s/v2/room?auth_token=%(token)s&expand=items" - - -class Room(Bunch): - - @property - def id(self): - if 'room_id' in self: - # Using API v1 - return self['room_id'] - elif 'id' in self: - # Using API v2 - return self['id'] - else: - raise TypeError('Room ID not found') - - @property - def history(self): - payload = {"auth_token": settings.HIPCHAT_V2_TOKEN} - response = requests.get("https://{1}/v2/room/{0}/history".format(str(self.id), - settings.HIPCHAT_SERVER), - params=payload, **settings.REQUESTS_OPTIONS) - data = json.loads(response.text)['items'] - for item in data: - item['date'] = datetime.strptime(item['date'][:-13], "%Y-%m-%dT%H:%M:%S") - return data - - @property - def participants(self): - payload = {"auth_token": settings.HIPCHAT_V2_TOKEN} - response = requests.get( - "https://{1}/v2/room/{0}/participant".format( - str(self.id), - settings.HIPCHAT_SERVER - ), - params=payload, - **settings.REQUESTS_OPTIONS - ).json() - data = response['items'] - while 'next' in response['links']: - response = requests.get(response['links']['next'], - params=payload, **settings.REQUESTS_OPTIONS).json() - data.extend(response['items']) - return data + def __init__(self, *args, **kwargs): + import logging + logging.critical( + "Room has been renamed to HipChatRoom, and will be removed from future releases.\n" + + "Please change all your imports to will.backends.io_adapters.hipchat import HipChatRoom" + ) + super(Room, self).__init__(*args, **kwargs) class RoomMixin(object): - def update_available_rooms(self, q=None): - self._available_rooms = {} - # Use v1 token to grab a full room list if we can (good to avoid rate limiting) - if hasattr(settings, "V1_TOKEN"): - url = V1_TOKEN_URL % {"server": settings.HIPCHAT_SERVER, - "token": settings.HIPCHAT_V1_TOKEN} - r = requests.get(url, **settings.REQUESTS_OPTIONS) - if r.status_code == requests.codes.unauthorized: - raise Exception("V1_TOKEN authentication failed with HipChat") - for room in r.json()["rooms"]: - # Some integrations expect a particular name for the ID field. - # Better to use room.id. - room["id"] = room["room_id"] - self._available_rooms[room["name"]] = Room(**room) - # Otherwise, grab 'em one-by-one via the v2 api. - else: - params = {} - params['start-index'] = 0 - max_results = params['max-results'] = 1000 - url = V2_TOKEN_URL % {"server": settings.HIPCHAT_SERVER, - "token": settings.HIPCHAT_V2_TOKEN} - while True: - resp = requests.get(url, params=params, - **settings.REQUESTS_OPTIONS) - if resp.status_code == requests.codes.unauthorized: - raise Exception("V2_TOKEN authentication failed with HipChat") - rooms = resp.json() - - for room in rooms["items"]: - # Some integrations expect a particular name for the ID field. - # Better to use room.id - room["room_id"] = room["id"] - self._available_rooms[room["name"]] = Room(**room) - - logger.info('Got %d rooms', len(rooms['items'])) - if len(rooms['items']) == max_results: - params['start-index'] += max_results - else: - break - - self.save("hipchat_rooms", self._available_rooms) - if q: - q.put(self._available_rooms) - - @property - def available_rooms(self): - if not hasattr(self, "_available_rooms"): - self._available_rooms = self.load('hipchat_rooms', None) - if not self._available_rooms: - self.update_available_rooms() - - return self._available_rooms - - def get_room_by_jid(self, jid): - for room in self.available_rooms.values(): - if "xmpp_jid" in room and room["xmpp_jid"] == jid: - return room - return None - - def get_room_from_message(self, message): - return self.get_room_by_jid(message.getMucroom()) - def get_room_from_name_or_id(self, name_or_id): - for name, room in self.available_rooms.items(): - if name_or_id == name: - return room - if "xmpp_jid" in room and name_or_id == room["xmpp_jid"]: - return room - if "room_id" in room and name_or_id == room["room_id"]: - return room - return None + def __init__(self, *args, **kwargs): + import logging + logging.critical( + "RoomMixin has been renamed to HipChatRoomMixin, and will be removed from future releases.\n" + + "Please change all your imports to will.backends.io_adapters.hipchat import HipChatRoomMixin" + ) + super(RoomMixin, self).__init__(*args, **kwargs) diff --git a/will/mixins/roster.py b/will/mixins/roster.py index 0f54c229..d6b207c3 100644 --- a/will/mixins/roster.py +++ b/will/mixins/roster.py @@ -4,6 +4,6 @@ def __init__(self, *args, **kwargs): import logging logging.critical( "RosterMixin has been moved to the hipchat backend.\n" + - "Please change all your imports to from will.backends.io_adapters.hipchat import HipChatRosterMixin" + "Please change all your imports to `from will.backends.io_adapters.hipchat import HipChatRosterMixin`" ) super(RosterMixin, self).__init__(*args, **kwargs) diff --git a/will/plugin.py b/will/plugin.py index 05294acf..89d7cf91 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -5,13 +5,14 @@ from will import settings from will.abstractions import Event, Message -from will.backends.io_adapters.hipchat import HipChatRosterMixin -from will.mixins import NaturalTimeMixin, RoomMixin, ScheduleMixin, StorageMixin, SettingsMixin, \ +# Backwards compatability with 1.x, eventually to be deprecated. +from will.backends.io_adapters.hipchat import HipChatRosterMixin, HipChatRoomMixin +from will.mixins import NaturalTimeMixin, ScheduleMixin, StorageMixin, SettingsMixin, \ EmailMixin, PubSubMixin from will.utils import html_to_text -class WillPlugin(EmailMixin, StorageMixin, NaturalTimeMixin, RoomMixin, HipChatRosterMixin, +class WillPlugin(EmailMixin, StorageMixin, NaturalTimeMixin, HipChatRoomMixin, HipChatRosterMixin, ScheduleMixin, SettingsMixin, PubSubMixin): is_will_plugin = True request = request diff --git a/will/plugins/chat_room/__init__.py b/will/plugins/chat_room/__init__.py index 32aff261..7c7cb04b 100644 --- a/will/plugins/chat_room/__init__.py +++ b/will/plugins/chat_room/__init__.py @@ -1 +1 @@ -MODULE_DESCRIPTION = "Hipchat actions" +MODULE_DESCRIPTION = "HipChat actions" From 0366bfdafea5039c7a5a8442604b1888c7c5cd43 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 13:56:48 +1300 Subject: [PATCH 052/200] No longer require HIPCHAT_HANDLE or HIPCHAT_NAME, automatically get the correct ones from the API. --- config.py | 7 ---- will/backends/io_adapters/hipchat.py | 33 ++++++++++++------- will/settings.py | 48 ++++++++++++++++++---------- 3 files changed, 53 insertions(+), 35 deletions(-) diff --git a/config.py b/config.py index 9a68e90a..44f9b580 100644 --- a/config.py +++ b/config.py @@ -127,16 +127,9 @@ # HipChat settings # ------------------------------------------------------------------------------------ -# Ideally, set these in the environment with the WILL_ prefix. -# Will's mention name, e.g. @will -# HIPCHAT_HANDLE = 'will' - # The list of rooms will should join. Default is all rooms. # HIPCHAT_ROOMS = ['Will Testing', 'Will and I'] -# Will's proper name -# HIPCHAT_NAME = "William T. Botterton" - # Disable HipChat SSL checks. Strongly reccomended this is not set to True. # ALLOW_INSECURE_HIPCHAT_SERVER = False diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index 672d9385..dfe376c0 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -250,9 +250,17 @@ def start_xmpp_client(self, xmpp_bridge_queue=None, backend_name=""): self.rooms = [] self.default_room = settings.HIPCHAT_DEFAULT_ROOM - # TODO: Clean this up, and pass it in from the controlling thread, - # then nuke RoomsMixin - # Property boostraps the list + my_user_url = "https://%(server)s/v2/user/%(user_id)s?auth_token=%(token)s" % { + "user_id": settings.HIPCHAT_USERNAME.split("@")[0].split("_")[1], + "server": settings.HIPCHAT_SERVER, + "token": settings.HIPCHAT_V2_TOKEN, + } + r = requests.get(my_user_url, **settings.REQUESTS_OPTIONS) + resp = r.json() + settings.HIPCHAT_EMAIL = resp["email"] + settings.HIPCHAT_HANDLE = resp["mention_name"] + settings.HIPCHAT_NAME = resp["name"] + self.available_rooms for r in settings.HIPCHAT_ROOMS: if r != "": @@ -282,6 +290,8 @@ def start_xmpp_client(self, xmpp_bridge_queue=None, backend_name=""): self.add_event_handler("message", self.message_recieved) self.add_event_handler("groupchat_message", self.room_message) self.add_event_handler("groupchat_invite", self.room_invite) + self.add_event_handler("error", self.handle_errors) + self.add_event_handler("presence_error", self.handle_errors) self.register_plugin('xep_0045') # MUC @@ -303,7 +313,11 @@ def join_rooms(self, event): for r in self.rooms: if "xmpp_jid" in r: - self.plugin['xep_0045'].joinMUC(r["xmpp_jid"], self.nick, wait=True) + self.plugin['xep_0045'].joinMUC(r["xmpp_jid"], settings.HIPCHAT_NAME, wait=True) + + def handle_errors(self, event): + print "got error event" + print event def room_invite(self, event): # TODO: Pull this and related. @@ -311,7 +325,7 @@ def room_invite(self, event): logging.info("Invite recieved for %s" % event) for r in self.rooms: if "xmpp_jid" in r: - self.plugin['xep_0045'].joinMUC(r["xmpp_jid"], self.nick, wait=True) + self.plugin['xep_0045'].joinMUC(r["xmpp_jid"], settings.HIPCHAT_NAME, wait=True) def update_will_roster_and_rooms(self): people = self.load('will_hipchat_people', {}) @@ -417,12 +431,7 @@ class HipChatBackend(IOBackend, HipChatRosterMixin, HipChatRoomMixin, StorageMix 2. Go to https://your-org.hipchat.com/account/api 3. Create a token. 4. Copy the value - this is the HIPCHAT_V2_TOKEN.""", - }, - { - "name": "HIPCHAT_HANDLE", - "obtain_at": """1. Log into hipchat using will's user. -2. Set HIPCHAT_HANDLE to Will's users' mention name without the @, i.e. @will would be HIPCHAT_HANDLE='will'.""", - }, + } ] def send_direct_message(self, user_id, message_body, html=False, card=None, notify=False, **kwargs): @@ -505,7 +514,7 @@ def get_room_from_message(self, event): return False else: # We're in a public room - return send_source.channel.id, + return send_source.channel.id else: # Came from webhook/etc if "room" in kwargs: diff --git a/will/settings.py b/will/settings.py index 6b76426b..1e80b31d 100644 --- a/will/settings.py +++ b/will/settings.py @@ -153,6 +153,19 @@ def import_settings(quiet=True): # Set for hipchat for b in settings["IO_BACKENDS"]: if "hipchat" in b: + if "ALLOW_INSECURE_HIPCHAT_SERVER" in settings and\ + (settings["ALLOW_INSECURE_HIPCHAT_SERVER"] is True or + settings["ALLOW_INSECURE_HIPCHAT_SERVER"].lower() == "true"): + warn("You are choosing to run will with SSL disabled. " + "This is INSECURE and should NEVER be deployed outside a development environment.") + settings["ALLOW_INSECURE_HIPCHAT_SERVER"] = True + settings["REQUESTS_OPTIONS"] = { + "verify": False, + } + else: + settings["ALLOW_INSECURE_HIPCHAT_SERVER"] = False + settings["REQUESTS_OPTIONS"] = {} + if "HIPCHAT_ROOMS" not in settings: if not quiet: warn("no HIPCHAT_ROOMS list found in the environment or config. " @@ -168,13 +181,29 @@ def import_settings(quiet=True): "Defaulting to '%s', the first one." % settings["HIPCHAT_ROOMS"][0]) settings["HIPCHAT_DEFAULT_ROOM"] = settings["HIPCHAT_ROOMS"][0] + if "HIPCHAT_HANDLE" in settings and "HIPCHAT_HANDLE_NOTED" not in settings: + if not quiet: + note( + "HIPCHAT_HANDLE is no longer required (or used), as Will knows how to get\n" + + " his current handle from the HipChat servers." + ) + settings["HIPCHAT_HANDLE_NOTED"] = True + + if "HIPCHAT_NAME" in settings and "HIPCHAT_NAME_NOTED" not in settings: + if not quiet: + note( + "HIPCHAT_NAME is no longer required (or used), as Will knows how to get\n" + + " his current name from the HipChat servers." + ) + settings["HIPCHAT_NAME_NOTED"] = True + if ( "DEFAULT_BACKEND" not in settings and "IO_BACKENDS" in settings and settings["IO_BACKENDS"] and len(settings["IO_BACKENDS"]) > 0 ): if not quiet: - note("no DEFAULT_BACKEND found in the environment or config. " - "Defaulting to '%s', the first one." % settings["IO_BACKENDS"][0]) + note("no DEFAULT_BACKEND found in the environment or config.\n " + " Defaulting to '%s', the first one." % settings["IO_BACKENDS"][0]) settings["DEFAULT_BACKEND"] = settings["IO_BACKENDS"][0] for b in settings["IO_BACKENDS"]: @@ -244,7 +273,7 @@ def import_settings(quiet=True): default_public = "http://localhost:%s" % settings["HTTPSERVER_PORT"] settings["PUBLIC_URL"] = default_public if not quiet: - note("no PUBLIC_URL found in the environment or config. Defaulting to '%s'." % default_public) + note("no PUBLIC_URL found in the environment or config.\n Defaulting to '%s'." % default_public) if "TEMPLATE_DIRS" not in settings: if "WILL_TEMPLATE_DIRS_PICKLED" in os.environ: @@ -265,19 +294,6 @@ def import_settings(quiet=True): else: settings["WILL_HANDLE"] = "will" - if "ALLOW_INSECURE_HIPCHAT_SERVER" in settings and\ - (settings["ALLOW_INSECURE_HIPCHAT_SERVER"] is True or - settings["ALLOW_INSECURE_HIPCHAT_SERVER"].lower() == "true"): - warn("You are choosing to run will with SSL disabled. " - "This is INSECURE and should NEVER be deployed outside a development environment.") - settings["ALLOW_INSECURE_HIPCHAT_SERVER"] = True - settings["REQUESTS_OPTIONS"] = { - "verify": False, - } - else: - settings["ALLOW_INSECURE_HIPCHAT_SERVER"] = False - settings["REQUESTS_OPTIONS"] = {} - if "ADMINS" not in settings: settings["ADMINS"] = "*" else: From 26e57d87e957e037c2b926cda88ea225e64e2644 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 17:28:25 +1300 Subject: [PATCH 053/200] Handles UTF8 in docstrings, provides room/channel fallbacks. --- will/main.py | 6 +++--- will/plugin.py | 19 ++++++++++++++++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/will/main.py b/will/main.py index 83947cac..9ed3420c 100644 --- a/will/main.py +++ b/will/main.py @@ -1019,11 +1019,11 @@ def bootstrap_plugins(self): pht = plugin_info.get("parent_help_text", None) if pht: if pht in self.help_modules: - self.help_modules[pht].append(meta["__doc__"]) + self.help_modules[pht].append(u"%s" % meta["__doc__"]) else: - self.help_modules[pht] = [meta["__doc__"]] + self.help_modules[pht] = [u"%s" % meta["__doc__"]] else: - self.help_modules[OTHER_HELP_HEADING].append(meta["__doc__"]) + self.help_modules[OTHER_HELP_HEADING].append(u"%s" % meta["__doc__"]) if meta["multiline"]: compiled_regex = re.compile(regex, re.MULTILINE | re.DOTALL) else: diff --git a/will/plugin.py b/will/plugin.py index 89d7cf91..b78ed74c 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -54,9 +54,13 @@ def get_message(self, message_passed): return self.message return message_passed - def say(self, content, message=None, room=None, package_for_scheduling=False, **kwargs): + def say(self, content, message=None, room=None, channel=None, package_for_scheduling=False, **kwargs): logging.info("self.say") logging.info(content) + if channel: + room = channel + elif room: + channel = room if not "room" in kwargs and room: kwargs["room"] = room @@ -132,7 +136,12 @@ def reply(self, event, content=None, message=None, package_for_scheduling=False, else: self.publish("message.outgoing.%s" % backend, e) - def set_topic(self, topic, message=None, room=None, **kwargs): + def set_topic(self, topic, message=None, room=None, channel=None, **kwargs): + if channel: + room = channel + elif room: + channel = room + message = self.get_message(message) message = self._trim_for_execution(message) backend = self.get_backend(message) @@ -145,7 +154,11 @@ def set_topic(self, topic, message=None, room=None, **kwargs): ) self.publish("message.outgoing.%s" % backend, e) - def schedule_say(self, content, when, message=None, room=None, *args, **kwargs): + def schedule_say(self, content, when, message=None, room=None, channel=None, *args, **kwargs): + if channel: + room = channel + elif room: + channel = room packaged_event = self.reply(None, content=content, message=message, package_for_scheduling=True) self.add_outgoing_event_to_schedule(when, { "type": "message", From 482da195da4ffc8d2ab243efbb462b5c888fd930 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 17:34:59 +1300 Subject: [PATCH 054/200] 1.0.2 credits and version --- docs/improve.md | 9 +++++++++ will/__init__.py | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/improve.md b/docs/improve.md index a4f92036..d2304159 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -148,6 +148,15 @@ If you're looking for plugin inspiration, here are some wills that are open-sour ## Releases +#### 1.0.2 - October 24, 2017 + +Fixes and features in this release: + +* Makes passing the `room=` option *much* easier (you can just use the room's name now, thanks to [wontonst](https://github.com/wontonst). +* Adds support for jinja `custom_filters` in the `@rendered_template` decorator, thanks to [chillipeper](https://github.com/chillipeper). + + + #### 1.0.1 - October 10, 2017 Fixes and features in this release: diff --git a/will/__init__.py b/will/__init__.py index 50b5ea95..2be0457e 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "1.0.1" +VERSION = "1.0.2" From ddffaeaa2beadd3f33630255273b1a18a32eb00e Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 17:37:57 +1300 Subject: [PATCH 055/200] Ignores E722 --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 08d4c12f..060d8912 100644 --- a/setup.cfg +++ b/setup.cfg @@ -5,5 +5,5 @@ addopts = --cov-report term-missing --cov-config=.coveragerc --cov . test = pytest [flake8] -ignore = F401,N812,F403,E721,E713,F405,W503 +ignore = F401,N812,F403,E721,E713,F405,W503,E722 max-line-length = 120 \ No newline at end of file From 502f44f8536e65d1368e42ff7bed2ea27d85a690 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 17:39:57 +1300 Subject: [PATCH 056/200] Adds docs for 1.0.2 --- docs/improve.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/improve.md b/docs/improve.md index d2304159..87031fb1 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -96,7 +96,7 @@ Will's also has had help from lots of coders. Alphabetically: - [camilonova](https://github.com/camilonova) fixed the `@randomly` decorator, and brought the joy of more pugs to your life. He's also reported several important bugs. - [ckcollab](http://github.com/ckcollab) was one of the original contributors, when will was first built at GreenKahuna. - [charlax](https://github.com/charlax) gave us batch-get of rooms via the V2 API. -- [chillipeper](https://github.com/chillipeper) fixed up the max-size and handling of V2 rooms. +- [chillipeper](https://github.com/chillipeper) fixed up the max-size and handling of V2 rooms, and taught will how to use bottle's `custom_filters`. - [crccheck](https://github.com/crccheck) gave you friendly error messages if your `WILL_ROOMS` was wrong. - [d0ugal](https://github.com/d0ugal) fixed up the docs to meet the new mkdocs standard. - [danbourke](https://github.com/danbourke) submitted a fix for the >2000 rooms bug, and kept Will happy. @@ -132,6 +132,7 @@ Will's also has had help from lots of coders. Alphabetically: - [tophsic](https://github.com/tophsic) made help friendlier, including plugin-specific help. - [wohali](https://github.com/wohali) tracked down the annoying DNS thread issue, and got will on the right path. - [woohgit](https://github.com/woohgit) added support for the v2 WorldWeatherOnline API, and fixed it when I broke it, and then fixed it again when they changed their endpoint. He also taught will how to say his version number. And `remind ___ to ___ at ___`. Awesome. And fixed lots of docs. And put the time zone with "what time is it?". And then added an entire Pagerduty workflow. And made message parsing more reliable. And wrote the ACL support. And even more doc fixes. And improvements on uptime monitoring edge cases. And kept Pagerduty working. And added `append` and `pop` list support. And ditched WorldWeatherOnline when it started to hurt. Yep. +- [wontonst](https://github.com/wontonst) made it simple to have will reply to a specific room. - [woparry](https://github.com/woparry) made sure that Will could handle organizations with a massive (>2000) number of rooms. From a71711b1472ec03b251b9bd2fad521bc3813e6e4 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 17:42:52 +1300 Subject: [PATCH 057/200] Adds missing paren. --- docs/improve.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/improve.md b/docs/improve.md index 87031fb1..4a07cb03 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -153,7 +153,7 @@ If you're looking for plugin inspiration, here are some wills that are open-sour Fixes and features in this release: -* Makes passing the `room=` option *much* easier (you can just use the room's name now, thanks to [wontonst](https://github.com/wontonst). +* Makes passing the `room=` option *much* easier (you can just use the room's name now,) thanks to [wontonst](https://github.com/wontonst). * Adds support for jinja `custom_filters` in the `@rendered_template` decorator, thanks to [chillipeper](https://github.com/chillipeper). From 7b688ab90b6752d9724895fc61f8acef3bae375b Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 24 Oct 2017 18:18:47 +1300 Subject: [PATCH 058/200] Ports @wontonst 's room= improvements to 2.x --- will/backends/io_adapters/hipchat.py | 36 ++++++++++++++++++++----- will/backends/io_adapters/rocketchat.py | 4 +-- will/backends/io_adapters/slack.py | 12 ++++----- will/plugin.py | 4 +-- 4 files changed, 39 insertions(+), 17 deletions(-) diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index dfe376c0..f9791552 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -217,7 +217,7 @@ def get_room_from_message(self, message): def get_room_from_name_or_id(self, name_or_id): for name, room in self.available_rooms.items(): - if name_or_id == name: + if name_or_id.lower() == name.lower(): return room if "xmpp_jid" in room and name_or_id == room["xmpp_jid"]: return room @@ -664,11 +664,34 @@ def handle_outgoing_event(self, event): if hasattr(event, "kwargs"): kwargs.update(event.kwargs) + room = None + passed_room = None + if "room" in kwargs: + passed_room = kwargs["room"] + if "channel" in kwargs: + passed_room = kwargs["channel"] + + if passed_room: + if isinstance(passed_room, basestring): + # User passed in a room string + room = self.get_room_from_name_or_id(passed_room) + else: + # User found the internal HipChatRoom object and passed it. + room = passed_room + else: + # Default to the room we heard this message in. + room = self.get_room_from_message(event) + + room_id = None + if room and hasattr(room, "id"): + room_id = room.id + else: + room_id = room + if event.type in ["say", "reply"]: event.content = re.sub(r'>\s+<', '><', event.content) - room = self.get_room_from_message(event) - if hasattr(event, "source_message") and event.source_message: + if hasattr(event, "source_message") and event.source_message and not room: send_source = event.source_message if hasattr(event.source_message, "data"): @@ -681,15 +704,14 @@ def handle_outgoing_event(self, event): # Otherwise trust room. self.send_room_message( - room, + room_id, event.content, **kwargs ) elif event.type in ["topic_change", ]: - room = self.get_room_from_message(event) - if room: - self.set_room_topic(room, event.content) + if room_id: + self.set_room_topic(room_id, event.content) else: if hasattr(event, "source_message") and event.source_message: send_source = event.source_message diff --git a/will/backends/io_adapters/rocketchat.py b/will/backends/io_adapters/rocketchat.py index ba2d1574..ac1de71d 100644 --- a/will/backends/io_adapters/rocketchat.py +++ b/will/backends/io_adapters/rocketchat.py @@ -167,8 +167,8 @@ def handle_outgoing_event(self, event): # 2. Group (channel) messages # 3. Ad-hoc group messages (if they exist) # 4. Messages that have a channel/room explicitly specified that's different than - # where they came from/ - # 5. Messages without a channel (Fallback to ROCKETCHAT_DEFAULT_CHANNEL) (messages that don't have a room, ) + # where they came from. + # 5. Messages without a channel (Fallback to ROCKETCHAT_DEFAULT_CHANNEL) (messages that don't have a room ) kwargs = {} if "kwargs" in event: kwargs.update(**event.kwargs) diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index f5a0534c..2e1a32ff 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -42,7 +42,7 @@ class SlackBackend(IOBackend, SleepMixin, StorageMixin): def get_channel_from_name(self, name): for k, c in self.channels.items(): - if c.name == name or c.id == name: + if c.name.lower() == name.lower() or c.id.lower() == name.lower(): return c def normalize_incoming_event(self, event): @@ -165,15 +165,15 @@ def handle_outgoing_event(self, event): event.content = event.content.replace(">", ">") event.content = event.content.replace("\_", "_") - if hasattr(event, "source_message") and event.source_message: + kwargs = {} + if "kwargs" in event: + kwargs.update(**event.kwargs) + + if hasattr(event, "source_message") and event.source_message and "channel" not in kwargs: self.send_message(event) else: # Came from webhook/etc # TODO: finish this. - kwargs = {} - if "kwargs" in event: - kwargs.update(**event.kwargs) - if "room" in kwargs: event.channel = self.get_channel_from_name(kwargs["room"]) elif "channel" in kwargs: diff --git a/will/plugin.py b/will/plugin.py index b78ed74c..ecb13159 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -62,8 +62,8 @@ def say(self, content, message=None, room=None, channel=None, package_for_schedu elif room: channel = room - if not "room" in kwargs and room: - kwargs["room"] = room + if not "channel" in kwargs and channel: + kwargs["channel"] = channel message = self.get_message(message) message = self._trim_for_execution(message) From a696afab2a4fc1d810f202b9f8a6524f09eaffd4 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 25 Oct 2017 20:42:02 +1300 Subject: [PATCH 059/200] Fixes up rocket.chat, adds routing, gets code to same patterns, provides hacky but effective image me fallback, adds 'gif me'. :) --- will/backends/io_adapters/base.py | 16 ++- will/backends/io_adapters/rocketchat.py | 179 ++++++++++++++---------- will/plugins/productivity/images.py | 108 +++++++++++--- will/settings.py | 14 +- will/utils.py | 2 + 5 files changed, 217 insertions(+), 102 deletions(-) diff --git a/will/backends/io_adapters/base.py b/will/backends/io_adapters/base.py index bb4b8068..e7b77999 100644 --- a/will/backends/io_adapters/base.py +++ b/will/backends/io_adapters/base.py @@ -39,11 +39,17 @@ def normalize_incoming_event(self, event): raise NotImplemented def handle_incoming_event(self, event): - m = self.normalize_incoming_event(event) - if m: - # print("\n\n\n\nhandle_incoming_event") - # print(m) - self.pubsub.publish("message.incoming", m, reference_message=m) + try: + m = self.normalize_incoming_event(event) + if m: + # print("\n\n\n\nhandle_incoming_event") + # print(m) + self.pubsub.publish("message.incoming", m, reference_message=m) + except: + logging.critical("Error handling incoming event %s: \n%s" % ( + event, + traceback.format_exc(), + )) def handle_outgoing_event(self, event): raise NotImplemented diff --git a/will/backends/io_adapters/rocketchat.py b/will/backends/io_adapters/rocketchat.py index ac1de71d..a427b718 100644 --- a/will/backends/io_adapters/rocketchat.py +++ b/will/backends/io_adapters/rocketchat.py @@ -15,50 +15,39 @@ from six.moves.urllib import parse from will import settings -from will.utils import Bunch, UNSURE_REPLIES, clean_for_pickling from will.abstractions import Event, Message, Person, Channel +from will.mixins import SleepMixin, StorageMixin +from will.utils import Bunch, UNSURE_REPLIES, clean_for_pickling from .base import IOBackend -class RocketChatBackend(IOBackend): +class RocketChatBackend(IOBackend, StorageMixin): friendly_name = "RocketChat (BETA)" internal_name = "will.backends.io_adapters.rocketchat" required_settings = [ { "name": "ROCKETCHAT_USERNAME", - "obtain_at": "Will username as configured in Rocket.Chat.", + "obtain_at": """1. Go to your rocket.chat instance (i.e. your-name.rocket.chat) +2. Create a new normal account for Will. +3. Set this value to the username, just like you'd use to log in with it.""", }, { "name": "ROCKETCHAT_PASSWORD", - "obtain_at": "Will password as configured in Rocket.Chat.", + "obtain_at": """1. Go to your rocket.chat instance (i.e. your-name.rocket.chat) +2. Create a new normal account for Will, and note the password you use. +3. Set this value to that password, just like you'd use to log in with it.""", }, { - "name": "ROCKETCHAT__URL", + "name": "ROCKETCHAT_URL", "obtain_at": ( - "Including protocol and port if not 80 e.g. " - "http://localhost:3000" - ), - }, - { - "name": "ROCKETCHAT_HANDLE", - "obtain_at": ( - "Will's mention name in Rocket.chat, e.g. @will is 'will'" + "This is your rocket.chat url - typically either your-name.rocket.chat for " + "Rocket.Chat cloud, or something like http://localhost:3000 for local installations." ), }, ] pp = pprint.PrettyPrinter(indent=4) - def __init__(self): - - self.rcapi = settings.ROCKETCHAT_URL + '/api/v1/' - self.subscribed_rooms = {} - - # Set up Values to be shared by Processes - self.manager = Manager() - self.token = self.manager.Value(ctypes.c_char_p, '') - self.userid = self.manager.Value(ctypes.c_char_p, '') - def normalize_incoming_event(self, event): logging.info('Normalizing incoming Rocket.Chat event') logging.debug('event: {}'.format(self.pp.pformat(event))) @@ -95,7 +84,17 @@ def normalize_incoming_event(self, event): members=channel_members ) else: - channel = clean_for_pickling(self.channels[event["rid"]]) + if "rid" in event and event["rid"] in self.channels: + channel = clean_for_pickling(self.channels[event["rid"]]) + else: + # Private channel, unknown members. Just do our best and try to route it. + if "rid" in event: + channel = Channel( + id=event["rid"], + name=event["rid"], + source=clean_for_pickling(event["rid"]), + members={} + ) logging.debug('channel: {}'.format(channel)) # Set various variables depending on whether @handle was @@ -140,15 +139,13 @@ def normalize_incoming_event(self, event): will_is_mentioned=will_is_mentioned, will_said_it=will_said_it, backend_supports_acl=True, - source=clean_for_pickling(event) + original_incoming_event=clean_for_pickling(event) ) return m else: logging.debug('Passing, I dont know how to normalize this event of type ', event["type"]) pass - # This and send_message heavily "inspired" by slack.py. Technical - # debt may be present. :) def handle_outgoing_event(self, event): # Print any replies. logging.info('Handling outgoing Rocket.Chat event') @@ -159,8 +156,9 @@ def handle_outgoing_event(self, event): if "kwargs" in event and "html" in event.kwargs and event.kwargs["html"]: event.content = html2text.html2text(event.content) + self.send_message(event) if hasattr(event, "source_message") and event.source_message: - self.send_message(event) + pass else: # TODO: Rocket.Chat backend needs to provide ways to handle and properly route: # 1. 1-1 messages @@ -174,17 +172,19 @@ def handle_outgoing_event(self, event): kwargs.update(**event.kwargs) if event.type in ["topic_change", ]: - self.set_room_topic(event.content) + self.set_topic(event.content) elif ( event.type == "message.no_response" and - event.data["source"].data.is_direct and - event.data["source"].data.will_said_it is False + event.data.is_direct and + event.data.will_said_it is False ): event.content = random.choice(UNSURE_REPLIES) self.send_message(event) def set_topic(self, event): logging.warn("Rocket.Chat doesn't support topics yet: https://github.com/RocketChat/Rocket.Chat/issues/328") + event.content("Hm. Looks like Rocket.Chat doesn't support topics yet: https://github.com/RocketChat/Rocket.Chat/issues/328") + self.send_message(event) def send_message(self, event): logging.info('Sending message to Rocket.Chat') @@ -241,11 +241,13 @@ def _get_realtime_metadata(self): def _rest_login(self): params = {'username': settings.ROCKETCHAT_USERNAME, 'password': settings.ROCKETCHAT_PASSWORD} - r = requests.post('{}login'.format(self.rcapi), + r = requests.post('{}login'.format(self.rocketchat_api_url), data=params) - rj = r.json() - self.token.value = rj['data']['authToken'] - self.userid.value = rj['data']['userId'] + resp_json = r.json() + self._token = resp_json['data']['authToken'] + self.save("WILL_ROCKETCHAT_TOKEN", self._token) + self._userid = resp_json['data']['userId'] + self.save("WILL_ROCKETCHAT_USERID", self._userid) def _rest_users_list(self): logging.debug('Getting users list from Rocket.Chat') @@ -253,28 +255,28 @@ def _rest_users_list(self): # Remember to paginate. ;) count = 50 passes = 0 - headers = {'X-Auth-Token': self.token.value, - 'X-User-Id': self.userid.value} + headers = {'X-Auth-Token': self.token, + 'X-User-Id': self.userid} fetched = 0 total = 0 - self.handle = settings.ROCKETCHAT_HANDLE - self.mention_handle = "@%s" % settings.ROCKETCHAT_HANDLE + self.handle = settings.ROCKETCHAT_USERNAME + self.mention_handle = "@%s" % settings.ROCKETCHAT_USERNAME people = {} while fetched <= total: params = {'count': count, 'offset': fetched} - r = requests.get('{}users.list'.format(self.rcapi), + r = requests.get('{}users.list'.format(self.rocketchat_api_url), headers=headers, params=params) - rj = r.json() - if rj['success'] is False: - logging.exception('rj: {}'.format(rj)) - total = rj['total'] + resp_json = r.json() + if resp_json['success'] is False: + logging.exception('resp_json: {}'.format(resp_json)) + total = resp_json['total'] - for user in rj['users']: + for user in resp_json['users']: # TODO: Unlike slack.py, no timezone support at present. # RC returns utcOffset, but this isn't enough to # determine timezone. @@ -312,21 +314,21 @@ def _rest_channels_list(self): # Remember to paginate. ;) count = 50 passes = 0 - headers = {'X-Auth-Token': self.token.value, - 'X-User-Id': self.userid.value} + headers = {'X-Auth-Token': self.token, + 'X-User-Id': self.userid} fetched = 0 total = 0 channels = {} while fetched <= total: - r = requests.get('{}channels.list'.format(self.rcapi), + r = requests.get('{}channels.list'.format(self.rocketchat_api_url), headers=headers) - rj = r.json() + resp_json = r.json() - total = rj['total'] + total = resp_json['total'] - for channel in rj['channels']: + for channel in resp_json['channels']: members = {} for username in channel['usernames']: userid = self._get_userid_from_username(username) @@ -347,35 +349,36 @@ def _rest_channels_list(self): def _rest_post_message(self, data): logging.info('Posting message to Rocket.Chat REST API') logging.debug('data: {}'.format(data)) - headers = {'X-Auth-Token': self.token.value, - 'X-User-Id': self.userid.value} + headers = { + 'X-Auth-Token': self.token, + 'X-User-Id': self.userid + } logging.debug('headers: {}'.format(headers)) - r = requests.post('{}chat.postMessage'.format(self.rcapi), - headers=headers, - json=data, - **settings.REQUESTS_OPTIONS) - rj = r.json() + r = requests.post( + '{}chat.postMessage'.format(self.rocketchat_api_url), + headers=headers, + data=data, + ) + resp_json = r.json() + # TODO: Necessary / useful to check return codes? - if not 'success' in rj: - logging.debug('rj: {}'.format(rj)) - assert rj['success'] + if not 'success' in resp_json: + logging.debug('resp_json: {}'.format(resp_json)) + assert resp_json['success'] # Realtime API functions, documented at # https://rocket.chat/docs/developer-guides/realtime-api/ - def _realtime_connect(self): - # TODO: Consider using auto_reconnect and debug options. + def _start_connect(self): up = parse.urlparse(settings.ROCKETCHAT_URL) if up.scheme == 'http': ws_proto = 'ws' else: ws_proto = 'wss' - self.rc = DDPClient('{}://{}/websocket'.format(ws_proto, up.netloc)) + self.rc = DDPClient('{}://{}/websocket'.format(ws_proto, up.netloc), auto_reconnect=True, auto_reconnect_timeout=1) + self.rc.on('connected', self._realtime_login) + self.rc.on('changed', self._changed_callback) self.rc.connect() - # TODO: Argh. This needs to be here because if we continue - # before the connection is ready, stuff fails with no errors - # to the console. This will take some debug effort. - time.sleep(5) def _realtime_login(self): params = [{'user': {'username': settings.ROCKETCHAT_USERNAME}, 'password': settings.ROCKETCHAT_PASSWORD}] @@ -388,12 +391,8 @@ def _login_callback(self, error, result): return logging.debug('result: {}'.format(result)) - - self.token.value = result['token'] - self.userid.value = result['id'] - - logging.debug('self.token.value: {}'.format(self.token.value)) - logging.debug('self.userid.value: {}'.format(self.userid.value)) + logging.debug('self.token: {}'.format(self.token)) + logging.debug('self.userid: {}'.format(self.userid)) # Use dummy to make it a Thread, otherwise DDP events don't # get back to the right place. If there is a real need to make @@ -419,11 +418,33 @@ def _stream_room_message_callback(self, error, event): logging.exception('error: {}'.format(error)) return + @property + def token(self): + if not hasattr(self, "_token") or not self._token: + self._token = self.load("WILL_ROCKETCHAT_TOKEN", None) + if not self._token: + self._rest_login() + return self._token + + @property + def userid(self): + if not hasattr(self, "_userid") or not self._userid: + self._userid = self.load("WILL_ROCKETCHAT_USERID", None) + if not self._userid: + self._rest_login() + return self._userid + + @property + def rocketchat_api_url(self): + if settings.ROCKETCHAT_URL.endswith("/"): + return settings.ROCKETCHAT_URL + 'api/v1/' + else: + return settings.ROCKETCHAT_URL + '/api/v1/' + # Gets updates from REST and Realtime APIs. def _get_updates(self): try: polling_interval_seconds = 5 - self.rc.on('changed', self._changed_callback) self._get_rest_metadata() while True: @@ -470,5 +491,9 @@ def bootstrap(self): # f) A way for self.handle, self.me, self.people, and self.channels to be kept accurate, # with a maximum lag of 60 seconds. - self._realtime_connect() - self._realtime_login() + self.subscribed_rooms = {} + + # Gets and stores token and ID. + self._rest_login() + # Kicks off listeners and REST room polling. + self._start_connect() diff --git a/will/plugins/productivity/images.py b/will/plugins/productivity/images.py index dd09f1f5..e90ff44d 100644 --- a/will/plugins/productivity/images.py +++ b/will/plugins/productivity/images.py @@ -1,3 +1,4 @@ +import logging import random import requests from will import settings @@ -11,30 +12,99 @@ class ImagesPlugin(WillPlugin): def image_me(self, message, search_query): """image me ___ : Search google images for ___, and post a random one.""" - if not (getattr(settings, "GOOGLE_API_KEY", False) and - getattr(settings, "GOOGLE_CUSTOM_SEARCH_ENGINE_ID", False)): + if ( + getattr(settings, "GOOGLE_API_KEY", False) and + getattr(settings, "GOOGLE_CUSTOM_SEARCH_ENGINE_ID", False) + ): self.say( "Sorry, I'm missing my GOOGLE_API_KEY and GOOGLE_CUSTOM_SEARCH_ENGINE_ID." " Can someone give them to me?", color="red" ) - return - - # https://developers.google.com/custom-search/json-api/v1/reference/cse/list?hl=en - data = { - "q": search_query, - "key": settings.GOOGLE_API_KEY, - "cx": settings.GOOGLE_CUSTOM_SEARCH_ENGINE_ID, - "safe": "medium", - "num": 8, - "searchType": "image", - } - r = requests.get("https://www.googleapis.com/customsearch/v1", params=data) - r.raise_for_status() - try: - response = r.json() - results = [result["link"] for result in response["items"] if "items" in r.json()] - except TypeError: + # https://developers.google.com/custom-search/json-api/v1/reference/cse/list?hl=en + data = { + "q": search_query, + "key": settings.GOOGLE_API_KEY, + "cx": settings.GOOGLE_CUSTOM_SEARCH_ENGINE_ID, + "safe": "medium", + "num": 8, + "searchType": "image", + } + r = requests.get("https://www.googleapis.com/customsearch/v1", params=data) + r.raise_for_status() + try: + response = r.json() + results = [result["link"] for result in response["items"] if "items" in r.json()] + except TypeError: + results = [] + else: + # Fall back to a really ugly hack. + logging.warn( + "Hey, I'm using a pretty ugly hack to get those images, and it might break. " + "Please set my GOOGLE_API_KEY and GOOGLE_CUSTOM_SEARCH_ENGINE_ID when you have a chance." + ) + r = requests.get("https://www.google.com/search?tbm=isch&safe=active&q=%s" % search_query) + results = [] + index = r.content.find(".*$)") + def gif_me(self, message, search_query): + + if ( + getattr(settings, "GOOGLE_API_KEY", False) and + getattr(settings, "GOOGLE_CUSTOM_SEARCH_ENGINE_ID", False) + ): + self.say( + "Sorry, I'm missing my GOOGLE_API_KEY and GOOGLE_CUSTOM_SEARCH_ENGINE_ID." + " Can someone give them to me?", color="red" + ) + # https://developers.google.com/custom-search/json-api/v1/reference/cse/list?hl=en + data = { + "q": search_query, + "key": settings.GOOGLE_API_KEY, + "cx": settings.GOOGLE_CUSTOM_SEARCH_ENGINE_ID, + "safe": "medium", + "num": 8, + "searchType": "image", + "imgType": "animated", + } + r = requests.get("https://www.googleapis.com/customsearch/v1", params=data) + r.raise_for_status() + try: + response = r.json() + results = [result["link"] for result in response["items"] if "items" in r.json()] + except TypeError: + results = [] + else: + # Fall back to a really ugly hack. + logging.warn( + "Hey, I'm using a pretty ugly hack to get those images, and it might break. " + "Please set my GOOGLE_API_KEY and GOOGLE_CUSTOM_SEARCH_ENGINE_ID when you have a chance." + ) + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', + } + r = requests.get("https://www.google.com/search?tbm=isch&tbs=itp:animated&safe=active&q=%s" % search_query, headers=headers) results = [] + index = r.content.find(" 0 @@ -275,6 +284,9 @@ def import_settings(quiet=True): if not quiet: note("no PUBLIC_URL found in the environment or config.\n Defaulting to '%s'." % default_public) + if not "REQUESTS_OPTIONS" in settings: + settings["REQUESTS_OPTIONS"] = {} + if "TEMPLATE_DIRS" not in settings: if "WILL_TEMPLATE_DIRS_PICKLED" in os.environ: # All good diff --git a/will/utils.py b/will/utils.py index a5a2767d..983c8e79 100644 --- a/will/utils.py +++ b/will/utils.py @@ -19,6 +19,8 @@ "parse_channel_data", "server", "send_message", + "ts", + "_updatedAt", ] From 0092b42638fdc85c67ceabeff754be8be02336ef Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 25 Oct 2017 22:06:21 +1300 Subject: [PATCH 060/200] Pep8 and Birthday :) --- docs/improve.md | 2 ++ will/plugins/friendly/hello.py | 4 ++++ will/settings.py | 1 - 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/improve.md b/docs/improve.md index d07eae92..9a3e91c1 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -170,7 +170,9 @@ Here's what's new: - Pluggable pubsub backends. - Built-in encryption for storage and pub/sub (with pluggable backends as well.) - Lots more intelligence around required settings and verification, to make first starting and debugging Will easier. +- New `@will gif me` command. Because it can't all be serious. :) +Read all about it here: [What's new in Will 2](https://heywill.io/will2) This release also changes a few bits of behavior, to be consistent: - `self.reply()` *finally* no longer requires you to tediously pass the `message` back to it. It's also smart, and backwards compatable with existing plugins. diff --git a/will/plugins/friendly/hello.py b/will/plugins/friendly/hello.py index d35033e4..c59b6b13 100644 --- a/will/plugins/friendly/hello.py +++ b/will/plugins/friendly/hello.py @@ -12,3 +12,7 @@ def hi(self, message): @respond_to("^hello$") def hello(self, message): self.reply("hi!") + + @periodic(hour='10', minute='05', date=4, month=12) + def birthday(self, message): + self.reply("Hey, so I didn't want to make a big deal of it, but today's my birthday!") diff --git a/will/settings.py b/will/settings.py index be9971c0..df02b5d2 100644 --- a/will/settings.py +++ b/will/settings.py @@ -164,7 +164,6 @@ def import_settings(quiet=True): } else: settings["ALLOW_INSECURE_HIPCHAT_SERVER"] = False - if "HIPCHAT_ROOMS" not in settings: if not quiet: From cc656a5a3e9e0500c73be7cab63a36a810f562d9 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 25 Oct 2017 22:27:31 +1300 Subject: [PATCH 061/200] Moves reqs to a folder, moves profile to an arg. --- MANIFEST.in | 1 + docs/backends/analysis.md | 1 + docs/backends/encryption.md | 1 + docs/backends/execution.md | 1 + docs/backends/generation.md | 1 + docs/backends/io.md | 1 + docs/backends/pubsub.md | 1 + docs/backends/storage.md | 1 + requirements.txt | 8 ++--- requirements.zeromq.txt | 2 -- .../base.txt | 0 .../couchbase.txt | 2 +- requirements.dev.txt => requirements/dev.txt | 2 +- .../hipchat.txt | 0 .../rocketchat.txt | 0 .../slack.txt | 2 +- requirements/zeromq.txt | 2 ++ setup.py | 13 ++++---- start_dev_will.py | 31 ++++++++++++++++++- start_profiled_will.py | 19 ------------ will/plugins/friendly/hello.py | 2 +- 21 files changed, 54 insertions(+), 37 deletions(-) create mode 100644 docs/backends/analysis.md create mode 100644 docs/backends/encryption.md create mode 100644 docs/backends/execution.md create mode 100644 docs/backends/generation.md create mode 100644 docs/backends/io.md create mode 100644 docs/backends/pubsub.md create mode 100644 docs/backends/storage.md delete mode 100644 requirements.zeromq.txt rename requirements.base.txt => requirements/base.txt (100%) rename requirements.couchbase.txt => requirements/couchbase.txt (77%) rename requirements.dev.txt => requirements/dev.txt (79%) rename requirements.hipchat.txt => requirements/hipchat.txt (100%) rename requirements.rocketchat.txt => requirements/rocketchat.txt (100%) rename requirements.slack.txt => requirements/slack.txt (66%) create mode 100644 requirements/zeromq.txt delete mode 100755 start_profiled_will.py diff --git a/MANIFEST.in b/MANIFEST.in index ef82d828..4f95f098 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,3 +3,4 @@ include *.txt include *.md include *.py recursive-include will/templates * +recursive-include requirements/* diff --git a/docs/backends/analysis.md b/docs/backends/analysis.md new file mode 100644 index 00000000..8aae73e8 --- /dev/null +++ b/docs/backends/analysis.md @@ -0,0 +1 @@ +# Context is king \ No newline at end of file diff --git a/docs/backends/encryption.md b/docs/backends/encryption.md new file mode 100644 index 00000000..6db49bc5 --- /dev/null +++ b/docs/backends/encryption.md @@ -0,0 +1 @@ +# Encrypt all the things \ No newline at end of file diff --git a/docs/backends/execution.md b/docs/backends/execution.md new file mode 100644 index 00000000..be0d3aa0 --- /dev/null +++ b/docs/backends/execution.md @@ -0,0 +1 @@ +# Just do it \ No newline at end of file diff --git a/docs/backends/generation.md b/docs/backends/generation.md new file mode 100644 index 00000000..615fe451 --- /dev/null +++ b/docs/backends/generation.md @@ -0,0 +1 @@ +# It's good to have options \ No newline at end of file diff --git a/docs/backends/io.md b/docs/backends/io.md new file mode 100644 index 00000000..722ab9a5 --- /dev/null +++ b/docs/backends/io.md @@ -0,0 +1 @@ +# Gotta talk, Gotta hear. \ No newline at end of file diff --git a/docs/backends/pubsub.md b/docs/backends/pubsub.md new file mode 100644 index 00000000..6ccafb29 --- /dev/null +++ b/docs/backends/pubsub.md @@ -0,0 +1 @@ +# Go with the flow \ No newline at end of file diff --git a/docs/backends/storage.md b/docs/backends/storage.md new file mode 100644 index 00000000..5463cde1 --- /dev/null +++ b/docs/backends/storage.md @@ -0,0 +1 @@ +# Know what you know \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 2af97c1b..313d27e7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ hiredis==0.2.0 redis==2.10.6 --r requirements.base.txt --r requirements.slack.txt --r requirements.hipchat.txt --r requirements.rocketchat.txt +-r requirements/base.txt +-r requirements/slack.txt +-r requirements/hipchat.txt +-r requirements/rocketchat.txt diff --git a/requirements.zeromq.txt b/requirements.zeromq.txt deleted file mode 100644 index a2048774..00000000 --- a/requirements.zeromq.txt +++ /dev/null @@ -1,2 +0,0 @@ -pyzmq==16.0.2 --r requirements.base.txt diff --git a/requirements.base.txt b/requirements/base.txt similarity index 100% rename from requirements.base.txt rename to requirements/base.txt diff --git a/requirements.couchbase.txt b/requirements/couchbase.txt similarity index 77% rename from requirements.couchbase.txt rename to requirements/couchbase.txt index dfb385d9..1e25518a 100644 --- a/requirements.couchbase.txt +++ b/requirements/couchbase.txt @@ -1,2 +1,2 @@ -e git+git://github.com/couchbase/couchbase-python-client#egg=couchbase-python-client --r requirements.base.txt +-r base.txt diff --git a/requirements.dev.txt b/requirements/dev.txt similarity index 79% rename from requirements.dev.txt rename to requirements/dev.txt index 1c34fec6..ab355d4b 100644 --- a/requirements.dev.txt +++ b/requirements/dev.txt @@ -1,4 +1,4 @@ --r requirements.txt +-r base.txt # Dev only pyandoc diff --git a/requirements.hipchat.txt b/requirements/hipchat.txt similarity index 100% rename from requirements.hipchat.txt rename to requirements/hipchat.txt diff --git a/requirements.rocketchat.txt b/requirements/rocketchat.txt similarity index 100% rename from requirements.rocketchat.txt rename to requirements/rocketchat.txt diff --git a/requirements.slack.txt b/requirements/slack.txt similarity index 66% rename from requirements.slack.txt rename to requirements/slack.txt index 032056f2..f82cf6cd 100644 --- a/requirements.slack.txt +++ b/requirements/slack.txt @@ -1,3 +1,3 @@ --r requirements.base.txt +-r base.txt slackclient>=1.0.5<1.1.0 markdownify>=0.4.0<0.5.0 diff --git a/requirements/zeromq.txt b/requirements/zeromq.txt new file mode 100644 index 00000000..d42862d3 --- /dev/null +++ b/requirements/zeromq.txt @@ -0,0 +1,2 @@ +pyzmq==16.0.2 +-r base.txt diff --git a/setup.py b/setup.py index ac30334c..7cbce261 100755 --- a/setup.py +++ b/setup.py @@ -10,12 +10,11 @@ SOURCE_DIR = os.path.join(ROOT_DIR) install_requires = [] -for req_file in ("requirements.base.txt", "requirements.txt"): - with open(req_file, "r+") as f: - for line in f.readlines(): - if line[0] == "-": - continue - install_requires.append(line.strip()) +with open("requirements.txt", "r+") as f: + for line in f.readlines(): + if line[0] == "-": + continue + install_requires.append(line.strip()) tests_require = [ 'pytest==2.8.3', @@ -55,7 +54,7 @@ tests_require=tests_require, packages=find_packages(), include_package_data=True, - keywords=["hipchat", "bot", "ai"], + keywords=["chatbot", "bot", "ai", "slack", "hipchat", "rocketchat", "stride"], classifiers=[ "Programming Language :: Python", "License :: OSI Approved :: BSD License", diff --git a/start_dev_will.py b/start_dev_will.py index fe1982d0..9d306752 100755 --- a/start_dev_will.py +++ b/start_dev_will.py @@ -1,6 +1,35 @@ #!/usr/bin/env python +import argparse +import os +import shutil +import sys from will.main import WillBot -if __name__ == '__main__': +parser = argparse.ArgumentParser() +parser.add_argument( + '--profile', + action='store_true', + help='Run with yappi profiling.' +) +args = parser.parse_args() + + +def start_will(): + if args.profile: + try: + import yappi + except: + print "Unable to run Will in profiling mode without yappi. Please `pip install yappi`." + sys.exit(1) + try: + shutil.rmtree('will_profiles') + except OSError: + pass + os.makedirs("will_profiles") + bot = WillBot() bot.bootstrap() + + +if __name__ == '__main__': + start_will() diff --git a/start_profiled_will.py b/start_profiled_will.py deleted file mode 100755 index d21e2df9..00000000 --- a/start_profiled_will.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -from will.main import WillBot -import os -import shutil - - -def start_will(): - try: - shutil.rmtree('will_profiles') - except OSError: - pass - os.makedirs("will_profiles") - - bot = WillBot() - bot.bootstrap() - - -if __name__ == '__main__': - start_will() diff --git a/will/plugins/friendly/hello.py b/will/plugins/friendly/hello.py index c59b6b13..1eb48b7b 100644 --- a/will/plugins/friendly/hello.py +++ b/will/plugins/friendly/hello.py @@ -13,6 +13,6 @@ def hi(self, message): def hello(self, message): self.reply("hi!") - @periodic(hour='10', minute='05', date=4, month=12) + @periodic(hour='10', minute='05', day=4, month=12) def birthday(self, message): self.reply("Hey, so I didn't want to make a big deal of it, but today's my birthday!") From 21e0b6c40ae750cf6d1310a25bc020dab43097ba Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 25 Oct 2017 22:33:04 +1300 Subject: [PATCH 062/200] Updates circle with reqs folder --- circle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index 421f3841..f648e9ce 100644 --- a/circle.yml +++ b/circle.yml @@ -1,6 +1,6 @@ dependencies: pre: - - pip install -r requirements.dev.txt + - pip install -r requirements.txt; pip install -r requirements/dev.txt test: override: - /home/ubuntu/will/will/scripts/test_run.sh From 357fea5eea9cc9160ae35c448463efaae4626978 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 25 Oct 2017 22:50:00 +1300 Subject: [PATCH 063/200] Adds `service=` argument to .say() and similar, adds warnings if .reply() is used incorrectly. Note that the decision is to warn when people are using .reply() and should be using .say() to keep things clean for future differentiation, instead of having them become one nebulous, way-too-clever method. --- docs/plugins/reply.md | 3 +++ will/plugin.py | 42 +++++++++++++++++++++++++++++++++++------- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/docs/plugins/reply.md b/docs/plugins/reply.md index b2c995a2..df4d60a2 100644 --- a/docs/plugins/reply.md +++ b/docs/plugins/reply.md @@ -24,6 +24,7 @@ self.say(content, channel=None, html=False, color="green", notify=False) - **`content`**: the content you want to send to the room. Any string will do, HTML or plain text. - **`channel`**: (optional) The name of the channel or room to send the message to. If not specified, Will is smart, and will just reply in the same channel/room/thread. +- **`service`**: (optional, rare) The name of the service you want to send the message on. By default Will replies on the same service you contacted him on. - **`html`**: if the message is HTML. `True` or `False`. - **`color`**: (chat room only) the hipchat color to send. "yellow", "red", "green", "purple", "gray", or "random". Default is "green". - **`notify`**: whether the message should trigger a 'ping' notification. `True` or `False`. @@ -112,6 +113,7 @@ self.schedule_say(content, when, message=None, channel=None, html=False, color=" - **`when`**: when you want the message to be said. Python `datetime` object. - **`message`**: (optional) The incoming message object - **`channel`**: (optional) The name of the channel or room to send the message to. If not specified, Will is smart, and will just reply in the same channel/room/thread. You can also pass "ALL_ROOMS" to send the message everywhere, if that's really your thing. +- **`service`**: (optional, rare) The name of the service you want to send the message on. By default Will replies on the same service you contacted him on. - **`html`**: if the message is HTML. `True` or `False`. - **`color`**: (chat room only) the hipchat color to send. "yellow", "red", "green", "purple", "gray", or "random". Default is "green". - **`notify`**: whether the message should trigger a 'ping' notification. `True` or `False`. @@ -140,6 +142,7 @@ self.set_topic(topic, message=None, channel=None) - `topic`: The string you want to set the topic to - `message`: (optional) The incoming message object - `channel`: (optional) The name of the channel or room to send the message to. If not specified, Will is smart, and will just set the topic for the same channel/room/thread. You can also pass "ALL_ROOMS" to send the message everywhere, if that's really your thing. +- `service`: (optional, rare) The name of the service you want to send the message on. By default Will replies on the same service you contacted him on. diff --git a/will/plugin.py b/will/plugin.py index ecb13159..23935cb8 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -39,8 +39,13 @@ def _trim_for_execution(self, message): message.source_message.analysis = None return message - def get_backend(self, message): + def get_backend(self, message, service=None): backend = False + if service: + for b in settings.IO_BACKENDS: + if service in b: + return b + if hasattr(message, "backend"): backend = message.backend elif message and hasattr(message, "data") and hasattr(message.data, "backend"): @@ -54,7 +59,7 @@ def get_message(self, message_passed): return self.message return message_passed - def say(self, content, message=None, room=None, channel=None, package_for_scheduling=False, **kwargs): + def say(self, content, message=None, room=None, channel=None, service=None, package_for_scheduling=False, **kwargs): logging.info("self.say") logging.info(content) if channel: @@ -67,7 +72,8 @@ def say(self, content, message=None, room=None, channel=None, package_for_schedu message = self.get_message(message) message = self._trim_for_execution(message) - backend = self.get_backend(message) + backend = self.get_backend(message, service=service) + if backend: e = Event( type="say", @@ -84,6 +90,25 @@ def say(self, content, message=None, room=None, channel=None, package_for_schedu def reply(self, event, content=None, message=None, package_for_scheduling=False, **kwargs): message = self.get_message(message) + if "channel" in kwargs: + logging.error( + "I was just asked to talk to %(channel)s, but I can't use channel using .reply() - " + "it's just for replying to the person who talked to me. Please use .say() instead." % kwargs + ) + return + if "service" in kwargs: + logging.error( + "I was just asked to talk to %(service)s, but I can't use a service using .reply() - " + "it's just for replying to the person who talked to me. Please use .say() instead." % kwargs + ) + return + if "room" in kwargs: + logging.error( + "I was just asked to talk to %(room)s, but I can't use room using .reply() - " + "it's just for replying to the person who talked to me. Please use .say() instead." % kwargs + ) + return + # Be really smart about what we're getting back. if ( ( @@ -136,7 +161,7 @@ def reply(self, event, content=None, message=None, package_for_scheduling=False, else: self.publish("message.outgoing.%s" % backend, e) - def set_topic(self, topic, message=None, room=None, channel=None, **kwargs): + def set_topic(self, topic, message=None, room=None, channel=None, service=None, **kwargs): if channel: room = channel elif room: @@ -144,7 +169,7 @@ def set_topic(self, topic, message=None, room=None, channel=None, **kwargs): message = self.get_message(message) message = self._trim_for_execution(message) - backend = self.get_backend(message) + backend = self.get_backend(message, service=service) e = Event( type="topic_change", content=topic, @@ -154,12 +179,15 @@ def set_topic(self, topic, message=None, room=None, channel=None, **kwargs): ) self.publish("message.outgoing.%s" % backend, e) - def schedule_say(self, content, when, message=None, room=None, channel=None, *args, **kwargs): + def schedule_say(self, content, when, message=None, room=None, channel=None, service=None, *args, **kwargs): if channel: room = channel elif room: channel = room - packaged_event = self.reply(None, content=content, message=message, package_for_scheduling=True) + packaged_event = self.reply( + None, content=content, message=message, channel=channel, + service=service, package_for_scheduling=True, *args, **kwargs + ) self.add_outgoing_event_to_schedule(when, { "type": "message", "topic": packaged_event.topic, From 425ec4d5d72f731b0fcc0a4923d2aef3efc4d001 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 26 Oct 2017 10:05:31 +1300 Subject: [PATCH 064/200] Defaults to all reqs, updates config.py.dist, provides fallbacks for 1.x config. --- config.py.dist | 114 +++++++++++++++++++++++++---------------------- setup.py | 9 ++++ will/settings.py | 35 +++++++++++++++ 3 files changed, 104 insertions(+), 54 deletions(-) diff --git a/config.py.dist b/config.py.dist index bc18fbee..0a633bc4 100644 --- a/config.py.dist +++ b/config.py.dist @@ -73,10 +73,10 @@ PLUGIN_BLACKLIST = [ # Platforms and mediums messages can come in and go out on. IO_BACKENDS = [ - # "will.backends.io_adapters.hipchat", - # "will.backends.io_adapters.rocketchat", - "will.backends.io_adapters.shell", "will.backends.io_adapters.slack", + "will.backends.io_adapters.hipchat", + "will.backends.io_adapters.rocketchat", + "will.backends.io_adapters.shell", ] # Backends to analyze messages and generate useful metadata @@ -87,9 +87,9 @@ ANALYZE_BACKENDS = [ # Backends to generate possible actions, and metadata about them. GENERATION_BACKENDS = [ - # "will.backends.generation.fuzzy_best_match", "will.backends.generation.fuzzy_all_matches", "will.backends.generation.strict_regex", + # "will.backends.generation.fuzzy_best_match", ] # The "decision making" backends that look among the generated choices, @@ -111,19 +111,29 @@ FUZZY_REGEX_ALLOWABLE_ERRORS = 3 # ------------------------------------------------------------------------------------ -# Hipchat settings +# Slack settings # ------------------------------------------------------------------------------------ - +# SLACK_DEFAULT_CHANNEL = "alpha" # ------------------------------------------------------------------------------------ -# Slack settings +# Rocket.chat settings # ------------------------------------------------------------------------------------ +# Rocket.Chat server URL and port as necessary +# ROCKETCHAT_URL = "http://localhost:3000" + # ------------------------------------------------------------------------------------ -# Rocket.chat settings +# HipChat settings # ------------------------------------------------------------------------------------ +# The list of rooms will should join. Default is all rooms. +# HIPCHAT_ROOMS = ['Will Testing', 'Will and I'] + +# Disable HipChat SSL checks. Strongly reccomended this is not set to True. +# ALLOW_INSECURE_HIPCHAT_SERVER = False + + # ------------------------------------------------------------------------------------ # Potentially required settings # ------------------------------------------------------------------------------------ @@ -132,50 +142,15 @@ FUZZY_REGEX_ALLOWABLE_ERRORS = 3 # Note no trailing slash. # PUBLIC_URL = "http://my-will.herokuapp.com" +# The backend and room Will should talk to if the trigger is a webhook and he isn't told +# a specific room. Default is the first of IO_BACKENDS and ROOMS. +# DEFAULT_BACKEND = "will.backends.io_adapters.slack" +# DEFAULT_ROOM = 'Notifications' + # Port to bind the web server to (defaults to $PORT, then 80.) # Set > 1024 to run without elevated permission. # HTTPSERVER_PORT = "9000" -# ------------------------------------------------------------------------------------ -# Optional settings -# ------------------------------------------------------------------------------------ - -# The list of rooms will should join. Default is all rooms. -# TODO: Appears to be Hipchat-specific, should be renamed or -# deprecated. -# ROOMS = ['Will Testing', ] - -# The maximum number of milliseconds to wait for an analysis backend to finish -# ANALYSIS_TIMEOUT_MS = 2000 - -# The maximum number of milliseconds to wait for a generation backend to finish -# GENERATION_TIMEOUT_MS = 2000 - -# The interval will checks his internal cross-thread messaging queues, in seconds. -# Increasing the value will make will slower, but consume fewer resources. -# EVENT_LOOP_INTERVAL = 0.025 - -# The backend and room will will talk to if the trigger is a webhook and he isn't told -# a specific one. Default is the first of IO_BACKENDS and ROOMS. -# DEFAULT_BACKEND = "will.backends.io_adapters.hipchat" -# DEFAULT_ROOM = 'Testing, Will Kahuna' - - -# A secret key, used to namespace this instance of will and secure pubsub contents. -# Do *NOT* keep it in config.py. *DO* set it in the environment, in a secured session. -# If a SECRET_KEY is not set, one will be auto-generated, but will limit Will to reading -# data from this excecution only. -# SECRET_KEY = "DXQnJ2eHD6k2w3DvBTstN6kw9d9N4CeCLbjoK" - - -# Turn up or down Will's logging level -# LOGLEVEL = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL -LOGLEVEL = "WARNING" -# LOGLEVEL = "INFO" - -# Turn on or off Will's profiling -# PROFILING_ENABLED = False - # Fully-qualified folders to look for templates in, beyond the two that # are always included: core will's templates folder, your project's templates folder, and # all templates folders in included plugins, if they exist. @@ -203,20 +178,48 @@ LOGLEVEL = "WARNING" # Sets a different storage backend. If unset, defaults to redis. # If you use a different backend, make sure to add their required settings. -# PUBSUB_BACKEND = "zeromq" # "redis", or "zeromq" (beta). +# PUBSUB_BACKEND = "redis" # "redis", or "zeromq" (beta). # ZEROMQ_URL = "tcp://127.0.0.1:15555" -# Rocket.Chat server URL and port as necessary -# ROCKETCHAT_URL = "http://localhost:3000" +# Your will's mention handle. (aka @will) Note that this is not backend-specific, +# and is only used for the generation of help text. +# WILL_HANDLE = "will" -# Disable Hipchat SSL checks. Strongly reccomended this is not set to True. -# ALLOW_INSECURE_HIPCHAT_SERVER = False +# ------------------------------------------------------------------------------------ +# Optional settings +# ------------------------------------------------------------------------------------ + +# The maximum number of milliseconds to wait for an analysis backend to finish +# ANALYSIS_TIMEOUT_MS = 2000 -# Turn on/off encryption in the pub/sub layer (default is on). +# The maximum number of milliseconds to wait for a generation backend to finish +# GENERATION_TIMEOUT_MS = 2000 + +# The interval will checks his internal cross-thread messaging queues, in seconds. +# Increasing the value will make will slower, but consume fewer resources. +# EVENT_LOOP_INTERVAL = 0.025 + +# A secret key, used to namespace this instance of will and secure pubsub contents. +# Do *NOT* keep it in config.py. *DO* set it in the environment as WILL_SECRET_KEY, +# in a secured session. If a SECRET_KEY is not set, one will be auto-generated, +# but it may limit Will to reading data from this excecution only, and may not work +# on virtualized machines, or machines with many or changing MAC addresses +# SECRET_KEY = "DXQnJ2eHD6k2w3DvBTstN6kw9d9N4CeCLbjoK" + + +# Turn up or down Will's logging level +# LOGLEVEL = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL +# LOGLEVEL = "DEBUG" + +# Turn on or off Will's profiling +# PROFILING_ENABLED = False + +# Turn on/off encryption in pub/sub and storage (default is on). # Causes a small speed bump, but secures messages in an untrusted environment. # ENABLE_INTERNAL_ENCRYPTION = False +# ENCRYPTION_BACKEND = "aes" # Mailgun config, if you'd like will to send emails. # DEFAULT_FROM_EMAIL="will@example.com" @@ -235,3 +238,6 @@ LOGLEVEL = "WARNING" # Google Application key for "image me" command # GOOGLE_API_KEY = "FILL THIS IN" # GOOGLE_CUSTOM_SEARCH_ENGINE_ID = "FILL THIS IN" + +# Internal, used for helpful output when upgrades are installed +WILL_RELEASE_VERSION = 2.0 diff --git a/setup.py b/setup.py index 7cbce261..6e5c735b 100755 --- a/setup.py +++ b/setup.py @@ -8,6 +8,7 @@ DESCRIPTION = "A friendly python hipchat bot" ROOT_DIR = os.path.dirname(__file__) SOURCE_DIR = os.path.join(ROOT_DIR) +REQS_DIR = os.path.join(ROOT_DIR, "requirements") install_requires = [] with open("requirements.txt", "r+") as f: @@ -16,6 +17,14 @@ continue install_requires.append(line.strip()) +for req_file in ["base.txt", "slack.txt", "hipchat.txt", "rocketchat.txt"]: + with open(os.path.join("requirements", req_file), "r+") as f: + for line in f.readlines(): + if line[0] == "-": + continue + install_requires.append(line.strip()) + + tests_require = [ 'pytest==2.8.3', 'pytest-cov', diff --git a/will/settings.py b/will/settings.py index df02b5d2..16a5a354 100644 --- a/will/settings.py +++ b/will/settings.py @@ -150,6 +150,41 @@ def import_settings(quiet=True): settings[v] = settings[k] del settings[k] + # Migrate from 1.x + if "CHAT_BACKENDS" in settings and "IO_BACKENDS" not in settings: + IO_BACKENDS = [] + for c in settings["CHAT_BACKENDS"]: + IO_BACKENDS.append("will.backends.io_adapters.%s" % c) + settings["IO_BACKENDS"] = IO_BACKENDS + if not quiet: + warn( + "Deprecated settings. Please update your config.py from:" + "\n CHAT_BACKENDS = %s\n to\n IO_BACKENDS = %s" % + (settings["CHAT_BACKENDS"], IO_BACKENDS) + ) + if "ANALYZE_BACKENDS" not in settings: + if not quiet: + note("No ANALYZE_BACKENDS specified. Defaulting to history only.") + settings["ANALYZE_BACKENDS"] = [ + "will.backends.analysis.nothing", + "will.backends.analysis.history", + ] + + if "GENERATION_BACKENDS" not in settings: + if not quiet: + note("No GENERATION_BACKENDS specified. Defaulting to fuzzy_all_matches and strict_regex.") + settings["GENERATION_BACKENDS"] = [ + "will.backends.generation.fuzzy_all_matches", + "will.backends.generation.strict_regex", + ] + + if "EXECUTION_BACKENDS" not in settings: + if not quiet: + note("No EXECUTION_BACKENDS specified. Defaulting to best_score.") + settings["EXECUTION_BACKENDS"] = [ + "will.backends.execution.best_score", + ] + # Set for hipchat for b in settings["IO_BACKENDS"]: if "hipchat" in b: From 793a4aff3f820dceffc88af48d4d92fb252726aa Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 26 Oct 2017 11:53:26 +1300 Subject: [PATCH 065/200] Swaps to REQS_DIR --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 6e5c735b..cf54b750 100755 --- a/setup.py +++ b/setup.py @@ -18,7 +18,7 @@ install_requires.append(line.strip()) for req_file in ["base.txt", "slack.txt", "hipchat.txt", "rocketchat.txt"]: - with open(os.path.join("requirements", req_file), "r+") as f: + with open(os.path.join(REQS_DIR, req_file), "r+") as f: for line in f.readlines(): if line[0] == "-": continue From 62fc8fc78db3c6bb137405333beadd078cce0b65 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 26 Oct 2017 12:00:49 +1300 Subject: [PATCH 066/200] Updates MANIFEST.in with new reqs structure, requests version. --- MANIFEST.in | 3 ++- requirements/base.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 4f95f098..edba8bd0 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,5 +2,6 @@ include README.md AUTHORS LICENSE include *.txt include *.md include *.py +include requirements/*.txt recursive-include will/templates * -recursive-include requirements/* +recursive-include requirements * diff --git a/requirements/base.txt b/requirements/base.txt index 9ddc2315..23831bcb 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -20,5 +20,5 @@ pytz==2017.2 PyYAML==3.10 regex==2017.9.23 redis==2.10.6 -requests==2.4.1 +requests==2.18.4 six==1.10.0 From b2e94a24987c2486b00169e00479654223a8e5e6 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 26 Oct 2017 14:42:55 +1300 Subject: [PATCH 067/200] pulls eggs for testing --- circle.yml | 1 + source/will2.fla | Bin 0 -> 5551 bytes will/mixins/schedule.py | 2 ++ will/plugins/friendly/hello.py | 16 ++++++++++++++++ 4 files changed, 19 insertions(+) create mode 100644 source/will2.fla diff --git a/circle.yml b/circle.yml index f648e9ce..3d109cd3 100644 --- a/circle.yml +++ b/circle.yml @@ -4,6 +4,7 @@ dependencies: test: override: - /home/ubuntu/will/will/scripts/test_run.sh + - rm -rf .eggs - coverage run -m nose - tox - flake8 \ No newline at end of file diff --git a/source/will2.fla b/source/will2.fla new file mode 100644 index 0000000000000000000000000000000000000000..9506fd3006fd9f970d6b67a2d0b8f993dbfdaddd GIT binary patch literal 5551 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 literal 0 HcmV?d00001 diff --git a/will/mixins/schedule.py b/will/mixins/schedule.py index 1901e282..8ac2b48d 100644 --- a/will/mixins/schedule.py +++ b/will/mixins/schedule.py @@ -97,6 +97,8 @@ def add_periodic_task(self, module_name, cls_name, function_name, sched_args, now = datetime.datetime.now() ct = CronTrigger(*sched_args, **sched_kwargs) when = ct.get_next_fire_time(now) + print "ct.get_next_fire_time(now)" + print when item = { "type": "periodic_task", "module_name": module_name, diff --git a/will/plugins/friendly/hello.py b/will/plugins/friendly/hello.py index 1eb48b7b..3817794f 100644 --- a/will/plugins/friendly/hello.py +++ b/will/plugins/friendly/hello.py @@ -16,3 +16,19 @@ def hello(self, message): @periodic(hour='10', minute='05', day=4, month=12) def birthday(self, message): self.reply("Hey, so I didn't want to make a big deal of it, but today's my birthday!") + + @periodic(hour='12', minute='30', day_of_week='mon,tue,wed,thu,fri') + def standup(self): + self.say("Daily test of bug #295", room='alpha', notify=True) + + @periodic(minute='30', day_of_week='mon,tue,wed,thu,fri') + def standup_hourly_test(self): + self.say("Daily test of bug #295", room='alpha') + + @periodic(hour='12', minute='30', day_of_week='mon,tue,wed,thu,fri') + def standup_hipchat(self): + self.say("Test of bug #295", room='will and i', notify=True, service="hipchat") + + @periodic(minute='30', day_of_week='mon,tue,wed,thu,fri') + def standup_hourly_test_hipchat(self): + self.say("Hourly test of bug #295", room='will and i', service="hipchat") From d26792f5418d087e89674957b2a3dcd396787141 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 26 Oct 2017 11:18:06 -0400 Subject: [PATCH 068/200] pull from docker base; allow branch as arg --- docker/will-base/Dockerfile | 13 +++++++++++++ docker/will/Dockerfile | 14 +++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 docker/will-base/Dockerfile diff --git a/docker/will-base/Dockerfile b/docker/will-base/Dockerfile new file mode 100644 index 00000000..903c4c94 --- /dev/null +++ b/docker/will-base/Dockerfile @@ -0,0 +1,13 @@ +# PULL python +FROM python:rc-aplpine + + +# Maintainer +LABEL maintainer="mlove@columnit.com" + +ENV _WILL_HOME=/opt/will + +RUN mkdir -p $_WILL_HOME + +RUN apk add --no-cache git build-base + diff --git a/docker/will/Dockerfile b/docker/will/Dockerfile index 166421db..d1b8bb84 100755 --- a/docker/will/Dockerfile +++ b/docker/will/Dockerfile @@ -1,15 +1,11 @@ -#Pull CENTOS -FROM python:2.7-stretch - +#Pull from will-base +FROM heywill/will-base:latest +ARG branch=master # Maintainer # ---------- -MAINTAINER mlove@columnit.com - -ENV _WILL_HOME=/opt/will - -RUN mkdir -p $_WILL_HOME +LABEL maintainer=mlove@columnit.com -RUN pip install will +RUN pip install git+https://github.com/skoczen/will.git@$branch WORKDIR $_WILL_HOME RUN generate_will_project From bbb2d0a1a7f6db3138a1fe739f45e99e804dc12b Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 26 Oct 2017 11:24:24 -0400 Subject: [PATCH 069/200] fixed alpine typo --- docker/will-base/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/will-base/Dockerfile b/docker/will-base/Dockerfile index 903c4c94..6da5bd29 100644 --- a/docker/will-base/Dockerfile +++ b/docker/will-base/Dockerfile @@ -1,5 +1,5 @@ # PULL python -FROM python:rc-aplpine +FROM python:rc-alpine # Maintainer From 7c0e6d241971c652b9fb49f6683c38fa4a05a23e Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 26 Oct 2017 12:21:08 -0400 Subject: [PATCH 070/200] moved to python2.7 to enable beta2.0 version' --- docker/will-base/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/will-base/Dockerfile b/docker/will-base/Dockerfile index 6da5bd29..4427d41e 100644 --- a/docker/will-base/Dockerfile +++ b/docker/will-base/Dockerfile @@ -1,5 +1,5 @@ # PULL python -FROM python:rc-alpine +FROM python:2.7-alpine # Maintainer From c83250bbedc376edfaab9b0ee9741201f95b6fca Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 26 Oct 2017 12:22:55 -0400 Subject: [PATCH 071/200] move to base-2.7 to break out versions of python --- docker/will-base/{ => base-2.7}/Dockerfile | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docker/will-base/{ => base-2.7}/Dockerfile (100%) diff --git a/docker/will-base/Dockerfile b/docker/will-base/base-2.7/Dockerfile similarity index 100% rename from docker/will-base/Dockerfile rename to docker/will-base/base-2.7/Dockerfile From d1bf6db2341773091c9f93e6797ea4261bf3edaa Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 27 Oct 2017 10:17:39 +1300 Subject: [PATCH 072/200] Moves to forked markdownify for 3.x support until PR is merged --- requirements/slack.txt | 4 +++- will/plugins/friendly/hello.py | 16 ---------------- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/requirements/slack.txt b/requirements/slack.txt index f82cf6cd..22b6e121 100644 --- a/requirements/slack.txt +++ b/requirements/slack.txt @@ -1,3 +1,5 @@ -r base.txt slackclient>=1.0.5<1.1.0 -markdownify>=0.4.0<0.5.0 +# Until https://github.com/matthewwithanm/python-markdownify/pull/1 is merged: +# markdownify>=0.4.0<0.5.0 +-e git+https://github.com/heywill/python-markdownify@develop#egg=markdownify diff --git a/will/plugins/friendly/hello.py b/will/plugins/friendly/hello.py index 3817794f..1eb48b7b 100644 --- a/will/plugins/friendly/hello.py +++ b/will/plugins/friendly/hello.py @@ -16,19 +16,3 @@ def hello(self, message): @periodic(hour='10', minute='05', day=4, month=12) def birthday(self, message): self.reply("Hey, so I didn't want to make a big deal of it, but today's my birthday!") - - @periodic(hour='12', minute='30', day_of_week='mon,tue,wed,thu,fri') - def standup(self): - self.say("Daily test of bug #295", room='alpha', notify=True) - - @periodic(minute='30', day_of_week='mon,tue,wed,thu,fri') - def standup_hourly_test(self): - self.say("Daily test of bug #295", room='alpha') - - @periodic(hour='12', minute='30', day_of_week='mon,tue,wed,thu,fri') - def standup_hipchat(self): - self.say("Test of bug #295", room='will and i', notify=True, service="hipchat") - - @periodic(minute='30', day_of_week='mon,tue,wed,thu,fri') - def standup_hourly_test_hipchat(self): - self.say("Hourly test of bug #295", room='will and i', service="hipchat") From 3d474efdf03db4d7eadd8fbf02722534a39d19d1 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 27 Oct 2017 10:51:47 +1300 Subject: [PATCH 073/200] Code cleanup --- docs/improve.md | 10 ++-------- will/backends/analysis/history.py | 2 -- will/backends/execution/all.py | 1 - will/backends/execution/base.py | 3 --- will/backends/io_adapters/__init__.py | 3 --- will/backends/io_adapters/base.py | 4 ---- will/backends/io_adapters/hipchat.py | 5 ----- will/backends/io_adapters/rocketchat.py | 2 +- will/backends/pubsub/redis_pubsub.py | 5 +++-- 9 files changed, 6 insertions(+), 29 deletions(-) diff --git a/docs/improve.md b/docs/improve.md index 9a3e91c1..c2add94a 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -152,12 +152,11 @@ If you're looking for plugin inspiration, here are some wills that are open-sour #### 2.0.1beta - ??? -TODO: Finish these This is a huge rwerite of will, adding pluggable backends for chat systems as well as Will's internal brains. **TL;DR: Slack, Rocket.chat, and stdio support, and you can write full chatterbots with Will now.** -A huge number of really smart people gave their thoughts and suggestions throughout the process, not least @hobson, @woohgit, @netjunki, @sivy, @antgel, @shadow7412, @brandonsturgeon, @pepedocs, @tophsic +A huge number of really smart people gave their thoughts and suggestions throughout the process, not least @hobson, @woohgit, @netjunki, @sivy, @antgel, @shadow7412, @brandonsturgeon, @pepedocs, @tophsic, and @mike-love. Here's what's new: @@ -178,18 +177,13 @@ This release also changes a few bits of behavior, to be consistent: - `self.reply()` *finally* no longer requires you to tediously pass the `message` back to it. It's also smart, and backwards compatable with existing plugins. - `admin_only` is explicitly flagged for deprecation and removal, to be replaced by the ACL system introduced in 2015 (largely, this is because having two different access control systems is crazy and painful.) Switching is as easy as adding `ACL = {'admins': ['steven', 'will']}` to your config.py and find/replacing `admin_only=True` with `acl=['admins',] in your codebase. For now, Will handles backwards compatibility by mapping the old settings into the new places, but he won't forever. Thanks for updating, and making ongoing maintenence simpler! - If no ACLs are specified and users try to perform restricted commands, they'll be allowed as before, but Will will complain to the console. A new `DISABLE_ACL` setting has been added to turn off the complaining. +- You can pass in `channel=` or `room=` when specifying a custom reply location. If both are passed in, Will uses `channel`. There are a couple *internal* backwards-incompatible changes: - `RosterMixin` has been renamed `HipChatRosterMixin` and moved to `will.backends.io_adapters.hipchat`. This change should not affect you unless you were specifically importing RosterMixin in your own plugins - everything in `WillPlugin` has been automatically routed to the right place, in a backwards-compatible way. - `Room` and `RoomMixin` have similarly become `HipChatRoom` and `HipChatRoomMixin and moved to `will.backends.io_adapters.hipchat`. -This release addresses a number of bugs and smaller features, including: - -* Chatoms support fixed by [bykof](https://github.com/bykof). -* Friendlier world time output. -* You can pass in `channel=` or `room=` when specifying a custom reply location. If both are passed in, Will uses `channel`. - #### 1.0.2 - October 24, 2017 Fixes and features in this release: diff --git a/will/backends/analysis/history.py b/will/backends/analysis/history.py index 3b8136d4..570ad296 100644 --- a/will/backends/analysis/history.py +++ b/will/backends/analysis/history.py @@ -10,8 +10,6 @@ class HistoryAnalysis(AnalysisBackend, StorageMixin): def do_analyze(self, message): # Load the last few messages, add it to the context under "history" - # print("history analyze") - # print(message) history = self.load("message_history", []) if not history: history = [] diff --git a/will/backends/execution/all.py b/will/backends/execution/all.py index 023018c7..fbff1379 100644 --- a/will/backends/execution/all.py +++ b/will/backends/execution/all.py @@ -20,7 +20,6 @@ def handle_execution(self, message): self.execute(message, m) had_one_reply = True - # TODO: Abstract this into a base method (Raise?) if not had_one_reply: self.no_response(message) diff --git a/will/backends/execution/base.py b/will/backends/execution/base.py index 602b9b6f..897df7a8 100644 --- a/will/backends/execution/base.py +++ b/will/backends/execution/base.py @@ -35,7 +35,6 @@ def not_allowed(self, message, explanation): ) def execute(self, message, option): - # TODO: Verify ACLs acl = option.context["acl"] if type(acl) == type("test"): acl = [acl] @@ -66,8 +65,6 @@ def execute(self, message, option): module = imp.load_source(option.context.plugin_info["parent_name"], option.context.plugin_info["parent_path"]) cls = getattr(module, option.context.plugin_info["name"]) - # TODO: Do we need self.bot? - # instantiated_module = cls(message=message, bot=self.bot) instantiated_module = cls(message=message) method = getattr(instantiated_module, option.context.function_name) diff --git a/will/backends/io_adapters/__init__.py b/will/backends/io_adapters/__init__.py index f7599185..e69de29b 100644 --- a/will/backends/io_adapters/__init__.py +++ b/will/backends/io_adapters/__init__.py @@ -1,3 +0,0 @@ -# from .hipchat import HipChatBackend -# from .rocketchat import RocketChatBackend -from .shell import ShellBackend diff --git a/will/backends/io_adapters/base.py b/will/backends/io_adapters/base.py index e7b77999..5267ee27 100644 --- a/will/backends/io_adapters/base.py +++ b/will/backends/io_adapters/base.py @@ -42,8 +42,6 @@ def handle_incoming_event(self, event): try: m = self.normalize_incoming_event(event) if m: - # print("\n\n\n\nhandle_incoming_event") - # print(m) self.pubsub.publish("message.incoming", m, reference_message=m) except: logging.critical("Error handling incoming event %s: \n%s" % ( @@ -58,8 +56,6 @@ def terminate(self): pass def __publish_incoming_message(self, message): - # print("__publish_incoming_message") - # print(message) return self.pubsub.publish("message.incoming", message, reference_message=message) def __start_event_listeners(self): diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index f9791552..083424f4 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -308,9 +308,6 @@ def session_start(self, event): self.disconnect() def join_rooms(self, event): - # TODO: Pull this and related. - # self.update_will_roster_and_rooms() - for r in self.rooms: if "xmpp_jid" in r: self.plugin['xep_0045'].joinMUC(r["xmpp_jid"], settings.HIPCHAT_NAME, wait=True) @@ -320,8 +317,6 @@ def handle_errors(self, event): print event def room_invite(self, event): - # TODO: Pull this and related. - # self.update_will_roster_and_rooms() logging.info("Invite recieved for %s" % event) for r in self.rooms: if "xmpp_jid" in r: diff --git a/will/backends/io_adapters/rocketchat.py b/will/backends/io_adapters/rocketchat.py index a427b718..973d4c07 100644 --- a/will/backends/io_adapters/rocketchat.py +++ b/will/backends/io_adapters/rocketchat.py @@ -160,7 +160,7 @@ def handle_outgoing_event(self, event): if hasattr(event, "source_message") and event.source_message: pass else: - # TODO: Rocket.Chat backend needs to provide ways to handle and properly route: + # Backend needs to provide ways to handle and properly route: # 1. 1-1 messages # 2. Group (channel) messages # 3. Ad-hoc group messages (if they exist) diff --git a/will/backends/pubsub/redis_pubsub.py b/will/backends/pubsub/redis_pubsub.py index 20331d4c..92ab4e55 100644 --- a/will/backends/pubsub/redis_pubsub.py +++ b/will/backends/pubsub/redis_pubsub.py @@ -1,3 +1,4 @@ +import logging import redis from six.moves.urllib import parse from .base import BasePubSub @@ -47,11 +48,11 @@ def __init__(self, settings, *args, **kwargs): self._pubsub = self.redis.pubsub() def publish_to_backend(self, topic, body_str): - # print("publishing %s" % (topic,)) + logging.debug("publishing %s" % (topic,)) return self.redis.publish(topic, body_str) def do_subscribe(self, topic): - # print("subscribed to %s" % topic) + logging.debug("subscribed to %s" % topic) return self._pubsub.psubscribe(topic) def unsubscribe(self, topic): From a9c06201f79feec70b4131e2df97a934ad0fe3ef Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 27 Oct 2017 12:03:23 +1300 Subject: [PATCH 074/200] Bit more cleanup --- .coveragerc | 4 +++- will/backends/pubsub/base.py | 15 ++------------- will/main.py | 1 - 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/.coveragerc b/.coveragerc index 058009fc..bbbb02c8 100644 --- a/.coveragerc +++ b/.coveragerc @@ -3,4 +3,6 @@ omit = will/tests/* .tox/* setup.py - *.egg/* \ No newline at end of file + *.egg/* + venv/* + site-packages/* \ No newline at end of file diff --git a/will/backends/pubsub/base.py b/will/backends/pubsub/base.py index 154a3a8b..bd5dc3b8 100644 --- a/will/backends/pubsub/base.py +++ b/will/backends/pubsub/base.py @@ -58,8 +58,6 @@ def publish(self, topic, obj, reference_message=None): data=obj, type=topic, ) - # TODO: Decide on this. It's hacky, but it makes backwards - # compatability easier. if hasattr(obj, "sender"): e.sender = obj.sender @@ -104,17 +102,8 @@ def get_message(self): try: m = self.get_from_backend() if m and m["type"] not in SKIP_TYPES: - loaded_message = self.decrypt(m["data"]) - # Handling inconsistent backends, but appears to no longer be an issue. - # if not loaded_message["hash"] in self.recent_hashes: - # self.recent_hashes.append(loaded_message["hash"]) - # if len(self.recent_hashes) > 100: - # self.recent_hashes = self.recent_hashes[1:] - return loaded_message - # print(loaded_message) - # loaded_message = pickle.loads( - # dec - # ) + return self.decrypt(m["data"]) + except AttributeError: raise Exception("Tried to call get message without having subscribed first!") except (KeyboardInterrupt, SystemExit): diff --git a/will/main.py b/will/main.py index 9ed3420c..5850bc9c 100644 --- a/will/main.py +++ b/will/main.py @@ -578,7 +578,6 @@ def bootstrap_event_handler(self): if event.type == "message.incoming": # A message just got dropped off one of the IO Backends. # Send it to analysis. - analysis_threads[event.original_incoming_event_hash] = { "count": 0, From c772e958678b01fb12929d3ed3134b3ec00bc76c Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 27 Oct 2017 12:30:25 +1300 Subject: [PATCH 075/200] Explicitly notes that ZeroMQ won't be in 2.0.1. --- will/backends/pubsub/zeromq_pubsub.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/will/backends/pubsub/zeromq_pubsub.py b/will/backends/pubsub/zeromq_pubsub.py index 46459b3b..c1f10227 100644 --- a/will/backends/pubsub/zeromq_pubsub.py +++ b/will/backends/pubsub/zeromq_pubsub.py @@ -34,7 +34,7 @@ class ZeroMQPubSub(BasePubSub): def __init__(self, settings, *args, **kwargs): self.verify_settings(quiet=True) - logging.warning( + logging.error( "The ZeroMQ Backend isn't ready for prime-time yet. Please " "test closely, and report any problems at Will's github page!" ) From b4258d64b8c6891e07ced7fe7a2ce783ca874288 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 27 Oct 2017 13:37:07 +1300 Subject: [PATCH 076/200] Gets generate_will_project working smoothly, starts re-support of python3. Man, I hate python 3. What a mistake it is. --- MANIFEST.in | 1 + config.py | 244 +----------------- requirements/base.txt | 6 +- will/backends/encryption/aes.py | 2 +- will/backends/io_adapters/hipchat.py | 4 +- will/backends/pubsub/base.py | 2 +- will/backends/storage/base.py | 2 +- will/main.py | 51 ++-- will/mixins/schedule.py | 4 +- config.py.dist => will/scripts/config.py.dist | 4 +- will/scripts/config.py.template | 1 - will/scripts/generate_will_project.py | 148 +---------- will/settings.py | 8 +- 13 files changed, 51 insertions(+), 426 deletions(-) mode change 100644 => 120000 config.py rename config.py.dist => will/scripts/config.py.dist (99%) delete mode 100644 will/scripts/config.py.template diff --git a/MANIFEST.in b/MANIFEST.in index edba8bd0..26968579 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -5,3 +5,4 @@ include *.py include requirements/*.txt recursive-include will/templates * recursive-include requirements * +recursive-include will/scripts * \ No newline at end of file diff --git a/config.py b/config.py deleted file mode 100644 index 44f9b580..00000000 --- a/config.py +++ /dev/null @@ -1,243 +0,0 @@ -# Welcome to Will's settings. -# - -# Config and the environment: -# --------------------------- -# Will can use settings from the environment or this file, and sets reasonable defaults. -# -# Best practices: set keys and the like in the environment, and anything you'd be ok -# with other people knowing in this file. -# -# To specify in the environment, just prefix with WILL_ -# (i.e. WILL_DEFAULT_ROOM becomes DEFAULT_ROOM). -# In case of conflict, you will see a warning message, and the value in this file will win. - -# ------------------------------------------------------------------------------------ -# Required settings -# ------------------------------------------------------------------------------------ - -# The list of plugin modules will should load. -# Will recursively loads all plugins contained in each module. - - -# This list can contain: -# -# Built-in core plugins: -# ---------------------- -# All built-in modules: will.plugins -# Built-in modules: will.plugins.module_name -# Specific plugins: will.plugins.module_name.plugin -# -# Plugins in your will: -# ---------------------- -# All modules: plugins -# A specific module: plugins.module_name -# Specific plugins: plugins.module_name.plugin -# -# Plugins anywhere else on your PYTHONPATH: -# ----------------------------------------- -# All modules: someapp -# A specific module: someapp.module_name -# Specific plugins: someapp.module_name.plugin - - -# By default, the list below includes all the core will plugins and -# all your project's plugins. - -PLUGINS = [ - # Built-ins - "will.plugins.admin", - "will.plugins.chat_room", - "will.plugins.devops", - "will.plugins.friendly", - "will.plugins.fun", - "will.plugins.help", - "will.plugins.productivity", - "will.plugins.web", - - # All plugins in your project. - "plugins", -] - -# Don't load any of the plugins in this list. Same options as above. -PLUGIN_BLACKLIST = [ - "will.plugins.productivity.hangout", # Because it requires a HANGOUT_URL - "will.plugins.productivity.bitly", # Because it requires a BITLY_ACCESS_TOKEN key and the bitly_api library - "will.plugins.devops.bitbucket_is_up", # Because most folks use github. - "will.plugins.devops.pagerduty", # Because it requires a PAGERDUTY_SUBDOMAIN and PAGERDUTY_API_KEY key -] - -# ------------------------------------------------------------------------------------ -# Platform and Decision-making -# ------------------------------------------------------------------------------------ - -# Platforms and mediums messages can come in and go out on. -IO_BACKENDS = [ - "will.backends.io_adapters.slack", - "will.backends.io_adapters.hipchat", - # "will.backends.io_adapters.rocketchat", - "will.backends.io_adapters.shell", -] - -# Backends to analyze messages and generate useful metadata -ANALYZE_BACKENDS = [ - "will.backends.analysis.nothing", - "will.backends.analysis.history", -] - -# Backends to generate possible actions, and metadata about them. -GENERATION_BACKENDS = [ - # "will.backends.generation.fuzzy_best_match", - "will.backends.generation.fuzzy_all_matches", - "will.backends.generation.strict_regex", -] - -# The "decision making" backends that look among the generated choices, -# and decide which to follow. Backends are executed in order, and any -# backend can stop further evaluation. -EXECUTION_BACKENDS = [ - "will.backends.execution.best_score", - # "will.backends.execution.all", -] - -# ------------------------------------------------------------------------------------ -# Backend-specific settings -# ------------------------------------------------------------------------------------ - -# Confidence fuzzy generation backends require before Will responds -# https://pypi.python.org/pypi/fuzzywuzzy -FUZZY_MINIMUM_MATCH_CONFIDENCE = 90 -FUZZY_REGEX_ALLOWABLE_ERRORS = 3 - - -# ------------------------------------------------------------------------------------ -# Slack settings -# ------------------------------------------------------------------------------------ -# SLACK_DEFAULT_CHANNEL = "alpha" - -# ------------------------------------------------------------------------------------ -# Rocket.chat settings -# ------------------------------------------------------------------------------------ - -# Rocket.Chat server URL and port as necessary -# ROCKETCHAT_URL = "http://localhost:3000" - - -# ------------------------------------------------------------------------------------ -# HipChat settings -# ------------------------------------------------------------------------------------ - -# The list of rooms will should join. Default is all rooms. -# HIPCHAT_ROOMS = ['Will Testing', 'Will and I'] - -# Disable HipChat SSL checks. Strongly reccomended this is not set to True. -# ALLOW_INSECURE_HIPCHAT_SERVER = False - - -# ------------------------------------------------------------------------------------ -# Potentially required settings -# ------------------------------------------------------------------------------------ - -# If will isn't accessible at localhost, you must set this for his keepalive to work. -# Note no trailing slash. -# PUBLIC_URL = "http://my-will.herokuapp.com" - -# The backend and room Will should talk to if the trigger is a webhook and he isn't told -# a specific room. Default is the first of IO_BACKENDS and ROOMS. -# DEFAULT_BACKEND = "will.backends.io_adapters.slack" -# DEFAULT_ROOM = 'Notifications' - -# Port to bind the web server to (defaults to $PORT, then 80.) -# Set > 1024 to run without elevated permission. -# HTTPSERVER_PORT = "9000" - -# Fully-qualified folders to look for templates in, beyond the two that -# are always included: core will's templates folder, your project's templates folder, and -# all templates folders in included plugins, if they exist. -# -# TEMPLATE_DIRS = [ -# os.path.abspath("other_folder/templates") -# ] - - -# Access Control: Specify groups of users to be used in the acl=["admins","ceos"] parameter -# in respond_to and hear actions. -# Group names can be any string, and the list is composed of user handles. -# ACL = { -# "admins": ["sarah", "sue", "steven"] -# } -# -# By default, if no ACL is set, all users can perform all actions - but warnings -# will be printed to the console. To disable those warnings, set DISABLE_ACL to True -# DISABLE_ACL = False - -# Sets a different storage backend. If unset, defaults to redis. -# If you use a different backend, make sure to add their required settings. -# STORAGE_BACKEND = "redis" # "redis", "couchbase", or "file". - - -# Sets a different storage backend. If unset, defaults to redis. -# If you use a different backend, make sure to add their required settings. -# PUBSUB_BACKEND = "redis" # "redis", or "zeromq" (beta). -# ZEROMQ_URL = "tcp://127.0.0.1:15555" - - -# Your will's mention handle. (aka @will) Note that this is not backend-specific, -# and is only used for the generation of help text. -# WILL_HANDLE = "will" - - -# ------------------------------------------------------------------------------------ -# Optional settings -# ------------------------------------------------------------------------------------ - -# The maximum number of milliseconds to wait for an analysis backend to finish -# ANALYSIS_TIMEOUT_MS = 2000 - -# The maximum number of milliseconds to wait for a generation backend to finish -# GENERATION_TIMEOUT_MS = 2000 - -# The interval will checks his internal cross-thread messaging queues, in seconds. -# Increasing the value will make will slower, but consume fewer resources. -# EVENT_LOOP_INTERVAL = 0.025 - -# A secret key, used to namespace this instance of will and secure pubsub contents. -# Do *NOT* keep it in config.py. *DO* set it in the environment as WILL_SECRET_KEY, -# in a secured session. If a SECRET_KEY is not set, one will be auto-generated, -# but it may limit Will to reading data from this excecution only, and may not work -# on virtualized machines, or machines with many or changing MAC addresses -# SECRET_KEY = "DXQnJ2eHD6k2w3DvBTstN6kw9d9N4CeCLbjoK" - - -# Turn up or down Will's logging level -# LOGLEVEL = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL -# LOGLEVEL = "DEBUG" - -# Turn on or off Will's profiling -# PROFILING_ENABLED = False - -# Turn on/off encryption in pub/sub and storage (default is on). -# Causes a small speed bump, but secures messages in an untrusted environment. -# ENABLE_INTERNAL_ENCRYPTION = False -# ENCRYPTION_BACKEND = "aes" - -# Mailgun config, if you'd like will to send emails. -# DEFAULT_FROM_EMAIL="will@example.com" -# Set in your environment: -# export WILL_MAILGUN_API_KEY="key-12398912329381" -# export WILL_MAILGUN_API_URL="example.com" - - -# Proxy settings -# Use proxy to access hipchat servers -# Make sure your proxy allows CONNECT method to port 5222 -# PROXY_URL = "http://user:pass@corpproxy.example.com:3128" -# or -# PROXY_URL = "http://myproxy:80 - -# Google Application key for "image me" command -# GOOGLE_API_KEY = "FILL THIS IN" -# GOOGLE_CUSTOM_SEARCH_ENGINE_ID = "FILL THIS IN" - -# Internal, used for helpful output when upgrades are installed -WILL_RELEASE_VERSION = 2.0 diff --git a/config.py b/config.py new file mode 120000 index 00000000..e90cfe37 --- /dev/null +++ b/config.py @@ -0,0 +1 @@ +will/scripts/config.py.dist \ No newline at end of file diff --git a/requirements/base.txt b/requirements/base.txt index 23831bcb..a8a48643 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -4,12 +4,14 @@ bottle==0.12.7 CherryPy==3.6.0 clint==0.3.7 dill==0.2.1 -dnspython==1.12.0 +dnspython==1.15.0 fuzzywuzzy==0.15.1 Jinja2==2.7.3 Markdown==2.3.1 MarkupSafe==0.23 -natural==0.1.5 +# Temporary fork of natural, until python 3 support is merged: https://github.com/tehmaze/natural/pull/11 +# natural==0.1.5 +-e git+https://github.com/heywill/natural#egg=natural parsedatetime==1.1.2 python-Levenshtein==0.12.0 pyasn1-modules==0.0.5 diff --git a/will/backends/encryption/aes.py b/will/backends/encryption/aes.py index 765326d4..6ddb70f3 100644 --- a/will/backends/encryption/aes.py +++ b/will/backends/encryption/aes.py @@ -14,7 +14,7 @@ BS = 16 -key = hashlib.sha256(settings.SECRET_KEY).digest() +key = hashlib.sha256(settings.SECRET_KEY.encode("utf-8")).digest() def pad(s): diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index 083424f4..290888aa 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -313,8 +313,8 @@ def join_rooms(self, event): self.plugin['xep_0045'].joinMUC(r["xmpp_jid"], settings.HIPCHAT_NAME, wait=True) def handle_errors(self, event): - print "got error event" - print event + print("got error event") + print(event) def room_invite(self, event): logging.info("Invite recieved for %s" % event) diff --git a/will/backends/pubsub/base.py b/will/backends/pubsub/base.py index bd5dc3b8..96f76c0a 100644 --- a/will/backends/pubsub/base.py +++ b/will/backends/pubsub/base.py @@ -2,7 +2,7 @@ import os import redis import traceback -import urlparse +from six.moves.urllib.parse import urlparse from will.abstractions import Event from will import settings diff --git a/will/backends/storage/base.py b/will/backends/storage/base.py index a9659577..65dbf2af 100644 --- a/will/backends/storage/base.py +++ b/will/backends/storage/base.py @@ -1,6 +1,6 @@ import logging import redis -import urlparse +from six.moves.urllib.parse import urlparse from will.mixins import SettingsMixin, EncryptionMixin diff --git a/will/main.py b/will/main.py index 5850bc9c..eb7ebe06 100644 --- a/will/main.py +++ b/will/main.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- import copy -from cStringIO import StringIO import datetime import imp from importlib import import_module @@ -264,7 +263,7 @@ def verify_io(self): c = cls() show_valid(c.friendly_name) c.verify_settings() - except Exception as e: + except Exception : error_message = ( "IO backend %s is missing. Please either remove it \nfrom config.py " "or WILL_IO_BACKENDS, or provide it somehow (pip install, etc)." @@ -273,7 +272,7 @@ def verify_io(self): puts() puts(error_message) puts() - puts(traceback.format_exc(e)) + puts(traceback.format_exc()) missing_setting_error_messages.append(error_message) missing_settings = True @@ -316,7 +315,7 @@ def verify_analysis(self): puts() puts(error_message) puts() - puts(traceback.format_exc(e)) + puts(traceback.format_exc()) missing_setting_error_messages.append(error_message) missing_settings = True @@ -359,7 +358,7 @@ def verify_generate(self): puts() puts(error_message) puts() - puts(traceback.format_exc(e)) + puts(traceback.format_exc()) missing_setting_error_messages.append(error_message) missing_settings = True @@ -402,7 +401,7 @@ def verify_execution(self): puts() puts(error_message) puts() - puts(traceback.format_exc(e)) + puts(traceback.format_exc()) missing_setting_error_messages.append(error_message) missing_settings = True @@ -441,7 +440,7 @@ def bootstrap_execution(self): puts() puts(error_message) puts() - puts(traceback.format_exc(e)) + puts(traceback.format_exc()) missing_setting_error_messages.append(error_message) if len(self.execution_backends) == 0: @@ -682,14 +681,14 @@ def bootstrap_storage_mixin(self): with indent(2): show_valid("Bootstrapped!") puts("") - except ImportError as e: - module_name = traceback.format_exc(e).split(" ")[-1] + except ImportError : + module_name = traceback.format_exc().split(" ")[-1] error("Unable to bootstrap storage - attempting to load %s" % module_name) - puts(traceback.format_exc(e)) + puts(traceback.format_exc()) sys.exit(1) - except Exception as e: + except Exception: error("Unable to bootstrap storage!") - puts(traceback.format_exc(e)) + puts(traceback.format_exc()) sys.exit(1) @yappi_profile(return_callback=yappi_aggregate) @@ -703,13 +702,13 @@ def bootstrap_pubsub_mixin(self): show_valid("Bootstrapped!") puts("") except ImportError as e: - module_name = traceback.format_exc(e).split(" ")[-1] + module_name = traceback.format_exc().split(" ")[-1] error("Unable to bootstrap pubsub - attempting to load %s" % module_name) - puts(traceback.format_exc(e)) + puts(traceback.format_exc()) sys.exit(1) - except Exception as e: + except Exception : error("Unable to bootstrap pubsub!") - puts(traceback.format_exc(e)) + puts(traceback.format_exc()) sys.exit(1) @yappi_profile(return_callback=yappi_aggregate) @@ -742,7 +741,7 @@ def bootstrap_scheduler(self): meta["num_times_per_day"] ) bootstrapped = True - except Exception as e: + except Exception : self.startup_error("Error bootstrapping scheduler", e) if bootstrapped: show_valid("Scheduler started.") @@ -761,7 +760,7 @@ def bootstrap_bottle(self): bottle_route_args[k[len("bottle_"):]] = v bottle.route(instantiated_fn.will_fn_metadata["bottle_route"], **bottle_route_args)(instantiated_fn) bootstrapped = True - except Exception as e: + except Exception : self.startup_error("Error bootstrapping bottle", e) if bootstrapped: show_valid("Web server started at %s." % (settings.PUBLIC_URL,)) @@ -805,7 +804,7 @@ def bootstrap_io(self): self.io_threads.append(thread) show_valid("IO: %s Backend started." % cls.friendly_name) - except Exception as e: + except Exception : self.startup_error("Error bootstrapping %s io" % b, e) self.io_backends.append(b) @@ -834,7 +833,7 @@ def bootstrap_analysis(self): thread.start() self.analysis_threads.append(thread) show_valid("Analysis: %s Backend started." % cls.__name__) - except Exception as e: + except Exception : self.startup_error("Error bootstrapping %s io" % b, e) self.analysis_backends.append(b) @@ -863,7 +862,7 @@ def bootstrap_generation(self): thread.start() self.generation_threads.append(thread) show_valid("Generation: %s Backend started." % cls.__name__) - except Exception as e: + except Exception : self.startup_error("Error bootstrapping %s io" % b, e) self.generation_backends.append(b) @@ -922,7 +921,7 @@ def bootstrap_plugins(self): "parent_help_text": parent_help_text, "blacklisted": blacklisted, } - except Exception as e: + except Exception : self.startup_error("Error loading %s" % (module_path,), e) self.plugins = [] @@ -942,9 +941,9 @@ def bootstrap_plugins(self): "parent_help_text": plugin_modules_library[name]["parent_help_text"], "blacklisted": plugin_modules_library[name]["blacklisted"], }) - except Exception as e: + except Exception : self.startup_error("Error bootstrapping %s" % (class_name,), e) - except Exception as e: + except Exception : self.startup_error("Error bootstrapping %s" % (name,), e) self._plugin_modules_library = plugin_modules_library @@ -1066,7 +1065,7 @@ def bootstrap_plugins(self): # puts("- %s" % function_name) self.bottle_routes.append((plugin_info["class"], function_name)) - except Exception as e: + except Exception : error(plugin_name) self.startup_error( "Error bootstrapping %s.%s" % ( @@ -1080,7 +1079,7 @@ def bootstrap_plugins(self): warn(w) else: show_valid(plugin_name) - except Exception as e: + except Exception : self.startup_error("Error bootstrapping %s" % (plugin_info["class"],), e) puts("") diff --git a/will/mixins/schedule.py b/will/mixins/schedule.py index 8ac2b48d..736a2ca5 100644 --- a/will/mixins/schedule.py +++ b/will/mixins/schedule.py @@ -97,8 +97,8 @@ def add_periodic_task(self, module_name, cls_name, function_name, sched_args, now = datetime.datetime.now() ct = CronTrigger(*sched_args, **sched_kwargs) when = ct.get_next_fire_time(now) - print "ct.get_next_fire_time(now)" - print when + logging.info("ct.get_next_fire_time(now)") + logging.info(when) item = { "type": "periodic_task", "module_name": module_name, diff --git a/config.py.dist b/will/scripts/config.py.dist similarity index 99% rename from config.py.dist rename to will/scripts/config.py.dist index 0a633bc4..44f9b580 100644 --- a/config.py.dist +++ b/will/scripts/config.py.dist @@ -75,7 +75,7 @@ PLUGIN_BLACKLIST = [ IO_BACKENDS = [ "will.backends.io_adapters.slack", "will.backends.io_adapters.hipchat", - "will.backends.io_adapters.rocketchat", + # "will.backends.io_adapters.rocketchat", "will.backends.io_adapters.shell", ] @@ -87,9 +87,9 @@ ANALYZE_BACKENDS = [ # Backends to generate possible actions, and metadata about them. GENERATION_BACKENDS = [ + # "will.backends.generation.fuzzy_best_match", "will.backends.generation.fuzzy_all_matches", "will.backends.generation.strict_regex", - # "will.backends.generation.fuzzy_best_match", ] # The "decision making" backends that look among the generated choices, diff --git a/will/scripts/config.py.template b/will/scripts/config.py.template deleted file mode 100644 index e0a02d46..00000000 --- a/will/scripts/config.py.template +++ /dev/null @@ -1 +0,0 @@ -Clear for now. \ No newline at end of file diff --git a/will/scripts/generate_will_project.py b/will/scripts/generate_will_project.py index 18dc8c33..90a7d448 100644 --- a/will/scripts/generate_will_project.py +++ b/will/scripts/generate_will_project.py @@ -110,148 +110,13 @@ def good_morning(self, message): os.chmod("run_will.py", st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) # Create config.py - print(" config.py") - config_path = os.path.join(current_dir, "config.py") + print(" config.py.dist") + config_path = os.path.join(current_dir, "config.py.dist") if not os.path.exists(config_path): - with open(config_path, 'w+') as f: - f.write("""# Welcome to Will's settings. -# - -# Config and the environment: -# --------------------------- -# Will can use settings from the environment or this file, and sets reasonable defaults. -# -# Best practices: set keys and the like in the environment, and anything you'd be ok -# with other people knowing in this file. -# -# To specify in the environment, just prefix with WILL_ -# (i.e. WILL_DEFAULT_ROOM becomes DEFAULT_ROOM). -# In case of conflict, you will see a warning message, and the value in this file will win. - - - -# ------------------------------------------------------------------------------------ -# Required settings -# ------------------------------------------------------------------------------------ - -# The list of plugin modules will should load. -# Will recursively loads all plugins contained in each module. - - -# This list can contain: -# -# Built-in core plugins: -# ---------------------- -# All built-in modules: will.plugins -# Built-in modules: will.plugins.module_name -# Specific plugins: will.plugins.module_name.plugin -# -# Plugins in your will: -# ---------------------- -# All modules: plugins -# A specific module: plugins.module_name -# Specific plugins: plugins.module_name.plugin -# -# Plugins anywhere else on your PYTHONPATH: -# ----------------------------------------- -# All modules: someapp -# A specific module: someapp.module_name -# Specific plugins: someapp.module_name.plugin - - -# By default, the list below includes all the core will plugins and -# all your project's plugins. - -PLUGINS = [ - # Built-ins - "will.plugins.admin", - "will.plugins.chat_room", - "will.plugins.devops", - "will.plugins.friendly", - "will.plugins.fun", - "will.plugins.help", - "will.plugins.productivity", - "will.plugins.web", - - # All plugins in your project. - "plugins", -] - -# Don't load any of the plugins in this list. Same options as above. -PLUGIN_BLACKLIST = [ - "will.plugins.productivity.hangout", # Because it requires a HANGOUT_URL - "will.plugins.productivity.world_time", # Because it requires a WORLD_WEATHER_ONLINE_V2_KEY key - "will.plugins.productivity.bitly", # Because it requires a BITLY_ACCESS_TOKEN key and the bitly_api library - "will.plugins.devops.pagerduty", # Because it requires a PAGERDUTY_SUBDOMAIN and PAGERDUTY_API_KEY key -] - - -# ------------------------------------------------------------------------------------ -# Potentially required settings -# ------------------------------------------------------------------------------------ - -# If will isn't accessible at localhost, you must set this for his keepalive to work. -# Note no trailing slash. -# PUBLIC_URL = "http://my-will.herokuapp.com" - -# Port to bind the web server to (defaults to $PORT, then 80.) -# Set > 1024 to run without elevated permission. -# HTTPSERVER_PORT = "9000" - - -# ------------------------------------------------------------------------------------ -# Optional settings -# ------------------------------------------------------------------------------------ - -# The list of rooms will should join. Default is all rooms. -# ROOMS = ['Testing, Will Kahuna',] - - -# The room will will talk to if the trigger is a webhook and he isn't told a specific room. -# Default is the first of ROOMS. -# DEFAULT_ROOM = 'Testing, Will Kahuna' - - -# Fully-qualified folders to look for templates in, beyond the two that -# are always included: core will's templates folder, your project's templates folder, and -# all templates folders in included plugins, if they exist. -# -# TEMPLATE_DIRS = [ -# os.path.abspath("other_folder/templates") -# ] - -# Access Control: Specify groups of users to be used in the acl=["admins","ceos"] parameter -# in respond_to and hear actions. -# Group names can be any string, and the list is composed of user handles. -# ACL = { -# "admins": ["steven", "will"] -# } - -# Deprecated - use ACL, above, instead: User handles who are allowed to perform -# `admin_only` plugins. Defaults to everyone. -# ADMINS = [ -# "steven", -# "levi", -# ] - -# Sets a different storage backend. If unset, defaults to redis. -# If you use a different backend, make sure to add their required settings. -# STORAGE_BACKEND = "" # "redis", "couchbase", or "local". - -# Disable SSL checks. Strongly recommended this is not set to True. -# ALLOW_INSECURE_HIPCHAT_SERVER = False - -# Mailgun config, if you'd like will to send emails. -# DEFAULT_FROM_EMAIL="will@example.com" -# Set in your environment: -# export WILL_MAILGUN_API_KEY="key-12398912329381" -# export WILL_MAILGUN_API_URL="example.com" - - -# Logging level -# LOGLEVEL = "DEBUG" - - """) + with open(config_path, "w+") as f: + with open(os.path.join(PROJECT_ROOT, "config.py.dist"), "r") as source_f: + config = source_f.read() + f.write(config) print(" requirements.txt") # Create requirements.txt @@ -278,6 +143,7 @@ def good_morning(self, message): print("\nDone.") + print("\n Your will is now ready to go. Run ./run_will.py to get started!" ) if __name__ == '__main__': main() diff --git a/will/settings.py b/will/settings.py index 16a5a354..62684090 100644 --- a/will/settings.py +++ b/will/settings.py @@ -18,21 +18,21 @@ def auto_key(): node = uuid.getnode() h = hashlib.md5() - h.update("%s" % node) + h.update(str("%s" % node).encode('utf-8')) key1 = h.hexdigest() time.sleep(random.uniform(0, 0.5)) node = uuid.getnode() h = hashlib.md5() - h.update("%s" % node) + h.update(str("%s" % node).encode('utf-8')) key2 = h.hexdigest() time.sleep(random.uniform(0, 0.5)) node = uuid.getnode() h = hashlib.md5() - h.update("%s" % node) + h.update(str("%s" % node).encode('utf-8')) key3 = h.hexdigest() if key1 == key2 and key2 == key3: @@ -390,7 +390,7 @@ def import_settings(quiet=True): "shared or virtualized environment.\n Please set a unique secret key in the " + "environment as WILL_SECRET_KEY to run will." ) - print " Unable to start will without a SECRET_KEY while encryption is turned on. Shutting down." + print(" Unable to start will without a SECRET_KEY while encryption is turned on. Shutting down.") sys.exit(1) settings["SECRET_KEY"] = key From 8f6fc0b459c253834cf4d0e70a77f39081bbc14d Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 27 Oct 2017 14:35:36 +1300 Subject: [PATCH 077/200] Mostly gets things working in python 3 --- will/abstractions.py | 8 +- will/backends/encryption/aes.py | 6 +- will/decorators.py | 2 +- will/main.py | 128 ++++++++++++++++---------------- will/mixins/storage.py | 11 +-- will/scripts/config.py.dist | 2 +- will/utils.py | 1 + 7 files changed, 81 insertions(+), 77 deletions(-) diff --git a/will/abstractions.py b/will/abstractions.py index cda95cf0..3ba43c61 100644 --- a/will/abstractions.py +++ b/will/abstractions.py @@ -39,8 +39,8 @@ def __init__(self, *args, **kwargs): self.content = self._clean_message_content(self.content) h = hashlib.md5() - h.update(self.timestamp.strftime("%s")) - h.update("%s" % self.content) + h.update(self.timestamp.strftime("%s").encode("utf-8")) + h.update(self.content.encode("utf-8")) self.hash = h.hexdigest() self.metadata = Bunch() @@ -94,8 +94,8 @@ def __init__(self, *args, **kwargs): self.timestamp = datetime.datetime.now() h = hashlib.md5() - h.update(self.timestamp.strftime("%s")) - h.update("%s" % self.type) + h.update(self.timestamp.strftime("%s").encode("utf-8")) + h.update(self.type.encode("utf-8")) self.hash = h.hexdigest() if not "original_incoming_event_hash" in kwargs: if hasattr(self, "original_incoming_event") and hasattr(self.original_incoming_event, "hash"): diff --git a/will/backends/encryption/aes.py b/will/backends/encryption/aes.py index 6ddb70f3..2cd31b11 100644 --- a/will/backends/encryption/aes.py +++ b/will/backends/encryption/aes.py @@ -18,12 +18,12 @@ def pad(s): - s = s + (BS - len(s) % BS) * "~" + s = "%s%s" % (s.decode("utf-8"), ((BS - len(s) % BS) * "~")) return s def unpad(s): - while s.endswith("~"): + while s.endswith(str.encode("~")): s = s[:-1] return s @@ -38,7 +38,7 @@ def encrypt_to_b64(cls, raw): iv = binascii.b2a_hex(os.urandom(8)) cipher = AES.new(key, AES.MODE_CBC, iv) enc = binascii.b2a_base64(cipher.encrypt(pad(enc))) - return "%s/%s" % (iv, enc) + return "%s/%s" % (iv.decode("utf-8"), enc.decode("utf-8")) else: return enc except: diff --git a/will/decorators.py b/will/decorators.py index 3813a94f..12c16071 100644 --- a/will/decorators.py +++ b/will/decorators.py @@ -10,7 +10,7 @@ def deprecation_warning_for_admin(f): def passthrough_decorator(*args, **kwargs): def wrap(f): def wrapped_f(*args, **kwargs): - f(*args, **kwargs) + return f(*args, **kwargs) return wrapped_f return wrap diff --git a/will/main.py b/will/main.py index eb7ebe06..ec2dc6a3 100644 --- a/will/main.py +++ b/will/main.py @@ -133,76 +133,76 @@ def bootstrap(self): self.bootstrap_pubsub_mixin() self.bootstrap_plugins() self.verify_plugin_settings() - self.verify_io() + started = self.verify_io() + if started: + puts("Bootstrapping complete.") - puts("Bootstrapping complete.") + # Save help modules. + self.save("help_modules", self.help_modules) - # Save help modules. - self.save("help_modules", self.help_modules) + puts("\nStarting core processes:") - puts("\nStarting core processes:") + # try: + # Exit handlers. + # signal.signal(signal.SIGINT, self.handle_sys_exit) + # # TODO this hangs for some reason. + # signal.signal(signal.SIGTERM, self.handle_sys_exit) - # try: - # Exit handlers. - # signal.signal(signal.SIGINT, self.handle_sys_exit) - # # TODO this hangs for some reason. - # signal.signal(signal.SIGTERM, self.handle_sys_exit) + # Scheduler + self.scheduler_thread = Process(target=self.bootstrap_scheduler) - # Scheduler - self.scheduler_thread = Process(target=self.bootstrap_scheduler) + # Bottle + self.bottle_thread = Process(target=self.bootstrap_bottle) - # Bottle - self.bottle_thread = Process(target=self.bootstrap_bottle) + # Event handler + self.incoming_event_thread = Process(target=self.bootstrap_event_handler) - # Event handler - self.incoming_event_thread = Process(target=self.bootstrap_event_handler) + self.io_threads = [] + self.analysis_threads = [] + self.generation_threads = [] - self.io_threads = [] - self.analysis_threads = [] - self.generation_threads = [] - - with indent(2): - try: - # Start up threads. - self.bootstrap_io() - self.bootstrap_analysis() - self.bootstrap_generation() - self.bootstrap_execution() - - self.scheduler_thread.start() - self.bottle_thread.start() - self.incoming_event_thread.start() - - errors = self.get_startup_errors() - if len(errors) > 0: - error_message = "FYI, I ran into some problems while starting up:" - for err in errors: - error_message += "\n%s\n" % err - puts(colored.red(error_message)) - - self.stdin_listener_thread = False - self.has_stdin_io_backend = True - if self.has_stdin_io_backend: - - self.current_line = "" - while True: - for line in sys.stdin.readline(): - if "\n" in line: - self.publish( - "message.incoming.stdin", - Event( - type="message.incoming.stdin", - content=self.current_line, + with indent(2): + try: + # Start up threads. + self.bootstrap_io() + self.bootstrap_analysis() + self.bootstrap_generation() + self.bootstrap_execution() + + self.scheduler_thread.start() + self.bottle_thread.start() + self.incoming_event_thread.start() + + errors = self.get_startup_errors() + if len(errors) > 0: + error_message = "FYI, I ran into some problems while starting up:" + for err in errors: + error_message += "\n%s\n" % err + puts(colored.red(error_message)) + + self.stdin_listener_thread = False + self.has_stdin_io_backend = True + if self.has_stdin_io_backend: + + self.current_line = "" + while True: + for line in sys.stdin.readline(): + if "\n" in line: + self.publish( + "message.incoming.stdin", + Event( + type="message.incoming.stdin", + content=self.current_line, + ) ) - ) - self.current_line = "" - else: - self.current_line += line - else: - while True: - time.sleep(100) - except (KeyboardInterrupt, SystemExit): - self.handle_sys_exit() + self.current_line = "" + else: + self.current_line += line + else: + while True: + time.sleep(100) + except (KeyboardInterrupt, SystemExit): + self.handle_sys_exit() def verify_individual_setting(self, test_setting, quiet=False): if not test_setting.get("only_if", True): @@ -276,14 +276,16 @@ def verify_io(self): missing_setting_error_messages.append(error_message) missing_settings = True - if missing_settings and not one_valid_backend: + if missing_settings or not one_valid_backend: puts("") error( "Unable to find a valid IO backend - will has no way to talk " "or listen!\n Quitting now, please look at the above errors!\n" ) - sys.exit(1) + self.handle_sys_exit() + return False puts() + return True @yappi_profile(return_callback=yappi_aggregate) def verify_analysis(self): diff --git a/will/mixins/storage.py b/will/mixins/storage.py index 5b0a0098..6cfd4804 100644 --- a/will/mixins/storage.py +++ b/will/mixins/storage.py @@ -30,21 +30,21 @@ def save(self, key, value, expire=None): self.bootstrap_storage() try: return self.storage.save(key, pickle.dumps(value), expire=expire) - except Exception: + except: logging.exception("Unable to save %s", key) def clear(self, key): self.bootstrap_storage() try: return self.storage.clear(key) - except Exception: + except: logging.exception("Unable to clear %s", key) def clear_all_keys(self): self.bootstrap_storage() try: return self.storage.clear_all_keys() - except Exception: + except: logging.exception("Unable to clear all keys") def load(self, key, default=None): @@ -54,8 +54,9 @@ def load(self, key, default=None): if val is not None: return pickle.loads(val) return default - except Exception: - logging.exception("Failed to load %s", key) + except: + # logging.exception("Failed to load %s", key) + return default def size(self): self.bootstrap_storage() diff --git a/will/scripts/config.py.dist b/will/scripts/config.py.dist index 44f9b580..b23a2605 100644 --- a/will/scripts/config.py.dist +++ b/will/scripts/config.py.dist @@ -75,7 +75,7 @@ PLUGIN_BLACKLIST = [ IO_BACKENDS = [ "will.backends.io_adapters.slack", "will.backends.io_adapters.hipchat", - # "will.backends.io_adapters.rocketchat", + "will.backends.io_adapters.rocketchat", "will.backends.io_adapters.shell", ] diff --git a/will/utils.py b/will/utils.py index 983c8e79..3f809edb 100644 --- a/will/utils.py +++ b/will/utils.py @@ -54,6 +54,7 @@ def clean_for_pickling(d): # Via http://stackoverflow.com/a/925630 class HTMLStripper(html_parser.HTMLParser): def __init__(self): + self.convert_charrefs = True self.reset() self.fed = [] From d18e832f1bf86983b3986d22c3271a1150f70be7 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 27 Oct 2017 14:53:20 +1300 Subject: [PATCH 078/200] Gets images to python 3 compatability --- will/backends/io_adapters/rocketchat.py | 2 +- will/plugins/productivity/images.py | 22 ++++++++++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/will/backends/io_adapters/rocketchat.py b/will/backends/io_adapters/rocketchat.py index 973d4c07..554fdb86 100644 --- a/will/backends/io_adapters/rocketchat.py +++ b/will/backends/io_adapters/rocketchat.py @@ -304,7 +304,7 @@ def _get_userid_from_username(self, username): if username is None: raise TypeError("No username given") - for id, data in self.people.iteritems(): + for id, data in self.people.items(): if data['handle'] == username: return id diff --git a/will/plugins/productivity/images.py b/will/plugins/productivity/images.py index e90ff44d..e3666684 100644 --- a/will/plugins/productivity/images.py +++ b/will/plugins/productivity/images.py @@ -44,13 +44,14 @@ def image_me(self, message, search_query): ) r = requests.get("https://www.google.com/search?tbm=isch&safe=active&q=%s" % search_query) results = [] - index = r.content.find(" Date: Sat, 28 Oct 2017 12:45:30 +1300 Subject: [PATCH 079/200] Fixes flake8 --- will/scripts/generate_will_project.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/will/scripts/generate_will_project.py b/will/scripts/generate_will_project.py index 90a7d448..27f6815c 100644 --- a/will/scripts/generate_will_project.py +++ b/will/scripts/generate_will_project.py @@ -143,7 +143,8 @@ def good_morning(self, message): print("\nDone.") - print("\n Your will is now ready to go. Run ./run_will.py to get started!" ) + print("\n Your will is now ready to go. Run ./run_will.py to get started!") + if __name__ == '__main__': main() From 723b9fc2dd5c4c88dbc1862b40384a5bd309e67a Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 1 Nov 2017 17:46:40 +1300 Subject: [PATCH 080/200] Updates setup to handle forked packages, adds some birthday magic. --- docs/plugins/builtins.md | 31 ++---------------------------- setup.py | 14 +++++++++++++- will/main.py | 30 ++++++++++++++--------------- will/plugins/friendly/hello.py | 14 ++++++++++++++ will/plugins/friendly/howareyou.py | 7 ++++++- 5 files changed, 50 insertions(+), 46 deletions(-) diff --git a/docs/plugins/builtins.md b/docs/plugins/builtins.md index 4fdd86f8..2fb03c43 100644 --- a/docs/plugins/builtins.md +++ b/docs/plugins/builtins.md @@ -170,7 +170,7 @@ When will starts up, he'll make sure they've been set: ## Getting a room's history -Sometimes you'll want to retrieve a room's history. No problem - get the room's object, and the last 75 messages are sitting on `.history`. +Sometimes you'll want to retrieve a room's history. No problem - get the room's object, and the last 20 messages are sitting on `analysis.history`. ```python class HistoryPlugin(WillPlugin): @@ -178,37 +178,10 @@ class HistoryPlugin(WillPlugin): @respond_to("^get last message") def get_history(self, message): room = self.get_room_from_message(message) - self.reply(room.history[-1]["message"]) + self.reply(room.analysis["history"][-1]) ``` -`.history` is pretty much what's returned from the [HipChat room history API](https://www.hipchat.com/docs/apiv2/method/view_room_history) - the lone exception is that the date has been converted to a python datetime. -```python - { - u'from':{ - u'mention_name':u'First Last', - u'id':xxxx, - u'links':{ - u'self': u'https://api.hipchat.com/v2/user/xxxx' - }, - u'name':u'First Last' - }, - u'date':datetime.datetime(2015, 1, 26, 15, 26, 52), - u'mentions':[ - { - u'mention_name':u'FirstLast', - u'id':xyxy, - u'links':{ - u'self': u'https://api.hipchat.com/v2/user/xyxy' - }, - u'name':u'First Last' - } - ], - u'message':u'Hi there!', - u'type':u'message', - u'id':u'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' - } -``` ## Parse natural time diff --git a/setup.py b/setup.py index cf54b750..afb10a29 100755 --- a/setup.py +++ b/setup.py @@ -11,6 +11,7 @@ REQS_DIR = os.path.join(ROOT_DIR, "requirements") install_requires = [] +dependency_links = [] with open("requirements.txt", "r+") as f: for line in f.readlines(): if line[0] == "-": @@ -20,8 +21,18 @@ for req_file in ["base.txt", "slack.txt", "hipchat.txt", "rocketchat.txt"]: with open(os.path.join(REQS_DIR, req_file), "r+") as f: for line in f.readlines(): - if line[0] == "-": + if ( + (line.startswith("-") and not line.startswith("-e")) + or line.startswith("#") + ): continue + + if "-e" in line: + line = line.replace("-e", "") + dependency_links.append(line) + line = line.split("#")[-1].split("=")[-1] + + print line.strip() install_requires.append(line.strip()) @@ -59,6 +70,7 @@ version=VERSION, download_url=['https://github.com/skoczen/will/tarball/%s' % VERSION, ], install_requires=install_requires, + dependency_links=dependency_links, setup_requires=setup_requires, tests_require=tests_require, packages=find_packages(), diff --git a/will/main.py b/will/main.py index ec2dc6a3..a39a674a 100644 --- a/will/main.py +++ b/will/main.py @@ -263,7 +263,7 @@ def verify_io(self): c = cls() show_valid(c.friendly_name) c.verify_settings() - except Exception : + except Exception as e: error_message = ( "IO backend %s is missing. Please either remove it \nfrom config.py " "or WILL_IO_BACKENDS, or provide it somehow (pip install, etc)." @@ -493,17 +493,17 @@ def handle_sys_exit(self, *args, **kwargs): os.environ["WILL_SECRET_KEY"] = "" os.environ["WILL_EPHEMERAL_SECRET_KEY"] = "" - if self.scheduler_thread: + if hasattr(self, "scheduler_thread") and self.scheduler_thread: try: self.scheduler_thread.terminate() except KeyboardInterrupt: pass - if self.bottle_thread: + if hasattr(self, "bottle_thread") and self.bottle_thread: try: self.bottle_thread.terminate() except KeyboardInterrupt: pass - if self.incoming_event_thread: + if hasattr(self, "incoming_event_thread") and self.incoming_event_thread: try: self.incoming_event_thread.terminate() except KeyboardInterrupt: @@ -708,7 +708,7 @@ def bootstrap_pubsub_mixin(self): error("Unable to bootstrap pubsub - attempting to load %s" % module_name) puts(traceback.format_exc()) sys.exit(1) - except Exception : + except Exception as e: error("Unable to bootstrap pubsub!") puts(traceback.format_exc()) sys.exit(1) @@ -743,7 +743,7 @@ def bootstrap_scheduler(self): meta["num_times_per_day"] ) bootstrapped = True - except Exception : + except Exception as e: self.startup_error("Error bootstrapping scheduler", e) if bootstrapped: show_valid("Scheduler started.") @@ -762,7 +762,7 @@ def bootstrap_bottle(self): bottle_route_args[k[len("bottle_"):]] = v bottle.route(instantiated_fn.will_fn_metadata["bottle_route"], **bottle_route_args)(instantiated_fn) bootstrapped = True - except Exception : + except Exception as e: self.startup_error("Error bootstrapping bottle", e) if bootstrapped: show_valid("Web server started at %s." % (settings.PUBLIC_URL,)) @@ -806,7 +806,7 @@ def bootstrap_io(self): self.io_threads.append(thread) show_valid("IO: %s Backend started." % cls.friendly_name) - except Exception : + except Exception as e: self.startup_error("Error bootstrapping %s io" % b, e) self.io_backends.append(b) @@ -835,7 +835,7 @@ def bootstrap_analysis(self): thread.start() self.analysis_threads.append(thread) show_valid("Analysis: %s Backend started." % cls.__name__) - except Exception : + except Exception as e: self.startup_error("Error bootstrapping %s io" % b, e) self.analysis_backends.append(b) @@ -864,7 +864,7 @@ def bootstrap_generation(self): thread.start() self.generation_threads.append(thread) show_valid("Generation: %s Backend started." % cls.__name__) - except Exception : + except Exception as e: self.startup_error("Error bootstrapping %s io" % b, e) self.generation_backends.append(b) @@ -923,7 +923,7 @@ def bootstrap_plugins(self): "parent_help_text": parent_help_text, "blacklisted": blacklisted, } - except Exception : + except Exception as e: self.startup_error("Error loading %s" % (module_path,), e) self.plugins = [] @@ -943,9 +943,9 @@ def bootstrap_plugins(self): "parent_help_text": plugin_modules_library[name]["parent_help_text"], "blacklisted": plugin_modules_library[name]["blacklisted"], }) - except Exception : + except Exception as e: self.startup_error("Error bootstrapping %s" % (class_name,), e) - except Exception : + except Exception as e: self.startup_error("Error bootstrapping %s" % (name,), e) self._plugin_modules_library = plugin_modules_library @@ -1067,7 +1067,7 @@ def bootstrap_plugins(self): # puts("- %s" % function_name) self.bottle_routes.append((plugin_info["class"], function_name)) - except Exception : + except Exception as e : error(plugin_name) self.startup_error( "Error bootstrapping %s.%s" % ( @@ -1081,7 +1081,7 @@ def bootstrap_plugins(self): warn(w) else: show_valid(plugin_name) - except Exception : + except Exception as e: self.startup_error("Error bootstrapping %s" % (plugin_info["class"],), e) puts("") diff --git a/will/plugins/friendly/hello.py b/will/plugins/friendly/hello.py index 1eb48b7b..0163549f 100644 --- a/will/plugins/friendly/hello.py +++ b/will/plugins/friendly/hello.py @@ -1,6 +1,14 @@ +import datetime +import random from will.plugin import WillPlugin from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings +THANKS_REPLIES = [ + "Thank you!", + "Aww, thanks!", + ":)", +] + class HelloPlugin(WillPlugin): @@ -16,3 +24,9 @@ def hello(self, message): @periodic(hour='10', minute='05', day=4, month=12) def birthday(self, message): self.reply("Hey, so I didn't want to make a big deal of it, but today's my birthday!") + + @hear("happy birthday") + def hear_happy_birthday(self, message): + today = datetime.datetime.today() + if today.month == 12 and (today.day == 4 or today.day == 5): + self.reply(random.choice(THANKS_REPLIES)) diff --git a/will/plugins/friendly/howareyou.py b/will/plugins/friendly/howareyou.py index 91c51523..01468557 100644 --- a/will/plugins/friendly/howareyou.py +++ b/will/plugins/friendly/howareyou.py @@ -22,5 +22,10 @@ def how_are_you(self, message): "day_name": now.strftime("%A") } reply = random.choice(RESPONSES) % context - + message.said_to_how_are_you = True self.say(reply, message=message) + + # @hear("") + # def how_are_you_reply(self, message): + # print(message.analysis["history"][0].data) + # print(message.analysis["history"][1].data) From a3dc61cbc35bf653320fd9c9e3c9af5de1d19e49 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 1 Nov 2017 18:17:07 +1300 Subject: [PATCH 081/200] Much better handling for startup when you're upgrading from Will v1 and hipchat --- will/backends/io_adapters/hipchat.py | 12 ++++-- will/backends/io_adapters/rocketchat.py | 2 +- will/main.py | 56 +++++++++++++++---------- will/mixins/settings.py | 11 ++--- 4 files changed, 50 insertions(+), 31 deletions(-) diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index 290888aa..16daf6c5 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -257,9 +257,15 @@ def start_xmpp_client(self, xmpp_bridge_queue=None, backend_name=""): } r = requests.get(my_user_url, **settings.REQUESTS_OPTIONS) resp = r.json() - settings.HIPCHAT_EMAIL = resp["email"] - settings.HIPCHAT_HANDLE = resp["mention_name"] - settings.HIPCHAT_NAME = resp["name"] + if "email" in resp: + settings.HIPCHAT_EMAIL = resp["email"] + settings.HIPCHAT_HANDLE = resp["mention_name"] + settings.HIPCHAT_NAME = resp["name"] + else: + raise EnvironmentError( + "\n\nError getting user info from Hipchat. This is usually a problem with the\n" + "username or V2 token, but here's what I heard back from them: \n\n %s\n\n" % resp + ) self.available_rooms for r in settings.HIPCHAT_ROOMS: diff --git a/will/backends/io_adapters/rocketchat.py b/will/backends/io_adapters/rocketchat.py index 554fdb86..69ad703f 100644 --- a/will/backends/io_adapters/rocketchat.py +++ b/will/backends/io_adapters/rocketchat.py @@ -22,7 +22,7 @@ class RocketChatBackend(IOBackend, StorageMixin): - friendly_name = "RocketChat (BETA)" + friendly_name = "RocketChat" internal_name = "will.backends.io_adapters.rocketchat" required_settings = [ { diff --git a/will/main.py b/will/main.py index a39a674a..73ee03a4 100644 --- a/will/main.py +++ b/will/main.py @@ -237,6 +237,7 @@ def verify_io(self): missing_settings = False missing_setting_error_messages = [] one_valid_backend = False + self.valid_io_backends = [] if not hasattr(settings, "IO_BACKENDS"): settings.IO_BACKENDS = ["will.backends.io_adapters.shell", ] @@ -250,7 +251,6 @@ def verify_io(self): path_name = [path_name] file_name, path_name, description = imp.find_module(mod, path_name) - one_valid_backend = True # show_valid("%s" % b) module = import_module(b) for class_name, cls in inspect.getmembers(module, predicate=inspect.isclass): @@ -263,6 +263,14 @@ def verify_io(self): c = cls() show_valid(c.friendly_name) c.verify_settings() + one_valid_backend = True + self.valid_io_backends.append(b) + except EnvironmentError as e: + puts(colored.red(" ✗ %s is missing settings, and will be disabled." % b)) + puts() + + missing_settings = True + except Exception as e: error_message = ( "IO backend %s is missing. Please either remove it \nfrom config.py " @@ -276,7 +284,7 @@ def verify_io(self): missing_setting_error_messages.append(error_message) missing_settings = True - if missing_settings or not one_valid_backend: + if missing_settings and not one_valid_backend: puts("") error( "Unable to find a valid IO backend - will has no way to talk " @@ -486,7 +494,8 @@ def verify_plugin_settings(self): def handle_sys_exit(self, *args, **kwargs): # if not self.exiting: try: - print('\n\nReceived keyboard interrupt, quitting threads.',) + sys.stdout.write("\n\nReceived shutdown, quitting threads.") + sys.stdout.flush() self.exiting = True if "WILL_EPHEMERAL_SECRET_KEY" in os.environ: @@ -514,23 +523,26 @@ def handle_sys_exit(self, *args, **kwargs): self.publish("system.terminate", {}) - for t in self.analysis_threads: - try: - t.terminate() - except KeyboardInterrupt: - pass + if hasattr(self, "analysis_threads") and self.analysis_threads: + for t in self.analysis_threads: + try: + t.terminate() + except KeyboardInterrupt: + pass - for t in self.generation_threads: - try: - t.terminate() - except KeyboardInterrupt: - pass + if hasattr(self, "generation_threads") and self.generation_threads: + for t in self.generation_threads: + try: + t.terminate() + except KeyboardInterrupt: + pass - for t in self.running_execution_threads: - try: - t.terminate() - except KeyboardInterrupt: - pass + if hasattr(self, "running_execution_threads") and self.running_execution_threads: + for t in self.running_execution_threads: + try: + t.terminate() + except KeyboardInterrupt: + pass except: print("\n\n\nException while exiting!!") import traceback @@ -538,9 +550,9 @@ def handle_sys_exit(self, *args, **kwargs): sys.exit(1) while ( - (self.scheduler_thread and self.scheduler_thread.is_alive()) or - (self.bottle_thread and self.bottle_thread.is_alive()) or - (self.incoming_event_thread and self.incoming_event_thread.is_alive()) or + (hasattr(self, "scheduler_thread") and self.scheduler_thread and self.scheduler_thread and self.scheduler_thread.is_alive()) or + (hasattr(self, "scheduler_thread") and self.scheduler_thread and self.bottle_thread and self.bottle_thread.is_alive()) or + (hasattr(self, "scheduler_thread") and self.scheduler_thread and self.incoming_event_thread and self.incoming_event_thread.is_alive()) or # self.stdin_listener_thread.is_alive() or any([t.is_alive() for t in self.io_threads]) or any([t.is_alive() for t in self.analysis_threads]) or @@ -775,7 +787,7 @@ def bootstrap_io(self): self.io_backends = [] self.io_threads = [] self.stdin_io_backends = [] - for b in settings.IO_BACKENDS: + for b in self.valid_io_backends: module = import_module(b) for class_name, cls in inspect.getmembers(module, predicate=inspect.isclass): try: diff --git a/will/mixins/settings.py b/will/mixins/settings.py index d98457e8..94a3cfd9 100644 --- a/will/mixins/settings.py +++ b/will/mixins/settings.py @@ -24,12 +24,13 @@ def verify_settings(self, quiet=False): else: meta["friendly_name"] = self.__class__.__name__ if not quiet: - error("%(name)s is missing. It's required by the %(friendly_name)s backend." % meta) with indent(2): - error_message = ( - "To obtain a %(name)s: \n%(obtain_at)s" - ) % meta - puts(error_message) + error("%(name)s is missing. It's required by the %(friendly_name)s backend." % meta) + with indent(2): + error_message = ( + "To obtain a %(name)s: \n%(obtain_at)s" + ) % meta + puts(error_message) passed = False # raise Exception(error_message) else: From 6a6ff809c8ca385f77ca1d91a46bc748e2f1170c Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 1 Nov 2017 18:22:11 +1300 Subject: [PATCH 082/200] Adds default settings for Fuzziness. --- will/settings.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/will/settings.py b/will/settings.py index 62684090..bd85da31 100644 --- a/will/settings.py +++ b/will/settings.py @@ -397,6 +397,12 @@ def import_settings(quiet=True): os.environ["WILL_SECRET_KEY"] = settings["SECRET_KEY"] os.environ["WILL_EPHEMERAL_SECRET_KEY"] = "True" + if "FUZZY_MINIMUM_MATCH_CONFIDENCE" not in settings: + settings["FUZZY_MINIMUM_MATCH_CONFIDENCE"] = 90 + if "FUZZY_REGEX_ALLOWABLE_ERRORS" not in settings: + settings["FUZZY_REGEX_ALLOWABLE_ERRORS"] = 3 + + # Set them in the module namespace for k in sorted(settings, key=lambda x: x[0]): if not quiet: From 2072d492ee969a337d1bc6a826f2f9ddcc383a51 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 1 Nov 2017 22:41:06 +1300 Subject: [PATCH 083/200] Fixes pep8 --- setup.py | 5 ++--- will/settings.py | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index afb10a29..ad1dadcc 100755 --- a/setup.py +++ b/setup.py @@ -26,13 +26,12 @@ or line.startswith("#") ): continue - + if "-e" in line: line = line.replace("-e", "") dependency_links.append(line) line = line.split("#")[-1].split("=")[-1] - - print line.strip() + install_requires.append(line.strip()) diff --git a/will/settings.py b/will/settings.py index bd85da31..a82f0e51 100644 --- a/will/settings.py +++ b/will/settings.py @@ -402,7 +402,6 @@ def import_settings(quiet=True): if "FUZZY_REGEX_ALLOWABLE_ERRORS" not in settings: settings["FUZZY_REGEX_ALLOWABLE_ERRORS"] = 3 - # Set them in the module namespace for k in sorted(settings, key=lambda x: x[0]): if not quiet: From 8677a6edc8cc45425175c1ce96216b3944d1f471 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 2 Nov 2017 11:26:45 +1300 Subject: [PATCH 084/200] Documentation time! --- docs/index.md | 2 +- docs/platforms/ubuntu.md | 129 ++++++++++++++++ docs/platforms/upgrading.md | 131 ++++++++++++++++ will/scripts/config.py.dist | 17 +-- will/scripts/generate_will_project.py | 210 ++++++++++++++------------ will/settings.py | 20 +++ 6 files changed, 403 insertions(+), 106 deletions(-) create mode 100644 docs/platforms/ubuntu.md create mode 100644 docs/platforms/upgrading.md diff --git a/docs/index.md b/docs/index.md index 3cd174c2..b06f0b3f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -115,7 +115,7 @@ Eventually, you'll reach this screen of joy. Now, it's time to play! #### Testing will out -Once your will is up and running, hop into any of your hipchat rooms, and say hello! +Once your will is up and running, hop into any of your chat rooms, and say hello! `@will hi` diff --git a/docs/platforms/ubuntu.md b/docs/platforms/ubuntu.md new file mode 100644 index 00000000..3cd174c2 --- /dev/null +++ b/docs/platforms/ubuntu.md @@ -0,0 +1,129 @@ +Will's smiling face + + +# Meet Will + +Will is the friendliest, easiest-to-teach bot you've ever used. He works on hipchat, in rooms and 1-1 chats. + +He makes teaching your chat bot this simple: + +``` +@respond_to("hi") +def say_hello(self, message): + self.say("oh, hello!") +``` + +Lots of batteries are included, and you can get your own will up and running in a couple of minutes. + +Will started by [Steven Skoczen](http://www.inkandfeet.com), and has been [contributed to by lots of folks](improve.md#shoulders). + +Check out the quickstart below! + +
+ +# Quickstart + +Here's how to set up your system and get will running. If you already write python, it'll probably take less than 5 minutes. + +--- + +## Install prerequisites + +Will doesn't need much, just python and a place to store things. + +Will can store stuff in Redis, Couchbase, or local storage. Our recommended backend is redis, and we'll describe getting it set up below. [Information on using Couchbase or local storage is here](deploy.md#Storage-Backends). + +#### Install redis > 2.4 + +Official documentation is at [redis.io](http://redis.io/). + +If you're on Mac OS X, and using [homebrew](http://brew.sh/), you can simply: + +```bash +brew install redis +``` + +On a Redhat (RHEL, Centos, Fedora) machine you can: + +```bash +sudo yum install redis +sudo service redis enable +sudo service redis start +``` + +On a Debian (Ubuntu, Mint, KNOPPIX) machine to properly install follow the [Redis Quickstart](http://redis.io/topics/quickstart). But you can start more quickly with: + +```bash +sudo apt-get install redis-server +redis-server +``` + +#### Install python > 2.6 + +Most modern operating systems (Mac OS X, Linux, BSDs, etc) ship with python installed, but if you don't have it, all the info is at [python.org](https://www.python.org/). + +#### Install virtualenv + +Virtualenv is a tool that lets you keep different python projects separate. It is highly recommended for will (and all other python development!) + +The python guide has [a great tutorial on virtualenv](http://docs.python-guide.org/en/latest/dev/virtualenvs/), if you don't already have it running. I'd recommend installing the excellent `virtualenvwrapper` library it mentions as well. + +#### Set up a virtualenv for will + +If you are using virtualenv wrapper: + +```bash +$ mkproject my_will +# ... some output, setting up the virtualenv +$ workon my_will +(my_will) $ +``` + +You're now all ready to install will! + + + +## Get will running locally + +#### Setting up the project + +Installing will is simple easy. Ready? Go! + +From your virtualenv and the folder you want to set up your will in, + +```bash +(my_will) $ pip install will +# ... output from a bunch of pip libraries installing + +(my_will) $ generate_will_project +# ... output from will making your new project + +(my_will) $ ./run_will.py +# .. the magic begins +``` + +That's it! + +Note that the first time you run, you'll probably be missing some configuration. That's OK - `run_will` will check your environment, and walk you through getting and setting any necessary config. We'll go through the nitty-gritty later, but if you have any odd setup problems, look in `config.py` - that's where all of the non-sensitive data is stored. + +![Uninitialized Environment output](img/uninitialized_env.gif) +This is totally normal output. + +Eventually, you'll reach this screen of joy. Now, it's time to play! + +![Screen of Joy](img/screen_of_joy.gif) + +#### Testing will out + +Once your will is up and running, hop into any of your hipchat rooms, and say hello! + +`@will hi` + +![Hi, Will](img/hi.gif) + +`@will help` + +![Help, will](img/help.gif) + +You're up and running - now it's time to [teach your will a few things](plugins/basics.md)! + diff --git a/docs/platforms/upgrading.md b/docs/platforms/upgrading.md new file mode 100644 index 00000000..03efc4a3 --- /dev/null +++ b/docs/platforms/upgrading.md @@ -0,0 +1,131 @@ +# Upgrading from Will 1.0 + +Will 2.0 is finally here, and its main goal was to free people using Will from being locked into a single chat provider, and add some more flexibility to his brain. You can read the [release announcement](https://heywill.io/will2) for a bit more context! + +While Will has picked up a bunch of features and improvements in 2.0, we've aimed to keep him backwards-compatable with 1.x and 0.x releases. If you weren't using any undocumented internal methods, upgrading should be as easy as: + +``` +pip install --upgrade will +``` + +From there, you can just `./run_will.py`, and things should Just Work. + +You will, however, see a lot of output from Will, telling you that some names have changed, and asking you to update them in your config.py when you have time. You can either just follow those instructions, or the guide below. + +## Updating your settings to Will 2 + +There are two big changes in the settings from Will 1 to Will 2, and both come from the fact that will now supports multiple chat backends. + +### 1. Move to the new IO_BACKENDS syntax + +If you're just planning to continue using HipChat, we'd recommend that you add this to your config.py: + +IO_BACKENDS = " + "will.backends.io_adapters.hipchat", + "will.backends.io_adapters.shell", +# "will.backends.io_adapters.slack", +# "will.backends.io_adapters.rocketchat", +] + +That will enable the HipChat and local shell stdin/stdout backend, for easy testing. If you want to also bring Will into a Slack or Rocket.Chat room in the future, just uncomment the backend! + +### 2. Update the HipChat tokens to be namespaced. + +You'll see this starting up, but when you have time, update your tokens as follows: (If you're using `WILL_` environment variables, please add the `WILL_` as needed:) + +`USERNAME` becomes `HIPCHAT_USERNAME` + +`TOKEN` becomes `HIPCHAT_V1_TOKEN` + +`V2_TOKEN` becomes `HIPCHAT_V2_TOKEN` + +`DEFAULT_ROOM` becomes `HIPCHAT_DEFAULT_ROOM` + +`HANDLE` should be removed, as it's now pulled live from the HipChat servers and not used. + +`NAME` should be removed, as it's now pulled live from the HipChat servers and not used. + +`PASSWORD` becomes `HIPCHAT_PASSWORD` + +`ROOMS` becomes `HIPCHAT_ROOMS` + + +### 3. If you're not using redis for storage, set it up for the pubsub backend. + +At the moment, Redis is the only working pubsub backend, though ZeroMQ support is in the works, and we're looking to add a pure-python backend shortly. + + +### 4. Set SECRET_KEY. + +Will now encrypts all messages on the pubsub wire and in storage by default. Without a SECRET_KEY set, he'll auto-generate one based on the machine MAC address, but this isn't a perfect solution, and will mean that he can't access his storage if there are hardware changes (or he's running in a virtualized environment.) + +Please set `SECRET_KEY` as soon as possible. + +The recommended way is to set it as an environmental variable, `WILL_SECRET_KEY`, in an environment that is secured and you trust. Any string will work, and entropy is good. + + +### 5. Set the new, Will 2.0 configuration and settings to your liking. + +Will 2 ships with bunch of new features, and though we've provided sensible defaults, if you'd like, you can update your `config.py` with your preferences. + +The simplest way to see everything is to have Will generate a `config.py.dist` that you can use for comparison: + +`generate_will_project --config_dist_only` + +It's worth reading through the new `config.py`, but here's a few areas specifically worth a look: + +#### Platform and Decision-making + +As mentioned above, there are now multiple IO mediums and platforms that Will can communicate on (and more are coming soon). Here's all the options + +``` +IO_BACKENDS = [ + "will.backends.io_adapters.slack", + "will.backends.io_adapters.hipchat", + "will.backends.io_adapters.rocketchat", + "will.backends.io_adapters.shell", +] +``` + + +Will 2 also comes with pluggable brains - split into Analysis, Generation, and Execution backends. The defaults are solid and behave similarly to Will 1.0 (the only difference is a high-confidence fuzzy matching engine), but if you're interested in making your Will more flexible, or adding more context to his responses, building custom backends is easy. + +Here's all of the options, with the defaults uncommented. It's worth pulling this into your `config.py`. + +``` +# Backends to analyze messages and generate useful metadata +ANALYZE_BACKENDS = [ + "will.backends.analysis.nothing", + "will.backends.analysis.history", +] + +# Backends to generate possible actions, and metadata about them. +GENERATION_BACKENDS = [ + # "will.backends.generation.fuzzy_best_match", + "will.backends.generation.fuzzy_all_matches", + "will.backends.generation.strict_regex", +] + +# The "decision making" backends that look among the generated choices, +# and decide which to follow. Backends are executed in order, and any +# backend can stop further evaluation. +EXECUTION_BACKENDS = [ + "will.backends.execution.best_score", + # "will.backends.execution.all", +] +``` + +There are also a few settings to tweak things like the fuzzy logic. These have sensible defaults, but you can tweak them to your liking. + +``` +# Confidence fuzzy generation backends require before Will responds +# https://pypi.python.org/pypi/fuzzywuzzy +FUZZY_MINIMUM_MATCH_CONFIDENCE = 90 # Defaults to 90% +FUZZY_REGEX_ALLOWABLE_ERRORS = 3 +``` + +### That's it - let us know how it goes! + +That's all you really need to know to flip the switch to Will 2.0. As there's a lot of new stuff in this release, it's possible that some bugs have slipped through the cracks. Please submit anything you find, no matter how small, [into the github issue tracker](https://github.com/skoczen/will/issues). We'll be active in fixing things ASAP and helping if you're stuck. + +Thanks for using Will, and for going through the big upgrade! We're excited about what the future holds, and happy to get your bots free from platform lock-in. \ No newline at end of file diff --git a/will/scripts/config.py.dist b/will/scripts/config.py.dist index b23a2605..89c0b31d 100644 --- a/will/scripts/config.py.dist +++ b/will/scripts/config.py.dist @@ -67,6 +67,13 @@ PLUGIN_BLACKLIST = [ "will.plugins.devops.pagerduty", # Because it requires a PAGERDUTY_SUBDOMAIN and PAGERDUTY_API_KEY key ] +# A secret key, used to namespace this instance of will and secure pubsub contents. +# Do *NOT* keep it in config.py. *DO* set it in the environment as WILL_SECRET_KEY, +# in a secured session. If a SECRET_KEY is not set, one will be auto-generated, +# but it may limit Will to reading data from this excecution only, and may not work +# on virtualized machines, or machines with many or changing MAC addresses +# SECRET_KEY = "DXQnJ2eHD6k2w3DvBTstN6kw9d9N4CeCLbjoK" + # ------------------------------------------------------------------------------------ # Platform and Decision-making # ------------------------------------------------------------------------------------ @@ -201,14 +208,6 @@ FUZZY_REGEX_ALLOWABLE_ERRORS = 3 # Increasing the value will make will slower, but consume fewer resources. # EVENT_LOOP_INTERVAL = 0.025 -# A secret key, used to namespace this instance of will and secure pubsub contents. -# Do *NOT* keep it in config.py. *DO* set it in the environment as WILL_SECRET_KEY, -# in a secured session. If a SECRET_KEY is not set, one will be auto-generated, -# but it may limit Will to reading data from this excecution only, and may not work -# on virtualized machines, or machines with many or changing MAC addresses -# SECRET_KEY = "DXQnJ2eHD6k2w3DvBTstN6kw9d9N4CeCLbjoK" - - # Turn up or down Will's logging level # LOGLEVEL = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL # LOGLEVEL = "DEBUG" @@ -218,7 +217,7 @@ FUZZY_REGEX_ALLOWABLE_ERRORS = 3 # Turn on/off encryption in pub/sub and storage (default is on). # Causes a small speed bump, but secures messages in an untrusted environment. -# ENABLE_INTERNAL_ENCRYPTION = False +# ENABLE_INTERNAL_ENCRYPTION = True # ENCRYPTION_BACKEND = "aes" # Mailgun config, if you'd like will to send emails. diff --git a/will/scripts/generate_will_project.py b/will/scripts/generate_will_project.py index 27f6815c..39792159 100644 --- a/will/scripts/generate_will_project.py +++ b/will/scripts/generate_will_project.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +import argparse import os import stat import sys @@ -10,6 +11,14 @@ sys.path.append(PROJECT_ROOT) sys.path.append(os.getcwd()) +parser = argparse.ArgumentParser() +parser.add_argument( + '--config-dist-only', + action='store_true', + help='Only output a config.py.dist.' +) +args = parser.parse_args() + class EmptyObj(object): pass @@ -34,83 +43,89 @@ def main(): puts("Welcome to the will project generator.") puts("") - print("\nGenerating will scaffold...") + if args.config_dist_only: + print("Generating config.py.dist...") + + else: + print("\nGenerating will scaffold...") current_dir = os.getcwd() plugins_dir = os.path.join(current_dir, "plugins") templates_dir = os.path.join(current_dir, "templates") - print(" /plugins") - # Set up the directories - if not os.path.exists(plugins_dir): - os.makedirs(plugins_dir) - - print(" __init__.py") - # Create the plugins __init__.py - with open(os.path.join(plugins_dir, "__init__.py"), 'w+') as f: - pass - - print(" morning.py") - # Create the morning plugin - morning_file_path = os.path.join(plugins_dir, "morning.py") - if not os.path.exists(morning_file_path): - with open(morning_file_path, 'w+') as f: - f.write("""from will.plugin import WillPlugin -from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings - - -class MorningPlugin(WillPlugin): - - @respond_to("^good morning") - def good_morning(self, message): - self.reply("oh, g'morning!") - """) - - print(" /templates") - if not os.path.exists(templates_dir): - os.makedirs(templates_dir) - - print(" blank.html") - # Create the plugins __init__.py - with open(os.path.join(templates_dir, "blank.html"), 'w+') as f: - pass - - print(" .gitignore") - # Create .gitignore, or at least add shelf.db - gitignore_path = os.path.join(current_dir, ".gitignore") - if not os.path.exists(gitignore_path): - with open(gitignore_path, 'w+') as f: - f.write("""*.py[cod] -pip-log.txt -shelf.db - """) - else: - append_ignore = False - with open(gitignore_path, "r+") as f: - if "shelf.db" not in f.read(): - append_ignore = True - if append_ignore: - with open(gitignore_path, "a") as f: - f.write("\nshelf.db\n") - - # Create run_will.py - print(" run_will.py") - run_will_path = os.path.join(current_dir, "run_will.py") - if not os.path.exists(run_will_path): - with open(run_will_path, 'w+') as f: - f.write("""#!/usr/bin/env python -from will.main import WillBot - -if __name__ == '__main__': - bot = WillBot() - bot.bootstrap() - """) - # And make it executable - st = os.stat('run_will.py') - os.chmod("run_will.py", st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) + if not args.config_dist_only: + print(" /plugins") + # Set up the directories + if not os.path.exists(plugins_dir): + os.makedirs(plugins_dir) + + print(" __init__.py") + # Create the plugins __init__.py + with open(os.path.join(plugins_dir, "__init__.py"), 'w+') as f: + pass + + print(" morning.py") + # Create the morning plugin + morning_file_path = os.path.join(plugins_dir, "morning.py") + if not os.path.exists(morning_file_path): + with open(morning_file_path, 'w+') as f: + f.write("""from will.plugin import WillPlugin + from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings + + + class MorningPlugin(WillPlugin): + + @respond_to("^good morning") + def good_morning(self, message): + self.reply("oh, g'morning!") + """) + + print(" /templates") + if not os.path.exists(templates_dir): + os.makedirs(templates_dir) + + print(" blank.html") + # Create the plugins __init__.py + with open(os.path.join(templates_dir, "blank.html"), 'w+') as f: + pass + + print(" .gitignore") + # Create .gitignore, or at least add shelf.db + gitignore_path = os.path.join(current_dir, ".gitignore") + if not os.path.exists(gitignore_path): + with open(gitignore_path, 'w+') as f: + f.write("""*.py[cod] + pip-log.txt + shelf.db + """) + else: + append_ignore = False + with open(gitignore_path, "r+") as f: + if "shelf.db" not in f.read(): + append_ignore = True + if append_ignore: + with open(gitignore_path, "a") as f: + f.write("\nshelf.db\n") + + # Create run_will.py + print(" run_will.py") + run_will_path = os.path.join(current_dir, "run_will.py") + if not os.path.exists(run_will_path): + with open(run_will_path, 'w+') as f: + f.write("""#!/usr/bin/env python + from will.main import WillBot + + if __name__ == '__main__': + bot = WillBot() + bot.bootstrap() + """) + # And make it executable + st = os.stat('run_will.py') + os.chmod("run_will.py", st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) # Create config.py - print(" config.py.dist") + print(" config.py.dist") + config_path = os.path.join(current_dir, "config.py.dist") if not os.path.exists(config_path): with open(config_path, "w+") as f: @@ -118,32 +133,35 @@ def good_morning(self, message): config = source_f.read() f.write(config) - print(" requirements.txt") - # Create requirements.txt - requirements_path = os.path.join(current_dir, "requirements.txt") - if not os.path.exists(requirements_path): - with open(requirements_path, 'w+') as f: - f.write("will") - - print(" Procfile") - # Create Procfile - requirements_path = os.path.join(current_dir, "Procfile") - if not os.path.exists(requirements_path): - with open(requirements_path, 'w+') as f: - f.write("web: python run_will.py") - - print(" README.md") - # Create the readme - readme_path = os.path.join(current_dir, "README.md") - if not os.path.exists(readme_path): - with open(readme_path, 'w+') as f: - f.write(""" -This is our bot, a [will](https://github.com/skoczen/will) bot. -""") - - print("\nDone.") - - print("\n Your will is now ready to go. Run ./run_will.py to get started!") + if not args.config_dist_only: + print(" requirements.txt") + # Create requirements.txt + requirements_path = os.path.join(current_dir, "requirements.txt") + if not os.path.exists(requirements_path): + with open(requirements_path, 'w+') as f: + f.write("will") + + print(" Procfile") + # Create Procfile + requirements_path = os.path.join(current_dir, "Procfile") + if not os.path.exists(requirements_path): + with open(requirements_path, 'w+') as f: + f.write("web: python run_will.py") + + print(" README.md") + # Create the readme + readme_path = os.path.join(current_dir, "README.md") + if not os.path.exists(readme_path): + with open(readme_path, 'w+') as f: + f.write(""" + This is our bot, a [will](https://github.com/skoczen/will) bot. + """) + + print("\nDone.") + + print("\n Your will is now ready to go. Run ./run_will.py to get started!") + else: + print("\nCreated a config.py.dist. Open it up to see what's new!\n") if __name__ == '__main__': diff --git a/will/settings.py b/will/settings.py index a82f0e51..ce5314b0 100644 --- a/will/settings.py +++ b/will/settings.py @@ -162,6 +162,22 @@ def import_settings(quiet=True): "\n CHAT_BACKENDS = %s\n to\n IO_BACKENDS = %s" % (settings["CHAT_BACKENDS"], IO_BACKENDS) ) + if "CHAT_BACKENDS" not in settings and "IO_BACKENDS" not in settings: + if not quiet: + warn("""Deprecated settings. No backend found, so we're defaulting to hipchat and shell only. +Please add this to your config.py: +IO_BACKENDS = " + "will.backends.io_adapters.hipchat", + "will.backends.io_adapters.shell", +# "will.backends.io_adapters.slack", +# "will.backends.io_adapters.rocketchat", +] +""") + settings["IO_BACKENDS"] = [ + "will.backends.io_adapters.hipchat", + "will.backends.io_adapters.shell", + ] + if "ANALYZE_BACKENDS" not in settings: if not quiet: note("No ANALYZE_BACKENDS specified. Defaulting to history only.") @@ -267,9 +283,13 @@ def import_settings(quiet=True): settings["HTTPSERVER_PORT"] = "80" if "STORAGE_BACKEND" not in settings: + if not quiet: + warn("No STORAGE_BACKEND specified. Defaulting to redis.") settings["STORAGE_BACKEND"] = "redis" if "PUBSUB_BACKEND" not in settings: + if not quiet: + warn("No PUBSUB_BACKEND specified. Defaulting to redis.") settings["PUBSUB_BACKEND"] = "redis" if settings["STORAGE_BACKEND"] == "redis" or settings["PUBSUB_BACKEND"] == "redis": From 1df67744c0f49ca9ac752a8d9a684b008651cb07 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 2 Nov 2017 13:21:53 +1300 Subject: [PATCH 085/200] req cleanup --- requirements/base.txt | 6 +++--- requirements/slack.txt | 4 +++- will/__init__.py | 2 +- will/scripts/generate_will_project.py | 28 +++++++++++++-------------- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index a8a48643..da4c7194 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -9,9 +9,9 @@ fuzzywuzzy==0.15.1 Jinja2==2.7.3 Markdown==2.3.1 MarkupSafe==0.23 -# Temporary fork of natural, until python 3 support is merged: https://github.com/tehmaze/natural/pull/11 -# natural==0.1.5 --e git+https://github.com/heywill/natural#egg=natural +# Temporary fork of natural, until python 3 support is merged: https://github.com/tehmaze/natural/pull/13 +# natural==0.2.1 +git+git://github.com/heywill/natural/@feature/will-2.0#egg=natural parsedatetime==1.1.2 python-Levenshtein==0.12.0 pyasn1-modules==0.0.5 diff --git a/requirements/slack.txt b/requirements/slack.txt index 22b6e121..1db40fc5 100644 --- a/requirements/slack.txt +++ b/requirements/slack.txt @@ -2,4 +2,6 @@ slackclient>=1.0.5<1.1.0 # Until https://github.com/matthewwithanm/python-markdownify/pull/1 is merged: # markdownify>=0.4.0<0.5.0 --e git+https://github.com/heywill/python-markdownify@develop#egg=markdownify +# markdownify==0.4.1-will +-e git+git://github.com/heywill/python-markdownify/@feature/will-2.0#egg=markdownify + diff --git a/will/__init__.py b/will/__init__.py index 52bac6fd..1990bef4 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "2.0.1-beta" +VERSION = "2.0.1-beta1" diff --git a/will/scripts/generate_will_project.py b/will/scripts/generate_will_project.py index 39792159..9b59cad0 100644 --- a/will/scripts/generate_will_project.py +++ b/will/scripts/generate_will_project.py @@ -70,15 +70,15 @@ def main(): if not os.path.exists(morning_file_path): with open(morning_file_path, 'w+') as f: f.write("""from will.plugin import WillPlugin - from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings +from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings - class MorningPlugin(WillPlugin): +class MorningPlugin(WillPlugin): - @respond_to("^good morning") - def good_morning(self, message): - self.reply("oh, g'morning!") - """) + @respond_to("^good morning") + def good_morning(self, message): + self.reply("oh, g'morning!") +""") print(" /templates") if not os.path.exists(templates_dir): @@ -95,8 +95,8 @@ def good_morning(self, message): if not os.path.exists(gitignore_path): with open(gitignore_path, 'w+') as f: f.write("""*.py[cod] - pip-log.txt - shelf.db +pip-log.txt +shelf.db """) else: append_ignore = False @@ -113,12 +113,12 @@ def good_morning(self, message): if not os.path.exists(run_will_path): with open(run_will_path, 'w+') as f: f.write("""#!/usr/bin/env python - from will.main import WillBot +from will.main import WillBot - if __name__ == '__main__': - bot = WillBot() - bot.bootstrap() - """) +if __name__ == '__main__': + bot = WillBot() + bot.bootstrap() +""") # And make it executable st = os.stat('run_will.py') os.chmod("run_will.py", st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) @@ -154,7 +154,7 @@ def good_morning(self, message): if not os.path.exists(readme_path): with open(readme_path, 'w+') as f: f.write(""" - This is our bot, a [will](https://github.com/skoczen/will) bot. +This is our bot, a [will](https://github.com/skoczen/will) bot. """) print("\nDone.") From 82ebed051cec8e05dbf5a16f551c0ea82444b7e5 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 2 Nov 2017 14:16:34 +1300 Subject: [PATCH 086/200] Moves to temporary forks --- requirements/base.txt | 2 +- requirements/slack.txt | 3 +-- setup.py | 6 ++++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index da4c7194..7efe69b0 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -11,7 +11,7 @@ Markdown==2.3.1 MarkupSafe==0.23 # Temporary fork of natural, until python 3 support is merged: https://github.com/tehmaze/natural/pull/13 # natural==0.2.1 -git+git://github.com/heywill/natural/@feature/will-2.0#egg=natural +will-natural==0.2.1.1 parsedatetime==1.1.2 python-Levenshtein==0.12.0 pyasn1-modules==0.0.5 diff --git a/requirements/slack.txt b/requirements/slack.txt index 1db40fc5..9b930f77 100644 --- a/requirements/slack.txt +++ b/requirements/slack.txt @@ -2,6 +2,5 @@ slackclient>=1.0.5<1.1.0 # Until https://github.com/matthewwithanm/python-markdownify/pull/1 is merged: # markdownify>=0.4.0<0.5.0 -# markdownify==0.4.1-will --e git+git://github.com/heywill/python-markdownify/@feature/will-2.0#egg=markdownify +will-markdownify==0.4.0 diff --git a/setup.py b/setup.py index ad1dadcc..abfaf4a2 100755 --- a/setup.py +++ b/setup.py @@ -85,6 +85,12 @@ "Topic :: Internet :: WWW/HTTP", "Topic :: Communications :: Chat", "Topic :: Software Development :: Libraries :: Python Modules", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + "Framework :: Robot Framework", + "Framework :: Robot Framework :: Library", + "Framework :: Robot Framework :: Tool", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 3", ], entry_points={ 'console_scripts': ['generate_will_project = will.scripts.generate_will_project:main'], From c46eec5f7dabb88d84cce317e83110b082576e7e Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 2 Nov 2017 14:46:20 +1300 Subject: [PATCH 087/200] Adds upgrade to 2.x docs --- docs/index.md | 4 +- docs/platforms/upgrading.md | 20 ++-- docs/themes/will/{base.html => main.html} | 0 docs/upgrading_to_2.md | 133 ++++++++++++++++++++++ mkdocs.yml | 12 ++ 5 files changed, 157 insertions(+), 12 deletions(-) rename docs/themes/will/{base.html => main.html} (100%) create mode 100644 docs/upgrading_to_2.md diff --git a/docs/index.md b/docs/index.md index b06f0b3f..1042b4f1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,7 +3,7 @@ # Meet Will -Will is the friendliest, easiest-to-teach bot you've ever used. He works on hipchat, in rooms and 1-1 chats. +Will is the friendliest, easiest-to-teach bot you've ever used. He works on Slack, HipChat, Rocket.Chat, and more. He makes teaching your chat bot this simple: @@ -23,6 +23,8 @@ Check out the quickstart below! # Quickstart +**Upgrading from Will 1.x or 0.x? [Check out the Upgrade Guide](/platforms/upgrading/).** + Here's how to set up your system and get will running. If you already write python, it'll probably take less than 5 minutes. --- diff --git a/docs/platforms/upgrading.md b/docs/platforms/upgrading.md index 03efc4a3..a0c23926 100644 --- a/docs/platforms/upgrading.md +++ b/docs/platforms/upgrading.md @@ -12,24 +12,22 @@ From there, you can just `./run_will.py`, and things should Just Work. You will, however, see a lot of output from Will, telling you that some names have changed, and asking you to update them in your config.py when you have time. You can either just follow those instructions, or the guide below. -## Updating your settings to Will 2 - -There are two big changes in the settings from Will 1 to Will 2, and both come from the fact that will now supports multiple chat backends. - -### 1. Move to the new IO_BACKENDS syntax +## 1. Move to the new IO_BACKENDS syntax If you're just planning to continue using HipChat, we'd recommend that you add this to your config.py: +``` IO_BACKENDS = " "will.backends.io_adapters.hipchat", "will.backends.io_adapters.shell", # "will.backends.io_adapters.slack", # "will.backends.io_adapters.rocketchat", ] +``` That will enable the HipChat and local shell stdin/stdout backend, for easy testing. If you want to also bring Will into a Slack or Rocket.Chat room in the future, just uncomment the backend! -### 2. Update the HipChat tokens to be namespaced. +## 2. Update the HipChat tokens to be namespaced. You'll see this starting up, but when you have time, update your tokens as follows: (If you're using `WILL_` environment variables, please add the `WILL_` as needed:) @@ -50,12 +48,12 @@ You'll see this starting up, but when you have time, update your tokens as follo `ROOMS` becomes `HIPCHAT_ROOMS` -### 3. If you're not using redis for storage, set it up for the pubsub backend. +## 3. If you're not using redis for storage, set it up for the pubsub backend. At the moment, Redis is the only working pubsub backend, though ZeroMQ support is in the works, and we're looking to add a pure-python backend shortly. -### 4. Set SECRET_KEY. +## 4. Set SECRET_KEY. Will now encrypts all messages on the pubsub wire and in storage by default. Without a SECRET_KEY set, he'll auto-generate one based on the machine MAC address, but this isn't a perfect solution, and will mean that he can't access his storage if there are hardware changes (or he's running in a virtualized environment.) @@ -64,7 +62,7 @@ Please set `SECRET_KEY` as soon as possible. The recommended way is to set it as an environmental variable, `WILL_SECRET_KEY`, in an environment that is secured and you trust. Any string will work, and entropy is good. -### 5. Set the new, Will 2.0 configuration and settings to your liking. +## 5. Set the new, Will 2.0 configuration and settings to your liking. Will 2 ships with bunch of new features, and though we've provided sensible defaults, if you'd like, you can update your `config.py` with your preferences. @@ -74,7 +72,7 @@ The simplest way to see everything is to have Will generate a `config.py.dist` t It's worth reading through the new `config.py`, but here's a few areas specifically worth a look: -#### Platform and Decision-making +### Platform and Decision-making As mentioned above, there are now multiple IO mediums and platforms that Will can communicate on (and more are coming soon). Here's all the options @@ -124,7 +122,7 @@ FUZZY_MINIMUM_MATCH_CONFIDENCE = 90 # Defaults to 90% FUZZY_REGEX_ALLOWABLE_ERRORS = 3 ``` -### That's it - let us know how it goes! +## That's it - let us know how it goes! That's all you really need to know to flip the switch to Will 2.0. As there's a lot of new stuff in this release, it's possible that some bugs have slipped through the cracks. Please submit anything you find, no matter how small, [into the github issue tracker](https://github.com/skoczen/will/issues). We'll be active in fixing things ASAP and helping if you're stuck. diff --git a/docs/themes/will/base.html b/docs/themes/will/main.html similarity index 100% rename from docs/themes/will/base.html rename to docs/themes/will/main.html diff --git a/docs/upgrading_to_2.md b/docs/upgrading_to_2.md new file mode 100644 index 00000000..5331f677 --- /dev/null +++ b/docs/upgrading_to_2.md @@ -0,0 +1,133 @@ +

Upgrading to Will 2.0

+ +Will 2.0 is finally here, and its main goal was to free people using Will from being locked into a single chat provider, and add some more flexibility to his brain. You can read the [release announcement](https://heywill.io/will2) for a bit more context, and some good reasons why you'll want to upgrade! + +# The short version: just pip install +While Will has picked up a bunch of features and improvements in 2.0, we've aimed to keep him backwards-compatable with 1.x and 0.x releases. If you weren't using any undocumented internal methods and you're already using redis, upgrading should be as easy as: + +```shell +pip install --upgrade will +``` + +From there, you can just `./run_will.py`, and things should Just Work. + +You will, however, see a lot of output from Will, telling you that some names have changed, and asking you to update them in your config.py when you have time. You can either just follow those instructions, or the guide below. + +# The long version: + +## 1. Add IO backends. + +If you're just planning to continue using HipChat, we'd recommend that you add this to your `config.py`: + +```python +IO_BACKENDS = [ + "will.backends.io_adapters.hipchat", + "will.backends.io_adapters.shell", + # "will.backends.io_adapters.slack", + # "will.backends.io_adapters.rocketchat", +] +``` + +That will enable the HipChat and local shell stdin/stdout backend, for easy testing. If you want to also bring your Will into a Slack or Rocket.Chat room in the future, just uncomment that backend and restart! + +## 2. Update the HipChat tokens to be namespaced. + +You'll see this starting up, but when you have time, update your tokens as follows: (If you're using `WILL_` environment variables, please add the `WILL_` as needed:) + +- `USERNAME` becomes `HIPCHAT_USERNAME` +- `TOKEN` becomes `HIPCHAT_V1_TOKEN` +- `V2_TOKEN` becomes `HIPCHAT_V2_TOKEN` +- `DEFAULT_ROOM` becomes `HIPCHAT_DEFAULT_ROOM` +- `HANDLE` should be removed, as it's now pulled live from the HipChat servers and not used. +- `NAME` should be removed, as it's now pulled live from the HipChat servers and not used. +- `PASSWORD` becomes `HIPCHAT_PASSWORD` +- `ROOMS` becomes `HIPCHAT_ROOMS` + + +## 3. Set up Redis + +At the moment, Redis is the only working pubsub backend, and is required to run Will. So, if you're not already running it, you'll need it for 2.x. + +If this is impossible for your setup, ZeroMQ support is in the works, and we're looking to add a pure-python backend as well in 2.1 or 2.2. + + +## 4. Set your encryption secret key. + +Will now encrypts all messages on the pubsub wire and in storage by default. Without a `SECRET_KEY` set, he'll auto-generate one based on the machine MAC address, but this isn't a perfect solution, and will mean that he can't access his storage if there are hardware changes (or he's running in a virtualized environment.) + +Please set `SECRET_KEY` as soon as possible. + +The recommended way is to set it as an environmental variable, `WILL_SECRET_KEY`, in an environment that is secured and you trust. Any string will work, and entropy is good. + + +## 5. Set the new 2.0 settings to your liking. + +Will 2 ships with bunch of new features, and though we've provided sensible defaults, if you'd like, you can update your `config.py` with your preferences. + +The simplest way to see everything is to have Will generate a `config.py.dist` that you can use for comparison: + +```shell +$ generate_will_project --config-dist-only +... +Created a config.py.dist. Open it up to see what's new! +``` + +It's worth reading through the new `config.py`, but here's a few areas specifically worth a look: + +### Platform and Decision-making + +As mentioned above, there are now multiple IO mediums and platforms that Will can communicate on. It's also now easy to [write your own](/backends/io), pull requests are very welcome, and more are coming soon. Here's all the options: + +```python +IO_BACKENDS = [ + "will.backends.io_adapters.slack", + "will.backends.io_adapters.hipchat", + "will.backends.io_adapters.rocketchat", + "will.backends.io_adapters.shell", +] +``` + + +Will 2 also comes with pluggable brains - split into Analysis, Generation, and Execution backends. The defaults are solid and behave similarly to Will 1.0 (the only difference is a high-confidence fuzzy matching engine), but if you're interested in making your Will more flexible, or adding more context to his responses, building custom backends is easy. + +Here's all of the options, with the defaults uncommented. It's worth pulling this into your `config.py`. + +```python +# Backends to analyze messages and generate useful metadata +ANALYZE_BACKENDS = [ + "will.backends.analysis.nothing", + "will.backends.analysis.history", +] + +# Backends to generate possible actions, and metadata about them. +GENERATION_BACKENDS = [ + "will.backends.generation.strict_regex", + "will.backends.generation.fuzzy_all_matches", + # "will.backends.generation.fuzzy_best_match", +] + +# The "decision making" backends that look among the generated choices, +# and decide which to follow. Backends are executed in order, and any +# backend can stop further evaluation. +EXECUTION_BACKENDS = [ + "will.backends.execution.best_score", + # "will.backends.execution.all", +] +``` + +There are also a few settings to tweak things like the fuzzy logic. These have sensible defaults, but you can tweak them to your liking. + +```python +# Confidence fuzzy generation backends require before Will responds +# https://pypi.python.org/pypi/fuzzywuzzy +FUZZY_MINIMUM_MATCH_CONFIDENCE = 90 # Defaults to 90% +FUZZY_REGEX_ALLOWABLE_ERRORS = 3 +``` + +## 6. That's it - let us know how it goes! + +That's all you really need to know to flip the switch to Will 2.0. + +As there's a lot of new stuff in this release, it's possible that some bugs have slipped through the cracks. Please submit anything you find, no matter how small, [into the github issue tracker](https://github.com/skoczen/will/issues). We'll be active in fixing things ASAP and helping if you're stuck. + +Thanks for using Will, and for going through the big upgrade! We're excited about what the future holds, and happy to get your bots free from platform lock-in. \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 7edae374..39abdd9c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,6 +3,7 @@ site_url: http://skoczen.github.io/will site_description: "Will is a simple, beautiful-to-code python hipchat bot" pages: - Get Started: index.md +- Upgrade to 2: upgrading_to_2.md - Teach Your Will: - The Basics: plugins/basics.md - What Will Can Notice: plugins/notice.md @@ -14,6 +15,17 @@ pages: - Deploy: deploy.md - Improve: improve.md - Roadmap: roadmap.md +extra_javascript: +- themes/will/js/base.js +- themes/will/js/bootstrap-3.0.3.min.js +- themes/will/js/prettify-1.0.min.js +extra_css: +- css/docs.css +- themes/will/css/base.css +- themes/will/css/bootstrap-custom.min.css +- themes/will/css/font-awesome-4.0.3.css +- themes/will/css/prettify-1.0.css +- themes/will/css/style.css # theme: will site_name: Will theme_dir: "docs/themes/will/" From 54d7c1b254f1fd133fff24760a4dad4ae0d82164 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 2 Nov 2017 17:38:15 +1300 Subject: [PATCH 088/200] Documentation for 2.0.1beta1 release --- README.md | 2 + docs/config.md | 29 ++- docs/deploy.md | 56 ++++-- docs/img/kittens.gif | Bin 0 -> 1301417 bytes docs/img/pug.gif | Bin 148753 -> 47443 bytes docs/improve.md | 331 +---------------------------------- docs/index.md | 10 +- docs/platforms/upgrading.md | 129 -------------- docs/plugins/bundled.md | 11 +- docs/plugins/reply.md | 8 +- docs/releases.md | 339 ++++++++++++++++++++++++++++++++++++ docs/roadmap.md | 24 +-- docs/upgrading_to_2.md | 31 ++-- mkdocs.yml | 3 +- 14 files changed, 462 insertions(+), 511 deletions(-) create mode 100644 docs/img/kittens.gif delete mode 100644 docs/platforms/upgrading.md create mode 100644 docs/releases.md diff --git a/README.md b/README.md index 42a003a6..7dc18752 100644 --- a/README.md +++ b/README.md @@ -19,4 +19,6 @@ The first version of Will was built by [Steven Skoczen](http://stevenskoczen.com Will has docs, including a quickstart and lots of screenshots at: **[http://skoczen.github.io/will/](http://skoczen.github.io/will)** +If you've been using Will 0.x or 1.x, and are wondering how to upgrade to 2.x, [here's our friendly guide](http://skoczen.github.io/will/upgrading_to_2/). :) + Check them out! diff --git a/docs/config.md b/docs/config.md index 161bed21..fbfb14e9 100644 --- a/docs/config.md +++ b/docs/config.md @@ -8,11 +8,15 @@ All environment variables prefixed with `WILL_` are imported into will's `settin In best practices, you should keep all of the following in environment variables: -- `WILL_USERNAME` -- `WILL_PASSWORD` +- `WILL_SLACK_API_TOKEN` +- `WILL_HIPCHAT_USERNAME` +- `WILL_HIPCHAT_PASSWORD` +- `WILL_HIPCHAT_V2_TOKEN` +- `WILL_HIPCHAT_V1_TOKEN` +- `WILL_ROCKETCHAT_USERNAME` +- `WILL_ROCKETCHAT_PASSWORD` +- `WILL_ROCKETCHAT_URL` - `WILL_REDIS_URL` -- `WILL_V2_TOKEN` -- `WILL_V1_TOKEN` - Any other tokens, keys, passwords, or sensitive URLS. We've made it easy. No excuses. :) @@ -23,19 +27,32 @@ Config.py is where all of your non-sensitive settings should go. This includes - `PLUGINS`: The list of plugins to run, - `PLUGIN_BLACKLIST`: The list of plugins to ignore, even if they're in `PLUGINS`, +- `IO_BACKENDS`: The list services you want Will to connect to, +- `ANALYZE_BACKENDS`: The list of message-analysis backends you want Will to run through. +- `GENERATION_BACKENDS`: The list of reply-generation backends you want Will to go through. +- `EXECUTION_BACKENDS`: The list of decision-making and execution backends you want Will to go through (we recommend just having one.) +- `STORAGE_BACKEND`: Which backend you'd like to use for Will to store his long-term memory. (Built-in: 'redis', 'couchbase', 'file') +- `PUBSUB_BACKEND`: Which backend you'd like to use for Will to use for his working memory. (Built-in: 'redis'. Soon: 'zeromq', 'builtin') +- `ENCYPTION_BACKEND`: Which backend you'd like to use for Will to encrypt his storage and memory. (Built-in: 'aes'.) - `PUBLIC_URL`: The publicly accessible URL will can reach himself at (used for [keepalive](plugins/bundled.md#administration)), - `HTTPSERVER_PORT`: The port will should handle HTTP requests on. Defaults to 80, set to > 1024 if you don't have sudo, - `REDIS_MAX_CONNECTIONS`: The maximum number of connections to make to redis, for connection pooling. -- `ROOMS`: The list of rooms to join, -- `DEFAULT_ROOM`: The room to send messages that come from web requests to, +- `FUZZY_MINIMUM_MATCH_CONFIDENCE`: What percentage of confidence Will should have before replying to a fuzzy match. +- `FUZZY_REGEX_ALLOWABLE_ERRORS`: The maximum number of letters that can be wrong in trying to make a fuzzy match. +- `SLACK_DEFAULT_CHANNEL`: The default Slack channel to send messages to (via webhooks, etc) +- `HIPCHAT_ROOMS`: The list of rooms to join, +- `HIPCHAT_DEFAULT_ROOM`: The room to send messages that come from web requests to, +- `DEFAULT_BACKEND`: The service to send messages that come from web requests to, - `TEMPLATE_DIRS`: Extra directories to look for templates, - `ADMINS`: The mention names of all the admins, - `LOGLEVEL`: What logging level to use, - `HIPCHAT_SERVER`: if you're using the [HipChat server beta](https://www.hipchat.com/server), the hostname of the server, - `ALLOW_INSECURE_HIPCHAT_SERVER`: the option to disable SSL checks (seriously, don't), +- `ENABLE_INTERNAL_ENCRYPTION`: the option to turn off internal encryption (not recommended, but you can do it.) - `PROXY_URL`: Proxy server to use, consider exporting it as `WILL_PROXY_URL` environment variable, if it contains sensitive information - and all of your non-sensitive plugin settings. + More expansive documentation on all of those settings is in `config.py`, right where you need it. ## How environment variables and config.py are combined diff --git a/docs/deploy.md b/docs/deploy.md index ce5de68c..1863e125 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -26,15 +26,18 @@ At minimum, that's ```bash heroku config:set \ WILL_PUBLIC_URL="http://our-will-name.herokuapp.com" \ -WILL_USERNAME='12345_123456@chat.hipchat.com' \ -WILL_PASSWORD='asj2498q89dsf89a8df' \ -WILL_V2_TOKEN='asdfjl234jklajfa3azfasj3afa3jlkjiau' \ +# Slack +WILL_SLACK_API_TOKEN="lkasjflkaklfjlasfjal1249814" +# Hipchat +WILL_HIPCHAT_USERNAME='12345_123456@chat.hipchat.com' \ +WILL_HIPCHAT_PASSWORD='asj2498q89dsf89a8df' \ +WILL_HIPCHAT_V2_TOKEN='asdfjl234jklajfa3azfasj3afa3jlkjiau' \ +# Rocket.Chat +WILL_ROCKETCHAT_USERNAME='will@heywill.io'\ +WILL_ROCKETCHAT_PASSWORD='12o312938asfjilasdlfjasdlkfj'\ +WILL_ROCKETCHAT_URL='https://heywill.rocket.chat'\ ``` -If you have more than 30 chat rooms, you must also set the V1 token to avoid hipchat rate limits: -```bash -heroku config:set WILL_V1_TOKEN='kjadfj89a34878adf78789a4fae3' -``` Finally, for will's schedule to be correct, you need to set him to the time zone you want: @@ -84,9 +87,16 @@ You should have docker already installed; additionally, the instructions require ### Step 1: Configure your container's environment variables In Will's docker directory, update the default.env file with your environment's settings. At a minimum, this should contain: ```bash -WILL_USERNAME -WILL_PASSWORD -WILL_V2_TOKEN +# For Slack +WILL_SLACK_API_TOKEN +# For Hipchat +WILL_HIPCHAT_USERNAME +WILL_HIPCHAT_PASSWORD +WILL_HIPCHAT_V2_TOKEN +# Rocket.Chat +WILL_ROCKETCHAT_USERNAME +WILL_ROCKETCHAT_PASSWORD +WILL_ROCKETCHAT_URL ``` Note, we've pre-defined the redis url and the HTTP Server port; if you update these values, make sure you update the docker-compose file accordingly. @@ -125,16 +135,24 @@ In your chosen deploy environment and setup, you'll want to do a couple things: At minimum, that's: ```bash export WILL_PUBLIC_URL="http://our-will-name.herokuapp.com" -export WILL_USERNAME='12345_123456@chat.hipchat.com' -export WILL_PASSWORD='asj2498q89dsf89a8df' -export WILL_V2_TOKEN='asdfjl234jklajfa3azfasj3afa3jlkjiau' export WILL_REDIS_URL='redis://some-domain.com/7/' export WILL_HTTPSERVER_PORT='80' + +# Slack +WILL_SLACK_API_TOKEN="lkasjflkaklfjlasfjal1249814" +# Hipchat +export WILL_HIPCHAT_USERNAME='12345_123456@chat.hipchat.com' +export WILL_HIPCHAT_PASSWORD='asj2498q89dsf89a8df' +export WILL_HIPCHAT_V2_TOKEN='asdfjl234jklajfa3azfasj3afa3jlkjiau' +# Rocket.Chat +WILL_ROCKETCHAT_USERNAME='will@heywill.io' +WILL_ROCKETCHAT_PASSWORD='12o312938asfjilasdlfjasdlkfj' +WILL_ROCKETCHAT_URL='https://heywill.rocket.chat' ``` If you have more than 30 chat rooms, you must also set the V1 token to avoid hipchat rate limits: ```bash -export WILL_V1_TOKEN='kjadfj89a34878adf78789a4fae3' +export WILL_HIPCHAT_V1_TOKEN='kjadfj89a34878adf78789a4fae3' ``` You'll also need to set any environment variables for your plugins. @@ -200,6 +218,16 @@ Examples: * `FILE_DIR='~will/settings/'` + +## Pubsub Backends + +Will's default pubsub backend is Redis, and support for ZeroMQ and a pure-python backend is on the way. + +To change the backend, just set `PUBSUB_BACKEND` in `config.py` and then supply any other needed settings for the new backend. The currently supported backend is: + + * `redis` - The default Redis backend + + ## Best Practices In this section, we describe how we deploy and host will, in the hopes that others come forward and share what's working for them, too. The more good practices, the better. diff --git a/docs/img/kittens.gif b/docs/img/kittens.gif new file mode 100644 index 0000000000000000000000000000000000000000..8fa394b3d094078125e9865892d90d1088bde21f GIT binary patch literal 1301417 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 l?Eq!luKo;1V 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⋙w+7+UrmU>QryACWYY( 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

)MGQ`QrzDF; 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�nk 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 z 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 @1P=K@G`1W) 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

!AQ=Q^!SQe)STj&X!;^A!H}33(w#F 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 z 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 NICD^;DuM=d{s)%zEouM& literal 148753 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 YvuW41eH(Xf-3hyS_xAl8IPHJ{JHq-M8vp` now gives plugin-specific help, thanks to [tophsic](https://github.com/tophsic). -* Improvement: Blacklisted modules aren't even attempted to be imported, thanks to [BrianGallew](https://github.com/BrianGallew). -* Improvement: File storage engine expires properly, thanks to [BrianGallew](https://github.com/BrianGallew). -* Improvement: Zombie users no longer cause will trouble, thanks to [BrianGallew](https://github.com/BrianGallew). -* Improvement: Will now no longer gets stuck if organizations have more than 2000(!) hipchat rooms, courtesy of [woparry](https://github.com/woparry) and [danbourke](https://github.com/danbourke). -* Improvement: V2 API calls for multiple rooms now properly uses `max-results` and doesn't hang, thanks to [chillipeper](https://github.com/chillipeper). -* Improvement: Much-improved test runners, and proper case for Bitbucket, thanks to [mark-adams](https://github.com/mark-adams). -* Improvement: `_available_rooms` is now populated with `Room` objects, regardless of whether you use V1 or V2, thanks to [jcdyer](https://github.com/jcdyer). -* Improvement: Output logging now includes timestamps by default, thanks to [pepedocs](https://github.com/pepedocs). -* Improvement: Upgraded to `hiredis` > 0.2 to get windows builds working, thanks to [Regner](https://github.com/Regner). -* Improvement: Updated to the new pagerduty docs, thanks to [woohgit](https://github.com/woohgit). -* Improvement: Generation script doesn't make a duplicate `hi` response, thanks to [brandonsturgeon](https://github.com/brandonsturgeon) and [derek-adair](https://github.com/derek-adair). - - -#### 0.9.3 - September 11, 2015 - -Thanks for your patience on this long-delayed release! Here's what's new: - -* New: Will watches bitbucket, and alerts on downtime, thanks to [mvanbaak](https://github.com/mvanbaak). -* New: `@will urban dictionary ______`, thanks to [Ironykins](https://github.com/Ironykins). -* New: 1-1 messages now support HTML, thanks to [AndrewBurdyug](https://github.com/AndrewBurdyug) and [brandonsturgeon](https://github.com/brandonsturgeon) -* Improvement: Batch-getting of rooms, thanks to [charlax](https://github.com/charlax). -* Improvement: Better handling of uptime check edge cases, thanks to [woohgit](https://github.com/woohgit). -* Improvement: Proper docs for installing redis on ubuntu/debian, thanks to [kenden](https://github.com/kenden). -* Improvement: Pulled an extraneous doc page, thanks to [woohgit](https://github.com/woohgit). -* Improvement: Fixes to the route doc syntax, thanks to [brandonsturgeon](https://github.com/brandonsturgeon). -* Improvement: Docs now fit the new mkdocs format, thanks to [d0ugal](https://github.com/d0ugal). -* Improvement: New travis.yml setup for easier travis running, and plugged my CircleCI builds into the github repo. All future PRs should automatically have tests run! - -#### 0.9.2 - June 5, 2015 - -* Fixes bug that caused will not to join all rooms if `ROOMS` was missing. Thanks to [camilonova](https://github.com/camilonova) for the report! - -#### 0.9.1 - May 30, 2015 - -* Fixes bug that affected `@will`s - thanks to [woohgit](https://github.com/woohgit) for the report! - -#### 0.9 - May 29, 2015 - -* **BREAKING:** Module change. New `will.plugins.fun` module. Existing will installs will need to add it to your `config.py` to keep the fun! -* New: Support for Pagerduty workflows, thanks to [woohgit](https://github.com/woohgit). This is really tremendous stuff. [Check out the docs here](plugins/bundled.md#pagerduty-integration)! -* New: [Pluggable storage backends](deploy.md#storage-backends), with support for couchbase and local file storage, in addition to redis. Many thanks to [borgstrom](https://github.com/borgstrom) -* New: [ACL](plugins/builtins.md#access-control) functionality, thanks to [woohgit](https://github.com/woohgit). Backwards-compatable, even! -* New: Made will a little more fun, thanks to [camilonova](http://github.com/camilonova). Hint: it involves the world's most meme-friendly dog. -* New: Will can now construct google poems, thanks to [AirbornePorcine](https://github.com/AirbornePorcine). Truly, his creativity knows no bounds. -* Improvement: Moved stuff like that into a new "fun" module. Dry, anti-fun people can now disable it more easily. ;) -* Improvement: "What time is it" now outputs time zones, thanks to [woohgit](https://github.com/woohgit). -* Improvement: No more rate-limit problems on the v2 token, thanks to [grundprinzip](https://github.com/grundprinzip). -* Improvement: Messages are now `.strip()`ed before being compared, to handle [frozen-fingered-typos](https://github.com/skoczen/will/pull/145). Thanks, [woohgit](https://github.com/woohgit)! -* Fix: Typo in the docs gone. Thanks, [woohgit](https://github.com/woohgit). -* Fix: Bugs in proxy support are fixed, thanks to [dmuntean](https://github.com/dmuntean). - - -#### 0.8.2 - April 24, 2015 - -* Fixes an odd remaining bug with `@randomly`, thanks to [camilonova](https://github.com/camilonova)'s continued debugging. - -#### 0.8.1 - April 23, 2015 - -* Moves `version` plugin into admin, so it just works for most users. - -#### 0.8 - April 23, 2015 - -* What happens when life gets busy and we go a full month and a half between will releases? Lots and lots: -* New: All-new `@will who is in this room?` command, thanks to [puug](https://github.com/puug). -* New: Will now can shorten links via bitly `@will bitly http://example.com`, thanks to [keNzi](https://github.com/keNzi). -* New: Will now supports a `PROXY_URL` setting, for getting around funky firewalls, thanks to [dmuntean](https://github.com/dmuntean). -* New: `@will version` command to check version number, thanks to [woohgit](https://github.com/woohgit). -* New: Awesome new `remind ___ to ___ at ___`, thanks to [woohgit](https://github.com/woohgit). -* New: Will now keeps an eye on hipchat's uptime as well, thanks to [netjunki](https://github.com/netjunki). -* Fix: a breaking bug in the `@randomly` decorator, thanks to a report by [camilonova](https://github.com/camilonova). -* Support: Handles a breaking change in the hipchat API, thanks to [brandonsturgeon](https://github.com/brandonsturgeon). -* Support: Updates to v2 of the underquoted API, thanks [jessamynsmith](https://github.com/jessamynsmith). -* Support: Updated to the new WorldWeatherOnline endpoint, since they had DDOS problems, thanks to [woohgit](https://github.com/woohgit). -* Improvement: The most important kind of PRs. Spelling fixes. Many thanks to [jquast](https://github.com/jquast). -* Improvement: `self.save()` now accepts an `expire` value, thanks to [netjunki](https://github.com/netjunki). -* Improvement: PEP8 passes for the whole codebase, with flake8 added to automated tests. - -#### 0.7.3 - March 3, 2015 - -* Fixed a breaking bug to world time, thanks to [woohgit](https://github.com/woohgit). - -#### 0.7.2 - February 27, 2015 - -* Improved handling when `.reply()` is called incorrectly, thanks to a report by [dothak](https://github.com/dothak) -* Fixed the [annoying](https://github.com/skoczen/will/issues/78) "github's ok" on first launch. -* Restored Python 2.6 compatability thanks to the report and patience of [JPerkster](https://github.com/JPerkster). -* Lots of code cleanup toward pep8. - -#### 0.7.1 - February 5, 2015 - -* Improved talkbackbot regex, suggested by [PrideRage](https://github.com/PrideRage). - - -#### 0.7.0 - February 4, 2015 - -* Adds a port of the awesome [talkbackbot](https://github.com/jessamynsmith), thanks to [jessamynsmith](https://github.com/jessamynsmith), who super-kindly ported it at my request! -* Oh, yeah. That port also includes the first proper tests in will, and a pretty solid pattern for testing plugins. Woo! More huge thanks to [jessamynsmith](https://github.com/jessamynsmith). - - -#### 0.6.9 - January 30, 2015 - -* Fixed copypasta error caught by the keen eye of [dpoirier](https://github.com/dpoirier). - -#### 0.6.8 - January 30, 2015 - -* Will now supports templates directories within plugins. Just put a `templates` directory in the plugin's module, and it will be detected. Thanks to [sivy](https://github.com/sivy) for the idea and willingness to get it done! - - -#### 0.6.7 - January 29, 2015 - -* Addition of `.get_user_by_nick()` method, to look up users by nick, thanks to [sivy](https://github.com/sivy). -* Bugfix to `ALLOW_INSECURE_HIPCHAT_SERVER` when specified in `config.py`, thanks to [sivy](https://github.com/sivy). - -#### 0.6.6 - January 29, 2015 - -* New `room.history` attribute with a room's history, thanks to [PrideRage](https://github.com/PrideRage) -* New setting: `ALLOW_INSECURE_HIPCHAT_SERVER`, which will disable SSL checks (you're on your own), thanks to [sivy](https://github.com/sivy). -* Adds support for V2 of the WorldWeatherOnline API (used for world times, weather) thanks to [woohgit](https://github.com/woohgit). -* Adds new release and doc deploy scripts, so the github [releases](https://github.com/skoczen/will/releases) are kept up to date. Thanks to [crccheck](https://github.com/crccheck) for noticing and reporting they were stale! - - -#### 0.6.5 - January 23, 2015 - -* Removes mkdocs from the production requirements.txt to fix a Jinja version problem. Thanks to the report from [PrideRage](https://github.com/PrideRage). - -#### 0.6.4 - January 19, 2015 - -* Switches to bottle to cherrypy over gevent, which should solve lingering gevent DNS threading issues, thanks to [wohali](https://github.com/wohali). -* Support for @will, @WILL, @wIll, thanks to [neronmoon](https://github.com/neronmoon) - - -#### 0.6.3 - December 30, 2014 - -* Better error handling for weirdly formatted messages. -* Better generated README, thanks to [bsvetchine](https://github.com/bsvetchine). - - -#### 0.6.2 - September 23, 2014 - -* Bugfix on `generate_will_project`, thanks to the report by [MattyDub](https://github.com/MattyDub). - - -#### 0.6.1 - September 23, 2014 - -* Freezes apscheduler to < 3.0, since its API was backwards incompatibile. - - -#### 0.6.0 - September 17, 2014 - -* Methods in a single class now share a common instance, thanks to [amckinley](https://github.com/amckinley). -* Redis connections are now pooled (which should help with "max clients exceeded" errors), thanks to [carsongee](https://github.com/carsongee). -* Preliminary travis ci support, thanks to [pcurry](https://github.com/pcurry). -* More gramatically correct documentation by [hobson](https://github.com/hobson). - - -#### 0.5.7 - September 3, 2014 - -* Improvements to setup.py to be robust a variety of linux/unixes by [hobson](https://github.com/hobson). - - -#### 0.5.6 - August 26, 2014 - -* Fix for 1-1 bootstrapping bug, thanks to [adamcin](https://github.com/adamcin). - - -#### 0.5.5 - August 25, 2014 - -* Full html support in 1-1 chats, thanks to [adamcin](https://github.com/adamcin). - - -#### 0.5.4 - July 22, 2014 - -* Upgrades bottle to 0.12.6 to fix [security bug](http://osvdb.org/show/osvdb/106526). - - -#### 0.5.3 - July 11, 2014 - -* `@randomly` functions now can run on the 59th minute, thanks to [tomokas](https://github.com/tomokas). -* Bad merge that duplicated `help.py` fixed by [netjunki](https://github.com/netjunki). -* "global name 'params' is not defined" bug fixed by [amckinley](https://github.com/amckinley). - - -#### 0.5.1 - July 2, 2014 - -* New `HIPCHAT_SERVER` setting to support [beta HipChat Server](https://www.hipchat.com/server), thanks to [mrgrue](https://github.com/mrgrue). - - -#### 0.5 Omnibus - June 27, 2014 - -* Big, big release, with backwards-incompatble changes. Please read all the notes on this one! -* All-new config and environment setup, including an all-new `config.py` for plugin configuration, and all non-sensitive settings. -* Much, much improved bootstrapping code that validates settings, gives helpful output, and generally helps you get will running. -* Documentation! Real-live documentation! -* **Breaking**: `WILL_TOKEN` has been renamed `WILL_V1_TOKEN`. -* New `@require_settings` decorator for plugins to request validation that needed settings are present. -* Will now has a concept of modules (groups of plugins), and groups help output according. - - -#### 0.4.10 - June 6, 2014 - -* Brand-new `admin_only` argument to `hear()` and `respond_to()`, thanks to [rbp](https://github.com/rbp). If a user is not in `WILL_ADMINS`, they won't be able to run any `admin_only=True` plugins. Default for `WILL_ADMINS` is all users to retain backwards-compatibility. -* All commands in the `storage.py` plugin are now admin-only. -* `help` now only responds to direct asks, allowing other plugins to handle "help me with x", thanks to [bfhenderson](https://github.com/bfhenderson) - - -#### 0.4.9 - May 28, 2014 - -* Passing a `room` to a `.say()` now works properly, thanks to [rbp](https://github.com/rbp). -* New optional `WILL_LOGLEVEL` setting, thanks to [dpoirier](https://github.com/dpoirier). - - -#### 0.4.8 - May 21, 2014 - -* Will now ignores all previously sent messages properly, by passing in `bot` as the resource instead of an ugly time hack, thanks to [dpoirier](https://github.com/dpoirier). - - -#### 0.4.7 - May 15, 2014 - -* Will now prints a helpful message if one of your `WILL_ROOMS` is wrong, and continues starting, instead of crashing in a fiery ball, thanks to [crccheck](https://github.com/crccheck). - - -#### 0.4.6 - May 5, 2014 - -* `@route` decorators now honor all bottle arguments, most helpfully `method`! - - -#### 0.4.5 - May 2, 2014 - -* Awesome new help system by [quixeybrian](https://github.com/quixeybrian). -* "@will help" now only displays functions with docstrings, and formats them nicely. -* Old help (regexes and all) is available at "@will programmer help" - - -#### 0.4.4 - April 22, 2014 - -* Removes the dependence on the v1 token (though it still helps with rate-limiting), thanks to [bfhenderson](https://github.com/bfhenderson). -* Much friendlier error message on an invalid API key, thanks to [adamgilman](https://github.com/adamgilman). - -#### 0.4.3 - ~ April 1, 2014 - -* Support for hundreds of users and rooms without hitting the API limit. -* `get_all_users` use of the bulk API [added](https://github.com/greenkahuna/will/pull/18) by [quixeybrian](https://github.com/quixeybrian). Thanks also to [jbeluch](https://github.com/jbeluch) and [jdrukman](https://github.com/jdrukman) for nudges in the right direction. -* The start of some useful comments - the meat of will was hacked out by one person over a handful of days and it looks that way. Slowly but surely making this codebase more friendly to other contributions! -* Added a CONTRIBUTING.md file thanks to [michaeljoseph](https://github.com/michaeljoseph). -* Proper releases in the docs, and an updated `AUTHORS` file. If you see something awry, send a PR! - -#### 0.4 - ~ March 2014 - -* Ye olden past before we started keeping this list. All contributions by GreenKahuna. Will did everything that's not in the release list above. That's called lazy retconning release lists! - - -- Make sure nothing from the readme is missed. +Curious how Will's grown over the years? [Check out the releases](/releases)! \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 1042b4f1..14ae05eb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -15,7 +15,7 @@ def say_hello(self, message): Lots of batteries are included, and you can get your own will up and running in a couple of minutes. -Will started by [Steven Skoczen](http://www.inkandfeet.com), and has been [contributed to by lots of folks](improve.md#shoulders). +Will started by [Steven Skoczen](http://www.inkandfeet.com), and has been [contributed to by lots of folks](improve.md#the-shoulders-of-giants). Check out the quickstart below! @@ -23,7 +23,7 @@ Check out the quickstart below! # Quickstart -**Upgrading from Will 1.x or 0.x? [Check out the Upgrade Guide](/platforms/upgrading/).** +**Upgrading from Will 1.x or 0.x? [Check out the Upgrade Guide](/upgrading_to_2/).** Here's how to set up your system and get will running. If you already write python, it'll probably take less than 5 minutes. @@ -31,10 +31,12 @@ Here's how to set up your system and get will running. If you already write pyt ## Install prerequisites -Will doesn't need much, just python and a place to store things. +Will doesn't need much, just python, a place to store things, and a way to communicate. Will can store stuff in Redis, Couchbase, or local storage. Our recommended backend is redis, and we'll describe getting it set up below. [Information on using Couchbase or local storage is here](deploy.md#Storage-Backends). +Will's communication layer works via publish-subscribe, and at the moment, only supports Redis. If that's a blocker for you, ZeroMQ, and a pure python built-in layer are coming in 2.1. + #### Install redis > 2.4 Official documentation is at [redis.io](http://redis.io/). @@ -117,7 +119,7 @@ Eventually, you'll reach this screen of joy. Now, it's time to play! #### Testing will out -Once your will is up and running, hop into any of your chat rooms, and say hello! +Once your will is up and running, hop into any of your chat rooms (or just the terminal), and say hello! `@will hi` diff --git a/docs/platforms/upgrading.md b/docs/platforms/upgrading.md deleted file mode 100644 index a0c23926..00000000 --- a/docs/platforms/upgrading.md +++ /dev/null @@ -1,129 +0,0 @@ -# Upgrading from Will 1.0 - -Will 2.0 is finally here, and its main goal was to free people using Will from being locked into a single chat provider, and add some more flexibility to his brain. You can read the [release announcement](https://heywill.io/will2) for a bit more context! - -While Will has picked up a bunch of features and improvements in 2.0, we've aimed to keep him backwards-compatable with 1.x and 0.x releases. If you weren't using any undocumented internal methods, upgrading should be as easy as: - -``` -pip install --upgrade will -``` - -From there, you can just `./run_will.py`, and things should Just Work. - -You will, however, see a lot of output from Will, telling you that some names have changed, and asking you to update them in your config.py when you have time. You can either just follow those instructions, or the guide below. - -## 1. Move to the new IO_BACKENDS syntax - -If you're just planning to continue using HipChat, we'd recommend that you add this to your config.py: - -``` -IO_BACKENDS = " - "will.backends.io_adapters.hipchat", - "will.backends.io_adapters.shell", -# "will.backends.io_adapters.slack", -# "will.backends.io_adapters.rocketchat", -] -``` - -That will enable the HipChat and local shell stdin/stdout backend, for easy testing. If you want to also bring Will into a Slack or Rocket.Chat room in the future, just uncomment the backend! - -## 2. Update the HipChat tokens to be namespaced. - -You'll see this starting up, but when you have time, update your tokens as follows: (If you're using `WILL_` environment variables, please add the `WILL_` as needed:) - -`USERNAME` becomes `HIPCHAT_USERNAME` - -`TOKEN` becomes `HIPCHAT_V1_TOKEN` - -`V2_TOKEN` becomes `HIPCHAT_V2_TOKEN` - -`DEFAULT_ROOM` becomes `HIPCHAT_DEFAULT_ROOM` - -`HANDLE` should be removed, as it's now pulled live from the HipChat servers and not used. - -`NAME` should be removed, as it's now pulled live from the HipChat servers and not used. - -`PASSWORD` becomes `HIPCHAT_PASSWORD` - -`ROOMS` becomes `HIPCHAT_ROOMS` - - -## 3. If you're not using redis for storage, set it up for the pubsub backend. - -At the moment, Redis is the only working pubsub backend, though ZeroMQ support is in the works, and we're looking to add a pure-python backend shortly. - - -## 4. Set SECRET_KEY. - -Will now encrypts all messages on the pubsub wire and in storage by default. Without a SECRET_KEY set, he'll auto-generate one based on the machine MAC address, but this isn't a perfect solution, and will mean that he can't access his storage if there are hardware changes (or he's running in a virtualized environment.) - -Please set `SECRET_KEY` as soon as possible. - -The recommended way is to set it as an environmental variable, `WILL_SECRET_KEY`, in an environment that is secured and you trust. Any string will work, and entropy is good. - - -## 5. Set the new, Will 2.0 configuration and settings to your liking. - -Will 2 ships with bunch of new features, and though we've provided sensible defaults, if you'd like, you can update your `config.py` with your preferences. - -The simplest way to see everything is to have Will generate a `config.py.dist` that you can use for comparison: - -`generate_will_project --config_dist_only` - -It's worth reading through the new `config.py`, but here's a few areas specifically worth a look: - -### Platform and Decision-making - -As mentioned above, there are now multiple IO mediums and platforms that Will can communicate on (and more are coming soon). Here's all the options - -``` -IO_BACKENDS = [ - "will.backends.io_adapters.slack", - "will.backends.io_adapters.hipchat", - "will.backends.io_adapters.rocketchat", - "will.backends.io_adapters.shell", -] -``` - - -Will 2 also comes with pluggable brains - split into Analysis, Generation, and Execution backends. The defaults are solid and behave similarly to Will 1.0 (the only difference is a high-confidence fuzzy matching engine), but if you're interested in making your Will more flexible, or adding more context to his responses, building custom backends is easy. - -Here's all of the options, with the defaults uncommented. It's worth pulling this into your `config.py`. - -``` -# Backends to analyze messages and generate useful metadata -ANALYZE_BACKENDS = [ - "will.backends.analysis.nothing", - "will.backends.analysis.history", -] - -# Backends to generate possible actions, and metadata about them. -GENERATION_BACKENDS = [ - # "will.backends.generation.fuzzy_best_match", - "will.backends.generation.fuzzy_all_matches", - "will.backends.generation.strict_regex", -] - -# The "decision making" backends that look among the generated choices, -# and decide which to follow. Backends are executed in order, and any -# backend can stop further evaluation. -EXECUTION_BACKENDS = [ - "will.backends.execution.best_score", - # "will.backends.execution.all", -] -``` - -There are also a few settings to tweak things like the fuzzy logic. These have sensible defaults, but you can tweak them to your liking. - -``` -# Confidence fuzzy generation backends require before Will responds -# https://pypi.python.org/pypi/fuzzywuzzy -FUZZY_MINIMUM_MATCH_CONFIDENCE = 90 # Defaults to 90% -FUZZY_REGEX_ALLOWABLE_ERRORS = 3 -``` - -## That's it - let us know how it goes! - -That's all you really need to know to flip the switch to Will 2.0. As there's a lot of new stuff in this release, it's possible that some bugs have slipped through the cracks. Please submit anything you find, no matter how small, [into the github issue tracker](https://github.com/skoczen/will/issues). We'll be active in fixing things ASAP and helping if you're stuck. - -Thanks for using Will, and for going through the big upgrade! We're excited about what the future holds, and happy to get your bots free from platform lock-in. \ No newline at end of file diff --git a/docs/plugins/bundled.md b/docs/plugins/bundled.md index 357ca4fb..1d2265aa 100644 --- a/docs/plugins/bundled.md +++ b/docs/plugins/bundled.md @@ -44,7 +44,7 @@ Provides a couple of methods for listing and updating will's internal chat room ## Devops -Will is our devops team at GreenKahuna, and in the long term, we plan to abstract and include our stack deployer as a plugin. For the moment, he just includes a couple basics: +Will has served as the devops team at a couple different companies, but we haven't yet been able to get the IP sorted to abstract and open-source those plugins. So, for the moment, he just includes a couple basics: #### Emergency Contacts @@ -193,7 +193,7 @@ Sometimes, a picture is worth a thousand words. ![Image me a crazy squirrel](../img/image_me.gif) -To configure `image me`, you'll need to set the following two variables in `config.py` or [in your environment with the appropriate `WILL_` prefix](http://skoczen.github.io/will/config/). Here are some instructions on where to obtain both. +Image me works out of the box, but may not in future releases (we're using a pretty hacky way to get search results.) If you rely on it, configure `image me` properly by setting the following two variables in `config.py` or [in your environment with the appropriate `WILL_` prefix](http://skoczen.github.io/will/config/). Here are some instructions on where to obtain both. * `GOOGLE_API_KEY` * Go to the [Google Developers Console](https://console.developers.google.com). @@ -208,6 +208,13 @@ To configure `image me`, you'll need to set the following two variables in `conf * Delete the "anything" site you added two steps ago, to clean it up. * In the `Details` section, click the `Search engine ID` button, and copy the ID which you need here. +#### Gif me + +Like image me, but *alive*. + + +![gif me cute kittens](../img/kittens.gif) + #### Remind me This saves our bacon every day. Timeboxes meetings, helps people remember appointments, and enforces self-control. diff --git a/docs/plugins/reply.md b/docs/plugins/reply.md index df4d60a2..2b4fe71a 100644 --- a/docs/plugins/reply.md +++ b/docs/plugins/reply.md @@ -24,7 +24,7 @@ self.say(content, channel=None, html=False, color="green", notify=False) - **`content`**: the content you want to send to the room. Any string will do, HTML or plain text. - **`channel`**: (optional) The name of the channel or room to send the message to. If not specified, Will is smart, and will just reply in the same channel/room/thread. -- **`service`**: (optional, rare) The name of the service you want to send the message on. By default Will replies on the same service you contacted him on. +- **`service`**: (optional, rare) The name of the service (i.e. 'slack', 'hipchat', 'rocketchat') you want to send the message on. By default Will replies on the same service you contacted him on. - **`html`**: if the message is HTML. `True` or `False`. - **`color`**: (chat room only) the hipchat color to send. "yellow", "red", "green", "purple", "gray", or "random". Default is "green". - **`notify`**: whether the message should trigger a 'ping' notification. `True` or `False`. @@ -61,9 +61,11 @@ When will recieves messages from webhooks and HTTP requests, he's still connecte @route("/ping") def ping(self): self.say("PONG!") + # or + self.say("PONG!", room="ping-pong", service="slack") ``` -If you want to talk to a different room, you can pass in the `channel` with the name of the channel or room you want to talk to. +If you want to talk to a different room, you can pass in the `channel` with the name of the channel or room you want to talk to. If you have multiple services connected, just pass `service` with the one you want. ## Send an email @@ -113,7 +115,7 @@ self.schedule_say(content, when, message=None, channel=None, html=False, color=" - **`when`**: when you want the message to be said. Python `datetime` object. - **`message`**: (optional) The incoming message object - **`channel`**: (optional) The name of the channel or room to send the message to. If not specified, Will is smart, and will just reply in the same channel/room/thread. You can also pass "ALL_ROOMS" to send the message everywhere, if that's really your thing. -- **`service`**: (optional, rare) The name of the service you want to send the message on. By default Will replies on the same service you contacted him on. +- **`service`**: (optional, rare) The name of the service (i.e. 'slack', 'hipchat', 'rocketchat') you want to send the message on. By default Will replies on the same service you contacted him on. - **`html`**: if the message is HTML. `True` or `False`. - **`color`**: (chat room only) the hipchat color to send. "yellow", "red", "green", "purple", "gray", or "random". Default is "green". - **`notify`**: whether the message should trigger a 'ping' notification. `True` or `False`. diff --git a/docs/releases.md b/docs/releases.md new file mode 100644 index 00000000..5f5f3c96 --- /dev/null +++ b/docs/releases.md @@ -0,0 +1,339 @@ +# Releases + +#### 2.0.1beta1 - November 4, 2017 + +**TL;DR: Slack, Rocket.chat, and Shell support, and you can write full chatterbots with Will now!** + +This is a huge rewrite of will, adding pluggable backends for chat systems, Will's internal brains, pub-sub, and encryption. + +A huge number of really smart people gave their thoughts and suggestions throughout the process, not least [@hobson](https://github.com/hobson), [@woohgit](https://github.com/woohgit), [@netjunki](https://github.com/netjunki), [@sivy](https://github.com/sivy), [@antgel](https://github.com/antgel), [@shadow7412](https://github.com/shadow7412), [@brandonsturgeon](https://github.com/brandonsturgeon), [@pepedocs](https://github.com/pepedocs), [@tophsic](https://github.com/tophsic), and [@mike-love](https://github.com/mike-love). + +Read all about what and why here: [What's new in Will 2](https://heywill.io/will2), + +And when you're ready to upgrade, here's [the upgrade guide](http://skoczen.github.io/will/upgrading_to_2). (Spoiler: `pip install -U will`). + +High-level, here's what's new: + +- Slack support +- CLI/Shell backend +- [Rocket.chat](https://rocket.chat/) support, thanks to [antgel](https://github.com/antgel). +- Will's brains have been abstracted - you can now add custom analysis, generation, and execution backends to build everything from a straight regex-bot to a full chatterbot. +- Pluggable I/O backends, which is how all of the above were done, and which means adding new platforms is pretty simple. +- Pluggable storage backends. +- Pluggable pubsub backends. +- Built-in encryption for storage and pub/sub (with pluggable backends as well.) +- Lots more intelligence around required settings and verification, to make first starting and debugging Will easier. +- Full Python 3 support. (Don't worry, 2.x [isn't going anywhere](https://heywill.io/will2#python3).) +- New `@will gif me` command. Because it can't all be serious. :) + + +This release also changes a few bits of behavior, to be consistent: + +- `self.reply()` *finally* no longer requires you to tediously pass the `message` back to it. It's also smart, and backwards compatable with existing plugins. +- `admin_only` is explicitly flagged for deprecation and removal, to be replaced by the ACL system introduced in 2015 (largely, this is because having two different access control systems is crazy and painful.) Switching is as easy as adding `ACL = {'admins': ['steven', 'will']}` to your config.py and find/replacing `admin_only=True` with `acl=['admins',] in your codebase. For now, Will handles backwards compatibility by mapping the old settings into the new places, but he won't forever. Thanks for updating, and making ongoing maintenence simpler! +- If no ACLs are specified and users try to perform restricted commands, they'll be allowed as before, but Will will complain to the console. A new `DISABLE_ACL` setting has been added to turn off the complaining. +- You can pass in `channel=` or `room=` when specifying a custom reply location. If both are passed in, Will uses `channel`. + +There are a couple *internal* backwards-incompatible changes: + +- `RosterMixin` has been renamed `HipChatRosterMixin` and moved to `will.backends.io_adapters.hipchat`. This change should not affect you unless you were specifically importing RosterMixin in your own plugins - everything in `WillPlugin` has been automatically routed to the right place, in a backwards-compatible way. +- `Room` and `RoomMixin` have similarly become `HipChatRoom` and `HipChatRoomMixin and moved to `will.backends.io_adapters.hipchat`. + +As this is a *big* update, please report any bugs you see (no matter how small) to [the github issue tracker](https://github.com/skoczen/will/issues). Thanks in advance for making Will even better! + + +#### 1.0.2 - October 24, 2017 + +Fixes and features in this release: + +* Makes passing the `room=` option *much* easier (you can just use the room's name now,) thanks to [wontonst](https://github.com/wontonst). +* Adds support for jinja `custom_filters` in the `@rendered_template` decorator, thanks to [chillipeper](https://github.com/chillipeper). + +#### 1.0.1 - October 10, 2017 + +Fixes and features in this release: + +* Fixes what time plugin to not require World Weather's old API, thanks to [woohgit](https://github.com/woohgit). +* Adds Docker support, thanks to [mike-love](https://github.com/mike-love). +* Adds Python 3 support, thanks to [tenzer](https://github.com/tenzer). + + +#### 1.0.0 - September 29, 2017 + +**This is the end of major feature development for the hipchat-only version of Will. Future development will be on 2.x, and while backwards compatability will be aimed for, it's not 100% guaranteed.** + +Fixes and features in this release: + +* Makes ACLs be case-insensitive, thanks to [woohgit](https://github.com/woohgit). +* Adds Hipchat card support, also thanks to [woohgit](https://github.com/woohgit). +* Gets Chatoms random topics working again, thanks to [bykof](https://github.com/bykof). +* Environment overrides for `PLUGINS` and `PLUGIN_BLACKLIST` (semicolon separated) are now possible, thanks to [mark-adams](https://github.com/mark-adams). + +#### 0.9.5 - June 23, 2017 + +Quick bugfix release before the big changeover to 1.0, pluggable backends (Slack support), and more. + +* Fixed: `@will image me` actually works again thanks to [antgel](https://github.com/antgel). + + +#### 0.9.4 - April 25, 2017 + +New releases and movement again! Exciting things in the pipeline for will, and that's starting with a long-awaited release. Thanks to everyone who both submitted code, and had saint-like patience with it being merged in. + +* New: `self.append()` and `self.pop()` methods to support list storage, thanks to [woohgit](https://github.com/woohgit). +* Fixed: `@will image me` works again (but requires a google API key - see `config.py`, thanks to [shadow7412](https://github.com/shadow7412). +* Fixed: `@will pugs` thankfully works again, thanks to [gordol](https://github.com/gordol). +* Improvement: `@will help ` now gives plugin-specific help, thanks to [tophsic](https://github.com/tophsic). +* Improvement: Blacklisted modules aren't even attempted to be imported, thanks to [BrianGallew](https://github.com/BrianGallew). +* Improvement: File storage engine expires properly, thanks to [BrianGallew](https://github.com/BrianGallew). +* Improvement: Zombie users no longer cause will trouble, thanks to [BrianGallew](https://github.com/BrianGallew). +* Improvement: Will now no longer gets stuck if organizations have more than 2000(!) hipchat rooms, courtesy of [woparry](https://github.com/woparry) and [danbourke](https://github.com/danbourke). +* Improvement: V2 API calls for multiple rooms now properly uses `max-results` and doesn't hang, thanks to [chillipeper](https://github.com/chillipeper). +* Improvement: Much-improved test runners, and proper case for Bitbucket, thanks to [mark-adams](https://github.com/mark-adams). +* Improvement: `_available_rooms` is now populated with `Room` objects, regardless of whether you use V1 or V2, thanks to [jcdyer](https://github.com/jcdyer). +* Improvement: Output logging now includes timestamps by default, thanks to [pepedocs](https://github.com/pepedocs). +* Improvement: Upgraded to `hiredis` > 0.2 to get windows builds working, thanks to [Regner](https://github.com/Regner). +* Improvement: Updated to the new pagerduty docs, thanks to [woohgit](https://github.com/woohgit). +* Improvement: Generation script doesn't make a duplicate `hi` response, thanks to [brandonsturgeon](https://github.com/brandonsturgeon) and [derek-adair](https://github.com/derek-adair). + + +#### 0.9.3 - September 11, 2015 + +Thanks for your patience on this long-delayed release! Here's what's new: + +* New: Will watches bitbucket, and alerts on downtime, thanks to [mvanbaak](https://github.com/mvanbaak). +* New: `@will urban dictionary ______`, thanks to [Ironykins](https://github.com/Ironykins). +* New: 1-1 messages now support HTML, thanks to [AndrewBurdyug](https://github.com/AndrewBurdyug) and [brandonsturgeon](https://github.com/brandonsturgeon) +* Improvement: Batch-getting of rooms, thanks to [charlax](https://github.com/charlax). +* Improvement: Better handling of uptime check edge cases, thanks to [woohgit](https://github.com/woohgit). +* Improvement: Proper docs for installing redis on ubuntu/debian, thanks to [kenden](https://github.com/kenden). +* Improvement: Pulled an extraneous doc page, thanks to [woohgit](https://github.com/woohgit). +* Improvement: Fixes to the route doc syntax, thanks to [brandonsturgeon](https://github.com/brandonsturgeon). +* Improvement: Docs now fit the new mkdocs format, thanks to [d0ugal](https://github.com/d0ugal). +* Improvement: New travis.yml setup for easier travis running, and plugged my CircleCI builds into the github repo. All future PRs should automatically have tests run! + +#### 0.9.2 - June 5, 2015 + +* Fixes bug that caused will not to join all rooms if `ROOMS` was missing. Thanks to [camilonova](https://github.com/camilonova) for the report! + +#### 0.9.1 - May 30, 2015 + +* Fixes bug that affected `@will`s - thanks to [woohgit](https://github.com/woohgit) for the report! + +#### 0.9 - May 29, 2015 + +* **BREAKING:** Module change. New `will.plugins.fun` module. Existing will installs will need to add it to your `config.py` to keep the fun! +* New: Support for Pagerduty workflows, thanks to [woohgit](https://github.com/woohgit). This is really tremendous stuff. [Check out the docs here](plugins/bundled.md#pagerduty-integration)! +* New: [Pluggable storage backends](deploy.md#storage-backends), with support for couchbase and local file storage, in addition to redis. Many thanks to [borgstrom](https://github.com/borgstrom) +* New: [ACL](plugins/builtins.md#access-control) functionality, thanks to [woohgit](https://github.com/woohgit). Backwards-compatable, even! +* New: Made will a little more fun, thanks to [camilonova](http://github.com/camilonova). Hint: it involves the world's most meme-friendly dog. +* New: Will can now construct google poems, thanks to [AirbornePorcine](https://github.com/AirbornePorcine). Truly, his creativity knows no bounds. +* Improvement: Moved stuff like that into a new "fun" module. Dry, anti-fun people can now disable it more easily. ;) +* Improvement: "What time is it" now outputs time zones, thanks to [woohgit](https://github.com/woohgit). +* Improvement: No more rate-limit problems on the v2 token, thanks to [grundprinzip](https://github.com/grundprinzip). +* Improvement: Messages are now `.strip()`ed before being compared, to handle [frozen-fingered-typos](https://github.com/skoczen/will/pull/145). Thanks, [woohgit](https://github.com/woohgit)! +* Fix: Typo in the docs gone. Thanks, [woohgit](https://github.com/woohgit). +* Fix: Bugs in proxy support are fixed, thanks to [dmuntean](https://github.com/dmuntean). + + +#### 0.8.2 - April 24, 2015 + +* Fixes an odd remaining bug with `@randomly`, thanks to [camilonova](https://github.com/camilonova)'s continued debugging. + +#### 0.8.1 - April 23, 2015 + +* Moves `version` plugin into admin, so it just works for most users. + +#### 0.8 - April 23, 2015 + +* What happens when life gets busy and we go a full month and a half between will releases? Lots and lots: +* New: All-new `@will who is in this room?` command, thanks to [puug](https://github.com/puug). +* New: Will now can shorten links via bitly `@will bitly http://example.com`, thanks to [keNzi](https://github.com/keNzi). +* New: Will now supports a `PROXY_URL` setting, for getting around funky firewalls, thanks to [dmuntean](https://github.com/dmuntean). +* New: `@will version` command to check version number, thanks to [woohgit](https://github.com/woohgit). +* New: Awesome new `remind ___ to ___ at ___`, thanks to [woohgit](https://github.com/woohgit). +* New: Will now keeps an eye on hipchat's uptime as well, thanks to [netjunki](https://github.com/netjunki). +* Fix: a breaking bug in the `@randomly` decorator, thanks to a report by [camilonova](https://github.com/camilonova). +* Support: Handles a breaking change in the hipchat API, thanks to [brandonsturgeon](https://github.com/brandonsturgeon). +* Support: Updates to v2 of the underquoted API, thanks [jessamynsmith](https://github.com/jessamynsmith). +* Support: Updated to the new WorldWeatherOnline endpoint, since they had DDOS problems, thanks to [woohgit](https://github.com/woohgit). +* Improvement: The most important kind of PRs. Spelling fixes. Many thanks to [jquast](https://github.com/jquast). +* Improvement: `self.save()` now accepts an `expire` value, thanks to [netjunki](https://github.com/netjunki). +* Improvement: PEP8 passes for the whole codebase, with flake8 added to automated tests. + +#### 0.7.3 - March 3, 2015 + +* Fixed a breaking bug to world time, thanks to [woohgit](https://github.com/woohgit). + +#### 0.7.2 - February 27, 2015 + +* Improved handling when `.reply()` is called incorrectly, thanks to a report by [dothak](https://github.com/dothak) +* Fixed the [annoying](https://github.com/skoczen/will/issues/78) "github's ok" on first launch. +* Restored Python 2.6 compatability thanks to the report and patience of [JPerkster](https://github.com/JPerkster). +* Lots of code cleanup toward pep8. + +#### 0.7.1 - February 5, 2015 + +* Improved talkbackbot regex, suggested by [PrideRage](https://github.com/PrideRage). + + +#### 0.7.0 - February 4, 2015 + +* Adds a port of the awesome [talkbackbot](https://github.com/jessamynsmith), thanks to [jessamynsmith](https://github.com/jessamynsmith), who super-kindly ported it at my request! +* Oh, yeah. That port also includes the first proper tests in will, and a pretty solid pattern for testing plugins. Woo! More huge thanks to [jessamynsmith](https://github.com/jessamynsmith). + + +#### 0.6.9 - January 30, 2015 + +* Fixed copypasta error caught by the keen eye of [dpoirier](https://github.com/dpoirier). + +#### 0.6.8 - January 30, 2015 + +* Will now supports templates directories within plugins. Just put a `templates` directory in the plugin's module, and it will be detected. Thanks to [sivy](https://github.com/sivy) for the idea and willingness to get it done! + + +#### 0.6.7 - January 29, 2015 + +* Addition of `.get_user_by_nick()` method, to look up users by nick, thanks to [sivy](https://github.com/sivy). +* Bugfix to `ALLOW_INSECURE_HIPCHAT_SERVER` when specified in `config.py`, thanks to [sivy](https://github.com/sivy). + +#### 0.6.6 - January 29, 2015 + +* New `room.history` attribute with a room's history, thanks to [PrideRage](https://github.com/PrideRage) +* New setting: `ALLOW_INSECURE_HIPCHAT_SERVER`, which will disable SSL checks (you're on your own), thanks to [sivy](https://github.com/sivy). +* Adds support for V2 of the WorldWeatherOnline API (used for world times, weather) thanks to [woohgit](https://github.com/woohgit). +* Adds new release and doc deploy scripts, so the github [releases](https://github.com/skoczen/will/releases) are kept up to date. Thanks to [crccheck](https://github.com/crccheck) for noticing and reporting they were stale! + + +#### 0.6.5 - January 23, 2015 + +* Removes mkdocs from the production requirements.txt to fix a Jinja version problem. Thanks to the report from [PrideRage](https://github.com/PrideRage). + +#### 0.6.4 - January 19, 2015 + +* Switches to bottle to cherrypy over gevent, which should solve lingering gevent DNS threading issues, thanks to [wohali](https://github.com/wohali). +* Support for @will, @WILL, @wIll, thanks to [neronmoon](https://github.com/neronmoon) + + +#### 0.6.3 - December 30, 2014 + +* Better error handling for weirdly formatted messages. +* Better generated README, thanks to [bsvetchine](https://github.com/bsvetchine). + + +#### 0.6.2 - September 23, 2014 + +* Bugfix on `generate_will_project`, thanks to the report by [MattyDub](https://github.com/MattyDub). + + +#### 0.6.1 - September 23, 2014 + +* Freezes apscheduler to < 3.0, since its API was backwards incompatibile. + + +#### 0.6.0 - September 17, 2014 + +* Methods in a single class now share a common instance, thanks to [amckinley](https://github.com/amckinley). +* Redis connections are now pooled (which should help with "max clients exceeded" errors), thanks to [carsongee](https://github.com/carsongee). +* Preliminary travis ci support, thanks to [pcurry](https://github.com/pcurry). +* More gramatically correct documentation by [hobson](https://github.com/hobson). + + +#### 0.5.7 - September 3, 2014 + +* Improvements to setup.py to be robust a variety of linux/unixes by [hobson](https://github.com/hobson). + + +#### 0.5.6 - August 26, 2014 + +* Fix for 1-1 bootstrapping bug, thanks to [adamcin](https://github.com/adamcin). + + +#### 0.5.5 - August 25, 2014 + +* Full html support in 1-1 chats, thanks to [adamcin](https://github.com/adamcin). + + +#### 0.5.4 - July 22, 2014 + +* Upgrades bottle to 0.12.6 to fix [security bug](http://osvdb.org/show/osvdb/106526). + + +#### 0.5.3 - July 11, 2014 + +* `@randomly` functions now can run on the 59th minute, thanks to [tomokas](https://github.com/tomokas). +* Bad merge that duplicated `help.py` fixed by [netjunki](https://github.com/netjunki). +* "global name 'params' is not defined" bug fixed by [amckinley](https://github.com/amckinley). + + +#### 0.5.1 - July 2, 2014 + +* New `HIPCHAT_SERVER` setting to support [beta HipChat Server](https://www.hipchat.com/server), thanks to [mrgrue](https://github.com/mrgrue). + + +#### 0.5 Omnibus - June 27, 2014 + +* Big, big release, with backwards-incompatble changes. Please read all the notes on this one! +* All-new config and environment setup, including an all-new `config.py` for plugin configuration, and all non-sensitive settings. +* Much, much improved bootstrapping code that validates settings, gives helpful output, and generally helps you get will running. +* Documentation! Real-live documentation! +* **Breaking**: `WILL_TOKEN` has been renamed `WILL_HIPCHAT_V1_TOKEN`. +* New `@require_settings` decorator for plugins to request validation that needed settings are present. +* Will now has a concept of modules (groups of plugins), and groups help output according. + + +#### 0.4.10 - June 6, 2014 + +* Brand-new `admin_only` argument to `hear()` and `respond_to()`, thanks to [rbp](https://github.com/rbp). If a user is not in `WILL_ADMINS`, they won't be able to run any `admin_only=True` plugins. Default for `WILL_ADMINS` is all users to retain backwards-compatibility. +* All commands in the `storage.py` plugin are now admin-only. +* `help` now only responds to direct asks, allowing other plugins to handle "help me with x", thanks to [bfhenderson](https://github.com/bfhenderson) + + +#### 0.4.9 - May 28, 2014 + +* Passing a `room` to a `.say()` now works properly, thanks to [rbp](https://github.com/rbp). +* New optional `WILL_LOGLEVEL` setting, thanks to [dpoirier](https://github.com/dpoirier). + + +#### 0.4.8 - May 21, 2014 + +* Will now ignores all previously sent messages properly, by passing in `bot` as the resource instead of an ugly time hack, thanks to [dpoirier](https://github.com/dpoirier). + + +#### 0.4.7 - May 15, 2014 + +* Will now prints a helpful message if one of your `WILL_ROOMS` is wrong, and continues starting, instead of crashing in a fiery ball, thanks to [crccheck](https://github.com/crccheck). + + +#### 0.4.6 - May 5, 2014 + +* `@route` decorators now honor all bottle arguments, most helpfully `method`! + + +#### 0.4.5 - May 2, 2014 + +* Awesome new help system by [quixeybrian](https://github.com/quixeybrian). +* "@will help" now only displays functions with docstrings, and formats them nicely. +* Old help (regexes and all) is available at "@will programmer help" + + +#### 0.4.4 - April 22, 2014 + +* Removes the dependence on the v1 token (though it still helps with rate-limiting), thanks to [bfhenderson](https://github.com/bfhenderson). +* Much friendlier error message on an invalid API key, thanks to [adamgilman](https://github.com/adamgilman). + +#### 0.4.3 - ~ April 1, 2014 + +* Support for hundreds of users and rooms without hitting the API limit. +* `get_all_users` use of the bulk API [added](https://github.com/greenkahuna/will/pull/18) by [quixeybrian](https://github.com/quixeybrian). Thanks also to [jbeluch](https://github.com/jbeluch) and [jdrukman](https://github.com/jdrukman) for nudges in the right direction. +* The start of some useful comments - the meat of will was hacked out by one person over a handful of days and it looks that way. Slowly but surely making this codebase more friendly to other contributions! +* Added a CONTRIBUTING.md file thanks to [michaeljoseph](https://github.com/michaeljoseph). +* Proper releases in the docs, and an updated `AUTHORS` file. If you see something awry, send a PR! + +#### 0.4 - ~ March 2014 + +* Ye olden past before we started keeping this list. All contributions by GreenKahuna. Will did everything that's not in the release list above. That's called lazy retconning release lists! + + +- Make sure nothing from the readme is missed. + diff --git a/docs/roadmap.md b/docs/roadmap.md index f58716c1..6dd8d8a7 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -1,4 +1,6 @@ -Last Update: May 5, 2017 +Last Update: November 5, 2017 + +Quick note: I'll be updating this with more information now that Will 2.0 is out, and we're learning what really makes sense in the wild. What's below is roughly the roadmap from April 2017. ## A Note from Steven @@ -41,23 +43,25 @@ Will the company will focus, like Wordpress, on running the PaaS and SaaS platfo Here's the nuts and bolts of how, today, we see this rolling out. -0.9.4 - Just released, catches up almost all open PRs +0.9.4 - Released April 25, 2017 - catches up almost all open PRs + +1.0 - Released September 29, 2017 closes up existing issues, code cleanup and prep for improvements -1.0 - Soon, closes up existing issues, code cleanup and prep for improvements +2.0 - November 4, 2017 - Slack Support, `IOBackend` documented and working. PRs for new IOs accepted. -1.2 - Slack Support, `IOBackend` documented and working. PRs for new IOs accepted. +2.1 - A pure-python pubsub backend, Telegram Support, and a cleaned up API for introspecting and accessing the results of analysis and generation. -1.3 - API Support released, via an `APIBackend` implementation of `IOBackend`. +2.2 - API Backend released, via an `APIBackend` implementation of `IOBackend`. Allows folks to spin up Will and control him completely via a RESTful API. -1.4 - IFTTT Support, `SkillsBackend` documented and working. PRs for new Skills accepted. +2.3 - IFTTT Support, `SkillsBackend` documented and working. PRs for new Skills accepted. -1.5 - Will UI, with on-the-fly config, plugin enable/disable, and restartability. +2.5 - Will UI, with on-the-fly config, plugin enable/disable, and restartability. -1.6 - App specs for AIOS and `AIOSApp` class released. +2.6 - App specs for AIOS and `AIOSApp` class released. -1.7 - Release of first five apps. TBD, but considered: (Image me, Remind me, Groceries, News Summary, Scattegories, Stale Package Finder) +2.7 - Release of first five apps. TBD, but considered: (Image me, Remind me, Groceries, News Summary, Scattegories, Stale Package Finder) -2.0 - App Marketplace released, Git library integration released, and all existing Will plugins released as AIOS apps. +3.0 - App Marketplace released, Git library integration released, and all existing Will plugins released as AIOS apps. 2.0+ - "The root of all evil is premature optimization." Releases after 2.0 are likely to move in a direction of improved AIOS features, more built-in AI tools, smarter and richer message processing and context, cross-app communication, and speed/reliability bumps. We'd also like to look at the feasibility of authoring apps in both Python and JS. diff --git a/docs/upgrading_to_2.md b/docs/upgrading_to_2.md index 5331f677..d25d8e7d 100644 --- a/docs/upgrading_to_2.md +++ b/docs/upgrading_to_2.md @@ -1,8 +1,12 @@

Upgrading to Will 2.0

-Will 2.0 is finally here, and its main goal was to free people using Will from being locked into a single chat provider, and add some more flexibility to his brain. You can read the [release announcement](https://heywill.io/will2) for a bit more context, and some good reasons why you'll want to upgrade! +Will was born four years ago, and 0.x and 1.x lived long, good lives. -# The short version: just pip install +But as the years passed, there were increasing concerns about HipChat lock-in, and it was time to make Will smarter. + +So six months ago, work on Will 2.0 began, and today it's finally here! All of our Wills are free from lock-in, future-proofed, and whole lot smarter. If you're just hearing about this, it's worth a quick read of the [release announcement](https://heywill.io/will2) for a bit more context! + +# The Short Version: Just pip install While Will has picked up a bunch of features and improvements in 2.0, we've aimed to keep him backwards-compatable with 1.x and 0.x releases. If you weren't using any undocumented internal methods and you're already using redis, upgrading should be as easy as: ```shell @@ -11,13 +15,13 @@ pip install --upgrade will From there, you can just `./run_will.py`, and things should Just Work. -You will, however, see a lot of output from Will, telling you that some names have changed, and asking you to update them in your config.py when you have time. You can either just follow those instructions, or the guide below. +You will, however, see a lot of output from Will, telling you that some names have changed, and asking you to update them in your `config.py` when you have time. You can either just follow those instructions, or the guide below. -# The long version: +# The Long Version: ## 1. Add IO backends. -If you're just planning to continue using HipChat, we'd recommend that you add this to your `config.py`: +If you're planning to continue only using HipChat (until it's replaced by Stride), we'd recommend that you add this to your `config.py`: ```python IO_BACKENDS = [ @@ -28,14 +32,17 @@ IO_BACKENDS = [ ] ``` -That will enable the HipChat and local shell stdin/stdout backend, for easy testing. If you want to also bring your Will into a Slack or Rocket.Chat room in the future, just uncomment that backend and restart! +That will enable the HipChat and local shell stdin/stdout backend, for easy testing. + +If you want to also bring your Will into a Slack or Rocket.Chat room in the future, just uncomment that backend and restart! ## 2. Update the HipChat tokens to be namespaced. -You'll see this starting up, but when you have time, update your tokens as follows: (If you're using `WILL_` environment variables, please add the `WILL_` as needed:) +You'll see this starting up, but when you have time, update your tokens as follows: +(If you're using `WILL_` environment variables, please add the `WILL_` as needed:) - `USERNAME` becomes `HIPCHAT_USERNAME` -- `TOKEN` becomes `HIPCHAT_V1_TOKEN` +- `TOKEN` or `V1_TOKEN` become `HIPCHAT_V1_TOKEN` - `V2_TOKEN` becomes `HIPCHAT_V2_TOKEN` - `DEFAULT_ROOM` becomes `HIPCHAT_DEFAULT_ROOM` - `HANDLE` should be removed, as it's now pulled live from the HipChat servers and not used. @@ -48,12 +55,12 @@ You'll see this starting up, but when you have time, update your tokens as follo At the moment, Redis is the only working pubsub backend, and is required to run Will. So, if you're not already running it, you'll need it for 2.x. -If this is impossible for your setup, ZeroMQ support is in the works, and we're looking to add a pure-python backend as well in 2.1 or 2.2. +If this is impossible for your setup, ZeroMQ support is in the works, and we're looking to add a pure-python backend as well in 2.1 or 2.2. Creating a new pubsub backend just requires subclassing `BasePubSub` and implementing four methods - so if someone has a little time to bring those along, a pull request is welcome! ## 4. Set your encryption secret key. -Will now encrypts all messages on the pubsub wire and in storage by default. Without a `SECRET_KEY` set, he'll auto-generate one based on the machine MAC address, but this isn't a perfect solution, and will mean that he can't access his storage if there are hardware changes (or he's running in a virtualized environment.) +Will now encrypts all messages on the pubsub wire and in storage by default. Without a `SECRET_KEY` set, he'll auto-generate one based on the machine MAC address, but this isn't a perfect solution, and will mean that he can't access his storage if there are hardware changes (or he's running in a virtualized environment that has shifting MACs.) Please set `SECRET_KEY` as soon as possible. @@ -76,7 +83,7 @@ It's worth reading through the new `config.py`, but here's a few areas specifica ### Platform and Decision-making -As mentioned above, there are now multiple IO mediums and platforms that Will can communicate on. It's also now easy to [write your own](/backends/io), pull requests are very welcome, and more are coming soon. Here's all the options: +As mentioned above, there are now multiple IO backends and platforms that Will can communicate on. It's also now easy to [write your own](/backends/io), pull requests are very welcome, and more are coming soon. Here's all the options: ```python IO_BACKENDS = [ @@ -88,7 +95,7 @@ IO_BACKENDS = [ ``` -Will 2 also comes with pluggable brains - split into Analysis, Generation, and Execution backends. The defaults are solid and behave similarly to Will 1.0 (the only difference is a high-confidence fuzzy matching engine), but if you're interested in making your Will more flexible, or adding more context to his responses, building custom backends is easy. +Will 2 also comes with pluggable brains - split into Analysis, Generation, and Execution backends. The defaults are solid and behave similarly to Will 1.0 (the only difference is a high-confidence fuzzy matching engine), but if you're interested in making your Will more flexible, or adding more context to his responses, building [custom backends is easy](/backends/analysis). Here's all of the options, with the defaults uncommented. It's worth pulling this into your `config.py`. diff --git a/mkdocs.yml b/mkdocs.yml index 39abdd9c..6bf7d655 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,7 +3,7 @@ site_url: http://skoczen.github.io/will site_description: "Will is a simple, beautiful-to-code python hipchat bot" pages: - Get Started: index.md -- Upgrade to 2: upgrading_to_2.md +- Upgrade to 2.0: upgrading_to_2.md - Teach Your Will: - The Basics: plugins/basics.md - What Will Can Notice: plugins/notice.md @@ -14,6 +14,7 @@ pages: - Configure: config.md - Deploy: deploy.md - Improve: improve.md +- Releases: releases.md - Roadmap: roadmap.md extra_javascript: - themes/will/js/base.js From deead3f67b5205d673c896b9378b587e4492e415 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 2 Nov 2017 18:36:13 +1300 Subject: [PATCH 089/200] Lots of docs, consistency in backend method names --- docs/backends/analysis.md | 86 ++++++++++++++++++- docs/backends/encryption.md | 74 ++++++++++++++++- docs/backends/execution.md | 92 ++++++++++++++++++++- docs/backends/generation.md | 92 ++++++++++++++++++++- docs/backends/io.md | 76 ++++++++++++++++- docs/backends/overall.md | 22 +++++ docs/backends/pubsub.md | 75 ++++++++++++++++- docs/backends/storage.md | 72 +++++++++++++++- docs/img/all_the_things.jpg | Bin 0 -> 42649 bytes mkdocs.yml | 4 + will/backends/pubsub/base.py | 70 +++++++++------- will/backends/storage/base.py | 36 ++++---- will/backends/storage/couchbase_backend.py | 4 +- will/backends/storage/file_backend.py | 4 +- will/backends/storage/redis_backend.py | 4 +- 15 files changed, 650 insertions(+), 61 deletions(-) create mode 100644 docs/backends/overall.md create mode 100644 docs/img/all_the_things.jpg diff --git a/docs/backends/analysis.md b/docs/backends/analysis.md index 8aae73e8..2a7ecbc3 100644 --- a/docs/backends/analysis.md +++ b/docs/backends/analysis.md @@ -1 +1,85 @@ -# Context is king \ No newline at end of file + +## Overview +We never communicate in the void - there's always a context, and things to read into a particular message, depending who said it, when, and how - and that's exactly what Will's analysis backends are for. + +They look at an incoming message and everything around it, and add context. + +Will has the following analysis backends built-in, more are on the way (like sentiment analysis) and it's easy to make your own or contribute one to the project: + +- History (`will.backends.analysis.history`) +- Nothing (`will.backends.analysis.nothing`) + + +## Choosing your backends + + +Here's a bit more about the built-ins, and when they'd be a good fit: + +### History (`will.backends.analysis.history`) + +Just adds the last 20 messages he heard into the context, and stores this one for the future. + +### Nothing (`will.backends.analysis.nothing`) + +Does absolutely nothing. But it is a nice template for building your own! + + + +Considerations, etc + +## Setting your backends + +`config.py` +required settings + +## Contributing a new backend + +## Implementing a new backend + +Writing a new storage backend is fairly straightforward - simply subclass `BaseStorageBackend`, and implement: + +1) the five required methods, then +2) specify any required settings with `required_settings`. + + +```python +from will.backends.storage.base import BaseStorageBackend + + +class MyCustomStorageBackend(BaseStorageBackend): + """A custom storage backend using the latest, greatest technology. + + You'll need to provide a GREAT_API_KEY to use it. + + """" + + required_settings = [ + { + "name": "GREAT_API_KEY", + "obtain_at": """1. Go to greatamazingtechnology.com/api +2. Click "Generate API Key" +3. Copy that key, and set it in your Will. +""", + }, + ] + + + # All storage backends must supply the following methods: + def __init__(self, *args, **kwargs): + # Connects to the storage provider. + + def do_save(self, key, value, expire=None): + raise NotImplemented + + def do_load(self, key): + raise NotImplemented + + def clear(self, key): + raise NotImplemented + + def clear_all_keys(self): + raise NotImplemented + +``` + +From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) \ No newline at end of file diff --git a/docs/backends/encryption.md b/docs/backends/encryption.md index 6db49bc5..e8dfd5b9 100644 --- a/docs/backends/encryption.md +++ b/docs/backends/encryption.md @@ -1 +1,73 @@ -# Encrypt all the things \ No newline at end of file +# Encryption Backends + +## Overview +Encryption backends are what lets Will keep his thoughts private - safe from prying eyes, and would-be spies. + +All of Will's short and long-term memory (`pubsub` and `storage`) are encrypted by default. + +Will supports the following options for storage backend, and improvements and more backends are welcome: + +- AES (`will.backends.storage.aes`) + +## Choosing a backend + +Considerations, etc + +Will's AES backend uses AES in CBC mode to encrypt. + +## Setting your backend + +`config.py` +required settings + +## Creating a new backend + +## Implementing a new backend + +Writing a new storage backend is fairly straightforward - simply subclass `BaseStorageBackend`, and implement: + +1) the five required methods, then +2) specify any required settings with `required_settings`. + + +```python +from will.backends.storage.base import BaseStorageBackend + + +class MyCustomStorageBackend(BaseStorageBackend): + """A custom storage backend using the latest, greatest technology. + + You'll need to provide a GREAT_API_KEY to use it. + + """" + + required_settings = [ + { + "name": "GREAT_API_KEY", + "obtain_at": """1. Go to greatamazingtechnology.com/api +2. Click "Generate API Key" +3. Copy that key, and set it in your Will. +""", + }, + ] + + + # All storage backends must supply the following methods: + def __init__(self, *args, **kwargs): + # Connects to the storage provider. + + def do_save(self, key, value, expire=None): + raise NotImplemented + + def do_load(self, key): + raise NotImplemented + + def clear(self, key): + raise NotImplemented + + def clear_all_keys(self): + raise NotImplemented + +``` + +From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) \ No newline at end of file diff --git a/docs/backends/execution.md b/docs/backends/execution.md index be0d3aa0..d351ae2b 100644 --- a/docs/backends/execution.md +++ b/docs/backends/execution.md @@ -1 +1,91 @@ -# Just do it \ No newline at end of file +# Execution Backends + +## Overview +After we've thought of all the possibilities, we then have to decide what we want to do or say. That's where Will's execution backends come in. + +They take the context created by `analysis`, and the options created by `generation`, and make a decision on what to do. + +Will has the following execution backends built-in, and it's easy to make your own or contribute one to the project: + +- All (`will.backends.execution.all`) +- Best Score (`will.backends.execution.best_score`) + + +## Choosing your backends + + +Here's a bit more about the built-ins, and when they'd be a good fit: + +### All (`will.backends.execution.all`) + +![All the things](../img/all_the_things.jpg) + +This is Will's crazy, do-everything mode. He'll take every idea he got in the generation cycle and do *all* of them. Why? Because he's crazy like that. + +Or, more likely, because you've built a custom generation backend that limits him down to a set of options you always want done. + + +### Best Score (`will.backends.execution.best_score`) + +This is the right fit for most people, and it's the most similar to how our brains work. Will looks at the options he has, and picks the single one he thinks is the best. + + + +Considerations, etc + +## Setting your backends + +`config.py` +required settings + +## Contributing a new backend + +## Implementing a new backend + +Writing a new storage backend is fairly straightforward - simply subclass `BaseStorageBackend`, and implement: + +1) the five required methods, then +2) specify any required settings with `required_settings`. + + +```python +from will.backends.storage.base import BaseStorageBackend + + +class MyCustomStorageBackend(BaseStorageBackend): + """A custom storage backend using the latest, greatest technology. + + You'll need to provide a GREAT_API_KEY to use it. + + """" + + required_settings = [ + { + "name": "GREAT_API_KEY", + "obtain_at": """1. Go to greatamazingtechnology.com/api +2. Click "Generate API Key" +3. Copy that key, and set it in your Will. +""", + }, + ] + + + # All storage backends must supply the following methods: + def __init__(self, *args, **kwargs): + # Connects to the storage provider. + + def do_save(self, key, value, expire=None): + raise NotImplemented + + def do_load(self, key): + raise NotImplemented + + def clear(self, key): + raise NotImplemented + + def clear_all_keys(self): + raise NotImplemented + +``` + +From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) \ No newline at end of file diff --git a/docs/backends/generation.md b/docs/backends/generation.md index 615fe451..b46a7918 100644 --- a/docs/backends/generation.md +++ b/docs/backends/generation.md @@ -1 +1,91 @@ -# It's good to have options \ No newline at end of file +# Generation Backends + +## Overview +Generation backends are Will's equivalent of that momement when we pause, and run through all the possible things we could say. Some of them are great ideas. Some of them are terrible ideas. But the process of _generation_ doesn't care - it's just about making as many ideas as possible. + +Will's generation backends do the same thing - try to come up with things Will *could* say or do to respond to what he heard. + +Will has the following generation backends built-in, and it's easy to add your own or contribute one to the project: + +- Fuzzy Match (all) (`will.backends.generation.fuzzy_all_matches`) +- Fuzzy Match (best) (`will.backends.generation.fuzzy_best_match`) +- Strict Regex (`will.backends.generation.strict_regex`) + + +## Choosing your backends + +Like our brain processes, we can have lots of different ways to generate ideas, working together. You don't have to pick just one generation backend for Will. Depending on your setup, it might be the more, the merrier. + +Here's a bit more about the built-ins, and when they'd be a good fit: + +### Fuzzy Match (all) (`will.backends.generation.fuzzy_all_matches`) + +Great at.. + +### Fuzzy Match (best) (`will.backends.generation.fuzzy_best_match`) + +Great at.. + +### Strict Regex (`will.backends.generation.strict_regex`) + +Great at.. + + +Considerations, etc + +## Setting your backends + +`config.py` +required settings + +## Contributing a new backend + +## Implementing a new backend + +Writing a new storage backend is fairly straightforward - simply subclass `BaseStorageBackend`, and implement: + +1) the five required methods, then +2) specify any required settings with `required_settings`. + + +```python +from will.backends.storage.base import BaseStorageBackend + + +class MyCustomStorageBackend(BaseStorageBackend): + """A custom storage backend using the latest, greatest technology. + + You'll need to provide a GREAT_API_KEY to use it. + + """" + + required_settings = [ + { + "name": "GREAT_API_KEY", + "obtain_at": """1. Go to greatamazingtechnology.com/api +2. Click "Generate API Key" +3. Copy that key, and set it in your Will. +""", + }, + ] + + + # All storage backends must supply the following methods: + def __init__(self, *args, **kwargs): + # Connects to the storage provider. + + def do_save(self, key, value, expire=None): + raise NotImplemented + + def do_load(self, key): + raise NotImplemented + + def clear(self, key): + raise NotImplemented + + def clear_all_keys(self): + raise NotImplemented + +``` + +From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) \ No newline at end of file diff --git a/docs/backends/io.md b/docs/backends/io.md index 722ab9a5..c86802a3 100644 --- a/docs/backends/io.md +++ b/docs/backends/io.md @@ -1 +1,75 @@ -# Gotta talk, Gotta hear. \ No newline at end of file +# IO Backends + +## Overview +IO backends are how Will talks and listens to the outside world. They're designed to abstract away the technical intracies of interfacing with a given platform, and let users just _use_ them. + +Will supports the following io backends: + +- Slack (`will.backends.storage.slack`) +- Hipchat (`will.backends.storage.hipchat`) +- Rocket.Chat (`will.backends.storage.rocketchat`) +- Shell (`will.backends.storage.shell`) + + +## Choosing your backends + +This isn't a zero-sum game with will. You can use as many backends as you'd like, all at once. + +Considerations, etc + +## Setting your backends + +`config.py` +required settings + +## Contributing a new backend + +## Implementing a new backend + +Writing a new storage backend is fairly straightforward - simply subclass `BaseStorageBackend`, and implement: + +1) the five required methods, then +2) specify any required settings with `required_settings`. + + +```python +from will.backends.storage.base import BaseStorageBackend + + +class MyCustomStorageBackend(BaseStorageBackend): + """A custom storage backend using the latest, greatest technology. + + You'll need to provide a GREAT_API_KEY to use it. + + """" + + required_settings = [ + { + "name": "GREAT_API_KEY", + "obtain_at": """1. Go to greatamazingtechnology.com/api +2. Click "Generate API Key" +3. Copy that key, and set it in your Will. +""", + }, + ] + + + # All storage backends must supply the following methods: + def __init__(self, *args, **kwargs): + # Connects to the storage provider. + + def do_save(self, key, value, expire=None): + raise NotImplemented + + def do_load(self, key): + raise NotImplemented + + def clear(self, key): + raise NotImplemented + + def clear_all_keys(self): + raise NotImplemented + +``` + +From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) \ No newline at end of file diff --git a/docs/backends/overall.md b/docs/backends/overall.md new file mode 100644 index 00000000..e75df0aa --- /dev/null +++ b/docs/backends/overall.md @@ -0,0 +1,22 @@ +# Backend Overview + +## Design + +Will is designed rather a lot like our own brains. + +His backends are specific parts of the process of noticing something, deciding what to do, and taking action, and they each interact with each other. + +Just like us, he hears and sees things (`io`), understands the context in which they happened (`analysis`), generates possible actions (`generation`), decides on something to do (`execution`), and does it (`io`). Along the way, he has both short term, working memory (`pubsub`), and long-term, permanent memory (`storage`). + +If you've been thinking about diving into Artificial Intelligence or bots, and wondering how it works, the answer lies right there, in your own head. + +Dig a little deeper, and see how each piece of Will's brain works, what things you should think about as you set him up, and how you can make him even better. + +- [Noticing and Acting `io`](/backends/io) +- [Analyzing and Context `analysis`](/backends/analysis) +- [Generating possible actions `generation`](/backends/generation) +- [Deciding what to do `execution`](/backends/execution) +- [Short-term, working memory `pubsub`](/backends/pubsub) +- [Long term memory `storage`](/backends/storage) + + diff --git a/docs/backends/pubsub.md b/docs/backends/pubsub.md index 6ccafb29..876c722a 100644 --- a/docs/backends/pubsub.md +++ b/docs/backends/pubsub.md @@ -1 +1,74 @@ -# Go with the flow \ No newline at end of file +# Publish-Subscribe (Pubsub) Backends + +## Overview +Pubsub backends handle all the internal messaging between Will's core components. They're designed to be lightweight, reliable, and ephemeral - a lot like our brain's working memory. + +Will supports the following options for pubsub backend: + +- Redis (`will.backends.pubsub.redis`) + +## Choosing a backend + +## Setting your backend + +`config.py` +required settings + +## Contributing a new backend + +Writing a new pubsub backend is fairly straightforward - simply subclass `BasePubSub`, and implement: + +1) the four required methods, and +2) a bootstrap method. + +```python +from will.backends.pubsub.base import BasePubSub + + +class MyCustomPubsubBackend(BasePubSub): + """A custom pubsub backend using the latest, greatest framework. + + You'll need to provide a GREAT_API_KEY to use it. + + """" + required_settings = [ + { + "name": "GREAT_API_KEY", + "obtain_at": """1. Go to greatamazingframework.com/api +2. Click "Generate API Key" +3. Copy that key, and set it in your Will. +""", + }, + ] + + def __init__(self, settings): + # Do whatever I need to do to kick off the backend. + + def do_subscribe(self, topic): + """ + Registers with the backend to only get messages matching a specific topic. + Where possible, wildcards are allowed + """ + raise NotImplementedError + + def do_unsubscribe(self, topic): + """Unregisters with the backend for a given topic.""" + raise NotImplementedError + + def publish_to_backend(self, topic, str): + """Publishes a string to the backend with a given topic.""" + raise NotImplementedError + + def get_from_backend(self): + """ + Gets the latest pending message from the backend (FIFO). + Returns None if no messages are pending, and is expected *not* to be blocking. + """ + raise NotImplementedError + +def bootstrap(settings) + MyCustomPubsubBackend(settings) + +``` + +From there, just test it out, and submit a [pull request!](https://github.com/skoczen/will/pulls) \ No newline at end of file diff --git a/docs/backends/storage.md b/docs/backends/storage.md index 5463cde1..29676957 100644 --- a/docs/backends/storage.md +++ b/docs/backends/storage.md @@ -1 +1,71 @@ -# Know what you know \ No newline at end of file +# Storage Backends + +## Overview +Storage backends handle all of Will's long-term memory They're designed to be durable, reliable, and robust - a lot like our brain's long-term memory, but without the forgetfulness. + +Will supports the following options for storage backend: + +- Redis (`will.backends.storage.redis`) +- Couchbase (`will.backends.storage.couchbase`) +- File (`will.backends.storage.file`) + +## Choosing a backend + +Considerations, etc + +## Setting your backend + +`config.py` +required settings + +## Creating a new backend + +## Implementing a new backend + +Writing a new storage backend is fairly straightforward - simply subclass `BaseStorageBackend`, and implement: + +1) the five required methods, then +2) specify any required settings with `required_settings`. + + +```python +from will.backends.storage.base import BaseStorageBackend + + +class MyCustomStorageBackend(BaseStorageBackend): + """A custom storage backend using the latest, greatest technology. + + You'll need to provide a GREAT_API_KEY to use it. + + """" + + required_settings = [ + { + "name": "GREAT_API_KEY", + "obtain_at": """1. Go to greatamazingtechnology.com/api +2. Click "Generate API Key" +3. Copy that key, and set it in your Will. +""", + }, + ] + + + # All storage backends must supply the following methods: + def __init__(self, *args, **kwargs): + # Connects to the storage provider. + + def do_save(self, key, value, expire=None): + raise NotImplemented + + def do_load(self, key): + raise NotImplemented + + def clear(self, key): + raise NotImplemented + + def clear_all_keys(self): + raise NotImplemented + +``` + +From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) \ No newline at end of file diff --git a/docs/img/all_the_things.jpg b/docs/img/all_the_things.jpg new file mode 100644 index 0000000000000000000000000000000000000000..327248eca9e2397937eeca9ea4801cfd390c9615 GIT binary patch literal 42649 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 uxwjtCk;l^H)nGF&J#~tNtnEk>6m$ Date: Thu, 2 Nov 2017 18:42:06 +1300 Subject: [PATCH 090/200] Fully fleshed out docs :) --- mkdocs.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index d4190828..830e8b36 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -11,15 +11,23 @@ pages: - Creating and Organizing Plugins: plugins/create.md - Plugin Builtins: plugins/builtins.md - Bundled Plugins: plugins/bundled.md -- Configure: config.md +- Configure: + - Overview: backends/overall.md + - Settings: config.md + - Noticing and Talking: backends/io.md + - Analysis and Context: backends/analysis.md + - Generation: backends/generation.md + - Decisions and Execution: backends/execution.md + - Pubsub and short-term memory: backends/pubsub.md + - Storage and long-term memory: backends/storage.md + - Encryption and privacy: backends/encryption.md - Deploy: deploy.md - Improve: improve.md # - Making Will Better and Better: improve.md - Releases: releases.md - Roadmap: roadmap.md -- Specs: specs.md - - Adding a PubSub Backend: backends/pubsub.md - - Adding a Storage Backend: backends/storage.md +# - "Brain": +# - "Will's Brain": extra_javascript: - themes/will/js/base.js - themes/will/js/bootstrap-3.0.3.min.js From a30c61eefe2393d27c9f1179e5a30a32c0ce6501 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Fri, 3 Nov 2017 11:50:23 -0400 Subject: [PATCH 091/200] ignore testing file so i do not stupidly commit passwords --- docker/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 docker/.gitignore diff --git a/docker/.gitignore b/docker/.gitignore new file mode 100644 index 00000000..f0f18cc1 --- /dev/null +++ b/docker/.gitignore @@ -0,0 +1 @@ +*.mike-love From b6e75b766f44660b89bd29545b5d8ca9716ad389 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Fri, 3 Nov 2017 11:50:58 -0400 Subject: [PATCH 092/200] moving to a multi py version dist method --- docker/will/Dockerfile | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100755 docker/will/Dockerfile diff --git a/docker/will/Dockerfile b/docker/will/Dockerfile deleted file mode 100755 index 166421db..00000000 --- a/docker/will/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -#Pull CENTOS -FROM python:2.7-stretch - -# Maintainer -# ---------- -MAINTAINER mlove@columnit.com - -ENV _WILL_HOME=/opt/will - -RUN mkdir -p $_WILL_HOME - -RUN pip install will - -WORKDIR $_WILL_HOME -RUN generate_will_project -CMD $_WILL_HOME/run_will.py From 589fb02d6c00bc657f6ea892305aa0ad1c7ec9b0 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Fri, 3 Nov 2017 11:51:52 -0400 Subject: [PATCH 093/200] create a base image for will that pulls from py2 alpine repo --- docker/will-base/base-2.x/Dockerfile | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 docker/will-base/base-2.x/Dockerfile diff --git a/docker/will-base/base-2.x/Dockerfile b/docker/will-base/base-2.x/Dockerfile new file mode 100644 index 00000000..033bd6a7 --- /dev/null +++ b/docker/will-base/base-2.x/Dockerfile @@ -0,0 +1,12 @@ +# PULL python +FROM python:2.7-alpine3.6 + +# Maintainer +LABEL maintainer="mlove@columnit.com" + +ENV _WILL_HOME=/opt/will + +RUN mkdir -p $_WILL_HOME + +RUN apk add --no-cache git build-base + From 9f3f22a1dd3f33ad2c00b07183216bcd7640250f Mon Sep 17 00:00:00 2001 From: Michael Love Date: Fri, 3 Nov 2017 11:52:31 -0400 Subject: [PATCH 094/200] create a base image for will that pulls from py3 alpine repo --- docker/will-base/base-3.x/Dockerfile | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 docker/will-base/base-3.x/Dockerfile diff --git a/docker/will-base/base-3.x/Dockerfile b/docker/will-base/base-3.x/Dockerfile new file mode 100644 index 00000000..fd0c09f6 --- /dev/null +++ b/docker/will-base/base-3.x/Dockerfile @@ -0,0 +1,13 @@ +# PULL python +FROM python:3.7-rc-alpine + + +# Maintainer +LABEL maintainer="mlove@columnit.com" + +ENV _WILL_HOME=/opt/will + +RUN mkdir -p $_WILL_HOME + +RUN apk add --no-cache git build-base + From 6cdda8e03e126f4956936207ec7b7ef5dc07a7e2 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Fri, 3 Nov 2017 11:55:45 -0400 Subject: [PATCH 095/200] create a will container definition that will pull from the will-base:py3 --- docker/will/will-py3/Dockerfile | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100755 docker/will/will-py3/Dockerfile diff --git a/docker/will/will-py3/Dockerfile b/docker/will/will-py3/Dockerfile new file mode 100755 index 00000000..580b53ee --- /dev/null +++ b/docker/will/will-py3/Dockerfile @@ -0,0 +1,12 @@ +#Pull from will-base +FROM heywill/will-base:3.7-alpine + +ARG branch=master +# Maintainer +# ---------- +LABEL maintainer=mlove@columnit.com + +RUN pip install git+https://github.com/skoczen/will.git@$branch +WORKDIR $_WILL_HOME +RUN generate_will_project +CMD $_WILL_HOME/run_will.py From fdea72cb146e6da79fc69d23d5684f1f2457aae6 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Fri, 3 Nov 2017 12:05:00 -0400 Subject: [PATCH 096/200] create a will container definition that will pull from the will-base:py2 --- docker/will/will-py2/Dockerfile | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100755 docker/will/will-py2/Dockerfile diff --git a/docker/will/will-py2/Dockerfile b/docker/will/will-py2/Dockerfile new file mode 100755 index 00000000..4cc23e87 --- /dev/null +++ b/docker/will/will-py2/Dockerfile @@ -0,0 +1,12 @@ +#Pull from will-base +FROM heywill/will-base:2.7-alpine + +ARG branch=master +# Maintainer +# ---------- +LABEL maintainer=mlove@columnit.com + +RUN pip install git+https://github.com/skoczen/will.git@$branch +WORKDIR $_WILL_HOME +RUN generate_will_project +CMD $_WILL_HOME/run_will.py From 8da567e4592de43acddc2a07867f3ea93a8e6ad9 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Fri, 3 Nov 2017 12:05:39 -0400 Subject: [PATCH 097/200] update docker compose to use latest image --- docker/docker-compose.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index cb1ddb0e..f914e597 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -6,7 +6,7 @@ services: volumes: - ./data/redis:/data will: - build: ./will/. + image: heywill/will:latest ports: - 8080:8080 env_file: @@ -14,6 +14,7 @@ services: volumes: - ./plugins:/opt/will/plugins - ./templates:/opt/will/templates + - ./config.py:/opt/will/config.py depends_on: - redis From fbf25b9d66ee4b278e55f8a64aeaa31aef86d1ed Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 26 Oct 2017 11:18:06 -0400 Subject: [PATCH 098/200] pull from docker base; allow branch as arg --- docker/will-base/Dockerfile | 13 +++++++++++++ docker/will/Dockerfile | 14 +++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 docker/will-base/Dockerfile diff --git a/docker/will-base/Dockerfile b/docker/will-base/Dockerfile new file mode 100644 index 00000000..903c4c94 --- /dev/null +++ b/docker/will-base/Dockerfile @@ -0,0 +1,13 @@ +# PULL python +FROM python:rc-aplpine + + +# Maintainer +LABEL maintainer="mlove@columnit.com" + +ENV _WILL_HOME=/opt/will + +RUN mkdir -p $_WILL_HOME + +RUN apk add --no-cache git build-base + diff --git a/docker/will/Dockerfile b/docker/will/Dockerfile index 166421db..d1b8bb84 100755 --- a/docker/will/Dockerfile +++ b/docker/will/Dockerfile @@ -1,15 +1,11 @@ -#Pull CENTOS -FROM python:2.7-stretch - +#Pull from will-base +FROM heywill/will-base:latest +ARG branch=master # Maintainer # ---------- -MAINTAINER mlove@columnit.com - -ENV _WILL_HOME=/opt/will - -RUN mkdir -p $_WILL_HOME +LABEL maintainer=mlove@columnit.com -RUN pip install will +RUN pip install git+https://github.com/skoczen/will.git@$branch WORKDIR $_WILL_HOME RUN generate_will_project From 98ba11c9a3f13fc98d57a6987d4ce311555c19da Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 26 Oct 2017 11:24:24 -0400 Subject: [PATCH 099/200] fixed alpine typo --- docker/will-base/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/will-base/Dockerfile b/docker/will-base/Dockerfile index 903c4c94..6da5bd29 100644 --- a/docker/will-base/Dockerfile +++ b/docker/will-base/Dockerfile @@ -1,5 +1,5 @@ # PULL python -FROM python:rc-aplpine +FROM python:rc-alpine # Maintainer From f9f570d1407a7e2e1f31eb731a861060da440c9c Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 26 Oct 2017 12:21:08 -0400 Subject: [PATCH 100/200] moved to python2.7 to enable beta2.0 version' --- docker/will-base/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/will-base/Dockerfile b/docker/will-base/Dockerfile index 6da5bd29..4427d41e 100644 --- a/docker/will-base/Dockerfile +++ b/docker/will-base/Dockerfile @@ -1,5 +1,5 @@ # PULL python -FROM python:rc-alpine +FROM python:2.7-alpine # Maintainer From beef8a9192e7342e8c6d99c91fa7f5c7cf9c8f46 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 26 Oct 2017 12:22:55 -0400 Subject: [PATCH 101/200] move to base-2.7 to break out versions of python --- docker/will-base/{ => base-2.7}/Dockerfile | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docker/will-base/{ => base-2.7}/Dockerfile (100%) diff --git a/docker/will-base/Dockerfile b/docker/will-base/base-2.7/Dockerfile similarity index 100% rename from docker/will-base/Dockerfile rename to docker/will-base/base-2.7/Dockerfile From b016ae157da47b70b00755e465be876721d8fdb1 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Fri, 3 Nov 2017 12:40:08 -0400 Subject: [PATCH 102/200] updates for new params and dist --- docker/default.env | 23 +++++++++++++---------- docker/docker-compose.yml | 3 +-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/docker/default.env b/docker/default.env index 3c3fd535..5bd00b34 100644 --- a/docker/default.env +++ b/docker/default.env @@ -2,16 +2,19 @@ # REDIS Settings WILL_REDIS_URL=redis://redis:6379/ -# Hipchat Settings -WILL_HIPCHAT_SERVER= -WILL_USERNAME= -WILL_PASSWORD= -WILL_V2_TOKEN= -WILL_V1_TOKEN= -WILL_ALLOW_INSECURE_HIPCHAT_SERVER= - # WILL Settings - WILL_HTTPSERVER_PORT=8080 -WILL_LOGLEVEL=DEBUG +WILL_LOGLEVEL=ERROR + +# For Slack +WILL_SLACK_API_TOKEN + +# For Hipchat +WILL_HIPCHAT_USERNAME +WILL_HIPCHAT_PASSWORD +WILL_HIPCHAT_V2_TOKEN +# Rocket.Chat +WILL_ROCKETCHAT_USERNAME +WILL_ROCKETCHAT_PASSWORD +WILL_ROCKETCHAT_URL diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index cb1ddb0e..edceb03a 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -6,7 +6,7 @@ services: volumes: - ./data/redis:/data will: - build: ./will/. + image: heywill/will:latest ports: - 8080:8080 env_file: @@ -16,4 +16,3 @@ services: - ./templates:/opt/will/templates depends_on: - redis - From 80f3dd1a4138669e8c75d11244f5c5d41f5d1111 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Fri, 3 Nov 2017 12:41:13 -0400 Subject: [PATCH 103/200] docker updates for new dist methods --- docs/deploy.md | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/docs/deploy.md b/docs/deploy.md index 1863e125..45b6ff5b 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -9,7 +9,7 @@ Heroku is our recommended platform for deployment because it's simple, easy, and #### Step 1: Set up your heroku app, and a redis addon. Assuming you have the [heroku toolbelt](https://toolbelt.heroku.com/) installed and all set up, it's as easy as this: - + ```bash heroku create our-will-name heroku addons:add rediscloud @@ -79,14 +79,14 @@ Simple. For best-practices, see our continuous deployment recommendations below ## Deploy in Docker -Will is packaged with a Dockerfile and docker-compose files to allow deploying in a container with redis. +Will is packaged with a Dockerfile and docker-compose files to allow deploying in a container with redis. ### Pre-requisites -You should have docker already installed; additionally, the instructions require docker-compose. If you're not using docker-compose, you must start the image via the docker command with the correct arguments. +You should have docker already installed; additionally, the instructions require docker-compose. If you're not using docker-compose, you can still use the pre-defined images from Docker Hub (https://hub.docker.com/r/heywill/will/). ### Step 1: Configure your container's environment variables In Will's docker directory, update the default.env file with your environment's settings. At a minimum, this should contain: -```bash +```bash # For Slack WILL_SLACK_API_TOKEN # For Hipchat @@ -98,24 +98,24 @@ WILL_ROCKETCHAT_USERNAME WILL_ROCKETCHAT_PASSWORD WILL_ROCKETCHAT_URL ``` -Note, we've pre-defined the redis url and the HTTP Server port; if you update these values, make sure you update the docker-compose file accordingly. +Note, we've pre-defined the redis url and the HTTP Server port; if you update these values, make sure you update the docker-compose file accordingly. ### Step 2: Deploy your plugins and templates If you have any custom templates, create directories for your plugins and templates, and load your plugins and templates they'll be mounted when the container starts up giving your containerized bot access to your templates. -```bash +```bash mkdir ./plugins ./templates ``` ### Step 3: Build will. Run build your docker image locally. ```bash -docker-compose build +docker-compose build ``` ### Step 4: Start the container Start your image from docker-compose using: ```bash -docker-compose up +docker-compose up ``` or to run the container in the background, ```bash @@ -243,5 +243,3 @@ Our stack is set up so that any pushes on will's master branch have tests run on Continuous Deployment has dramatically changed how we build and use will - instead of talking about "what if will did...", generally, people just implement it, push it, and play with it for real. It's been a great place to be. It might be for you too. That's it in getting your will up and running! But maybe you're one of those people who wants to pitch in and make will even better. Awesome. Learn [how to improve will](improve.md). - - From d232dca639d2ea760cce6bb6f0a1d3be227d9603 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Sat, 4 Nov 2017 12:23:48 +1300 Subject: [PATCH 104/200] Interactive generation, documentation nav and transitions. --- docs/backends/analysis.md | 4 ++- docs/backends/encryption.md | 4 ++- docs/backends/execution.md | 4 ++- docs/backends/generation.md | 4 ++- docs/backends/io.md | 4 ++- docs/backends/overall.md | 6 ++--- docs/backends/pubsub.md | 4 ++- docs/backends/storage.md | 4 ++- docs/config.md | 2 +- docs/improve.md | 2 +- docs/index.md | 2 +- docs/releases.md | 10 +++---- mkdocs.yml | 12 ++++----- will/scripts/generate_will_project.py | 38 ++++++++++++++++++++++++--- 14 files changed, 71 insertions(+), 29 deletions(-) diff --git a/docs/backends/analysis.md b/docs/backends/analysis.md index 2a7ecbc3..6cebe60b 100644 --- a/docs/backends/analysis.md +++ b/docs/backends/analysis.md @@ -82,4 +82,6 @@ class MyCustomStorageBackend(BaseStorageBackend): ``` -From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) \ No newline at end of file +From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) + +Now we've got context, let's look at how [Will generates possibilities](/platform/generation). \ No newline at end of file diff --git a/docs/backends/encryption.md b/docs/backends/encryption.md index e8dfd5b9..7c003cb2 100644 --- a/docs/backends/encryption.md +++ b/docs/backends/encryption.md @@ -70,4 +70,6 @@ class MyCustomStorageBackend(BaseStorageBackend): ``` -From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) \ No newline at end of file +From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) + +That's Will's brain, end-to-end. If you haven't already, dig into how to get him [deployed](/deploy.md)! \ No newline at end of file diff --git a/docs/backends/execution.md b/docs/backends/execution.md index d351ae2b..002ea676 100644 --- a/docs/backends/execution.md +++ b/docs/backends/execution.md @@ -88,4 +88,6 @@ class MyCustomStorageBackend(BaseStorageBackend): ``` -From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) \ No newline at end of file +From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) + +That's it for Will's decision making. If you'd like a little more esoteric deep-dive, let's look at how his [short-term memory (pubsub)](/platform/pubsub). \ No newline at end of file diff --git a/docs/backends/generation.md b/docs/backends/generation.md index b46a7918..57274cdf 100644 --- a/docs/backends/generation.md +++ b/docs/backends/generation.md @@ -88,4 +88,6 @@ class MyCustomStorageBackend(BaseStorageBackend): ``` -From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) \ No newline at end of file +From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) + +Now we've got a host of possible things Will can do and say. It's time to look at how [Will decides what to do](/platform/execution). \ No newline at end of file diff --git a/docs/backends/io.md b/docs/backends/io.md index c86802a3..1f786b5e 100644 --- a/docs/backends/io.md +++ b/docs/backends/io.md @@ -72,4 +72,6 @@ class MyCustomStorageBackend(BaseStorageBackend): ``` -From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) \ No newline at end of file +From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) + +Now that you've got hearing and talking sorted, let's look at how [Will adds context](/platform/analysis). \ No newline at end of file diff --git a/docs/backends/overall.md b/docs/backends/overall.md index e75df0aa..00ffc50d 100644 --- a/docs/backends/overall.md +++ b/docs/backends/overall.md @@ -1,16 +1,14 @@ # Backend Overview -## Design - Will is designed rather a lot like our own brains. His backends are specific parts of the process of noticing something, deciding what to do, and taking action, and they each interact with each other. -Just like us, he hears and sees things (`io`), understands the context in which they happened (`analysis`), generates possible actions (`generation`), decides on something to do (`execution`), and does it (`io`). Along the way, he has both short term, working memory (`pubsub`), and long-term, permanent memory (`storage`). +Just like us, he hears and sees things (`io`), understands the context in which they happened (`analysis`), considers possible actions (`generation`), decides on something to do (`execution`), and does it (`io`). Along the way, he has both short term, working memory that lets these processes talk to each other (`pubsub`), and long-term, permanent memory (`storage`). If you've been thinking about diving into Artificial Intelligence or bots, and wondering how it works, the answer lies right there, in your own head. -Dig a little deeper, and see how each piece of Will's brain works, what things you should think about as you set him up, and how you can make him even better. +Below, you can dig a little deeper, see how each piece of Will's brain works, what things you should think about as you set him up, and how you can make him even better. - [Noticing and Acting `io`](/backends/io) - [Analyzing and Context `analysis`](/backends/analysis) diff --git a/docs/backends/pubsub.md b/docs/backends/pubsub.md index 876c722a..6101465f 100644 --- a/docs/backends/pubsub.md +++ b/docs/backends/pubsub.md @@ -71,4 +71,6 @@ def bootstrap(settings) ``` -From there, just test it out, and submit a [pull request!](https://github.com/skoczen/will/pulls) \ No newline at end of file +From there, just test it out, and submit a [pull request!](https://github.com/skoczen/will/pulls) + +That's it for Will's pubsub backends. He can also remember things long-term. For that, read up on his [long-term memory (storage)](/platform/storage). \ No newline at end of file diff --git a/docs/backends/storage.md b/docs/backends/storage.md index 29676957..84e1249f 100644 --- a/docs/backends/storage.md +++ b/docs/backends/storage.md @@ -68,4 +68,6 @@ class MyCustomStorageBackend(BaseStorageBackend): ``` -From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) \ No newline at end of file +From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) + +That's all you need to know to tweak and improve Will's memory. There's just one topic left in his brain - keeping things private with [encryption](/platform/encryption). \ No newline at end of file diff --git a/docs/config.md b/docs/config.md index fbfb14e9..a908c43b 100644 --- a/docs/config.md +++ b/docs/config.md @@ -74,7 +74,7 @@ The rules for combining are fairly straightforward: 3. Some smart defaulting happens inside settings.py for important variables. For the moment, I'm going to leave that out of the docs, and refer you to `settings.py` as I *believe* things should Just Work, and most people should never need to care. If this decision's wrong, please open an issue, and these docs will be improved! -That's it for config. Now, let's get your will [deployed](deploy.md)! +That's it for config. Now, you can either do a deeper dive into [Will's brain](/backends/overall.md), or just get your will [deployed](deploy.md)! diff --git a/docs/improve.md b/docs/improve.md index 6babe11b..31f085d1 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -113,7 +113,7 @@ Will's also has had help from lots of coders. Alphabetically: - [keNzi](https://github.com/keNzej) added shorten url function using bitly service. - [levithomason](http://github.com/levithomason) was one of the original contributors, when will was first built at GreenKahuna. - [mark-adams](https://github.com/mark-adams) cleaned up a Bitbucket typo. -- [mike-love](https://github.com/mike-love) added Docker support to make running Will easier! +- [mike-love](https://github.com/mike-love) added Docker support to make running Will easier - and then re-updated it to support Will 2.x! - [hobson](http://github.com/hobson) made setup.py more robust across operating systems, and improved the docs. - [neronmoon](https://github.com/neronmoon) made it easier to mention will with non-standard case - [michaeljoseph](https://github.com/michaeljoseph) suggested improvements to setup and requirements.txt format. diff --git a/docs/index.md b/docs/index.md index 14ae05eb..abe03503 100644 --- a/docs/index.md +++ b/docs/index.md @@ -106,7 +106,7 @@ From your virtualenv and the folder you want to set up your will in, # .. the magic begins ``` -That's it! +That's it! Note that the first time you run, you'll probably be missing some configuration. That's OK - `run_will` will check your environment, and walk you through getting and setting any necessary config. We'll go through the nitty-gritty later, but if you have any odd setup problems, look in `config.py` - that's where all of the non-sensitive data is stored. diff --git a/docs/releases.md b/docs/releases.md index 5f5f3c96..83bd3bbf 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -17,11 +17,11 @@ High-level, here's what's new: - Slack support - CLI/Shell backend - [Rocket.chat](https://rocket.chat/) support, thanks to [antgel](https://github.com/antgel). -- Will's brains have been abstracted - you can now add custom analysis, generation, and execution backends to build everything from a straight regex-bot to a full chatterbot. -- Pluggable I/O backends, which is how all of the above were done, and which means adding new platforms is pretty simple. -- Pluggable storage backends. -- Pluggable pubsub backends. -- Built-in encryption for storage and pub/sub (with pluggable backends as well.) +- Will's brains have been abstracted - you can now add custom [analysis](/backends/analysis), [generation](/backends/generation), and [execution](/backends/execution) backends to build everything from a straight regex-bot to a full chatterbot. +- [Pluggable I/O backends](/backends/io), which is how all of the above were done, and which means adding new platforms is pretty simple. +- [Pluggable storage](/backends/storage) backends. +- [Pluggable pubsub](/backends/pubsub) backends. +- Built-in encryption for storage and pub/sub (with [pluggable backends](/backends/encryption) as well.) - Lots more intelligence around required settings and verification, to make first starting and debugging Will easier. - Full Python 3 support. (Don't worry, 2.x [isn't going anywhere](https://heywill.io/will2#python3).) - New `@will gif me` command. Because it can't all be serious. :) diff --git a/mkdocs.yml b/mkdocs.yml index 830e8b36..29a486ee 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -11,9 +11,9 @@ pages: - Creating and Organizing Plugins: plugins/create.md - Plugin Builtins: plugins/builtins.md - Bundled Plugins: plugins/bundled.md -- Configure: +- Configure: config.md +- "Brain": - Overview: backends/overall.md - - Settings: config.md - Noticing and Talking: backends/io.md - Analysis and Context: backends/analysis.md - Generation: backends/generation.md @@ -24,9 +24,9 @@ pages: - Deploy: deploy.md - Improve: improve.md # - Making Will Better and Better: improve.md -- Releases: releases.md -- Roadmap: roadmap.md -# - "Brain": +- Project: + - Releases: releases.md + - Roadmap: roadmap.md # - "Will's Brain": extra_javascript: - themes/will/js/base.js @@ -43,5 +43,5 @@ extra_css: site_name: Will theme_dir: "docs/themes/will/" repo_url: https://github.com/skoczen/will/ -copyright: Copyright © 2014, GreenKahuna, Steven Skoczen and the individual contributors. +copyright: Copyright © 2017, Steven Skoczen, Ink and Feet, and the individual contributors. # google_analytics: ['UA-1234567-8', 'skoczen.github.io/will'] diff --git a/will/scripts/generate_will_project.py b/will/scripts/generate_will_project.py index 9b59cad0..eeaaf4a1 100644 --- a/will/scripts/generate_will_project.py +++ b/will/scripts/generate_will_project.py @@ -3,6 +3,7 @@ import os import stat import sys +from six.moves import input from clint.textui import puts from will.utils import print_head @@ -24,6 +25,27 @@ class EmptyObj(object): pass +def cleaned(service_name): + return service_name.lower().replace(".", ''), + + +def ask_user(question): + response = "?" + while response not in ["y", "n"]: + response = input("%s [y/n] " % question) + if response not in ["y", "n"]: + print("Please enter 'y' or 'n'.") + return response.startswith("y") + + +def check_service(service_name, source): + if ask_user(" Do you want to enable %s support?" % (service_name)): + source = source.replace("# will.backends.io_adapters.%s" % cleaned(service_name), "will.backends.io_adapters.%s" % cleaned(service_name)) + else: + source = source.replace("will.backends.io_adapters.%s" % cleaned(service_name), "# will.backends.io_adapters.%s" % cleaned(service_name)) + return source + + def main(): """ Creates the following structure: @@ -127,10 +149,18 @@ def good_morning(self, message): print(" config.py.dist") config_path = os.path.join(current_dir, "config.py.dist") - if not os.path.exists(config_path): - with open(config_path, "w+") as f: - with open(os.path.join(PROJECT_ROOT, "config.py.dist"), "r") as source_f: - config = source_f.read() + if not os.path.exists(config_path) or ask_user("! config.py.dist exists. Overwrite it?"): + with open(os.path.join(PROJECT_ROOT, "config.py.dist"), "r") as source_f: + source = source_f.read() + # Ask on backends + print("\nWill supports a few different service backends. Let's set up the ones you want:\n") + source = check_service("Slack", source) + source = check_service("HipChat", source) + source = check_service("Rocket.Chat", source) + source = check_service("Shell", source) + + with open(config_path, "w+") as f: + config = source f.write(config) if not args.config_dist_only: From 7d391a84d1245b96b8769f4c29caa5ab6c5d4450 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Sat, 4 Nov 2017 13:05:01 +1300 Subject: [PATCH 105/200] Documentation for all backends in, smarter generate_will - maybe the last major commit before release! --- MANIFEST.in | 2 +- docs/backends/analysis.md | 67 ++++++----------- docs/backends/execution.md | 62 +++++---------- docs/backends/generation.md | 75 ++++++++----------- docs/backends/io.md | 14 +++- docs/backends/pubsub.md | 12 ++- docs/backends/storage.md | 18 +++-- docs/index.md | 3 + requirements.txt | 8 +- setup.py | 2 +- {requirements => will/requirements}/base.txt | 0 .../requirements}/couchbase.txt | 0 {requirements => will/requirements}/dev.txt | 0 .../requirements}/hipchat.txt | 0 .../requirements}/rocketchat.txt | 0 {requirements => will/requirements}/slack.txt | 0 .../requirements}/zeromq.txt | 0 will/scripts/generate_will_project.py | 21 ++++-- 18 files changed, 128 insertions(+), 156 deletions(-) rename {requirements => will/requirements}/base.txt (100%) rename {requirements => will/requirements}/couchbase.txt (100%) rename {requirements => will/requirements}/dev.txt (100%) rename {requirements => will/requirements}/hipchat.txt (100%) rename {requirements => will/requirements}/rocketchat.txt (100%) rename {requirements => will/requirements}/slack.txt (100%) rename {requirements => will/requirements}/zeromq.txt (100%) diff --git a/MANIFEST.in b/MANIFEST.in index 26968579..d1cde675 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,5 +4,5 @@ include *.md include *.py include requirements/*.txt recursive-include will/templates * -recursive-include requirements * +recursive-include will/requirements * recursive-include will/scripts * \ No newline at end of file diff --git a/docs/backends/analysis.md b/docs/backends/analysis.md index 6cebe60b..9da43ad1 100644 --- a/docs/backends/analysis.md +++ b/docs/backends/analysis.md @@ -17,68 +17,49 @@ Here's a bit more about the built-ins, and when they'd be a good fit: ### History (`will.backends.analysis.history`) -Just adds the last 20 messages he heard into the context, and stores this one for the future. +Just adds the last 20 messages he heard into the context, and stores this one for the future. + +*Required settings*: None + ### Nothing (`will.backends.analysis.nothing`) Does absolutely nothing. But it is a nice template for building your own! +*Required settings*: None -Considerations, etc +For the moment, there's no reason not to just include both built-in backends. But as Will grows and additional options are added, these documents will be updated to explain the tradeoffs in enabling or disabling certain backends. ## Setting your backends -`config.py` -required settings - -## Contributing a new backend - -## Implementing a new backend - -Writing a new storage backend is fairly straightforward - simply subclass `BaseStorageBackend`, and implement: - -1) the five required methods, then -2) specify any required settings with `required_settings`. - +To set your analysis backends, just update the following in `config.py` ```python -from will.backends.storage.base import BaseStorageBackend - - -class MyCustomStorageBackend(BaseStorageBackend): - """A custom storage backend using the latest, greatest technology. - - You'll need to provide a GREAT_API_KEY to use it. - - """" +# Backends to analyze messages and generate useful metadata +ANALYZE_BACKENDS = [ + "will.backends.analysis.nothing", + "will.backends.analysis.history", +] +``` - required_settings = [ - { - "name": "GREAT_API_KEY", - "obtain_at": """1. Go to greatamazingtechnology.com/api -2. Click "Generate API Key" -3. Copy that key, and set it in your Will. -""", - }, - ] +## Contributing a new backend - # All storage backends must supply the following methods: - def __init__(self, *args, **kwargs): - # Connects to the storage provider. +Writing a new analysis backend is fairly straightforward - simply subclass `BaseStorageBackend`, and implement the do_analysis method: - def do_save(self, key, value, expire=None): - raise NotImplemented - def do_load(self, key): - raise NotImplemented +```python +from will.backends.analysis.base import AnalysisBackend - def clear(self, key): - raise NotImplemented +class NewBackend(AnalysisBackend): - def clear_all_keys(self): - raise NotImplemented + def do_analyze(self, message): + # Do smart stuff + return { + "smart": "stuff", + "cool": "things", + } ``` diff --git a/docs/backends/execution.md b/docs/backends/execution.md index 002ea676..b7a8d404 100644 --- a/docs/backends/execution.md +++ b/docs/backends/execution.md @@ -29,62 +29,34 @@ Or, more likely, because you've built a custom generation backend that limits hi This is the right fit for most people, and it's the most similar to how our brains work. Will looks at the options he has, and picks the single one he thinks is the best. - - -Considerations, etc - ## Setting your backends -`config.py` -required settings - -## Contributing a new backend - -## Implementing a new backend - -Writing a new storage backend is fairly straightforward - simply subclass `BaseStorageBackend`, and implement: - -1) the five required methods, then -2) specify any required settings with `required_settings`. - +To set your execution backends, just update the following in `config.py` ```python -from will.backends.storage.base import BaseStorageBackend - - -class MyCustomStorageBackend(BaseStorageBackend): - """A custom storage backend using the latest, greatest technology. - - You'll need to provide a GREAT_API_KEY to use it. - - """" +# The "decision making" backends that look among the generated choices, +# and decide which to follow. Backends are executed in order, and any +# backend can stop further evaluation. +EXECUTION_BACKENDS = [ + "will.backends.execution.best_score", + # "will.backends.execution.all", +] +``` - required_settings = [ - { - "name": "GREAT_API_KEY", - "obtain_at": """1. Go to greatamazingtechnology.com/api -2. Click "Generate API Key" -3. Copy that key, and set it in your Will. -""", - }, - ] +## Contributing a new backend - # All storage backends must supply the following methods: - def __init__(self, *args, **kwargs): - # Connects to the storage provider. +Writing a new execution backend is reasonably straightforward - simply subclass `ExecutionBackend`, and implement `handle_execution`, making sure to call `self.execute(option)` for the option(s) you choose.: - def do_save(self, key, value, expire=None): - raise NotImplemented +```python +from will.backends.execution.base import ExecutionBackend - def do_load(self, key): - raise NotImplemented - def clear(self, key): - raise NotImplemented +class MyRandomExecutionBackend(ExecutionBackend): - def clear_all_keys(self): - raise NotImplemented + def handle_execution(self, message): + random_option = random.choice(message.generation_options) + self.execute(random_option) ``` diff --git a/docs/backends/generation.md b/docs/backends/generation.md index 57274cdf..e2ec6ea9 100644 --- a/docs/backends/generation.md +++ b/docs/backends/generation.md @@ -20,71 +20,62 @@ Here's a bit more about the built-ins, and when they'd be a good fit: ### Fuzzy Match (all) (`will.backends.generation.fuzzy_all_matches`) -Great at.. +This uses the fantastic [fuzzywuzzy](https://github.com/seatgeek/fuzzywuzzy) library to match strings with some fuzziness, as specified by `FUZZY_MINIMUM_MATCH_CONFIDENCE` (defaults to 90% confidence) and `FUZZY_REGEX_ALLOWABLE_ERRORS` (defaults to 3). -### Fuzzy Match (best) (`will.backends.generation.fuzzy_best_match`) - -Great at.. - -### Strict Regex (`will.backends.generation.strict_regex`) +Great if you'd like your Will to be a little flexible, sometimes get things wrong, but to handle typos. -Great at.. +*Required settings*: `FUZZY_MINIMUM_MATCH_CONFIDENCE` and `FUZZY_REGEX_ALLOWABLE_ERRORS` +### Fuzzy Match (best) (`will.backends.generation.fuzzy_best_match`) -Considerations, etc - -## Setting your backends +This backend is very similar to `fuzzy_all_matches`, but instead of returning all matches above a certain confidence, it just returns the best one, regardless of how good it is. -`config.py` -required settings +In general, there's no reason to use this over `fuzzy_all_matches`, unless you have a specific scenario that means you always want a response, but can't be sure of a confidence level. -## Contributing a new backend +### Strict Regex (`will.backends.generation.strict_regex`) -## Implementing a new backend +Great for exact matches only. If you only want your Will to do thing when it hears an exact command, or you have a bunch of different commands you're worried about getting mixed up in the fuzziness, `strict_regex` is the way for you to go. -Writing a new storage backend is fairly straightforward - simply subclass `BaseStorageBackend`, and implement: +This is the same behavior that was in Will 1.x and 0.x. -1) the five required methods, then -2) specify any required settings with `required_settings`. +## Setting your backends +To set your generation backends, just update the following in `config.py` ```python -from will.backends.storage.base import BaseStorageBackend +# Backends to generate possible actions, and metadata about them. +GENERATION_BACKENDS = [ + "will.backends.generation.fuzzy_all_matches", + "will.backends.generation.strict_regex", + # "will.backends.generation.fuzzy_best_match", +] +``` -class MyCustomStorageBackend(BaseStorageBackend): - """A custom storage backend using the latest, greatest technology. +## Contributing a new backend - You'll need to provide a GREAT_API_KEY to use it. +Writing a new generation backend is easy - just subclass `GenerationBackend`, and implement `do_generate`: - """" +Note that the method should return a list of `GeneratedOption`s, including context, the backend name, and a score. - required_settings = [ - { - "name": "GREAT_API_KEY", - "obtain_at": """1. Go to greatamazingtechnology.com/api -2. Click "Generate API Key" -3. Copy that key, and set it in your Will. -""", - }, - ] +```python +from will.backends.generation.base import GenerationBackend, GeneratedOption - # All storage backends must supply the following methods: - def __init__(self, *args, **kwargs): - # Connects to the storage provider. - def do_save(self, key, value, expire=None): - raise NotImplemented +class MyGreatGenerationBackend(GenerationBackend): - def do_load(self, key): - raise NotImplemented + def do_generate(self, event): + """Returns a list of GeneratedOptions""" + matches = [] - def clear(self, key): - raise NotImplemented + message = event.data + for name, l in self.bot.message_listeners.items(): + if this_is_a_perfect_match(message, l): + o = GeneratedOption(context=context, backend="regex", score=100) + matches.append(o) - def clear_all_keys(self): - raise NotImplemented + return matches ``` diff --git a/docs/backends/io.md b/docs/backends/io.md index 1f786b5e..70840b4f 100644 --- a/docs/backends/io.md +++ b/docs/backends/io.md @@ -15,14 +15,20 @@ Will supports the following io backends: This isn't a zero-sum game with will. You can use as many backends as you'd like, all at once. -Considerations, etc ## Setting your backends -`config.py` -required settings +To set your io backends, just update the following in `config.py` -## Contributing a new backend +```python +# Platforms and mediums messages can come in and go out on. +IO_BACKENDS = [ + "will.backends.io_adapters.slack", + "will.backends.io_adapters.hipchat", + "will.backends.io_adapters.rocketchat", + "will.backends.io_adapters.shell", +] +``` ## Implementing a new backend diff --git a/docs/backends/pubsub.md b/docs/backends/pubsub.md index 6101465f..5fc56f32 100644 --- a/docs/backends/pubsub.md +++ b/docs/backends/pubsub.md @@ -9,10 +9,16 @@ Will supports the following options for pubsub backend: ## Choosing a backend -## Setting your backend +Right now, you're stuck with Redis. :) + +## Setting your backends + +To set your pubsub backend, just update the following in `config.py` + +```python +PUBSUB_BACKEND = "redis" # "redis", or "zeromq" (beta). +``` -`config.py` -required settings ## Contributing a new backend diff --git a/docs/backends/storage.md b/docs/backends/storage.md index 84e1249f..00cb4dde 100644 --- a/docs/backends/storage.md +++ b/docs/backends/storage.md @@ -11,16 +11,22 @@ Will supports the following options for storage backend: ## Choosing a backend -Considerations, etc +In general, we recommend using Redis, especially since for v2.0, it's also required for pubsub to get Will working. However, in the future, we'll have more pubsub options, and this will be a more option choice. -## Setting your backend +If you're running in an environment with no access to external resources or ability to install packages, the `File` backend will get you sorted. If you're already running Couchbase for various reasons, it might make the most sense to use it. -`config.py` -required settings +But for the moment, for most configurations, we recommend Redis. It's stable, fast, well-supported, and just works. -## Creating a new backend -## Implementing a new backend +## Setting your backends + +To set your storage backend, just update the following in `config.py` + +```python +STORAGE_BACKEND = "redis" # "redis", "couchbase", or "file". +``` + +## Contributing a new backend Writing a new storage backend is fairly straightforward - simply subclass `BaseStorageBackend`, and implement: diff --git a/docs/index.md b/docs/index.md index abe03503..62bb8c83 100644 --- a/docs/index.md +++ b/docs/index.md @@ -102,6 +102,9 @@ From your virtualenv and the folder you want to set up your will in, (my_will) $ generate_will_project # ... output from will making your new project +(my_will) $ pip install -r requirements.txt +# ... install any needed libraries for your chosen backends. + (my_will) $ ./run_will.py # .. the magic begins ``` diff --git a/requirements.txt b/requirements.txt index 313d27e7..e6f122d0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ hiredis==0.2.0 redis==2.10.6 --r requirements/base.txt --r requirements/slack.txt --r requirements/hipchat.txt --r requirements/rocketchat.txt +-r will/requirements/base.txt +-r will/requirements/slack.txt +-r will/requirements/hipchat.txt +-r will/requirements/rocketchat.txt diff --git a/setup.py b/setup.py index abfaf4a2..c1b69fc7 100755 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ DESCRIPTION = "A friendly python hipchat bot" ROOT_DIR = os.path.dirname(__file__) SOURCE_DIR = os.path.join(ROOT_DIR) -REQS_DIR = os.path.join(ROOT_DIR, "requirements") +REQS_DIR = os.path.join(ROOT_DIR, "will", "requirements") install_requires = [] dependency_links = [] diff --git a/requirements/base.txt b/will/requirements/base.txt similarity index 100% rename from requirements/base.txt rename to will/requirements/base.txt diff --git a/requirements/couchbase.txt b/will/requirements/couchbase.txt similarity index 100% rename from requirements/couchbase.txt rename to will/requirements/couchbase.txt diff --git a/requirements/dev.txt b/will/requirements/dev.txt similarity index 100% rename from requirements/dev.txt rename to will/requirements/dev.txt diff --git a/requirements/hipchat.txt b/will/requirements/hipchat.txt similarity index 100% rename from requirements/hipchat.txt rename to will/requirements/hipchat.txt diff --git a/requirements/rocketchat.txt b/will/requirements/rocketchat.txt similarity index 100% rename from requirements/rocketchat.txt rename to will/requirements/rocketchat.txt diff --git a/requirements/slack.txt b/will/requirements/slack.txt similarity index 100% rename from requirements/slack.txt rename to will/requirements/slack.txt diff --git a/requirements/zeromq.txt b/will/requirements/zeromq.txt similarity index 100% rename from requirements/zeromq.txt rename to will/requirements/zeromq.txt diff --git a/will/scripts/generate_will_project.py b/will/scripts/generate_will_project.py index eeaaf4a1..eaa2517a 100644 --- a/will/scripts/generate_will_project.py +++ b/will/scripts/generate_will_project.py @@ -19,6 +19,7 @@ help='Only output a config.py.dist.' ) args = parser.parse_args() +requirements_txt = "will\n" class EmptyObj(object): @@ -38,9 +39,15 @@ def ask_user(question): return response.startswith("y") -def check_service(service_name, source): +def enable_disable_service(service_name, source): + global requirements_txt if ask_user(" Do you want to enable %s support?" % (service_name)): source = source.replace("# will.backends.io_adapters.%s" % cleaned(service_name), "will.backends.io_adapters.%s" % cleaned(service_name)) + req_path = os.path.join(os.path.join(PROJECT_ROOT, "..", "requirements"), "%s.txt" % cleaned(service_name)) + print(req_path) + if os.path.exists(req_path): + with open(req_path, 'r') as f: + requirements_txt = "%s\n# %s\n%s" % (requirements_txt, service_name, f.read()) else: source = source.replace("will.backends.io_adapters.%s" % cleaned(service_name), "# will.backends.io_adapters.%s" % cleaned(service_name)) return source @@ -154,10 +161,10 @@ def good_morning(self, message): source = source_f.read() # Ask on backends print("\nWill supports a few different service backends. Let's set up the ones you want:\n") - source = check_service("Slack", source) - source = check_service("HipChat", source) - source = check_service("Rocket.Chat", source) - source = check_service("Shell", source) + source = enable_disable_service("Slack", source) + source = enable_disable_service("HipChat", source) + source = enable_disable_service("Rocket.Chat", source) + source = enable_disable_service("Shell", source) with open(config_path, "w+") as f: config = source @@ -167,9 +174,9 @@ def good_morning(self, message): print(" requirements.txt") # Create requirements.txt requirements_path = os.path.join(current_dir, "requirements.txt") - if not os.path.exists(requirements_path): + if not os.path.exists(requirements_path) or ask_user("! requirements.txt exists. Overwrite it?"): with open(requirements_path, 'w+') as f: - f.write("will") + f.write(requirements_txt) print(" Procfile") # Create Procfile From 9e5774cd87f4899bb78cc9c425262e70160c4a75 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Sat, 4 Nov 2017 14:15:17 +1300 Subject: [PATCH 106/200] Tightens up docs --- docs/backends/analysis.md | 2 +- docs/backends/encryption.md | 65 ++++++++++++++----------------------- docs/backends/execution.md | 2 +- docs/backends/generation.md | 2 +- docs/backends/io.md | 2 +- docs/backends/pubsub.md | 2 +- docs/backends/storage.md | 4 +-- 7 files changed, 31 insertions(+), 48 deletions(-) diff --git a/docs/backends/analysis.md b/docs/backends/analysis.md index 9da43ad1..d7127ea9 100644 --- a/docs/backends/analysis.md +++ b/docs/backends/analysis.md @@ -65,4 +65,4 @@ class NewBackend(AnalysisBackend): From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) -Now we've got context, let's look at how [Will generates possibilities](/platform/generation). \ No newline at end of file +Now we've got context, let's look at how [Will generates possibilities](/backends/generation). \ No newline at end of file diff --git a/docs/backends/encryption.md b/docs/backends/encryption.md index 7c003cb2..ae4bed72 100644 --- a/docs/backends/encryption.md +++ b/docs/backends/encryption.md @@ -7,66 +7,49 @@ All of Will's short and long-term memory (`pubsub` and `storage`) are encrypted Will supports the following options for storage backend, and improvements and more backends are welcome: -- AES (`will.backends.storage.aes`) - +- AES (`will.backends.storage.aes`) - uses AES in CBC mode to encrypt. ## Choosing a backend -Considerations, etc - -Will's AES backend uses AES in CBC mode to encrypt. +Right now, your only option is AES. So go with that! :) ## Setting your backend -`config.py` -required settings +To set your backend, in `config.py`, set: -## Creating a new backend +```python +# Turn on/off encryption in pub/sub and storage (default is on). +# Causes a small speed bump, but secures messages in an untrusted environment. +# ENABLE_INTERNAL_ENCRYPTION = True +ENCRYPTION_BACKEND = "aes" +``` -## Implementing a new backend +## Contributing a new backend -Writing a new storage backend is fairly straightforward - simply subclass `BaseStorageBackend`, and implement: +Writing a new encryption backend is easy (if you've got the encryption stuff sorted.) Just subclass `BaseStorageBackend`, and implement: -1) the five required methods, then -2) specify any required settings with `required_settings`. +1. `encrypt_to_b64` - a method that take an arbitary python object, and returns an encrypted, base64 string. +2. `decrypt_from_b64` - a method that takes that base64 string, and returns a python object. +3. Provide a `bootstrap()` method that returns an instantiated EncryptionClass. +Here's an example: ```python from will.backends.storage.base import BaseStorageBackend -class MyCustomStorageBackend(BaseStorageBackend): - """A custom storage backend using the latest, greatest technology. - - You'll need to provide a GREAT_API_KEY to use it. - - """" - - required_settings = [ - { - "name": "GREAT_API_KEY", - "obtain_at": """1. Go to greatamazingtechnology.com/api -2. Click "Generate API Key" -3. Copy that key, and set it in your Will. -""", - }, - ] - - - # All storage backends must supply the following methods: - def __init__(self, *args, **kwargs): - # Connects to the storage provider. +class MyGreatEncryption(WillBaseEncryptionBackend): - def do_save(self, key, value, expire=None): - raise NotImplemented + @classmethod + def encrypt_to_b64(cls, raw): + return binascii.b2a_base64(my_encryption_method(pickle.dumps(raw, -1))) - def do_load(self, key): - raise NotImplemented + @classmethod + def decrypt_from_b64(cls, raw_enc): + return pickle_loads(binascii.a2b_base64(my_decryption_method(raw_enc))) - def clear(self, key): - raise NotImplemented +def bootstrap(settings): + return MyGreatEncryption(settings) - def clear_all_keys(self): - raise NotImplemented ``` diff --git a/docs/backends/execution.md b/docs/backends/execution.md index b7a8d404..87154d68 100644 --- a/docs/backends/execution.md +++ b/docs/backends/execution.md @@ -62,4 +62,4 @@ class MyRandomExecutionBackend(ExecutionBackend): From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) -That's it for Will's decision making. If you'd like a little more esoteric deep-dive, let's look at how his [short-term memory (pubsub)](/platform/pubsub). \ No newline at end of file +That's it for Will's decision making. If you'd like a little more esoteric deep-dive, let's look at how his [short-term memory (pubsub)](/backends/pubsub). \ No newline at end of file diff --git a/docs/backends/generation.md b/docs/backends/generation.md index e2ec6ea9..0bed86de 100644 --- a/docs/backends/generation.md +++ b/docs/backends/generation.md @@ -81,4 +81,4 @@ class MyGreatGenerationBackend(GenerationBackend): From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) -Now we've got a host of possible things Will can do and say. It's time to look at how [Will decides what to do](/platform/execution). \ No newline at end of file +Now we've got a host of possible things Will can do and say. It's time to look at how [Will decides what to do](/backends/execution). \ No newline at end of file diff --git a/docs/backends/io.md b/docs/backends/io.md index 70840b4f..919b945f 100644 --- a/docs/backends/io.md +++ b/docs/backends/io.md @@ -80,4 +80,4 @@ class MyCustomStorageBackend(BaseStorageBackend): From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) -Now that you've got hearing and talking sorted, let's look at how [Will adds context](/platform/analysis). \ No newline at end of file +Now that you've got hearing and talking sorted, let's look at how [Will adds context](/backends/analysis). \ No newline at end of file diff --git a/docs/backends/pubsub.md b/docs/backends/pubsub.md index 5fc56f32..8b71468d 100644 --- a/docs/backends/pubsub.md +++ b/docs/backends/pubsub.md @@ -79,4 +79,4 @@ def bootstrap(settings) From there, just test it out, and submit a [pull request!](https://github.com/skoczen/will/pulls) -That's it for Will's pubsub backends. He can also remember things long-term. For that, read up on his [long-term memory (storage)](/platform/storage). \ No newline at end of file +That's it for Will's pubsub backends. He can also remember things long-term. For that, read up on his [long-term memory (storage)](/backends/storage). \ No newline at end of file diff --git a/docs/backends/storage.md b/docs/backends/storage.md index 00cb4dde..15c9b5b3 100644 --- a/docs/backends/storage.md +++ b/docs/backends/storage.md @@ -1,7 +1,7 @@ # Storage Backends ## Overview -Storage backends handle all of Will's long-term memory They're designed to be durable, reliable, and robust - a lot like our brain's long-term memory, but without the forgetfulness. +Storage backends handle all of Will's long-term memory. They're designed to be durable, reliable, and robust - a lot like our brain's long-term memory, but without the forgetfulness. Will supports the following options for storage backend: @@ -76,4 +76,4 @@ class MyCustomStorageBackend(BaseStorageBackend): From there, just test it out, and when you're ready, submit a [pull request!](https://github.com/skoczen/will/pulls) -That's all you need to know to tweak and improve Will's memory. There's just one topic left in his brain - keeping things private with [encryption](/platform/encryption). \ No newline at end of file +That's all you need to know to tweak and improve Will's memory. There's just one topic left in his brain - keeping things private with [encryption](/backends/encryption). \ No newline at end of file From 47230773259808882c176e9deb21bacdc2a50361 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Mon, 6 Nov 2017 12:09:56 -0500 Subject: [PATCH 107/200] cleanup docker deployment docs & add the dockerfile specific instructions --- docs/platforms/docker.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/platforms/docker.md diff --git a/docs/platforms/docker.md b/docs/platforms/docker.md new file mode 100644 index 00000000..e69de29b From d387fbbb0ec3049d35c3182d96e890211998ba63 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Mon, 6 Nov 2017 12:11:45 -0500 Subject: [PATCH 108/200] remove redundant 2.x in place of the more specific 2.7 --- docker/will-base/base-2.x/Dockerfile | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 docker/will-base/base-2.x/Dockerfile diff --git a/docker/will-base/base-2.x/Dockerfile b/docker/will-base/base-2.x/Dockerfile deleted file mode 100644 index 033bd6a7..00000000 --- a/docker/will-base/base-2.x/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -# PULL python -FROM python:2.7-alpine3.6 - -# Maintainer -LABEL maintainer="mlove@columnit.com" - -ENV _WILL_HOME=/opt/will - -RUN mkdir -p $_WILL_HOME - -RUN apk add --no-cache git build-base - From 0ebf013cd60455f39c62285afca9a2eb08adc1ea Mon Sep 17 00:00:00 2001 From: Michael Love Date: Mon, 6 Nov 2017 12:13:47 -0500 Subject: [PATCH 109/200] cleanup docker deployment docs & add the dockerfile specific instructions --- docs/deploy.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/deploy.md b/docs/deploy.md index 45b6ff5b..4ee9d212 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -122,6 +122,27 @@ or to run the container in the background, docker-compose up -d ``` +### Roll your Own Container +Will docker file(s) are part of the main repository; this lets developers/teams +build on the containers to embed configuration files, custom plugins etc... For +now Will containers are represented in python 2.7 and python 3 flavors. +##### Will-base +Will is built on the alpine distribution(s) of python docker images. This was done +to provide the smallest container footprint; yet, nothing is perfect so a few +things need to be added. Will-base provides the footprint to perform these base +modifications. + +##### Will +The heywill/will image is the container with Will executing as the +container process. A build arg is available for branch based builds from the Will +repository. To build from a specific branch use, +``` +--build-arg branch=``` + +otherwise master is the default. + + + ## Deploy Everywhere Else #### Will is Just Python From 1c84ed3e21029fa0f3aa46335f6a1e04c2743084 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Mon, 6 Nov 2017 12:15:50 -0500 Subject: [PATCH 110/200] docker platform section is unnecessary we can just add to deploy --- docs/platforms/docker.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/platforms/docker.md diff --git a/docs/platforms/docker.md b/docs/platforms/docker.md deleted file mode 100644 index e69de29b..00000000 From ea79528c15f09c114945834f180bfefc735c427b Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 7 Nov 2017 10:06:02 +1300 Subject: [PATCH 111/200] Documents Slack token --- will/backends/io_adapters/slack.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index 2e1a32ff..2847655f 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -34,9 +34,9 @@ class SlackBackend(IOBackend, SleepMixin, StorageMixin): required_settings = [ { "name": "SLACK_API_TOKEN", - "obtain_at": """1. Go to https://api.slack.com/tokens, and sign in. -2. Search for Will, and then add will. -3. Generate a new token (These instructions are incorrect!).""", + "obtain_at": """1. Go to https://api.slack.com/custom-integrations/legacy-tokens and sign in as yourself (or a user for Will). +2. Find the workspace you want to use, and click "Create token." +3. Set this token as SLACK_API_TOKEN.""" } ] From 974d43f21f86b730f9d6e7fe94baa270e9f8628f Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 7 Nov 2017 10:22:29 +1300 Subject: [PATCH 112/200] Updates release date and formatting --- docs/releases.md | 2 +- docs/roadmap.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 83bd3bbf..d3a77b8d 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1,6 +1,6 @@ # Releases -#### 2.0.1beta1 - November 4, 2017 +#### 2.0.1beta1 - November 7, 2017 **TL;DR: Slack, Rocket.chat, and Shell support, and you can write full chatterbots with Will now!** diff --git a/docs/roadmap.md b/docs/roadmap.md index 6dd8d8a7..16fbcded 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -1,6 +1,6 @@ -Last Update: November 5, 2017 +Last Update: November 7, 2017 -Quick note: I'll be updating this with more information now that Will 2.0 is out, and we're learning what really makes sense in the wild. What's below is roughly the roadmap from April 2017. +*Quick note*: I'll be updating this with more information now that Will 2.0 is out, and we're learning what really makes sense in the wild. What's below is roughly the roadmap from April 2017. ## A Note from Steven From 110678207cada41f79be7ae6fdcd2fef44a0e152 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 7 Nov 2017 10:34:09 +1300 Subject: [PATCH 113/200] Documentation for Will 2.0 cleanup --- docs/backends/analysis.md | 4 ++-- docs/backends/execution.md | 12 ++++++------ docs/backends/generation.md | 6 +++--- docs/backends/io.md | 4 ++-- docs/backends/pubsub.md | 4 ++-- docs/deploy.md | 5 +++-- docs/improve.md | 2 +- 7 files changed, 19 insertions(+), 18 deletions(-) diff --git a/docs/backends/analysis.md b/docs/backends/analysis.md index d7127ea9..d0d2233a 100644 --- a/docs/backends/analysis.md +++ b/docs/backends/analysis.md @@ -15,14 +15,14 @@ Will has the following analysis backends built-in, more are on the way (like sen Here's a bit more about the built-ins, and when they'd be a good fit: -### History (`will.backends.analysis.history`) +#### History (`will.backends.analysis.history`) Just adds the last 20 messages he heard into the context, and stores this one for the future. *Required settings*: None -### Nothing (`will.backends.analysis.nothing`) +#### Nothing (`will.backends.analysis.nothing`) Does absolutely nothing. But it is a nice template for building your own! diff --git a/docs/backends/execution.md b/docs/backends/execution.md index 87154d68..00e32c03 100644 --- a/docs/backends/execution.md +++ b/docs/backends/execution.md @@ -16,18 +16,18 @@ Will has the following execution backends built-in, and it's easy to make your o Here's a bit more about the built-ins, and when they'd be a good fit: -### All (`will.backends.execution.all`) -![All the things](../img/all_the_things.jpg) +#### Best Score (`will.backends.execution.best_score`) -This is Will's crazy, do-everything mode. He'll take every idea he got in the generation cycle and do *all* of them. Why? Because he's crazy like that. +This is the right fit for most people, and it's the most similar to how our brains work. Will looks at the options he has, and picks the single one he thinks is the best. -Or, more likely, because you've built a custom generation backend that limits him down to a set of options you always want done. +#### All (`will.backends.execution.all`) +![All the things](../img/all_the_things.jpg) -### Best Score (`will.backends.execution.best_score`) +This is Will's crazy, do-everything mode. He'll take every idea he got in the generation cycle and do *all* of them. Why? Because he's crazy like that. -This is the right fit for most people, and it's the most similar to how our brains work. Will looks at the options he has, and picks the single one he thinks is the best. +Or, more likely, because you've built a custom generation backend that limits him down to a set of options you always want done. ## Setting your backends diff --git a/docs/backends/generation.md b/docs/backends/generation.md index 0bed86de..98306fce 100644 --- a/docs/backends/generation.md +++ b/docs/backends/generation.md @@ -18,7 +18,7 @@ Like our brain processes, we can have lots of different ways to generate ideas, Here's a bit more about the built-ins, and when they'd be a good fit: -### Fuzzy Match (all) (`will.backends.generation.fuzzy_all_matches`) +#### Fuzzy Match (all) (`will.backends.generation.fuzzy_all_matches`) This uses the fantastic [fuzzywuzzy](https://github.com/seatgeek/fuzzywuzzy) library to match strings with some fuzziness, as specified by `FUZZY_MINIMUM_MATCH_CONFIDENCE` (defaults to 90% confidence) and `FUZZY_REGEX_ALLOWABLE_ERRORS` (defaults to 3). @@ -26,13 +26,13 @@ Great if you'd like your Will to be a little flexible, sometimes get things wron *Required settings*: `FUZZY_MINIMUM_MATCH_CONFIDENCE` and `FUZZY_REGEX_ALLOWABLE_ERRORS` -### Fuzzy Match (best) (`will.backends.generation.fuzzy_best_match`) +#### Fuzzy Match (best) (`will.backends.generation.fuzzy_best_match`) This backend is very similar to `fuzzy_all_matches`, but instead of returning all matches above a certain confidence, it just returns the best one, regardless of how good it is. In general, there's no reason to use this over `fuzzy_all_matches`, unless you have a specific scenario that means you always want a response, but can't be sure of a confidence level. -### Strict Regex (`will.backends.generation.strict_regex`) +#### Strict Regex (`will.backends.generation.strict_regex`) Great for exact matches only. If you only want your Will to do thing when it hears an exact command, or you have a bunch of different commands you're worried about getting mixed up in the fuzziness, `strict_regex` is the way for you to go. diff --git a/docs/backends/io.md b/docs/backends/io.md index 919b945f..7e582e9e 100644 --- a/docs/backends/io.md +++ b/docs/backends/io.md @@ -34,8 +34,8 @@ IO_BACKENDS = [ Writing a new storage backend is fairly straightforward - simply subclass `BaseStorageBackend`, and implement: -1) the five required methods, then -2) specify any required settings with `required_settings`. +1. the five required methods, then +2. specify any required settings with `required_settings`. ```python diff --git a/docs/backends/pubsub.md b/docs/backends/pubsub.md index 8b71468d..31a5ad10 100644 --- a/docs/backends/pubsub.md +++ b/docs/backends/pubsub.md @@ -24,8 +24,8 @@ PUBSUB_BACKEND = "redis" # "redis", or "zeromq" (beta). Writing a new pubsub backend is fairly straightforward - simply subclass `BasePubSub`, and implement: -1) the four required methods, and -2) a bootstrap method. +1. the four required methods, and +2. a bootstrap method. ```python from will.backends.pubsub.base import BasePubSub diff --git a/docs/deploy.md b/docs/deploy.md index 4ee9d212..94d003d2 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -82,7 +82,7 @@ Simple. For best-practices, see our continuous deployment recommendations below Will is packaged with a Dockerfile and docker-compose files to allow deploying in a container with redis. ### Pre-requisites -You should have docker already installed; additionally, the instructions require docker-compose. If you're not using docker-compose, you can still use the pre-defined images from Docker Hub (https://hub.docker.com/r/heywill/will/). +You should have docker already installed; additionally, the instructions require docker-compose. If you're not using docker-compose, you can still also the [pre-defined images from Docker Hub](https://hub.docker.com/r/heywill/will/). ### Step 1: Configure your container's environment variables In Will's docker directory, update the default.env file with your environment's settings. At a minimum, this should contain: @@ -137,7 +137,8 @@ The heywill/will image is the container with Will executing as the container process. A build arg is available for branch based builds from the Will repository. To build from a specific branch use, ``` ---build-arg branch=``` +--build-arg branch= +``` otherwise master is the default. diff --git a/docs/improve.md b/docs/improve.md index 31f085d1..95fb8aa7 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -61,7 +61,7 @@ This one's hopefully straightforward: Shamefully, tests are just getting rolling, and a proper, well-architected test harness is in the works. However, there are *some* tests you can run by running: ```bash -coverage run -m nose +tox ``` More soon! From 023b0369920ee238411a7a842bcc4d9102588562 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 7 Nov 2017 10:40:47 +1300 Subject: [PATCH 114/200] Pulls builtin bonjour, doc formatting --- docs/upgrading_to_2.md | 12 ++++++------ will/plugins/friendly/bonjour.py | 11 ----------- 2 files changed, 6 insertions(+), 17 deletions(-) delete mode 100644 will/plugins/friendly/bonjour.py diff --git a/docs/upgrading_to_2.md b/docs/upgrading_to_2.md index d25d8e7d..59c0a972 100644 --- a/docs/upgrading_to_2.md +++ b/docs/upgrading_to_2.md @@ -19,7 +19,7 @@ You will, however, see a lot of output from Will, telling you that some names ha # The Long Version: -## 1. Add IO backends. +### 1. Add IO backends. If you're planning to continue only using HipChat (until it's replaced by Stride), we'd recommend that you add this to your `config.py`: @@ -36,7 +36,7 @@ That will enable the HipChat and local shell stdin/stdout backend, for easy test If you want to also bring your Will into a Slack or Rocket.Chat room in the future, just uncomment that backend and restart! -## 2. Update the HipChat tokens to be namespaced. +### 2. Update the HipChat tokens to be namespaced. You'll see this starting up, but when you have time, update your tokens as follows: (If you're using `WILL_` environment variables, please add the `WILL_` as needed:) @@ -51,14 +51,14 @@ You'll see this starting up, but when you have time, update your tokens as follo - `ROOMS` becomes `HIPCHAT_ROOMS` -## 3. Set up Redis +### 3. Set up Redis At the moment, Redis is the only working pubsub backend, and is required to run Will. So, if you're not already running it, you'll need it for 2.x. If this is impossible for your setup, ZeroMQ support is in the works, and we're looking to add a pure-python backend as well in 2.1 or 2.2. Creating a new pubsub backend just requires subclassing `BasePubSub` and implementing four methods - so if someone has a little time to bring those along, a pull request is welcome! -## 4. Set your encryption secret key. +### 4. Set your encryption secret key. Will now encrypts all messages on the pubsub wire and in storage by default. Without a `SECRET_KEY` set, he'll auto-generate one based on the machine MAC address, but this isn't a perfect solution, and will mean that he can't access his storage if there are hardware changes (or he's running in a virtualized environment that has shifting MACs.) @@ -67,7 +67,7 @@ Please set `SECRET_KEY` as soon as possible. The recommended way is to set it as an environmental variable, `WILL_SECRET_KEY`, in an environment that is secured and you trust. Any string will work, and entropy is good. -## 5. Set the new 2.0 settings to your liking. +### 5. Set the new 2.0 settings to your liking. Will 2 ships with bunch of new features, and though we've provided sensible defaults, if you'd like, you can update your `config.py` with your preferences. @@ -131,7 +131,7 @@ FUZZY_MINIMUM_MATCH_CONFIDENCE = 90 # Defaults to 90% FUZZY_REGEX_ALLOWABLE_ERRORS = 3 ``` -## 6. That's it - let us know how it goes! +### 6. That's it - let us know how it goes! That's all you really need to know to flip the switch to Will 2.0. diff --git a/will/plugins/friendly/bonjour.py b/will/plugins/friendly/bonjour.py deleted file mode 100644 index d2bea794..00000000 --- a/will/plugins/friendly/bonjour.py +++ /dev/null @@ -1,11 +0,0 @@ -# -- coding: utf-8 - -from will.plugin import WillPlugin -from will.decorators import respond_to, periodic, hear, randomly, route, rendered_template, require_settings - - -class BonjourPlugin(WillPlugin): - - @respond_to("^bonjour$") - def bonjour(self, message): - """bonjour: Je parle un petit français aussi!""" - self.reply("bonjour!") From 4ec5e9c0808ba3fa8efa4b294376473516e109de Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 7 Nov 2017 10:56:04 +1300 Subject: [PATCH 115/200] Adds transition --- docs/upgrading_to_2.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/upgrading_to_2.md b/docs/upgrading_to_2.md index 59c0a972..d21b805a 100644 --- a/docs/upgrading_to_2.md +++ b/docs/upgrading_to_2.md @@ -137,4 +137,6 @@ That's all you really need to know to flip the switch to Will 2.0. As there's a lot of new stuff in this release, it's possible that some bugs have slipped through the cracks. Please submit anything you find, no matter how small, [into the github issue tracker](https://github.com/skoczen/will/issues). We'll be active in fixing things ASAP and helping if you're stuck. -Thanks for using Will, and for going through the big upgrade! We're excited about what the future holds, and happy to get your bots free from platform lock-in. \ No newline at end of file +Thanks for using Will, and for going through the big upgrade! We're excited about what the future holds, and happy to get your bots free from platform lock-in. + +If you'd like to do a deeper dive into what's new, check out the documentation [on Will's new brain](/backends/overall/) \ No newline at end of file From 9a74df8bd1ae46570c56cb3f42423e146a6ed67f Mon Sep 17 00:00:00 2001 From: Michael Love Date: Mon, 6 Nov 2017 19:41:39 -0500 Subject: [PATCH 116/200] pipe yes to installer to get around interactive commands --- docker/will/will-py2/Dockerfile | 2 +- docker/will/will-py3/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/will/will-py2/Dockerfile b/docker/will/will-py2/Dockerfile index 4cc23e87..deb9c6ca 100755 --- a/docker/will/will-py2/Dockerfile +++ b/docker/will/will-py2/Dockerfile @@ -8,5 +8,5 @@ LABEL maintainer=mlove@columnit.com RUN pip install git+https://github.com/skoczen/will.git@$branch WORKDIR $_WILL_HOME -RUN generate_will_project +RUN yes | generate_will_project CMD $_WILL_HOME/run_will.py diff --git a/docker/will/will-py3/Dockerfile b/docker/will/will-py3/Dockerfile index 580b53ee..261402a1 100755 --- a/docker/will/will-py3/Dockerfile +++ b/docker/will/will-py3/Dockerfile @@ -8,5 +8,5 @@ LABEL maintainer=mlove@columnit.com RUN pip install git+https://github.com/skoczen/will.git@$branch WORKDIR $_WILL_HOME -RUN generate_will_project +RUN yes | generate_will_project CMD $_WILL_HOME/run_will.py From 2717331ad07b3288cd01692b05435229da895014 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Mon, 6 Nov 2017 19:45:17 -0500 Subject: [PATCH 117/200] add to latest dockerfile as well --- docker/will/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/will/Dockerfile b/docker/will/Dockerfile index d1b8bb84..a7d540ca 100755 --- a/docker/will/Dockerfile +++ b/docker/will/Dockerfile @@ -8,5 +8,5 @@ LABEL maintainer=mlove@columnit.com RUN pip install git+https://github.com/skoczen/will.git@$branch WORKDIR $_WILL_HOME -RUN generate_will_project +RUN yes|generate_will_project CMD $_WILL_HOME/run_will.py From 633c41ebb34755285e33795ccd126590c6f80b16 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Mon, 6 Nov 2017 19:45:17 -0500 Subject: [PATCH 118/200] add to latest dockerfile as well --- docker/will/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/will/Dockerfile b/docker/will/Dockerfile index d1b8bb84..1ade2ee1 100755 --- a/docker/will/Dockerfile +++ b/docker/will/Dockerfile @@ -8,5 +8,5 @@ LABEL maintainer=mlove@columnit.com RUN pip install git+https://github.com/skoczen/will.git@$branch WORKDIR $_WILL_HOME -RUN generate_will_project +RUN yes | generate_will_project CMD $_WILL_HOME/run_will.py From 87502384e97e651248ee5b715d3895cf223765d7 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 9 Nov 2017 10:30:03 +1300 Subject: [PATCH 119/200] Start of 2.1 branch --- docs/upgrading_to_2.md | 2 +- will/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/upgrading_to_2.md b/docs/upgrading_to_2.md index d21b805a..2f130c0f 100644 --- a/docs/upgrading_to_2.md +++ b/docs/upgrading_to_2.md @@ -139,4 +139,4 @@ As there's a lot of new stuff in this release, it's possible that some bugs have Thanks for using Will, and for going through the big upgrade! We're excited about what the future holds, and happy to get your bots free from platform lock-in. -If you'd like to do a deeper dive into what's new, check out the documentation [on Will's new brain](/backends/overall/) \ No newline at end of file +If you'd like to do a deeper dive into what's new, check out the documentation [on Will's new brain](/backends/overall/). \ No newline at end of file diff --git a/will/__init__.py b/will/__init__.py index 1990bef4..127c148a 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "2.0.1-beta1" +VERSION = "2.1.0" From 45d2b7b69232ef89044d335d30b62f86213b2ca6 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 9 Nov 2017 11:09:35 +1300 Subject: [PATCH 120/200] Bugfixes, 2.0.1-beta2 bump. --- docs/releases.md | 9 +++++++++ will/__init__.py | 2 +- will/plugin.py | 15 +++++++++++---- will/plugins/productivity/remind.py | 24 ++++++++++++++++-------- 4 files changed, 37 insertions(+), 13 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index d3a77b8d..770b5bf2 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1,5 +1,14 @@ # Releases +#### 2.0.1beta2 - November 9, 2017 + +Bugfix release that fixes: + +* Fixes `scheduled_say` breakage. +* Improves reminder plugins to capture and naturally handle "to"s, thanks to [wontonst](https://github.com/wontonst). +* Gets docker builds working, thanks to [mike-love](https://github.com/mike-love). + + #### 2.0.1beta1 - November 7, 2017 **TL;DR: Slack, Rocket.chat, and Shell support, and you can write full chatterbots with Will now!** diff --git a/will/__init__.py b/will/__init__.py index 1990bef4..3516a326 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "2.0.1-beta1" +VERSION = "2.0.1-beta2" diff --git a/will/plugin.py b/will/plugin.py index 23935cb8..9b995541 100644 --- a/will/plugin.py +++ b/will/plugin.py @@ -82,7 +82,7 @@ def say(self, content, message=None, room=None, channel=None, service=None, pack kwargs=kwargs, ) if package_for_scheduling: - return e + return "message.outgoing.%s" % backend, e else: logging.info("putting in queue: %s" % content) self.publish("message.outgoing.%s" % backend, e) @@ -184,12 +184,19 @@ def schedule_say(self, content, when, message=None, room=None, channel=None, ser room = channel elif room: channel = room - packaged_event = self.reply( - None, content=content, message=message, channel=channel, + + if "content" in kwargs: + if content: + del kwargs["content"] + else: + content = kwargs["content"] + + topic, packaged_event = self.say( + content, message=message, channel=channel, service=service, package_for_scheduling=True, *args, **kwargs ) self.add_outgoing_event_to_schedule(when, { "type": "message", - "topic": packaged_event.topic, + "topic": topic, "event": packaged_event, }) diff --git a/will/plugins/productivity/remind.py b/will/plugins/productivity/remind.py index 02b0a622..1f5b10be 100644 --- a/will/plugins/productivity/remind.py +++ b/will/plugins/productivity/remind.py @@ -4,31 +4,39 @@ class RemindPlugin(WillPlugin): - @respond_to("(?:can |will you )?remind me(?: to)? (?P.*?) (at|on|in) (?P.*)?\??") - def remind_me_at(self, message, reminder_text=None, remind_time=None): + @respond_to("(?:can |will you )?remind me(?P to)? (?P.*?) (at|on|in) (?P.*)?\??") + def remind_me_at(self, message, reminder_text=None, remind_time=None, to_string=""): """remind me to ___ at ___: Set a reminder for a thing, at a time.""" parsed_time = self.parse_natural_time(remind_time) natural_datetime = self.to_natural_day_and_time(parsed_time) - - formatted_reminder_text = "%(mention_handle)s, you asked me to remind you %(reminder_text)s" % { + if to_string: + formatted_to_string = to_string + else: + formatted_to_string = "" + formatted_reminder_text = "%(mention_handle)s, you asked me to remind you%(to_string)s %(reminder_text)s" % { "mention_handle": message.sender.mention_handle, "from_handle": message.sender.handle, "reminder_text": reminder_text, + "to_string": formatted_to_string, } self.schedule_say(formatted_reminder_text, parsed_time, message=message) self.say("%(reminder_text)s %(natural_datetime)s. Got it." % locals(), message=message) - @respond_to("(?:can|will you )?remind (?P(?!me).*?)(?: to) ?(?P.*?) (at|on|in) (?P.*)?\??") - def remind_somebody_at(self, message, reminder_recipient=None, reminder_text=None, remind_time=None): + @respond_to("(?:can|will you )?remind (?P(?!me).*?)(?P to>) ?(?P.*?) (at|on|in) (?P.*)?\??") + def remind_somebody_at(self, message, reminder_recipient=None, reminder_text=None, remind_time=None, to_string=""): """remind ___ to ___ at ___: Set a reminder for a thing, at a time for somebody else.""" parsed_time = self.parse_natural_time(remind_time) natural_datetime = self.to_natural_day_and_time(parsed_time) - + if to_string: + formatted_to_string = to_string + else: + formatted_to_string = "" formatted_reminder_text = \ - "%(reminder_recipient)s, %(from_handle)s asked me to remind you %(reminder_text)s" % { + "%(reminder_recipient)s, %(from_handle)s asked me to remind you%(to_string)s %(reminder_text)s" % { "reminder_recipient": reminder_recipient, "from_handle": message.sender.mention_handle, "reminder_text": reminder_text, + "to_string": formatted_to_string, } self.schedule_say(formatted_reminder_text, parsed_time, message=message) From 97bd73262b0689c89fbdb824b7519fd2cb7658ad Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 9 Nov 2017 11:23:27 +1300 Subject: [PATCH 121/200] Adds docs --- docs/improve.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/improve.md b/docs/improve.md index 95fb8aa7..456fd5b0 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -133,7 +133,7 @@ Will's also has had help from lots of coders. Alphabetically: - [tophsic](https://github.com/tophsic) made help friendlier, including plugin-specific help. - [wohali](https://github.com/wohali) tracked down the annoying DNS thread issue, and got will on the right path. - [woohgit](https://github.com/woohgit) added support for the v2 WorldWeatherOnline API, and fixed it when I broke it, and then fixed it again when they changed their endpoint. He also taught will how to say his version number. And `remind ___ to ___ at ___`. Awesome. And fixed lots of docs. And put the time zone with "what time is it?". And then added an entire Pagerduty workflow. And made message parsing more reliable. And wrote the ACL support. And even more doc fixes. And improvements on uptime monitoring edge cases. And kept Pagerduty working. And added `append` and `pop` list support. And ditched WorldWeatherOnline when it started to hurt. Yep. -- [wontonst](https://github.com/wontonst) made it simple to have will reply to a specific room. +- [wontonst](https://github.com/wontonst) made it simple to have will reply to a specific room, and made reminders more friendly. - [woparry](https://github.com/woparry) made sure that Will could handle organizations with a massive (>2000) number of rooms. From 5347fc8641398a2e2e249a8bc535e7ffc13fcaeb Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Mon, 13 Nov 2017 08:13:47 +1300 Subject: [PATCH 122/200] Conditional on input loop. --- will/main.py | 2 +- will/mixins/sleep.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/will/main.py b/will/main.py index 73ee03a4..37d841f2 100644 --- a/will/main.py +++ b/will/main.py @@ -181,7 +181,6 @@ def bootstrap(self): puts(colored.red(error_message)) self.stdin_listener_thread = False - self.has_stdin_io_backend = True if self.has_stdin_io_backend: self.current_line = "" @@ -198,6 +197,7 @@ def bootstrap(self): self.current_line = "" else: self.current_line += line + self.sleep_for_event_loop(2) else: while True: time.sleep(100) diff --git a/will/mixins/sleep.py b/will/mixins/sleep.py index 72343c18..2dc244d2 100644 --- a/will/mixins/sleep.py +++ b/will/mixins/sleep.py @@ -5,11 +5,11 @@ class SleepMixin(object): - def sleep_for_event_loop(self): + def sleep_for_event_loop(self, multiplier=1): try: if not hasattr(self, "sleep_time"): self.sleep_time = settings.EVENT_LOOP_INTERVAL + (random.randint(0, 1) * settings.EVENT_LOOP_INTERVAL) - time.sleep(self.sleep_time) + time.sleep(self.sleep_time * multiplier) except KeyboardInterrupt: sys.exit(0) From 68eecc7acbc2ee6a459786ddd39db8c1d5311a95 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Mon, 13 Nov 2017 09:02:29 +1300 Subject: [PATCH 123/200] Bumps version number, markdownify release. --- docs/releases.md | 10 ++++++++++ will/__init__.py | 2 +- will/requirements/slack.txt | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 770b5bf2..a21b92ef 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1,5 +1,15 @@ # Releases + +#### 2.0.1beta3 - November 13, 2017 + +Bugfix release that fixes: + +* High CPU in some setups, thanks to [mattcl](https://github.com/mattcl) for the report and debuggging! +* Updates to `markdownify` fork 0.4.1. + + + #### 2.0.1beta2 - November 9, 2017 Bugfix release that fixes: diff --git a/will/__init__.py b/will/__init__.py index 127c148a..03c32650 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "2.1.0" +VERSION = "2.0.1beta3" diff --git a/will/requirements/slack.txt b/will/requirements/slack.txt index 9b930f77..7c1123b5 100644 --- a/will/requirements/slack.txt +++ b/will/requirements/slack.txt @@ -2,5 +2,5 @@ slackclient>=1.0.5<1.1.0 # Until https://github.com/matthewwithanm/python-markdownify/pull/1 is merged: # markdownify>=0.4.0<0.5.0 -will-markdownify==0.4.0 +will-markdownify==0.4.1 From d52f4a59f653df9f9267b2d09cf5fe1fba970a97 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Mon, 6 Nov 2017 20:13:35 -0500 Subject: [PATCH 124/200] create build script --- docker/buildwillcontainers.sh | 59 +++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100755 docker/buildwillcontainers.sh diff --git a/docker/buildwillcontainers.sh b/docker/buildwillcontainers.sh new file mode 100755 index 00000000..ee25c437 --- /dev/null +++ b/docker/buildwillcontainers.sh @@ -0,0 +1,59 @@ + +declare -A dockerfiles +dockerfiles=(["heywill/will-base:2.7-alpine"]="./will-base/base-2.7/" + ["heywill/will-base:3.7-alpine"]="./will-base/base-3.x/" + ["heywill/will:python2.7"]="./will/will-py2/" + ["heywill/will:python3.7"]="./will/will-py3/") +build_containers() { + + for tag in "${!dockerfiles[@]}"; + do + echo "building $tag with context ${dockerfiles[$tag]}"; + docker build -t $tag ${dockerfiles[$tag]}; + echo "" + done; +} + +tag_latest(){ + + docker tag heywill/will-base:3.7-alpine heywill/will-base:latest + echo "tagged heywill/will-base:3.7-alpine as heywill/will-base:latest" + docker tag heywill/will:python3.7 heywill/will:latest + + echo "tagged heywill/will:3.7 as heywill/will:latest" +} + + +push_containers(){ + tag_latest + for tag in "${!dockerfiles[@]}"; + do + echo "pushing $tag"; + docker push $tag; + echo "" + done; + + docker push heywill/will-base:latest + docker push heywill/will:latest +} + +case $1 in + "--all") + build_containers + push_containers + ;; + + "--build") + build_containers + ;; + + "--push") + push_containers + ;; + + *) + echo "You did something wrong" + exit 1 + ;; +esac + From 89363c9fe2b82e51c245000ba073de74dade8d60 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Mon, 6 Nov 2017 20:15:18 -0500 Subject: [PATCH 125/200] add build to script --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index e50df4a9..4fcb4c46 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,3 +6,4 @@ install: script: - tox + - ./docker/buildwillcontainers.sh --build From 6a15c7046382f95bbed6be2d5dc6bdc370447887 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Mon, 6 Nov 2017 20:31:18 -0500 Subject: [PATCH 126/200] not always called from the right dir; need to get the script directory in that case --- docker/buildwillcontainers.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docker/buildwillcontainers.sh b/docker/buildwillcontainers.sh index ee25c437..02bdac89 100755 --- a/docker/buildwillcontainers.sh +++ b/docker/buildwillcontainers.sh @@ -1,15 +1,15 @@ declare -A dockerfiles -dockerfiles=(["heywill/will-base:2.7-alpine"]="./will-base/base-2.7/" - ["heywill/will-base:3.7-alpine"]="./will-base/base-3.x/" - ["heywill/will:python2.7"]="./will/will-py2/" - ["heywill/will:python3.7"]="./will/will-py3/") +dockerfiles=(["heywill/will-base:2.7-alpine"]="/will-base/base-2.7/" + ["heywill/will-base:3.7-alpine"]="/will-base/base-3.x/" + ["heywill/will:python2.7"]="/will/will-py2/" + ["heywill/will:python3.7"]="/will/will-py3/") build_containers() { for tag in "${!dockerfiles[@]}"; do echo "building $tag with context ${dockerfiles[$tag]}"; - docker build -t $tag ${dockerfiles[$tag]}; + docker build -t $tag $(dirname $(readlink -f ${BASH_SOURCE[0]}))${dockerfiles[$tag]}; echo "" done; } From 877c075da3d2269106ef6c0396f3a3a7b2341319 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Mon, 6 Nov 2017 20:35:51 -0500 Subject: [PATCH 127/200] now we should fail the build when a docker build fails --- docker/buildwillcontainers.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/buildwillcontainers.sh b/docker/buildwillcontainers.sh index 02bdac89..14e37e34 100755 --- a/docker/buildwillcontainers.sh +++ b/docker/buildwillcontainers.sh @@ -1,4 +1,4 @@ - +#!/bin/bash -e declare -A dockerfiles dockerfiles=(["heywill/will-base:2.7-alpine"]="/will-base/base-2.7/" ["heywill/will-base:3.7-alpine"]="/will-base/base-3.x/" From 9892e092c309267b4a607ff678b2dac6e1c3962f Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 9 Nov 2017 11:48:14 -0500 Subject: [PATCH 128/200] add commit tag for tracking build details --- docker/buildwillcontainers.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docker/buildwillcontainers.sh b/docker/buildwillcontainers.sh index 14e37e34..55cafdac 100755 --- a/docker/buildwillcontainers.sh +++ b/docker/buildwillcontainers.sh @@ -1,9 +1,10 @@ #!/bin/bash -e declare -A dockerfiles -dockerfiles=(["heywill/will-base:2.7-alpine"]="/will-base/base-2.7/" - ["heywill/will-base:3.7-alpine"]="/will-base/base-3.x/" - ["heywill/will:python2.7"]="/will/will-py2/" - ["heywill/will:python3.7"]="/will/will-py3/") +dockerfiles=(["heywill/will-base:2.7-alpine$BTAG"]="/will-base/base-2.7/" + ["heywill/will-base:3.7-alpine$BTAG"]="/will-base/base-3.x/" + ["heywill/will:python2.7$BTAG"]="/will/will-py2/" + ["heywill/will:python3.7$BTAG"]="/will/will-py3/") + build_containers() { for tag in "${!dockerfiles[@]}"; @@ -19,7 +20,6 @@ tag_latest(){ docker tag heywill/will-base:3.7-alpine heywill/will-base:latest echo "tagged heywill/will-base:3.7-alpine as heywill/will-base:latest" docker tag heywill/will:python3.7 heywill/will:latest - echo "tagged heywill/will:3.7 as heywill/will:latest" } @@ -36,7 +36,7 @@ push_containers(){ docker push heywill/will-base:latest docker push heywill/will:latest } - +echo "Building with BTAG: $BTAG" case $1 in "--all") build_containers From 5e95f44e5985b4e1c95ee4d87a0bb2abf25889b4 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 9 Nov 2017 11:48:36 -0500 Subject: [PATCH 129/200] add deployment and export the commit tag from non-production --- .travis.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.travis.yml b/.travis.yml index 4fcb4c46..dc7f1e25 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,4 +6,13 @@ install: script: - tox + - export $BTAG=`if [ "$TRAVIS_BRANCH" == "master" ]; then echo ""; else echo "-$COMMIT" ; fi - ./docker/buildwillcontainers.sh --build + +deploy: + skip_cleanup: true + provider: script + script: docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS + script: ./docker/buildwillcontainers.sh + on: + branch: master From 683b159269f883951f260489c9b660ffa4e86b76 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 9 Nov 2017 11:53:07 -0500 Subject: [PATCH 130/200] fixed missing ` --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index dc7f1e25..53b7da03 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ install: script: - tox - - export $BTAG=`if [ "$TRAVIS_BRANCH" == "master" ]; then echo ""; else echo "-$COMMIT" ; fi + - export $BTAG=`if [ "$TRAVIS_BRANCH" == "master" ]; then echo ""; else echo "-$COMMIT" ; fi` - ./docker/buildwillcontainers.sh --build deploy: From c3173781b933c7fe02d7ccbf7f41e063e9bf7f6b Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 9 Nov 2017 12:05:39 -0500 Subject: [PATCH 131/200] simplify this and correct dumb mistakes --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 53b7da03..588ef2bb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ install: script: - tox - - export $BTAG=`if [ "$TRAVIS_BRANCH" == "master" ]; then echo ""; else echo "-$COMMIT" ; fi` + - export BTAG=`if [ "$TRAVIS_BRANCH" != "master" ]; then echo "-$COMMIT" ; fi` - ./docker/buildwillcontainers.sh --build deploy: From 249dbbb2eaffc8633989159180b3b3c6a65e4a5b Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 9 Nov 2017 12:11:53 -0500 Subject: [PATCH 132/200] wrong env var for the commit --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 588ef2bb..fd07a74f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ install: script: - tox - - export BTAG=`if [ "$TRAVIS_BRANCH" != "master" ]; then echo "-$COMMIT" ; fi` + - export BTAG=`if [ "$TRAVIS_BRANCH" != "master" ]; then echo "-$TRAVIS_COMMIT" ; fi` - ./docker/buildwillcontainers.sh --build deploy: From 995d9dc9e9b487d963ce0add0e56c596126cb023 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 16 Nov 2017 08:58:46 -0500 Subject: [PATCH 133/200] will base being moved to own project --- docker/will-base/base-2.7/Dockerfile | 13 ------------- docker/will-base/base-3.x/Dockerfile | 13 ------------- 2 files changed, 26 deletions(-) delete mode 100644 docker/will-base/base-2.7/Dockerfile delete mode 100644 docker/will-base/base-3.x/Dockerfile diff --git a/docker/will-base/base-2.7/Dockerfile b/docker/will-base/base-2.7/Dockerfile deleted file mode 100644 index 4427d41e..00000000 --- a/docker/will-base/base-2.7/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -# PULL python -FROM python:2.7-alpine - - -# Maintainer -LABEL maintainer="mlove@columnit.com" - -ENV _WILL_HOME=/opt/will - -RUN mkdir -p $_WILL_HOME - -RUN apk add --no-cache git build-base - diff --git a/docker/will-base/base-3.x/Dockerfile b/docker/will-base/base-3.x/Dockerfile deleted file mode 100644 index fd0c09f6..00000000 --- a/docker/will-base/base-3.x/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -# PULL python -FROM python:3.7-rc-alpine - - -# Maintainer -LABEL maintainer="mlove@columnit.com" - -ENV _WILL_HOME=/opt/will - -RUN mkdir -p $_WILL_HOME - -RUN apk add --no-cache git build-base - From cdc41fe72054cd928443e54745249fc8a463cce1 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 16 Nov 2017 09:02:45 -0500 Subject: [PATCH 134/200] build script will build locally from a remote branch tags and pushes production branches --- docker/buildwillcontainers.sh | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/docker/buildwillcontainers.sh b/docker/buildwillcontainers.sh index 55cafdac..ee95b1c9 100755 --- a/docker/buildwillcontainers.sh +++ b/docker/buildwillcontainers.sh @@ -1,9 +1,9 @@ #!/bin/bash -e + declare -A dockerfiles -dockerfiles=(["heywill/will-base:2.7-alpine$BTAG"]="/will-base/base-2.7/" - ["heywill/will-base:3.7-alpine$BTAG"]="/will-base/base-3.x/" - ["heywill/will:python2.7$BTAG"]="/will/will-py2/" - ["heywill/will:python3.7$BTAG"]="/will/will-py3/") +dockerfiles=( + ["heywill/will:python2.7$GTAG"]="/will/will-py2/" + ["heywill/will:python3.7$GTAG"]="/will/will-py3/") build_containers() { @@ -15,24 +15,18 @@ build_containers() { done; } -tag_latest(){ - - docker tag heywill/will-base:3.7-alpine heywill/will-base:latest - echo "tagged heywill/will-base:3.7-alpine as heywill/will-base:latest" - docker tag heywill/will:python3.7 heywill/will:latest - echo "tagged heywill/will:3.7 as heywill/will:latest" +tag_production(){ + docker tag heywill/will:python2.7$GTAG heywill/will:python2.7 + echo "tagged heywill/will:python2.7$GTAG as heywill/will:latest" + + docker tag heywill/will:python3.7$GTAG heywill/will:python3.7 + docker tag heywill/will:python3.7$GTAG heywill/will:latest + echo "tagged heywill/will:python3.7$GTAG as heywill/will:latest & heywill/will:python3.7" } push_containers(){ - tag_latest - for tag in "${!dockerfiles[@]}"; - do - echo "pushing $tag"; - docker push $tag; - echo "" - done; - + tag_latest docker push heywill/will-base:latest docker push heywill/will:latest } From 3823bc13fa0ebb1cbc3de531de63399dcca41c84 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 16 Nov 2017 09:08:34 -0500 Subject: [PATCH 135/200] GTAG does not make sense using CTAG for commit tag --- docker/buildwillcontainers.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docker/buildwillcontainers.sh b/docker/buildwillcontainers.sh index ee95b1c9..9a1c4d8a 100755 --- a/docker/buildwillcontainers.sh +++ b/docker/buildwillcontainers.sh @@ -2,8 +2,8 @@ declare -A dockerfiles dockerfiles=( - ["heywill/will:python2.7$GTAG"]="/will/will-py2/" - ["heywill/will:python3.7$GTAG"]="/will/will-py3/") + ["heywill/will:python2.7$CTAG"]="/will/will-py2/" + ["heywill/will:python3.7$CTAG"]="/will/will-py3/") build_containers() { @@ -16,12 +16,12 @@ build_containers() { } tag_production(){ - docker tag heywill/will:python2.7$GTAG heywill/will:python2.7 - echo "tagged heywill/will:python2.7$GTAG as heywill/will:latest" + docker tag heywill/will:python2.7$CTAG heywill/will:python2.7 + echo "tagged heywill/will:python2.7$CTAG as heywill/will:latest" - docker tag heywill/will:python3.7$GTAG heywill/will:python3.7 - docker tag heywill/will:python3.7$GTAG heywill/will:latest - echo "tagged heywill/will:python3.7$GTAG as heywill/will:latest & heywill/will:python3.7" + docker tag heywill/will:python3.7$CTAG heywill/will:python3.7 + docker tag heywill/will:python3.7$CTAG heywill/will:latest + echo "tagged heywill/will:python3.7$CTAG as heywill/will:latest & heywill/will:python3.7" } @@ -30,7 +30,7 @@ push_containers(){ docker push heywill/will-base:latest docker push heywill/will:latest } -echo "Building with BTAG: $BTAG" +echo "Building with COMMIT TAG: $CTAG" case $1 in "--all") build_containers From 7c33ed368e4204d14d1553564525dc2b2d6f2a2d Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 16 Nov 2017 22:45:11 -0500 Subject: [PATCH 136/200] make the source repo a build arg --- docker/will/will-py2/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/will/will-py2/Dockerfile b/docker/will/will-py2/Dockerfile index deb9c6ca..1935b425 100755 --- a/docker/will/will-py2/Dockerfile +++ b/docker/will/will-py2/Dockerfile @@ -1,12 +1,12 @@ #Pull from will-base FROM heywill/will-base:2.7-alpine - +ARG repo=https://github.com/skoczen/will.git ARG branch=master # Maintainer # ---------- LABEL maintainer=mlove@columnit.com -RUN pip install git+https://github.com/skoczen/will.git@$branch +RUN pip install git+$repo@$branch WORKDIR $_WILL_HOME RUN yes | generate_will_project CMD $_WILL_HOME/run_will.py From f64221e898f0c64f21c42213d560efc5d6383086 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 16 Nov 2017 22:46:22 -0500 Subject: [PATCH 137/200] make the source repo a build arg --- docker/will/will-py3/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/will/will-py3/Dockerfile b/docker/will/will-py3/Dockerfile index 261402a1..383c04ad 100755 --- a/docker/will/will-py3/Dockerfile +++ b/docker/will/will-py3/Dockerfile @@ -1,6 +1,6 @@ #Pull from will-base FROM heywill/will-base:3.7-alpine - +ARG repo=https://github.com/skoczen/will.git ARG branch=master # Maintainer # ---------- From 9560f558fca470af14f46ff4f39be01fd85dcb4e Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 16 Nov 2017 22:52:55 -0500 Subject: [PATCH 138/200] btag should be ctag and reflect the commit --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index fd07a74f..fc3c027f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,13 +6,13 @@ install: script: - tox - - export BTAG=`if [ "$TRAVIS_BRANCH" != "master" ]; then echo "-$TRAVIS_COMMIT" ; fi` + - export CTAG="-$TRAVIS_COMMIT" - ./docker/buildwillcontainers.sh --build deploy: skip_cleanup: true provider: script script: docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - script: ./docker/buildwillcontainers.sh + script: ./docker/buildwillcontainers.sh --all on: branch: master From 553b870d6de22ef936951e30a88f84d8a9345455 Mon Sep 17 00:00:00 2001 From: Michael Love Date: Thu, 16 Nov 2017 23:01:03 -0500 Subject: [PATCH 139/200] update for added build arg --- docs/deploy.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/deploy.md b/docs/deploy.md index 94d003d2..a4a2d8d5 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -129,18 +129,18 @@ now Will containers are represented in python 2.7 and python 3 flavors. ##### Will-base Will is built on the alpine distribution(s) of python docker images. This was done to provide the smallest container footprint; yet, nothing is perfect so a few -things need to be added. Will-base provides the footprint to perform these base -modifications. +things need to be added. Will-base provides the foundation to perform these base +modifications. ##### Will The heywill/will image is the container with Will executing as the -container process. A build arg is available for branch based builds from the Will -repository. To build from a specific branch use, +container process. A build args are available for branch based builds from a +repository. To build from a specific repo and branch use, ``` ---build-arg branch= +--build-arg repo= branch= ``` -otherwise master is the default. +otherwise skoczen/will is the default repo, while master is the default branch. From a81fe852db165d996caaf2da6e8f356c69a2d395 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Mon, 20 Nov 2017 13:02:12 +1300 Subject: [PATCH 140/200] Adds start_thread, fixes color passing. --- docs/releases.md | 9 +++++++++ will/__init__.py | 2 +- will/backends/io_adapters/slack.py | 25 +++++++++++++++++++------ will/utils.py | 1 - 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index a21b92ef..0eb9f04f 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1,6 +1,15 @@ # Releases +#### 2.0.1beta4 - November 20, 2017 + +Bugfix release that fixes: + +* `color` parameter wasn't working properly in Slack. Thanks to [@netjunki](https://github.com/netjunki) for the report! +* Adds a new `start_thread` parameter to `say()` and `reply()` to allow Will to start slack threads. + + + #### 2.0.1beta3 - November 13, 2017 Bugfix release that fixes: diff --git a/will/__init__.py b/will/__init__.py index 03c32650..f2fb0330 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "2.0.1beta3" +VERSION = "2.0.1beta4" diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index 2847655f..a3448cea 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -251,9 +251,17 @@ def set_data_channel_and_thread(self, event, data={}): channel_id = event.data["original_incoming_event"].data.channel try: - data.update({ - "thread_ts": event.data["original_incoming_event"].data.thread - }) + # If we're starting a thread + if "start_thread" in event.kwargs and event.kwargs["start_thread"] and ("thread_ts" not in data or not data["thread_ts"]): + if hasattr(event.source_message, "original_incoming_event"): + data.update({ + "thread_ts": event.source_message.original_incoming_event["ts"] + }) + + else: + data.update({ + "thread_ts": event.data["original_incoming_event"].data.thread + }) except: pass data.update({ @@ -289,9 +297,14 @@ def send_message(self, event): data = self.set_data_channel_and_thread(event, data=data) # Auto-link mention names - if data["text"].find("<@") != -1: - data["text"] = data["text"].replace("<@", "<@") - data["text"] = data["text"].replace(">", ">") + if "text" in data: + if data["text"].find("<@") != -1: + data["text"] = data["text"].replace("<@", "<@") + data["text"] = data["text"].replace(">", ">") + elif "attachments" in data and "text" in data["attachments"][0]: + if data["attachments"][0]["text"].find("<@") != -1: + data["attachments"][0]["text"] = data["attachments"][0]["text"].replace("<@", "<@") + data["attachments"][0]["text"] = data["attachments"][0]["text"].replace(">", ">") data.update({ "token": settings.SLACK_API_TOKEN, diff --git a/will/utils.py b/will/utils.py index 3f809edb..4b879b15 100644 --- a/will/utils.py +++ b/will/utils.py @@ -19,7 +19,6 @@ "parse_channel_data", "server", "send_message", - "ts", "_updatedAt", ] From c23f2b2837192c61be48ac103e4e835fe0b48890 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Mon, 20 Nov 2017 13:13:24 +1300 Subject: [PATCH 141/200] Fixes inline linking for slack --- will/backends/io_adapters/slack.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index a3448cea..e54925fa 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -161,8 +161,6 @@ def handle_outgoing_event(self, event): event.content = SlackMarkdownConverter().convert(event.content) event.content = event.content.replace("&", "&") - event.content = event.content.replace("<", "<") - event.content = event.content.replace(">", ">") event.content = event.content.replace("\_", "_") kwargs = {} From 6f59b5c5f450c34fb6985fe150fe3d23aa7b3f48 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Mon, 20 Nov 2017 13:36:55 +1300 Subject: [PATCH 142/200] Documentation for 2.0.1b4 --- docs/plugins/reply.md | 2 ++ docs/releases.md | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/plugins/reply.md b/docs/plugins/reply.md index 2b4fe71a..dd53571d 100644 --- a/docs/plugins/reply.md +++ b/docs/plugins/reply.md @@ -28,6 +28,7 @@ self.say(content, channel=None, html=False, color="green", notify=False) - **`html`**: if the message is HTML. `True` or `False`. - **`color`**: (chat room only) the hipchat color to send. "yellow", "red", "green", "purple", "gray", or "random". Default is "green". - **`notify`**: whether the message should trigger a 'ping' notification. `True` or `False`. +- **`start_thread`**: whether Will should start a new thread, if the backend supports it. ## Reply with a mention @@ -50,6 +51,7 @@ self.reply(content, html=False, color="green", notify=False) - **`html`**: if the message is HTML. `True` or `False`. - **`color`**: (chat room only) the hipchat color to send. "yellow", "red", "green", "purple", "gray", or "random". Default is "green". - **`notify`**: whether the message should trigger a 'ping' notification. `True` or `False`. +- **`start_thread`**: whether Will should start a new thread, if the backend supports it. diff --git a/docs/releases.md b/docs/releases.md index 0eb9f04f..264330d4 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -5,9 +5,11 @@ Bugfix release that fixes: -* `color` parameter wasn't working properly in Slack. Thanks to [@netjunki](https://github.com/netjunki) for the report! -* Adds a new `start_thread` parameter to `say()` and `reply()` to allow Will to start slack threads. +* `color` parameter wasn't working properly in Slack. +* Fixes up slack escaping, to support `` links. Thanks to [@netjunki](https://github.com/netjunki) for the report on this and the above. +Minor features: +* Adds a new `start_thread` parameter to `say()` and `reply()` to allow Will to start slack threads. #### 2.0.1beta3 - November 13, 2017 From a8226214394b79999ff1c008326491639909a461 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Mon, 20 Nov 2017 20:16:23 +1300 Subject: [PATCH 143/200] Little bit of magic, and instruction for handling start_thread in cases where it's incorrectly called from .say() --- docs/plugins/reply.md | 3 +-- will/backends/io_adapters/slack.py | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/plugins/reply.md b/docs/plugins/reply.md index dd53571d..632e69dc 100644 --- a/docs/plugins/reply.md +++ b/docs/plugins/reply.md @@ -28,7 +28,6 @@ self.say(content, channel=None, html=False, color="green", notify=False) - **`html`**: if the message is HTML. `True` or `False`. - **`color`**: (chat room only) the hipchat color to send. "yellow", "red", "green", "purple", "gray", or "random". Default is "green". - **`notify`**: whether the message should trigger a 'ping' notification. `True` or `False`. -- **`start_thread`**: whether Will should start a new thread, if the backend supports it. ## Reply with a mention @@ -45,7 +44,7 @@ def hi(self, message): All the options: ```python -self.reply(content, html=False, color="green", notify=False) +self.reply(content, html=False, color="green", notify=False, start_thread=False) ``` - **`content`**: the content you want to send to the room. HTML or plain text. - **`html`**: if the message is HTML. `True` or `False`. diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index e54925fa..a2a26f7a 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -255,7 +255,20 @@ def set_data_channel_and_thread(self, event, data={}): data.update({ "thread_ts": event.source_message.original_incoming_event["ts"] }) - + elif ( + hasattr(event.source_message, "data") and + hasattr(event.source_message.data, "original_incoming_event") and + "ts" in event.source_message.data.original_incoming_event + ): + logging.error( + "Hm. I was told to start a new thread, but while using .say(), instead of .reply().\n" + "This doesn't really make sense, but I'm going to make the best of it by pretending you " + "used .say() and threading off of your message.\n" + "Please update your plugin to use .reply() when you have a second!" + ) + data.update({ + "thread_ts": event.source_message.data.original_incoming_event["ts"] + }) else: data.update({ "thread_ts": event.data["original_incoming_event"].data.thread From 4ba1b48c541d2050dea6c3a27c9e917c88d4c831 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 21 Nov 2017 12:47:07 +1300 Subject: [PATCH 144/200] Adds docker cloud encrypted creds --- .travis.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index e50df4a9..35dae553 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,11 @@ language: python sudo: false - install: - - pip install -U tox - -script: - - tox +- pip install -U tox +script: +- tox +env: + matrix: + - secure: VWKQxtbHsDnVk/IyqcGfkXVmGBM8WIzbrHgIXrJqvoyqDJDpg3HAPvFBuQb1ytRRxH5K9X40FQHFSduTkesGE+dNQHUewalzojvmq4zLRzzbz12kOZeCAg0derW+WBEQ//quDL5Z7Z7fmxcUOk9RSNVOuoQujs61bGvarKq2r8E= + - secure: o5sFN0mL0myWKGfmd2pr/skAsEupAPvAFLdiNRrqsW3LEEqypaRav04c6F/OAvV687AJ9EqoblHsMjapmnorWoLmnMSthyBhEL6jp04yUZCkxjyj/mdt84Th5t/6K4QtZLiEs7bmrEf+o2r4jhVfHxthuMGhLbg8VDk2UDqGsx4= + - secure: qvhthBuMLLR8jsqHeY2YYHlTKL9nwTJSD3xSEcqniTlXS9QT252jl5ksUM0ks1S5V0RDgiJCFh5XqP11C6ljir8iZGr6h5yff5UC2iDxCv7fzE35TAiOIRXU7x6xJFur0aC5/WfIMZhNXz+FTw3w/SnYOPMlyxDIquXMqBkMwAg= From a1171d8f901ff35950b4151d4805cd63aa740c4a Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 21 Nov 2017 15:52:05 +1300 Subject: [PATCH 145/200] 2.0.1 release - pulls beta. --- docs/releases.md | 3 +++ will/__init__.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/releases.md b/docs/releases.md index 264330d4..c6d7f4ae 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1,5 +1,8 @@ # Releases +#### 2.0.1 - November 21, 2017 + +Same release as 2.0.1, removes beta tag. #### 2.0.1beta4 - November 20, 2017 diff --git a/will/__init__.py b/will/__init__.py index f2fb0330..b46c2e74 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "2.0.1beta4" +VERSION = "2.0.1" From 95d5514de67b08b25df7507b8093db276301eb69 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 23 Nov 2017 11:49:49 +1300 Subject: [PATCH 146/200] Fixes hipchat all rooms bug, bumps to 2.0.2. --- docs/releases.md | 6 ++++++ will/__init__.py | 2 +- will/backends/io_adapters/hipchat.py | 28 +++++++++++++++++----------- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index c6d7f4ae..c6b11652 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1,5 +1,11 @@ # Releases +#### 2.0.2 - November 22, 2017 + +Bugfix release that fixes: + +* Will once again joins all hipchat rooms `HIPCHAT_ROOMS` was not specified. Thanks to [vissree](https://github.com/vissree) for finding and reporting this bug! + #### 2.0.1 - November 21, 2017 Same release as 2.0.1, removes beta tag. diff --git a/will/__init__.py b/will/__init__.py index b46c2e74..311aff26 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "2.0.1" +VERSION = "2.0.2" diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index 16daf6c5..a33c3648 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -268,18 +268,24 @@ def start_xmpp_client(self, xmpp_bridge_queue=None, backend_name=""): ) self.available_rooms - for r in settings.HIPCHAT_ROOMS: - if r != "": + if hasattr(settings, "HIPCHAT_ROOMS") and settings.HIPCHAT_ROOMS: + for r in settings.HIPCHAT_ROOMS: + if r != "": + if not hasattr(self, "default_room"): + self.default_room = r + + try: + self.rooms.append(self.available_rooms[r]) + except KeyError: + logger.error( + u'"{0}" is not an available room, ask' + ' "@{1} what are the rooms?" for the full list.' + .format(r, settings.HIPCHAT_HANDLE)) + else: + for name, r in self.available_rooms.items(): if not hasattr(self, "default_room"): - self.default_room = r - - try: - self.rooms.append(self.available_rooms[r]) - except KeyError: - logger.error( - u'"{0}" is not an available room, ask' - ' "@{1} what are the rooms?" for the full list.' - .format(r, settings.HIPCHAT_HANDLE)) + self.default_room = r + self.rooms.append(r) self.nick = settings.HIPCHAT_HANDLE self.handle = settings.HIPCHAT_HANDLE From 9170aa48351e1cab81e88d8272dcd3ecead1e169 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 23 Nov 2017 12:34:51 +1300 Subject: [PATCH 147/200] Updates travis docker encrypted pass --- .travis.yml | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index a466daee..f799bcad 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,23 +1,19 @@ language: python sudo: false install: - - pip install -U tox - -script: - - tox - - export CTAG="-$TRAVIS_COMMIT" - - ./docker/buildwillcontainers.sh --build - +- pip install -U tox +script: +- tox +- export CTAG="-$TRAVIS_COMMIT" +- "./docker/buildwillcontainers.sh --build" deploy: skip_cleanup: true provider: script - script: docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - script: ./docker/buildwillcontainers.sh --all + script: "./docker/buildwillcontainers.sh --all" on: - branch: master - + branch: master env: matrix: - secure: VWKQxtbHsDnVk/IyqcGfkXVmGBM8WIzbrHgIXrJqvoyqDJDpg3HAPvFBuQb1ytRRxH5K9X40FQHFSduTkesGE+dNQHUewalzojvmq4zLRzzbz12kOZeCAg0derW+WBEQ//quDL5Z7Z7fmxcUOk9RSNVOuoQujs61bGvarKq2r8E= - secure: o5sFN0mL0myWKGfmd2pr/skAsEupAPvAFLdiNRrqsW3LEEqypaRav04c6F/OAvV687AJ9EqoblHsMjapmnorWoLmnMSthyBhEL6jp04yUZCkxjyj/mdt84Th5t/6K4QtZLiEs7bmrEf+o2r4jhVfHxthuMGhLbg8VDk2UDqGsx4= - - secure: qvhthBuMLLR8jsqHeY2YYHlTKL9nwTJSD3xSEcqniTlXS9QT252jl5ksUM0ks1S5V0RDgiJCFh5XqP11C6ljir8iZGr6h5yff5UC2iDxCv7fzE35TAiOIRXU7x6xJFur0aC5/WfIMZhNXz+FTw3w/SnYOPMlyxDIquXMqBkMwAg= \ No newline at end of file + - secure: dRYwXOE5DXQKfsTMJHgYQX5fmwANFiD9jIvNx8IoTJUx42oUQ/IlTHZNNyscuRCjmfUg6U2q/FgvfRQHk4WbGjyNJyyURm5i4wzpDE7DDKz0MC9afIY6+YwiV7up99g4ZW8G664zO0PMEUIQ2N+ehOW6IwFoXoFT7VaDxs9Ebr8= From 576fa29cc8dc2f559224fa6dd2a28d04f44123a7 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 23 Nov 2017 12:42:59 +1300 Subject: [PATCH 148/200] All in one for travis build --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index f799bcad..ebf814e3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,4 @@ deploy: branch: master env: matrix: - - secure: VWKQxtbHsDnVk/IyqcGfkXVmGBM8WIzbrHgIXrJqvoyqDJDpg3HAPvFBuQb1ytRRxH5K9X40FQHFSduTkesGE+dNQHUewalzojvmq4zLRzzbz12kOZeCAg0derW+WBEQ//quDL5Z7Z7fmxcUOk9RSNVOuoQujs61bGvarKq2r8E= - - secure: o5sFN0mL0myWKGfmd2pr/skAsEupAPvAFLdiNRrqsW3LEEqypaRav04c6F/OAvV687AJ9EqoblHsMjapmnorWoLmnMSthyBhEL6jp04yUZCkxjyj/mdt84Th5t/6K4QtZLiEs7bmrEf+o2r4jhVfHxthuMGhLbg8VDk2UDqGsx4= - - secure: dRYwXOE5DXQKfsTMJHgYQX5fmwANFiD9jIvNx8IoTJUx42oUQ/IlTHZNNyscuRCjmfUg6U2q/FgvfRQHk4WbGjyNJyyURm5i4wzpDE7DDKz0MC9afIY6+YwiV7up99g4ZW8G664zO0PMEUIQ2N+ehOW6IwFoXoFT7VaDxs9Ebr8= + secure: SWBr2Ih6+vT0iX5CxqPT8ICmtFUcIk7MRfh21DnsGKpumz60mgRPnb+aMxagSDWrF0btGyI3vfD8nYEv6Vv+WDDCbeJCG3xExsIusiflaM1Vqo1OcUGlO55jQm1WtNub7SmiMSH8EY5GFFNfFn7CmSmU1xaM0p5q8Y0OTbZpku8= From 6a39599e720a7f557d3c3476ea14c8a19e5920ed Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 23 Nov 2017 12:56:34 +1300 Subject: [PATCH 149/200] Updates build syntax on docker build script --- docker/buildwillcontainers.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/buildwillcontainers.sh b/docker/buildwillcontainers.sh index 9a1c4d8a..9d8c542b 100755 --- a/docker/buildwillcontainers.sh +++ b/docker/buildwillcontainers.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -declare -A dockerfiles +declare -a dockerfiles dockerfiles=( ["heywill/will:python2.7$CTAG"]="/will/will-py2/" ["heywill/will:python3.7$CTAG"]="/will/will-py3/") @@ -26,7 +26,7 @@ tag_production(){ push_containers(){ - tag_latest + tag_production docker push heywill/will-base:latest docker push heywill/will:latest } From 5412eacab2d42931c4d278034e6244164a652d6f Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 23 Nov 2017 13:06:16 +1300 Subject: [PATCH 150/200] Shifts to beta to get master passing --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ebf814e3..29720149 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ deploy: provider: script script: "./docker/buildwillcontainers.sh --all" on: - branch: master + branch: beta env: matrix: secure: SWBr2Ih6+vT0iX5CxqPT8ICmtFUcIk7MRfh21DnsGKpumz60mgRPnb+aMxagSDWrF0btGyI3vfD8nYEv6Vv+WDDCbeJCG3xExsIusiflaM1Vqo1OcUGlO55jQm1WtNub7SmiMSH8EY5GFFNfFn7CmSmU1xaM0p5q8Y0OTbZpku8= From a642d4132deb6596ef43c4901c6cbf484020e382 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 24 Nov 2017 13:30:04 +1300 Subject: [PATCH 151/200] Switches to fabric command. --- .travis.yml | 4 ++-- fabfile.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 29720149..10ec71c8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,11 +5,11 @@ install: script: - tox - export CTAG="-$TRAVIS_COMMIT" -- "./docker/buildwillcontainers.sh --build" +- "fab docker_build" deploy: skip_cleanup: true provider: script - script: "./docker/buildwillcontainers.sh --all" + script: "fab docker_deploy" on: branch: beta env: diff --git a/fabfile.py b/fabfile.py index 339d1ec9..a558c12b 100644 --- a/fabfile.py +++ b/fabfile.py @@ -10,6 +10,19 @@ SANITY_CHECK_PROJECT_FILES = ["fabfile.py", "setup.py", "mkdocs.yml"] SANITY_CHECK_BUILD_FILES = ["index.html", "js", "css"] +CTAG = os.environ.get("CTAG", "") + +DOCKER_BUILDS = [ + { + "name": "heywill/will:python2.7%(CTAG)s" % os.environ, + "dir": "will/will-py2/", + }, + { + "name": "heywill/will:python3.7%(CTAG)s" % os.environ, + "dir": "will/will-py3/", + }, +] +DOCKER_PATH = os.path.join(os.getcwd(), "docker") def _splitpath(path): path = os.path.normpath(path) @@ -78,3 +91,23 @@ def deploy_docs(): else: print("No changes to the docs.") local("git checkout %s" % current_branch) + +def docker_build(): + with lcd(DOCKER_PATH): + for c in DOCKER_BUILDS: + local("docker build -t %(name)s %(dir)s" % c) + +def docker_tag(): + with lcd(DOCKER_PATH): + for c in DOCKER_BUILDS: + local("docker tag %(name)s %(dir)s" % c) + +def docker_push(): + with lcd(DOCKER_PATH): + local("docker push heywill/will-base:latest") + local("docker push heywill/will:latest") + +def docker_deploy(): + docker_build() + docker_tag() + docker_push() \ No newline at end of file From 4a77b3316791b98bf07d68da3a80dacd624ed28a Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 24 Nov 2017 15:09:13 +1300 Subject: [PATCH 152/200] Fixes pep8 --- fabfile.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fabfile.py b/fabfile.py index a558c12b..426397cf 100644 --- a/fabfile.py +++ b/fabfile.py @@ -24,6 +24,7 @@ ] DOCKER_PATH = os.path.join(os.getcwd(), "docker") + def _splitpath(path): path = os.path.normpath(path) return path.split(os.sep) @@ -92,22 +93,26 @@ def deploy_docs(): print("No changes to the docs.") local("git checkout %s" % current_branch) + def docker_build(): with lcd(DOCKER_PATH): for c in DOCKER_BUILDS: local("docker build -t %(name)s %(dir)s" % c) + def docker_tag(): with lcd(DOCKER_PATH): for c in DOCKER_BUILDS: local("docker tag %(name)s %(dir)s" % c) + def docker_push(): with lcd(DOCKER_PATH): local("docker push heywill/will-base:latest") local("docker push heywill/will:latest") + def docker_deploy(): docker_build() docker_tag() - docker_push() \ No newline at end of file + docker_push() From 35bc23d189e782261bd0fcc49c8c4232a4b7c420 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 24 Nov 2017 15:13:38 +1300 Subject: [PATCH 153/200] Adds dev reqs --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 10ec71c8..f52b7474 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,7 @@ language: python sudo: false install: - pip install -U tox +- pip install -r requirements/dev.txt script: - tox - export CTAG="-$TRAVIS_COMMIT" From ffc4d3c06c169705df2ee5220360425f233f56c4 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 24 Nov 2017 15:17:19 +1300 Subject: [PATCH 154/200] Path prefix --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f52b7474..ffc873d6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ language: python sudo: false install: - pip install -U tox -- pip install -r requirements/dev.txt +- pip install -r will/requirements/dev.txt script: - tox - export CTAG="-$TRAVIS_COMMIT" From fee4f5b64989108c1736d8b0b41e17e44aeb8069 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 24 Nov 2017 15:24:42 +1300 Subject: [PATCH 155/200] Adds docker as a service --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index ffc873d6..f425918c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,7 @@ language: python sudo: false +services: + - docker install: - pip install -U tox - pip install -r will/requirements/dev.txt From 3ade33358a1f54126c19e33291408cf57d83bff2 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 24 Nov 2017 16:19:01 +1300 Subject: [PATCH 156/200] Updates to ctag name --- fabfile.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fabfile.py b/fabfile.py index 426397cf..137578d2 100644 --- a/fabfile.py +++ b/fabfile.py @@ -14,11 +14,13 @@ DOCKER_BUILDS = [ { + "ctagname": "heywill/will:python2.7%(CTAG)s" % os.environ, "name": "heywill/will:python2.7%(CTAG)s" % os.environ, "dir": "will/will-py2/", }, { - "name": "heywill/will:python3.7%(CTAG)s" % os.environ, + "ctagname": "heywill/will:python3.7" % os.environ, + "name": "heywill/will:python3.7" % os.environ, "dir": "will/will-py3/", }, ] @@ -95,18 +97,21 @@ def deploy_docs(): def docker_build(): + print("Building Docker Images...") with lcd(DOCKER_PATH): for c in DOCKER_BUILDS: - local("docker build -t %(name)s %(dir)s" % c) + local("docker build -t %(ctagname)s %(dir)s" % c) def docker_tag(): + print("Building Docker Releases...") with lcd(DOCKER_PATH): for c in DOCKER_BUILDS: local("docker tag %(name)s %(dir)s" % c) def docker_push(): + print("Pushing Docker to Docker Cloud...") with lcd(DOCKER_PATH): local("docker push heywill/will-base:latest") local("docker push heywill/will:latest") From a9faf09e6718fc5ca6fad6a53705725c86161ff4 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 24 Nov 2017 16:38:00 +1300 Subject: [PATCH 157/200] Fixes args --- fabfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabfile.py b/fabfile.py index 137578d2..4b7c5f24 100644 --- a/fabfile.py +++ b/fabfile.py @@ -107,7 +107,7 @@ def docker_tag(): print("Building Docker Releases...") with lcd(DOCKER_PATH): for c in DOCKER_BUILDS: - local("docker tag %(name)s %(dir)s" % c) + local("docker tag %(ctagname)s %(name)s" % c) def docker_push(): From ec37c3d36aea80678efe8e93fe57d57f47bfecf4 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 24 Nov 2017 17:15:09 +1300 Subject: [PATCH 158/200] Adds latest --- fabfile.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fabfile.py b/fabfile.py index 4b7c5f24..e1de326e 100644 --- a/fabfile.py +++ b/fabfile.py @@ -15,11 +15,16 @@ DOCKER_BUILDS = [ { "ctagname": "heywill/will:python2.7%(CTAG)s" % os.environ, - "name": "heywill/will:python2.7%(CTAG)s" % os.environ, + "name": "heywill/will:python2.7" % os.environ, "dir": "will/will-py2/", }, { - "ctagname": "heywill/will:python3.7" % os.environ, + "ctagname": "heywill/will:python2.7%(CTAG)s" % os.environ, + "name": "heywill/will:latest" % os.environ, + "dir": "will/will-py2/", + }, + { + "ctagname": "heywill/will:python3.7%(CTAG)s" % os.environ, "name": "heywill/will:python3.7" % os.environ, "dir": "will/will-py3/", }, From ca8733ed04d3e79bce5098fe40b56521da5c7adb Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 28 Nov 2017 10:24:21 +1300 Subject: [PATCH 159/200] Switches to right tags --- fabfile.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fabfile.py b/fabfile.py index e1de326e..b184ea98 100644 --- a/fabfile.py +++ b/fabfile.py @@ -20,7 +20,7 @@ }, { "ctagname": "heywill/will:python2.7%(CTAG)s" % os.environ, - "name": "heywill/will:latest" % os.environ, + "name": "heywill/will-base:latest" % os.environ, "dir": "will/will-py2/", }, { @@ -118,7 +118,8 @@ def docker_tag(): def docker_push(): print("Pushing Docker to Docker Cloud...") with lcd(DOCKER_PATH): - local("docker push heywill/will-base:latest") + local("docker push heywill/will:python2.7") + local("docker push heywill/will:python3.7") local("docker push heywill/will:latest") From f43fdb9e355d6b71d956a71e2e499b939cba91e9 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 28 Nov 2017 11:05:53 +1300 Subject: [PATCH 160/200] Fully pulls base --- fabfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabfile.py b/fabfile.py index b184ea98..dacd5993 100644 --- a/fabfile.py +++ b/fabfile.py @@ -20,7 +20,7 @@ }, { "ctagname": "heywill/will:python2.7%(CTAG)s" % os.environ, - "name": "heywill/will-base:latest" % os.environ, + "name": "heywill/will:latest" % os.environ, "dir": "will/will-py2/", }, { From 00f1f6a441c2fd886fe5c1bdd383474417f415b6 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 28 Nov 2017 12:09:18 +1300 Subject: [PATCH 161/200] Shifts to base markdownify. --- will/requirements/slack.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/will/requirements/slack.txt b/will/requirements/slack.txt index 7c1123b5..76feb428 100644 --- a/will/requirements/slack.txt +++ b/will/requirements/slack.txt @@ -1,6 +1,4 @@ -r base.txt slackclient>=1.0.5<1.1.0 -# Until https://github.com/matthewwithanm/python-markdownify/pull/1 is merged: -# markdownify>=0.4.0<0.5.0 -will-markdownify==0.4.1 +markdownify==0.4.1 From 9109a48705708250cb1f26a83038a7eb854082c0 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 28 Nov 2017 12:10:59 +1300 Subject: [PATCH 162/200] Fixes py3 for dev mode --- start_dev_will.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start_dev_will.py b/start_dev_will.py index 9d306752..96dc7dfd 100755 --- a/start_dev_will.py +++ b/start_dev_will.py @@ -19,7 +19,7 @@ def start_will(): try: import yappi except: - print "Unable to run Will in profiling mode without yappi. Please `pip install yappi`." + print("Unable to run Will in profiling mode without yappi. Please `pip install yappi`.") sys.exit(1) try: shutil.rmtree('will_profiles') From 3e9a2f8eacc95b8ac0a876ca5cc6e4ee0e866d14 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 28 Nov 2017 16:33:05 +1300 Subject: [PATCH 163/200] Adds docker login --- fabfile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fabfile.py b/fabfile.py index dacd5993..6622c2d1 100644 --- a/fabfile.py +++ b/fabfile.py @@ -118,6 +118,7 @@ def docker_tag(): def docker_push(): print("Pushing Docker to Docker Cloud...") with lcd(DOCKER_PATH): + local("docker login -u $DOCKER_USER -p $DOCKER_PASS") local("docker push heywill/will:python2.7") local("docker push heywill/will:python3.7") local("docker push heywill/will:latest") From 7491140762d890414c39ac165dd79fb1ca4a0174 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Tue, 28 Nov 2017 16:54:26 +1300 Subject: [PATCH 164/200] Updates to 2.1, documents docker hub --- .travis.yml | 2 +- docker/buildwillcontainers.sh | 1 + docs/deploy.md | 1 + docs/releases.md | 9 +++++++++ will/__init__.py | 2 +- 5 files changed, 13 insertions(+), 2 deletions(-) mode change 100755 => 100644 docker/buildwillcontainers.sh diff --git a/.travis.yml b/.travis.yml index f425918c..a54111f1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ deploy: provider: script script: "fab docker_deploy" on: - branch: beta + branch: master env: matrix: secure: SWBr2Ih6+vT0iX5CxqPT8ICmtFUcIk7MRfh21DnsGKpumz60mgRPnb+aMxagSDWrF0btGyI3vfD8nYEv6Vv+WDDCbeJCG3xExsIusiflaM1Vqo1OcUGlO55jQm1WtNub7SmiMSH8EY5GFFNfFn7CmSmU1xaM0p5q8Y0OTbZpku8= diff --git a/docker/buildwillcontainers.sh b/docker/buildwillcontainers.sh old mode 100755 new mode 100644 index 9d8c542b..5aa550a3 --- a/docker/buildwillcontainers.sh +++ b/docker/buildwillcontainers.sh @@ -27,6 +27,7 @@ tag_production(){ push_containers(){ tag_production + docker push heywill/will-base:latest docker push heywill/will:latest } diff --git a/docs/deploy.md b/docs/deploy.md index a4a2d8d5..f2734f5f 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -126,6 +126,7 @@ docker-compose up -d Will docker file(s) are part of the main repository; this lets developers/teams build on the containers to embed configuration files, custom plugins etc... For now Will containers are represented in python 2.7 and python 3 flavors. + ##### Will-base Will is built on the alpine distribution(s) of python docker images. This was done to provide the smallest container footprint; yet, nothing is perfect so a few diff --git a/docs/releases.md b/docs/releases.md index c6b11652..1d13300e 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1,5 +1,14 @@ # Releases +#### 2.1.0 - November 28, 2017 + +Planned release that includes: + +* Automatic [docker hub builds](https://hub.docker.com/r/heywill/will/) thanks to [@mike-love](https://github.com/mike-love) +* Upgrades to use base markdownify package, as the proposed changes have been [merged and released](https://github.com/matthewwithanm/python-markdownify/pull/1). +* New fabric commands to manage docker builds and releases. + + #### 2.0.2 - November 22, 2017 Bugfix release that fixes: diff --git a/will/__init__.py b/will/__init__.py index 311aff26..127c148a 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "2.0.2" +VERSION = "2.1.0" From 97e174e7bf4cb9f89266ea04f7945ac45e42af8c Mon Sep 17 00:00:00 2001 From: Allie Date: Wed, 6 Dec 2017 12:12:53 -0800 Subject: [PATCH 165/200] save "all_listener_regexes" to storage So "programmer help" works as expect. --- will/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/will/main.py b/will/main.py index 37d841f2..a0772a04 100644 --- a/will/main.py +++ b/will/main.py @@ -1095,5 +1095,5 @@ def bootstrap_plugins(self): show_valid(plugin_name) except Exception as e: self.startup_error("Error bootstrapping %s" % (plugin_info["class"],), e) - + self.save("all_listener_regexes", self.all_listener_regexes) puts("") From 3a3da6771664c50fb18cb920e1bc8a715561b37b Mon Sep 17 00:00:00 2001 From: Matt Chun-Lum Date: Sat, 10 Feb 2018 22:44:03 -0800 Subject: [PATCH 166/200] Attempt to work around WebSocketConnectionClosedException for slack see https://github.com/slackapi/python-slackclient/issues/118 --- will/backends/io_adapters/slack.py | 56 +++++++++++++++++------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index a2a26f7a..68cb4023 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -6,6 +6,7 @@ import sys import time import traceback +import websocket from markdownify import MarkdownConverter @@ -438,31 +439,36 @@ def _update_backend_metadata(self): self._update_channels() def _watch_slack_rtm(self): - try: - if self.client.rtm_connect(): - self._update_backend_metadata() - - num_polls_between_updates = 30 / settings.EVENT_LOOP_INTERVAL # Every 30 seconds - current_poll_count = 0 - while True: - events = self.client.rtm_read() - if len(events) > 0: - # TODO: only handle events that are new. - # print(len(events)) - for e in events: - self.handle_incoming_event(e) - - # Update channels/people/me/etc every 10s or so. - current_poll_count += 1 - if current_poll_count > num_polls_between_updates: - self._update_backend_metadata() - current_poll_count = 0 - - self.sleep_for_event_loop() - except (KeyboardInterrupt, SystemExit): - pass - except: - logging.critical("Error in watching slack RTM: \n%s" % traceback.format_exc()) + while True: + try: + if self.client.rtm_connect(): + self._update_backend_metadata() + + num_polls_between_updates = 30 / settings.EVENT_LOOP_INTERVAL # Every 30 seconds + current_poll_count = 0 + while True: + events = self.client.rtm_read() + if len(events) > 0: + # TODO: only handle events that are new. + # print(len(events)) + for e in events: + self.handle_incoming_event(e) + + # Update channels/people/me/etc every 10s or so. + current_poll_count += 1 + if current_poll_count > num_polls_between_updates: + self._update_backend_metadata() + current_poll_count = 0 + + self.sleep_for_event_loop() + except websocket.WebSocketConnectionClosedException: + logging.error('Encountered WebSocketConnectionClosedException attempting reconnect in 2 seconds') + time.sleep(2) + except (KeyboardInterrupt, SystemExit): + break + except: + logging.critical("Error in watching slack RTM: \n%s" % traceback.format_exc()) + break def bootstrap(self): # Bootstrap must provide a way to to have: From bd7b279648779d340daec80baa76b70a4cb29e02 Mon Sep 17 00:00:00 2001 From: Benjamin Lau Date: Sat, 24 Feb 2018 09:06:56 -0800 Subject: [PATCH 167/200] Fix for #337 string.ascii_uppercase turns out to be simpler --- will/plugins/fun/wordgame.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/will/plugins/fun/wordgame.py b/will/plugins/fun/wordgame.py index babad325..4eedad80 100644 --- a/will/plugins/fun/wordgame.py +++ b/will/plugins/fun/wordgame.py @@ -208,7 +208,7 @@ class WordGamePlugin(WillPlugin): def word_game_round(self, message): "play a word game: Play a game where you think of words that start with a letter and fit a topic." - letter = random.choice(string.letters).upper() + letter = random.choice(string.ascii_uppercase) topics = [] while len(topics) < 10: From c94f301d6498a43968714568b9ebc0dc8135aa8b Mon Sep 17 00:00:00 2001 From: ostracon Date: Wed, 7 Mar 2018 11:03:51 +0000 Subject: [PATCH 168/200] Candidate fix for #336 and #306 --- will/backends/io_adapters/hipchat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index a33c3648..b85cb218 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -605,7 +605,7 @@ def channels(self): r = requests.get(url, **settings.REQUESTS_OPTIONS) for room in r.json()['items']: - all_rooms["%s" % (room['id'],)] = Channel( + all_rooms["%s" % (room['xmpp_jid'],)] = Channel( id=room["id"], name=room["name"], source=clean_for_pickling(room), From acdceadee600116efd6824706bcaa234778b9b0e Mon Sep 17 00:00:00 2001 From: Allie Date: Mon, 19 Mar 2018 15:07:49 -0700 Subject: [PATCH 169/200] Update AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index a7d4fc0e..93f2db9b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -47,3 +47,4 @@ Jeppe Toustrup, https://github.com/Tenzer bykof, https://github.com/bykof/ Mike Love, https://github.com/mike-love Roy Zheng, https://github.com/wontonst +acommasplice, https://github.com/acommasplice From 374ca8dd049822670ee10c5e85a80e33300ee74a Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 22 Mar 2018 14:32:34 +1300 Subject: [PATCH 170/200] Sets up for 2.1.1 --- AUTHORS | 3 + docs/improve.md | 6 +- docs/releases.md | 11 ++++ will/__init__.py | 2 +- will/backends/execution/base.py | 79 ++++++++++++++++----------- will/backends/execution/best_score.py | 6 +- will/backends/io_adapters/hipchat.py | 5 +- will/main.py | 1 + will/mixins/errors.py | 1 + will/plugins/friendly/hello.py | 6 +- 10 files changed, 79 insertions(+), 41 deletions(-) diff --git a/AUTHORS b/AUTHORS index 93f2db9b..8a14a8cc 100644 --- a/AUTHORS +++ b/AUTHORS @@ -48,3 +48,6 @@ bykof, https://github.com/bykof/ Mike Love, https://github.com/mike-love Roy Zheng, https://github.com/wontonst acommasplice, https://github.com/acommasplice +TaunoTinits, https://github.com/TaunoTinits +ostracon, https://github.com/ostracon +mattcl, https://github.com/mattcl diff --git a/docs/improve.md b/docs/improve.md index 456fd5b0..88131b4a 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -82,6 +82,7 @@ Will was originally written and is maintained by [Steven Skoczen](http://stevens Will's also has had help from lots of coders. Alphabetically: +- [acommasplice](https://github.com/acommasplice) fixed up the programmer help, so it works again. - [adamcin](https://github.com/adamcin) gave you html support in 1-1 chats, using the new v2 API, and made bootstrapping more reliable. - [adamgilman](https://github.com/adamgilman) gave you the friendly error messages when the hipchat key was invalid. - [antgel](https://github.com/antgel) fixed the image plugin, for reals and added awesome documentation. @@ -113,13 +114,15 @@ Will's also has had help from lots of coders. Alphabetically: - [keNzi](https://github.com/keNzej) added shorten url function using bitly service. - [levithomason](http://github.com/levithomason) was one of the original contributors, when will was first built at GreenKahuna. - [mark-adams](https://github.com/mark-adams) cleaned up a Bitbucket typo. +- [mattcl](https://github.com/mattcl) taught will to reconnect to Slack when hiccups occur. - [mike-love](https://github.com/mike-love) added Docker support to make running Will easier - and then re-updated it to support Will 2.x! - [hobson](http://github.com/hobson) made setup.py more robust across operating systems, and improved the docs. - [neronmoon](https://github.com/neronmoon) made it easier to mention will with non-standard case - [michaeljoseph](https://github.com/michaeljoseph) suggested improvements to setup and requirements.txt format. - [mrgrue](https://github.com/mrgrue) added support for the hipchat server beta. - [mvanbaak](https://github.com/mvanbaak) brought you support for bitbucket uptime. -- [netjunkie](https://github.com/netjunki) fixed a duplicated help module, added an expire parameter to `self.save()`, added support for will watching hipchat's status. and fixed some redis config bugs. +- [netjunkie](https://github.com/netjunki) fixed a duplicated help module, added an expire parameter to `self.save()`, added support for will watching hipchat's status, fixed some redis config bugs, and kept word game working on py3. +- [ostracon](https://github.com/ostracon) got chat room replies working for orgs with > 1000 rooms. - [pcurry](https://github.com/pcurry) added travis support. - [pepedocs](https://github.com/pepedocs) added friendly timestamps to the default logging output. - [PrideRage](https://github.com/PrideRage) gave you access to a room's entire history, and suggested a better talkback regex. @@ -131,6 +134,7 @@ Will's also has had help from lots of coders. Alphabetically: - [tenzer](https://github.com/tenzer) added python 3 support! - [tomokas](https://github.com/tomokas) fixed a bug in the `@randomly` decorator. - [tophsic](https://github.com/tophsic) made help friendlier, including plugin-specific help. +- [@TaunoTinits](https://github.com/TaunoTinits) fixed the `get_room_from_message` method in 2.x. - [wohali](https://github.com/wohali) tracked down the annoying DNS thread issue, and got will on the right path. - [woohgit](https://github.com/woohgit) added support for the v2 WorldWeatherOnline API, and fixed it when I broke it, and then fixed it again when they changed their endpoint. He also taught will how to say his version number. And `remind ___ to ___ at ___`. Awesome. And fixed lots of docs. And put the time zone with "what time is it?". And then added an entire Pagerduty workflow. And made message parsing more reliable. And wrote the ACL support. And even more doc fixes. And improvements on uptime monitoring edge cases. And kept Pagerduty working. And added `append` and `pop` list support. And ditched WorldWeatherOnline when it started to hurt. Yep. - [wontonst](https://github.com/wontonst) made it simple to have will reply to a specific room, and made reminders more friendly. diff --git a/docs/releases.md b/docs/releases.md index 1d13300e..3106d8f6 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1,5 +1,16 @@ # Releases +#### 2.1.1 - November 28, 2017 + +Catch-up release that includes + +* Fixes slack reconnect issues, thanks to [@mattcl](https://github.com/mattcl). Props to [@cmachine](https://github.com/cmachine) for also submitting a fix. +* Programmer help is working again, thanks to [@acommasplice](https://github.com/acommasplice). +* Fixes word game to work in python 3 thanks to [@netjunki](https://github.com/netjunki), and [ptomkiel-oktawave](https://github.com/ptomkiel-oktawave)'s report. +* Fixes up chat room rosters in HipChat with rosters > 1000 rooms, thanks to [@ostracon](https://github.com/ostracon) +* Fixes `get_room_from_message`, thanks to [@TaunoTinits](https://github.com/TaunoTinits)'s fix and [ptomkiel-oktawave](https://github.com/ptomkiel-oktawave)'s report. +* Fixes an error that could occur on incoming webhooks on hipchat. Thanks to [ptomkiel-oktawave](https://github.com/ptomkiel-oktawave) and others for a report. + #### 2.1.0 - November 28, 2017 Planned release that includes: diff --git a/will/__init__.py b/will/__init__.py index 127c148a..5b0431ec 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "2.1.0" +VERSION = "2.1.1" diff --git a/will/backends/execution/base.py b/will/backends/execution/base.py index 897df7a8..afaa374f 100644 --- a/will/backends/execution/base.py +++ b/will/backends/execution/base.py @@ -35,46 +35,59 @@ def not_allowed(self, message, explanation): ) def execute(self, message, option): - acl = option.context["acl"] - if type(acl) == type("test"): - acl = [acl] + if "acl" in option.context: + acl = option.context["acl"] + if type(acl) == type("test"): + acl = [acl] - allowed = True - if len(acl) > 0: - allowed = test_acl(message, acl) + allowed = True + if len(acl) > 0: + allowed = test_acl(message, acl) - if not allowed: - acl_list = "" - more_than_one_s = "" - if len(acl) > 1: - more_than_one_s = "s" - for i in range(0, len(acl)): - if i == 0: - acl_list = "%s" % acl[i] - elif i == len(acl) - 1: - acl_list = "%s or %s" % (acl_list, acl[i]) - else: - acl_list = "%s, %s" % (acl_list, acl[i]) - explanation = "Sorry, but I don't have you listed in the %s group%s, which is required to do what you asked." % (acl_list, more_than_one_s) + if not allowed: + acl_list = "" + more_than_one_s = "" + if len(acl) > 1: + more_than_one_s = "s" + for i in range(0, len(acl)): + if i == 0: + acl_list = "%s" % acl[i] + elif i == len(acl) - 1: + acl_list = "%s or %s" % (acl_list, acl[i]) + else: + acl_list = "%s, %s" % (acl_list, acl[i]) + explanation = "Sorry, but I don't have you listed in the %s group%s, which is required to do what you asked." % (acl_list, more_than_one_s) - self.not_allowed( - message, - explanation - ) + self.not_allowed( + message, + explanation + ) else: - module = imp.load_source(option.context.plugin_info["parent_name"], option.context.plugin_info["parent_path"]) - cls = getattr(module, option.context.plugin_info["name"]) + if "say_content" in option.context: + # We're coming from a generation engine like a chatterbot, which doesn't *do* things. + self.bot.pubsub.publish( + "message.outgoing.%s" % message.data.backend, + Event( + type="reply", + content=option.context["say_content"], + source_message=message, + ), + reference_message=message.data.original_incoming_event + ) + else: + module = imp.load_source(option.context.plugin_info["parent_name"], option.context.plugin_info["parent_path"]) + cls = getattr(module, option.context.plugin_info["name"]) - instantiated_module = cls(message=message) - method = getattr(instantiated_module, option.context.function_name) + instantiated_module = cls(message=message) + method = getattr(instantiated_module, option.context.function_name) - thread_args = [message, ] + option.context["args"] + thread_args = [message, ] + option.context["args"] - self.run_execute( - method, - *thread_args, - **option.context.search_matches - ) + self.run_execute( + method, + *thread_args, + **option.context.search_matches + ) def run_execute(self, target, *args, **kwargs): try: diff --git a/will/backends/execution/best_score.py b/will/backends/execution/best_score.py index 5a7ce4f3..4baec304 100644 --- a/will/backends/execution/best_score.py +++ b/will/backends/execution/best_score.py @@ -13,7 +13,11 @@ class BestScoreBackend(ExecutionBackend): def _publish_fingerprint(self, option, message): - return "%s - %s" % (option.context.plugin_info["full_module_name"], option.context.full_method_name) + if "say_content" in option.context: + # TODO: Fix this to properly fingerprint + return option.context["say_content"] + else: + return "%s - %s" % (option.context.plugin_info["full_module_name"], option.context.full_method_name) def handle_execution(self, message): published_list = [] diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index b85cb218..6430a179 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -213,7 +213,7 @@ def get_room_by_jid(self, jid): return None def get_room_from_message(self, message): - return self.get_room_by_jid(message.getMucroom()) + return self.get_room_from_name_or_id(message.data.channel.name) def get_room_from_name_or_id(self, name_or_id): for name, room in self.available_rooms.items(): @@ -255,6 +255,7 @@ def start_xmpp_client(self, xmpp_bridge_queue=None, backend_name=""): "server": settings.HIPCHAT_SERVER, "token": settings.HIPCHAT_V2_TOKEN, } + r = requests.get(my_user_url, **settings.REQUESTS_OPTIONS) resp = r.json() if "email" in resp: @@ -641,7 +642,7 @@ def normalize_incoming_event(self, event): if interpolated_handle in event["body"]: will_is_mentioned = True - if sender.id == self.me.id: + if sender and self.me and sender.id == self.me.id: will_said_it = True m = Message( diff --git a/will/main.py b/will/main.py index a0772a04..514bc356 100644 --- a/will/main.py +++ b/will/main.py @@ -441,6 +441,7 @@ def bootstrap_execution(self): ): c = cls(bot=self) self.execution_backends.append(c) + show_valid("Execution: %s Backend started." % cls.__name__) except ImportError as e: error_message = ( "Execution backend %s is missing. Please either remove it \nfrom config.py " diff --git a/will/mixins/errors.py b/will/mixins/errors.py index c5179dc2..ca42a50e 100644 --- a/will/mixins/errors.py +++ b/will/mixins/errors.py @@ -14,6 +14,7 @@ def add_startup_error(self, error_message): self._startup_errors.append(error_message) def startup_error(self, error_message, exception_instance): + traceback.print_exc(); error_message = "%s%s" % ( error_message, ":\n\n%s\nContinuing...\n" % traceback.format_exc(exception_instance) diff --git a/will/plugins/friendly/hello.py b/will/plugins/friendly/hello.py index 0163549f..e317daeb 100644 --- a/will/plugins/friendly/hello.py +++ b/will/plugins/friendly/hello.py @@ -21,9 +21,9 @@ def hi(self, message): def hello(self, message): self.reply("hi!") - @periodic(hour='10', minute='05', day=4, month=12) - def birthday(self, message): - self.reply("Hey, so I didn't want to make a big deal of it, but today's my birthday!") + @periodic(hour='10', minute='10', day=4, month=12) + def birthday(self): + self.say("Hey, so I didn't want to make a big deal of it, but today's my birthday!") @hear("happy birthday") def hear_happy_birthday(self, message): From 1ce69553134b1c863b5ed8af70fda9bd22efa320 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 22 Mar 2018 15:15:50 +1300 Subject: [PATCH 171/200] Fixes #332 --- will/backends/execution/base.py | 45 +++++++++++++++--------------- will/backends/io_adapters/slack.py | 14 +++++++--- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/will/backends/execution/base.py b/will/backends/execution/base.py index afaa374f..c075a115 100644 --- a/will/backends/execution/base.py +++ b/will/backends/execution/base.py @@ -62,32 +62,33 @@ def execute(self, message, option): message, explanation ) + return + + if "say_content" in option.context: + # We're coming from a generation engine like a chatterbot, which doesn't *do* things. + self.bot.pubsub.publish( + "message.outgoing.%s" % message.data.backend, + Event( + type="reply", + content=option.context["say_content"], + source_message=message, + ), + reference_message=message.data.original_incoming_event + ) else: - if "say_content" in option.context: - # We're coming from a generation engine like a chatterbot, which doesn't *do* things. - self.bot.pubsub.publish( - "message.outgoing.%s" % message.data.backend, - Event( - type="reply", - content=option.context["say_content"], - source_message=message, - ), - reference_message=message.data.original_incoming_event - ) - else: - module = imp.load_source(option.context.plugin_info["parent_name"], option.context.plugin_info["parent_path"]) - cls = getattr(module, option.context.plugin_info["name"]) + module = imp.load_source(option.context.plugin_info["parent_name"], option.context.plugin_info["parent_path"]) + cls = getattr(module, option.context.plugin_info["name"]) - instantiated_module = cls(message=message) - method = getattr(instantiated_module, option.context.function_name) + instantiated_module = cls(message=message) + method = getattr(instantiated_module, option.context.function_name) - thread_args = [message, ] + option.context["args"] + thread_args = [message, ] + option.context["args"] - self.run_execute( - method, - *thread_args, - **option.context.search_matches - ) + self.run_execute( + method, + *thread_args, + **option.context.search_matches + ) def run_execute(self, target, *args, **kwargs): try: diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index 68cb4023..6c808bb0 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -251,7 +251,7 @@ def set_data_channel_and_thread(self, event, data={}): try: # If we're starting a thread - if "start_thread" in event.kwargs and event.kwargs["start_thread"] and ("thread_ts" not in data or not data["thread_ts"]): + if "kwargs" in event and "start_thread" in event.kwargs and event.kwargs["start_thread"] and ("thread_ts" not in data or not data["thread_ts"]): if hasattr(event.source_message, "original_incoming_event"): data.update({ "thread_ts": event.source_message.original_incoming_event["ts"] @@ -271,10 +271,16 @@ def set_data_channel_and_thread(self, event, data={}): "thread_ts": event.source_message.data.original_incoming_event["ts"] }) else: - data.update({ - "thread_ts": event.data["original_incoming_event"].data.thread - }) + if hasattr(event.data.original_incoming_event, "thread_ts"): + data.update({ + "thread_ts": event.data.original_incoming_event.thread_ts + }) + elif "thread" in event.data.original_incoming_event.data: + data.update({ + "thread_ts": event.data.original_incoming_event.data.thread + }) except: + logging.info(traceback.format_exc().split(" ")[-1]) pass data.update({ "channel": channel_id, From 3af147439c0ba924c25a2f4bdbb0b0423bd25bd5 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 22 Mar 2018 15:41:59 +1300 Subject: [PATCH 172/200] Sets confidence to 91, fixes the life-affirming #327. --- docs/releases.md | 5 ++++- will/backends/generation/fuzzy_all_matches.py | 1 + will/scripts/config.py.dist | 2 +- will/settings.py | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 3106d8f6..5dfa1053 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -2,14 +2,17 @@ #### 2.1.1 - November 28, 2017 -Catch-up release that includes +Bugfix release that includes: * Fixes slack reconnect issues, thanks to [@mattcl](https://github.com/mattcl). Props to [@cmachine](https://github.com/cmachine) for also submitting a fix. +* Saying "G" will no longer give you a picture of a pug, using the default settings. This is both tragic, and necessary. (Actual fix: adjusted default fuziness settings. If you have the fuzzy backend on, and were seeing the rather hilarious/annoying [#327](https://github.com/skoczen/will/issues/327), set `FUZZY_MINIMUM_MATCH_CONFIDENCE = 91` in your config.py) * Programmer help is working again, thanks to [@acommasplice](https://github.com/acommasplice). * Fixes word game to work in python 3 thanks to [@netjunki](https://github.com/netjunki), and [ptomkiel-oktawave](https://github.com/ptomkiel-oktawave)'s report. * Fixes up chat room rosters in HipChat with rosters > 1000 rooms, thanks to [@ostracon](https://github.com/ostracon) * Fixes `get_room_from_message`, thanks to [@TaunoTinits](https://github.com/TaunoTinits)'s fix and [ptomkiel-oktawave](https://github.com/ptomkiel-oktawave)'s report. * Fixes an error that could occur on incoming webhooks on hipchat. Thanks to [ptomkiel-oktawave](https://github.com/ptomkiel-oktawave) and others for a report. +* Fixes Will incorrectly talking to the main slack room, when he's directly addressed in 1-1 with something he doesn't know how to do. Thanks to [netjunki](https://github.com/netjunki) for the report! + #### 2.1.0 - November 28, 2017 diff --git a/will/backends/generation/fuzzy_all_matches.py b/will/backends/generation/fuzzy_all_matches.py index 30d40e61..b07faf36 100644 --- a/will/backends/generation/fuzzy_all_matches.py +++ b/will/backends/generation/fuzzy_all_matches.py @@ -65,6 +65,7 @@ def do_generate(self, event): search_matches = fuzz_process.extract(message.content, self.match_choices) for match_str, confidence in search_matches: + logging.debug(" Potential (%s) - %s" % (confidence, match_str)) l = self.match_methods[match_str] if ( # The search regex matches and diff --git a/will/scripts/config.py.dist b/will/scripts/config.py.dist index 89c0b31d..ae17c279 100644 --- a/will/scripts/config.py.dist +++ b/will/scripts/config.py.dist @@ -113,7 +113,7 @@ EXECUTION_BACKENDS = [ # Confidence fuzzy generation backends require before Will responds # https://pypi.python.org/pypi/fuzzywuzzy -FUZZY_MINIMUM_MATCH_CONFIDENCE = 90 +FUZZY_MINIMUM_MATCH_CONFIDENCE = 91 FUZZY_REGEX_ALLOWABLE_ERRORS = 3 diff --git a/will/settings.py b/will/settings.py index ce5314b0..2c60c1b6 100644 --- a/will/settings.py +++ b/will/settings.py @@ -418,7 +418,7 @@ def import_settings(quiet=True): os.environ["WILL_EPHEMERAL_SECRET_KEY"] = "True" if "FUZZY_MINIMUM_MATCH_CONFIDENCE" not in settings: - settings["FUZZY_MINIMUM_MATCH_CONFIDENCE"] = 90 + settings["FUZZY_MINIMUM_MATCH_CONFIDENCE"] = 91 if "FUZZY_REGEX_ALLOWABLE_ERRORS" not in settings: settings["FUZZY_REGEX_ALLOWABLE_ERRORS"] = 3 From babfb725bb5d21c7b775b898b9c06971863903fa Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 22 Mar 2018 15:45:45 +1300 Subject: [PATCH 173/200] Fixes up tests, sets release date. --- docs/releases.md | 2 +- will/mixins/errors.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 5dfa1053..9e648635 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1,6 +1,6 @@ # Releases -#### 2.1.1 - November 28, 2017 +#### 2.1.1 - March 22, 2018 Bugfix release that includes: diff --git a/will/mixins/errors.py b/will/mixins/errors.py index ca42a50e..5a28f2c9 100644 --- a/will/mixins/errors.py +++ b/will/mixins/errors.py @@ -14,7 +14,7 @@ def add_startup_error(self, error_message): self._startup_errors.append(error_message) def startup_error(self, error_message, exception_instance): - traceback.print_exc(); + traceback.print_exc() error_message = "%s%s" % ( error_message, ":\n\n%s\nContinuing...\n" % traceback.format_exc(exception_instance) From 9a375c743ad512a8e84fedad4c22f74675727907 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Thu, 22 Mar 2018 15:56:01 +1300 Subject: [PATCH 174/200] Fixes ctag import --- fabfile.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fabfile.py b/fabfile.py index 6622c2d1..1c6adcd8 100644 --- a/fabfile.py +++ b/fabfile.py @@ -14,17 +14,17 @@ DOCKER_BUILDS = [ { - "ctagname": "heywill/will:python2.7%(CTAG)s" % os.environ, + "ctagname": "heywill/will:python2.7%s" % CTAG, "name": "heywill/will:python2.7" % os.environ, "dir": "will/will-py2/", }, { - "ctagname": "heywill/will:python2.7%(CTAG)s" % os.environ, + "ctagname": "heywill/will:python2.7%s" % CTAG, "name": "heywill/will:latest" % os.environ, "dir": "will/will-py2/", }, { - "ctagname": "heywill/will:python3.7%(CTAG)s" % os.environ, + "ctagname": "heywill/will:python3.7%s" % CTAG, "name": "heywill/will:python3.7" % os.environ, "dir": "will/will-py3/", }, From b6b6c064e11c1df4e10a8f030945c53d9a0cfda8 Mon Sep 17 00:00:00 2001 From: Roy Zheng Date: Thu, 29 Mar 2018 15:42:34 -0700 Subject: [PATCH 175/200] Use python3 str type check in hipchat room str conversion --- will/backends/io_adapters/hipchat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/will/backends/io_adapters/hipchat.py b/will/backends/io_adapters/hipchat.py index 6430a179..fd18852a 100644 --- a/will/backends/io_adapters/hipchat.py +++ b/will/backends/io_adapters/hipchat.py @@ -680,7 +680,7 @@ def handle_outgoing_event(self, event): passed_room = kwargs["channel"] if passed_room: - if isinstance(passed_room, basestring): + if isinstance(passed_room, str): # User passed in a room string room = self.get_room_from_name_or_id(passed_room) else: From 62dda7cb85445608b55acd0a2049be01960967fe Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Fri, 30 Mar 2018 11:48:33 +1300 Subject: [PATCH 176/200] 2.1.2 credits --- docs/improve.md | 2 +- docs/releases.md | 8 ++++++++ will/__init__.py | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/improve.md b/docs/improve.md index 88131b4a..30419acc 100644 --- a/docs/improve.md +++ b/docs/improve.md @@ -137,7 +137,7 @@ Will's also has had help from lots of coders. Alphabetically: - [@TaunoTinits](https://github.com/TaunoTinits) fixed the `get_room_from_message` method in 2.x. - [wohali](https://github.com/wohali) tracked down the annoying DNS thread issue, and got will on the right path. - [woohgit](https://github.com/woohgit) added support for the v2 WorldWeatherOnline API, and fixed it when I broke it, and then fixed it again when they changed their endpoint. He also taught will how to say his version number. And `remind ___ to ___ at ___`. Awesome. And fixed lots of docs. And put the time zone with "what time is it?". And then added an entire Pagerduty workflow. And made message parsing more reliable. And wrote the ACL support. And even more doc fixes. And improvements on uptime monitoring edge cases. And kept Pagerduty working. And added `append` and `pop` list support. And ditched WorldWeatherOnline when it started to hurt. Yep. -- [wontonst](https://github.com/wontonst) made it simple to have will reply to a specific room, and made reminders more friendly. +- [wontonst](https://github.com/wontonst) made it simple to have will reply to a specific room, made reminders more friendly, and kept py2/3 compatability working on HipChat. - [woparry](https://github.com/woparry) made sure that Will could handle organizations with a massive (>2000) number of rooms. diff --git a/docs/releases.md b/docs/releases.md index 9e648635..849c0a16 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1,5 +1,13 @@ # Releases + +#### 2.1.2 - March 30, 2018 + +Bugfix release that includes: + +* Fixes python 2 compatability (`str` instead of `basestring`) for the HipChat adapter, thanks to [wontonst](https://github.com/wontonst). + + #### 2.1.1 - March 22, 2018 Bugfix release that includes: diff --git a/will/__init__.py b/will/__init__.py index 5b0431ec..b7775796 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "2.1.1" +VERSION = "2.1.2" From 15967f572d2e9d21723e817a72ac07b67b626b6b Mon Sep 17 00:00:00 2001 From: Roy Zheng Date: Mon, 2 Apr 2018 14:09:20 -0700 Subject: [PATCH 177/200] Add --backends option to generate_will_project --- docker/will/Dockerfile | 3 +- docker/will/will-py2/Dockerfile | 3 +- docker/will/will-py3/Dockerfile | 3 +- docs/index.md | 2 ++ will/scripts/generate_will_project.py | 51 +++++++++++++++++++-------- 5 files changed, 44 insertions(+), 18 deletions(-) diff --git a/docker/will/Dockerfile b/docker/will/Dockerfile index 1ade2ee1..c414ec67 100755 --- a/docker/will/Dockerfile +++ b/docker/will/Dockerfile @@ -1,6 +1,7 @@ #Pull from will-base FROM heywill/will-base:latest ARG branch=master +ARG backends="HipChat Rocket.chat Slack Shell" # Maintainer # ---------- LABEL maintainer=mlove@columnit.com @@ -8,5 +9,5 @@ LABEL maintainer=mlove@columnit.com RUN pip install git+https://github.com/skoczen/will.git@$branch WORKDIR $_WILL_HOME -RUN yes | generate_will_project +RUN generate_will_project --backends $backends CMD $_WILL_HOME/run_will.py diff --git a/docker/will/will-py2/Dockerfile b/docker/will/will-py2/Dockerfile index 1935b425..ed9bac3b 100755 --- a/docker/will/will-py2/Dockerfile +++ b/docker/will/will-py2/Dockerfile @@ -2,11 +2,12 @@ FROM heywill/will-base:2.7-alpine ARG repo=https://github.com/skoczen/will.git ARG branch=master +ARG backends="HipChat Rocket.chat Slack Shell" # Maintainer # ---------- LABEL maintainer=mlove@columnit.com RUN pip install git+$repo@$branch WORKDIR $_WILL_HOME -RUN yes | generate_will_project +RUN generate_will_project --backends $backends CMD $_WILL_HOME/run_will.py diff --git a/docker/will/will-py3/Dockerfile b/docker/will/will-py3/Dockerfile index 383c04ad..68067417 100755 --- a/docker/will/will-py3/Dockerfile +++ b/docker/will/will-py3/Dockerfile @@ -2,11 +2,12 @@ FROM heywill/will-base:3.7-alpine ARG repo=https://github.com/skoczen/will.git ARG branch=master +ARG backends="HipChat Rocket.chat Slack Shell" # Maintainer # ---------- LABEL maintainer=mlove@columnit.com RUN pip install git+https://github.com/skoczen/will.git@$branch WORKDIR $_WILL_HOME -RUN yes | generate_will_project +RUN generate_will_project --backends $backends CMD $_WILL_HOME/run_will.py diff --git a/docs/index.md b/docs/index.md index 62bb8c83..9be02bef 100644 --- a/docs/index.md +++ b/docs/index.md @@ -120,6 +120,8 @@ Eventually, you'll reach this screen of joy. Now, it's time to play! ![Screen of Joy](img/screen_of_joy.gif) +You can also use `generate_will_project` with the `--backends {Slack,HipChat,Rocket.chat,Shell}` option. + #### Testing will out Once your will is up and running, hop into any of your chat rooms (or just the terminal), and say hello! diff --git a/will/scripts/generate_will_project.py b/will/scripts/generate_will_project.py index eaa2517a..e36fd580 100644 --- a/will/scripts/generate_will_project.py +++ b/will/scripts/generate_will_project.py @@ -8,6 +8,7 @@ from clint.textui import puts from will.utils import print_head +SERVICE_BACKENDS = ('Slack', 'HipChat', 'Rocket.chat', 'Shell') PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__))) sys.path.append(PROJECT_ROOT) sys.path.append(os.getcwd()) @@ -18,6 +19,9 @@ action='store_true', help='Only output a config.py.dist.' ) +parser.add_argument('--backends', nargs='+', + choices=SERVICE_BACKENDS, + help='Choose service backends to support.') args = parser.parse_args() requirements_txt = "will\n" @@ -39,18 +43,28 @@ def ask_user(question): return response.startswith("y") -def enable_disable_service(service_name, source): +def _enable_service(service_name, source): global requirements_txt + source = source.replace("# will.backends.io_adapters.%s" % cleaned(service_name), + "will.backends.io_adapters.%s" % cleaned(service_name)) + req_path = os.path.join(os.path.join(PROJECT_ROOT, "..", "requirements"), "%s.txt" % cleaned(service_name)) + print(req_path) + if os.path.exists(req_path): + with open(req_path, 'r') as f: + requirements_txt = "%s\n# %s\n%s" % (requirements_txt, service_name, f.read()) + return source + + +def __disable_service(service_name, source): + return source.replace("will.backends.io_adapters.%s" % cleaned(service_name), + "# will.backends.io_adapters.%s" % cleaned(service_name)) + + +def enable_disable_service(service_name, source): if ask_user(" Do you want to enable %s support?" % (service_name)): - source = source.replace("# will.backends.io_adapters.%s" % cleaned(service_name), "will.backends.io_adapters.%s" % cleaned(service_name)) - req_path = os.path.join(os.path.join(PROJECT_ROOT, "..", "requirements"), "%s.txt" % cleaned(service_name)) - print(req_path) - if os.path.exists(req_path): - with open(req_path, 'r') as f: - requirements_txt = "%s\n# %s\n%s" % (requirements_txt, service_name, f.read()) + return _enable_service(service_name, source) else: - source = source.replace("will.backends.io_adapters.%s" % cleaned(service_name), "# will.backends.io_adapters.%s" % cleaned(service_name)) - return source + return __disable_service(service_name, source) def main(): @@ -159,12 +173,19 @@ def good_morning(self, message): if not os.path.exists(config_path) or ask_user("! config.py.dist exists. Overwrite it?"): with open(os.path.join(PROJECT_ROOT, "config.py.dist"), "r") as source_f: source = source_f.read() - # Ask on backends - print("\nWill supports a few different service backends. Let's set up the ones you want:\n") - source = enable_disable_service("Slack", source) - source = enable_disable_service("HipChat", source) - source = enable_disable_service("Rocket.Chat", source) - source = enable_disable_service("Shell", source) + if args.backends: + for backend in SERVICE_BACKENDS: + if backend in args.backends: + _enable_service(backend, source) + else: + __disable_service(backend, source) + else: + # Ask user thru cmd line what backends to enable + print("\nWill supports a few different service backends. Let's set up the ones you want:\n") + source = enable_disable_service("Slack", source) + source = enable_disable_service("HipChat", source) + source = enable_disable_service("Rocket.Chat", source) + source = enable_disable_service("Shell", source) with open(config_path, "w+") as f: config = source From 00ce1cc59e5218eecc381eb61017abdf226f07fb Mon Sep 17 00:00:00 2001 From: Boris Peterbarg Date: Mon, 23 Apr 2018 16:58:21 +0300 Subject: [PATCH 178/200] Correct Slack default channel setting --- will/backends/io_adapters/slack.py | 4 ++-- will/settings.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index 6c808bb0..c78852be 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -178,8 +178,8 @@ def handle_outgoing_event(self, event): elif "channel" in kwargs: event.channel = self.get_channel_from_name(kwargs["channel"]) else: - if hasattr(settings, "SLACK_DEFAULT_ROOM"): - event.channel = self.get_channel_from_name(settings.SLACK_DEFAULT_ROOM) + if hasattr(settings, "SLACK_DEFAULT_CHANNEL"): + event.channel = self.get_channel_from_name(settings.SLACK_DEFAULT_CHANNEL) else: # Set self.me self.people diff --git a/will/settings.py b/will/settings.py index 2c60c1b6..ba0a9f87 100644 --- a/will/settings.py +++ b/will/settings.py @@ -138,6 +138,7 @@ def import_settings(quiet=True): "NAME": "HIPCHAT_NAME", "HANDLE": "HIPCHAT_HANDLE", "DEFAULT_ROOM": "HIPCHAT_DEFAULT_ROOM", + "SLACK_DEFAULT_ROOM": "SLACK_DEFAULT_CHANNEL", } deprecation_warn_shown = False for k, v in DEPRECATED_BUT_MAPPED_SETTINGS.items(): From d418c86a75df7755197e4f99299f7f4e00cfa923 Mon Sep 17 00:00:00 2001 From: Umberto Nicoletti Date: Wed, 2 May 2018 13:53:04 +0200 Subject: [PATCH 179/200] scheduled reminders should notify the user who requested them --- will/plugins/productivity/remind.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/will/plugins/productivity/remind.py b/will/plugins/productivity/remind.py index 1f5b10be..206373aa 100644 --- a/will/plugins/productivity/remind.py +++ b/will/plugins/productivity/remind.py @@ -19,7 +19,7 @@ def remind_me_at(self, message, reminder_text=None, remind_time=None, to_string= "reminder_text": reminder_text, "to_string": formatted_to_string, } - self.schedule_say(formatted_reminder_text, parsed_time, message=message) + self.schedule_say(formatted_reminder_text, parsed_time, message=message, notify=True) self.say("%(reminder_text)s %(natural_datetime)s. Got it." % locals(), message=message) @respond_to("(?:can|will you )?remind (?P(?!me).*?)(?P to>) ?(?P.*?) (at|on|in) (?P.*)?\??") @@ -39,5 +39,5 @@ def remind_somebody_at(self, message, reminder_recipient=None, reminder_text=Non "to_string": formatted_to_string, } - self.schedule_say(formatted_reminder_text, parsed_time, message=message) + self.schedule_say(formatted_reminder_text, parsed_time, message=message, notify=True) self.say("%(reminder_text)s %(natural_datetime)s. Got it." % locals(), message=message) From be3aca336763af81cdeac611faa9a1f9877128d4 Mon Sep 17 00:00:00 2001 From: Ahmed Osman Date: Thu, 17 May 2018 15:44:28 +0200 Subject: [PATCH 180/200] Added support for slack attachments --- will/backends/io_adapters/slack.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index 6c808bb0..7b8be976 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -303,6 +303,11 @@ def send_message(self, event): } ]), }) + elif "attachments" in event.kwargs: + data.update({ + "text": event.content, + "attachments": json.dumps(event.kwargs["attachments"]) + }) else: data.update({ "text": event.content, From 97970a2ef115a34720f06aa5182002e3457f8f53 Mon Sep 17 00:00:00 2001 From: Ahmed Osman Date: Fri, 18 May 2018 08:36:26 +0200 Subject: [PATCH 181/200] Improve Slack Connection handling --- will/backends/io_adapters/slack.py | 9 +++++---- will/requirements/slack.txt | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index 6c808bb0..6bb0777f 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -6,7 +6,7 @@ import sys import time import traceback -import websocket +from websocket import WebSocketConnectionClosedException from markdownify import MarkdownConverter @@ -17,6 +17,7 @@ from multiprocessing import Process from will.abstractions import Event, Message, Person, Channel from slackclient import SlackClient +from slackclient._server import SlackConnectionError SLACK_SEND_URL = "https://slack.com/api/chat.postMessage" SLACK_SET_TOPIC_URL = "https://slack.com/api/channels.setTopic" @@ -447,7 +448,7 @@ def _update_backend_metadata(self): def _watch_slack_rtm(self): while True: try: - if self.client.rtm_connect(): + if self.client.rtm_connect(auto_reconnect=True): self._update_backend_metadata() num_polls_between_updates = 30 / settings.EVENT_LOOP_INTERVAL # Every 30 seconds @@ -467,8 +468,8 @@ def _watch_slack_rtm(self): current_poll_count = 0 self.sleep_for_event_loop() - except websocket.WebSocketConnectionClosedException: - logging.error('Encountered WebSocketConnectionClosedException attempting reconnect in 2 seconds') + except (WebSocketConnectionClosedException, SlackConnectionError): + logging.error('Encountered connection error attempting reconnect in 2 seconds') time.sleep(2) except (KeyboardInterrupt, SystemExit): break diff --git a/will/requirements/slack.txt b/will/requirements/slack.txt index 76feb428..e5c10e5e 100644 --- a/will/requirements/slack.txt +++ b/will/requirements/slack.txt @@ -1,4 +1,4 @@ -r base.txt -slackclient>=1.0.5<1.1.0 +slackclient>=1.2.1<1.3.0 markdownify==0.4.1 From 7b62ab3565e10659ec9409ef066e50cc20503744 Mon Sep 17 00:00:00 2001 From: Ahmed Osman Date: Mon, 28 May 2018 09:28:46 +0200 Subject: [PATCH 182/200] Fixed import path --- will/backends/io_adapters/slack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index 6bb0777f..c3d3abde 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -17,7 +17,7 @@ from multiprocessing import Process from will.abstractions import Event, Message, Person, Channel from slackclient import SlackClient -from slackclient._server import SlackConnectionError +from slackclient.server import SlackConnectionError SLACK_SEND_URL = "https://slack.com/api/chat.postMessage" SLACK_SET_TOPIC_URL = "https://slack.com/api/channels.setTopic" From dd5c46170fa05ed7499243881b5f8ce9a56edc7f Mon Sep 17 00:00:00 2001 From: Umberto Nicoletti Date: Wed, 6 Jun 2018 16:55:57 +0200 Subject: [PATCH 183/200] credit --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 8a14a8cc..0bf0380f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -51,3 +51,4 @@ acommasplice, https://github.com/acommasplice TaunoTinits, https://github.com/TaunoTinits ostracon, https://github.com/ostracon mattcl, https://github.com/mattcl +unicolet, https://github.com/unicolet From 1cb02a96e1d2de6f253572a7b2acec279c76c3a3 Mon Sep 17 00:00:00 2001 From: Ahmed Date: Wed, 6 Jun 2018 21:41:16 +0200 Subject: [PATCH 184/200] Added contribution credit --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 8a14a8cc..413ddc9c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -51,3 +51,4 @@ acommasplice, https://github.com/acommasplice TaunoTinits, https://github.com/TaunoTinits ostracon, https://github.com/ostracon mattcl, https://github.com/mattcl +Ahmed Osman, https://github.com/Ashex From 599e8ea91c11eff8993fc5bd980e40dd6f750497 Mon Sep 17 00:00:00 2001 From: Boris Peterbarg Date: Thu, 7 Jun 2018 11:25:20 +0300 Subject: [PATCH 185/200] Add self to authors --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 8a14a8cc..de7e4b95 100644 --- a/AUTHORS +++ b/AUTHORS @@ -51,3 +51,4 @@ acommasplice, https://github.com/acommasplice TaunoTinits, https://github.com/TaunoTinits ostracon, https://github.com/ostracon mattcl, https://github.com/mattcl +Boris Peterbarg, https://github.com/reist From 437f8be397b864dc83c67af8942467907ccf1c21 Mon Sep 17 00:00:00 2001 From: Boris Peterbarg Date: Thu, 7 Jun 2018 17:46:11 +0300 Subject: [PATCH 186/200] Fix fabfile with new Fabric v2 --- .travis.yml | 4 +-- fabfile.py | 90 +++++++++++++++++++++++++++-------------------------- 2 files changed, 48 insertions(+), 46 deletions(-) diff --git a/.travis.yml b/.travis.yml index a54111f1..6c5be36a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,11 +8,11 @@ install: script: - tox - export CTAG="-$TRAVIS_COMMIT" -- "fab docker_build" +- "fab docker-build" deploy: skip_cleanup: true provider: script - script: "fab docker_deploy" + script: "fab docker-deploy" on: branch: master env: diff --git a/fabfile.py b/fabfile.py index 1c6adcd8..c450710c 100644 --- a/fabfile.py +++ b/fabfile.py @@ -1,7 +1,7 @@ import os import tempfile +from invoke import task from will import VERSION -from fabric.api import * SITE_DIR = "site" WHITELIST_DIRS = [".git", ] @@ -37,38 +37,39 @@ def _splitpath(path): return path.split(os.sep) -def tag_release(): +def tag_release(ctx): # Tag the release: - local("git tag %s" % VERSION) - local("git push --tags") + ctx.run("git tag %s" % VERSION) + ctx.run("git push --tags") -def upload_release(): - local("python setup.py sdist upload") +def upload_release(ctx): + ctx.run("python setup.py sdist upload") -def release(): - deploy_docs() - upload_release() - tag_release() +@task +def release(ctx): + deploy_docs(ctx) + upload_release(ctx) + tag_release(ctx) -def deploy_docs(): +def deploy_docs(ctx): # Sanity check dir. root_dir = os.getcwd() assert all([os.path.exists(os.path.join(root_dir, f)) for f in SANITY_CHECK_PROJECT_FILES]) - local("rm -rf %s" % SITE_DIR) - local("mkdocs build") + ctx.run("rm -rf %s" % SITE_DIR) + ctx.run("mkdocs build") tempdir = tempfile.mkdtemp() - local("mv %s/* %s" % (SITE_DIR, tempdir)) + ctx.run("mv %s/* %s" % (SITE_DIR, tempdir)) - current_branch = local("git rev-parse --abbrev-ref HEAD", capture=True) - last_commit = local("git log -1 --pretty=\%B", capture=True) + current_branch = ctx.run("git rev-parse --abbrev-ref HEAD", capture=True) + last_commit = ctx.run("git log -1 --pretty=\%B", capture=True) # Add the new site to build - local("git checkout gh-pages") + ctx.run("git checkout gh-pages") # Sanity check dir. root_dir = os.getcwd() @@ -88,43 +89,44 @@ def deploy_docs(): # Handle symlinks os.remove(os.path.join(root, name)) - local("cp -rv %s/* ." % tempdir) - with settings(warn_only=True): - result = local("git diff --exit-code") + ctx.run("cp -rv %s/* ." % tempdir) + result = ctx.run("git diff --exit-code", warn_only=True) if result.return_code != 0: - local("git add -A .") - local("git commit -m 'Auto-update of docs: %s'" % last_commit) - local("git push") + ctx.run("git add -A .") + ctx.run("git commit -m 'Auto-update of docs: %s'" % last_commit) + ctx.run("git push") else: print("No changes to the docs.") - local("git checkout %s" % current_branch) + ctx.run("git checkout %s" % current_branch) -def docker_build(): +@task +def docker_build(ctx): print("Building Docker Images...") - with lcd(DOCKER_PATH): - for c in DOCKER_BUILDS: - local("docker build -t %(ctagname)s %(dir)s" % c) + with ctx.cd(DOCKER_PATH): + for b in DOCKER_BUILDS: + ctx.run("docker build -t %(ctagname)s %(dir)s" % b) -def docker_tag(): +def docker_tag(ctx): print("Building Docker Releases...") - with lcd(DOCKER_PATH): - for c in DOCKER_BUILDS: - local("docker tag %(ctagname)s %(name)s" % c) + with ctx.cd(DOCKER_PATH): + for b in DOCKER_BUILDS: + ctx.run("docker tag %(ctagname)s %(name)s" % b) -def docker_push(): +def docker_push(ctx): print("Pushing Docker to Docker Cloud...") - with lcd(DOCKER_PATH): - local("docker login -u $DOCKER_USER -p $DOCKER_PASS") - local("docker push heywill/will:python2.7") - local("docker push heywill/will:python3.7") - local("docker push heywill/will:latest") - - -def docker_deploy(): - docker_build() - docker_tag() - docker_push() + with ctx.cd(DOCKER_PATH): + ctx.run("docker login -u $DOCKER_USER -p $DOCKER_PASS") + ctx.run("docker push heywill/will:python2.7") + ctx.run("docker push heywill/will:python3.7") + ctx.run("docker push heywill/will:latest") + + +@task +def docker_deploy(ctx): + docker_build(ctx) + docker_tag(ctx) + docker_push(ctx) From 921030767e8a73daed400569e1bf7a3e83cb68ae Mon Sep 17 00:00:00 2001 From: Boris Peterbarg Date: Thu, 7 Jun 2018 14:34:20 +0300 Subject: [PATCH 187/200] Make channel logic more robust There was no check whether the given channel name, regular or default, existed. This caused the thread to fail and stall Will until it was restarted. --- will/backends/io_adapters/slack.py | 69 ++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index c78852be..6a8cc740 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -173,21 +173,29 @@ def handle_outgoing_event(self, event): else: # Came from webhook/etc # TODO: finish this. - if "room" in kwargs: - event.channel = self.get_channel_from_name(kwargs["room"]) - elif "channel" in kwargs: - event.channel = self.get_channel_from_name(kwargs["channel"]) - else: - if hasattr(settings, "SLACK_DEFAULT_CHANNEL"): - event.channel = self.get_channel_from_name(settings.SLACK_DEFAULT_CHANNEL) + target_channel = kwargs.get("room", kwargs.get("channel", None)) + if target_channel: + event.channel = self.get_channel_from_name(target_channel) + if event.channel: + self.send_message(event) else: - # Set self.me - self.people - for c in self.channels.values(): - if c.name != c.id and self.me.id in c.members: - event.channel = c - break - self.send_message(event) + logging.error( + "I was asked to post to the slack %s channel, but it doesn't exist.", + target_channel + ) + if self.default_channel: + event.channel = self.get_channel_from_name(self.default_channel) + event.content = event.content + " (for #%s)" % target_channel + self.send_message(event) + + elif self.default_channel: + event.channel = self.get_channel_from_name(self.default_channel) + self.send_message(event) + else: + logging.critical( + "I was asked to post to a slack default channel, but I'm nowhere." + "Please invite me somewhere with '/invite @%s'", self.me.handle + ) if event.type in ["topic_change", ]: self.set_topic(event) @@ -365,6 +373,12 @@ def people(self): self._update_people() return self._people + @property + def default_channel(self): + if not hasattr(self, "_default_channel") or not self._default_channel: + self._decide_default_channel() + return self._default_channel + @property def channels(self): if not hasattr(self, "_channels") or self._channels is {}: @@ -377,6 +391,33 @@ def client(self): self._client = SlackClient(settings.SLACK_API_TOKEN) return self._client + def _decide_default_channel(self): + self._default_channel = None + if not hasattr(self, "complained_about_default"): + self.complained_about_default = False + self.complained_uninvited = False + + # Set self.me + self.people + + if hasattr(settings, "SLACK_DEFAULT_CHANNEL"): + channel = self.get_channel_from_name(settings.SLACK_DEFAULT_CHANNEL) + if channel: + if self.me.id in channel.members: + self._default_channel = channel.id + return + elif not self.complained_about_default: + self.complained_about_default = True + logging.error("The defined default channel(%s) does not exist!", + settings.SLACK_DEFAULT_CHANNEL) + + for c in self.channels.values(): + if c.name != c.id and self.me.id in c.members: + self._default_channel = c.id + if not self._default_channel and not self.complained_uninvited: + self.complained_uninvited = True + logging.critical("No channels with me invited! No messages will be sent!") + def _update_channels(self): channels = {} for c in self.client.server.channels: From cfea0f5f3c1634d3f6d937b37828019177271238 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 13 Jun 2018 15:51:05 +0200 Subject: [PATCH 188/200] Adds release notes, authors, and version bump for 2.1.3. --- docs/releases.md | 17 +++++++++++++++++ will/__init__.py | 2 +- will/backends/io_adapters/slack.py | 2 +- will/requirements/base.txt | 2 ++ will/settings.py | 4 ++++ 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 849c0a16..6f38344c 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1,5 +1,22 @@ # Releases +#### 2.1.3 - June 13, 2018 + +Bugfix & feature release that includes: + +Bugfixes: +* Will is now robust against slack disconnects, and automatically handles reconnects, thanks to [https://github.com/Ashex](Ashex)! +* Will also now doesn't respond to every single message when he joins a new channel. Please send your thank-you cards to [https://github.com/Ashex](Ashex). +* Makes will more robust at handling incorrect channel names in slack, thanks to [reist](https://github.com/reist). +* Properly renames `SLACK_DEFAULT_ROOM` to `SLACK_DEFAULT_CHANNEL` (with backwards-compatability) thanks (again!) to [reist](https://github.com/reist). + + +New features: +* Adds support for slack attachments, thanks to [https://github.com/Ashex](Ashex) +* Adds support for fabric v2, thanks to [reist](https://github.com/reist). +* Reminders now notify the person making the reminder, thanks to [unicolet](https://github.com/unicolet). +* `generate_will_project` now supports a `--backends` flag, thanks to [wontonst](https://github.com/wontonst). +* Will now explicitly notes if he's automagically using `REDIS_URL` to find the redis backend. #### 2.1.2 - March 30, 2018 diff --git a/will/__init__.py b/will/__init__.py index b7775796..4260069c 100644 --- a/will/__init__.py +++ b/will/__init__.py @@ -1 +1 @@ -VERSION = "2.1.2" +VERSION = "2.1.3" diff --git a/will/backends/io_adapters/slack.py b/will/backends/io_adapters/slack.py index 562773c5..3dc40060 100644 --- a/will/backends/io_adapters/slack.py +++ b/will/backends/io_adapters/slack.py @@ -96,7 +96,7 @@ def normalize_incoming_event(self, event): # If the parent thread is a 1-1 between Will and I, also treat that as direct. # Since members[] still comes in on the thread event, we can trust this, even if we're # in a thread. - if len(channel.members.keys()) == 0: + if channel.id == channel.name: is_private_chat = True # <@U5GUL9D9N> hi diff --git a/will/requirements/base.txt b/will/requirements/base.txt index 7efe69b0..04a51091 100644 --- a/will/requirements/base.txt +++ b/will/requirements/base.txt @@ -24,3 +24,5 @@ regex==2017.9.23 redis==2.10.6 requests==2.18.4 six==1.10.0 +urllib3[secure] +websocket-client==0.44.0 \ No newline at end of file diff --git a/will/settings.py b/will/settings.py index ba0a9f87..9499b8a9 100644 --- a/will/settings.py +++ b/will/settings.py @@ -296,6 +296,10 @@ def import_settings(quiet=True): if settings["STORAGE_BACKEND"] == "redis" or settings["PUBSUB_BACKEND"] == "redis": if "REDIS_URL" not in settings: # For heroku + if "REDIS_URL" in os.environ: + settings["REDIS_URL"] = os.environ["REDIS_URL"] + if not quiet: + note("WILL_REDIS_URL not set, but it appears you're using Heroku Redis or another standard REDIS_URL. If so, all good.") if "REDISCLOUD_URL" in os.environ: settings["REDIS_URL"] = os.environ["REDISCLOUD_URL"] if not quiet: From dac4b6035bb624829ceadc2943a33cf4c2850419 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 13 Jun 2018 16:17:55 +0200 Subject: [PATCH 189/200] Adds libffi-dev --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 6c5be36a..a8a0e918 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ sudo: false services: - docker install: +- apt-get install -y libffi-dev - pip install -U tox - pip install -r will/requirements/dev.txt script: From c56df36a98fb2422e191e6a1da0d14d60c77cb96 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 13 Jun 2018 16:22:06 +0200 Subject: [PATCH 190/200] Moves to `before_install` --- .gitignore | 3 ++- .travis.yml | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 57604919..dfdda9dd 100644 --- a/.gitignore +++ b/.gitignore @@ -52,4 +52,5 @@ redis-stable/ redis-stable.tar.gz # Profiling files -will_profiles/* \ No newline at end of file +will_profiles/* +.python-version diff --git a/.travis.yml b/.travis.yml index a8a0e918..ba141a2b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,10 @@ language: python sudo: false services: - docker +before_install: + - sudo apt-get update + - sudo apt-get install -y libffi-dev libxml2-dev install: -- apt-get install -y libffi-dev - pip install -U tox - pip install -r will/requirements/dev.txt script: From 16036e0bf41f8be7f7cbd5fad534cbb36e146a7e Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 13 Jun 2018 16:28:56 +0200 Subject: [PATCH 191/200] Adds libffi-dev to dockerfiles. --- docker/will/Dockerfile | 1 + docker/will/will-py2/Dockerfile | 1 + docker/will/will-py3/Dockerfile | 1 + 3 files changed, 3 insertions(+) diff --git a/docker/will/Dockerfile b/docker/will/Dockerfile index c414ec67..c283728e 100755 --- a/docker/will/Dockerfile +++ b/docker/will/Dockerfile @@ -6,6 +6,7 @@ ARG backends="HipChat Rocket.chat Slack Shell" # ---------- LABEL maintainer=mlove@columnit.com +RUN apt-get install -y libffi-dev RUN pip install git+https://github.com/skoczen/will.git@$branch WORKDIR $_WILL_HOME diff --git a/docker/will/will-py2/Dockerfile b/docker/will/will-py2/Dockerfile index ed9bac3b..c3355f1c 100755 --- a/docker/will/will-py2/Dockerfile +++ b/docker/will/will-py2/Dockerfile @@ -7,6 +7,7 @@ ARG backends="HipChat Rocket.chat Slack Shell" # ---------- LABEL maintainer=mlove@columnit.com +RUN apt-get install -y libffi-dev RUN pip install git+$repo@$branch WORKDIR $_WILL_HOME RUN generate_will_project --backends $backends diff --git a/docker/will/will-py3/Dockerfile b/docker/will/will-py3/Dockerfile index 68067417..1ace42f9 100755 --- a/docker/will/will-py3/Dockerfile +++ b/docker/will/will-py3/Dockerfile @@ -7,6 +7,7 @@ ARG backends="HipChat Rocket.chat Slack Shell" # ---------- LABEL maintainer=mlove@columnit.com +RUN apt-get install -y libffi-dev RUN pip install git+https://github.com/skoczen/will.git@$branch WORKDIR $_WILL_HOME RUN generate_will_project --backends $backends From 4b4c3649c71c2f122044a1fef78ca740d67b57e1 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 13 Jun 2018 16:58:38 +0200 Subject: [PATCH 192/200] Pulls docker builds for now. --- .gitignore | 2 ++ .travis.yml | 2 +- docker/will/Dockerfile | 9 ++++++++- docker/will/will-py2/Dockerfile | 9 ++++++++- docker/will/will-py3/Dockerfile | 9 ++++++++- 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index dfdda9dd..7d59b406 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,5 @@ redis-stable.tar.gz # Profiling files will_profiles/* .python-version + +docker/.docker/.buildNodeID diff --git a/.travis.yml b/.travis.yml index ba141a2b..adc483c2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ install: script: - tox - export CTAG="-$TRAVIS_COMMIT" -- "fab docker-build" +# - "fab docker-build" deploy: skip_cleanup: true provider: script diff --git a/docker/will/Dockerfile b/docker/will/Dockerfile index c283728e..ba6a411f 100755 --- a/docker/will/Dockerfile +++ b/docker/will/Dockerfile @@ -2,11 +2,18 @@ FROM heywill/will-base:latest ARG branch=master ARG backends="HipChat Rocket.chat Slack Shell" +ENV PACKAGES="\ + dumb-init \ + bash \ + ca-certificates \ + python2 \ + py-setuptools \ + libffi-dev \ +" # Maintainer # ---------- LABEL maintainer=mlove@columnit.com -RUN apt-get install -y libffi-dev RUN pip install git+https://github.com/skoczen/will.git@$branch WORKDIR $_WILL_HOME diff --git a/docker/will/will-py2/Dockerfile b/docker/will/will-py2/Dockerfile index c3355f1c..f101507a 100755 --- a/docker/will/will-py2/Dockerfile +++ b/docker/will/will-py2/Dockerfile @@ -3,11 +3,18 @@ FROM heywill/will-base:2.7-alpine ARG repo=https://github.com/skoczen/will.git ARG branch=master ARG backends="HipChat Rocket.chat Slack Shell" +ENV PACKAGES="\ + dumb-init \ + bash \ + ca-certificates \ + python2 \ + py-setuptools \ + libffi-dev \ +" # Maintainer # ---------- LABEL maintainer=mlove@columnit.com -RUN apt-get install -y libffi-dev RUN pip install git+$repo@$branch WORKDIR $_WILL_HOME RUN generate_will_project --backends $backends diff --git a/docker/will/will-py3/Dockerfile b/docker/will/will-py3/Dockerfile index 1ace42f9..fc039f90 100755 --- a/docker/will/will-py3/Dockerfile +++ b/docker/will/will-py3/Dockerfile @@ -3,11 +3,18 @@ FROM heywill/will-base:3.7-alpine ARG repo=https://github.com/skoczen/will.git ARG branch=master ARG backends="HipChat Rocket.chat Slack Shell" +ENV PACKAGES="\ + dumb-init \ + bash \ + ca-certificates \ + python2 \ + py-setuptools \ + libffi-dev \ +" # Maintainer # ---------- LABEL maintainer=mlove@columnit.com -RUN apt-get install -y libffi-dev RUN pip install git+https://github.com/skoczen/will.git@$branch WORKDIR $_WILL_HOME RUN generate_will_project --backends $backends From 15c8a322da883f986265cc46191b4e097115b2c0 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 13 Jun 2018 17:07:02 +0200 Subject: [PATCH 193/200] Just pulls deploy block from docker for simplicity. --- .travis.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index adc483c2..464fce8b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,12 +12,12 @@ script: - tox - export CTAG="-$TRAVIS_COMMIT" # - "fab docker-build" -deploy: - skip_cleanup: true - provider: script - script: "fab docker-deploy" - on: - branch: master +# deploy: +# skip_cleanup: true +# provider: script +# script: "fab docker-deploy" +# on: +# branch: master env: matrix: secure: SWBr2Ih6+vT0iX5CxqPT8ICmtFUcIk7MRfh21DnsGKpumz60mgRPnb+aMxagSDWrF0btGyI3vfD8nYEv6Vv+WDDCbeJCG3xExsIusiflaM1Vqo1OcUGlO55jQm1WtNub7SmiMSH8EY5GFFNfFn7CmSmU1xaM0p5q8Y0OTbZpku8= From 920a1d18c4c42d5b5af22af421cfcdc91886e4a6 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 13 Jun 2018 17:17:11 +0200 Subject: [PATCH 194/200] Fixes comma string bug. --- docs/releases.md | 1 + will/scripts/generate_will_project.py | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 6f38344c..64e24f86 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -9,6 +9,7 @@ Bugfixes: * Will also now doesn't respond to every single message when he joins a new channel. Please send your thank-you cards to [https://github.com/Ashex](Ashex). * Makes will more robust at handling incorrect channel names in slack, thanks to [reist](https://github.com/reist). * Properly renames `SLACK_DEFAULT_ROOM` to `SLACK_DEFAULT_CHANNEL` (with backwards-compatability) thanks (again!) to [reist](https://github.com/reist). +* Enable/disable backends from `generate_will_project` now properly puts the comment outside the strong. Thanks to [phiro69](https://github.com/phiro69) for the report. New features: diff --git a/will/scripts/generate_will_project.py b/will/scripts/generate_will_project.py index e36fd580..607570f2 100644 --- a/will/scripts/generate_will_project.py +++ b/will/scripts/generate_will_project.py @@ -45,8 +45,8 @@ def ask_user(question): def _enable_service(service_name, source): global requirements_txt - source = source.replace("# will.backends.io_adapters.%s" % cleaned(service_name), - "will.backends.io_adapters.%s" % cleaned(service_name)) + source = source.replace('# "will.backends.io_adapters.%s"' % cleaned(service_name), + '"will.backends.io_adapters.%s"' % cleaned(service_name)) req_path = os.path.join(os.path.join(PROJECT_ROOT, "..", "requirements"), "%s.txt" % cleaned(service_name)) print(req_path) if os.path.exists(req_path): @@ -56,8 +56,8 @@ def _enable_service(service_name, source): def __disable_service(service_name, source): - return source.replace("will.backends.io_adapters.%s" % cleaned(service_name), - "# will.backends.io_adapters.%s" % cleaned(service_name)) + return source.replace('"will.backends.io_adapters.%s"' % cleaned(service_name), + '"# will.backends.io_adapters.%s"' % cleaned(service_name)) def enable_disable_service(service_name, source): From 9daf781385d5052e5b68d352ee64cfce52a7527d Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 13 Jun 2018 17:25:25 +0200 Subject: [PATCH 195/200] Moves back to fabric 1 :( --- .travis.yml | 4 +- fabfile.py | 78 +++++++++++++++++++-------------------- will/requirements/dev.txt | 2 +- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/.travis.yml b/.travis.yml index 464fce8b..d1f7eb3e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,11 +11,11 @@ install: script: - tox - export CTAG="-$TRAVIS_COMMIT" -# - "fab docker-build" +# - "fab docker_build" # deploy: # skip_cleanup: true # provider: script -# script: "fab docker-deploy" +# script: "fab docker_deploy" # on: # branch: master env: diff --git a/fabfile.py b/fabfile.py index c450710c..f22a2819 100644 --- a/fabfile.py +++ b/fabfile.py @@ -1,6 +1,6 @@ import os import tempfile -from invoke import task +from fabric.api import * from will import VERSION SITE_DIR = "site" @@ -37,39 +37,39 @@ def _splitpath(path): return path.split(os.sep) -def tag_release(ctx): +def tag_release(): # Tag the release: - ctx.run("git tag %s" % VERSION) - ctx.run("git push --tags") + local("git tag %s" % VERSION) + local("git push --tags") -def upload_release(ctx): - ctx.run("python setup.py sdist upload") +def upload_release(): + local("python setup.py sdist upload") @task -def release(ctx): - deploy_docs(ctx) - upload_release(ctx) - tag_release(ctx) +def release(): + deploy_docs() + upload_release() + tag_release() -def deploy_docs(ctx): +def deploy_docs(): # Sanity check dir. root_dir = os.getcwd() assert all([os.path.exists(os.path.join(root_dir, f)) for f in SANITY_CHECK_PROJECT_FILES]) - ctx.run("rm -rf %s" % SITE_DIR) - ctx.run("mkdocs build") + local("rm -rf %s" % SITE_DIR) + local("mkdocs build") tempdir = tempfile.mkdtemp() - ctx.run("mv %s/* %s" % (SITE_DIR, tempdir)) + local("mv %s/* %s" % (SITE_DIR, tempdir)) - current_branch = ctx.run("git rev-parse --abbrev-ref HEAD", capture=True) - last_commit = ctx.run("git log -1 --pretty=\%B", capture=True) + current_branch = local("git rev-parse --abbrev-ref HEAD", capture=True) + last_commit = local("git log -1 --pretty=\%B", capture=True) # Add the new site to build - ctx.run("git checkout gh-pages") + local("git checkout gh-pages") # Sanity check dir. root_dir = os.getcwd() @@ -89,44 +89,44 @@ def deploy_docs(ctx): # Handle symlinks os.remove(os.path.join(root, name)) - ctx.run("cp -rv %s/* ." % tempdir) - result = ctx.run("git diff --exit-code", warn_only=True) + local("cp -rv %s/* ." % tempdir) + result = local("git diff --exit-code", warn_only=True) if result.return_code != 0: - ctx.run("git add -A .") - ctx.run("git commit -m 'Auto-update of docs: %s'" % last_commit) - ctx.run("git push") + local("git add -A .") + local("git commit -m 'Auto-update of docs: %s'" % last_commit) + local("git push") else: print("No changes to the docs.") - ctx.run("git checkout %s" % current_branch) + local("git checkout %s" % current_branch) @task -def docker_build(ctx): +def docker_build(): print("Building Docker Images...") - with ctx.cd(DOCKER_PATH): + with .cd(DOCKER_PATH): for b in DOCKER_BUILDS: - ctx.run("docker build -t %(ctagname)s %(dir)s" % b) + local("docker build -t %(ctagname)s %(dir)s" % b) -def docker_tag(ctx): +def docker_tag(): print("Building Docker Releases...") - with ctx.cd(DOCKER_PATH): + with .cd(DOCKER_PATH): for b in DOCKER_BUILDS: - ctx.run("docker tag %(ctagname)s %(name)s" % b) + local("docker tag %(ctagname)s %(name)s" % b) -def docker_push(ctx): +def docker_push(): print("Pushing Docker to Docker Cloud...") - with ctx.cd(DOCKER_PATH): - ctx.run("docker login -u $DOCKER_USER -p $DOCKER_PASS") - ctx.run("docker push heywill/will:python2.7") - ctx.run("docker push heywill/will:python3.7") - ctx.run("docker push heywill/will:latest") + with .cd(DOCKER_PATH): + local("docker login -u $DOCKER_USER -p $DOCKER_PASS") + local("docker push heywill/will:python2.7") + local("docker push heywill/will:python3.7") + local("docker push heywill/will:latest") @task -def docker_deploy(ctx): - docker_build(ctx) - docker_tag(ctx) - docker_push(ctx) +def docker_deploy(): + docker_build() + docker_tag() + docker_push() diff --git a/will/requirements/dev.txt b/will/requirements/dev.txt index ab355d4b..ac087c3d 100644 --- a/will/requirements/dev.txt +++ b/will/requirements/dev.txt @@ -3,7 +3,7 @@ # Dev only pyandoc mkdocs>=0.14 -fabric +fabric<2 flake8 mock nose From a35c2a883bf42a40b7260510f54dd009b51b0809 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 13 Jun 2018 17:25:47 +0200 Subject: [PATCH 196/200] Pulls fabric 2 from release (for now). --- docs/releases.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/releases.md b/docs/releases.md index 64e24f86..73ccc89d 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -14,7 +14,6 @@ Bugfixes: New features: * Adds support for slack attachments, thanks to [https://github.com/Ashex](Ashex) -* Adds support for fabric v2, thanks to [reist](https://github.com/reist). * Reminders now notify the person making the reminder, thanks to [unicolet](https://github.com/unicolet). * `generate_will_project` now supports a `--backends` flag, thanks to [wontonst](https://github.com/wontonst). * Will now explicitly notes if he's automagically using `REDIS_URL` to find the redis backend. From aa85060a30b74849f84048c37102e4aa96b4fd81 Mon Sep 17 00:00:00 2001 From: Steven Skoczen Date: Wed, 13 Jun 2018 17:31:37 +0200 Subject: [PATCH 197/200] Fixes lcd syntax. --- fabfile.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fabfile.py b/fabfile.py index f22a2819..fa0aa43b 100644 --- a/fabfile.py +++ b/fabfile.py @@ -104,21 +104,21 @@ def deploy_docs(): @task def docker_build(): print("Building Docker Images...") - with .cd(DOCKER_PATH): + with lcd(DOCKER_PATH): for b in DOCKER_BUILDS: local("docker build -t %(ctagname)s %(dir)s" % b) def docker_tag(): print("Building Docker Releases...") - with .cd(DOCKER_PATH): + with lcd(DOCKER_PATH): for b in DOCKER_BUILDS: local("docker tag %(ctagname)s %(name)s" % b) def docker_push(): print("Pushing Docker to Docker Cloud...") - with .cd(DOCKER_PATH): + with lcd(DOCKER_PATH): local("docker login -u $DOCKER_USER -p $DOCKER_PASS") local("docker push heywill/will:python2.7") local("docker push heywill/will:python3.7") From d30c130265e19c173719979d1745da5bbc8a96a2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 22 Jun 2018 16:44:37 -0700 Subject: [PATCH 198/200] Fix slackclient requirement There must be a comma between version clauses per PEP-440 https://www.python.org/dev/peps/pep-0440/#version-specifiers --- will/requirements/slack.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/will/requirements/slack.txt b/will/requirements/slack.txt index e5c10e5e..8b95fd83 100644 --- a/will/requirements/slack.txt +++ b/will/requirements/slack.txt @@ -1,4 +1,4 @@ -r base.txt -slackclient>=1.2.1<1.3.0 +slackclient>=1.2.1,<1.3.0 markdownify==0.4.1 From dd9747190d91509b6a434d3e24a7cb277d91a646 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 22 Jun 2018 17:27:33 -0700 Subject: [PATCH 199/200] Update requests version requirement --- will/requirements/base.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/will/requirements/base.txt b/will/requirements/base.txt index 04a51091..ddf82023 100644 --- a/will/requirements/base.txt +++ b/will/requirements/base.txt @@ -22,7 +22,7 @@ pytz==2017.2 PyYAML==3.10 regex==2017.9.23 redis==2.10.6 -requests==2.18.4 +requests>=2.19.1,<3 six==1.10.0 urllib3[secure] -websocket-client==0.44.0 \ No newline at end of file +websocket-client==0.44.0 From c2ba426d72dd3aa6966c980a49057f2517952d86 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 22 Jun 2018 18:06:23 -0700 Subject: [PATCH 200/200] Update pyasn1 version requirement Note that pyasn1>0.4.0 is not compatible with sleekxmpp. See: https://github.com/etingof/pyasn1/issues/112 --- will/requirements/base.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/will/requirements/base.txt b/will/requirements/base.txt index ddf82023..74571b7d 100644 --- a/will/requirements/base.txt +++ b/will/requirements/base.txt @@ -14,8 +14,8 @@ MarkupSafe==0.23 will-natural==0.2.1.1 parsedatetime==1.1.2 python-Levenshtein==0.12.0 -pyasn1-modules==0.0.5 -pyasn1==0.1.7 +pyasn1-modules>=0.0.5,<=0.1.5 +pyasn1>=0.1.8,<=0.3.7 pycrypto==2.6.1 pygerduty==0.28 pytz==2017.2

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