Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add support for unicode parameter in emoji type of rich text blocks #1319

Conversation

YutoKashiwagi
Copy link
Contributor

This PR adds support for the unicode parameter to the RichTextSectionEmojiElement struct for rich text blocks. While this parameter is not officially documented in Slack's API, it is present in the JSON payload of actual Slack messages and represents the Unicode code point of the emoji.
https://api.slack.com/reference/block-kit/blocks#emoji-element-type

For example, a rich text block with an emoji can include the unicode field like this:

"blocks": [
    {
      "type": "rich_text",
      "block_id": "xxxxx",
      "elements": [
        {
          "type": "rich_text_section",
          "elements": [
            {
              "type": "emoji",
              "name": "+1",
              "unicode": "1f44d"
            }
          ]
        }
      ]
    }
  ]

The unicode parameter behaves similarly to the skin-tone parameter, which is also undocumented but has already been included in the structure. This PR aligns the handling of unicode in the same way to ensure emojis are fully supported in Slack message payloads.

Please review, and feel free to provide feedback if any adjustments are needed. Thank you!

Pull Request Guidelines

These are recommendations for pull requests.
They are strictly guidelines to help manage expectations.

PR preparation

Run make pr-prep from the root of the repository to run formatting, linting and tests.

Should this be an issue instead
  • is it a convenience method? (no new functionality, streamlines some use case)
  • exposes a previously private type, const, method, etc.
  • is it application specific (caching, retry logic, rate limiting, etc)
  • is it performance related.
API changes

Since API changes have to be maintained they undergo a more detailed review and are more likely to require changes.

  • no tests, if you're adding to the API include at least a single test of the happy case.
  • If you can accomplish your goal without changing the API, then do so.
  • dependency changes. updates are okay. adding/removing need justification.
Examples of API changes that do not meet guidelines:
  • in library cache for users. caches are use case specific.
  • Convenience methods for Sending Messages, update, post, ephemeral, etc. consider opening an issue instead.

@YutoKashiwagi YutoKashiwagi changed the title Add unicode parameter to RichTextSectionEmojiElement for rich text blocks Add support for unicode parameter in emoji type of rich text blocks Sep 9, 2024
@lorenzoaiello lorenzoaiello self-assigned this Sep 17, 2024
@lorenzoaiello lorenzoaiello changed the title Add support for unicode parameter in emoji type of rich text blocks feat: Add support for unicode parameter in emoji type of rich text blocks Sep 17, 2024
Copy link
Contributor

@lorenzoaiello lorenzoaiello left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the contribution @YutoKashiwagi !

The Slack documentation now also reflects the unicode field so this is no longer un-documented.

@lorenzoaiello lorenzoaiello removed the spec undocumented Slack does not document yet label Sep 19, 2024
@lorenzoaiello lorenzoaiello merged commit 447b7cd into slack-go:master Sep 19, 2024
7 checks passed
@rusq rusq mentioned this pull request Nov 4, 2024
4 tasks
kelseymills added a commit to incident-io/slack that referenced this pull request Nov 7, 2024
* Add example of updating modal

* socketmode.Client.run: Fix slack-go#1125 by allowing producer of channel to close when it is finished, and consumer to see the close

* socketmode.Client.run: Fix small race potential on 'firstErr' as the outer goroutine did not wait on all inner goroutines that had a chance to set it, also make sure to check error for context.Canceled appropriately

* socketmode.Client.Events: Change all events produced to Events channel via a method that has an escape hatch; unable to change public Events field without breaking api, though

* socketmode.Client.run: Cover edge case where all goroutines exit nil, when getting buffered (first) error

* socketmode: Slight refactor of Send/Ack on Client to allow passing contexts for channel ops, though they are very similar now

* socketmode: Shore up error handling via errors.Is/As/(Un)Wrapping, other small changes

* delete dupulicated code at L181

* Change comments at L183 to suggestion

Co-authored-by: Naoki Kanatani <[email protected]>

