slack-ruby-client 0.13.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (385) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +29 -5
  5. data/.rubocop_todo.yml +124 -44
  6. data/.travis.yml +5 -8
  7. data/CHANGELOG.md +92 -2
  8. data/CONTRIBUTING.md +19 -8
  9. data/Dangerfile +2 -0
  10. data/Gemfile +10 -5
  11. data/LICENSE.md +1 -1
  12. data/README.md +186 -49
  13. data/RELEASING.md +1 -1
  14. data/Rakefile +2 -1
  15. data/UPGRADING.md +72 -2
  16. data/bin/commands/admin_analytics.rb +16 -0
  17. data/bin/commands/admin_apps.rb +51 -0
  18. data/bin/commands/admin_apps_approved.rb +17 -0
  19. data/bin/commands/admin_apps_requests.rb +17 -0
  20. data/bin/commands/admin_apps_restricted.rb +17 -0
  21. data/bin/commands/admin_auth_policy.rb +39 -0
  22. data/bin/commands/admin_barriers.rb +47 -0
  23. data/bin/commands/admin_conversations.rb +169 -0
  24. data/bin/commands/admin_conversations_ekm.rb +17 -0
  25. data/bin/commands/admin_conversations_restrictAccess.rb +37 -0
  26. data/bin/commands/admin_conversations_whitelist.rb +37 -0
  27. data/bin/commands/admin_emoji.rb +54 -0
  28. data/bin/commands/admin_inviteRequests.rb +36 -0
  29. data/bin/commands/admin_inviteRequests_approved.rb +16 -0
  30. data/bin/commands/admin_inviteRequests_denied.rb +16 -0
  31. data/bin/commands/admin_teams.rb +27 -0
  32. data/bin/commands/admin_teams_admins.rb +16 -0
  33. data/bin/commands/admin_teams_owners.rb +16 -0
  34. data/bin/commands/admin_teams_settings.rb +64 -0
  35. data/bin/commands/admin_usergroups.rb +48 -0
  36. data/bin/commands/admin_users.rb +98 -0
  37. data/bin/commands/admin_users_session.rb +78 -0
  38. data/bin/commands/api.rb +1 -1
  39. data/bin/commands/apps.rb +15 -0
  40. data/bin/commands/apps_connections.rb +13 -0
  41. data/bin/commands/apps_event_authorizations.rb +16 -0
  42. data/bin/commands/apps_manifest.rb +51 -0
  43. data/bin/commands/apps_permissions.rb +1 -0
  44. data/bin/commands/apps_permissions_resources.rb +1 -0
  45. data/bin/commands/apps_permissions_scopes.rb +1 -0
  46. data/bin/commands/apps_permissions_users.rb +1 -0
  47. data/bin/commands/auth.rb +1 -0
  48. data/bin/commands/auth_teams.rb +16 -0
  49. data/bin/commands/bots.rb +2 -0
  50. data/bin/commands/calls.rb +52 -0
  51. data/bin/commands/calls_participants.rb +25 -0
  52. data/bin/commands/channels.rb +1 -153
  53. data/bin/commands/chat.rb +56 -12
  54. data/bin/commands/chat_scheduledMessages.rb +19 -0
  55. data/bin/commands/conversations.rb +75 -5
  56. data/bin/commands/dialog.rb +1 -0
  57. data/bin/commands/dnd.rb +6 -3
  58. data/bin/commands/emoji.rb +1 -0
  59. data/bin/commands/files.rb +10 -18
  60. data/bin/commands/files_comments.rb +1 -21
  61. data/bin/commands/files_remote.rb +78 -0
  62. data/bin/commands/groups.rb +1 -161
  63. data/bin/commands/im.rb +1 -62
  64. data/bin/commands/migration.rb +2 -0
  65. data/bin/commands/mpim.rb +1 -60
  66. data/bin/commands/oauth.rb +2 -14
  67. data/bin/commands/oauth_v2.rb +29 -0
  68. data/bin/commands/openid_connect.rb +27 -0
  69. data/bin/commands/pins.rb +3 -6
  70. data/bin/commands/reactions.rb +3 -3
  71. data/bin/commands/reminders.rb +7 -0
  72. data/bin/commands/rtm.rb +3 -2
  73. data/bin/commands/search.rb +6 -1
  74. data/bin/commands/stars.rb +8 -6
  75. data/bin/commands/team.rb +5 -0
  76. data/bin/commands/team_billing.rb +13 -0
  77. data/bin/commands/team_preferences.rb +13 -0
  78. data/bin/commands/team_profile.rb +1 -0
  79. data/bin/commands/tooling_tokens.rb +14 -0
  80. data/bin/commands/usergroups.rb +7 -1
  81. data/bin/commands/usergroups_users.rb +3 -0
  82. data/bin/commands/users.rb +6 -4
  83. data/bin/commands/users_admin.rb +1 -0
  84. data/bin/commands/users_prefs.rb +1 -0
  85. data/bin/commands/users_profile.rb +6 -5
  86. data/bin/commands/views.rb +48 -0
  87. data/bin/commands/workflows.rb +38 -0
  88. data/bin/commands.rb +38 -8
  89. data/bin/slack +2 -3
  90. data/examples/hi_real_time_and_web/Gemfile +1 -0
  91. data/examples/hi_real_time_and_web/hi.rb +7 -3
  92. data/examples/hi_real_time_async_async/Gemfile +1 -0
  93. data/examples/hi_real_time_async_async/hi.rb +6 -2
  94. data/examples/hi_web/Gemfile +1 -0
  95. data/examples/hi_web/hi.rb +1 -0
  96. data/examples/new_ticket/Gemfile +1 -0
  97. data/examples/new_ticket/new_ticket.rb +1 -0
  98. data/lib/slack/config.rb +2 -2
  99. data/lib/slack/events/config.rb +32 -0
  100. data/lib/slack/events/request.rb +72 -0
  101. data/lib/slack/logger.rb +6 -5
  102. data/lib/slack/messages/formatting.rb +1 -0
  103. data/lib/slack/messages/message.rb +1 -4
  104. data/lib/slack/real_time/api/message.rb +3 -1
  105. data/lib/slack/real_time/api/message_id.rb +1 -0
  106. data/lib/slack/real_time/api/ping.rb +5 -2
  107. data/lib/slack/real_time/api/typing.rb +3 -1
  108. data/lib/slack/real_time/client.rb +101 -32
  109. data/lib/slack/real_time/concurrency/async.rb +77 -6
  110. data/lib/slack/real_time/concurrency.rb +1 -2
  111. data/lib/slack/real_time/config.rb +6 -10
  112. data/lib/slack/real_time/models/base.rb +1 -4
  113. data/lib/slack/real_time/models/bot.rb +1 -0
  114. data/lib/slack/real_time/models/channel.rb +1 -0
  115. data/lib/slack/real_time/models/group.rb +1 -0
  116. data/lib/slack/real_time/models/im.rb +1 -0
  117. data/lib/slack/real_time/models/team.rb +1 -0
  118. data/lib/slack/real_time/models/user.rb +1 -0
  119. data/lib/slack/real_time/models.rb +1 -0
  120. data/lib/slack/real_time/socket.rb +45 -17
  121. data/lib/slack/real_time/stores/base.rb +5 -7
  122. data/lib/slack/real_time/stores/starter.rb +17 -3
  123. data/lib/slack/real_time/stores/store.rb +33 -25
  124. data/lib/slack/real_time/stores.rb +1 -0
  125. data/lib/slack/version.rb +2 -1
  126. data/lib/slack/web/api/endpoints/admin_analytics.rb +28 -0
  127. data/lib/slack/web/api/endpoints/admin_apps.rb +78 -0
  128. data/lib/slack/web/api/endpoints/admin_apps_approved.rb +35 -0
  129. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +35 -0
  130. data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +35 -0
  131. data/lib/slack/web/api/endpoints/admin_auth_policy.rb +72 -0
  132. data/lib/slack/web/api/endpoints/admin_barriers.rb +82 -0
  133. data/lib/slack/web/api/endpoints/admin_conversations.rb +260 -0
  134. data/lib/slack/web/api/endpoints/admin_conversations_ekm.rb +35 -0
  135. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +61 -0
  136. data/lib/slack/web/api/endpoints/admin_conversations_whitelist.rb +64 -0
  137. data/lib/slack/web/api/endpoints/admin_emoji.rb +88 -0
  138. data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +61 -0
  139. data/lib/slack/web/api/endpoints/admin_inviteRequests_approved.rb +33 -0
  140. data/lib/slack/web/api/endpoints/admin_inviteRequests_denied.rb +33 -0
  141. data/lib/slack/web/api/endpoints/admin_teams.rb +50 -0
  142. data/lib/slack/web/api/endpoints/admin_teams_admins.rb +34 -0
  143. data/lib/slack/web/api/endpoints/admin_teams_owners.rb +34 -0
  144. data/lib/slack/web/api/endpoints/admin_teams_settings.rb +99 -0
  145. data/lib/slack/web/api/endpoints/admin_usergroups.rb +77 -0
  146. data/lib/slack/web/api/endpoints/admin_users.rb +163 -0
  147. data/lib/slack/web/api/endpoints/admin_users_session.rb +122 -0
  148. data/lib/slack/web/api/endpoints/api.rb +2 -3
  149. data/lib/slack/web/api/endpoints/apps.rb +27 -0
  150. data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
  151. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
  152. data/lib/slack/web/api/endpoints/apps_manifest.rb +75 -0
  153. data/lib/slack/web/api/endpoints/apps_permissions.rb +1 -0
  154. data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +1 -0
  155. data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +1 -0
  156. data/lib/slack/web/api/endpoints/apps_permissions_users.rb +1 -0
  157. data/lib/slack/web/api/endpoints/auth.rb +2 -1
  158. data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
  159. data/lib/slack/web/api/endpoints/bots.rb +4 -1
  160. data/lib/slack/web/api/endpoints/calls.rb +83 -0
  161. data/lib/slack/web/api/endpoints/calls_participants.rb +42 -0
  162. data/lib/slack/web/api/endpoints/channels.rb +2 -243
  163. data/lib/slack/web/api/endpoints/chat.rb +144 -47
  164. data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
  165. data/lib/slack/web/api/endpoints/conversations.rb +152 -41
  166. data/lib/slack/web/api/endpoints/dialog.rb +3 -2
  167. data/lib/slack/web/api/endpoints/dnd.rb +9 -4
  168. data/lib/slack/web/api/endpoints/emoji.rb +1 -0
  169. data/lib/slack/web/api/endpoints/files.rb +24 -29
  170. data/lib/slack/web/api/endpoints/files_comments.rb +2 -34
  171. data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
  172. data/lib/slack/web/api/endpoints/groups.rb +1 -253
  173. data/lib/slack/web/api/endpoints/im.rb +1 -101
  174. data/lib/slack/web/api/endpoints/migration.rb +5 -2
  175. data/lib/slack/web/api/endpoints/mpim.rb +1 -96
  176. data/lib/slack/web/api/endpoints/oauth.rb +7 -31
  177. data/lib/slack/web/api/endpoints/oauth_v2.rb +48 -0
  178. data/lib/slack/web/api/endpoints/openid_connect.rb +42 -0
  179. data/lib/slack/web/api/endpoints/pins.rb +8 -15
  180. data/lib/slack/web/api/endpoints/reactions.rb +20 -19
  181. data/lib/slack/web/api/endpoints/reminders.rb +18 -5
  182. data/lib/slack/web/api/endpoints/rtm.rb +11 -10
  183. data/lib/slack/web/api/endpoints/search.rb +28 -13
  184. data/lib/slack/web/api/endpoints/stars.rb +14 -11
  185. data/lib/slack/web/api/endpoints/team.rb +13 -4
  186. data/lib/slack/web/api/endpoints/team_billing.rb +21 -0
  187. data/lib/slack/web/api/endpoints/team_preferences.rb +21 -0
  188. data/lib/slack/web/api/endpoints/team_profile.rb +2 -1
  189. data/lib/slack/web/api/endpoints/tooling_tokens.rb +24 -0
  190. data/lib/slack/web/api/endpoints/usergroups.rb +27 -16
  191. data/lib/slack/web/api/endpoints/usergroups_users.rb +10 -5
  192. data/lib/slack/web/api/endpoints/users.rb +21 -20
  193. data/lib/slack/web/api/endpoints/users_admin.rb +1 -0
  194. data/lib/slack/web/api/endpoints/users_prefs.rb +1 -0
  195. data/lib/slack/web/api/endpoints/users_profile.rb +8 -7
  196. data/lib/slack/web/api/endpoints/views.rb +97 -0
  197. data/lib/slack/web/api/endpoints/workflows.rb +61 -0
  198. data/lib/slack/web/api/endpoints.rb +76 -18
  199. data/lib/slack/web/api/error.rb +1 -0
  200. data/lib/slack/web/api/errors/server_error.rb +37 -0
  201. data/lib/slack/web/api/errors/slack_error.rb +14 -1
  202. data/lib/slack/web/api/errors/too_many_requests_error.rb +2 -4
  203. data/lib/slack/web/api/errors.rb +1040 -0
  204. data/lib/slack/web/api/mixins/{channels.id.rb → conversations.id.rb} +4 -5
  205. data/lib/slack/web/api/mixins/ids.id.rb +3 -2
  206. data/lib/slack/web/api/mixins/users.id.rb +2 -3
  207. data/lib/slack/web/api/mixins/users.search.rb +1 -0
  208. data/lib/slack/web/api/mixins.rb +2 -2
  209. data/lib/slack/web/api/patches/chat.1.patch +70 -0
  210. data/lib/slack/web/api/patches/views.1.view-json.patch +40 -0
  211. data/lib/slack/web/api/patches/views.1.views-published.patch +16 -0
  212. data/lib/slack/web/api/templates/command.erb +1 -0
  213. data/lib/slack/web/api/templates/commands.erb +1 -0
  214. data/lib/slack/web/api/templates/endpoints.erb +2 -2
  215. data/lib/slack/web/api/templates/errors.erb +20 -0
  216. data/lib/slack/web/api/templates/method.erb +5 -1
  217. data/lib/slack/web/api/templates/method_spec.erb +2 -1
  218. data/lib/slack/web/client.rb +2 -1
  219. data/lib/slack/web/config.rb +3 -0
  220. data/lib/slack/web/faraday/connection.rb +24 -20
  221. data/lib/slack/web/faraday/request.rb +3 -1
  222. data/lib/slack/web/faraday/response/raise_error.rb +21 -6
  223. data/lib/slack/web/faraday/response/wrap_error.rb +24 -0
  224. data/lib/slack/web/pagination/cursor.rb +7 -7
  225. data/lib/slack-ruby-client.rb +10 -4
  226. data/lib/slack.rb +1 -0
  227. data/lib/slack_ruby_client.rb +1 -0
  228. data/lib/tasks/git.rake +1 -0
  229. data/lib/tasks/real_time.rake +15 -5
  230. data/lib/tasks/update.rake +1 -0
  231. data/lib/tasks/web.rake +39 -10
  232. data/screenshots/create-app.png +0 -0
  233. data/slack-ruby-client.gemspec +9 -6
  234. data/spec/fixtures/slack/web/429_error.yml +50 -54
  235. data/spec/fixtures/slack/web/auth_test_error.yml +51 -18
  236. data/spec/fixtures/slack/web/auth_test_success.yml +50 -26
  237. data/spec/fixtures/slack/web/conversations_info.yml +167 -0
  238. data/spec/fixtures/slack/web/conversations_setTopic.yml +84 -0
  239. data/spec/fixtures/slack/web/conversations_setTopic_one_page.yml +172 -0
  240. data/spec/fixtures/slack/web/conversations_setTopic_paginated.yml +253 -0
  241. data/spec/fixtures/slack/web/paginated_users_list.yml +501 -69
  242. data/spec/fixtures/slack/web/rtm_connect.yml +267 -30
  243. data/spec/fixtures/slack/web/rtm_start.yml +771 -60
  244. data/spec/fixtures/slack/web/users_info.yml +153 -69
  245. data/spec/fixtures/slack/web/users_list.yml +102 -41
  246. data/spec/fixtures/slack/web/views_open_error.yml +83 -0
  247. data/spec/integration/integration_spec.rb +115 -47
  248. data/spec/slack/config_spec.rb +2 -0
  249. data/spec/slack/events/config_spec.rb +33 -0
  250. data/spec/slack/events/request_spec.rb +184 -0
  251. data/spec/slack/messages/formatting_spec.rb +25 -13
  252. data/spec/slack/real_time/api/message_spec.rb +6 -1
  253. data/spec/slack/real_time/api/ping_spec.rb +2 -0
  254. data/spec/slack/real_time/api/typing_spec.rb +5 -1
  255. data/spec/slack/real_time/client_spec.rb +244 -50
  256. data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +2 -0
  257. data/spec/slack/real_time/concurrency/with_concurrency_spec.rb +10 -0
  258. data/spec/slack/real_time/concurrency/without_concurrency_spec.rb +10 -0
  259. data/spec/slack/real_time/event_handlers/bot_spec.rb +3 -2
  260. data/spec/slack/real_time/event_handlers/channel_spec.rb +10 -7
  261. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +2 -1
  262. data/spec/slack/real_time/event_handlers/group_spec.rb +5 -4
  263. data/spec/slack/real_time/event_handlers/im_spec.rb +9 -8
  264. data/spec/slack/real_time/event_handlers/team_spec.rb +3 -1
  265. data/spec/slack/real_time/event_handlers/user_spec.rb +3 -2
  266. data/spec/slack/real_time/rtm_connect_spec.rb +2 -1
  267. data/spec/slack/real_time/rtm_start_spec.rb +2 -1
  268. data/spec/slack/real_time/store_spec.rb +2 -1
  269. data/spec/slack/slack_spec.rb +40 -6
  270. data/spec/slack/version_spec.rb +2 -1
  271. data/spec/slack/web/api/endpoints/admin_analytics_spec.rb +13 -0
  272. data/spec/slack/web/api/endpoints/admin_apps_approved_spec.rb +8 -0
  273. data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +8 -0
  274. data/spec/slack/web/api/endpoints/admin_apps_restricted_spec.rb +8 -0
  275. data/spec/slack/web/api/endpoints/admin_apps_spec.rb +18 -0
  276. data/spec/slack/web/api/endpoints/admin_auth_policy_spec.rb +35 -0
  277. data/spec/slack/web/api/endpoints/admin_barriers_spec.rb +38 -0
  278. data/spec/slack/web/api/endpoints/admin_conversations_ekm_spec.rb +8 -0
  279. data/spec/slack/web/api/endpoints/admin_conversations_restrictAccess_spec.rb +32 -0
  280. data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +98 -0
  281. data/spec/slack/web/api/endpoints/admin_emoji_spec.rb +37 -0
  282. data/spec/slack/web/api/endpoints/admin_inviteRequests_approved_spec.rb +8 -0
  283. data/spec/slack/web/api/endpoints/admin_inviteRequests_denied_spec.rb +8 -0
  284. data/spec/slack/web/api/endpoints/admin_inviteRequests_spec.rb +18 -0
  285. data/spec/slack/web/api/endpoints/admin_teams_admins_spec.rb +13 -0
  286. data/spec/slack/web/api/endpoints/admin_teams_owners_spec.rb +13 -0
  287. data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +53 -0
  288. data/spec/slack/web/api/endpoints/admin_teams_spec.rb +16 -0
  289. data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +37 -0
  290. data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +41 -0
  291. data/spec/slack/web/api/endpoints/admin_users_spec.rb +67 -0
  292. data/spec/slack/web/api/endpoints/api_spec.rb +1 -0
  293. data/spec/slack/web/api/endpoints/apps_connections_spec.rb +8 -0
  294. data/spec/slack/web/api/endpoints/apps_event_authorizations_spec.rb +13 -0
  295. data/spec/slack/web/api/endpoints/apps_manifest_spec.rb +36 -0
  296. data/spec/slack/web/api/endpoints/apps_spec.rb +16 -0
  297. data/spec/slack/web/api/endpoints/{apps_permissions_scopes_spec.rb → auth_teams_spec.rb} +2 -1
  298. data/spec/slack/web/api/endpoints/bots_spec.rb +1 -0
  299. data/spec/slack/web/api/endpoints/calls_participants_spec.rb +24 -0
  300. data/spec/slack/web/api/endpoints/calls_spec.rb +31 -0
  301. data/spec/slack/web/api/endpoints/chat_scheduledMessages_spec.rb +8 -0
  302. data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +9 -7
  303. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +112 -36
  304. data/spec/slack/web/api/endpoints/custom_specs/conversations_spec.rb +13 -0
  305. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +12 -4
  306. data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +8 -3
  307. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +95 -0
  308. data/spec/slack/web/api/endpoints/dnd_spec.rb +4 -3
  309. data/spec/slack/web/api/endpoints/emoji_spec.rb +1 -0
  310. data/spec/slack/web/api/endpoints/files_comments_spec.rb +3 -21
  311. data/spec/slack/web/api/endpoints/files_remote_spec.rb +24 -0
  312. data/spec/slack/web/api/endpoints/files_spec.rb +5 -4
  313. data/spec/slack/web/api/endpoints/migration_spec.rb +1 -0
  314. data/spec/slack/web/api/endpoints/oauth_spec.rb +1 -22
  315. data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +16 -0
  316. data/spec/slack/web/api/endpoints/openid_connect_spec.rb +8 -0
  317. data/spec/slack/web/api/endpoints/pins_spec.rb +1 -0
  318. data/spec/slack/web/api/endpoints/reactions_spec.rb +8 -1
  319. data/spec/slack/web/api/endpoints/reminders_spec.rb +3 -2
  320. data/spec/slack/web/api/endpoints/rtm_spec.rb +1 -0
  321. data/spec/slack/web/api/endpoints/search_spec.rb +1 -0
  322. data/spec/slack/web/api/endpoints/stars_spec.rb +1 -0
  323. data/spec/slack/web/api/endpoints/{apps_permissions_resources_spec.rb → team_billing_spec.rb} +2 -1
  324. data/spec/slack/web/api/endpoints/team_preferences_spec.rb +8 -0
  325. data/spec/slack/web/api/endpoints/team_profile_spec.rb +1 -0
  326. data/spec/slack/web/api/endpoints/team_spec.rb +1 -0
  327. data/spec/slack/web/api/endpoints/tooling_tokens_spec.rb +13 -0
  328. data/spec/slack/web/api/endpoints/usergroups_spec.rb +1 -0
  329. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +3 -2
  330. data/spec/slack/web/api/endpoints/users_admin_spec.rb +1 -0
  331. data/spec/slack/web/api/endpoints/users_prefs_spec.rb +1 -0
  332. data/spec/slack/web/api/endpoints/users_profile_spec.rb +1 -0
  333. data/spec/slack/web/api/endpoints/workflows_spec.rb +26 -0
  334. data/spec/slack/web/api/error_spec.rb +7 -7
  335. data/spec/slack/web/api/errors/slack_error_spec.rb +26 -7
  336. data/spec/slack/web/api/mixins/conversations_list_spec.rb +21 -0
  337. data/spec/slack/web/api/mixins/conversations_spec.rb +43 -0
  338. data/spec/slack/web/api/mixins/users_spec.rb +17 -8
  339. data/spec/slack/web/api/pagination/cursor_spec.rb +41 -13
  340. data/spec/slack/web/client_spec.rb +168 -19
  341. data/spec/slack/web/faraday/request_spec.rb +80 -0
  342. data/spec/slack/web/faraday/response/raise_error_spec.rb +48 -12
  343. data/spec/spec_helper.rb +9 -2
  344. data/spec/support/queue_with_timeout.rb +5 -4
  345. data/spec/support/real_time/concurrency/mock.rb +1 -0
  346. data/spec/support/real_time/connected_client.rb +6 -6
  347. data/spec/support/real_time/event.rb +1 -0
  348. data/spec/support/token.rb +1 -0
  349. data/spec/support/vcr.rb +37 -1
  350. metadata +205 -147
  351. data/examples/hi_real_time/Gemfile +0 -5
  352. data/examples/hi_real_time/hi.gif +0 -0
  353. data/examples/hi_real_time/hi.rb +0 -37
  354. data/examples/hi_real_time_async_celluloid/Gemfile +0 -6
  355. data/examples/hi_real_time_async_celluloid/Procfile +0 -2
  356. data/examples/hi_real_time_async_celluloid/hi.rb +0 -35
  357. data/examples/hi_real_time_async_eventmachine/Gemfile +0 -6
  358. data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
  359. data/examples/hi_real_time_async_eventmachine/hi.rb +0 -35
  360. data/lib/slack/real_time/concurrency/celluloid.rb +0 -118
  361. data/lib/slack/real_time/concurrency/eventmachine.rb +0 -66
  362. data/lib/slack/web/api/mixins/channels.id.json +0 -20
  363. data/lib/slack/web/api/mixins/groups.id.json +0 -20
  364. data/lib/slack/web/api/mixins/groups.id.rb +0 -26
  365. data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +0 -13
  366. data/lib/slack/web/api/patches/chat.2.attachments-json.patch +0 -17
  367. data/lib/slack/web/api/patches/chat.3.update-attachments-support.patch +0 -21
  368. data/lib/slack/web/api/patches/chat.4.postEphemeral-attachments-support.patch +0 -17
  369. data/lib/slack/web/api/patches/chat.5.postEphemeral-text-or-attachments.patch +0 -13
  370. data/screenshots/register-bot.png +0 -0
  371. data/spec/fixtures/slack/web/503_error.yml +0 -14
  372. data/spec/fixtures/slack/web/channels_info.yml +0 -46
  373. data/spec/fixtures/slack/web/groups_info.yml +0 -43
  374. data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -106
  375. data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -47
  376. data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +0 -15
  377. data/spec/slack/web/api/endpoints/apps_permissions_users_spec.rb +0 -18
  378. data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -100
  379. data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +0 -11
  380. data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +0 -11
  381. data/spec/slack/web/api/endpoints/im_spec.rb +0 -38
  382. data/spec/slack/web/api/endpoints/mpim_spec.rb +0 -38
  383. data/spec/slack/web/api/errors/service_unavailable_spec.rb +0 -14
  384. data/spec/slack/web/api/mixins/channels_spec.rb +0 -33
  385. data/spec/slack/web/api/mixins/groups_spec.rb +0 -33
