182 lines
8.9 KiB
Go
182 lines
8.9 KiB
Go
package houston
|
|
|
|
import (
|
|
"houston/pkg/postgres/query"
|
|
"houston/pkg/slack/houston/command"
|
|
houston "houston/pkg/slack/houston/design"
|
|
|
|
"github.com/slack-go/slack"
|
|
"github.com/slack-go/slack/slackevents"
|
|
"github.com/slack-go/slack/socketmode"
|
|
"go.uber.org/zap"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type HoustonCommandHandler struct {
|
|
logger *zap.Logger
|
|
socketmodeClient *socketmode.Client
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewHoustonCommandHandler(socketmodeClient *socketmode.Client, logger *zap.Logger, db *gorm.DB) *HoustonCommandHandler {
|
|
return &HoustonCommandHandler{
|
|
socketmodeClient: socketmodeClient,
|
|
logger: logger,
|
|
db: db,
|
|
}
|
|
}
|
|
|
|
func (bch *HoustonCommandHandler) ProcessSlashCommand(evt socketmode.Event) {
|
|
HoustonMainCommand(bch.db, bch.socketmodeClient, bch.logger, &evt)
|
|
|
|
}
|
|
|
|
func (bch *HoustonCommandHandler) ProcessCallbackEvent(callback slack.InteractionCallback) {
|
|
bch.logger.Info("process callback event", zap.Any("callback", callback))
|
|
}
|
|
|
|
func (bch *HoustonCommandHandler) ProcessModalCallbackEvent(callback slack.InteractionCallback, request *socketmode.Request) {
|
|
var callbackId = callback.View.CallbackID
|
|
switch callbackId {
|
|
case "start_incident_button":
|
|
cip := command.NewCreateIncidentProcessor(bch.socketmodeClient, bch.logger, bch.db)
|
|
cip.CreateIncidentModalCommandProcessing(callback, request)
|
|
case "assignIncidentRole":
|
|
iap := command.NewIncidentAssignProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
iap.IncidentAssignModalCommandProcessing(callback, request)
|
|
case "setIncidentStatus":
|
|
isp := command.NewIncidentUpdateStatusProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
isp.IncidentUpdateStatus(callback, request, callback.Channel, callback.User)
|
|
case "setIncidentTitle":
|
|
itp := command.NewIncidentUpdateTitleProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
itp.IncidentUpdateTitle(callback, request, callback.Channel, callback.User)
|
|
case "setIncidentDescription":
|
|
idp := command.NewIncidentUpdateDescriptionProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
idp.IncidentUpdateDescription(callback, request, callback.Channel, callback.User)
|
|
case "setIncidentSeverity":
|
|
isp := command.NewIncidentUpdateSeverityProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
isp.IncidentUpdateSeverity(callback, request, callback.Channel, callback.User)
|
|
case "setIncidentType":
|
|
itp := command.NewIncidentUpdateTypeProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
itp.IncidentUpdateType(callback, request, callback.Channel, callback.User)
|
|
case "updateTag":
|
|
itp := command.NewIncidentUpdateTagsProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
itp.IncidentUpdateTags(callback, request, callback.Channel, callback.User)
|
|
}
|
|
incidentEntity, _ := query.FindIncidentByChannelId(bch.db, callback.View.PrivateMetadata)
|
|
if incidentEntity != nil {
|
|
messages, _ := query.FindMessageByIncidentName(bch.db, incidentEntity.IncidentName)
|
|
blocks, _ := houston.IncidentSummarySection(incidentEntity, bch.db)
|
|
msgOptions := []slack.MsgOption{slack.MsgOptionBlocks(blocks...)}
|
|
for _, message := range messages {
|
|
bch.socketmodeClient.UpdateMessage(message.SlackChannel, message.MessageTimeStamp, msgOptions...)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (bch *HoustonCommandHandler) ProcessButtonHandler(callback slack.InteractionCallback, request *socketmode.Request) {
|
|
actionId := callback.ActionCallback.BlockActions[0].ActionID
|
|
bch.logger.Info("process button callback event", zap.Any("action_id", actionId),
|
|
zap.String("channel", callback.Channel.Name), zap.String("user_id", callback.User.ID),
|
|
zap.String("user_name", callback.User.Name))
|
|
|
|
switch actionId {
|
|
case "start_incident_button":
|
|
bch.logger.Info("start incident button command received",
|
|
zap.String("channel", callback.Channel.Name), zap.String("user_id", callback.User.ID),
|
|
zap.String("user_name", callback.User.Name))
|
|
sip := command.NewStartIncidentProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
sip.ProcessStartIncidentButtonCommand(callback.Channel.ID, callback.TriggerID)
|
|
case "show_incidents_button":
|
|
bch.logger.Info("show incidents button command received",
|
|
zap.String("channel", callback.Channel.Name), zap.String("user_id", callback.User.ID),
|
|
zap.String("user_name", callback.User.Name))
|
|
sip := command.ShowIncidentsProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
sip.ProcessShowIncidentsButtonCommand(callback.Channel, callback.User, callback.TriggerID, request)
|
|
case "incident":
|
|
bch.processIncidentCommands(callback, request)
|
|
case "tags":
|
|
bch.processTagsCommands(callback, request)
|
|
|
|
}
|
|
}
|
|
|
|
func (bch *HoustonCommandHandler) ProcessMemberJoinEvent(memberJoinedChannelEvent *slackevents.MemberJoinedChannelEvent, request *socketmode.Request) {
|
|
memberJoinProcessor := command.NewMemberJoinProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
memberJoinProcessor.MemberJoinProcessCommand(memberJoinedChannelEvent)
|
|
var payload interface{}
|
|
bch.socketmodeClient.Ack(*request, payload)
|
|
}
|
|
|
|
func (bch *HoustonCommandHandler) processIncidentCommands(callback slack.InteractionCallback, request *socketmode.Request) {
|
|
action := callback.ActionCallback.BlockActions[0].SelectedOption.Value
|
|
switch action {
|
|
case "assignIncidentRole":
|
|
bch.logger.Info("incident assign button command received",
|
|
zap.String("channel", callback.Channel.Name), zap.String("user_id", callback.User.ID),
|
|
zap.String("user_name", callback.User.Name))
|
|
iap := command.NewIncidentAssignProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
iap.IncidentAssignProcess(callback, request)
|
|
case "resolveIncident":
|
|
bch.logger.Info("incident update button command received",
|
|
zap.String("channel", callback.Channel.Name), zap.String("user_id", callback.User.ID),
|
|
zap.String("user_name", callback.User.Name))
|
|
irp := command.NewIncidentResolveProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
irp.IncidentResolveProcess(callback, request)
|
|
case "setIncidentStatus":
|
|
bch.logger.Info("incident update status command received",
|
|
zap.String("channel", callback.Channel.Name), zap.String("user_id", callback.User.ID),
|
|
zap.String("user_name", callback.User.Name))
|
|
isp := command.NewIncidentUpdateStatusProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
isp.IncidentUpdateStatusRequestProcess(callback, request)
|
|
case "setIncidentType":
|
|
bch.logger.Info("incident update type command received",
|
|
zap.String("channel", callback.Channel.Name), zap.String("user_id", callback.User.ID),
|
|
zap.String("user_name", callback.User.Name))
|
|
itp := command.NewIncidentUpdateTypeProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
itp.IncidentUpdateTypeRequestProcess(callback, request)
|
|
case "setIncidentSeverity":
|
|
bch.logger.Info("incident update severity command received",
|
|
zap.String("channel", callback.Channel.Name), zap.String("user_id", callback.User.ID),
|
|
zap.String("user_name", callback.User.Name))
|
|
itp := command.NewIncidentUpdateSeverityProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
itp.IncidentUpdateSeverityRequestProcess(callback, request)
|
|
case "setIncidentTitle":
|
|
bch.logger.Info("incident update title command received",
|
|
zap.String("channel", callback.Channel.Name), zap.String("user_id", callback.User.ID),
|
|
zap.String("user_name", callback.User.Name))
|
|
itp := command.NewIncidentUpdateTitleProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
itp.IncidentUpdateTitleRequestProcess(callback, request)
|
|
case "setIncidentDescription":
|
|
bch.logger.Info("incident update description command received",
|
|
zap.String("channel", callback.Channel.Name), zap.String("user_id", callback.User.ID),
|
|
zap.String("user_name", callback.User.Name))
|
|
idp := command.NewIncidentUpdateDescriptionProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
idp.IncidentUpdateDescriptionRequestProcess(callback, request)
|
|
}
|
|
}
|
|
|
|
func (bch *HoustonCommandHandler) processTagsCommands(callback slack.InteractionCallback, request *socketmode.Request) {
|
|
action := callback.ActionCallback.BlockActions[0].SelectedOption.Value
|
|
switch action {
|
|
case "addTags":
|
|
bch.logger.Info("Add Tags command received",
|
|
zap.String("channel", callback.Channel.Name), zap.String("user_id", callback.User.ID),
|
|
zap.String("user_name", callback.User.Name))
|
|
itp := command.NewIncidentUpdateTagsProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
itp.IncidentUpdateTagsRequestProcess(callback, request)
|
|
case "showTags":
|
|
bch.logger.Info("Show Tags command received",
|
|
zap.String("channel", callback.Channel.Name), zap.String("user_id", callback.User.ID),
|
|
zap.String("user_name", callback.User.Name))
|
|
itp := command.NewIncidentShowTagsProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
itp.IncidentShowTagsRequestProcess(callback, request)
|
|
case "removeTag":
|
|
bch.logger.Info("Remove Tags command received",
|
|
zap.String("channel", callback.Channel.Name), zap.String("user_id", callback.User.ID),
|
|
zap.String("user_name", callback.User.Name))
|
|
itp := command.NewIncidentUpdateTagsProcessor(bch.socketmodeClient, bch.db, bch.logger)
|
|
itp.IncidentUpdateTagsRequestProcess(callback, request)
|
|
}
|
|
}
|