deploy-lambda:
rm -rf .deploy-lambda-source
git clone . .deploy-lambda-source
- rm -rf .deploy-lambda-source/.git
(cd .deploy-lambda-source/turbot_lambda; zip ../turbot.zip lambda_function.py)
+ (cd .deploy-lambda-source; zip turbot.zip $$(git ls-files -- turbot))
(cd .deploy-lambda-source; \
aws lambda update-function-code \
--profile halibut \
-from flask import Blueprint, request, make_response
-from turbot.slack import slack_is_valid_request, slack_send_reply
import re
-rot_route = Blueprint('rot_route', __name__)
-
def rot_string(str, n=13):
"""Return a rotated version of a string
result += letter
return result
-@rot_route.route('/rot', methods = ['POST'])
-def rot():
- """Implements the /rot route for the /rot slash command in Slack
-
- This implements the /rot command of our Slack bot. The format of this
- command is as follows:
+def rot(args):
+ """Return one or more rotated versions of a sring
- /rot [count|*] String to be rotated
+ The arg string should be as follows:
- The optional count indicates an amount to rotate each character in the
- string. If the count is '*' or is not present, then the string will
- be rotated through all possible 25 values.
+ [count|*] String to be rotated
- The result of the rotation is provided as a message in Slack. If the
- slash command was issued in a direct message, the response is made by
- using the "response_url" from the request. This allows the bot to reply
- in a direct message that it is not a member of. Otherwise, if the slash
- command was issued in a channel, the bot will reply in that channel."""
+ That is, the first word of the string is an optional number (or
+ the character '*'). If this is a number it indicates an amount to
+ rotate each character in the string. If the count is '*' or is not
+ present, then the string will be rotated through all possible 25
+ values.
- if not slack_is_valid_request(request):
- return make_response("invalid request", 403)
+ The result of the rotation is returned as a string (with Slack
+ formatting)."""
- query = request.form.get('text')
- match = re.match(r'^([0-9]+|\*) (.*)$', query)
+ match = re.match(r'^([0-9]+|\*) (.*)$', args)
if (match):
try:
count = int(match.group(1))
text = match.group(2)
else:
count = None
- text = query
+ text = args
text = text.upper()
reply += "```"
- slack_send_reply(request, reply)
-
- return ""
+ return reply
#!/usr/bin/env python3
-from flask import Flask
+from flask import Flask, request
from slackeventsapi import SlackEventAdapter
+from turbot.slack import slack_is_valid_request, slack_send_reply
import os
import threading
-from turbot.rot import rot_route
+from turbot.rot import rot
from turbot.slack import slack_send_message
from turbot.sheets import sheets_create
app = Flask(__name__)
-app.register_blueprint(rot_route)
slack_signing_secret = os.environ['SLACK_SIGNING_SECRET']
slack_events = SlackEventAdapter(slack_signing_secret, "/slack/events", app)
+@app.route('/rot', methods = ['POST'])
+def rot_route():
+ """Implements the /rot slash command for Slack replying in Slack
+
+ The format of this command is as follows:
+
+ /rot [count|*] String to be rotated
+
+ The optional count indicates an amount to rotate each character in the
+ string. If the count is '*' or is not present, then the string will
+ be rotated through all possible 25 values.
+
+ The result of the rotation is provided as a message in Slack. If the
+ slash command was issued in a direct message, the response is made by
+ using the "response_url" from the request. This allows the bot to reply
+ in a direct message that it is not a member of. Otherwise, if the slash
+ command was issued in a channel, the bot will reply in that channel."""
+
+ if not slack_is_valid_request(request):
+ return make_response("invalid request", 403)
+
+ text = request.form.get('text')
+
+ reply = rot(text)
+
+ slack_send_reply(request, reply)
+
+ return ""
+
+
@slack_events.on("channel_created")
def handle_channel_created(event_data):
def later(channel):
-import re
-
-def rot_string(str, n=13):
- """Return a rotated version of a string
-
- Specifically, this functions returns a version of the input string
- where each uppercase letter has been advanced 'n' positions in the
- alphabet (wrapping around). Lowercase letters and any non-alphabetic
- characters will be unchanged."""
-
- result = ''
- for letter in str:
- if letter.isupper():
- result += chr(ord("A") + (ord(letter) - ord("A") + n) % 26)
- else:
- result += letter
- return result
-
-def rot(args):
- """Implements logic for /rot slash command in Slack, returning a string
-
- This implements the /rot command of our Slack bot. The format of this
- command is as follows:
-
- /rot [count|*] String to be rotated
-
- The optional count indicates an amount to rotate each character in the
- string. If the count is '*' or is not present, then the string will
- be rotated through all possible 25 values.
-
- The result of the rotation is returned as a string (with Slack
- formatting)."""
-
- match = re.match(r'^([0-9]+|\*) (.*)$', args)
- if (match):
- try:
- count = int(match.group(1))
- except ValueError:
- count = None
- text = match.group(2)
- else:
- count = None
- text = args
-
- text = text.upper()
-
- reply = "```/rot {} {}\n".format(count if count else '*', text)
-
- if count:
- reply += rot_string(text, count)
- else:
- reply += "\n".join(["{:02d} ".format(count) + rot_string(text, count)
- for count in range(1, 26)])
-
- reply += "```"
-
- return reply
+from turbot.rot import rot
def lambda_handler(event, context):
"""Top-level entry point for our lambda function.