|
|
@ -6,9 +6,10 @@ import ( |
|
|
"fmt" |
|
|
"fmt" |
|
|
"log" |
|
|
"log" |
|
|
"os" |
|
|
"os" |
|
|
"time" |
|
|
|
|
|
"os/exec" |
|
|
"os/exec" |
|
|
"rodleyserverbot/slack-bot/config" |
|
|
"rodleyserverbot/slack-bot/config" |
|
|
|
|
|
"time" |
|
|
|
|
|
|
|
|
"github.com/slack-go/slack" |
|
|
"github.com/slack-go/slack" |
|
|
"github.com/slack-go/slack/slackevents" |
|
|
"github.com/slack-go/slack/slackevents" |
|
|
"github.com/slack-go/slack/socketmode" |
|
|
"github.com/slack-go/slack/socketmode" |
|
|
@ -58,7 +59,9 @@ func Start() { |
|
|
socketClient.Ack(*event.Request) |
|
|
socketClient.Ack(*event.Request) |
|
|
switch callback.Type { |
|
|
switch callback.Type { |
|
|
case slack.InteractionTypeInteractionMessage: |
|
|
case slack.InteractionTypeInteractionMessage: |
|
|
action := *callback.ActionCallback.AttachmentActions[0] |
|
|
case slack.InteractionTypeMessageAction: |
|
|
|
|
|
case slack.InteractionTypeBlockActions: |
|
|
|
|
|
action := *callback.ActionCallback.BlockActions[0] |
|
|
var output string |
|
|
var output string |
|
|
var err error |
|
|
var err error |
|
|
|
|
|
|
|
|
@ -68,12 +71,13 @@ func Start() { |
|
|
finalMessage := fmt.Sprintf("Resultado*\n```\n%s\n```", output) |
|
|
finalMessage := fmt.Sprintf("Resultado*\n```\n%s\n```", output) |
|
|
replyToAction(callback.Channel.ID, finalMessage, client) |
|
|
replyToAction(callback.Channel.ID, finalMessage, client) |
|
|
|
|
|
|
|
|
handleAppMessagedEvent(nil, callback.Channel.ID, client) |
|
|
err := handleAppMessagedEvent(nil, callback.Channel.ID, client) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
log.Println("Error handling event:", err) |
|
|
|
|
|
} |
|
|
|
|
|
} else { |
|
|
|
|
|
log.Println("Error executing action", err) |
|
|
} |
|
|
} |
|
|
case slack.InteractionTypeMessageAction: |
|
|
|
|
|
|
|
|
|
|
|
case slack.InteractionTypeBlockActions: |
|
|
|
|
|
// See https://api.slack.com/apis/connections/socket-implement#button
|
|
|
|
|
|
|
|
|
|
|
|
case slack.InteractionTypeShortcut: |
|
|
case slack.InteractionTypeShortcut: |
|
|
case slack.InteractionTypeViewSubmission: |
|
|
case slack.InteractionTypeViewSubmission: |
|
|
@ -97,6 +101,7 @@ func Start() { |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
// Replace with actual err handeling
|
|
|
// Replace with actual err handeling
|
|
|
// log.Fatal(err)
|
|
|
// log.Fatal(err)
|
|
|
|
|
|
log.Println("Error handling event:", err) |
|
|
} |
|
|
} |
|
|
default: |
|
|
default: |
|
|
} |
|
|
} |
|
|
@ -120,10 +125,16 @@ func handleEventMessage(event slackevents.EventsAPIEvent, client *slack.Client) |
|
|
case *slackevents.AppMentionEvent: |
|
|
case *slackevents.AppMentionEvent: |
|
|
// The application has been mentioned since this Event is a Mention event
|
|
|
// The application has been mentioned since this Event is a Mention event
|
|
|
//log.Println("App Mentioned!", ev)
|
|
|
//log.Println("App Mentioned!", ev)
|
|
|
handleAppMentionEvent(ev, client) |
|
|
err := handleAppMentionEvent(ev, client) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return fmt.Errorf("failed to handle app mention event: %w", err) |
|
|
|
|
|
} |
|
|
case *slackevents.MessageEvent: |
|
|
case *slackevents.MessageEvent: |
|
|
//log.Println("MessageEvent!", ev)
|
|
|
//log.Println("MessageEvent!", ev)
|
|
|
handleAppMessagedEvent(ev, ev.Channel, client) |
|
|
err := handleAppMessagedEvent(ev, ev.Channel, client) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return fmt.Errorf("failed to handle app message event: %w", err) |
|
|
|
|
|
} |
|
|
default: |
|
|
default: |
|
|
} |
|
|
} |
|
|
default: |
|
|
default: |
|
|
@ -201,24 +212,52 @@ func getAttachmentButtons() []slack.AttachmentAction{ |
|
|
return actions |
|
|
return actions |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func buildResponseMessage() (slack.MsgOption, error) { |
|
|
|
|
|
var blocks []slack.Block |
|
|
|
|
|
|
|
|
|
|
|
sectionBlock := slack.NewSectionBlock( |
|
|
|
|
|
slack.NewTextBlockObject("mrkdwn", "Esto es lo que se hacer:", false, false), |
|
|
|
|
|
nil, |
|
|
|
|
|
nil, |
|
|
|
|
|
) |
|
|
|
|
|
blocks = append(blocks, sectionBlock) |
|
|
|
|
|
|
|
|
|
|
|
var buttons []slack.BlockElement |
|
|
|
|
|
// Slack only allows 5 buttons per action block
|
|
|
|
|
|
for i, action := range config.Config.Actions { |
|
|
|
|
|
if i > 0 && i%5 == 0 { |
|
|
|
|
|
actionBlock := slack.NewActionBlock("", buttons...) |
|
|
|
|
|
blocks = append(blocks, actionBlock) |
|
|
|
|
|
buttons = []slack.BlockElement{} |
|
|
|
|
|
} |
|
|
|
|
|
buttonElement := slack.NewButtonBlockElement(action.Name, action.Name, slack.NewTextBlockObject("plain_text", action.DisplayName, false, false)) |
|
|
|
|
|
buttons = append(buttons, buttonElement) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if len(buttons) > 0 { |
|
|
|
|
|
actionBlock := slack.NewActionBlock("", buttons...) |
|
|
|
|
|
blocks = append(blocks, actionBlock) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
message := slack.MsgOptionBlocks(blocks...) |
|
|
|
|
|
return message, nil |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
func handleAppMessagedEvent(event *slackevents.MessageEvent, channel string, client *slack.Client) error { |
|
|
func handleAppMessagedEvent(event *slackevents.MessageEvent, channel string, client *slack.Client) error { |
|
|
if event != nil && event.BotID != "" { |
|
|
if event != nil && event.BotID != "" { |
|
|
// We're not interested in messages from ourselves or other bots
|
|
|
// We're not interested in messages from ourselves or other bots
|
|
|
return nil |
|
|
return nil |
|
|
} |
|
|
} |
|
|
attachment := slack.Attachment{} |
|
|
|
|
|
var err error |
|
|
var err error |
|
|
attachment.CallbackID = "server_action" |
|
|
message, err := buildResponseMessage() |
|
|
// Send a message to the user
|
|
|
if err != nil { |
|
|
attachment.Text = "Por el momento esto es lo que se hacer" |
|
|
return fmt.Errorf("failed to build response message: %w", err) |
|
|
attachment.Pretext = fmt.Sprintf("Como te puedo ayudar?") |
|
|
} |
|
|
attachment.Color = "#3d3d3d" |
|
|
|
|
|
actions := getAttachmentButtons() |
|
|
|
|
|
attachment.Actions = actions |
|
|
|
|
|
|
|
|
|
|
|
// Send the message to the channel
|
|
|
// Send the message to the channel
|
|
|
// The Channel is available in the event message
|
|
|
// The Channel is available in the event message
|
|
|
_, _, err = client.PostMessage(channel, slack.MsgOptionAttachments(attachment)) |
|
|
_, _, err = client.PostMessage(channel, message) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
return fmt.Errorf("failed to post message: %w", err) |
|
|
return fmt.Errorf("failed to post message: %w", err) |
|
|
} |
|
|
} |
|
|
@ -234,7 +273,7 @@ func handleAppMentionEvent(event *slackevents.AppMentionEvent, client *slack.Cli |
|
|
|
|
|
|
|
|
// Send a message to the user
|
|
|
// Send a message to the user
|
|
|
attachment.Text = "Por el momento esto es lo que se hacer" |
|
|
attachment.Text = "Por el momento esto es lo que se hacer" |
|
|
attachment.Pretext = fmt.Sprintf("Como te puedo ayudar?") |
|
|
attachment.Pretext = "Como te puedo ayudar?" |
|
|
attachment.Color = "#3d3d3d" |
|
|
attachment.Color = "#3d3d3d" |
|
|
actions := getAttachmentButtons() |
|
|
actions := getAttachmentButtons() |
|
|
attachment.Actions = actions |
|
|
attachment.Actions = actions |
|
|
|