slack-ruby-client 0.7.9 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (358) hide show
  1. checksums.yaml +5 -5
  2. data/.github/FUNDING.yml +1 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +32 -1
  5. data/.rubocop_todo.yml +98 -49
  6. data/.travis.yml +10 -14
  7. data/CHANGELOG.md +172 -24
  8. data/CONTRIBUTING.md +17 -6
  9. data/Dangerfile +2 -0
  10. data/Gemfile +10 -4
  11. data/LICENSE.md +1 -1
  12. data/README.md +276 -54
  13. data/RELEASING.md +19 -11
  14. data/Rakefile +2 -1
  15. data/UPGRADING.md +84 -2
  16. data/bin/commands.rb +43 -1
  17. data/bin/commands/admin_analytics.rb +15 -0
  18. data/bin/commands/admin_apps.rb +40 -0
  19. data/bin/commands/admin_apps_approved.rb +17 -0
  20. data/bin/commands/admin_apps_requests.rb +16 -0
  21. data/bin/commands/admin_apps_restricted.rb +17 -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 +97 -0
  37. data/bin/commands/admin_users_session.rb +38 -0
  38. data/bin/commands/api.rb +3 -3
  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_permissions.rb +23 -0
  43. data/bin/commands/apps_permissions_resources.rb +15 -0
  44. data/bin/commands/apps_permissions_scopes.rb +13 -0
  45. data/bin/commands/apps_permissions_users.rb +26 -0
  46. data/bin/commands/auth.rb +5 -4
  47. data/bin/commands/auth_teams.rb +16 -0
  48. data/bin/commands/bots.rb +4 -2
  49. data/bin/commands/calls.rb +52 -0
  50. data/bin/commands/calls_participants.rb +25 -0
  51. data/bin/commands/channels.rb +64 -43
  52. data/bin/commands/chat.rb +114 -24
  53. data/bin/commands/chat_scheduledMessages.rb +19 -0
  54. data/bin/commands/conversations.rb +196 -0
  55. data/bin/commands/dialog.rb +15 -0
  56. data/bin/commands/dnd.rb +9 -8
  57. data/bin/commands/emoji.rb +3 -2
  58. data/bin/commands/files.rb +45 -30
  59. data/bin/commands/files_comments.rb +3 -24
  60. data/bin/commands/files_remote.rb +78 -0
  61. data/bin/commands/groups.rb +53 -53
  62. data/bin/commands/im.rb +17 -13
  63. data/bin/commands/migration.rb +16 -0
  64. data/bin/commands/mpim.rb +16 -13
  65. data/bin/commands/oauth.rb +17 -2
  66. data/bin/commands/oauth_v2.rb +17 -0
  67. data/bin/commands/pins.rb +7 -10
  68. data/bin/commands/reactions.rb +17 -15
  69. data/bin/commands/reminders.rb +11 -10
  70. data/bin/commands/rtm.rb +19 -4
  71. data/bin/commands/search.rb +15 -11
  72. data/bin/commands/stars.rb +11 -8
  73. data/bin/commands/team.rb +15 -10
  74. data/bin/commands/team_profile.rb +3 -2
  75. data/bin/commands/usergroups.rb +22 -16
  76. data/bin/commands/usergroups_users.rb +7 -4
  77. data/bin/commands/users.rb +65 -37
  78. data/bin/commands/users_admin.rb +29 -0
  79. data/bin/commands/users_prefs.rb +13 -0
  80. data/bin/commands/users_profile.rb +8 -7
  81. data/bin/commands/views.rb +48 -0
  82. data/bin/commands/workflows.rb +38 -0
  83. data/bin/slack +3 -4
  84. data/examples/hi_real_time_and_web/Gemfile +1 -0
  85. data/examples/hi_real_time_and_web/hi.rb +8 -4
  86. data/examples/{hi_real_time_async_eventmachine → hi_real_time_async_async}/Gemfile +2 -1
  87. data/examples/{hi_real_time_async_celluloid → hi_real_time_async_async}/Procfile +0 -0
  88. data/examples/{hi_real_time_async_celluloid → hi_real_time_async_async}/hi.rb +13 -8
  89. data/examples/hi_web/Gemfile +1 -0
  90. data/examples/hi_web/hi.rb +2 -1
  91. data/examples/new_ticket/Gemfile +1 -0
  92. data/examples/new_ticket/new_ticket.rb +2 -1
  93. data/lib/slack-ruby-client.rb +40 -26
  94. data/lib/slack.rb +1 -0
  95. data/lib/slack/config.rb +1 -0
  96. data/lib/slack/events/config.rb +32 -0
  97. data/lib/slack/events/request.rb +70 -0
  98. data/lib/slack/logger.rb +6 -5
  99. data/lib/slack/messages/formatting.rb +4 -4
  100. data/lib/slack/messages/message.rb +2 -6
  101. data/lib/slack/real_time/api/message.rb +3 -1
  102. data/lib/slack/real_time/api/message_id.rb +1 -0
  103. data/lib/slack/real_time/api/ping.rb +5 -2
  104. data/lib/slack/real_time/api/templates/event_handler.erb +1 -1
  105. data/lib/slack/real_time/api/typing.rb +3 -1
  106. data/lib/slack/real_time/client.rb +113 -32
  107. data/lib/slack/real_time/concurrency.rb +2 -2
  108. data/lib/slack/real_time/concurrency/async.rb +140 -0
  109. data/lib/slack/real_time/config.rb +20 -12
  110. data/lib/slack/real_time/models.rb +8 -7
  111. data/lib/slack/real_time/models/base.rb +2 -6
  112. data/lib/slack/real_time/models/bot.rb +1 -0
  113. data/lib/slack/real_time/models/channel.rb +1 -0
  114. data/lib/slack/real_time/models/group.rb +1 -0
  115. data/lib/slack/real_time/models/im.rb +1 -0
  116. data/lib/slack/real_time/models/team.rb +1 -0
  117. data/lib/slack/real_time/models/user.rb +1 -0
  118. data/lib/slack/real_time/socket.rb +46 -17
  119. data/lib/slack/real_time/stores.rb +4 -3
  120. data/lib/slack/real_time/stores/base.rb +5 -3
  121. data/lib/slack/real_time/stores/starter.rb +113 -72
  122. data/lib/slack/real_time/stores/store.rb +131 -88
  123. data/lib/slack/version.rb +2 -1
  124. data/lib/slack/web/api/endpoints.rb +110 -26
  125. data/lib/slack/web/api/endpoints/admin_analytics.rb +26 -0
  126. data/lib/slack/web/api/endpoints/admin_apps.rb +62 -0
  127. data/lib/slack/web/api/endpoints/admin_apps_approved.rb +35 -0
  128. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +33 -0
  129. data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +35 -0
  130. data/lib/slack/web/api/endpoints/admin_barriers.rb +82 -0
  131. data/lib/slack/web/api/endpoints/admin_conversations.rb +260 -0
  132. data/lib/slack/web/api/endpoints/admin_conversations_ekm.rb +35 -0
  133. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +61 -0
  134. data/lib/slack/web/api/endpoints/admin_conversations_whitelist.rb +64 -0
  135. data/lib/slack/web/api/endpoints/admin_emoji.rb +88 -0
  136. data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +61 -0
  137. data/lib/slack/web/api/endpoints/admin_inviteRequests_approved.rb +33 -0
  138. data/lib/slack/web/api/endpoints/admin_inviteRequests_denied.rb +33 -0
  139. data/lib/slack/web/api/endpoints/admin_teams.rb +50 -0
  140. data/lib/slack/web/api/endpoints/admin_teams_admins.rb +34 -0
  141. data/lib/slack/web/api/endpoints/admin_teams_owners.rb +34 -0
  142. data/lib/slack/web/api/endpoints/admin_teams_settings.rb +99 -0
  143. data/lib/slack/web/api/endpoints/admin_usergroups.rb +77 -0
  144. data/lib/slack/web/api/endpoints/admin_users.rb +161 -0
  145. data/lib/slack/web/api/endpoints/admin_users_session.rb +66 -0
  146. data/lib/slack/web/api/endpoints/api.rb +3 -4
  147. data/lib/slack/web/api/endpoints/apps.rb +27 -0
  148. data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
  149. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
  150. data/lib/slack/web/api/endpoints/apps_permissions.rb +36 -0
  151. data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +31 -0
  152. data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +21 -0
  153. data/lib/slack/web/api/endpoints/apps_permissions_users.rb +50 -0
  154. data/lib/slack/web/api/endpoints/auth.rb +5 -4
  155. data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
  156. data/lib/slack/web/api/endpoints/bots.rb +5 -2
  157. data/lib/slack/web/api/endpoints/calls.rb +83 -0
  158. data/lib/slack/web/api/endpoints/calls_participants.rb +42 -0
  159. data/lib/slack/web/api/endpoints/channels.rb +105 -49
  160. data/lib/slack/web/api/endpoints/chat.rb +221 -40
  161. data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
  162. data/lib/slack/web/api/endpoints/conversations.rb +332 -0
  163. data/lib/slack/web/api/endpoints/dialog.rb +33 -0
  164. data/lib/slack/web/api/endpoints/dnd.rb +11 -9
  165. data/lib/slack/web/api/endpoints/emoji.rb +3 -2
  166. data/lib/slack/web/api/endpoints/files.rb +75 -38
  167. data/lib/slack/web/api/endpoints/files_comments.rb +3 -38
  168. data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
  169. data/lib/slack/web/api/endpoints/groups.rb +76 -53
  170. data/lib/slack/web/api/endpoints/im.rb +38 -21
  171. data/lib/slack/web/api/endpoints/migration.rb +28 -0
  172. data/lib/slack/web/api/endpoints/mpim.rb +37 -22
  173. data/lib/slack/web/api/endpoints/oauth.rb +25 -4
  174. data/lib/slack/web/api/endpoints/oauth_v2.rb +30 -0
  175. data/lib/slack/web/api/endpoints/pins.rb +10 -19
  176. data/lib/slack/web/api/endpoints/presence.rb +1 -1
  177. data/lib/slack/web/api/endpoints/reactions.rb +37 -28
  178. data/lib/slack/web/api/endpoints/reminders.rb +11 -10
  179. data/lib/slack/web/api/endpoints/rtm.rb +28 -7
  180. data/lib/slack/web/api/endpoints/search.rb +21 -14
  181. data/lib/slack/web/api/endpoints/stars.rb +24 -15
  182. data/lib/slack/web/api/endpoints/team.rb +21 -13
  183. data/lib/slack/web/api/endpoints/team_profile.rb +3 -2
  184. data/lib/slack/web/api/endpoints/usergroups.rb +33 -22
  185. data/lib/slack/web/api/endpoints/usergroups_users.rb +9 -4
  186. data/lib/slack/web/api/endpoints/users.rb +78 -29
  187. data/lib/slack/web/api/endpoints/users_admin.rb +49 -0
  188. data/lib/slack/web/api/endpoints/users_prefs.rb +21 -0
  189. data/lib/slack/web/api/endpoints/users_profile.rb +11 -10
  190. data/lib/slack/web/api/endpoints/views.rb +97 -0
  191. data/lib/slack/web/api/endpoints/workflows.rb +61 -0
  192. data/lib/slack/web/api/error.rb +2 -8
  193. data/lib/slack/web/api/errors.rb +850 -0
  194. data/lib/slack/web/api/errors/internal_error.rb +14 -0
  195. data/lib/slack/web/api/errors/slack_error.rb +29 -0
  196. data/lib/slack/web/api/errors/too_many_requests_error.rb +24 -0
  197. data/lib/slack/web/api/mixins.rb +6 -4
  198. data/lib/slack/web/api/mixins/channels.id.rb +6 -7
  199. data/lib/slack/web/api/mixins/conversations.id.rb +25 -0
  200. data/lib/slack/web/api/mixins/groups.id.rb +6 -7
  201. data/lib/slack/web/api/mixins/ids.id.rb +24 -0
  202. data/lib/slack/web/api/mixins/users.id.rb +6 -7
  203. data/lib/slack/web/api/mixins/users.search.rb +39 -36
  204. data/lib/slack/web/api/patches/chat.1.patch +72 -0
  205. data/lib/slack/web/api/patches/dialog.1.open-json-support.patch +17 -0
  206. data/lib/slack/web/api/patches/views.1.view-json.patch +40 -0
  207. data/lib/slack/web/api/patches/views.1.views-published.patch +16 -0
  208. data/lib/slack/web/api/templates/command.erb +5 -3
  209. data/lib/slack/web/api/templates/commands.erb +2 -1
  210. data/lib/slack/web/api/templates/endpoints.erb +5 -3
  211. data/lib/slack/web/api/templates/errors.erb +20 -0
  212. data/lib/slack/web/api/templates/method.erb +26 -4
  213. data/lib/slack/web/api/templates/method_spec.erb +3 -2
  214. data/lib/slack/web/client.rb +2 -1
  215. data/lib/slack/web/config.rb +21 -10
  216. data/lib/slack/web/faraday/connection.rb +25 -16
  217. data/lib/slack/web/faraday/request.rb +2 -0
  218. data/lib/slack/web/faraday/response/raise_error.rb +23 -1
  219. data/lib/slack/web/faraday/response/wrap_error.rb +18 -0
  220. data/lib/slack/web/pagination/cursor.rb +52 -0
  221. data/lib/slack_ruby_client.rb +1 -0
  222. data/lib/tasks/git.rake +2 -1
  223. data/lib/tasks/real_time.rake +16 -6
  224. data/lib/tasks/update.rake +1 -0
  225. data/lib/tasks/web.rake +38 -10
  226. data/screenshots/create-app.png +0 -0
  227. data/slack-ruby-client.gemspec +9 -6
  228. data/spec/fixtures/slack/web/429_error.yml +2 -0
  229. data/spec/fixtures/slack/web/503_error.yml +14 -0
  230. data/spec/fixtures/slack/web/channels_info.yml +108 -15
  231. data/spec/fixtures/slack/web/conversations_setTopic.yml +69 -0
  232. data/spec/fixtures/slack/web/conversations_setTopic_one_page.yml +142 -0
  233. data/spec/fixtures/slack/web/conversations_setTopic_paginated.yml +208 -0
  234. data/spec/fixtures/slack/web/paginated_users_list.yml +181 -0
  235. data/spec/fixtures/slack/web/rtm_connect.yml +70 -0
  236. data/spec/fixtures/slack/web/rtm_start.yml +1 -1
  237. data/spec/fixtures/slack/web/views_open_error.yml +76 -0
  238. data/spec/integration/integration_spec.rb +116 -48
  239. data/spec/slack/config_spec.rb +2 -0
  240. data/spec/slack/events/config_spec.rb +33 -0
  241. data/spec/slack/events/request_spec.rb +183 -0
  242. data/spec/slack/messages/formatting_spec.rb +25 -14
  243. data/spec/slack/real_time/api/message_spec.rb +6 -1
  244. data/spec/slack/real_time/api/ping_spec.rb +2 -0
  245. data/spec/slack/real_time/api/typing_spec.rb +5 -1
  246. data/spec/slack/real_time/client_spec.rb +462 -134
  247. data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +3 -1
  248. data/spec/slack/real_time/event_handlers/bot_spec.rb +6 -3
  249. data/spec/slack/real_time/event_handlers/channel_spec.rb +9 -6
  250. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +3 -2
  251. data/spec/slack/real_time/event_handlers/group_spec.rb +5 -4
  252. data/spec/slack/real_time/event_handlers/im_spec.rb +4 -3
  253. data/spec/slack/real_time/event_handlers/team_spec.rb +8 -4
  254. data/spec/slack/real_time/event_handlers/user_spec.rb +5 -2
  255. data/spec/slack/real_time/rtm_connect_spec.rb +14 -0
  256. data/spec/slack/real_time/rtm_start_spec.rb +1 -0
  257. data/spec/slack/real_time/store_spec.rb +2 -1
  258. data/spec/slack/slack_spec.rb +39 -7
  259. data/spec/slack/version_spec.rb +2 -1
  260. data/spec/slack/web/api/endpoints/admin_analytics_spec.rb +13 -0
  261. data/spec/slack/web/api/endpoints/admin_apps_approved_spec.rb +8 -0
  262. data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +8 -0
  263. data/spec/slack/web/api/endpoints/admin_apps_restricted_spec.rb +8 -0
  264. data/spec/slack/web/api/endpoints/admin_apps_spec.rb +13 -0
  265. data/spec/slack/web/api/endpoints/admin_barriers_spec.rb +38 -0
  266. data/spec/slack/web/api/endpoints/admin_conversations_ekm_spec.rb +8 -0
  267. data/spec/slack/web/api/endpoints/admin_conversations_restrictAccess_spec.rb +32 -0
  268. data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +98 -0
  269. data/spec/slack/web/api/endpoints/admin_conversations_whitelist_spec.rb +32 -0
  270. data/spec/slack/web/api/endpoints/admin_emoji_spec.rb +37 -0
  271. data/spec/slack/web/api/endpoints/admin_inviteRequests_approved_spec.rb +8 -0
  272. data/spec/slack/web/api/endpoints/admin_inviteRequests_denied_spec.rb +8 -0
  273. data/spec/slack/web/api/endpoints/admin_inviteRequests_spec.rb +18 -0
  274. data/spec/slack/web/api/endpoints/admin_teams_admins_spec.rb +13 -0
  275. data/spec/slack/web/api/endpoints/admin_teams_owners_spec.rb +13 -0
  276. data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +53 -0
  277. data/spec/slack/web/api/endpoints/admin_teams_spec.rb +16 -0
  278. data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +37 -0
  279. data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +21 -0
  280. data/spec/slack/web/api/endpoints/admin_users_spec.rb +67 -0
  281. data/spec/slack/web/api/endpoints/api_spec.rb +1 -0
  282. data/spec/slack/web/api/endpoints/apps_connections_spec.rb +8 -0
  283. data/spec/slack/web/api/endpoints/apps_event_authorizations_spec.rb +13 -0
  284. data/spec/slack/web/api/endpoints/apps_permissions_resources_spec.rb +8 -0
  285. data/spec/slack/web/api/endpoints/apps_permissions_scopes_spec.rb +8 -0
  286. data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +16 -0
  287. data/spec/slack/web/api/endpoints/apps_permissions_users_spec.rb +19 -0
  288. data/spec/slack/web/api/endpoints/apps_spec.rb +16 -0
  289. data/spec/slack/web/api/endpoints/auth_teams_spec.rb +8 -0
  290. data/spec/slack/web/api/endpoints/bots_spec.rb +1 -0
  291. data/spec/slack/web/api/endpoints/calls_participants_spec.rb +24 -0
  292. data/spec/slack/web/api/endpoints/calls_spec.rb +31 -0
  293. data/spec/slack/web/api/endpoints/chat_scheduledMessages_spec.rb +8 -0
  294. data/spec/slack/web/api/endpoints/conversations_spec.rb +109 -0
  295. data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +13 -4
  296. data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +5 -3
  297. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +140 -24
  298. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +36 -0
  299. data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +2 -0
  300. data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +21 -6
  301. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +95 -0
  302. data/spec/slack/web/api/endpoints/dnd_spec.rb +6 -0
  303. data/spec/slack/web/api/endpoints/emoji_spec.rb +1 -0
  304. data/spec/slack/web/api/endpoints/files_comments_spec.rb +3 -21
  305. data/spec/slack/web/api/endpoints/files_remote_spec.rb +24 -0
  306. data/spec/slack/web/api/endpoints/files_spec.rb +17 -5
  307. data/spec/slack/web/api/endpoints/im_spec.rb +5 -4
  308. data/spec/slack/web/api/endpoints/migration_spec.rb +13 -0
  309. data/spec/slack/web/api/endpoints/mpim_spec.rb +5 -4
  310. data/spec/slack/web/api/endpoints/oauth_spec.rb +5 -4
  311. data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +13 -0
  312. data/spec/slack/web/api/endpoints/pins_spec.rb +1 -0
  313. data/spec/slack/web/api/endpoints/reactions_spec.rb +8 -1
  314. data/spec/slack/web/api/endpoints/reminders_spec.rb +3 -2
  315. data/spec/slack/web/api/endpoints/rtm_spec.rb +1 -0
  316. data/spec/slack/web/api/endpoints/search_spec.rb +1 -0
  317. data/spec/slack/web/api/endpoints/stars_spec.rb +1 -0
  318. data/spec/slack/web/api/endpoints/team_profile_spec.rb +1 -0
  319. data/spec/slack/web/api/endpoints/team_spec.rb +1 -0
  320. data/spec/slack/web/api/endpoints/usergroups_spec.rb +1 -0
  321. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +3 -2
  322. data/spec/slack/web/api/endpoints/users_admin_spec.rb +18 -0
  323. data/spec/slack/web/api/endpoints/users_prefs_spec.rb +8 -0
  324. data/spec/slack/web/api/endpoints/users_profile_spec.rb +1 -0
  325. data/spec/slack/web/api/endpoints/views_spec.rb +29 -0
  326. data/spec/slack/web/api/endpoints/workflows_spec.rb +26 -0
  327. data/spec/slack/web/api/error_spec.rb +5 -3
  328. data/spec/slack/web/api/errors/slack_error_spec.rb +38 -0
  329. data/spec/slack/web/api/mixins/channels_spec.rb +24 -12
  330. data/spec/slack/web/api/mixins/conversations_list_spec.rb +21 -0
  331. data/spec/slack/web/api/mixins/conversations_spec.rb +43 -0
  332. data/spec/slack/web/api/mixins/groups_spec.rb +24 -12
  333. data/spec/slack/web/api/mixins/users_spec.rb +30 -17
  334. data/spec/slack/web/api/pagination/cursor_spec.rb +100 -0
  335. data/spec/slack/web/client_spec.rb +215 -14
  336. data/spec/slack/web/faraday/response/raise_error_spec.rb +85 -0
  337. data/spec/spec_helper.rb +8 -1
  338. data/spec/support/queue_with_timeout.rb +6 -5
  339. data/spec/support/real_time/concurrency/mock.rb +2 -2
  340. data/spec/support/real_time/connected_client.rb +13 -2
  341. data/spec/support/real_time/event.rb +1 -0
  342. data/spec/support/token.rb +1 -0
  343. data/spec/support/vcr.rb +6 -1
  344. metadata +280 -55
  345. data/examples/hi_real_time/Gemfile +0 -5
  346. data/examples/hi_real_time/hi.gif +0 -0
  347. data/examples/hi_real_time/hi.rb +0 -37
  348. data/examples/hi_real_time_async_celluloid/Gemfile +0 -6
  349. data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
  350. data/examples/hi_real_time_async_eventmachine/hi.rb +0 -36
  351. data/lib/slack/real_time/concurrency/celluloid.rb +0 -113
  352. data/lib/slack/real_time/concurrency/eventmachine.rb +0 -60
  353. data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +0 -13
  354. data/lib/slack/web/api/patches/chat.2.attachments-json.patch +0 -17
  355. data/lib/slack/web/api/patches/chat.3.update-attachments-support.patch +0 -20
  356. data/screenshots/register-bot.png +0 -0
  357. data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -31
  358. data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -47
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+ # This file was auto-generated by lib/tasks/web.rake
3
+
4
+ module Slack
5
+ module Web
6
+ module Api
7
+ module Endpoints
8
+ module ChatScheduledmessages
9
+ #
10
+ # Returns a list of scheduled messages.
11
+ #
12
+ # @option options [channel] :channel
13
+ # The channel of the scheduled messages.
14
+ # @option options [Object] :cursor
15
+ # For pagination purposes, this is the cursor value returned from a previous call to chat.scheduledmessages.list indicating where you want to start this call from.
16
+ # @option options [timestamp] :latest
17
+ # A UNIX timestamp of the latest value in the time range.
18
+ # @option options [Object] :limit
19
+ # Maximum number of original entries to return.
20
+ # @option options [timestamp] :oldest
21
+ # A UNIX timestamp of the oldest value in the time range.
22
+ # @option options [Object] :team_id
23
+ # encoded team id to list channels in, required if org token is used.
24
+ # @see https://api.slack.com/methods/chat.scheduledMessages.list
25
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat.scheduledMessages/chat.scheduledMessages.list.json
26
+ def chat_scheduledMessages_list(options = {})
27
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
28
+ if block_given?
29
+ Pagination::Cursor.new(self, :chat_scheduledMessages_list, options).each do |page|
30
+ yield page
31
+ end
32
+ else
33
+ post('chat.scheduledMessages.list', options)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,332 @@
1
+ # frozen_string_literal: true
2
+ # This file was auto-generated by lib/tasks/web.rake
3
+
4
+ module Slack
5
+ module Web
6
+ module Api
7
+ module Endpoints
8
+ module Conversations
9
+ #
10
+ # Archives a conversation.
11
+ #
12
+ # @option options [channel] :channel
13
+ # ID of conversation to archive.
14
+ # @see https://api.slack.com/methods/conversations.archive
15
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.archive.json
16
+ def conversations_archive(options = {})
17
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
18
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
19
+ post('conversations.archive', options)
20
+ end
21
+
22
+ #
23
+ # Closes a direct message or multi-person direct message.
24
+ #
25
+ # @option options [channel] :channel
26
+ # Conversation to close.
27
+ # @see https://api.slack.com/methods/conversations.close
28
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.close.json
29
+ def conversations_close(options = {})
30
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
31
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
32
+ post('conversations.close', options)
33
+ end
34
+
35
+ #
36
+ # Initiates a public or private channel-based conversation
37
+ #
38
+ # @option options [Object] :name
39
+ # Name of the public or private channel to create.
40
+ # @option options [Object] :is_private
41
+ # Create a private channel instead of a public one.
42
+ # @option options [Object] :team_id
43
+ # encoded team id to create the channel in, required if org token is used.
44
+ # @see https://api.slack.com/methods/conversations.create
45
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.create.json
46
+ def conversations_create(options = {})
47
+ throw ArgumentError.new('Required arguments :name missing') if options[:name].nil?
48
+ post('conversations.create', options)
49
+ end
50
+
51
+ #
52
+ # Fetches a conversation's history of messages and events.
53
+ #
54
+ # @option options [channel] :channel
55
+ # Conversation ID to fetch history for.
56
+ # @option options [Object] :cursor
57
+ # Paginate through collections of data by setting the cursor parameter to a next_cursor attribute returned by a previous request's response_metadata. Default value fetches the first "page" of the collection. See pagination for more detail.
58
+ # @option options [Object] :inclusive
59
+ # Include messages with latest or oldest timestamp in results only when either timestamp is specified.
60
+ # @option options [timestamp] :latest
61
+ # End of time range of messages to include in results.
62
+ # @option options [Object] :limit
63
+ # The maximum number of items to return. Fewer than the requested number of items may be returned, even if the end of the users list hasn't been reached.
64
+ # @option options [timestamp] :oldest
65
+ # Start of time range of messages to include in results.
66
+ # @see https://api.slack.com/methods/conversations.history
67
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.history.json
68
+ def conversations_history(options = {})
69
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
70
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
71
+ if block_given?
72
+ Pagination::Cursor.new(self, :conversations_history, options).each do |page|
73
+ yield page
74
+ end
75
+ else
76
+ post('conversations.history', options)
77
+ end
78
+ end
79
+
80
+ #
81
+ # Retrieve information about a conversation.
82
+ #
83
+ # @option options [channel] :channel
84
+ # Conversation ID to learn more about.
85
+ # @option options [Object] :include_locale
86
+ # Set this to true to receive the locale for this conversation. Defaults to false.
87
+ # @option options [Object] :include_num_members
88
+ # Set to true to include the member count for the specified conversation. Defaults to false.
89
+ # @see https://api.slack.com/methods/conversations.info
90
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.info.json
91
+ def conversations_info(options = {})
92
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
93
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
94
+ post('conversations.info', options)
95
+ end
96
+
97
+ #
98
+ # Invites users to a channel.
99
+ #
100
+ # @option options [channel] :channel
101
+ # The ID of the public or private channel to invite user(s) to.
102
+ # @option options [Object] :users
103
+ # A comma separated list of user IDs. Up to 1000 users may be listed.
104
+ # @see https://api.slack.com/methods/conversations.invite
105
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.invite.json
106
+ def conversations_invite(options = {})
107
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
108
+ throw ArgumentError.new('Required arguments :users missing') if options[:users].nil?
109
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
110
+ post('conversations.invite', options)
111
+ end
112
+
113
+ #
114
+ # Joins an existing conversation.
115
+ #
116
+ # @option options [channel] :channel
117
+ # ID of conversation to join.
118
+ # @see https://api.slack.com/methods/conversations.join
119
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.join.json
120
+ def conversations_join(options = {})
121
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
122
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
123
+ post('conversations.join', options)
124
+ end
125
+
126
+ #
127
+ # Removes a user from a conversation.
128
+ #
129
+ # @option options [channel] :channel
130
+ # ID of conversation to remove user from.
131
+ # @option options [user] :user
132
+ # User ID to be removed.
133
+ # @see https://api.slack.com/methods/conversations.kick
134
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.kick.json
135
+ def conversations_kick(options = {})
136
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
137
+ throw ArgumentError.new('Required arguments :user missing') if options[:user].nil?
138
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
139
+ options = options.merge(user: users_id(options)['user']['id']) if options[:user]
140
+ post('conversations.kick', options)
141
+ end
142
+
143
+ #
144
+ # Leaves a conversation.
145
+ #
146
+ # @option options [channel] :channel
147
+ # Conversation to leave.
148
+ # @see https://api.slack.com/methods/conversations.leave
149
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.leave.json
150
+ def conversations_leave(options = {})
151
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
152
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
153
+ post('conversations.leave', options)
154
+ end
155
+
156
+ #
157
+ # Lists all channels in a Slack team.
158
+ #
159
+ # @option options [Object] :cursor
160
+ # Paginate through collections of data by setting the cursor parameter to a next_cursor attribute returned by a previous request's response_metadata. Default value fetches the first "page" of the collection. See pagination for more detail.
161
+ # @option options [Object] :exclude_archived
162
+ # Set to true to exclude archived channels from the list.
163
+ # @option options [Object] :limit
164
+ # The maximum number of items to return. Fewer than the requested number of items may be returned, even if the end of the list hasn't been reached. Must be an integer no larger than 1000.
165
+ # @option options [Object] :team_id
166
+ # encoded team id to list channels in, required if org token is used.
167
+ # @option options [Object] :types
168
+ # Mix and match channel types by providing a comma-separated list of any combination of public_channel, private_channel, mpim, im.
169
+ # @see https://api.slack.com/methods/conversations.list
170
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.list.json
171
+ def conversations_list(options = {})
172
+ if block_given?
173
+ Pagination::Cursor.new(self, :conversations_list, options).each do |page|
174
+ yield page
175
+ end
176
+ else
177
+ post('conversations.list', options)
178
+ end
179
+ end
180
+
181
+ #
182
+ # Sets the read cursor in a channel.
183
+ #
184
+ # @option options [channel] :channel
185
+ # Channel or conversation to set the read cursor for.
186
+ # @option options [timestamp] :ts
187
+ # Unique identifier of message you want marked as most recently seen in this conversation.
188
+ # @see https://api.slack.com/methods/conversations.mark
189
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.mark.json
190
+ def conversations_mark(options = {})
191
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
192
+ throw ArgumentError.new('Required arguments :ts missing') if options[:ts].nil?
193
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
194
+ post('conversations.mark', options)
195
+ end
196
+
197
+ #
198
+ # Retrieve members of a conversation.
199
+ #
200
+ # @option options [channel] :channel
201
+ # ID of the conversation to retrieve members for.
202
+ # @option options [Object] :cursor
203
+ # Paginate through collections of data by setting the cursor parameter to a next_cursor attribute returned by a previous request's response_metadata. Default value fetches the first "page" of the collection. See pagination for more detail.
204
+ # @option options [Object] :limit
205
+ # The maximum number of items to return. Fewer than the requested number of items may be returned, even if the end of the users list hasn't been reached.
206
+ # @see https://api.slack.com/methods/conversations.members
207
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.members.json
208
+ def conversations_members(options = {})
209
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
210
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
211
+ if block_given?
212
+ Pagination::Cursor.new(self, :conversations_members, options).each do |page|
213
+ yield page
214
+ end
215
+ else
216
+ post('conversations.members', options)
217
+ end
218
+ end
219
+
220
+ #
221
+ # Opens or resumes a direct message or multi-person direct message.
222
+ #
223
+ # @option options [channel] :channel
224
+ # Resume a conversation by supplying an im or mpim's ID. Or provide the users field instead.
225
+ # @option options [Object] :return_im
226
+ # Boolean, indicates you want the full IM channel definition in the response.
227
+ # @option options [Object] :users
228
+ # Comma separated lists of users. If only one user is included, this creates a 1:1 DM. The ordering of the users is preserved whenever a multi-person direct message is returned. Supply a channel when not supplying users.
229
+ # @see https://api.slack.com/methods/conversations.open
230
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.open.json
231
+ def conversations_open(options = {})
232
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
233
+ post('conversations.open', options)
234
+ end
235
+
236
+ #
237
+ # Renames a conversation.
238
+ #
239
+ # @option options [channel] :channel
240
+ # ID of conversation to rename.
241
+ # @option options [Object] :name
242
+ # New name for conversation.
243
+ # @see https://api.slack.com/methods/conversations.rename
244
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.rename.json
245
+ def conversations_rename(options = {})
246
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
247
+ throw ArgumentError.new('Required arguments :name missing') if options[:name].nil?
248
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
249
+ post('conversations.rename', options)
250
+ end
251
+
252
+ #
253
+ # Retrieve a thread of messages posted to a conversation
254
+ #
255
+ # @option options [channel] :channel
256
+ # Conversation ID to fetch thread from.
257
+ # @option options [timestamp] :ts
258
+ # Unique identifier of a thread's parent message. ts must be the timestamp of an existing message with 0 or more replies. If there are no replies then just the single message referenced by ts will return - it is just an ordinary, unthreaded message.
259
+ # @option options [Object] :cursor
260
+ # Paginate through collections of data by setting the cursor parameter to a next_cursor attribute returned by a previous request's response_metadata. Default value fetches the first "page" of the collection. See pagination for more detail.
261
+ # @option options [Object] :inclusive
262
+ # Include messages with latest or oldest timestamp in results only when either timestamp is specified.
263
+ # @option options [timestamp] :latest
264
+ # End of time range of messages to include in results.
265
+ # @option options [Object] :limit
266
+ # The maximum number of items to return. Fewer than the requested number of items may be returned, even if the end of the users list hasn't been reached.
267
+ # @option options [timestamp] :oldest
268
+ # Start of time range of messages to include in results.
269
+ # @see https://api.slack.com/methods/conversations.replies
270
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.replies.json
271
+ def conversations_replies(options = {})
272
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
273
+ throw ArgumentError.new('Required arguments :ts missing') if options[:ts].nil?
274
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
275
+ if block_given?
276
+ Pagination::Cursor.new(self, :conversations_replies, options).each do |page|
277
+ yield page
278
+ end
279
+ else
280
+ post('conversations.replies', options)
281
+ end
282
+ end
283
+
284
+ #
285
+ # Sets the purpose for a conversation.
286
+ #
287
+ # @option options [channel] :channel
288
+ # Conversation to set the purpose of.
289
+ # @option options [Object] :purpose
290
+ # A new, specialer purpose.
291
+ # @see https://api.slack.com/methods/conversations.setPurpose
292
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.setPurpose.json
293
+ def conversations_setPurpose(options = {})
294
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
295
+ throw ArgumentError.new('Required arguments :purpose missing') if options[:purpose].nil?
296
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
297
+ post('conversations.setPurpose', options)
298
+ end
299
+
300
+ #
301
+ # Sets the topic for a conversation.
302
+ #
303
+ # @option options [channel] :channel
304
+ # Conversation to set the topic of.
305
+ # @option options [Object] :topic
306
+ # The new topic string. Does not support formatting or linkification.
307
+ # @see https://api.slack.com/methods/conversations.setTopic
308
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.setTopic.json
309
+ def conversations_setTopic(options = {})
310
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
311
+ throw ArgumentError.new('Required arguments :topic missing') if options[:topic].nil?
312
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
313
+ post('conversations.setTopic', options)
314
+ end
315
+
316
+ #
317
+ # Reverses conversation archival.
318
+ #
319
+ # @option options [channel] :channel
320
+ # ID of conversation to unarchive.
321
+ # @see https://api.slack.com/methods/conversations.unarchive
322
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/conversations/conversations.unarchive.json
323
+ def conversations_unarchive(options = {})
324
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
325
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
326
+ post('conversations.unarchive', options)
327
+ end
328
+ end
329
+ end
330
+ end
331
+ end
332
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+ # This file was auto-generated by lib/tasks/web.rake
3
+
4
+ module Slack
5
+ module Web
6
+ module Api
7
+ module Endpoints
8
+ module Dialog
9
+ #
10
+ # Open a dialog with a user
11
+ #
12
+ # @option options [Object] :dialog
13
+ # The dialog definition. This must be a JSON-encoded string.
14
+ # @option options [Object] :trigger_id
15
+ # Exchange a trigger to post to the user.
16
+ # @see https://api.slack.com/methods/dialog.open
17
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/dialog/dialog.open.json
18
+ def dialog_open(options = {})
19
+ throw ArgumentError.new('Required arguments :dialog missing') if options[:dialog].nil?
20
+ throw ArgumentError.new('Required arguments :trigger_id missing') if options[:trigger_id].nil?
21
+ # dialog must be passed as an encoded JSON string
22
+ if options.key?(:dialog)
23
+ dialog = options[:dialog]
24
+ dialog = JSON.dump(dialog) unless dialog.is_a?(String)
25
+ options = options.merge(dialog: dialog)
26
+ end
27
+ post('dialog.open', options)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # This file was auto-generated by lib/tasks/web.rake
2
3
 
