- Simple Lightweight API Bot (SLAPI)
- Adapter Settings
- Bot ConfigFile
- Admin Settings
- Help Settings - Running the server - Local - Running w/ Docker - CLI w/ Mounted Sock Port - Docker Compose w/ DinD
- Slack Team & Ability to Add Custom Integrations
- Docker 1.10 or later - See Docker section for more info
- Ruby 2.3 or later - See Ruby section for options
- Bundler - See Bundler Section
SLAPI is our concept of a Slack bot. It's blind to languages. While it may be written in Ruby and using Sinatra for it's API interface, it does not care what you use for your plugins.
If you can stick it in a Docker Container or Slap an API on it, you can make it a plugin. (We refer to them as SLAPINs)
SLAPI is in the early stages, we just released the MVP. There is no pre-existing plugins, yet (give us time!). Just examples and test plugins for references.
Check out the getting started below and feel free to open an issue for anything, even if you just want us to explain a little more about something.
Head over to Here for a walk through of the basics getting started
IMPORTANT: Make sure you have looked at Prerequisites first
There are rake tasks created to make this quick to get started.
Running either will create a bot.local.yml file with the exported key and give the most basic configuration.
git clone https://github.com/ImperialLabs/slapi.git
cd slapi
export SLACK_TOKEN=xoxb-XXXXXXXXXXXX-TTTTTTTTTTTTTT
bundle install --binstubs --path vendor/bundle
bundle exec rake localIMPORTANT: Make sure you have looked at Prerequisites first
git clone https://github.com/ImperialLabs/slapi.git
cd slapi
export SLACK_TOKEN=xoxb-XXXXXXXXXXXX-TTTTTTTTTTTTTT
rake dockerHere's a quick script plugin to get you out the door, kick the tires and give it a go!
just place this in the ./config/plugins/ folder as whatever name you wish to use for it in the bot (e.g. hello.yml)
plugin:
type: script
language: bash
listen_type: passive
help:
world: "Says Hello World!"
description: "simple hello world"
write: |
#!/bin/bash
if [ "${1}" == 'world' ]; then
echo 'Hello World!'
else
echo 'No World for You!'
fiDocker must be installed for the bot to work.
- Windows Install - https://docs.docker.com/docker-for-windows/install/
- OSX Install - https://docs.docker.com/docker-for-mac/install/
- Linux Install - https://docs.docker.com/engine/installation/#time-based-release-schedule (See Docker for Linux on left Side)
- Important: If running in Linux, ensure user running SLAPI can run docker, check by running
docker ps - To enable a user to run docker without sudo go here https://docs.docker.com/engine/installation/linux/linux-postinstall/#manage-docker-as-a-non-root-user
- Important: If running in Linux, ensure user running SLAPI can run docker, check by running
Run the following
gem install bundler
bundle installThe project is set up with extra helpers for VS Code. If you chose to use this then you should be able to run:
gem install bundler
bundle install --binstubs --path vendor/bundleYou will need a bot configuration from Slack. See: https://api.slack.com/bot-users
Once you have configured a bot then you will have a token like: "xoxb-XXXXXXXXXXXX-TTTTTTTTTTTTTT"
You will need to put this in the file config/bot.yml or config/bot.local.yml for example:
NOTE: any .local.yml or .test.yml files are automatically ignored by git or docker
# Adapter Settings
adapter:
type: slack # Enables option alternative adapters
token: # API token
## Coming Soon ##
# user_agent: # User-agent, defaults to Slack Ruby Client/version.
# proxy: # Optional HTTP proxy.
# ca_path: # Optional SSL certificates path.
# ca_file: # Optional SSL certificates file.
# endpoint: # Slack endpoint, default is https://slack.com/api.
# logger: # Optional Logger instance that logs HTTP requests.
# Bot ConfigFile
bot:
name: bot # name for bot to respond to (optional)
# Admin Settings
admin:
users: # Array of names or IDs who are admins
dm_limit: # True/False Limits bot DMs, will not respond to DMs from non-admins.
# Help Settings
help:
level: 1 # 1/2; 1 only lists plugin names, 2 lists names and opts
dm_user: false # True/False; True to send all help requests as DM, false to post in room
plugins:
location: '../../config/plugins/'To run Sinatra simply run:
If using Global
rackup -p 4567If using Project
bundle exec rackup -p 4567Which will use simple the thin server.
This should work in Visual Studio Code when selecting the Sinatra debug option, however sometimes it seems you need to restart all of Visual Studio Code.
When running in Visual Studio Code, Sinatra tends to run on port 9292.
The settings for Visual Studio Code can be found in the launch.json file.
To build the docker container locally simply run:
docker build --tag=slapi_local ./Run with SLAPI using localhost Docker for Plugins
To run the docker container:
NOTE: This will only work on Linux or OSX Based Hosts
NOTE:Running without a config attached your bot will not connect you may want to add a -v /path/to/config:/usr/src/slapi/config or run docker exec -it slapi_local bash and manually edit one for testing.
docker run -d -p 4567:4567 -v /var/run/docker.sock:/var/run/docker.sock --name slapi_local slapi_localTo run a released version:
docker run -d -p 4567:4567 -v /var/run/docker.sock:/var/run/docker.sock --name slapi slapi/slapi:latestRun w/ Config files:
docker run -d -p 4567:4567 -v /var/run/docker.sock:/var/run/docker.sock -v /path/to/config:/usr/src/slapi/config --name slapi slapi/slapi:latestThis setup should work on all Operating Systems supported by Docker
Run the standard compose file docker-compose.yml inside the root of the project
Pulls Latest SLAPI Build and mounts the local ./config directory for bot configs. Change the compose file as needed.
docker-compose upBuild SLAPI container from scratch w/ compose.
docker-compose -f slapi-build-compose.yml upOverview of how the bot is put together and what's available for use
SLAPI has several API endpoints available to plugins and/or applications.
See more in depth documentation here
- Chat:
- Speak: Simple post to chat options
- Attachment: Formatted Data posted to chat (Title, Text)
- Emote: Post to chat as emote
- Ping: receive a pong
- Brain:
- Save: Save data into bot brain
- Delete: Delete data from bot brain
- Query_Key: Search for a key value in bot brain
- Query Hash: Search for all keys in bot brain, each plugin has it's own hash
- Plugin:
- Reload: Can call a reload of plugins without restart bot
SLAPI utilizes redis for the bot brain.
Brain is only accessible via API for plugins
See more in depth documentation here
SLAPI has 3 different types of plugin options.
See more in depth documentation here
- Script:
- Allows just utilizing a simple script as a plugin
- Currently supports the following languages: Shell/Bash, Ruby, Python, NodeJS
- Has two data options
- Simple: passes the
hello worldfrom@bot say hello worldto container as exec - All: passes the entire json blob to container as exec.
- Simple: passes the
- Container:
- Allows the use of any language or app that can run in docker on linux
- Has two data options
- Simple: passes the
hello worldfrom@bot say hello worldto container as exec - All: passes the entire json blob to container as exec.
- Simple: passes the
- API:
- Allows use of anything that can be called by API
- Requires to specific endpoints for SLAPI
- Info Endpoint: Provide the data to build the bot help
- Command Endpoint: Configurable endpoint for SLAPI to post a json payload to with all the information from slack
We have built a rake file to help wrap some of the madness
Just run rake or bundle exec rake for a current list of tasks
Both quick options require a export SLACK_TOKEN=xoxb-XXXXXXXXXXXX-TTTTTTTTTTTTTT
There are two quick options here
- local
- Creates a bot.local.yml with the exported Slack Token
- Runs a local bot using rackup in production mode
- docker
- Creates a bot.local.yml with the exported Slack Token
- Runs compose to setup the latest version in dockerhub
You can also just use to avoid creating a bot config
- run:local_prod or run:local_dev (if you want debug)
- run:docker
Important Must be a token from the http://imperiallabs.slack.com/
Quick Option
Requires a export SLACK_TOKEN=xoxb-XXXXXXXXXXXX-TTTTTTTTTTTTTT
- integration
- Creates a bot.local.yml with the exported Slack Token
- Runs a local bot using rackup in production mode
Again, to avoid bot config creation just do
- integration:spec
If you just want to clear out the cruft (scripts, bot.test.yml, bundle clean)
- cleanup
IMPORTANT: Make sure you have looked at Prerequisites first
When just want to absolutely just run the integration tests
git clone https://github.com/ImperialLabs/slapi.git
cd slapi
export SLACK_TOKEN=xoxb-XXXXXXXXXXXX-TTTTTTTTTTTTTT
bundle install --binstubs --path vendor/bundle
bundle exec rake integrationQuick install/config Instructions for rbenv or rvm as there is a visual studio launch.json included that supports both for debugging
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
echo "gem: --no-document" > ~/.gemrc #(optional)
cat >> '~/.bashrc' << 'EOF'
if [ -d "~/.rbenv" ]; then
export PATH="$HOME/.rbenv/bin:$PATH"
fi
EOF
cat >> '~/.bashrc' << 'EOF'
rbenv ()
{
local command;
command="$1";
if [ "$#" -gt 0 ]; then
shift;
fi;
case "$command" in
rehash | shell)
eval "$(rbenv "sh-$command" "$@")"
;;
*)
command rbenv "$command" "$@"
;;
esac
}
EOF
cat >> '~/.bashrc' << 'EOF'
eval "$(rbenv init -)"
EOFInstall whatever version you wish as long as it's greater than 2.3
rbenv install 2.3.3
rbenv global 2.3.3
You will need to install bundler on the default gemset (even if you work on another gemset) to not have to change the launch.json for VSCode.
So for whatever ruby you are working on:
rvm gemset use default
gem install bundler
The reason for this is so that the "pathToBundler": "${env.HOME}/.rvm/gems/${env.rvm_ruby_string}/wrappers/bundle" does not need to change as you switch rubies.
At the time of this writing, since this is using beta versions of the debugger and has many latest libraries that are interdependent, you may have to run:
gem update —system
rm -rf vendor/bundle
bundle install --binstubs --path vendor/bundle
To get the latest RubyGems.
There are currently rspec integration tests using capybara. These could use more help.
To run this tests simply:
rspecSince these are integration tests they will cause messages to be posted in a channel at imperiallabs.slack.com.
imperiallabs.slack.com is currently a free Slack team that you would need an invite to join.
Ensure you have followed all the tasks in Bundler Section
To run all tests in Visual Studio Code use the RSpec - all configuration.
Select Sinatra-rbenv or Sinatra-rvm in VS Code depending on your setup to do standard debugging.
Or use a plugin in your favorite editor.
If Making changes to the Dockerfile and/or container itself build your changes by running:
docker build --tag=slapi_local ./Run with SLAPI using localhost Docker for Plugins
To run the docker container: NOTE: This will only work on Linux or OSX Based Hosts
To run the docker container:
docker run -d -p 4567:4567 -v /var/run/docker.sock:/var/run/docker.sock --name slapi_local slapi_localThis setup should work on all Operating Systems supported by Docker
Utilizes the image built previously, this is probably the option you want to use for windows. There has been issues getting docker-compose to build images on windows, so utilize the build option under Remote Testing header.
docker-compose -f slapi-dev-prebuilt-compose.yml upBuild SLAPI container/image from scratch w/ compose.
docker-compose -f slapi-dev-compose.yml upThe debuggers run on port 1234, so just connect to 127.0.0.1:1234
If you are using VS Code, you can select the Attach to Docker profile in the debugger.
Rubocop is being used. Try to keep the lint clean by either addressing the issues or updating the .rubocop.yml.
To run rubocop either run:
rubocop- Fork the repo on GitHub
- Clone the project to your own machine
- Commit changes to your own branch
- Push your work back up to your fork
- Submit a Pull Request so that we can review your changes
NOTE: Be sure to merge the latest from "upstream" before making a pull request!
- Clone the project to your own machine
- Create a new branch from master
- Commit changes to your own branch
- Push your work back up to your branch
- Submit a Pull Request so the changes can be reviewed
NOTE: Be sure to merge the latest from "upstream" before making a pull request!