How to use Metadata method of slack Package

Best Testkube code snippet using slack.Metadata

rota.go

Source:rota.go Github

copy

Full Screen

...141 modalRequest.Close = closeText142 modalRequest.Submit = submitText143 modalRequest.Blocks = blocks144 modalRequest.CallbackID = StartRotaCallback145 modalRequest.PrivateMetadata, err = metadata.GenerateCommandMetadata(146 channelId,147 rotaName,148 formatter.FormatTime(startOfShiftTime),149 endOfShiftTime,150 )151 if err != nil {152 return err153 }154 _, err = c.client.OpenView(interaction.TriggerID, modalRequest)155 if err != nil {156 return err157 }158 return nil159}160func (c *RotaCommand) StopRota(interaction *slack.InteractionCallback, action *slack.BlockAction) error {161 channelId := interaction.Channel.ID162 userId := interaction.User.ID163 rotaName := action.Value164 rotaDetails, err := c.handler.GetRotaDetails(channelId, rotaName)165 if err != nil {166 return err167 }168 if rotaDetails.CurrOnCallMember == "" {169 attachment := slack.Attachment{}170 attachment.Text = fmt.Sprintf("[%v] Can't stop a shift that has yet to start.", rotaName)171 attachment.Color = "#f0303a"172 err := c.respondToClient(channelId, userId, &attachment)173 if err != nil {174 return err175 }176 return nil177 }178 err = c.handler.UpdateOnCallMember(channelId, rotaName, "", "", "")179 if err != nil {180 return err181 }182 attachment := slack.Attachment{}183 attachment.Text = fmt.Sprintf("[%v] %s is now off duty!", rotaName, formatter.AtUserId(rotaDetails.CurrOnCallMember))184 attachment.Color = "#4af030"185 _, _, err = c.client.PostMessage(channelId, attachment)186 if err != nil {187 return err188 }189 return nil190}191func (c *RotaCommand) Prompt(command slack.SlashCommand) (interface{}, error) {192 rotaNames, err := c.handler.GetRotaNames(command.ChannelID)193 if err != nil {194 return nil, err195 }196 var mainPromptBlock *slack.SectionBlock197 if len(rotaNames) == 0 {198 mainPromptBlock = slack.NewSectionBlock(199 &slack.TextBlockObject{200 Type: slack.PlainTextType,201 Text: "Looks like this channel does not have any rotas. Shall we create one?",202 },203 nil,204 nil,205 )206 } else {207 rotaNameOptionBlockObjects := make([]*slack.OptionBlockObject, 0, len(rotaNames))208 for _, v := range rotaNames {209 optionText := slack.NewTextBlockObject(slack.PlainTextType, v, false, false)210 rotaNameOptionBlockObjects = append(rotaNameOptionBlockObjects, slack.NewOptionBlockObject(v, optionText, nil))211 }212 mainPromptBlock = slack.NewSectionBlock(213 &slack.TextBlockObject{214 Type: slack.PlainTextType,215 Text: "Which rota do you want to look at?",216 },217 nil,218 slack.NewAccessory(219 slack.NewOptionsSelectBlockElement(220 slack.OptTypeStatic,221 nil,222 SelectRotaAction,223 rotaNameOptionBlockObjects...,224 ),225 ),226 )227 }228 attachment := slack.Attachment{}229 attachment.Blocks = slack.Blocks{230 BlockSet: []slack.Block{231 mainPromptBlock,232 slack.NewActionBlock(233 promptActions,234 &slack.ButtonBlockElement{235 Type: "button",236 ActionID: CreateRotaPromptAction,237 Text: &slack.TextBlockObject{Text: "Create a new rota", Type: slack.PlainTextType},238 Style: slack.StyleDefault,239 },240 ),241 },242 }243 return &attachment, nil244}245func (c *RotaCommand) PromptRotaDetails(interaction *slack.InteractionCallback, action *slack.BlockAction) error {246 rotaName := action.SelectedOption.Value247 channelId := interaction.Channel.ID248 rotaDetails, err := c.handler.GetRotaDetails(channelId, rotaName)249 if err != nil {250 return err251 }252 rotaMembers := rotaDetails.Members253 currOnCallMember := rotaDetails.CurrOnCallMember254 rotaDuration := rotaDetails.Duration255 endOfShift := rotaDetails.EndOfShift256 prompt := c.rotaDetailsPrompt(rotaMembers, currOnCallMember, rotaName, rotaDuration, endOfShift)257 err = c.respondToClient(channelId, interaction.User.ID, prompt)258 if err != nil {259 return err260 }261 return nil262}263func (c *RotaCommand) CreateRotaPrompt(interaction *slack.InteractionCallback) error {264 channelId := interaction.Channel.ID265 triggerId := interaction.TriggerID266 return c.upsertRotaPrompt(channelId, triggerId, "", CreateRotaCallback)267}268func (c *RotaCommand) UpdateRotaPrompt(interaction *slack.InteractionCallback, action *slack.BlockAction) error {269 channelId := interaction.Channel.ID270 triggerId := interaction.TriggerID271 userId := interaction.User.ID272 rotaName := action.Value273 rotaDetails, err := c.handler.GetRotaDetails(channelId, rotaName)274 if err != nil {275 return err276 }277 if rotaDetails.CurrOnCallMember != "" {278 attachment := slack.Attachment{}279 attachment.Text = fmt.Sprintf("[%v] Can't update rota whilst someone is on duty.", rotaName)280 attachment.Color = "#f0303a"281 err := c.respondToClient(channelId, userId, &attachment)282 if err != nil {283 return err284 }285 return nil286 }287 return c.upsertRotaPrompt(channelId, triggerId, rotaName, UpdateRotaCallback)288}289func (c *RotaCommand) CreateRota(interaction *slack.InteractionCallback) error {290 metadata, err := metadata.UnpackCommandMetadata(interaction.View.PrivateMetadata)291 if err != nil {292 return err293 }294 view := interaction.View295 userId := interaction.User.ID296 channelId := metadata.ChannelId297 inputs := view.State.Values298 rotaName := inputs[rotaNameBlock][rotaNameAction].Value299 rotaMembers := inputs[rotaMembersBlock][rotaMembersAction].SelectedUsers300 rotaDuration := inputs[rotaDurationBlock][rotaDurationAction].SelectedOption.Value301 rotaDetails, err := c.handler.GetRotaDetails(channelId, rotaName)302 if err != nil {303 return err304 }305 if rotaDetails.Pk != "" {306 attachment := slack.Attachment{}307 attachment.Text = fmt.Sprintf("Oops, %s already exists!", rotaName)308 attachment.Color = "#f0303a"309 err = c.respondToClient(channelId, userId, &attachment)310 if err != nil {311 return err312 }313 return nil314 }315 return c.upsertRotaCallback(channelId, userId, rotaName, rotaMembers, rotaDuration)316}317func (c *RotaCommand) UpdateRota(interaction *slack.InteractionCallback) error {318 metadata, err := metadata.UnpackCommandMetadata(interaction.View.PrivateMetadata)319 if err != nil {320 return err321 }322 view := interaction.View323 userId := interaction.User.ID324 channelId := metadata.ChannelId325 rotaName := metadata.RotaName326 inputs := view.State.Values327 rotaMembers := inputs[rotaMembersBlock][rotaMembersAction].SelectedUsers328 rotaDuration := inputs[rotaDurationBlock][rotaDurationAction].SelectedOption.Value329 return c.upsertRotaCallback(channelId, userId, rotaName, rotaMembers, rotaDuration)330}331func (c *RotaCommand) StartRota(interaction *slack.InteractionCallback) error {332 view := interaction.View333 inputs := view.State.Values334 onCallMember := inputs[rotaOnCallMemberBlock][rotaOnCallMemberAction].SelectedOption.Value335 metadata, err := metadata.UnpackCommandMetadata(view.PrivateMetadata)336 if err != nil {337 return err338 }339 err = c.handler.UpdateOnCallMember(metadata.ChannelId, metadata.RotaName, onCallMember, metadata.StartOfShift, metadata.EndOfShift)340 if err != nil {341 return err342 }343 attachment := slack.Attachment{}344 attachment.Text = fmt.Sprintf("[%v] %s is now on duty!", metadata.RotaName, formatter.AtUserId(onCallMember))345 attachment.Color = "#4af030"346 _, _, err = c.client.PostMessage(metadata.ChannelId, attachment)347 if err != nil {348 return err349 }350 return nil351}352func (c *RotaCommand) rotaDetailsPrompt(rotaMembers []string, currOnCallMember string, rotaName string, rotaDuration int, endOfShift string) *slack.Attachment {353 var currRotaMembersText string354 var currOnCallMemberText string355 if len(rotaMembers) > 0 {356 currRotaMembersText = fmt.Sprintf("Current rota members:\n%s", formatter.RotaMembersAsString(rotaMembers))357 if currOnCallMember != "" {358 currOnCallMemberText = fmt.Sprintf("*%s is currently on duty (shift ends at %v)*", formatter.AtUserId(currOnCallMember), endOfShift)359 } else {360 currOnCallMemberText = "*No one is currently on duty.*"361 }362 } else {363 currRotaMembersText = "The rota is empty. Shall we pull in some members?"364 }365 blocks := []slack.Block{366 slack.NewHeaderBlock(367 &slack.TextBlockObject{368 Type: slack.PlainTextType,369 Text: rotaName,370 },371 ),372 slack.NewSectionBlock(373 &slack.TextBlockObject{374 Type: slack.MarkdownType,375 Text: fmt.Sprintf("Duration of a rota shift: %d week(s)", rotaDuration),376 },377 nil,378 nil,379 ),380 }381 if currOnCallMemberText != "" {382 blocks = append(blocks,383 slack.NewSectionBlock(384 &slack.TextBlockObject{385 Type: slack.MarkdownType,386 Text: currOnCallMemberText,387 },388 nil,389 nil,390 ),391 )392 }393 blocks = append(blocks,394 slack.NewSectionBlock(395 &slack.TextBlockObject{396 Type: slack.MarkdownType,397 Text: currRotaMembersText,398 },399 nil,400 nil,401 ),402 )403 rotaActionsBlock := slack.NewActionBlock(rotaActions)404 if len(rotaMembers) > 0 {405 if currOnCallMember == "" {406 rotaActionsBlock.Elements.ElementSet = append(407 rotaActionsBlock.Elements.ElementSet,408 &slack.ButtonBlockElement{409 Type: "button",410 ActionID: UpdateRotaPromptAction,411 Text: &slack.TextBlockObject{Text: "Update the rota", Type: slack.PlainTextType},412 Style: slack.StyleDefault,413 Value: rotaName,414 },415 &slack.ButtonBlockElement{416 Type: "button",417 ActionID: StartRotaAction,418 Text: &slack.TextBlockObject{Text: "Start shift", Type: slack.PlainTextType},419 Style: slack.StylePrimary,420 Value: rotaName,421 },422 )423 } else {424 rotaActionsBlock.Elements.ElementSet = append(425 rotaActionsBlock.Elements.ElementSet,426 &slack.ButtonBlockElement{427 Type: "button",428 ActionID: StopRotaAction,429 Text: &slack.TextBlockObject{Text: "Stop shift", Type: slack.PlainTextType},430 Style: slack.StyleDanger,431 Value: rotaName,432 },433 )434 }435 }436 blocks = append(blocks, rotaActionsBlock)437 attachment := slack.Attachment{}438 attachment.Blocks = slack.Blocks{BlockSet: blocks}439 return &attachment440}441func (c *RotaCommand) upsertRotaCallback(channelId string, userId string, rotaName string, rotaMembers []string, rotaDuration string) error {442 err := c.handler.SaveRotaDetails(channelId, rotaName, rotaMembers, rotaDuration)443 if err != nil {444 return err445 }446 rotaDurationAsInt, _ := strconv.Atoi(rotaDuration)447 prompt := c.rotaDetailsPrompt(rotaMembers, "", rotaName, rotaDurationAsInt, "")448 prompt.Color = "#4af030"449 err = c.respondToClient(channelId, userId, prompt)450 if err != nil {451 return err452 }453 return nil454}455func (c *RotaCommand) upsertRotaPrompt(channelId string, triggerId string, rotaName string, callbackId string) error {456 var titleTextContent string457 if callbackId == CreateRotaCallback {458 titleTextContent = "Create your rota"459 } else if callbackId == UpdateRotaCallback {460 titleTextContent = "Update your rota"461 }462 titleText := slack.NewTextBlockObject(slack.PlainTextType, titleTextContent, false, false)463 closeText := slack.NewTextBlockObject(slack.PlainTextType, "Close", false, false)464 submitText := slack.NewTextBlockObject(slack.PlainTextType, "Save", false, false)465 var blockSet []slack.Block466 if callbackId == CreateRotaCallback {467 rotaNameText := slack.NewTextBlockObject(slack.PlainTextType, "Rota Name", false, false)468 rotaNamePlaceholder := slack.NewTextBlockObject(slack.PlainTextType, "New rota name", false, false)469 rotaNameElement := slack.NewPlainTextInputBlockElement(rotaNamePlaceholder, rotaNameAction)470 rotaNameElement.MaxLength = 50471 rotaNameElement.MinLength = 5472 rotaNameInputBlock := slack.NewInputBlock(rotaNameBlock, rotaNameText, rotaNameElement)473 blockSet = append(blockSet, rotaNameInputBlock)474 }475 var initialRotaMembers []string476 if callbackId == UpdateRotaCallback {477 rotaDetails, err := c.handler.GetRotaDetails(channelId, rotaName)478 if err != nil {479 return err480 }481 initialRotaMembers = rotaDetails.Members482 }483 rotaMemberSelectionText := slack.NewTextBlockObject(slack.PlainTextType, "Select members of your rota", false, false)484 rotaMemberSelectionElement := &slack.MultiSelectBlockElement{485 Type: slack.MultiOptTypeUser,486 ActionID: rotaMembersAction,487 Placeholder: nil,488 InitialUsers: initialRotaMembers,489 }490 rotaMemberSelectionInputBlock := slack.NewInputBlock(rotaMembersBlock, rotaMemberSelectionText, rotaMemberSelectionElement)491 rotaDurationText := slack.NewTextBlockObject(slack.PlainTextType, "How long is one rota shift?", false, false)492 rotaDurationOptionBlockObjects := []*slack.OptionBlockObject{493 slack.NewOptionBlockObject("1", slack.NewTextBlockObject(slack.PlainTextType, "1 week", false, false), nil),494 slack.NewOptionBlockObject("2", slack.NewTextBlockObject(slack.PlainTextType, "2 weeks", false, false), nil),495 }496 rotaDurationElement := slack.NewRadioButtonsBlockElement(rotaDurationAction, rotaDurationOptionBlockObjects...)497 // TODO: rotaDurationElement.InitialOption498 rotaDurationInputBlock := slack.NewInputBlock(rotaDurationBlock, rotaDurationText, rotaDurationElement)499 blockSet = append(500 blockSet,501 rotaMemberSelectionInputBlock,502 rotaDurationInputBlock,503 )504 blocks := slack.Blocks{505 BlockSet: blockSet,506 }507 var modalRequest slack.ModalViewRequest508 modalRequest.Type = "modal"509 modalRequest.Title = titleText510 modalRequest.Close = closeText511 modalRequest.Submit = submitText512 modalRequest.Blocks = blocks513 modalRequest.CallbackID = callbackId514 metadata, err := metadata.GenerateCommandMetadata(515 channelId,516 rotaName,517 "",518 "",519 )520 if err != nil {521 return err522 }523 modalRequest.PrivateMetadata = metadata524 _, err = c.client.OpenView(triggerId, modalRequest)525 if err != nil {526 return err527 }528 return nil529}530func (c *RotaCommand) respondToClient(channelId string, userId string, payload *slack.Attachment) error {531 _, err := c.client.PostEphemeral(channelId, userId, *payload)532 if err != nil {533 return err534 }535 return nil536}...

Full Screen

Full Screen

interaction.go

Source:interaction.go Github

copy

Full Screen

...33 Body: "Bad payload",34 StatusCode: 400,35 }, err36 }37 var metadata *model.Metadata38 err = json.Unmarshal([]byte(payload.View.PrivateMetadata), &metadata)39 if err != nil {40 log.Printf("Couldn't parse metadata %s", err)41 } else {42 log.Printf("Metadata: %v", metadata)43 }44 currentModel, err := GetModelFromDb(ctx, metadata.ChannelId)45 switch payload.Type {46 case slack.InteractionTypeViewSubmission:47 return viewSubmission(ctx, &payload, currentModel, metadata)48 case slack.InteractionTypeBlockActions:49 return actionEvent(ctx, &payload, currentModel, metadata)50 case slack.InteractionTypeViewClosed:51 return viewClosed(&payload, currentModel, metadata)52 }53 return events.APIGatewayProxyResponse{54 Headers: JsonHeaders(),55 Body: fmt.Sprintf("Unimplemented Event Type: %v", payload.Type),56 StatusCode: 400,57 }, nil58}59func viewSubmission(ctx context.Context, payload *slack.InteractionCallback, currentModel *model.Model, currentMetadata *model.Metadata) (events.APIGatewayProxyResponse, error) {60 if payload.View.Title.Text == view.EditGoalsTitle {61 return pushModalWithAddedGoal(ctx, payload, currentModel, currentMetadata)62 } else if payload.View.Title.Text == view.EditEventsTitle {63 return pushModalWithAddedEvent(ctx, payload, currentModel, currentMetadata)64 } else {65 return publishbZapp(currentModel, currentMetadata)66 }67}68func publishbZapp(currentModel *model.Model, metadata *model.Metadata) (events.APIGatewayProxyResponse, error) {69 message := view.DailySummaryMessage(currentModel)70 post, err := Post(71 metadata.ResponseUrl,72 http.Header{73 "Content-type": []string{"application/json"},74 "Authorization": []string{fmt.Sprintf("Bearer %s", os.Getenv("SLACK_TOKEN"))},75 },76 message,77 )78 if err != nil {79 log.Printf("Error: %s", err)80 } else {81 bytes, _ := ioutil.ReadAll(post.Body)82 bodyString := string(bytes)83 log.Printf("Success: %s", string(bytes))84 if bodyString != "ok" {85 log.Printf("Error!!!!: %s", bodyString)86 return handlePostMessageError(string(bytes))87 }88 }89 return events.APIGatewayProxyResponse{90 StatusCode: 200,91 }, nil92}93func handlePostMessageError(errorMessage string) (events.APIGatewayProxyResponse, error) {94 errorMsg := fmt.Sprintf("Unknown error: %s", errorMessage)95 if errorMessage == "channel_not_found" || errorMessage == "not_in_channel" {96 errorMsg = "It looks like bZapp is not in your private channel :Shrug:. A simple @bzapp mention is you need to do!"97 } else if errorMessage == "expired_url" {98 errorMsg = "It looks like bZapp's comand expired before you could submit :timer_clock:. \nPlease close this modal, then reopen it with `/bzapp` and click submit again."99 }100 modalUpdatedWithNewEvent := view.NewErrorModal(errorMsg)101 jsonBytes, err := json.Marshal(slack.NewUpdateViewSubmissionResponse(modalUpdatedWithNewEvent))102 if err != nil {103 return events.APIGatewayProxyResponse{104 Headers: JsonHeaders(),105 Body: "Error processing request",106 StatusCode: 500,107 }, err108 }109 log.Printf("body sent to slack: %v", string(jsonBytes))110 return events.APIGatewayProxyResponse{111 Headers: JsonHeaders(),112 Body: string(jsonBytes),113 StatusCode: 200,114 }, nil115}116func pushModalWithAddedEvent(ctx context.Context, payload *slack.InteractionCallback, currentModel *model.Model, currentMetadata *model.Metadata) (events.APIGatewayProxyResponse, error) {117 newEvent := view.BuildNewEvent(currentModel.Index, payload.View.State.Values)118 currentModel.Events = currentModel.Events.AddEvent(newEvent)119 currentModel.Index++120 _ = SaveModel(ctx, currentMetadata.ChannelId, currentModel)121 modalRequest := view.NewEditEventsModal(currentModel, currentMetadata)122 modalUpdatedWithNewEvent := slack.NewUpdateViewSubmissionResponse(modalRequest)123 jsonBytes, err := json.Marshal(modalUpdatedWithNewEvent)124 if err != nil {125 return events.APIGatewayProxyResponse{126 Headers: JsonHeaders(),127 Body: "Error processing request",128 StatusCode: 500,129 }, err130 }131 log.Printf("body sent to slack: %v", string(jsonBytes))132 return events.APIGatewayProxyResponse{133 Headers: JsonHeaders(),134 Body: string(jsonBytes),135 StatusCode: 200,136 }, nil137}138func actionEvent(ctx context.Context, payload *slack.InteractionCallback, currentModel *model.Model, currentMetadata *model.Metadata) (events.APIGatewayProxyResponse, error) {139 log.Printf("action id %s\n", payload.ActionCallback.BlockActions[0].ActionID)140 switch payload.ActionCallback.BlockActions[0].ActionID {141 case view.EditEventsActionId:142 return pushEditEventModal(ctx, payload, currentModel, currentMetadata)143 case view.EditGoalsActionId:144 return pushEditGoalsModal(ctx, payload, currentModel, currentMetadata)145 case view.RemoveEventActionId:146 return removeEvent(ctx, payload, currentModel, currentMetadata)147 case view.RemoveGoalActionId:148 return removeGoal(ctx, payload, currentModel, currentMetadata)149 }150 return events.APIGatewayProxyResponse{151 Headers: JsonHeaders(),152 Body: "Unknown action type",153 StatusCode: 400,154 }, nil155}156func pushEditEventModal(ctx context.Context, payload *slack.InteractionCallback, currentModel *model.Model, currentMetadata *model.Metadata) (events.APIGatewayProxyResponse, error) {157 currentModel.Index++158 _ = SaveModel(ctx, currentMetadata.ChannelId, currentModel)159 modalRequest := view.NewEditEventsModal(currentModel, currentMetadata)160 api := slack.New(os.Getenv("SLACK_TOKEN"), slack.OptionDebug(true), slack.OptionHTTPClient(Client))161 viewResponse, err := api.PushView(payload.TriggerID, *modalRequest)162 if err != nil {163 log.Printf("Err opening modalss: %v\n", err)164 } else {165 responseFromSlack, _ := json.MarshalIndent(viewResponse, "", "\t")166 log.Printf("Success pushing edit modal: %v", string(responseFromSlack))167 }168 update := slack.NewUpdateViewSubmissionResponse(modalRequest)169 jsonBytes, err := json.Marshal(update)170 if err != nil {171 return events.APIGatewayProxyResponse{172 Headers: JsonHeaders(),173 Body: "Error processing request",174 StatusCode: 500,175 }, err176 }177 log.Printf("Json bytes: %v\n", format.PrettyJsonNoError(string(jsonBytes)))178 return events.APIGatewayProxyResponse{179 Headers: JsonHeaders(),180 StatusCode: 200,181 }, nil182}183func pushEditGoalsModal(ctx context.Context, payload *slack.InteractionCallback, currentModel *model.Model, currentMetadata *model.Metadata) (events.APIGatewayProxyResponse, error) {184 currentModel.Index++185 _ = SaveModel(ctx, currentMetadata.ChannelId, currentModel)186 modalRequest := view.NewEditGoalsModal(currentModel, currentMetadata)187 api := slack.New(os.Getenv("SLACK_TOKEN"), slack.OptionDebug(true), slack.OptionHTTPClient(Client))188 viewResponse, err := api.PushView(payload.TriggerID, *modalRequest)189 if err != nil {190 log.Printf("Err opening modalss: %v\n", err)191 } else {192 responseFromSlack, _ := json.MarshalIndent(viewResponse, "", "\t")193 log.Printf("Success pushing edit modal: %v", string(responseFromSlack))194 }195 update := slack.NewUpdateViewSubmissionResponse(modalRequest)196 jsonBytes, err := json.Marshal(update)197 if err != nil {198 return events.APIGatewayProxyResponse{199 Headers: JsonHeaders(),200 Body: "Error processing request",201 StatusCode: 500,202 }, err203 }204 log.Printf("Json bytes: %v\n", format.PrettyJsonNoError(string(jsonBytes)))205 return events.APIGatewayProxyResponse{206 Headers: JsonHeaders(),207 StatusCode: 200,208 }, nil209}210func pushModalWithAddedGoal(ctx context.Context, payload *slack.InteractionCallback, currentModel *model.Model, currentMetadata *model.Metadata) (events.APIGatewayProxyResponse, error) {211 category, goal := view.BuildNewGoalSectionBlock(currentModel.Index, payload.View.State.Values)212 currentModel.Goals = currentModel.Goals.AddGoal(category, goal)213 currentModel.Index++214 _ = SaveModel(ctx, currentMetadata.ChannelId, currentModel)215 modalRequest := view.NewEditGoalsModal(currentModel, currentMetadata)216 modalUpdatedWithNewEvent := slack.NewUpdateViewSubmissionResponse(modalRequest)217 jsonBytes, err := json.Marshal(modalUpdatedWithNewEvent)218 if err != nil {219 return events.APIGatewayProxyResponse{220 Headers: JsonHeaders(),221 Body: "Error processing request",222 StatusCode: 500,223 }, err224 }225 log.Printf("body sent to slack: %v", string(jsonBytes))226 return events.APIGatewayProxyResponse{227 Headers: JsonHeaders(),228 Body: string(jsonBytes),229 StatusCode: 200,230 }, nil231}232func removeEvent(ctx context.Context, payload *slack.InteractionCallback, currentModel *model.Model, currentMetadata *model.Metadata) (events.APIGatewayProxyResponse, error) {233 currentModel.Events = currentModel.Events.RemoveEvent(payload.ActionCallback.BlockActions[0].BlockID)234 err := SaveModel(ctx, currentMetadata.ChannelId, currentModel)235 if err != nil {236 return events.APIGatewayProxyResponse{StatusCode: 500}, nil237 }238 modalRequest := view.NewEditEventsModal(currentModel, currentMetadata)239 requestAsJson, _ := json.MarshalIndent(modalRequest, "", "\t")240 log.Printf("Body sent to slack after removing event: %v", string(requestAsJson))241 api := slack.New(os.Getenv("SLACK_TOKEN"), slack.OptionDebug(true), slack.OptionHTTPClient(Client))242 viewResponse, err := api.UpdateView(*modalRequest, payload.View.ExternalID, payload.Hash, payload.View.ID)243 if err != nil {244 log.Printf("Err removing event from modal: %v\n", err)245 } else {246 responseFromSlack, _ := json.MarshalIndent(viewResponse, "", "\t")247 log.Printf("Success event from modal: %v", string(responseFromSlack))248 }249 return events.APIGatewayProxyResponse{250 Headers: JsonHeaders(),251 StatusCode: 200,252 }, nil253}254func removeGoal(ctx context.Context, payload *slack.InteractionCallback, currentModel *model.Model, currentMetadata *model.Metadata) (events.APIGatewayProxyResponse, error) {255 currentModel.Goals = currentModel.Goals.RemoveGoal(payload.ActionCallback.BlockActions[0].BlockID)256 _ = SaveModel(ctx, currentMetadata.ChannelId, currentModel)257 modalRequest := view.NewEditGoalsModal(currentModel, currentMetadata)258 requestAsJson, _ := json.MarshalIndent(modalRequest, "", "\t")259 log.Printf("Body sent to slack after removing goal: %v", string(requestAsJson))260 api := slack.New(os.Getenv("SLACK_TOKEN"), slack.OptionDebug(true), slack.OptionHTTPClient(Client))261 viewResponse, err := api.UpdateView(*modalRequest, payload.View.ExternalID, payload.Hash, payload.View.ID)262 if err != nil {263 log.Printf("Err removing event from modal: %v\n", err)264 } else {265 responseFromSlack, _ := json.MarshalIndent(viewResponse, "", "\t")266 log.Printf("Success event from modal: %v", string(responseFromSlack))267 }268 return events.APIGatewayProxyResponse{269 Headers: JsonHeaders(),270 StatusCode: 200,271 }, nil272}273func viewClosed(payload *slack.InteractionCallback, currentModel *model.Model, currentMetadata *model.Metadata) (events.APIGatewayProxyResponse, error) {274 if (payload.View.Title.Text == view.EditEventsTitle || payload.View.Title.Text == view.EditGoalsTitle) && !payload.IsCleared {275 return returnToSummaryModal(payload, currentModel, currentMetadata)276 }277 return events.APIGatewayProxyResponse{278 Headers: JsonHeaders(),279 Body: fmt.Sprintf("Unimplemented Event Type: %v", payload.Type),280 StatusCode: 400,281 }, nil282}283func returnToSummaryModal(payload *slack.InteractionCallback, currentModel *model.Model, currentMetadata *model.Metadata) (events.APIGatewayProxyResponse, error) {284 modalRequest := view.NewSummaryModal(currentModel, currentMetadata)285 update := slack.NewUpdateViewSubmissionResponse(&modalRequest)286 jsonBytes, err := json.Marshal(update)287 log.Printf("json return to summary view: %v\n", format.PrettyJsonNoError(string(jsonBytes)))288 api := slack.New(os.Getenv("SLACK_TOKEN"), slack.OptionDebug(true), slack.OptionHTTPClient(Client))289 viewResponse, err := api.UpdateView(modalRequest, payload.View.ExternalID, payload.Hash, payload.View.RootViewID)290 if err != nil {291 log.Printf("Err opening view: %v\n", err)292 } else {293 slackResponse, _ := json.MarshalIndent(viewResponse, "", "\t")294 log.Printf("Success return to summary view: %v", string(slackResponse))295 }296 return events.APIGatewayProxyResponse{297 Headers: JsonHeaders(),298 StatusCode: 200,...

Full Screen

Full Screen

utils.go

Source:utils.go Github

copy

Full Screen

...37 }38 }39 return nil40}41// WriteCallbackMetadata returns private metadata for add menu view42func WriteCallbackMetadata(channelID string, timestamp string) string {43 return fmt.Sprintf("%s\t%s", channelID, timestamp)44}45// ParseCallbackMetadata returns parsed informations of add menu view46func ParseCallbackMetadata(privateMetadata string) (string, string) {47 callbackInfo := strings.Split(privateMetadata, "\t")48 channel := callbackInfo[0]49 originalPostTimeStamp := callbackInfo[1]50 return channel, originalPostTimeStamp51}...