* Change http response StatusUnauthorized at L188 to StatusInternalServerError

Co-authored-by: Naoki Kanatani <[email protected]>

* socketmode example: use embedded api client in socketmode client

* socketmode remove duplicate debug logging

* socketmode bytes no longer used

* socketmodehandler: implemented RunEventLoopContext method. now socketmodehandler will react on context cancellation

* socketmode: awaiting of message receiver goroutine in run method to avoid panics

* bugfix: silly mistake in runLoop method, renamed closed to ok (recv chan)

* Export the Binder type from slacktest

* Add ReplyUsers to Msg Struct

This is something that Slack returns by default on API response.

* add support for user_profile_changed callback event

* add test

* add 2FA type to slack user

Signed-off-by: Ivan Milchev <[email protected]>

* Remove omitempty

* Test with Go 1.18~1.20

* Update README for slacktest

* Add actions/stale action

* Increase operations-per-run

* Bump up golangci-lint and its action to latest

* Add git repository's checkout option

* Add setup-go step

* gofmt

* Add 'FIXME's for deadman timer reset race

* Fix race on deadman timer Elapsed+Reset by more efficient use of ticker and ping time channel. Remove deadman file as it is no longer needed

* Add UnfurlLinks and UnfurlMedia to WebhookMessage

* to support 'classic unfurl' configuration options in webhook messages.
* https://api.slack.com/reference/messaging/link-unfurling#classic_unfurl

* chore: unnecessary use of fmt.Sprintf

* Redact tokens in debug log

* Tiny unrelated lint fix

* Add support for refresh tokens

* Conversation inviteShared support

* Create structs for manifest endpoint

* Add requests to validate manifests

* Add create and delete methods, implement common interface

* Add tokens

* Finish manifest methods

* Fix linting

* Rename value

* More tests, return manifest itself when exporting

* Undo pointer and take reference manually

* More tests

* Add options for tokens

* Use correct method

* use config token

* Pass config token as param

* Small bugfix

* add `omitempty` to ConfirmationBlockObject.Deny

a

* change case "/humboldttest": to case "/slash" to handle http request correctly

* remove post message because it's not related to sample of updating modal

* add time.sleep to wait to see updated modal

* Add examples

* add time pkg

* Re-phrase example docs

* Add is_enterprise_install flag to command, interactions, and oauth2 response

* Add blocks in slackevents.MessageEvent

* Add support for Rich Text Input

