ikawaha / slackbot

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Go Reference

slackbot

Tiny Slack bot client using the web socket mode.

Prepare

see. https://api.slack.com/apis/connections/socket

The required tokens and permissions are:

  • app-level token (enable socket mode) *subscribe to bot events *message.channels *bot token
    • channels:history
    • channels:join
    • chat:write
    • files:write
    • users:read

Interface

Echo bot sample (see. sample/echo.go).

package main

import (
  "context"
  "fmt"
  "log"
  "os"
  "strings"

  "github.com/ikawaha/slackbot"
)

// Bot your bot
type Bot struct {
  *slackbot.Client
}

// NewBot creates a Slack bot.
func NewBot(appToken, botToken, botName string) (*Bot, error) {
  c, err := slackbot.New(appToken, botToken, slackbot.SetBotID(botName), slackbot.Debug())
  if err != nil {
    return nil, err
  }
  return &Bot{Client: c}, err
}

func main() {
  if len(os.Args) != 4 {
    fmt.Fprintf(os.Stderr, "usage: bot app-level-token slack-bot-token bot-name\n")
    os.Exit(1)
  }
  // set your app-level-token, bot token and bot name!
  bot, err := NewBot(os.Args[1], os.Args[2], os.Args[3])
  if err != nil {
    log.Fatal(err)
  }
  defer bot.Close()
  fmt.Println("^C exits")

  callPrefix := "<@" + bot.ID + ">"
  for {
    if err := bot.ReceiveMessage(context.TODO(), func(ctx context.Context, e *slackbot.Event) error {
      switch slackbot.EventType(e.Type) {
      case slackbot.Message:
        u, ok := bot.User(e.UserID)
        log.Printf("!!! user: %+v", u)
        if !ok || u.IsBot {
          return nil
        }
        if !strings.HasPrefix(e.Text, callPrefix) {
          return nil
        }
        msg := "Hi, " + u.Name + ": " + strings.TrimPrefix(e.Text, callPrefix)
        if err := bot.PostMessage(ctx, e.Channel, msg); err != nil {
          return err
        }
      case slackbot.SlashCommand:
        if err := bot.RespondToCommand(ctx, e.ResponseURL, e.Text, true); err != nil {
          return err
        }
      }
      return nil
    }); err != nil {
      log.Printf("%v", err)
    }
  }
}

Lisence

MIT

About

License:MIT License


Languages

Language:Go 100.0%