/slackbot

PortlandLabs Slackbot

Primary LanguagePHP

Slackbot

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

This SlackBot is a fully featured slack bot in the style of old IRC bots with the power of new fancy bots. You can react to arbitrary messages like tracking emojis in a message like "Giving some ❤️ to @user", or build simple call and response style messages like @bot dosomething

Getting Started

Setup

First configure your slackbot by copying .env.dist to .env and configuring the required details

$ cp .env.dist > .env

Running the bot

The Slackbot is powered by a single PHP script, run it to get started:

$ php slackbot.php

Permissions and Roles

Slackbot actions are managed by roles. The available roles are Bot, User, and Admin

Role Extends How to Access
User - Don't be a bot
Admin User Use the bot in the configured Admin channel
Bot - Send a message through the Slack Web API with as_user disabled

Commands

Commands are triggered by events flowing through the RTM API. Any event with the type message will flow through the command stack.

A basic command defines ->shouldHandle(Message $message) and ->handle(Message $message), but SimpleCommand makes things a little easier to implement. Commands that extend SimpleCommand work much the same as console commands. Declare your $signature property and a run(Message $message, ArgumentManager $manager) method, and the super class will manage hooking everything up.

Adding commands to the bot

You can add commands to the bot through the bot's command manager:

$bot->commands()->addCommand(CustomCommand::class);

Adding Default Commands:
We've wrapped the default commands in a simple provider:

(new \PortlandLabs\Slackbot\Command\DefaultProvider())->register($bot);

Sending messages to slack

There are a few ways to send messages to slack from a command:

  1. RTM API with Typing indicator

    When using the RTM API you have the ability to trigger typing indicators (so that slack says the bot is typing)

    $this->bot->feignTyping($channel, $message)

    The result of this method is a Promise that resolves when Slack acknowledges the sent message.

  2. RTM API without typing

    If you don't want the (creepy) typing indicator and you want to be upfront with the fact that your bot doesn't type,

    $this->bot->rtm()->sendMessage($channel, $message)

    The result of this is also a Promise

  3. Web API with ability to Update

    The Web API uses HTTP to send messages to slack and so can be a bit slower than using the RTM API with the added benefit of a ton of added power.

    Simple Usage:
    The simplest usage is with the Payload Builder:

    $api = $this->bot->api();
    $api->getBuilder()->send($message)->to($channel)->withIcon($icon)->execute($api);
    
    // Update the previously sent message
    $api->getBuilder()->update()->withText($newText)->execute($api);

    Complex Usage:
    If you're looking for more power or for different endpoints, you can simply build payloads directly and send them with the API

    $payload = new ChatPostMessagePayload();
    $this->prepare($payload);
    
    // Send the payload
    $payloadResponse = $this->bot->api()->send($payload);