111 lines
4.1 KiB
Go
111 lines
4.1 KiB
Go
package handler
|
|
|
|
import (
|
|
"github.com/slack-go/slack"
|
|
"github.com/slack-go/slack/slackevents"
|
|
"github.com/slack-go/slack/socketmode"
|
|
"go.uber.org/zap"
|
|
"gorm.io/gorm"
|
|
"houston/internal/processor"
|
|
"houston/pkg/postgres/service/incident"
|
|
"houston/pkg/postgres/service/severity"
|
|
"houston/pkg/postgres/service/tag"
|
|
"houston/pkg/postgres/service/team"
|
|
"houston/pkg/slackbot"
|
|
)
|
|
|
|
type slackHandler struct {
|
|
logger *zap.Logger
|
|
socketModeClient *socketmode.Client
|
|
slashCommandProcessor *processor.SlashCommandProcessor
|
|
memberJoinCallbackProcessor *processor.MemberJoinedCallbackEventProcessor
|
|
blockActionProcessor *processor.BlockActionProcessor
|
|
viewSubmissionProcessor *processor.ViewSubmissionProcessor
|
|
}
|
|
|
|
func NewSlackHandler(logger *zap.Logger, gormClient *gorm.DB, socketModeClient *socketmode.Client) *slackHandler {
|
|
severityService := severity.NewSeverityService(logger, gormClient)
|
|
incidentService := incident.NewIncidentService(logger, gormClient, severityService)
|
|
tagService := tag.NewTagService(logger, gormClient)
|
|
teamService := team.NewTeamService(logger, gormClient)
|
|
slackbotClient := slackbot.NewSlackClient(logger, socketModeClient)
|
|
return &slackHandler{
|
|
logger: logger,
|
|
socketModeClient: socketModeClient,
|
|
slashCommandProcessor: processor.NewSlashCommandProcessor(logger, socketModeClient, incidentService),
|
|
memberJoinCallbackProcessor: processor.NewMemberJoinedCallbackEventProcessor(logger, socketModeClient, incidentService, teamService, severityService),
|
|
blockActionProcessor: processor.NewBlockActionProcessor(logger, socketModeClient, incidentService, teamService, severityService, tagService, slackbotClient),
|
|
viewSubmissionProcessor: processor.NewViewSubmissionProcessor(logger, socketModeClient, incidentService, teamService, severityService, tagService, slackbotClient),
|
|
}
|
|
}
|
|
|
|
func (sh *slackHandler) HoustonConnect() {
|
|
go func() {
|
|
for evt := range sh.socketModeClient.Events {
|
|
switch evt.Type {
|
|
case socketmode.EventTypeConnecting:
|
|
{
|
|
sh.logger.Info("houston connecting to slackbot with socket mode")
|
|
}
|
|
case socketmode.EventTypeConnectionError:
|
|
{
|
|
sh.logger.Error("houston connection failed.")
|
|
}
|
|
case socketmode.EventTypeConnected:
|
|
{
|
|
sh.logger.Info("houston connected to slackbot with socket mode")
|
|
}
|
|
case socketmode.EventTypeEventsAPI:
|
|
{
|
|
ev, _ := evt.Data.(slackevents.EventsAPIEvent)
|
|
sh.logger.Info("event api", zap.Any("ev", ev))
|
|
switch ev.Type {
|
|
case slackevents.CallbackEvent:
|
|
iev := ev.InnerEvent
|
|
switch ev := iev.Data.(type) {
|
|
case *slackevents.MemberJoinedChannelEvent:
|
|
sh.memberJoinCallbackProcessor.ProcessCommand(ev, evt.Request)
|
|
}
|
|
}
|
|
}
|
|
case socketmode.EventTypeInteractive:
|
|
{
|
|
callback, _ := evt.Data.(slack.InteractionCallback)
|
|
|
|
switch callback.Type {
|
|
case slack.InteractionTypeBlockActions:
|
|
{
|
|
sh.logger.Info("received interaction type block action",
|
|
zap.String("action_id", callback.ActionID), zap.String("block_id", callback.BlockID))
|
|
sh.blockActionProcessor.ProcessCommand(callback, evt.Request)
|
|
}
|
|
case slack.InteractionTypeViewSubmission:
|
|
{
|
|
sh.logger.Info("received interaction type view submission",
|
|
zap.String("action_id", callback.ActionID), zap.String("block_id", callback.BlockID))
|
|
|
|
sh.logger.Info("payload data", zap.Any("callback", callback), zap.Any("request", evt.Request))
|
|
sh.viewSubmissionProcessor.ProcessCommand(callback, evt.Request)
|
|
}
|
|
}
|
|
}
|
|
case socketmode.EventTypeSlashCommand:
|
|
{
|
|
cmd, _ := evt.Data.(slack.SlashCommand)
|
|
|
|
sh.logger.Info("houston processing slash command",
|
|
zap.String("command", cmd.Text), zap.String("channel_name", cmd.ChannelName), zap.String("user_name", cmd.UserName))
|
|
|
|
sh.slashCommandProcessor.ProcessSlashCommand(evt)
|
|
}
|
|
default:
|
|
{
|
|
sh.logger.Error("houston unexpected event type received", zap.Any("event_type", evt.Type))
|
|
}
|
|
}
|
|
}
|
|
}()
|
|
|
|
go sh.socketModeClient.Run()
|
|
}
|