Move stuff out of main package (wip)

This commit is contained in:
Victor Truong 2020-07-27 02:41:00 -07:00
parent 558803a0de
commit dbb0a90706
6 changed files with 109 additions and 65 deletions

View file

@ -2,17 +2,24 @@ package jia
import (
"os"
"strconv"
)
type Config struct {
BotToken string
ChannelId string
BotToken string
ChannelID string
Port int
RedisURL string
VerificationToken string
}
func NewConfig() *Config {
return &Config{
BotToken: getEnv("SLACK_CLIENT_BOT_TOKEN", ""),
ChannelId: getEnv("SLACK_CHANNEL_ID", ""),
BotToken: getEnv("SLACK_CLIENT_BOT_TOKEN", ""),
ChannelID: getEnv("SLACK_CHANNEL_ID", ""),
Port: getEnvAsInt("PORT", 3000),
RedisURL: getEnv("REDIS_URL", "redis://localhost:6379/0"),
VerificationToken: getEnv("SLACK_VERIFICATION_TOKEN", ""),
}
}
@ -24,3 +31,12 @@ func getEnv(key string, defaultValue string) string {
return defaultValue
}
func getEnvAsInt(key string, defaultValue int) int {
valueStr := getEnv(key, "")
if value, err := strconv.Atoi(valueStr); err == nil {
return value
}
return defaultValue
}

17
pkg/jia/handlers.go Normal file
View file

@ -0,0 +1,17 @@
package jia
import (
"github.com/slack-go/slack"
"github.com/slack-go/slack/slackevents"
)
func HandleInnerEvent(slackClient *slack.Client, innerEvent *slackevents.EventsAPIInnerEvent) {
switch e := innerEvent.Data.(type) {
case *slackevents.MessageEvent:
onMessage(slackClient, e)
break
}
}
func onMessage(slackClient *slack.Client, event *slackevents.MessageEvent) {
}

66
pkg/jia/server.go Normal file
View file

@ -0,0 +1,66 @@
package jia
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"github.com/go-redis/redis"
"github.com/slack-go/slack"
"github.com/slack-go/slack/slackevents"
)
var (
jiaConfig *Config
redisClient *redis.Client
slackClient *slack.Client
)
func StartServer(config *Config) {
jiaConfig = config
// Set up Redis connection
options, err := redis.ParseURL(config.RedisURL)
if err != nil {
panic(err)
}
redisClient = redis.NewClient(options)
// Initialize Slack app
slackClient = slack.New(config.BotToken)
// Start receiving events
http.HandleFunc("/slack/events", handleSlackEvents)
http.ListenAndServe(fmt.Sprintf("127.0.0.1:%d", config.Port), nil)
}
func handleSlackEvents(w http.ResponseWriter, r *http.Request) {
// Verify the payload was sent by Slack.
buf := new(bytes.Buffer)
buf.ReadFrom(r.Body)
body := buf.String()
apiEvent, err := slackevents.ParseEvent(json.RawMessage(body),
slackevents.OptionVerifyToken(
&slackevents.TokenComparator{VerificationToken: jiaConfig.VerificationToken}))
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
return
}
// Handle the event that came through
switch apiEvent.Type {
case slackevents.URLVerification:
var r *slackevents.ChallengeResponse
err := json.Unmarshal([]byte(body), &r)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
}
w.Header().Set("Content-Type", "text")
w.Write([]byte(r.Challenge))
break
case slackevents.CallbackEvent:
HandleInnerEvent(slackClient, &apiEvent.InnerEvent)
break
}
}