slack-ruby-client 0.11.0 → 2.7.0

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.
Files changed (403) hide show
  1. checksums.yaml +5 -5
  2. data/.coveralls.yml +2 -0
  3. data/.github/FUNDING.yml +2 -0
  4. data/.github/dependabot.yml +6 -0
  5. data/.github/workflows/integration_test.yml +45 -0
  6. data/.github/workflows/lint.yml +14 -0
  7. data/.github/workflows/pr_lint.yml +21 -0
  8. data/.github/workflows/test.yml +56 -0
  9. data/.github/workflows/update_api.yml +81 -0
  10. data/.gitignore +7 -3
  11. data/.rubocop.yml +40 -2
  12. data/.rubocop_todo.yml +209 -55
  13. data/.ruby-version +1 -0
  14. data/CHANGELOG.md +257 -30
  15. data/CONTRIBUTING.md +44 -29
  16. data/Dangerfile +2 -0
  17. data/Gemfile +28 -6
  18. data/Gemfile.danger +6 -0
  19. data/LICENSE.md +1 -1
  20. data/README.md +473 -134
  21. data/RELEASING.md +2 -2
  22. data/Rakefile +2 -1
  23. data/SECURITY.md +9 -0
  24. data/UPGRADING.md +117 -3
  25. data/bin/commands/admin_analytics.rb +22 -0
  26. data/bin/commands/admin_apps.rb +57 -0
  27. data/bin/commands/admin_apps_activities.rb +32 -0
  28. data/bin/commands/admin_apps_approved.rb +24 -0
  29. data/bin/commands/admin_apps_config.rb +31 -0
  30. data/bin/commands/admin_apps_requests.rb +35 -0
  31. data/bin/commands/admin_apps_restricted.rb +24 -0
  32. data/bin/commands/admin_audit_anomaly_allow.rb +29 -0
  33. data/bin/commands/admin_auth_policy.rb +45 -0
  34. data/bin/commands/admin_barriers.rb +53 -0
  35. data/bin/commands/admin_conversations.rb +260 -0
  36. data/bin/commands/admin_conversations_ekm.rb +23 -0
  37. data/bin/commands/admin_conversations_restrictAccess.rb +43 -0
  38. data/bin/commands/admin_emoji.rb +60 -0
  39. data/bin/commands/admin_functions.rb +23 -0
  40. data/bin/commands/admin_functions_permissions.rb +31 -0
  41. data/bin/commands/admin_inviteRequests.rb +42 -0
  42. data/bin/commands/admin_inviteRequests_approved.rb +22 -0
  43. data/bin/commands/admin_inviteRequests_denied.rb +22 -0
  44. data/bin/commands/admin_roles.rb +46 -0
  45. data/bin/commands/admin_teams.rb +33 -0
  46. data/bin/commands/admin_teams_admins.rb +22 -0
  47. data/bin/commands/admin_teams_owners.rb +22 -0
  48. data/bin/commands/admin_teams_settings.rb +70 -0
  49. data/bin/commands/admin_usergroups.rb +54 -0
  50. data/bin/commands/admin_users.rb +106 -0
  51. data/bin/commands/admin_users_session.rb +84 -0
  52. data/bin/commands/admin_users_unsupportedVersions.rb +21 -0
  53. data/bin/commands/admin_workflows.rb +42 -0
  54. data/bin/commands/admin_workflows_collaborators.rb +31 -0
  55. data/bin/commands/admin_workflows_permissions.rb +21 -0
  56. data/bin/commands/admin_workflows_triggers_types_permissions.rb +31 -0
  57. data/bin/commands/api.rb +15 -9
  58. data/bin/commands/apps.rb +21 -0
  59. data/bin/commands/apps_activities.rb +32 -0
  60. data/bin/commands/apps_auth_external.rb +32 -0
  61. data/bin/commands/apps_connections.rb +19 -0
  62. data/bin/commands/apps_datastore.rb +116 -0
  63. data/bin/commands/apps_event_authorizations.rb +22 -0
  64. data/bin/commands/apps_manifest.rb +58 -0
  65. data/bin/commands/assistant_search.rb +27 -0
  66. data/bin/commands/assistant_threads.rb +45 -0
  67. data/bin/commands/auth.rb +22 -15
  68. data/bin/commands/auth_teams.rb +22 -0
  69. data/bin/commands/bookmarks.rb +60 -0
  70. data/bin/commands/bots.rb +16 -8
  71. data/bin/commands/calls.rb +58 -0
  72. data/bin/commands/calls_participants.rb +31 -0
  73. data/bin/commands/canvases.rb +41 -0
  74. data/bin/commands/canvases_access.rb +34 -0
  75. data/bin/commands/canvases_sections.rb +21 -0
  76. data/bin/commands/chat.rb +158 -99
  77. data/bin/commands/chat_scheduledMessages.rb +25 -0
  78. data/bin/commands/conversations.rb +241 -157
  79. data/bin/commands/conversations_canvases.rb +22 -0
  80. data/bin/commands/conversations_externalInvitePermissions.rb +22 -0
  81. data/bin/commands/conversations_requestSharedInvite.rb +48 -0
  82. data/bin/commands/dialog.rb +16 -9
  83. data/bin/commands/dnd.rb +47 -38
  84. data/bin/commands/emoji.rb +15 -7
  85. data/bin/commands/files.rb +113 -87
  86. data/bin/commands/files_comments.rb +16 -30
  87. data/bin/commands/files_remote.rb +84 -0
  88. data/bin/commands/functions.rb +31 -0
  89. data/bin/commands/functions_distributions_permissions.rb +61 -0
  90. data/bin/commands/functions_workflows_steps.rb +23 -0
  91. data/bin/commands/functions_workflows_steps_responses.rb +23 -0
  92. data/bin/commands/migration.rb +17 -9
  93. data/bin/commands/oauth.rb +19 -24
  94. data/bin/commands/oauth_v2.rb +35 -0
  95. data/bin/commands/openid_connect.rb +33 -0
  96. data/bin/commands/pins.rb +33 -30
  97. data/bin/commands/reactions.rb +53 -45
  98. data/bin/commands/reminders.rb +54 -41
  99. data/bin/commands/rtm.rb +16 -22
  100. data/bin/commands/search.rb +44 -33
  101. data/bin/commands/stars.rb +39 -29
  102. data/bin/commands/team.rb +50 -34
  103. data/bin/commands/team_billing.rb +19 -0
  104. data/bin/commands/team_externalTeams.rb +35 -0
  105. data/bin/commands/team_preferences.rb +19 -0
  106. data/bin/commands/team_profile.rb +15 -8
  107. data/bin/commands/tooling_tokens.rb +20 -0
  108. data/bin/commands/usergroups.rb +69 -53
  109. data/bin/commands/usergroups_users.rb +30 -19
  110. data/bin/commands/users.rb +114 -84
  111. data/bin/commands/users_admin.rb +29 -22
  112. data/bin/commands/users_discoverableContacts.rb +20 -0
  113. data/bin/commands/users_prefs.rb +14 -7
  114. data/bin/commands/users_profile.rb +27 -20
  115. data/bin/commands/views.rb +56 -0
  116. data/bin/commands/workflows.rb +44 -0
  117. data/bin/commands/workflows_triggers_permissions.rb +60 -0
  118. data/bin/slack +50 -46
  119. data/examples/files_upload_v2/.env.example +1 -0
  120. data/examples/{hi_real_time → files_upload_v2}/Gemfile +2 -2
  121. data/examples/files_upload_v2/README.md +13 -0
  122. data/examples/files_upload_v2/files_upload_v2.rb +45 -0
  123. data/examples/hi_real_time_and_web/Gemfile +1 -0
  124. data/examples/hi_real_time_and_web/hi.rb +7 -3
  125. data/examples/{hi_real_time_async_eventmachine → hi_real_time_async_async}/Gemfile +2 -1
  126. data/examples/{hi_real_time_async_eventmachine → hi_real_time_async_async}/hi.rb +12 -7
  127. data/examples/hi_web/Gemfile +1 -0
  128. data/examples/hi_web/hi.rb +1 -0
  129. data/examples/new_ticket/Gemfile +1 -0
  130. data/examples/new_ticket/new_ticket.rb +1 -0
  131. data/examples/oauth_v2/.env.example +4 -0
  132. data/examples/oauth_v2/Gemfile +7 -0
  133. data/examples/oauth_v2/README.md +33 -0
  134. data/examples/oauth_v2/oauth_v2.rb +60 -0
  135. data/lib/slack/config.rb +2 -2
  136. data/lib/slack/events/config.rb +32 -0
  137. data/lib/slack/events/request.rb +76 -0
  138. data/lib/slack/logger.rb +6 -5
  139. data/lib/slack/messages/formatting.rb +66 -1
  140. data/lib/slack/messages/message.rb +1 -4
  141. data/lib/slack/real_time/api/message.rb +6 -3
  142. data/lib/slack/real_time/api/message_id.rb +1 -0
  143. data/lib/slack/real_time/api/ping.rb +5 -2
  144. data/lib/slack/real_time/api/templates/event_handler.erb +5 -1
  145. data/lib/slack/real_time/api/typing.rb +5 -2
  146. data/lib/slack/real_time/client.rb +117 -54
  147. data/lib/slack/real_time/concurrency/async.rb +142 -0
  148. data/lib/slack/real_time/concurrency.rb +2 -2
  149. data/lib/slack/real_time/config.rb +12 -13
  150. data/lib/slack/real_time/models/base.rb +1 -4
  151. data/lib/slack/real_time/models/bot.rb +1 -0
  152. data/lib/slack/real_time/models/channel.rb +5 -0
  153. data/lib/slack/real_time/models/im.rb +1 -0
  154. data/lib/slack/real_time/models/{group.rb → mpim.rb} +2 -1
  155. data/lib/slack/real_time/models/team.rb +1 -0
  156. data/lib/slack/real_time/models/user.rb +1 -0
  157. data/lib/slack/real_time/models.rb +3 -1
  158. data/lib/slack/real_time/socket.rb +49 -17
  159. data/lib/slack/real_time/stores/base.rb +28 -14
  160. data/lib/slack/real_time/stores/starter.rb +325 -287
  161. data/lib/slack/real_time/stores/store.rb +271 -186
  162. data/lib/slack/real_time/stores.rb +2 -7
  163. data/lib/slack/utils/security.rb +44 -0
  164. data/lib/slack/version.rb +2 -1
  165. data/lib/slack/web/api/endpoints/admin_analytics.rb +28 -0
  166. data/lib/slack/web/api/endpoints/admin_apps.rb +78 -0
  167. data/lib/slack/web/api/endpoints/admin_apps_activities.rb +53 -0
  168. data/lib/slack/web/api/endpoints/admin_apps_approved.rb +37 -0
  169. data/lib/slack/web/api/endpoints/admin_apps_config.rb +40 -0
  170. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +53 -0
  171. data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +37 -0
  172. data/lib/slack/web/api/endpoints/admin_audit_anomaly_allow.rb +34 -0
  173. data/lib/slack/web/api/endpoints/admin_auth_policy.rb +72 -0
  174. data/lib/slack/web/api/endpoints/admin_barriers.rb +82 -0
  175. data/lib/slack/web/api/endpoints/admin_conversations.rb +397 -0
  176. data/lib/slack/web/api/endpoints/admin_conversations_ekm.rb +35 -0
  177. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +61 -0
  178. data/lib/slack/web/api/endpoints/admin_emoji.rb +88 -0
  179. data/lib/slack/web/api/endpoints/admin_functions.rb +36 -0
  180. data/lib/slack/web/api/endpoints/admin_functions_permissions.rb +41 -0
  181. data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +61 -0
  182. data/lib/slack/web/api/endpoints/admin_inviteRequests_approved.rb +33 -0
  183. data/lib/slack/web/api/endpoints/admin_inviteRequests_denied.rb +33 -0
  184. data/lib/slack/web/api/endpoints/admin_roles.rb +73 -0
  185. data/lib/slack/web/api/endpoints/admin_teams.rb +50 -0
  186. data/lib/slack/web/api/endpoints/admin_teams_admins.rb +34 -0
  187. data/lib/slack/web/api/endpoints/admin_teams_owners.rb +34 -0
  188. data/lib/slack/web/api/endpoints/admin_teams_settings.rb +99 -0
  189. data/lib/slack/web/api/endpoints/admin_usergroups.rb +77 -0
  190. data/lib/slack/web/api/endpoints/admin_users.rb +167 -0
  191. data/lib/slack/web/api/endpoints/admin_users_session.rb +121 -0
  192. data/lib/slack/web/api/endpoints/admin_users_unsupportedVersions.rb +25 -0
  193. data/lib/slack/web/api/endpoints/admin_workflows.rb +67 -0
  194. data/lib/slack/web/api/endpoints/admin_workflows_collaborators.rb +42 -0
  195. data/lib/slack/web/api/endpoints/admin_workflows_permissions.rb +26 -0
  196. data/lib/slack/web/api/endpoints/admin_workflows_triggers_types_permissions.rb +41 -0
  197. data/lib/slack/web/api/endpoints/api.rb +2 -3
  198. data/lib/slack/web/api/endpoints/apps.rb +27 -0
  199. data/lib/slack/web/api/endpoints/apps_activities.rb +54 -0
  200. data/lib/slack/web/api/endpoints/apps_auth_external.rb +41 -0
  201. data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
  202. data/lib/slack/web/api/endpoints/apps_datastore.rb +181 -0
  203. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
  204. data/lib/slack/web/api/endpoints/apps_manifest.rb +79 -0
  205. data/lib/slack/web/api/endpoints/assistant_search.rb +44 -0
  206. data/lib/slack/web/api/endpoints/assistant_threads.rb +68 -0
  207. data/lib/slack/web/api/endpoints/auth.rb +2 -1
  208. data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
  209. data/lib/slack/web/api/endpoints/bookmarks.rb +90 -0
  210. data/lib/slack/web/api/endpoints/bots.rb +4 -1
  211. data/lib/slack/web/api/endpoints/calls.rb +83 -0
  212. data/lib/slack/web/api/endpoints/calls_participants.rb +42 -0
  213. data/lib/slack/web/api/endpoints/canvases.rb +54 -0
  214. data/lib/slack/web/api/endpoints/canvases_access.rb +47 -0
  215. data/lib/slack/web/api/endpoints/canvases_sections.rb +27 -0
  216. data/lib/slack/web/api/endpoints/chat.rb +172 -87
  217. data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
  218. data/lib/slack/web/api/endpoints/conversations.rb +190 -64
  219. data/lib/slack/web/api/endpoints/conversations_canvases.rb +28 -0
  220. data/lib/slack/web/api/endpoints/conversations_externalInvitePermissions.rb +31 -0
  221. data/lib/slack/web/api/endpoints/conversations_requestSharedInvite.rb +73 -0
  222. data/lib/slack/web/api/endpoints/dialog.rb +6 -10
  223. data/lib/slack/web/api/endpoints/dnd.rb +11 -5
  224. data/lib/slack/web/api/endpoints/emoji.rb +3 -0
  225. data/lib/slack/web/api/endpoints/files.rb +85 -36
  226. data/lib/slack/web/api/endpoints/files_comments.rb +4 -36
  227. data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
  228. data/lib/slack/web/api/endpoints/functions.rb +43 -0
  229. data/lib/slack/web/api/endpoints/functions_distributions_permissions.rb +84 -0
  230. data/lib/slack/web/api/endpoints/functions_workflows_steps.rb +30 -0
  231. data/lib/slack/web/api/endpoints/functions_workflows_steps_responses.rb +30 -0
  232. data/lib/slack/web/api/endpoints/migration.rb +6 -3
  233. data/lib/slack/web/api/endpoints/oauth.rb +10 -32
  234. data/lib/slack/web/api/endpoints/oauth_v2.rb +48 -0
  235. data/lib/slack/web/api/endpoints/openid_connect.rb +42 -0
  236. data/lib/slack/web/api/endpoints/pins.rb +11 -18
  237. data/lib/slack/web/api/endpoints/reactions.rb +31 -20
  238. data/lib/slack/web/api/endpoints/reminders.rb +25 -12
  239. data/lib/slack/web/api/endpoints/rtm.rb +4 -22
  240. data/lib/slack/web/api/endpoints/search.rb +33 -18
  241. data/lib/slack/web/api/endpoints/stars.rb +23 -10
  242. data/lib/slack/web/api/endpoints/team.rb +38 -7
  243. data/lib/slack/web/api/endpoints/team_billing.rb +21 -0
  244. data/lib/slack/web/api/endpoints/team_externalTeams.rb +53 -0
  245. data/lib/slack/web/api/endpoints/team_preferences.rb +21 -0
  246. data/lib/slack/web/api/endpoints/team_profile.rb +2 -1
  247. data/lib/slack/web/api/endpoints/tooling_tokens.rb +24 -0
  248. data/lib/slack/web/api/endpoints/usergroups.rb +44 -25
  249. data/lib/slack/web/api/endpoints/usergroups_users.rb +23 -14
  250. data/lib/slack/web/api/endpoints/users.rb +57 -18
  251. data/lib/slack/web/api/endpoints/users_admin.rb +5 -2
  252. data/lib/slack/web/api/endpoints/users_discoverableContacts.rb +24 -0
  253. data/lib/slack/web/api/endpoints/users_prefs.rb +2 -0
  254. data/lib/slack/web/api/endpoints/users_profile.rb +11 -9
  255. data/lib/slack/web/api/endpoints/views.rb +86 -0
  256. data/lib/slack/web/api/endpoints/workflows.rb +63 -0
  257. data/lib/slack/web/api/endpoints/workflows_triggers_permissions.rb +87 -0
  258. data/lib/slack/web/api/endpoints.rb +136 -12
  259. data/lib/slack/web/api/error.rb +1 -0
  260. data/lib/slack/web/api/errors/server_error.rb +37 -0
  261. data/lib/slack/web/api/errors/slack_error.rb +14 -1
  262. data/lib/slack/web/api/errors/too_many_requests_error.rb +2 -4
  263. data/lib/slack/web/api/errors.rb +1396 -0
  264. data/lib/slack/web/api/helpers/files.rb +97 -0
  265. data/lib/slack/web/api/helpers.rb +13 -0
  266. data/lib/slack/web/api/mixins/conversations.id.rb +47 -0
  267. data/lib/slack/web/api/mixins/ids.id.rb +4 -3
  268. data/lib/slack/web/api/mixins/users.id.rb +18 -4
  269. data/lib/slack/web/api/mixins/users.search.rb +3 -1
  270. data/lib/slack/web/api/mixins.rb +2 -2
  271. data/lib/slack/web/api/options.rb +26 -0
  272. data/lib/slack/web/api/patches/.gitkeep +0 -0
  273. data/lib/slack/web/api/templates/command.erb +19 -12
  274. data/lib/slack/web/api/templates/endpoints.erb +2 -2
  275. data/lib/slack/web/api/templates/errors.erb +20 -0
  276. data/lib/slack/web/api/templates/method.erb +23 -3
  277. data/lib/slack/web/api/templates/method_spec.erb +40 -3
  278. data/lib/slack/web/client.rb +4 -1
  279. data/lib/slack/web/config.rb +9 -2
  280. data/lib/slack/web/faraday/connection.rb +11 -20
  281. data/lib/slack/web/faraday/options.rb +24 -0
  282. data/lib/slack/web/faraday/request.rb +6 -1
  283. data/lib/slack/web/faraday/response/raise_error.rb +14 -8
  284. data/lib/slack/web/faraday/response/wrap_error.rb +24 -0
  285. data/lib/slack/web/pagination/cursor.rb +7 -7
  286. data/lib/slack-ruby-client.rb +18 -6
  287. data/lib/slack.rb +1 -0
  288. data/lib/slack_ruby_client.rb +1 -0
  289. data/lib/tasks/git.rake +1 -0
  290. data/lib/tasks/real_time.rake +51 -21
  291. data/lib/tasks/update.rake +1 -0
  292. data/lib/tasks/web.rake +43 -17
  293. data/slack-ruby-client.gemspec +10 -14
  294. metadata +191 -307
  295. data/.travis.yml +0 -30
  296. data/bin/commands/apps_permissions.rb +0 -22
  297. data/bin/commands/channels.rb +0 -175
  298. data/bin/commands/groups.rb +0 -172
  299. data/bin/commands/im.rb +0 -67
  300. data/bin/commands/mpim.rb +0 -63
  301. data/bin/commands.rb +0 -33
  302. data/examples/hi_real_time/hi.gif +0 -0
  303. data/examples/hi_real_time/hi.rb +0 -37
  304. data/examples/hi_real_time_async_celluloid/Gemfile +0 -6
  305. data/examples/hi_real_time_async_celluloid/hi.rb +0 -36
  306. data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
  307. data/lib/slack/real_time/concurrency/celluloid.rb +0 -117
  308. data/lib/slack/real_time/concurrency/eventmachine.rb +0 -60
  309. data/lib/slack/web/api/endpoints/apps_permissions.rb +0 -35
  310. data/lib/slack/web/api/endpoints/channels.rb +0 -265
  311. data/lib/slack/web/api/endpoints/groups.rb +0 -255
  312. data/lib/slack/web/api/endpoints/im.rb +0 -113
  313. data/lib/slack/web/api/endpoints/mpim.rb +0 -98
  314. data/lib/slack/web/api/endpoints/presence.rb +0 -23
  315. data/lib/slack/web/api/mixins/channels.id.json +0 -20
  316. data/lib/slack/web/api/mixins/channels.id.rb +0 -26
  317. data/lib/slack/web/api/mixins/groups.id.json +0 -20
  318. data/lib/slack/web/api/mixins/groups.id.rb +0 -26
  319. data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +0 -13
  320. data/lib/slack/web/api/patches/chat.2.attachments-json.patch +0 -17
  321. data/lib/slack/web/api/patches/chat.3.update-attachments-support.patch +0 -21
  322. data/lib/slack/web/api/patches/chat.4.postEphemeral-attachments-support.patch +0 -17
  323. data/lib/slack/web/api/patches/dialog.1.open-json-support.patch +0 -17
  324. data/lib/slack/web/api/templates/commands.erb +0 -5
  325. data/screenshots/register-bot.png +0 -0
  326. data/spec/fixtures/slack/web/429_error.yml +0 -85
  327. data/spec/fixtures/slack/web/auth_test_error.yml +0 -48
  328. data/spec/fixtures/slack/web/auth_test_success.yml +0 -57
  329. data/spec/fixtures/slack/web/channels_info.yml +0 -46
  330. data/spec/fixtures/slack/web/groups_info.yml +0 -43
  331. data/spec/fixtures/slack/web/paginated_users_list.yml +0 -181
  332. data/spec/fixtures/slack/web/rtm_connect.yml +0 -70
  333. data/spec/fixtures/slack/web/rtm_start.yml +0 -104
  334. data/spec/fixtures/slack/web/users_info.yml +0 -130
  335. data/spec/fixtures/slack/web/users_list.yml +0 -72
  336. data/spec/integration/integration_spec.rb +0 -139
  337. data/spec/slack/config_spec.rb +0 -14
  338. data/spec/slack/messages/formatting_spec.rb +0 -43
  339. data/spec/slack/real_time/api/message_spec.rb +0 -15
  340. data/spec/slack/real_time/api/ping_spec.rb +0 -15
  341. data/spec/slack/real_time/api/typing_spec.rb +0 -15
  342. data/spec/slack/real_time/client_spec.rb +0 -425
  343. data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -62
  344. data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -47
  345. data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +0 -19
  346. data/spec/slack/real_time/event_handlers/bot_spec.rb +0 -44
  347. data/spec/slack/real_time/event_handlers/channel_spec.rb +0 -116
  348. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +0 -15
  349. data/spec/slack/real_time/event_handlers/group_spec.rb +0 -90
  350. data/spec/slack/real_time/event_handlers/im_spec.rb +0 -47
  351. data/spec/slack/real_time/event_handlers/team_spec.rb +0 -62
  352. data/spec/slack/real_time/event_handlers/user_spec.rb +0 -63
  353. data/spec/slack/real_time/rtm_connect_spec.rb +0 -13
  354. data/spec/slack/real_time/rtm_start_spec.rb +0 -13
  355. data/spec/slack/real_time/store_spec.rb +0 -11
  356. data/spec/slack/slack_spec.rb +0 -58
  357. data/spec/slack/version_spec.rb +0 -7
  358. data/spec/slack/web/api/endpoints/api_spec.rb +0 -7
  359. data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +0 -15
  360. data/spec/slack/web/api/endpoints/bots_spec.rb +0 -7
  361. data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -100
  362. data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +0 -25
  363. data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +0 -11
  364. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +0 -105
  365. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +0 -28
  366. data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +0 -11
  367. data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +0 -33
  368. data/spec/slack/web/api/endpoints/dnd_spec.rb +0 -12
  369. data/spec/slack/web/api/endpoints/emoji_spec.rb +0 -7
  370. data/spec/slack/web/api/endpoints/files_comments_spec.rb +0 -34
  371. data/spec/slack/web/api/endpoints/files_spec.rb +0 -43
  372. data/spec/slack/web/api/endpoints/im_spec.rb +0 -38
  373. data/spec/slack/web/api/endpoints/migration_spec.rb +0 -12
  374. data/spec/slack/web/api/endpoints/mpim_spec.rb +0 -38
  375. data/spec/slack/web/api/endpoints/oauth_spec.rb +0 -29
  376. data/spec/slack/web/api/endpoints/pins_spec.rb +0 -22
  377. data/spec/slack/web/api/endpoints/reactions_spec.rb +0 -17
  378. data/spec/slack/web/api/endpoints/reminders_spec.rb +0 -30
  379. data/spec/slack/web/api/endpoints/rtm_spec.rb +0 -7
  380. data/spec/slack/web/api/endpoints/search_spec.rb +0 -22
  381. data/spec/slack/web/api/endpoints/stars_spec.rb +0 -7
  382. data/spec/slack/web/api/endpoints/team_profile_spec.rb +0 -7
  383. data/spec/slack/web/api/endpoints/team_spec.rb +0 -7
  384. data/spec/slack/web/api/endpoints/usergroups_spec.rb +0 -27
  385. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +0 -20
  386. data/spec/slack/web/api/endpoints/users_admin_spec.rb +0 -17
  387. data/spec/slack/web/api/endpoints/users_prefs_spec.rb +0 -7
  388. data/spec/slack/web/api/endpoints/users_profile_spec.rb +0 -7
  389. data/spec/slack/web/api/error_spec.rb +0 -14
  390. data/spec/slack/web/api/errors/slack_error_spec.rb +0 -14
  391. data/spec/slack/web/api/mixins/channels_spec.rb +0 -31
  392. data/spec/slack/web/api/mixins/groups_spec.rb +0 -31
  393. data/spec/slack/web/api/mixins/users_spec.rb +0 -39
  394. data/spec/slack/web/api/pagination/cursor_spec.rb +0 -70
  395. data/spec/slack/web/client_spec.rb +0 -174
  396. data/spec/spec_helper.rb +0 -14
  397. data/spec/support/queue_with_timeout.rb +0 -34
  398. data/spec/support/real_time/concurrency/mock.rb +0 -30
  399. data/spec/support/real_time/connected_client.rb +0 -21
  400. data/spec/support/real_time/event.rb +0 -11
  401. data/spec/support/token.rb +0 -10
  402. data/spec/support/vcr.rb +0 -9
  403. /data/examples/{hi_real_time_async_celluloid → hi_real_time_async_async}/Procfile +0 -0