data/README.md CHANGED
@@ -2,23 +2,75 @@ Slack Ruby Client
2
2
  =================
3
3
 
4
4
  [![Gem Version](https://badge.fury.io/rb/slack-ruby-client.svg)](http://badge.fury.io/rb/slack-ruby-client)
5
- [![Build Status](https://travis-ci.org/slack-ruby/slack-ruby-client.svg?branch=master)](https://travis-ci.org/slack-ruby/slack-ruby-client)
5
+ [![Build Status](https://app.travis-ci.com/slack-ruby/slack-ruby-client.svg?branch=master)](https://app.travis-ci.com/slack-ruby/slack-ruby-client)
6
6
  [![Code Climate](https://codeclimate.com/github/slack-ruby/slack-ruby-client/badges/gpa.svg)](https://codeclimate.com/github/slack-ruby/slack-ruby-client)
7
7
 
8
- A Ruby client for the Slack [Web](https://api.slack.com/web) and [RealTime Messaging](https://api.slack.com/rtm) APIs. Comes with a handy command-line client, too. If you are not familiar with these concepts, you might want to watch [this video](http://code.dblock.org/2016/03/11/your-first-slack-bot-service-video.html).
8
+ A Ruby client for the Slack [Web](https://api.slack.com/web), [RealTime Messaging](https://api.slack.com/rtm) and [Events](https://api.slack.com/events-api) APIs. Comes with a handy command-line client, too. If you are not familiar with these concepts, you might want to watch [this video](http://code.dblock.org/2016/03/11/your-first-slack-bot-service-video.html).
9
9
 
10
10
  ![](slack.png)
11
11
 
12
+ # Table of Contents
13
+
14
+ - [Useful to Me?](#useful-to-me)
15
+ - [Stable Release](#stable-release)
16
+ - [Installation](#installation)
17
+ - [Usage](#usage)
18
+ - [Create a New Bot Integration](#create-a-new-bot-integration)
19
+ - [OAuth Code Grant](#oauth-code-grant)
20
+ - [Using the Legacy API Token](#using-the-legacy-api-token)
21
+ - [Global Settings](#global-settings)
22
+ - [Web Client](#web-client)
23
+ - [Web Client Examples](#web-client-examples)
24
+ - [Test Auth](#test-auth)
25
+ - [Send Messages](#send-messages)
26
+ - [List Channels](#list-channels)
27
+ - [Upload a File](#upload-a-file)
28
+ - [Get Channel Info](#get-channel-info)
29
+ - [Get User Info](#get-user-info)
30
+ - [Search for a User](#search-for-a-user)
31
+ - [Other](#other)
32
+ - [Web Client Options](#web-client-options)
33
+ - [Pagination Support](#pagination-support)
34
+ - [Character Encoding](#character-encoding)
35
+ - [Error Handling](#error-handling)
36
+ - [Slack Errors](#slack-errors)
37
+ - [Rate Limiting](#rate-limiting)
38
+ - [Other Errors](#other-errors)
39
+ - [RealTime Client](#realtime-client)
40
+ - [Slack::RealTime::Stores::Store](#slackrealtimestoresstore)
41
+ - [Slack::RealTime::Stores::Starter](#slackrealtimestoresstarter)
42
+ - [Configuring Slack::RealTime::Client](#configuring-slackrealtimeclient)
43
+ - [Caveats](#caveats)
44
+ - [websocket_ping](#websocket_ping)
45
+ - [Connection Methods](#connection-methods)
46
+ - [Combining RealTime and Web Clients](#combining-realtime-and-web-clients)
47
+ - [Large Team Considerations](#large-team-considerations)
48
+ - [Concurrency](#concurrency)
49
+ - [Async](#async)
50
+ - [Events API](#events-api)
51
+ - [Configuring Slack::Events](#configuring-slackevents)
52
+ - [Verifying the Request Signature](#verifying-the-request-signature)
53
+ - [Message Parsing](#message-parsing)
54
+ - [Command-Line Client](#command-line-client)
55
+ - [Authenticate with Slack](#authenticate-with-slack)
56
+ - [Send a Message](#send-a-message)
57
+ - [Get Channel Id](#get-channel-id)
58
+ - [Get Channel Info](#get-channel-info-1)
59
+ - [List Users](#list-users)
60
+ - [History](#history)
61
+ - [Contributing](#contributing)
62
+ - [Copyright and License](#copyright-and-license)
63
+
12
64
  ## Useful to Me?
13
65
 
14
- * This piece of the puzzle will help you send messages to Slack via the Web API and send and receive messages via the Real Time API.
15
- * If you're trying to respond to slash commands, just write a basic web application and use this library to call the Slack Web API.
16
- * If you're trying to build a Real Time bot, use [slack-ruby-bot](https://github.com/dblock/slack-ruby-bot), which uses this library.
17
- * If you're trying to roll out a full service with Slack button integration to multiple teams, check out [slack-ruby-bot-server](https://github.com/dblock/slack-ruby-bot-server), which is built on top of slack-ruby-bot, which uses this library.
66
+ * This library will let you send messages to Slack via the Web API, send and receive messages via the Real Time Messaging API and facilitate integration with the Events API.
67
+ * To respond to slash commands, interactive components or events, implement a web application using your favorite web framework and use this library to call the Slack Web API and to verify that events are coming from Slack.
68
+ * To build a bot using the Real Time Messaging API, use [slack-ruby-bot](https://github.com/slack-ruby/slack-ruby-bot), which uses this library.
69
+ * To roll out a complete service using the Real Time Messaging API with Slack button integration to multiple teams, check out [slack-ruby-bot-server](https://github.com/slack-ruby/slack-ruby-bot-server), which is built on top of slack-ruby-bot, which uses this library.
18
70
 
19
71
  ## Stable Release
20
72
 
21
- You're reading the documentation for the **stable** release of slack-ruby-client, 0.13.1. See [UPGRADING](UPGRADING.md) when upgrading from an older version.
73
+ You're reading the documentation for the **stable** release of slack-ruby-client, v1.0. See [UPGRADING](UPGRADING.md) when upgrading from an older version.
22
74
 
23
75
  ## Installation
24
76
 
@@ -28,10 +80,10 @@ Add to Gemfile.
28
80
  gem 'slack-ruby-client'
29
81
  ```
30
82
 
31
- If you're going to be using the RealTime client, add either `async-websocket`, `eventmachine` and `faye-websocket` or `celluloid-io`. See below for more information about concurrency. We recommend you use `async-websocket`.
83
+ If you're going to be using the RealTime client, add `async-websocket`. See below for more information about concurrency.
32
84
 
33
85
  ```
34
- gem 'async-websocket'
86
+ gem 'async-websocket', '~> 0.8.0'
35
87
  ```
36
88
 
37
89
  Run `bundle install`.
@@ -40,11 +92,17 @@ Run `bundle install`.
40
92
 
41
93
  ### Create a New Bot Integration
42
94
 
43
- This is something done in Slack, under [integrations](https://my.slack.com/services). Create a [new bot](https://my.slack.com/services/new/bot), and note its API token.
95
+ To integrate your bot with Slack, you must first create a new [Slack App](https://api.slack.com/apps).
96
+
97
+ ![](screenshots/create-app.png)
44
98
 
45
- ![](screenshots/register-bot.png)
99
+ ### OAuth Code Grant
46
100
 
47
- ### Use the API Token
101
+ Once created, go to the app's Basic Info tab and grab the Client ID and Client Secret. You'll need these in order complete an [OAuth code grant flow](https://api.slack.com/docs/oauth#flow) as described at [slack-ruby-bot-server](https://github.com/slack-ruby/slack-ruby-bot-server).
102
+
103
+ ### Using the Legacy API Token
104
+
105
+ Although OAuth is recommended, you can still [generate a legacy API token](https://api.slack.com/custom-integrations/legacy-tokens) for your app and use it for some interactions.
48
106
 
49
107
  ```ruby
50
108
  Slack.configure do |config|
@@ -67,14 +125,18 @@ logger | An optional logger, defaults to `::Logger.new(STDOUT)` at `Logger
67
125
 
68
126
  The Slack Web API allows you to build applications that interact with Slack.
69
127
 
70
- #### Test Auth
128
+ #### Web Client Examples
129
+
130
+ Here are some examples of how to use the web client with the Web API.
131
+
132
+ ##### Test Auth
71
133
 
72
134
  ```ruby
73
135
  client = Slack::Web::Client.new
74
136
  client.auth_test
75
137
  ```
76
138
 
77
- #### Send Messages
139
+ ##### Send Messages
78
140
 
79
141
  Send messages with [chat_PostMessage](https://api.slack.com/methods/chat.postMessage).
80
142
 
@@ -86,17 +148,17 @@ See a fully working example in [examples/hi_web](examples/hi_web/hi.rb).
86
148
 
87
149
  ![](examples/hi_web/hi.gif)
88
150
 
89
- #### List Channels
151
+ ##### List Channels
90
152
 
91
- List channels with [channels_list](https://api.slack.com/methods/channels.list).
153
+ List channels with [conversations_list](https://api.slack.com/methods/conversations.list).
92
154
 
93
155
  ```ruby
94
- channels = client.channels_list.channels
156
+ channels = client.conversations_list.channels
95
157
 
96
158
  general_channel = channels.detect { |c| c.name == 'general' }
97
159
  ```
98
160
 
99
- #### Upload a File
161
+ ##### Upload a File
100
162
 
101
163
  Upload a file with [files_upload](https://api.slack.com/methods/files.upload).
102
164
 
@@ -111,19 +173,19 @@ client.files_upload(
111
173
  )
112
174
  ```
113
175
 
114
- ### Get Channel Info
176
+ ##### Get Channel Info
115
177
 
116
- You can use a channel ID or name (prefixed with `#`) in all functions that take a `:channel` argument. Lookup by name is not supported by the Slack API and the `channels_id` method called invokes `channels_list` in order to locate the channel ID.
178
+ You can use a channel ID or name (prefixed with `#`) in all functions that take a `:channel` argument. Lookup by name is not supported by the Slack API and the `channels_id` method called invokes `conversations_list` in order to locate the channel ID.
117
179
 
118
180
  ```ruby
119
- client.channels_info(channel: 'C04KB5X4D') # calls channels_info
181
+ client.conversations_info(channel: 'C04KB5X4D') # calls conversations_info
120
182
  ```
121
183
 
122
184
  ```ruby
123
- client.channels_info(channel: '#general') # calls channels_list followed by channels_info
185
+ client.conversations_info(channel: '#general') # calls conversations_list followed by conversations_info
124
186
  ```
125
187
 
126
- ### Get User Info
188
+ ##### Get User Info
127
189
 
128
190
  You can use a user ID or name (prefixed with `@`) in all functions that take a `:user` argument. Lookup by name is not supported by the Slack API and the `users_id` method called invokes `users_list` in order to locate the user ID.
129
191
 
@@ -135,7 +197,7 @@ client.users_info(user: 'U092BDCLV') # calls users_info
135
197
  client.users_info(user: '@dblock') # calls users_list followed by users_info
136
198
  ```
137
199
 
138
- ### Search for a User
200
+ ##### Search for a User
139
201
 
140
202
  Constructs an in-memory index of users and searches it. If you want to use this functionality, add the [picky](https://github.com/floere/picky) gem to your project's Gemfile.
141
203
 
@@ -143,7 +205,7 @@ Constructs an in-memory index of users and searches it. If you want to use this
143
205
  client.users_search(user: 'dblock')
144
206
  ```
145
207
 
146
- #### Other
208
+ ##### Other
147
209
 
148
210
  Refer to the [Slack Web API Method Reference](https://api.slack.com/methods) for the list of all available functions.
149
211
 
@@ -176,11 +238,12 @@ timeout | Optional open/read timeout in seconds.
176
238
  open_timeout | Optional connection open timeout in seconds.
177
239
  default_page_size | Optional page size for paginated requests, default is _100_.
178
240
  default_max_retries | Optional number of retries for paginated requests, default is _100_.
241
+ adapter | Optional HTTP adapter to use, defaults to `Faraday.default_adapter`.
179
242
 
180
243
  You can also pass request options, including `timeout` and `open_timeout` into individual calls.
181
244
 
182
245
  ```ruby
183
- client.channels_list(request: { timeout: 180 })
246
+ client.conversations_list(request: { timeout: 180 })
184
247
  ```
185
248
 
186
249
  You can also control what proxy options are used by modifying the `http_proxy` environment variable per [Net::HTTP's documentation](https://docs.ruby-lang.org/en/2.0.0/Net/HTTP.html#class-Net::HTTP-label-Proxies).
@@ -213,13 +276,59 @@ end
213
276
  all_members # many thousands of team members retrieved 10 at a time
214
277
  ```
215
278
 
279
+ #### Character Encoding
280
+
281
+ Note that Slack expects `text` to be UTF-8 encoded. If your messages appear with text such as `BAD+11` in Slack, check `text.encoding` and `.encode(Encoding::UTF_8)` your messages before sending them to Slack.
282
+
283
+ ```ruby
284
+ text = 'characters such as "Ñ", "Á", "É"'
285
+ text.encoding
286
+ => #<Encoding:UTF-8>
287
+ client.chat_postMessage(channel: '#general', text: text, as_user: true)
288
+ # renders 'characters such as "Ñ", "Á", "É"' in Slack
289
+
290
+ text = text.encode(Encoding::ISO_8859_1)
291
+ text.encoding
292
+ # => #<Encoding:ISO-8859-1>
293
+ client.chat_postMessage(channel: '#general', text: text, as_user: true)
294
+ # renders 'characters such as "BAD+11", "", "BAD+9"' in Slack
295
+ ```
296
+
216
297
  #### Error Handling
217
298
 
218
- If a request fails, a `Slack::Web::Api::Errors::SlackError` will be raised. The error message contains the error code. In case of multiple errors, the error codes are separated by commas. The original response is also accessible using the `response` attribute.
299
+ ##### Slack Errors
300
+
301
+ If Slack returns an error for the request, then an error will be raised. The error class is specific to the type of error that Slack returns. For instance if Slack returns `account_inactive` then the error will be `Slack::Web::Api::Errors::AccountInactive`. This allows you to handle certain types of errors as needed:
302
+
303
+ ```ruby
304
+ rescue Slack::Web::Api::Errors::AccountInactive => e
305
+ # deal with inactive account
306
+ end
307
+ ```
308
+
309
+ All of these errors inherit from `Slack::Web::Api::Errors::SlackError`, so you can handle or silence all errors if necessary:
310
+
311
+ ```ruby
312
+ rescue Slack::Web::Api::Errors::SlackError => e
313
+ # capture all Slack errors
314
+ end
315
+ ```
219
316
 
220
- If you exceed [Slack’s rate limits](https://api.slack.com/docs/rate-limits), a `Slack::Web::Api::Errors::TooManyRequestsError` will be raised instead.
317
+ If there's a new error type that is not yet known by this library, then it will raise `Slack::Web::Api::Errors::SlackError`. (Update the Web API if you find that errors are missing — see [CONTRIBUTING](CONTRIBUTING.md).)
221
318
 
222
- In any other case, a `Faraday::ClientError` will be raised. This may be the case if Slack is temporarily unavailable, for example.
319
+ In all of these cases the error message contains the error code, which is also accessible with `slack_error.error`. In case of multiple errors, the error message contains the error codes separated by commas, or they are accessible as an array with `slack_error.errors`. The original response is also accessible using the `response` attribute. The `response_metadata` is accessible with `slack_error.response_metadata`.
320
+
321
+ ##### Rate Limiting
322
+
323
+ If you exceed [Slack’s rate limits](https://api.slack.com/docs/rate-limits), a `Slack::Web::Api::Errors::TooManyRequestsError` will be raised instead. (This does not inherit from `Slack::Web::Api::Errors::SlackError`.)
324
+
325
+ ##### Other Errors
326
+
327
+ When Slack is temporarily unavailable a subclass of `Slack::Web::Api::Errors::ServerError` will be raised and the original `Faraday::Error` will be accesible via `exception.cause`. (Starting with 0.18.0 this is no longer a subclass of `Slack::Web::Api::Errors::SlackError`.)
328
+
329
+ Specifically `Slack::Web::Api::Errors::ParsingError` will be raised on non-json response (i.e. 200 OK with `Slack unavailable` HTML page) and `Slack::Web::Api::Errors::HttpRequestError` subclasses for connection failures (`Slack::Web::Api::Errors::TimeoutError` for read/open timeouts & `Slack::Web::Api::Errors::UnavailableError` for 5xx HTTP responses).
330
+
331
+ In any other case, a `Faraday::ClientError` will be raised.
223
332
 
224
333
  ### RealTime Client
225
334
 
@@ -235,9 +344,9 @@ end
235
344
  client.on :message do |data|
236
345
  case data.text
237
346
  when 'bot hi' then
238
- client.message channel: data.channel, text: "Hi <@#{data.user}>!"
347
+ client.message(channel: data.channel, text: "Hi <@#{data.user}>!")
239
348
  when /^bot/ then
240
- client.message channel: data.channel, text: "Sorry <@#{data.user}>, what?"
349
+ client.message(channel: data.channel, text: "Sorry <@#{data.user}>, what?")
241
350
  end
242
351
  end
243
352
 
@@ -308,7 +417,7 @@ The following settings are supported.
308
417
  setting | description
309
418
  ----------------|-----------------------------------------------------------------------------------------------------
310
419
  token | Slack API token.
311
- websocket_ping | The number of seconds that indicates how often the WebSocket should send ping frames, default is 30.
420
+ websocket_ping | How long the socket can be idle before sending a ping message to confirm it's still connected, default is 30.
312
421
  websocket_proxy | Connect via proxy, include `:origin` and `:headers`.
313
422
  store_class | Local store class name, default is an in-memory `Slack::RealTime::Stores::Store`.
314
423
  start_method | Optional start method, either `:rtm_start` or `:rtm_connect`.
@@ -321,6 +430,17 @@ See a fully working example in [examples/hi_real_time](examples/hi_real_time/hi.
321
430
 
322
431
  ![](examples/hi_real_time/hi.gif)
323
432
 
433
+ #### Caveats
434
+
435
+ ##### `websocket_ping`
436
+ This setting determines how long the socket can be idle before sending a ping message to confirm it's still connected.
437
+
438
+ It's important to note that if a ping message was sent and no response was received within the amount of time specified in `websocket_ping` the client will attempt to reestablish it's connection to the message server.
439
+
440
+ Note that the ping may take between `websocket_ping` and `websocket_ping * 3/2` seconds to actually trigger when there is no activity on the socket. This is because the timer that checks whether to ping is triggered at every `websocket_ping / 2` interval.
441
+
442
+ To disable this feature set `websocket_ping` to 0.
443
+
324
444
  ### Connection Methods
325
445
 
326
446
  The RealTime client uses either [rtm.start](https://api.slack.com/methods/rtm.start) or [rtm.connect](https://api.slack.com/methods/rtm.connect) to open a connection. The former retrieves a lot of team information while the latter only serves connection purposes and is preferred. You should let the library choose the right method for you based on the `store_class` used and override this behavior with `start_method` when necessary.
@@ -341,9 +461,9 @@ client = Slack::RealTime::Client.new
341
461
  client.on :message do |data|
342
462
  case data.text
343
463
  when 'bot hi' then
344
- client.web_client.chat_postMessage channel: data.channel, text: "Hi <@#{data.user}>!"
464
+ client.web_client.chat_postMessage(channel: data.channel, text: "Hi <@#{data.user}>!")
345
465
  when /^bot/ then
346
- client.web_client.chat_postMessage channel: data.channel, text: "Sorry <@#{data.user}>, what?"
466
+ client.web_client.chat_postMessage(channel: data.channel, text: "Sorry <@#{data.user}>, what?")
347
467
  end
348
468
  end
349
469
 
@@ -373,7 +493,7 @@ See [#134](https://github.com/slack-ruby/slack-ruby-client/issues/134) for a dis
373
493
 
374
494
  #### Concurrency
375
495
 
376
- `Slack::RealTime::Client` needs help from a concurrency library and supports [Async](https://github.com/socketry/async), [Faye::WebSocket](https://github.com/faye/faye-websocket-ruby) with [Eventmachine](https://github.com/eventmachine/eventmachine) and [Celluloid](https://github.com/celluloid/celluloid). It will auto-detect one or the other depending on the gems in your Gemfile, but you can also set concurrency explicitly.
496
+ `Slack::RealTime::Client` needs help from a concurrency library and supports [Async](https://github.com/socketry/async).
377
497
 
378
498
  ```ruby
379
499
  Slack::RealTime.configure do |config|
@@ -381,7 +501,7 @@ Slack::RealTime.configure do |config|
381
501
  end
382
502
  ```
383
503
 
384
- Use `client.start_async` instead of `client.start!`. A good example of such application is [slack-bot-server](https://github.com/dblock/slack-bot-server).
504
+ Use `client.start_async` instead of `client.start!`. A good example of such application is [slack-ruby-bot-server](https://github.com/slack-ruby/slack-ruby-bot-server).
385
505
 
386
506
  ```ruby
387
507
  client = Slack::RealTime::Client.new
@@ -391,7 +511,7 @@ client.start_async
391
511
 
392
512
  ##### Async
393
513
 
394
- This is the recommended library. Add `async-websocket` to your Gemfile.
514
+ Add `async-websocket` to your Gemfile.
395
515
 
396
516
  ```
397
517
  gem 'async-websocket'
@@ -399,27 +519,44 @@ gem 'async-websocket'
399
519
 
400
520
  See a fully working example in [examples/hi_real_time_async_async](examples/hi_real_time_async_async/hi.rb).
401
521
 
402
- ##### Faye::Websocket with Eventmachine
522
+ ### Events API
403
523
 
404
- Add the following to your Gemfile.
524
+ This library provides limited support for the [Slack Events API](https://api.slack.com/events-api).
405
525
 
406
- ```
407
- gem 'faye-websocket'
526
+ #### Configuring Slack::Events
527
+
528
+ You can configure Events support globally.
529
+
530
+ ```ruby
531
+ Slack::Events.configure do |config|
532
+ config.signing_secret = 'secret'
533
+ end
408
534
  ```
409
535
 
410
- See a fully working example in [examples/hi_real_time_async_eventmachine](examples/hi_real_time_async_eventmachine/hi.rb).
536
+ The following settings are supported.
411
537
 
412
- ##### Celluloid
538
+ setting | description
539
+ ----------------------|---------------------------------------------------------------------------------------------------
540
+ signing_secret | Slack signing secret, defaults is `ENV['SLACK_SIGNING_SECRET']`.
541
+ signature_expires_in | Signature expiration window in seconds, default is `300`.
413
542
 
414
- Add the following to your Gemfile.
543
+ #### Verifying the Request Signature
415
544
 
416
- ```
417
- gem 'celluloid-io', require: ['celluloid/current', 'celluloid/io']
545
+ Slack signs its requests using a secret that's unique to your app. Verify incoming HTTP requests as follows.
546
+
547
+ ```ruby
548
+ slack_request = Slack::Events::Request.new(http_request)
549
+ slack_request.verify!
418
550
  ```
419
551
 
420
- See a fully working example in [examples/hi_real_time_async_celluloid](examples/hi_real_time_async_celluloid/hi.rb).
552
+ To specify secrets on a per-request basis:
553
+ ```ruby
554
+ Slack::Events::Request.new(http_request,
555
+ signing_secret: signing_secret,
556
+ signature_expires_in: signature_expires_in)
557
+ ```
421
558
 
422
- Require
559
+ The `verify!` call may raise `Slack::Events::Request::MissingSigningSecret`, `Slack::Events::Request::InvalidSignature` or `Slack::Events::Request::TimestampExpired` errors.
423
560
 
424
561
  ### Message Parsing
425
562
 
@@ -509,6 +646,6 @@ See [CONTRIBUTING](CONTRIBUTING.md).
509
646
 
510
647
  ## Copyright and License
511
648
 
512
- Copyright (c) 2015-2016, [Daniel Doubrovkine](https://twitter.com/dblockdotorg), [Artsy](https://www.artsy.net) and [Contributors](CHANGELOG.md).
649
+ Copyright (c) 2015-2021, [Daniel Doubrovkine](https://twitter.com/dblockdotorg), [Artsy](https://www.artsy.net) and [Contributors](CHANGELOG.md).
513
650
 
514
651
  This project is licensed under the [MIT License](LICENSE.md).
data/RELEASING.md CHANGED
@@ -11,7 +11,7 @@ bundle install
11
11
  rake
12
12
  ```
13
13
 
14
- Check that the last build succeeded in [Travis CI](https://travis-ci.org/slack-ruby/slack-ruby-client) for all supported platforms.
14
+ Check that the last build succeeded in [Travis CI](https://app.travis-ci.com/github/slack-ruby/slack-ruby-client) for all supported platforms.
15
15
 
16
16
  Change "Next" in [CHANGELOG.md](CHANGELOG.md) to the current date.
17
17
 
data/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'rubygems'
2
3
  require 'bundler'
3
4
  require 'bundler/gem_tasks'
@@ -14,7 +15,7 @@ end
14
15
  require 'rubocop/rake_task'
15
16
  RuboCop::RakeTask.new
16
17
 
17
- task default: %i[rubocop spec]
18
+ task default: %i[spec rubocop]
18
19
 
19
20
  load 'tasks/git.rake'
20
21
  load 'tasks/web.rake'
data/UPGRADING.md CHANGED
@@ -1,6 +1,78 @@
1
1
  Upgrading Slack-Ruby-Client
2
2
  ===========================
3
3
 
4
+ ### Upgrading to >= 1.0.0
5
+
6
+ #### Deprecated Methods
7
+
8
+ Slack has deprecated all `channel` and `group` methods, which have been removed from the library.
9
+
10
+ See [this announcement from Slack](https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api) for details.
11
+
12
+ #### Error Handling
13
+
14
+ As of 1.0.0 `Slack::Web::Api::Errors::ServerError` and its subclasses (introduced in 0.16.0) no longer extend `Slack::Web::Api::Errors::InternalError` or its parent `Slack::Web::Api::Errors::SlackError`. If you are rescuing `SlackError` or `InternalError` with the intention of including `ServerError` and its subclasses you should adjust your code to explicitly rescue `Slack::Web::Api::Errors::ServerError`.
15
+
16
+ ```ruby
17
+ # Before
18
+ begin
19
+ client.auth_test
20
+ rescue Slack::Web::Api::Errors::SlackError
21
+ # Includes all server errors
22
+ end
23
+
24
+ # After
25
+ begin
26
+ client.auth_test
27
+ rescue Slack::Web::Api::Errors::SlackError, Slack::Web::Api::Errors::ServerError
28
+ # Need to rescue the server errors separately from SlackError
29
+ end
30
+ ```
31
+
32
+ Additionally the `initialize` method for `ParsingError`, `TimeoutError`, and `UnavailableError` have changed from `new(message, response)` to `new(response)`. The `message` is now built into the definition of these classes. If you are instantiating or raising these errors in your code (perhaps in tests) you will need to update your code.
33
+
34
+ ```ruby
35
+ # Before
36
+ error = Slack::Web::Api::Errors::TimeoutError.new('timeout_error', response)
37
+ error.message
38
+ # => 'timeout_error'
39
+
40
+ # After
41
+ error = Slack::Web::Api::Errors::TimeoutError.new(response)
42
+ error.message
43
+ # => 'timeout_error'
44
+ ```
45
+
46
+ ### Upgrading to >= 0.16.0
47
+
48
+ #### Removed Celluloid and Faye-Websocket Concurrency Support
49
+
50
+ Concurrency support for `celluloid-io` and `faye-websocket` has been removed. If you are running a RealTime bot on Celluloid or Faye, you must upgrade to `async-websocket`. Please note that RealTime bots are deprecated by Slack, and we generally recommend you [migrate your classic, RealTime bot, to granular permissions](https://code.dblock.org/2020/11/30/migrating-classic-slack-ruby-bots-to-granular-permissions.html).
51
+
52
+ See [#338](https://github.com/slack-ruby/slack-ruby-client/issues/338) for more information.
53
+
54
+ #### Error Handling
55
+
56
+ As of 0.16.0 `Faraday::Error` exceptions sans `Faraday::ClientError` are wrapped into `Slack::Web::Api::Errors::ServerError`, so if you're rescuing `Faraday::Error` — you should adjust your code to use `Slack::Web::Api::Errors::ServerError` and use `exception.cause` if underlying `Faraday::Error` is needed.
57
+
58
+ See [README#other-errors](README.md#other-errors) and [#350](https://github.com/slack-ruby/slack-ruby-client/pull/350) for more information.
59
+
60
+ ### Upgrading to >= 0.15.0
61
+
62
+ As of 0.15.0, `activesupport` is no longer required. Add `gem 'activesupport'` to your Gemfile if you required ActiveSupport via this library.
63
+
64
+ See [#325](https://github.com/slack-ruby/slack-ruby-client/pull/325) for more information.
65
+
66
+ ### Upgrading to >= 0.14.0
67
+
68
+ If you are using async-websocket, lock down its version to 0.8.0 as newer versions are currently incompatible.
69
+
70
+ ```
71
+ gem 'async-websocket', '~> 0.8.0'
72
+ ```
73
+
74
+ See [#282](https://github.com/slack-ruby/slack-ruby-client/issues/282) for more information.
75
+
4
76
  ### Upgrading to >= 0.13.0
5
77
 
6
78
  #### Recommended Async Library
@@ -114,5 +186,3 @@ gem 'celluloid-io'
114
186
  When in doubt, use `faye-websocket`.
115
187
 
116
188
  See [#5](https://github.com/slack-ruby/slack-ruby-client/issues/5) for more information.
117
-
118
-
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+ # This file was auto-generated by lib/tasks/web.rake
3
+
4
+ desc 'AdminAnalytics methods.'
5
+ command 'admin_analytics' do |g|
6
+ g.desc 'Retrieve analytics data for a given date, presented as a compressed JSON file'
7
+ g.long_desc %( Retrieve analytics data for a given date, presented as a compressed JSON file )
8
+ g.command 'getFile' do |c|
9
+ c.flag 'type', desc: 'The type of analytics to retrieve. The options are currently limited to member (for grid member analytics) and public_channel (for public channel analytics).'
10
+ c.flag 'date', desc: 'Date to retrieve the analytics data for, expressed as YYYY-MM-DD in UTC.'
11
+ c.flag 'metadata_only', desc: 'Retrieve metadata for the type of analytics indicated. Can be used only with type set to public_channel analytics. See detail below. Omit the date parameter when using this argument.'
12
+ c.action do |_global_options, options, _args|
13
+ puts JSON.dump($client.admin_analytics_getFile(options))
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+ # This file was auto-generated by lib/tasks/web.rake
3
+
4
+ desc 'AdminApps methods.'
5
+ command 'admin_apps' do |g|
6
+ g.desc 'Approve an app for installation on a workspace.'
7
+ g.long_desc %( Approve an app for installation on a workspace. )
8
+ g.command 'approve' do |c|
9
+ c.flag 'app_id', desc: 'The id of the app to approve.'
10
+ c.flag 'enterprise_id', desc: 'The ID of the enterprise to approve the app on.'
11
+ c.flag 'request_id', desc: 'The id of the request to approve.'
12
+ c.flag 'team_id', desc: 'The ID of the workspace to approve the app on.'
13
+ c.action do |_global_options, options, _args|
14
+ puts JSON.dump($client.admin_apps_approve(options))
15
+ end
16
+ end
17
+
18
+ g.desc 'Clear an app resolution'
19
+ g.long_desc %( Clear an app resolution )
20
+ g.command 'clearResolution' do |c|
21
+ c.flag 'app_id', desc: 'The id of the app whose resolution you want to clear/undo.'
22
+ c.flag 'enterprise_id', desc: 'The enterprise to clear the app resolution from.'
23
+ c.flag 'team_id', desc: 'The workspace to clear the app resolution from.'
24
+ c.action do |_global_options, options, _args|
25
+ puts JSON.dump($client.admin_apps_clearResolution(options))
26
+ end
27
+ end
28
+
29
+ g.desc 'Restrict an app for installation on a workspace.'
30
+ g.long_desc %( Restrict an app for installation on a workspace. )
31
+ g.command 'restrict' do |c|
32
+ c.flag 'app_id', desc: 'The id of the app to restrict.'
33
+ c.flag 'enterprise_id', desc: 'The ID of the enterprise to approve the app on.'
34
+ c.flag 'request_id', desc: 'The id of the request to restrict.'
35
+ c.flag 'team_id', desc: 'The ID of the workspace to approve the app on.'
36
+ c.action do |_global_options, options, _args|
37
+ puts JSON.dump($client.admin_apps_restrict(options))
38
+ end
39
+ end
40
+
41
+ g.desc 'Uninstall an app from one or many workspaces, or an entire enterprise organization.'
42
+ g.long_desc %( Uninstall an app from one or many workspaces, or an entire enterprise organization. )
43
+ g.command 'uninstall' do |c|
44
+ c.flag 'app_id', desc: 'The ID of the app to uninstall.'
45
+ c.flag 'enterprise_id', desc: 'The enterprise to completely uninstall the application from (across all workspaces). With an org-level token, this or team_ids is required.'
46
+ c.flag 'team_ids', desc: 'IDs of the teams to uninstall from (max 100). With an org-level token, this or enterprise_id is required.'
47
+ c.action do |_global_options, options, _args|
48
+ puts JSON.dump($client.admin_apps_uninstall(options))
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ # This file was auto-generated by lib/tasks/web.rake
3
+
4
+ desc 'AdminAppsApproved methods.'
5
+ command 'admin_apps_approved' do |g|
6
+ g.desc 'List approved apps for an org or workspace.'
7
+ g.long_desc %( List approved apps for an org or workspace. )
8
+ g.command 'list' do |c|
9
+ c.flag 'cursor', desc: 'Set cursor to next_cursor returned by the previous call to list items in the next page.'
10
+ c.flag 'enterprise_id', desc: '.'
11
+ c.flag 'limit', desc: 'The maximum number of items to return. Must be between 1 - 1000 both inclusive.'
12
+ c.flag 'team_id', desc: '.'
13
+ c.action do |_global_options, options, _args|
14
+ puts JSON.dump($client.admin_apps_approved_list(options))
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ # This file was auto-generated by lib/tasks/web.rake
3
+
4
+ desc 'AdminAppsRequests methods.'
5
+ command 'admin_apps_requests' do |g|
6
+ g.desc 'List app requests for a team/workspace.'
7
+ g.long_desc %( List app requests for a team/workspace. )
8
+ g.command 'list' do |c|
9
+ c.flag 'cursor', desc: 'Set cursor to next_cursor returned by the previous call to list items in the next page.'
10
+ c.flag 'enterprise_id', desc: '.'
11
+ c.flag 'limit', desc: 'The maximum number of items to return. Must be between 1 - 1000 both inclusive.'
12
+ c.flag 'team_id', desc: '.'
13
+ c.action do |_global_options, options, _args|
14
+ puts JSON.dump($client.admin_apps_requests_list(options))
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ # This file was auto-generated by lib/tasks/web.rake
3
+
4
+ desc 'AdminAppsRestricted methods.'
5
+ command 'admin_apps_restricted' do |g|
6
+ g.desc 'List restricted apps for an org or workspace.'
7
+ g.long_desc %( List restricted apps for an org or workspace. )
8
+ g.command 'list' do |c|
9
+ c.flag 'cursor', desc: 'Set cursor to next_cursor returned by the previous call to list items in the next page.'
10
+ c.flag 'enterprise_id', desc: '.'
11
+ c.flag 'limit', desc: 'The maximum number of items to return. Must be between 1 - 1000 both inclusive.'
12
+ c.flag 'team_id', desc: '.'
13
+ c.action do |_global_options, options, _args|
14
+ puts JSON.dump($client.admin_apps_restricted_list(options))
15
+ end
16
+ end
17
+ end