* Add Video Block (slack-go#1210)

Add support for Video Blocks

Ref. https://api.slack.com/reference/block-kit/blocks#video

cf. slack-go#1205

---------

Co-authored-by: David Parsley <[email protected]>
Co-authored-by: Ben Bourdin <[email protected]>

* Add rich_text_input block conv

* Create openid.connect.token function to fetch access token

* Fix incorrectly commented functions

* Improved comment for GetOpenIDConnectToken

* Add RichTextList support

* Add support for Indent field

Co-authored-by: SimonLiuRoblox <[email protected]>

* Add block element type FileInput

* Add Files field related to FileInput element in the BlockAction

* add connected_team_ids, shared_team_ids, internal_team_ids, is_global_shared field to conversation

* fix: expose is_enterprise_install field

* Add "edited" field to the app mention event

* Fix linter

* Fix: always add context to errors during block serde

Signed-off-by: [email protected] <[email protected]>

* Add WithURL support for ButtonBlockElement

* add rich_text_quote and rich_text_preformatted

* add deleted timestamp for deleted msg events

* Adding structure comments & definitions

* Parse string or boolean for SlashCommand.IsEnterpriseInstall

* validate text length

* Add missing message option for link_names

* fix some typos

* ignore vendor

* bots.info

* chat.scheduledMessages.list

* files.list

* usergroups.create

* usergroups.list

* reactions.list

* search.all
search.files
search.messages

* team.accessLogs

* team.billableInfo

* team.profile.get

* pr-prep

* Fix UploadFileV2 when using text content (slack-go#1291)

* Trigger GitHub Actions

* chore: slice replace loop (slack-go#1211)

* chore: slice replace loop

* Trigger GitHub Actions

---------

Co-authored-by: Lorenzo Aiello <[email protected]>

* Add isReadOnly property to Conversation struct (slack-go#1232)

Co-authored-by: Miguel Campos <[email protected]>

* chore: make channel optional on `UploadFileV2` (slack-go#1293)

* Support no channel

* added test

* fix channel id param name

* chore: Adding Deprecation Notice for files.upload (slack-go#1300)

* ci: Adding Go Test Coverage for 1.21 and 1.22 (slack-go#1298)

* docs: Updating Inline Docs and API References (slack-go#1299)

* docs: Add an example demonstrating correct usage of GetUsersPaginated (slack-go#1201)

* Add an example demonstrating correct usage of GetUsersPaginated

* Requeue GitHub Actions

---------

Co-authored-by: Lorenzo Aiello <[email protected]>

* docs: Adding an example for AddRemoteFile and DeleteFile (slack-go#1303)

* docs: Adding an example for ConversationHistory (slack-go#1302)

* slackevents: support metadata in MessageEvent (slack-go#1307)

Support for receiving metadata when reading conversation history was
first added in PR slack-go#1083. This commit extends metadata support to message
events when connected to the Slack WebSocket API.

Signed-off-by: Robert Fratto <[email protected]>

* chore: replace ioutil with io or os package (slack-go#1310)

* add file access field to file struct for slackevents (slack-go#1312)

* Add slack_file to image block (slack-go#1311)

Co-authored-by: Rhys M <[email protected]>

* feat: Events api reconcilation (slack-go#1306)

* events added with test

* added events with tests

* added all events and changes done

* feat: Add support for parsing AppRateLimited events (slack-go#1308)

The code changes in this commit add support for parsing AppRateLimited events in the `ParseEvent` function. This allows the application to handle rate-limited events from the Slack API.

* feat: Add Properties.Canvas to Channel (slack-go#1228)

* Add Properties.Canvas to Channel

* Trigger GitHub Actions

---------

Co-authored-by: Lorenzo Aiello <[email protected]>

* fix: create multipart form when multipart request (slack-go#1117)

* fix: create multipart form when multipart request

* call createFormFields in go func()

del coment

* Trigger GitHub Actions

---------

Co-authored-by: Lorenzo Aiello <[email protected]>

* feat: Add go version 1.23 to test matrix (test.yml) (slack-go#1315)

* ci: Bump GitHub Actions to Latest Versions

* fix: fix deprecated comment for UploadFile and UploadFileContext (slack-go#1316)

* Support publishing a messge to a specific thread (slack-go#1309)

Support publishing a messge to a specific thread
https://api.slack.com/interactivity/handling#publishing_in_thread

From slack interactivity documentation:
Publishing responses in thread 
If you want to publish a message to a specific thread, you'll need to
include an attribute response_type and set its value to in_channel.
Then, to specify the thread, include a thread_ts.

Also, be sure to set replace_original to false or you'll overwrite the
message you're wanting to respond to!

* fix: Add required `format` field to rich text date blocks (slack-go#1317)

As per [block kit
docs](https://api.slack.com/reference/block-kit/blocks#date-element-type),
the date element requires a format string to be included. Currently,
submitting a block kit with this element results in a slack API error.

Also added the two optional fields `url` and `fallback` for posterity.

##### PR preparation
Run `make pr-prep` from the root of the repository to run formatting,
linting and tests.

##### Should this be an issue instead
- [ ] is it a convenience method? (no new functionality, streamlines
some use case)
- [ ] exposes a previously private type, const, method, etc.
- [ ] is it application specific (caching, retry logic, rate limiting,
etc)
- [ ] is it performance related.

##### API changes

Since API changes have to be maintained they undergo a more detailed
review and are more likely to require changes.

- no tests, if you're adding to the API include at least a single test
of the happy case.
- If you can accomplish your goal without changing the API, then do so.
- dependency changes. updates are okay. adding/removing need
justification.

###### Examples of API changes that do not meet guidelines:
- in library cache for users. caches are use case specific.
- Convenience methods for Sending Messages, update, post, ephemeral,
etc. consider opening an issue instead.

* fix: Updated RichTextInputBlockElement InitialValue data type (slack-go#1320)

##### Pull Request Guidelines

These are recommendations for pull requests.
They are strictly guidelines to help manage expectations.

##### PR preparation
Run `make pr-prep` from the root of the repository to run formatting,
linting and tests.

##### Should this be an issue instead
- [x] is it a convenience method? (no new functionality, streamlines
some use case)
- [ ] exposes a previously private type, const, method, etc.
- [ ] is it application specific (caching, retry logic, rate limiting,
etc)
- [ ] is it performance related.

Fix for [issue slack-go#1276](slack-go#1276)
Updated the datatype of RichTextInputBlockElement InitialValue from
string to *RichTextBlock

* feat: Add support for unicode parameter in emoji type of rich text blocks (slack-go#1319)

This PR adds support for the `unicode` parameter to the
`RichTextSectionEmojiElement` struct for rich text blocks. While this
parameter is not officially documented in Slack's API, it is present in
the JSON payload of actual Slack messages and represents the Unicode
code point of the emoji.
https://api.slack.com/reference/block-kit/blocks#emoji-element-type

For example, a rich text block with an emoji can include the unicode
field like this:

```json
"blocks": [
    {
      "type": "rich_text",
      "block_id": "xxxxx",
      "elements": [
        {
          "type": "rich_text_section",
          "elements": [
            {
              "type": "emoji",
              "name": "+1",
              "unicode": "1f44d"
            }
          ]
        }
      ]
    }
  ]
```

The unicode parameter behaves similarly to the skin-tone parameter,
which is also undocumented but has already been included in the
structure. This PR aligns the handling of unicode in the same way to
ensure emojis are fully supported in Slack message payloads.

Please review, and feel free to provide feedback if any adjustments are
needed. Thank you!



##### Pull Request Guidelines

These are recommendations for pull requests.
They are strictly guidelines to help manage expectations.

##### PR preparation
Run `make pr-prep` from the root of the repository to run formatting,
linting and tests.

##### Should this be an issue instead
- [ ] is it a convenience method? (no new functionality, streamlines
some use case)
- [ ] exposes a previously private type, const, method, etc.
- [ ] is it application specific (caching, retry logic, rate limiting,
etc)
- [ ] is it performance related.

##### API changes

Since API changes have to be maintained they undergo a more detailed
review and are more likely to require changes.

- no tests, if you're adding to the API include at least a single test
of the happy case.
- If you can accomplish your goal without changing the API, then do so.
- dependency changes. updates are okay. adding/removing need
justification.

###### Examples of API changes that do not meet guidelines:
- in library cache for users. caches are use case specific.
- Convenience methods for Sending Messages, update, post, ephemeral,
etc. consider opening an issue instead.

* Add endpoints for `calls.*` apis and `Type: call` in blockkit (slack-go#1190)

Implement the API methods for the Calls API in Slack
https://api.slack.com/apis/calls

Implemented methods
- `calls.add` - Indicate a new call has been started
- `calls.end` - Indicate to slack that the call has ended
- `calls.info` - Get information about an ongoing slack call object
- `calls.update` - update call information
- `calls.participants.add`
- `calls.participants.remove`

Additionally, I've added the minimal version of `Block{Type: "call",
CallID: string}` which slack recommends/requires be posted back to the
channel https://api.slack.com/apis/calls#post_to_channel.

All implemented functionality is publicly documented. There appear to be
additional attributes on the `type: call` block, however those appear to
be internal values for slack's rendering, so I have left them out. See
this gist for specific responses
https://gist.github.com/winston-stripe/0cac608bd63b42d73a352be53577f7fd

##### Pull Request Guidelines

These are recommendations for pull requests.
They are strictly guidelines to help manage expectations.

##### PR preparation
Run `make pr-prep` from the root of the repository to run formatting,
linting and tests.

##### Should this be an issue instead
- [ ] is it a convenience method? (no new functionality, streamlines
some use case)
- [ ] exposes a previously private type, const, method, etc.
- [ ] is it application specific (caching, retry logic, rate limiting,
etc)
- [ ] is it performance related.

##### API changes

Since API changes have to be maintained they undergo a more detailed
review and are more likely to require changes.

- no tests, if you're adding to the API include at least a single test
of the happy case.
- If you can accomplish your goal without changing the API, then do so.
- dependency changes. updates are okay. adding/removing need
justification.

###### Examples of API changes that do not meet guidelines:
- in library cache for users. caches are use case specific.
- Convenience methods for Sending Messages, update, post, ephemeral,
etc. consider opening an issue instead.

---------

Co-authored-by: Winston Durand <[email protected]>

* feat: Add Convenience Methods to Block Elements (slack-go#1279)

Adds some convenience methods to block elements to easily add
functionality

---------

Co-authored-by: Lorenzo Aiello <[email protected]>

* feat: Add functions.completeError and functions.completeSuccess (slack-go#1328)

Completion of slack-go#1301

- Adds the new complete functions for the Function Execution Event
- Adds the context version of those methods

---
> this PR to handle event
[function_executed](https://api.slack.com/events/function_executed) and
response the function with
[functions.completeSuccess](https://api.slack.com/methods/functions.completeSuccess)
and
[functions.completeError](https://api.slack.com/methods/functions.completeError)

---------

Co-authored-by: Yoga Setiawan <[email protected]>

* feat: Add support for external_limited option of inviteShared (slack-go#1330)

Expose the ability to override the [external_limited
option](https://api.slack.com/methods/conversations.inviteShared#arg_external_limited)
for inviteShared.

Adding the param to all the InviteSharedEmailsToConversation, etc.
methods would be a breaking change to those callers, so I opted instead
to expose the underlying helper (renamed to InviteSharedToConversation).

I feel like the convenience methods
(InviteSharedEmailsToConversation/InviteSharedUserIDsToConversation) are
not actually that much more convenient than just using the helper, and I
think we can eventually remove them in favor of having people call
InviteSharedToConversation directly. But that's a future thing.

Although it's slightly inconvenient for the caller to use *bool for
ExternalLimited, the two alternatives I considered are, I think worse:
- Include ExternalLimited as a bool in the InviteSharedParams. I dislike
this way because it gives the SDK user of InviteSharedToConversation a
different default behavior from inviteShared, since the default value in
the API is true.
- Add a bool like NonExternalLimited to InviteSharedParams. This way the
defaulting is consistent with the API if it's not specified; however,
the InviteSharedParams no longer mirror the API args, which I think is
confusing.

* feat: Add support for Canvas API methods (slack-go#1334)

This PR introduces new functionalities for managing canvases and
creating channel-specific canvases.

- CreateCanvas
- DeleteCanvas
- EditCanvas
- SetCanvasAccess
- DeleteCanvasAccess
- LookupCanvasSections
- CreateChannelCanvas

Closes slack-go#1333

* Add back a few things I removed from our version when merging

* Remove duplicate TeamID

* Fix tests

* Fix linting

* Implement interface for generic section

* Fix methods to generate new rich text types

* Implement set elements

* Revert rich text changes

* Delete unnecessary file

---------

Signed-off-by: Ivan Milchev <[email protected]>
Signed-off-by: [email protected] <[email protected]>
Signed-off-by: Robert Fratto <[email protected]>
Co-authored-by: kouwakai <[email protected]>
Co-authored-by: Ian Burton <[email protected]>
Co-authored-by: KouWakai <[email protected]>
Co-authored-by: Naoki Kanatani <[email protected]>
Co-authored-by: kittydoor <[email protected]>
Co-authored-by: lololozhkin <[email protected]>
Co-authored-by: lololozhkin <[email protected]>
Co-authored-by: Kevin Paulisse <[email protected]>
Co-authored-by: Aleksa Arsic <[email protected]>
Co-authored-by: Jeffrey Dorrycott <[email protected]>
Co-authored-by: Ivan Milchev <[email protected]>
Co-authored-by: Lauri Heiskanen <[email protected]>
Co-authored-by: guoguangwu <[email protected]>
Co-authored-by: Daniel Abraham <[email protected]>
Co-authored-by: Barak Amar <[email protected]>
Co-authored-by: stijndcl <[email protected]>
Co-authored-by: Kamil Gwóźdź <[email protected]>
Co-authored-by: David Parsley <[email protected]>
Co-authored-by: Hussachai Puripunpinyo <[email protected]>
Co-authored-by: invzhi <[email protected]>
Co-authored-by: Peiman Jafari <[email protected]>
Co-authored-by: walkure <[email protected]>
Co-authored-by: David Parsley <[email protected]>
Co-authored-by: Ben Bourdin <[email protected]>
Co-authored-by: Daniel Michaels <[email protected]>
Co-authored-by: Daniel Pieper <[email protected]>
Co-authored-by: Daniel Pieper <[email protected]>
Co-authored-by: SimonLiuRoblox <[email protected]>
Co-authored-by: Aotokitsuruya <[email protected]>
Co-authored-by: Peter Nguyen <[email protected]>
Co-authored-by: Alvin See <[email protected]>
Co-authored-by: IbirbyZh <[email protected]>
Co-authored-by: [email protected] <[email protected]>
Co-authored-by: Josh Branham <[email protected]>
Co-authored-by: Rustam Gilyazov <[email protected]>
Co-authored-by: Jeremy Birtola <[email protected]>
Co-authored-by: Andres Peñaloza <[email protected]>
Co-authored-by: Robby Dyer <[email protected]>
Co-authored-by: yutasb <[email protected]>
Co-authored-by: candiduslynx <[email protected]>
Co-authored-by: Alex Shcherbakov <[email protected]>
Co-authored-by: Caleb McKay <[email protected]>
Co-authored-by: Lorenzo Aiello <[email protected]>
Co-authored-by: Lorenzo Aiello <[email protected]>
Co-authored-by: Miguel Campos <[email protected]>
Co-authored-by: Miguel Campos <[email protected]>
Co-authored-by: Alexander Forbes-Reed <[email protected]>
Co-authored-by: Adam Rothman <[email protected]>
Co-authored-by: Robert Fratto <[email protected]>
Co-authored-by: Naka Masato <[email protected]>
Co-authored-by: Peter Nguyen <[email protected]>
Co-authored-by: rhysm <[email protected]>
Co-authored-by: Rhys M <[email protected]>
Co-authored-by: Arya Khochare <[email protected]>
Co-authored-by: K.Utsunomiya <[email protected]>
Co-authored-by: ku KUMAGAI <[email protected]>
Co-authored-by: mineo <[email protected]>
Co-authored-by: ICHINOSE Shogo <[email protected]>
Co-authored-by: Nikolai <[email protected]>
Co-authored-by: Luke Josh <[email protected]>
Co-authored-by: Manjish <[email protected]>
Co-authored-by: YutoKashiwagi <[email protected]>
Co-authored-by: Winston Durand <[email protected]>
Co-authored-by: Winston Durand <[email protected]>
Co-authored-by: Obed S. <[email protected]>
Co-authored-by: Gideon Williams <[email protected]>
Co-authored-by: Yoga Setiawan <[email protected]>
Co-authored-by: Bennett Amodio <[email protected]>
Co-authored-by: Jaro Spisak <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants