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
)