3
4
  module Slack
@@ -6,10 +7,10 @@ module Slack
6
7
  module Endpoints
7
8
  module Dnd
8
9
  #
9
- # Ends the user's currently scheduled Do Not Disturb session immediately.
10
+ # Ends the current user's Do Not Disturb session immediately.
10
11
  #
11
12
  # @see https://api.slack.com/methods/dnd.endDnd
12
- # @see https://github.com/dblock/slack-api-ref/blob/master/methods/dnd/dnd.endDnd.json
13
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/dnd/dnd.endDnd.json
13
14
  def dnd_endDnd(options = {})
14
15
  post('dnd.endDnd', options)
15
16
  end
@@ -18,43 +19,44 @@ module Slack
18
19
  # Ends the current user's snooze mode immediately.
19
20
  #
20
21
  # @see https://api.slack.com/methods/dnd.endSnooze
21
- # @see https://github.com/dblock/slack-api-ref/blob/master/methods/dnd/dnd.endSnooze.json
22
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/dnd/dnd.endSnooze.json
22
23
  def dnd_endSnooze(options = {})
23
24
  post('dnd.endSnooze', options)
24
25
  end
25
26
 
26
27
  #
27
- # Provides information about a user's current Do Not Disturb settings.
28
+ # Retrieves a user's current Do Not Disturb status.
28
29
  #
