Files
houston-be/pkg/slack/houston/slash_command_processor.go
Shubham Kirve b974cb6bf3 TP-0000 | Initialize houston repo (#1)
* TP-0000 | intialize houston repo

* TP-0000 | intialize houston repo
2023-03-29 00:01:17 +05:30

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