Golang にて Websocket + Slack で反応する Bot を作る

Nodejs はあまり信用できないので Golang + WebSocket で Slack に反応にする Bot サーバーを作る。

あまり難しいことをせずに、
Bot がいるチャンネルや直接 DM で何かメッセージを送信したら、
Bot が反応するだけの簡単なサンプルコードを書く。

構成

簡単なサンプルなので、
なるべくファイル数を減らして書く。

/app
  └ /infrastructure
      └ Config.go
go.mod
main.go

パッケージ

サンプルコード

/app/infrastructureConfig.go

package infrastructure

type Config struct {
	Slack struct {
		Token string
	}
}

func NewConfig() *Config {
	c := new(Config)
	c.Slack.Token = "YOUR SLACK BOTs TOKEN"
	return c
}

main.go

  • WebSocket のサンプルコード をコピペしてちょっと手を加えたくらい
  • return すると反応しなくなるので、致命的なエラーが起きない限り return しない。
    • break で対応してみた。
package main

import (
	"fmt"

	"github.com/slack-go/slack"
	"github.com/psychedelicnekopunch/go-slack/app/infrastructure"
)

func main()  {
	c := infrastructure.NewConfig()
	api := slack.New(c.Slack.Token)

	// WebSocket
	rtm := api.NewRTM()
	go rtm.ManageConnection()

	for msg := range rtm.IncomingEvents {
		switch ev := msg.Data.(type) {
		case *slack.MessageEvent:
			// 新しいメッセージが送信された場合 ClientMsgID が付与される
			if fmt.Sprintf("%v", ev.ClientMsgID) == "" {
				break
			}
			// fmt.Printf("Message: %v\n", ev)
			// fmt.Printf("Message: %v\n", ev.ClientMsgID)
			// fmt.Printf("%v\n", ev.Channel)
			rtm.SendMessage(rtm.NewOutgoingMessage("せやな", fmt.Sprintf("%v", ev.Channel)))

		case *slack.PresenceChangeEvent:
			fmt.Printf("Presence Change: %v\n", ev)

		case *slack.RTMError:
			fmt.Printf("Error: %s\n", ev.Error())

		case *slack.InvalidAuthEvent:
			fmt.Printf("Invalid credentials")
			return

		default:
			// Ignore other events..
			// fmt.Printf("Unexpected: %v\n", msg.Data)
		}
	}
}

go modules

$ cd /path/to/your/project
$ go mod init
$ go mod tidy

go.mod

module github.com/psychedelicnekopunch/go-slack

go 1.14

require (
	github.com/davecgh/go-spew v1.1.1 // indirect
	github.com/pmezard/go-difflib v1.0.0 // indirect
	github.com/slack-go/slack v0.6.4
)

Supervisor で起動