data/bin/slack CHANGED
@@ -1,52 +1,56 @@
1
1
  #!/usr/bin/env ruby
2
-
3
2
  require 'gli'
4
- require 'slack-ruby-client'
5
-
6
- include GLI::App
7
-
8
- program_desc 'Slack client.'
9
-
10
- default_command :help
11
-
12
- switch %i[d debug], desc: 'Enable debug-level logging.', default_value: false
13
- flag [:t, 'slack-api-token'], desc: 'Slack API token.', default_value: ENV['SLACK_API_TOKEN']
14
- flag ['vcr-cassette-name'], desc: 'Offline VCR cassette.'
15
-
16
- pre do |global_options, _command, options, _args|
17
- # global Slack configuration
18
- Slack.config.token = global_options['slack-api-token']
19
- help_now! 'Set Slack API token via --slack-api-token or SLACK_API_TOKEN.' unless Slack.config.token && !Slack.config.token.empty?
20
-
21
- if global_options['debug']
22
- require 'logger'
23
- logger = Logger.new(STDOUT)
24
- logger.level = Logger::DEBUG
25
- Slack::Web::Client.config.logger = logger
26
- end
27
-
28
- $client = Slack::Web::Client.new
29
-
30
- # Offline VCR cassette
31
- if global_options['vcr-cassette-name']
32
- require 'webmock'
33
- WebMock.enable!
34
- require 'vcr'
35
- VCR.configure do |config|
36
- config.cassette_library_dir = 'spec/fixtures/slack'
37
- config.hook_into :webmock
38
- config.default_cassette_options = { record: :new_episodes }
3
+ require 'slack_ruby_client'
4
+
5
+ module Slack
6
+ module Cli
7
+ class App
8
+ extend GLI::App
9
+
10
+ program_desc 'Slack client.'
11
+
12
+ default_command :help
13
+
14
+ switch %i[d debug], desc: 'Enable debug-level logging.', default_value: false
15
+ flag [:t, 'slack-api-token'], desc: 'Slack API token.', default_value: ENV['SLACK_API_TOKEN']
16
+ flag ['vcr-cassette-name'], desc: 'Offline VCR cassette.'
17
+
18
+ commands_from File.expand_path('commands', __dir__)
19
+
20
+ pre do |global_options, _command, options, _args|
21
+ # global Slack configuration
22
+ Slack.config.token = global_options['slack-api-token']
23
+ help_now! 'Set Slack API token via --slack-api-token or SLACK_API_TOKEN.' unless Slack.config.token && !Slack.config.token.empty?
24
+
25
+ if global_options['debug']
26
+ require 'logger'
27
+ logger = Logger.new(STDOUT)
28
+ logger.level = Logger::DEBUG
29
+ Slack::Web::Client.config.logger = logger
30
+ end
31
+
32
+ @client = Slack::Web::Client.new
33
+
34
+ # Offline VCR cassette
35
+ if global_options['vcr-cassette-name']
36
+ require 'webmock'
37
+ WebMock.enable!
38
+ require 'vcr'
39
+ VCR.configure do |config|
40
+ config.cassette_library_dir = 'spec/fixtures/slack'
41
+ config.hook_into :webmock
42
+ config.default_cassette_options = { record: :new_episodes }
43
+ end
44
+ VCR.insert_cassette global_options['vcr-cassette-name']
45
+ end
46
+
47
+ # remove any nil values from options
48
+ options.compact!
49
+
50
+ true
51
+ end
39
52
  end