Full Screen

Full Screen

Metadata

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 connector := call.NewConnector()4 credential := auth.NewCredential()5 credential.SetAppID("client id")6 credential.SetAppPassword("client secret")7 response,err:=connector.Metadata(credential)8 if err != nil {9 fmt.Println(err)10 }11 fmt.Println(response)12}13{14 "capabilities": {15 },16 {17 }18}19import (20func main() {21 connector := call.NewConnector()22 credential := auth.NewCredential()

Full Screen

Full Screen

Metadata

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 api := slack.New("xoxp-xxxxxxxxxxx-xxxxxxxxxxxxx-xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")4 file, err := api.GetFileInfo("F01K1N6JG2F", false, false, 0, 0)5 if err != nil {6 log.Fatal(err)7 }8 fmt.Printf("%+v9}10&{ID:F01K1N6JG2F Created:1609787464 Timestamp:1609787464 Name:Screenshot 2021-01-03 at 5.48.20 PM.png Title:Screenshot 2021-01-03 at 5.48.20 PM.png Mimetype:image/png Filetype:image InitialComment: InitialComment: User:U01K1N6JG2F Mode:hosted PrettyType:PNG Editable:false Size:238030 Mode:hosted IsExternal:false ExternalType: ExternalID: IsPublic:true PublicURLShared:false DisplayAsBot:false Username: Channels:[] Groups:[] Ims:[] ExternalURL:URLPrivate:URLPrivateDownload:Permalink:PermalinkPublic:EditLink:Preview:PreviewHighlight:Lines:LinesMore:PreviewIsTruncated:Thumb64:Thumb80:Thumb360:Thumb360Gif:Thumb360W:Thumb360H:Thumb480:Thumb480W:Thumb480H:Thumb160:Thumb720:Thumb720W:Thumb720H:Thumb800:Thumb800W:Thumb800H:Thumb960:Thumb960W:Thumb960H:Thumb1024:Thumb1024W:Thumb1024H:ImageExifRotation:OriginalW:OriginalH:DeanimateGif:PermalinkPublic:}

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run Testkube automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful