package main import ( "encoding/json" "fmt" "io" "net/http" "os" "github.com/slack-go/slack" "github.com/slack-go/slack/slackevents" ) func main() { botToken := os.Getenv("SLACK_BOT_TOKEN") signingSecret := os.Getenv("SLACK_SIGNING_SECRET") api := slack.New(botToken, slack.OptionDebug(true), slack.OptionLog(nil)) http.HandleFunc("/events-endpoint", func(w http.ResponseWriter, r *http.Request) { body, err := io.ReadAll(r.Body) if err != nil { w.WriteHeader(http.StatusBadRequest) return } sv, err := slack.NewSecretsVerifier(r.Header, signingSecret) if err != nil { w.WriteHeader(http.StatusBadRequest) return } if _, err := sv.Write(body); err != nil { w.WriteHeader(http.StatusInternalServerError) return } if err := sv.Ensure(); err != nil { w.WriteHeader(http.StatusUnauthorized) return } eventsAPIEvent, err := slackevents.ParseEvent(json.RawMessage(body), slackevents.OptionNoVerifyToken()) if err != nil { w.WriteHeader(http.StatusInternalServerError) return } fmt.Println("[INFO] Received event:", eventsAPIEvent.Type) switch eventsAPIEvent.Type { case slackevents.URLVerification: var r *slackevents.ChallengeResponse err := json.Unmarshal([]byte(body), &r) if err != nil { w.WriteHeader(http.StatusInternalServerError) return } w.Header().Set("Content-Type", "text") w.Write([]byte(r.Challenge)) case slackevents.CallbackEvent: innerEvent := eventsAPIEvent.InnerEvent fmt.Println("[INFO] Received inner event:", innerEvent.Type) switch ev := innerEvent.Data.(type) { case *slackevents.AppMentionEvent: api.PostMessage(ev.Channel, slack.MsgOptionText("Yes, hello.", false)) } } }) fmt.Println("[INFO] Server listening") http.ListenAndServe(":3000", nil) }