40
- VCR.insert_cassette global_options['vcr-cassette-name']
41
53
  end
42
-
43
- # remove any nil values from options
44
- options.select! { |_k, v| v }
45
-
46
- true
47
54
  end
48
55
 
49
- $LOAD_PATH.push File.expand_path('..', __FILE__)
50
- require 'commands'
51
-
52
- exit run(ARGV)
56
+ exit Slack::Cli::App.run(ARGV)
@@ -0,0 +1 @@
1
+ SLACK_API_TOKEN=
@@ -1,5 +1,5 @@
1
+ # frozen_string_literal: true
1
2
  source 'http://rubygems.org'
2
3
 
4
+ gem 'dotenv'
3
5
  gem 'slack-ruby-client', path: '../..'
4
-
5
- gem 'celluloid-io', require: ['celluloid/current', 'celluloid/io']
@@ -0,0 +1,13 @@
1
+ Samples for using `files_upload_v2`.
2
+
3
+ ## Usage
4
+
5
+ Create a Slack app and obtain a User OAuth Token [here](https://api.slack.com/tutorials/tracks/getting-a-token) or use the [oauth_v2](../oauth_v2) example to obtain a User OAuth Token.
6
+ Make sure to select `files:write` and `files:read` scopes under "User Token Scopes".
7
+
8
+ Create `.env` file with `SLACK_API_TOKEN` or set the `SLACK_API_TOKEN` environment variable.
9
+
10
+ ```
11
+ bundle install
12
+ bundle exec dotenv ruby files_upload_v2.rb
13
+ ```
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+ require 'slack-ruby-client'
3
+ require 'securerandom'
4
+
5
+ Slack.configure do |config|
6
+ config.token = ENV['SLACK_API_TOKEN']
7
+ raise 'Missing ENV[SLACK_API_TOKEN]!' unless config.token
8
+ end
9
+
10
+ client = Slack::Web::Client.new
11
+
12
+ auth = client.auth_test
13
+ puts "Connected to team #{auth.team} (#{auth.team_id}) as #{auth.user}."
14
+
15
+ puts client.files_upload_v2(
16
+ filename: 'files_upload_v2.txt',
17
+ content: SecureRandom.hex
18
+ ).files.first.permalink_public
19
+
20
+ puts client.files_upload_v2(
21
+ filename: 'files_upload_v2_to_general_channel.txt',
22
+ content: SecureRandom.hex,
23
+ channel: '#general'
24
+ ).files.first.permalink_public
25
+
26
+ puts client.files_upload_v2(
27
+ filename: 'files_upload_v2_to_general_and_random_channels.txt',
28
+ content: SecureRandom.hex,
29
+ channels: ['#general', '#random']
30
+ ).files.first.permalink_public
31
+
32
+ channel_id = client.conversations_id(channel: '#general')['channel']['id']
33
+ puts client.files_upload_v2(
34
+ filename: 'files_upload_v2_to_general_by_id.txt',
35
+ content: SecureRandom.hex,
36
+ channel_id: channel_id
37
+ ).files.first.permalink_public
38
+
39
+ client.files_upload_v2(
40
+ files: [
41
+ { filename: 'files_upload_v2_to_general_first_file.txt', content: SecureRandom.hex },
42
+ { filename: 'files_upload_v2_to_general_second_file.txt', content: SecureRandom.hex }
43
+ ],
44
+ channels: ['#general']
45
+ ).files.each { |file| puts file.permalink_public }
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  source 'http://rubygems.org'
2
3
 
3
4
  gem 'slack-ruby-client', path: '../..'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'slack-ruby-client'
2
3
 
3
4
  Slack.configure do |config|
@@ -8,15 +9,18 @@ end
8
9
  client = Slack::RealTime::Client.new
9
10
 
10
11
  client.on :hello do
11
- puts "Successfully connected, welcome '#{client.self.name}' to the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
12
+ puts(
13
+ "Successfully connected, welcome '#{client.self.name}' " \
14
+ "to the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
15
+ )
12
16
  end
13
17
 
14
18
  client.on :message do |data|
15
19
  puts data
16
20
  case data.text
17
- when 'bot hi' then
21
+ when 'bot hi'
18
22
  client.web_client.chat_postMessage channel: data.channel, text: "Hi <@#{data.user}>!"
19
- when /^bot/ then
23
+ when /^bot/
20
24
  client.web_client.chat_postMessage channel: data.channel, text: "Sorry <@#{data.user}>, what?"
21
25
  end
22
26
  end
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  source 'http://rubygems.org'
2
3
 
3
4
  gem 'slack-ruby-client', path: '../..'
4
5
 
5
- gem 'faye-websocket'
6
+ gem 'async-websocket'
6
7
  gem 'foreman'
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  require 'slack-ruby-client'
3
+ require 'async'
2
4
 
3
5
  raise 'Missing ENV[SLACK_API_TOKENS]!' unless ENV.key?('SLACK_API_TOKENS')
4
6
 
@@ -6,13 +8,18 @@ $stdout.sync = true
6
8
  logger = Logger.new($stdout)
7
9
  logger.level = Logger::DEBUG
8
10
 
11
+ threads = []
12
+
9
13
  ENV['SLACK_API_TOKENS'].split.each do |token|
10
14
  logger.info "Starting #{token[0..12]} ..."
11
15
 
12
16
  client = Slack::RealTime::Client.new(token: token)
13
17
 
14
18
  client.on :hello do
15
- logger.info "Successfully connected, welcome '#{client.self.name}' to the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
19
+ logger.info(
20
+ "Successfully connected, welcome '#{client.self.name}' to " \
21
+ "the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
22
+ )
16
23
  end
17
24
 
18
25
  client.on :message do |data|
@@ -21,16 +28,14 @@ ENV['SLACK_API_TOKENS'].split.each do |token|
21
28
  client.typing channel: data.channel
22
29
 
23
30
  case data.text
24
- when 'bot hi' then
31
+ when /hi/
25
32
  client.message channel: data.channel, text: "Hi <@#{data.user}>!"
26
- when /^bot/ then
33
+ else
27
34
  client.message channel: data.channel, text: "Sorry <@#{data.user}>, what?"
28
35
  end
29
36
  end
30
37
 
31
- client.start_async
38
+ threads << client.start_async
32
39
  end
33
40
 
34
- loop do
35
- Thread.pass
36
- end
41
+ threads.each(&:join)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  source 'http://rubygems.org'
2
3
 
3
4
  gem 'slack-ruby-client', path: '../..'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'slack-ruby-client'
2
3
 
3
4
  Slack.configure do |config|
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  source 'http://rubygems.org'
2
3
 
3
4
  gem 'slack-ruby-client', path: '../..'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'slack-ruby-client'
2
3
 
3
4
  Slack.configure do |config|
@@ -0,0 +1,4 @@
1
+ SLACK_CLIENT_ID=
2
+ SLACK_CLIENT_SECRET=
3
+ REDIRECT_URI=https://...ngrok-free.app
4
+ SCOPE=files:read,files:write,files:write:user
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+ source 'http://rubygems.org'
3
+
4
+ gem 'activesupport'
5
+ gem 'dotenv'
6
+ gem 'slack-ruby-client', path: '../..'
7
+ gem 'webrick'
@@ -0,0 +1,33 @@
1
+ Obtain a user OAuth token from Slack.
2
+
3
+ Create a Slack app [here](https://api.slack.com/tutorials/tracks/getting-a-token).
4
+
5
+ The new app has a pre-configured User OAuth Token which you can use for most of the examples.
6
+ However you may want to obtain a token for a different user, which can be accomplished as follows.
7
+
8
+ To test locally use [ngrok](https://ngrok.com/) to expose your local server to the internet.
9
+
10
+ ```sh
11
+ ngrok http 4242
12
+ ```
13
+
14
+ Add the ngrok URL to the app's "Redirect URLs" under "OAuth & Permissions" in the app's settings.
15
+
16
+ Create a `.env` file with the following:
17
+
18
+ ```
19
+ SLACK_CLIENT_ID=[App Client ID]
20
+ SLACK_CLIENT_SECRET=[App Client Secret]
21
+ REDIRECT_URI=[Your ngrok URL, e.g. https://...ngrok-free.app]
22
+ SCOPE=[Bot User OAuth Scopes Requested]
23
+ USER_SCOPE=[User OAuth Token Scopes Requested]
24
+ ```
25
+
26
+ Run the example.
27
+
28
+ ```sh
29
+ bundle install
30
+ bundle exec dotenv ruby oauth_v2.rb
31
+ ```
32
+
33
+ A browser window will open to complete the OAuth flow.
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'dotenv/load'
5
+ require 'webrick'
6
+ require 'slack-ruby-client'
7
+ require 'active_support'
8
+ require 'active_support/core_ext/object/to_query'
9
+
10
+ server = WEBrick::HTTPServer.new(Port: ENV['PORT'] || 4242)
11
+
12
+ trap 'INT' do
13
+ server.shutdown
14
+ end
15
+
16
+ server.mount_proc '/' do |req, res|
17
+ client = Slack::Web::Client.new
18
+
19
+ response = client.oauth_v2_access(
20
+ req.query.merge(
21
+ client_id: ENV['SLACK_CLIENT_ID'],
22
+ client_secret: ENV['SLACK_CLIENT_SECRET'],
23
+ grant_type: 'authorization_code'
24
+ )
25
+ )
26
+
27
+ pp response
28
+
29
+ res.body = %(
30
+ <html>
31
+ <body>
32
+ <ul>
33
+ <li>bot access_token: #{response.access_token}</li>
34
+ <li>token_type: #{response.token_type}</li>
35
+ <li>app_id: #{response.app_id}</li>
36
+ <li>scope: #{response.scope}</li>
37
+ <li>user: #{response.authed_user.id}</li>
38
+ <li>user access token: #{response.authed_user.access_token}</li>
39
+ </ul>
40
+ <body>
41
+ </html>
42
+ )
43
+
44
+ pp Slack::Web::Client.new(token: response.authed_user.access_token || response.access_token).auth_test
45
+
46
+ server.shutdown
47
+ end
48
+
49
+ query = {
50
+ client_id: ENV['SLACK_CLIENT_ID'],
51
+ redirect_uri: ENV['REDIRECT_URI'],
52
+ scope: ENV['SCOPE'],
53
+ user_scope: ENV['USER_SCOPE']
54
+ }
55
+
56
+ url = "https://slack.com/oauth/v2/authorize?#{query.to_query}"
57
+ puts "Opening browser at #{url}."
58
+ system 'open', url
59
+
60
+ server.start
data/lib/slack/config.rb CHANGED
@@ -1,9 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module Config
3
4
  extend self
4
5
 
5
- attr_accessor :token
6
- attr_accessor :logger
6
+ attr_accessor :token, :logger
7
7
 
8
8
  def reset
9
9
  self.token = nil
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ module Slack
3
+ module Events
4
+ module Config
5
+ extend self
6
+
7
+ ATTRIBUTES = %i[
8
+ signing_secret
9
+ signature_expires_in
10
+ ].freeze
11
+
12
+ attr_accessor(*Config::ATTRIBUTES)
13
+
14
+ def reset
15
+ self.signing_secret = ENV['SLACK_SIGNING_SECRET']
16
+ self.signature_expires_in = 5 * 60
17
+ end
18
+ end
19
+
20
+ class << self
21
+ def configure
22
+ block_given? ? yield(Config) : Config
23
+ end
24
+
25
+ def config
26
+ Config
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ Slack::Events::Config.reset
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Slack
4
+ module Events
5
+ class Request
6
+ class MissingSigningSecret < StandardError; end
7
+
8
+ class TimestampExpired < StandardError; end
9
+
10
+ class InvalidSignature < StandardError; end
11
+
12
+ attr_reader :http_request,
13
+ :signing_secret,
14
+ :signature_expires_in
15
+
16
+ def initialize(http_request, options = {})
17
+ @http_request = http_request
18
+ @signing_secret = options[:signing_secret] || Slack::Events.config.signing_secret
19
+ @signature_expires_in =
20
+ options[:signature_expires_in] || Slack::Events.config.signature_expires_in
21
+ end
22
+
23
+ # Request timestamp.
24
+ def timestamp
25
+ @timestamp ||= http_request.get_header('HTTP_X_SLACK_REQUEST_TIMESTAMP')
26
+ end
27
+
28
+ # The signature is created by combining the signing secret with the body of the request
29
+ # Slack is sending using a standard HMAC-SHA256 keyed hash.
30
+ def signature
31
+ @signature ||= http_request.get_header('HTTP_X_SLACK_SIGNATURE')
32
+ end
33
+
34
+ # Signature version.
35
+ def version
36
+ 'v0'
37
+ end
38
+
39
+ # Request body.
40
+ def body
41
+ @body ||= begin
42
+ input = http_request.body
43
+ input.rewind
44
+ body = input.read
45
+ input.rewind
46
+ body
47
+ end
48
+ end
49
+
50
+ # Returns true if the signature coming from Slack has expired.
51
+ def expired?
52
+ timestamp.nil? || (Time.now.to_i - timestamp.to_i).abs > signature_expires_in
53
+ end
54
+
55
+ # Returns true if the signature coming from Slack is valid.
56
+ def valid?
57
+ raise MissingSigningSecret unless signing_secret
58
+ raise InvalidSignature unless signature
59
+
60
+ digest = OpenSSL::Digest.new('SHA256')
61
+ signature_basestring = [version, timestamp, body].join(':')
62
+ hex_hash = OpenSSL::HMAC.hexdigest(digest, signing_secret, signature_basestring)
63
+ computed_signature = [version, hex_hash].join('=')
64
+ Utils::Security.secure_compare(computed_signature, signature)
65
+ end
66
+
67
+ # Validates the request signature and its expiration.
68
+ def verify!
69
+ raise TimestampExpired if expired?
70
+ raise InvalidSignature unless valid?
71
+
72
+ true
73
+ end
74
+ end
75
+ end
76
+ end
data/lib/slack/logger.rb CHANGED
@@ -1,13 +1,14 @@
1
+ # frozen_string_literal: true
1
2
  require 'logger'
2
3
 
3
4
  module Slack
4
5
  class Logger < ::Logger
5
6
  def self.default
6
- @logger ||= begin
7
- logger = new STDOUT
8
- logger.level = Logger::WARN
9
- logger
10
- end
7
+ return @default if @default
8
+
9
+ logger = new STDOUT
10
+ logger.level = Logger::WARN
11
+ @default = logger
11
12
  end
12
13
  end
13
14
  end
@@ -1,4 +1,4 @@
1
-
1
+ # frozen_string_literal: true
2
2
  module Slack
3
3
  module Messages
4
4
  module Formatting
@@ -24,6 +24,71 @@ module Slack
24
24
  end
25
25
  end)
26
26
  end
27
+
28
+ #
29
+ # Escape a message.
30
+ # @see https://api.slack.com/reference/surfaces/formatting#escaping
31
+ #
32
+ def escape(message)
33
+ message
34
+ .gsub('&', '&amp;')
35
+ .gsub('>', '&gt;')
36
+ .gsub('<', '&lt;')
37
+ end
38
+
39
+ #
40
+ # Format a DateTime or Time object as a date and time in a Slack message
41
+ # @see https://api.slack.com/reference/surfaces/formatting#date-formatting
42
+ #
43
+ def date(time, format: '{date_num} {time_secs}', link: nil, text: nil)
44
+ args = [time.to_i, format, link].compact
45
+ "<!date^#{args.join('^')}|#{text || time}>"
46
+ end
47
+
48
+ #
49
+ # Embed a link to a Slack channel in a message by channel ID
50
+ # @see https://api.slack.com/reference/surfaces/formatting#linking-channels
51
+ #
52
+ def channel_link(channel_id)
53
+ "<##{channel_id}>"
54
+ end
55
+
56
+ #
57
+ # Embed a link to a user in a message by user ID
58
+ # @see https://api.slack.com/reference/surfaces/formatting#mentioning-users
59
+ #
60
+ def user_link(user_id)
61
+ "<@#{user_id}>"
62
+ end
63
+
64
+ #
65
+ # Embed a link to a group in a message by group ID
66
+ # @see https://api.slack.com/reference/surfaces/formatting#mentioning-groups
67
+ #
68
+ def group_link(group_id)
69
+ "<!subteam^#{group_id}>"
70
+ end
71
+
72
+ #
73
+ # Embed a URL with custom link text in a message
74
+ # @see https://api.slack.com/reference/surfaces/formatting#linking-urls
75
+ #
76
+ def url_link(text, url)
77
+ "<#{url}|#{text}>"
78
+ end
79
+
80
+ #
81
+ # Converts text from basic markdown into Slack's mishmash
82
+ # @see https://api.slack.com/reference/surfaces/formatting#basic-formatting
83
+ #
84
+ def markdown(text)
85
+ text
86
+ .gsub(/(?<!\*)\*([^*\n]+)\*(?!\*)/, '_\1_') # italic
87
+ .gsub(/\*\*\*(.*?)\*\*\*/, '*_\1_*') # bold & italic
88
+ .gsub(/\*\*(.*?)\*\*/, '*\1*') # bold
89
+ .gsub(/~~(.*?)~~/, '~\1~') # strikethrough
90
+ .gsub(/\[(.*?)\]\((.*?)\)/, '<\2|\1>') # links
91
+ end
27
92
  end
28
93
  end
29
94
  end
@@ -1,10 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module Messages
3
4
  class Message < Hashie::Mash
4
- def presence
5
- super['presence']
6
- end
7
-
8
5
  def to_s
9
6
  keys.sort_by(&:to_s).map do |key|
10
7
  "#{key}=#{self[key]}"
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Api
@@ -6,12 +7,14 @@ module Slack
6
7
  # Sends a message to a channel.
7
8
  #
8
9
  # @option options [channel] :channel
9
- # Channel to send message to. Can be a public channel, private group or IM channel. Can be an encoded ID, or a name.
10
+ # Channel to send message to. Can be a public channel, private group or IM channel.
11
+ # Can be an encoded ID, or a name.
10
12
  # @option options [Object] :text
11
13
  # Text of the message to send. See below for an explanation of formatting.
12
14
  def message(options = {})
13
- throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
14
- throw ArgumentError.new('Required arguments :text missing') if options[:text].nil?
15
+ raise ArgumentError, 'Required arguments :channel missing' if options[:channel].nil?
16
+ raise ArgumentError, 'Required arguments :text missing' if options[:text].nil?
17
+
15
18
  send_json({ type: 'message', id: next_id }.merge(options))
16
19
  end
17
20
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Api