29
30
  # @option options [user] :user
30
31
  # User to fetch status for (defaults to current user).
31
32
  # @see https://api.slack.com/methods/dnd.info
32
- # @see https://github.com/dblock/slack-api-ref/blob/master/methods/dnd/dnd.info.json
33
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/dnd/dnd.info.json
33
34
  def dnd_info(options = {})
34
35
  options = options.merge(user: users_id(options)['user']['id']) if options[:user]
35
36
  post('dnd.info', options)
36
37
  end
37
38
 
38
39
  #
39
- # Adjusts the snooze duration for a user's Do Not Disturb settings. If a snooze session is not already active for the user, invoking this method will begin one for the specified duration.
40
+ # Turns on Do Not Disturb mode for the current user, or changes its duration.
40
41
  #
41
42
  # @option options [Object] :num_minutes
42
43
  # Number of minutes, from now, to snooze until.
43
44
  # @see https://api.slack.com/methods/dnd.setSnooze
44
- # @see https://github.com/dblock/slack-api-ref/blob/master/methods/dnd/dnd.setSnooze.json
45
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/dnd/dnd.setSnooze.json
45
46
  def dnd_setSnooze(options = {})
46
47
  throw ArgumentError.new('Required arguments :num_minutes missing') if options[:num_minutes].nil?
47
48
  post('dnd.setSnooze', options)
48
49
  end
49
50
 
50
51
  #
51
- # Provides information about the current Do Not Disturb settings for users of a Slack team.
52
+ # Retrieves the Do Not Disturb status for up to 50 users on a team.
52
53
  #
53
54
  # @option options [Object] :users
54
55
  # Comma-separated list of users to fetch Do Not Disturb status for.
55
56
  # @see https://api.slack.com/methods/dnd.teamInfo
56
- # @see https://github.com/dblock/slack-api-ref/blob/master/methods/dnd/dnd.teamInfo.json
57
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/dnd/dnd.teamInfo.json
57
58
  def dnd_teamInfo(options = {})
59
+ throw ArgumentError.new('Required arguments :users missing') if options[:users].nil?
58
60
  post('dnd.teamInfo', options)
59
61
  end
60
62
  end