slack_message 2.3.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +1 -1
- data/.gitignore +1 -0
- data/CHANGELOG.md +21 -0
- data/README.md +32 -308
- data/docs/01_configuration.md +116 -0
- data/docs/02_posting_a_message.md +134 -0
- data/docs/03_message_dsl.md +326 -0
- data/docs/04_editing_messages.md +88 -0
- data/docs/05_deleting_messages.md +45 -0
- data/docs/06_notifying_users.md +62 -0
- data/docs/07_testing.md +49 -0
- data/docs/_config.yml +6 -0
- data/docs/index.md +49 -0
- data/lib/slack_message/api.rb +101 -23
- data/lib/slack_message/configuration.rb +11 -1
- data/lib/slack_message/dsl.rb +7 -5
- data/lib/slack_message/error_handling.rb +124 -0
- data/lib/slack_message/response.rb +42 -0
- data/lib/slack_message/rspec.rb +45 -21
- data/lib/slack_message.rb +37 -5
- data/slack_message.gemspec +2 -2
- data/spec/slack_message_spec.rb +62 -8
- metadata +14 -4
- data/Gemfile.lock +0 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '098b332b278741ef63ef105fc7e79cbc7ef131a03dca79b0ed40a1d86001cae1'
|
4
|
+
data.tar.gz: 40a4028d38c154fdb1d1835e0f536adc2e57671223290e43a139be1d70a359c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f99700c2fcb33cc7ad9e671f250dc23efffd47e6f4e36d9fdc7740c9ed1a8d4b224b523b6870b13cb3b164a0ae720f93824fae803368083919d776ec2c221236
|
7
|
+
data.tar.gz: 1fb9ccc9bf2f9b9fabca5e1cdcdbcde87100f1c056613f0af1450f344bc82adcc5f7366d2f6ab8fb54e34f241018464283c750f2a0d022a67112b9570fc1287e
|
data/.github/workflows/main.yml
CHANGED
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [3.0.1] - 2021-12-22
|
4
|
+
- Major overhaul of error handling and expansion on which errors trigger
|
5
|
+
friendly messages for users.
|
6
|
+
- More additions to the docs, and working github pages integration.
|
7
|
+
- It's my birthday!
|
8
|
+
|
9
|
+
## [3.0.0] - 2021-12-19
|
10
|
+
- Return a more structured object from successful message sends.
|
11
|
+
- Add the ability to edit or delete a message.
|
12
|
+
- Complete overhaul of docs because they were too large.
|
13
|
+
|
14
|
+
## [2.4.0] - 2021-12-13
|
15
|
+
- Add ability to schedule messages, plus some guard rails around that.
|
16
|
+
- Add ability to debug by logging out the total set of params sent to the API.
|
17
|
+
|
18
|
+
## [2.3.1] - 2021-11-30
|
19
|
+
- Adjust that minimum version by changing some syntax to older styles. Given
|
20
|
+
support for ruby 2.4 ended almost 2 years ago, going to go ahead and leave
|
21
|
+
it behind.
|
22
|
+
- Remove lockfile from repo
|
23
|
+
|
3
24
|
## [2.3.0] - 2021-11-30
|
4
25
|
- Formally require minimum version of ruby. It wouldn't have worked anyway,
|
5
26
|
but worth actually specifying.
|
data/README.md
CHANGED
@@ -12,173 +12,14 @@ SlackMessage.post_to('#general') do
|
|
12
12
|
text "We did it @here! :thumbsup:"
|
13
13
|
end
|
14
14
|
```
|
15
|
+
|
16
|
+
### The Docs
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
Slack's API has a lot of options available to you! But this gem takes some
|
21
|
-
opinionated stances about usage to try to minimize the pain of integrating
|
22
|
-
with it. For example:
|
23
|
-
|
24
|
-
* SlackMessage has no dependencies. Your lockfile is enough of a mess already.
|
25
|
-
* The code to build a message should look a lot like the message itself. Code
|
26
|
-
that is simple to read and understand is a priority.
|
27
|
-
* Webhooks are passé. Only Slack Apps are supported now.
|
28
|
-
* Unless you request otherwise, text is always rendered using `mrkdwn`. If you
|
29
|
-
want plaintext, you'll need to ask for it. Same for the `emoji` flag.
|
30
|
-
* As many API semantics as possible are hidden. For instance, if you post to
|
31
|
-
something that looks like an email address, `slack_message` is going to try
|
32
|
-
to look it up as an email address.
|
33
|
-
* A few little hacks on the block syntax, such as adding a `blank_line` (which
|
34
|
-
doesn't exist in the API), or leading spaces.
|
35
|
-
* Configuration is kept as simple as possible. But, as much heavy lifting as
|
36
|
-
possible should occur just once via configuration and not on every call.
|
37
|
-
|
38
|
-
Usage
|
39
|
-
------------
|
40
|
-
|
41
|
-
### Configuration
|
42
|
-
|
43
|
-
To get started, you'll need to create a Slack App with some appropriate
|
44
|
-
permissions. It used to be possible to use the Webhook API, but that's long
|
45
|
-
since been deprecated, and apps are pretty [straightforward to
|
46
|
-
create](https://api.slack.com/tutorials/tracks/getting-a-token).
|
47
|
-
|
48
|
-
Generally, make sure your token has permissions for `users:read` and `chat:write`.
|
49
|
-
|
50
|
-
```ruby
|
51
|
-
SlackMessage.configure do |config|
|
52
|
-
api_token = 'xoxb-11111111111-2222222222-33333333333333333'
|
53
|
-
|
54
|
-
config.add_profile(api_token: api_token)
|
55
|
-
end
|
56
|
-
```
|
57
|
-
|
58
|
-
You should keep your token in a safe place like `ENV`. If using this gem with
|
59
|
-
Rails, place this code in somewhere like `config/initializers/slack_message.rb`.
|
60
|
-
|
61
|
-
#### Additional Profiles
|
62
|
-
|
63
|
-
If your app uses slack messages for several different purposes, it's common to
|
64
|
-
want to post to different channels as different names / icons / etc. To do that
|
65
|
-
more easily and consistently, you can specify multiple profiles:
|
66
|
-
|
67
|
-
```ruby
|
68
|
-
SlackMessage.configure do |config|
|
69
|
-
api_token = 'xoxb-11111111111-2222222222-33333333333333333'
|
70
|
-
|
71
|
-
# default profile
|
72
|
-
config.add_profile(api_token: api_token, name: 'Slack Notifier')
|
73
|
-
|
74
|
-
# additional profiles (see below for usage)
|
75
|
-
config.add_profile(:prod_alert_bot,
|
76
|
-
name: 'Prod Alert Bot'
|
77
|
-
icon: ':mooseandsquirrel:'
|
78
|
-
)
|
79
|
-
config.add_profile(:sidekiq_bot,
|
80
|
-
api_token: ENV.fetch('SIDEKIQ_SLACK_APP_API_TOKEN'),
|
81
|
-
name: 'Sidekiq Bot',
|
82
|
-
)
|
83
|
-
end
|
84
|
-
```
|
85
|
-
|
86
|
-
A number of parameters are available to make it simpler to use a profile without
|
87
|
-
specifying repetitive information. Most all have corresponding options when
|
88
|
-
composing a message:
|
89
|
-
|
90
|
-
| Config | Default | Value |
|
91
|
-
|-----------------|-----------------|-----------------------------------------------------------------|
|
92
|
-
| api_token | None | Your Slack App API Key. |
|
93
|
-
| name | From Slack App | The bot name for your message. |
|
94
|
-
| icon | From Slack App | Profile icon for your message. Specify as :emoji: or image URL. |
|
95
|
-
| default_channel | None (optional) | Channel / user to post to by default. |
|
96
|
-
|
97
|
-
|
98
|
-
Setting a `default_channel` specifically will allow you to use `post_as`, which
|
99
|
-
is a convenient shortcut for bots that repeatedly post to one channel as a
|
100
|
-
consistent identity:
|
101
|
-
|
102
|
-
```ruby
|
103
|
-
SlackMessage.configure do |config|
|
104
|
-
config.add_profile(:red_alert_bot,
|
105
|
-
api_token: ENV.fetch('SLACK_API_TOKEN'),
|
106
|
-
name: 'Red Alerts',
|
107
|
-
icon: ':klaxon:',
|
108
|
-
default_channel: '#red_alerts'
|
109
|
-
)
|
110
|
-
end
|
111
|
-
|
112
|
-
SlackMessage.post_as(:red_alert_bot) do
|
113
|
-
text ":ambulance: weeooo weeooo something went wrong"
|
114
|
-
end
|
115
|
-
```
|
116
|
-
|
117
|
-
There's no reason you can't use the same API key for several profiles. Profiles
|
118
|
-
are most useful to create consistent name / icon setups for apps with many bots.
|
119
|
-
|
120
|
-
### Posting Messages
|
121
|
-
|
122
|
-
As mentioned at the top, posting a message to Slack is dang easy:
|
123
|
-
|
124
|
-
```ruby
|
125
|
-
SlackMessage.post_to('#general') do
|
126
|
-
text "We did it @here! :thumbsup:"
|
127
|
-
end
|
128
|
-
```
|
129
|
-
|
130
|
-
That's it! SlackMessage will automatically serialize for the API like this:
|
131
|
-
|
132
|
-
```json
|
133
|
-
[{"type":"section","text":{"type":"mrkdwn","text":"We did it @here! :thumbsup:"}}]
|
134
|
-
```
|
135
|
-
|
136
|
-
Details like remembering that Slack made a mystifying decision to force you to
|
137
|
-
request "mrkdwn", or requiring your text to be wrapped into a section are handled
|
138
|
-
for you. Building up messages is meant to be as user-friendly as possible:
|
139
|
-
|
140
|
-
```ruby
|
141
|
-
SlackMessage.build do
|
142
|
-
text "haiku are easy"
|
143
|
-
text "but sometimes they don't make sense"
|
144
|
-
text "refrigerator"
|
145
|
-
|
146
|
-
context "- unknown author"
|
147
|
-
end
|
148
|
-
```
|
149
|
-
|
150
|
-
SlackMessage will combine your text declarations and add any necessary wrappers
|
151
|
-
automatically:
|
152
|
-
|
153
|
-
```json
|
154
|
-
[
|
155
|
-
{
|
156
|
-
"type": "section",
|
157
|
-
"text": {
|
158
|
-
"type": "mrkdwn",
|
159
|
-
"text": "haiku are easy\nbut sometimes they don't make sense\nrefrigerator"
|
160
|
-
}
|
161
|
-
},
|
162
|
-
{
|
163
|
-
"type": "context",
|
164
|
-
"elements": [
|
165
|
-
{
|
166
|
-
"type": "mrkdwn",
|
167
|
-
"text": "- unknown author"
|
168
|
-
}
|
169
|
-
]
|
170
|
-
}
|
171
|
-
]
|
172
|
-
```
|
173
|
-
|
174
|
-
It's just as easy to send messages directly to users. SlackMessage will look for
|
175
|
-
targets that are email-addressish, and look them up for you automatically:
|
18
|
+
You'll find much more information about how to use SlackMessage by visiting
|
19
|
+
[the docs](https://jmmastey.github.io/slack_message).
|
20
|
+
|
176
21
|
|
177
|
-
|
178
|
-
SlackMessage.post_to('hello@joemastey.com') do
|
179
|
-
text "You specifically did it! :thumbsup:"
|
180
|
-
end
|
181
|
-
```
|
22
|
+
### Posting
|
182
23
|
|
183
24
|
SlackMessage is able to build all kinds of rich messages for you, and has been
|
184
25
|
a real joy to use for the author at least. To understand a bit more about the
|
@@ -213,159 +54,42 @@ SlackMessage.post_to('#general') do
|
|
213
54
|
end
|
214
55
|
```
|
215
56
|
|
216
|
-
|
217
|
-
|
218
|
-
If you've defined multiple profiles in configuration, you can specify which to
|
219
|
-
use for your message by specifying its name:
|
220
|
-
|
221
|
-
```ruby
|
222
|
-
SlackMessage.post_to('#general', as: :sidekiq_bot) do
|
223
|
-
text ":octagonal_sign: A job has failed permanently and needs to be rescued."
|
224
|
-
|
225
|
-
link_button "Sidekiq Dashboard", sidekiq_dashboard_url, style: :danger
|
226
|
-
end
|
227
|
-
```
|
228
|
-
|
229
|
-
You can also override profile bot details when sending a message:
|
230
|
-
|
231
|
-
```ruby
|
232
|
-
SlackMessage.post_to('#general') do
|
233
|
-
bot_name "CoffeeBot"
|
234
|
-
bot_icon ":coffee:"
|
235
|
-
|
236
|
-
text ":coffee::clock: Time to take a break!"
|
237
|
-
end
|
238
|
-
```
|
239
|
-
|
240
|
-
#### Notifying Users
|
241
|
-
|
242
|
-
There are several supported ways to tag and notify users. Mentioned above, it's
|
243
|
-
possible to DM a user by email:
|
244
|
-
|
245
|
-
```ruby
|
246
|
-
SlackMessage.post_to('hello@joemastey.com') do
|
247
|
-
text "Hi there!"
|
248
|
-
end
|
249
|
-
```
|
250
|
-
|
251
|
-
You can also mention a user by email within a channel by wrapping their name
|
252
|
-
in tags:
|
253
|
-
|
254
|
-
```ruby
|
255
|
-
SlackMessage.post_to('#general') do
|
256
|
-
bot_name "CoffeeBot"
|
257
|
-
bot_icon ":coffee:"
|
258
|
-
|
259
|
-
text ":coffee: It's your turn to make coffee <hello@joemastey.com>."
|
260
|
-
end
|
261
|
-
```
|
262
|
-
|
263
|
-
Emails that are not wrapped in tags will be rendered as normal email addresses.
|
264
|
-
Additionally, Slack will automatically convert a number of channel names and
|
265
|
-
tags you're probably already used to:
|
266
|
-
|
267
|
-
```ruby
|
268
|
-
SlackMessage.post_to('#general') do
|
269
|
-
bot_name "CoffeeBot"
|
270
|
-
bot_icon ":coffee:"
|
271
|
-
|
272
|
-
text "@here There's no coffee left! Let #general know when you fix it."
|
273
|
-
end
|
274
|
-
```
|
275
|
-
|
276
|
-
By default, the desktop notification for a message will be the text of the
|
277
|
-
message itself. However, you can customize desktop notifications if you prefer:
|
278
|
-
|
279
|
-
```ruby
|
280
|
-
SlackMessage.post_to('hello@joemastey.com') do
|
281
|
-
bot_name "CoffeeBot"
|
282
|
-
bot_icon ":coffee:"
|
283
|
-
|
284
|
-
notification_text "It's a coffee emergency!"
|
285
|
-
text "There's no coffee left!"
|
286
|
-
end
|
287
|
-
```
|
288
|
-
|
289
|
-
### Testing
|
290
|
-
|
291
|
-
You can do some basic testing against SlackMessage, at least if you use RSpec!
|
292
|
-
You'll need to require and include the testing behavior like this, in your
|
293
|
-
spec_helper file:
|
294
|
-
|
295
|
-
```ruby
|
296
|
-
require 'slack_message/rspec'
|
297
|
-
|
298
|
-
RSpec.configure do |config|
|
299
|
-
include SlackMessage::RSpec
|
300
|
-
|
301
|
-
# your other config
|
302
|
-
end
|
303
|
-
```
|
304
|
-
|
305
|
-
This will prevent API calls from leaking in your tests, and will allow you
|
306
|
-
access to some custom matchers:
|
307
|
-
|
308
|
-
```ruby
|
309
|
-
expect {
|
310
|
-
SlackMessage.post_to('#general') { text "foo" }
|
311
|
-
}.to post_slack_message_to('#general').with_content_matching(/foo/)
|
312
|
-
|
313
|
-
expect {
|
314
|
-
SlackMessage.post_as(:schmoebot) { text "foo" }
|
315
|
-
}.to post_slack_message_as(:schmoebot)
|
316
|
-
|
317
|
-
expect {
|
318
|
-
SlackMessage.post_as(:schmoebot) { text "foo" }
|
319
|
-
}.to post_slack_message_as('Schmoe Bot')
|
320
|
-
|
321
|
-
expect {
|
322
|
-
SlackMessage.post_as(:schmoebot) { text "foo" }
|
323
|
-
}.to post_slack_message_with_icon(':schmoebot:')
|
324
|
-
|
325
|
-
expect {
|
326
|
-
SlackMessage.post_as(:schmoebot) { text "foo" }
|
327
|
-
}.to post_slack_message_with_icon_matching(/gravatar/)
|
328
|
-
|
329
|
-
expect {
|
330
|
-
SlackMessage.post_to('#general') { text "foo" }
|
331
|
-
}.to post_to_slack
|
332
|
-
```
|
333
|
-
|
334
|
-
Be forewarned, I'm frankly not that great at more complicated RSpec matchers,
|
335
|
-
so I'm guessing there are some bugs. Also, because the content of a message
|
336
|
-
gets turned into a complex JSON object, matching against content isn't capable
|
337
|
-
of very complicated regexes.
|
338
|
-
|
339
|
-
What it Doesn't Do
|
340
|
-
------------
|
57
|
+
### Opinionated Stances
|
341
58
|
|
342
59
|
This gem is intended to stay simple. Other Slack gems have lots of config
|
343
60
|
options and abilities, which makes them powerful, but makes them a pain to use.
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
61
|
+
|
62
|
+
Accordingly, SlackMessage is developed with some strong opinions in mind:
|
63
|
+
|
64
|
+
* SlackMessage has no dependencies. Your lockfile is enough of a mess already.
|
65
|
+
* A DSL that focuses on code that is easy to write, read, and maintain. Only
|
66
|
+
features that can be implemented with that in mind are included.
|
67
|
+
* The code to build a message should look a lot like the message itself. Code
|
68
|
+
that is simple to read and understand is a priority.
|
69
|
+
* Webhooks are passé. Only Slack Apps are supported now.
|
70
|
+
* Unless you request otherwise, text is always rendered using `mrkdwn`. If you
|
71
|
+
want plaintext, you'll need to ask for it. Same for the `emoji` flag.
|
72
|
+
* As many API semantics as possible are hidden. For instance, if you post to
|
73
|
+
something that looks like an email address, `slack_message` is going to try
|
74
|
+
to look it up as an email address.
|
75
|
+
* A few little hacks on the block syntax, such as adding a `blank_line` (which
|
76
|
+
doesn't exist in the API), or leading spaces.
|
77
|
+
* Configuration is kept simple, with helpers for frequently reused bots.
|
348
78
|
|
349
79
|
Some behaviors that are still planned but not yet added:
|
350
80
|
|
351
|
-
*
|
352
|
-
*
|
353
|
-
* more
|
354
|
-
*
|
355
|
-
*
|
356
|
-
* multiple recipients
|
357
|
-
* more interesting return types for your message
|
358
|
-
* richer text formatting (for instance, `ul` is currently a hack)
|
359
|
-
* more and better organized testing capability
|
81
|
+
* any interactive elements at all: https://api.slack.com/interactivity/handling
|
82
|
+
* multiple recipients: https://api.slack.com/methods/conversations.open
|
83
|
+
* more mrkdwn syntax, like quotes or code blocks
|
84
|
+
* more and better organized testing capability (scheduled messages, editing, deleting)
|
85
|
+
* posting ephemeral messages: https://api.slack.com/methods/chat.postEphemeral
|
360
86
|
|
361
|
-
Contributing
|
362
|
-
------------
|
87
|
+
### Contributing
|
363
88
|
|
364
|
-
Contributions are very welcome. Fork, fix, submit pull.
|
89
|
+
Contributions are very welcome. Fork, fix, submit pull. Since simplicity of API is a strong priority, so opening an issue to discuss possible interface changes would be wise.
|
365
90
|
|
366
91
|
Contribution is expected to conform to the [Contributor Covenant](https://github.com/jmmastey/slack_message/blob/master/CODE_OF_CONDUCT.md).
|
367
92
|
|
368
|
-
License
|
369
|
-
------------
|
93
|
+
### License
|
370
94
|
|
371
95
|
This software is released under the [MIT License](https://github.com/jmmastey/slack_message/blob/master/MIT-LICENSE).
|
@@ -0,0 +1,116 @@
|
|
1
|
+
## Getting Started / Configuration
|
2
|
+
|
3
|
+
To get started sending messages, you'll first need to create a Slack App with
|
4
|
+
some appropriate permissions. It used to be possible to use the Webhook API,
|
5
|
+
but that's long since been deprecated, and apps are pretty [straightforward to
|
6
|
+
create](https://api.slack.com/tutorials/tracks/getting-a-token).
|
7
|
+
|
8
|
+
Generally, make sure your token has permissions for _at least_ `users:read` and
|
9
|
+
`chat:write`. Then, define a default profile for SlackMessage to use for
|
10
|
+
posting.
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
SlackMessage.configure do |config|
|
14
|
+
api_token = 'xoxb-11111111111-2222222222-33333333333333333'
|
15
|
+
|
16
|
+
config.add_profile(api_token: api_token)
|
17
|
+
end
|
18
|
+
```
|
19
|
+
|
20
|
+
You should keep your token in a safe place like `ENV`. If using this gem with
|
21
|
+
Rails, place this code in somewhere like
|
22
|
+
`config/initializers/slack_message.rb`.
|
23
|
+
|
24
|
+
### Additional Profiles
|
25
|
+
|
26
|
+
If your app uses slack messages for several different purposes, it's common to
|
27
|
+
want to post to different channels as different names / icons / etc. To do that
|
28
|
+
more easily and consistently, you can specify multiple profiles.
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
SlackMessage.configure do |config|
|
32
|
+
api_token = 'xoxb-11111111111-2222222222-33333333333333333'
|
33
|
+
|
34
|
+
# default profile
|
35
|
+
config.add_profile(api_token: api_token, name: 'Slack Notifier')
|
36
|
+
|
37
|
+
# additional profiles (see below for usage)
|
38
|
+
config.add_profile(:prod_alert_bot,
|
39
|
+
name: 'Prod Alert Bot'
|
40
|
+
icon: ':mooseandsquirrel:'
|
41
|
+
)
|
42
|
+
config.add_profile(:sidekiq_bot,
|
43
|
+
api_token: ENV.fetch('SIDEKIQ_SLACK_APP_API_TOKEN'),
|
44
|
+
name: 'Sidekiq Bot',
|
45
|
+
)
|
46
|
+
end
|
47
|
+
```
|
48
|
+
|
49
|
+
A number of parameters are available to make it simpler to use a profile
|
50
|
+
without specifying repetitive information. You can generally also specify this
|
51
|
+
information on a per-message basis.
|
52
|
+
|
53
|
+
| Config | Default | Value |
|
54
|
+
|-----------------|-----------------|-----------------------------------------------------------------|
|
55
|
+
| api_token | None | Your Slack App API Key. |
|
56
|
+
| name | From Slack App | The bot name for your message. |
|
57
|
+
| icon | From Slack App | Profile icon for your message. Specify as :emoji: or image URL. |
|
58
|
+
| default_channel | None (optional) | Channel / user to post to by default. |
|
59
|
+
|
60
|
+
|
61
|
+
Setting a `default_channel` specifically will allow you to use `post_as`, which
|
62
|
+
is a convenient shortcut for bots that repeatedly post to one channel as a
|
63
|
+
consistent identity.
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
SlackMessage.configure do |config|
|
67
|
+
config.add_profile(:red_alert_bot,
|
68
|
+
api_token: ENV.fetch('SLACK_API_TOKEN'),
|
69
|
+
name: 'Red Alerts',
|
70
|
+
icon: ':klaxon:',
|
71
|
+
default_channel: '#red_alerts'
|
72
|
+
)
|
73
|
+
end
|
74
|
+
|
75
|
+
SlackMessage.post_as(:red_alert_bot) do
|
76
|
+
text ":ambulance: weeooo weeooo something went wrong"
|
77
|
+
end
|
78
|
+
```
|
79
|
+
|
80
|
+
There's no reason you can't use the same API key for several profiles. Profiles
|
81
|
+
are most useful to create consistent name / icon setups for apps with many
|
82
|
+
bots.
|
83
|
+
|
84
|
+
### Debug Mode
|
85
|
+
|
86
|
+
If you'd like to get more information about the messages you send, you can set
|
87
|
+
SlackMessage to debug mode.
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
SlackMessage.configure do |config|
|
91
|
+
config.debug
|
92
|
+
end
|
93
|
+
```
|
94
|
+
|
95
|
+
You will now see warnings detailing all params sent to the API.
|
96
|
+
|
97
|
+
```ruby
|
98
|
+
{
|
99
|
+
:channel=>"#general",
|
100
|
+
:username=>"Builds",
|
101
|
+
:blocks=>[
|
102
|
+
{:type=>"section", :text=>{
|
103
|
+
:type=>"mrkdwn",
|
104
|
+
:text=>"Build Stability is Looking Ruff :dog:"
|
105
|
+
}}
|
106
|
+
],
|
107
|
+
:text=>"Build Issues",
|
108
|
+
:post_at=>1639421171,
|
109
|
+
}
|
110
|
+
```
|
111
|
+
|
112
|
+
Note this includes data that is not included in `SlackMessage.build`.
|
113
|
+
|
114
|
+
---
|
115
|
+
|
116
|
+
Next: [Posting a Message](https://jmmastey.github.io/slack_message/02_posting_a_message)
|
@@ -0,0 +1,134 @@
|
|
1
|
+
## Posting Messages
|
2
|
+
|
3
|
+
As mentioned at the outset, posting a message to Slack is dang easy.
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
SlackMessage.post_to('#general') do
|
7
|
+
text "We did it @here! :thumbsup:"
|
8
|
+
end
|
9
|
+
```
|
10
|
+
|
11
|
+
That's it! SlackMessage will automatically serialize for the API.
|
12
|
+
|
13
|
+
```json
|
14
|
+
[{"type":"section","text":{"type":"mrkdwn","text":"We did it @here! :thumbsup:"}}]
|
15
|
+
```
|
16
|
+
|
17
|
+
Details like remembering that Slack made a mystifying decision to force you to
|
18
|
+
request "mrkdwn", or requiring your text to be wrapped into a section are
|
19
|
+
handled for you. Building up messages is meant to be as user-friendly as
|
20
|
+
possible.
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
SlackMessage.build do
|
24
|
+
text "haiku are easy"
|
25
|
+
text "but sometimes they don't make sense"
|
26
|
+
text "refrigerator"
|
27
|
+
|
28
|
+
context "- unknown author"
|
29
|
+
end
|
30
|
+
```
|
31
|
+
|
32
|
+
SlackMessage will combine your text declarations and add any necessary wrappers
|
33
|
+
automatically.
|
34
|
+
|
35
|
+
```json
|
36
|
+
[
|
37
|
+
{
|
38
|
+
"type": "section",
|
39
|
+
"text": {
|
40
|
+
"type": "mrkdwn",
|
41
|
+
"text": "haiku are easy\nbut sometimes they don't make sense\nrefrigerator"
|
42
|
+
}
|
43
|
+
},
|
44
|
+
{
|
45
|
+
"type": "context",
|
46
|
+
"elements": [
|
47
|
+
{
|
48
|
+
"type": "mrkdwn",
|
49
|
+
"text": "- unknown author"
|
50
|
+
}
|
51
|
+
]
|
52
|
+
}
|
53
|
+
]
|
54
|
+
```
|
55
|
+
|
56
|
+
### Direct Messages
|
57
|
+
|
58
|
+
It's just as easy to send messages directly to users. SlackMessage will look
|
59
|
+
for targets that are email-addressish, and look them up for you automatically.
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
SlackMessage.post_to('hello@joemastey.com') do
|
63
|
+
text "You specifically did it! :thumbsup:"
|
64
|
+
end
|
65
|
+
```
|
66
|
+
|
67
|
+
SlackMessage will compose this into Block Kit syntax and send it on its way!
|
68
|
+
|
69
|
+
### Multiple Profiles
|
70
|
+
|
71
|
+
If you've defined multiple profiles in configuration, you can specify which to
|
72
|
+
use for your message by specifying its name.
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
SlackMessage.post_to('#general', as: :sidekiq_bot) do
|
76
|
+
text ":octagonal_sign: A job has failed permanently and needs to be rescued."
|
77
|
+
|
78
|
+
link_button "Sidekiq Dashboard", sidekiq_dashboard_url, style: :danger
|
79
|
+
end
|
80
|
+
```
|
81
|
+
|
82
|
+
You can also override profile bot details when sending a message.
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
SlackMessage.post_to('#general') do
|
86
|
+
bot_name "CoffeeBot"
|
87
|
+
bot_icon ":coffee:"
|
88
|
+
|
89
|
+
text ":coffee::clock: Time to take a break!"
|
90
|
+
end
|
91
|
+
```
|
92
|
+
|
93
|
+
Finally, if your profile specifies a `default_channel`, you can also post with
|
94
|
+
the `post_as` shorthand.
|
95
|
+
|
96
|
+
```ruby
|
97
|
+
SlackMessage.post_as(:coffeebot) do
|
98
|
+
text ":coffee::clock: Time to take a break!"
|
99
|
+
end
|
100
|
+
```
|
101
|
+
|
102
|
+
### Scheduling a Message
|
103
|
+
|
104
|
+
To schedule a message, simply provide a `at` parameter to your post. Provide
|
105
|
+
either a time object that responds to `to_i`, or an integer that represents a
|
106
|
+
[unix timestamp](https://en.wikipedia.org/wiki/Unix_time) for the time at which
|
107
|
+
you want your message posted.
|
108
|
+
|
109
|
+
```ruby
|
110
|
+
SlackMessage.post_to('hello@joemastey.com', at: 20.seconds.from_now) do
|
111
|
+
text "From the top of the key. :basketball:"
|
112
|
+
end
|
113
|
+
|
114
|
+
SlackMessage.post_as(:basketball_bot, at: 20.seconds.from_now) do
|
115
|
+
text "Boom shakalaka! :explosion:"
|
116
|
+
end
|
117
|
+
```
|
118
|
+
|
119
|
+
Please note that scheduled messages can't specify a `bot_name` or `bot_icon`,
|
120
|
+
nor can they be scheduled more than 120 days into the future.
|
121
|
+
|
122
|
+
### Best Practices
|
123
|
+
|
124
|
+
Talk about having coherent methods that post a message, rather than a block
|
125
|
+
that includes lots of indirection or ternaries.
|
126
|
+
|
127
|
+
See the [API documentation for
|
128
|
+
chat.postMessage](https://api.slack.com/methods/chat.postMessage) or
|
129
|
+
[chat.scheduleMessage](https://api.slack.com/methods/chat.scheduleMessage) for
|
130
|
+
more information on posting messages.
|
131
|
+
|
132
|
+
---
|
133
|
+
|
134
|
+
Next: [The SlackMessage DSL](https://jmmastey.github.io/slack_message/03_message_dsl)
|