turbot.wsgi
.slack-creds.env
+.gsheets-creds.json
+.gsheets-token.pickle
__pycache__
DEPLOY_DIR=/srv/halibut.cworth.org/turbot
export DEPLOY_DIR
DO_NOT_DEPLOY=env .gitignore
-DO_NOT_DELETE=.slack-creds.env
+DO_NOT_DELETE=.slack-creds.env .gsheets-creds.json .gsheets-token.pickle
help:
@echo "Available targets (in rough order of expected use):"
--- /dev/null
+#!/usr/bin/env python3
+
+import pickle
+import os.path
+from google_auth_oauthlib.flow import InstalledAppFlow
+from google.auth.transport.requests import Request
+
+# If modifying these scopes, delete the file token.pickle.
+SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
+
+TOKEN_FILE = ".gsheets-token.pickle"
+
+def main():
+ """Allows user to authenticate for the Sheets API.
+
+ Resulting authorization token is stored in token.pickle.
+ """
+ creds = None
+ # The file token.pickle stores the user's access and refresh tokens, and is
+ # created automatically when the authorization flow completes for the first
+ # time.
+ if os.path.exists(TOKEN_FILE):
+ with open(TOKEN_FILE, 'rb') as token:
+ creds = pickle.load(token)
+
+ # If there are no (valid) credentials available, let the user log in.
+ if not creds or not creds.valid:
+ if creds and creds.expired and creds.refresh_token:
+ creds.refresh(Request())
+ else:
+ flow = InstalledAppFlow.from_client_secrets_file(
+ 'credentials.json', SCOPES)
+ creds = flow.run_local_server(port=0)
+ # Save the credentials for the next run
+ with open(TOKEN_FILE, 'wb') as token:
+ pickle.dump(creds, token)
+
+ print("Token now saved in {}".format(TOKEN_FILE))
+
+if __name__ == '__main__':
+ main()
import sys
+import os
sys.path.insert(0, '${DEPLOY_DIR}')
from dotenv import load_dotenv
load_dotenv('${DEPLOY_DIR}/.slack-creds.env')
+os.environ['TURBOT_DEPLOY_DIR']='${DEPLOY_DIR}'
+
from turbot.turbot import app as application
--- /dev/null
+from flask import current_app
+import pickle
+import os.path
+import os
+
+from googleapiclient.discovery import build
+
+# If modifying these scopes, delete the file token.pickle.
+SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
+
+turbot_deploy_dir = os.environ.get('TURBOT_DEPLOY_DIR', '.')
+TOKEN_FILE = "{}/.gsheets-token.pickle".format(turbot_deploy_dir)
+
+creds = None
+
+def sheets_create(name):
+ """Create a new sheet with the given name.
+
+ Returns the URL for the spreadsheet.
+ """
+ global creds
+
+ # The file token.pickle stores token from last login/refresh
+ if not creds:
+ if os.path.exists(TOKEN_FILE):
+ with open(TOKEN_FILE, 'rb') as token:
+ creds = pickle.load(token)
+
+ # If there are no (valid) credentials available, give up
+ if not creds or not creds.valid:
+ current_app.logger.error("No token found in {}".format(TOKEN_FILE))
+ current_app.logger.error("Try running ./gsheets-authenticate.py")
+ return None
+
+ service = build('sheets', 'v4', credentials=creds)
+
+ # Create a new sheet
+ spreadsheet_body = {}
+
+ request = service.spreadsheets().create(body=spreadsheet_body)
+ response = request.execute()
+
+ return response["spreadsheetUrl"]
import os
from turbot.rot import rot_route
from turbot.slack import slack_send_message
+from turbot.sheets import sheets_create
app = Flask(__name__)
app.register_blueprint(rot_route)
def handle_channel_created(event_data):
event = event_data["event"]
channel = event["channel"]
+ sheet_url = sheets_create(channel["name"])
slack_send_message(channel["id"],
- "Cool. You made a channel named {}"
- .format(channel["name"]))
+ "Auto-created a sheet for this channel: {}"
+ .format(sheet_url))
@slack_events.on("error")
def handle_error(error):