WhereIsRudi is an interactive Slack app to inform your colleagues whether your dog@work is in the office today! π
Use the Slash Command \whereisrudi in any channel, direct message or any other slack conversation. That's it!
You will get a message every (working day) morning to ask you whether you bring your dog to the office today. Just answer with one tap or click via the actions in the message. It's that easy!
Local linting may be done using the Makefile:
make install
make lintFor easier deployment, the infrastructure as code (IaC) software tool Terraform is used.
- Install Terraform: https://learn.hashicorp.com/terraform/getting-started/install.html
- Define a Google Cloud Platform (GCP) project id, i.e.
whereisrudi-<random_number>and enter it in: - Run preparation script:
- Run
prepare_gcp.sh:bash prepare_gcp.sh. You may run this in the Google Cloud Shell editor. This will:- Create a Google Cloud Platform project.
- Create Service Account and bind the roles
roles/owner,roles/iam.serviceAccountUser,roles/storage.admin,roles/appengine.appAdmin,roles/cloudscheduler.admin,roles/pubsub.editorandroles/cloudfunctions.developer. - Create new private key for the Service Account and save in the file
account.json. - Enable the Google Cloud Platform APIs
appengine,cloudfunctions,cloudscheduleranddatastore. - You will be asked to enable billing for the created project when running the script.
- Copy the file
account.jsoninto thedeploymentfolder.
- Run
- Commands need to be run in
deploymentfolder:cd /deployment - Initialize the Terraform working directory:
terraform init - Generate and show the Terraform execution plan:
terraform plan - Build the infrastructure:
terraform applyand confirm withyes. This step will output the endpoint URLsslack_actions_function_urlandslack_slash_commands_function_urlthat you need to enter in the Slack API console.
To destroy/delete the infrastructure: terraform destroy and confirm with yes
The following Google Cloud Platform resources are created via Terraform:
Three cloud functions with environment variables:
gather-information(triggered by Google Pub/Sub topicgather-information-schedule)SLACK_API_TOKEN: Slack App OAuth Access Token (starting withxoxp-)USER_ID: Slack user id of dog owner.
slack-actions(triggered by HTTP)SLACK_API_VERIFICATION_TOKEN: Slack App Verification Token
slack-slash-commands(triggered by HTTP)SLACK_API_VERIFICATION_TOKEN: Slack App Verification Token
Google Pub/Sub topic gather-information-schedule should be triggered every working day (monday - friday) at 7:30 AM.
Therefore the frequency is set to 30 7 * * 1-5.
The cloud functions create a entities of kind days. The entity id is the day string (i.e. 2019-09-14). The entities only have one boolean field in_office, which is not indexed.
Create a new Slack app in the Slack API console: https://api.slack.com/apps.
Create a Bot User, i.e. WhereIsRudi.
In OAuth & Permissions in Scopes, add permission scope chat:write:bot and incoming-webhook to Conversations and bot and commands to Interactivity.
Add Interactivity request URL pointing to your Google Cloud Function slack-actions. You got this URL as output from the terraform apply step before, named slack_actions_function_url.
Create new Slash command /whereisrudi with request URL pointing to your Google Cloud Function slack-slash-commands. You got this URL as output from the terraform apply step before, named slack_slash_commands_function_url.
See /design.











