Files
houston-be/cmd/app/handler/slack_handler.go
2023-04-10 17:30:28 +05:30

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()
}