slack-ruby-client 0.13.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -1,10 +1,13 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Api
4
5
  module Ping
5
6
  #
6
- # Clients should try to quickly detect disconnections, even in idle periods, so that users can easily tell the
7
- # difference between being disconnected and everyone being quiet. Not all web browsers support the WebSocket
7
+ # Clients should try to quickly detect disconnections, even in idle periods, so that users
8
+ # can easily tell the
9
+ # difference between being disconnected and everyone being quiet. Not all web browsers
10
+ # support the WebSocket
8
11
  # ping spec, so the RTM protocol also supports ping/pong messages.
9
12
  #
10
13
  def ping(options = {})
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Api
@@ -6,7 +7,8 @@ module Slack
6
7
  # Send a typing indicator to indicate that the user is currently writing a message.
7
8
  #
8
9
  # @option options [channel] :channel
9
- # Channel to send message to. Can be a public channel, private group or IM channel. Can be an encoded ID, or a name.
10
+ # Channel to send message to. Can be a public channel, private group or IM channel.
11
+ # Can be an encoded ID, or a name.
10
12
  def typing(options = {})
11
13
  throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
12
14
  send_json({ type: 'typing', id: next_id }.merge(options))
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  class Client
4
5
  class ClientNotStartedError < StandardError; end
6
+
5
7
  class ClientAlreadyStartedError < StandardError; end
6
8
 
7
9
  include Api::MessageId
@@ -15,12 +17,8 @@ module Slack
15
17
  attr_accessor :events
16
18
  end
17
19
 
18
- attr_accessor :web_client
19
- attr_accessor :store
20
- attr_accessor :url
21
- attr_accessor(*Config::ATTRIBUTES)
20
+ attr_accessor :web_client, :store, :url, *Config::ATTRIBUTES
22
21
 
23
- protected :logger, :logger=
24
22
  protected :store_class, :store_class=
25
23
 
26
24
  def initialize(options = {})
@@ -35,7 +33,7 @@ module Slack
35
33
 
36
34
  %i[users self channels team teams groups ims bots].each do |store_method|
37
35
  define_method store_method do
38
- store.send(store_method) if store
36
+ store&.send(store_method)
39
37
  end
40
38
  end
41
39
 
@@ -47,7 +45,7 @@ module Slack
47
45
  # Start RealTime client and block until it disconnects.
48
46
  def start!(&block)
49
47
  @callback = block if block_given?
50
- @socket = build_socket
48
+ build_socket
51
49
  @socket.start_sync(self)
52
50
  end
53
51
 
@@ -55,17 +53,18 @@ module Slack
55
53
  # The RealTime::Client will run in the background.
56
54
  def start_async(&block)
57
55
  @callback = block if block_given?
58
- @socket = build_socket
56
+ build_socket
59
57
  @socket.start_async(self)
60
58
  end
61
59
 
62
60
  def stop!
63
61
  raise ClientNotStartedError unless started?
64
- @socket.disconnect! if @socket
62
+
63
+ @socket&.disconnect!
65
64
  end
66
65
 
67
66
  def started?
68
- @socket && @socket.connected?
67
+ @socket&.connected?
69
68
  end
70
69
 
71
70
  class << self
@@ -80,38 +79,105 @@ module Slack
80
79
 
81
80
  def run_loop
82
81
  @socket.connect! do |driver|
83
- @callback.call(driver) if @callback
84
-
85
82
  driver.on :open do |event|
86
- logger.debug("#{self.class}##{__method__}") { event.class.name }
87
- open(event)
83
+ logger.debug("#{self}##{__method__}") { event.class.name }
84
+ open_event(event)
88
85
  callback(event, :open)
89
86
  end
90
87
 
91
88
  driver.on :message do |event|
92
- logger.debug("#{self.class}##{__method__}") { "#{event.class}, #{event.data}" }
89
+ logger.debug("#{self}##{__method__}") { "#{event.class}, #{event.data}" }
93
90
  dispatch(event)
94
91
  end
95
92
 
96
93
  driver.on :close do |event|
97
- logger.debug("#{self.class}##{__method__}") { event.class.name }
94
+ logger.debug("#{self}##{__method__}") { event.class.name }
98
95
  callback(event, :close)
99
96
  close(event)
100
97
  callback(event, :closed)
101
98
  end
99
+
100
+ # This must be called last to ensure any events are registered before invoking user code.
101
+ @callback&.call(driver)
102
+ end
103
+ end
104
+
105
+ # Ensure the server is running, and ping the remote server if no other messages were sent.
106
+ def keep_alive?
107
+ # We can't ping the remote server if we aren't connected.
108
+ return false if @socket.nil? || !@socket.connected?
109
+
110
+ time_since_last_message = @socket.time_since_last_message
111
+
112
+ # If the server responded within the specified time, we are okay:
113
+ return true if time_since_last_message < websocket_ping
114
+
115
+ # If the server has not responded for a while:
116
+ return false if time_since_last_message > (websocket_ping * 2)
117
+
118
+ # Kick off the next ping message:
119
+ ping
120
+
121
+ true
122
+ end
123
+
124
+ # Check if the remote server is responsive, and if not, restart the connection.
125
+ def run_ping!
126
+ return if keep_alive?
127
+
128
+ logger.warn(to_s) { 'is offline' }
129
+
130
+ restart_async
131
+ rescue Slack::Web::Api::Errors::SlackError => e
132
+ # stop pinging if bot was uninstalled
133
+ case e.message
134
+ when 'account_inactive', 'invalid_auth'
135
+ logger.warn(to_s) { e.message }
136
+ raise e
137
+ end
138
+ logger.debug("#{self}##{__method__}") { e }
139
+ rescue StandardError => e
140
+ # disregard all ping worker failures, keep pinging
141
+ logger.debug("#{self}##{__method__}") { e }
142
+ end
143
+
144
+ def run_ping?
145
+ !websocket_ping.nil? && websocket_ping.positive?
146
+ end
147
+
148
+ def websocket_ping_timer
149
+ websocket_ping / 2
150
+ end
151
+
152
+ def to_s
153
+ if store&.team
154
+ "id=#{store.team.id}, name=#{store.team.name}, domain=#{store.team.domain}"
155
+ else
156
+ super
102
157
  end
103
158
  end
104
159
 
105
160
  protected
106
161
 
162
+ def restart_async
163
+ logger.debug("#{self}##{__method__}")
164
+ @socket.close
165
+ start = web_client.send(rtm_start_method, start_options)
166
+ data = Slack::Messages::Message.new(start)
167
+ @url = data.url
168
+ @store = @store_class.new(data) if @store_class
169
+ @socket.restart_async(self, @url)
170
+ end
171
+
107
172
  # @return [Slack::RealTime::Socket]
108
173
  def build_socket
109
174
  raise ClientAlreadyStartedError if started?
175
+
110
176
  start = web_client.send(rtm_start_method, start_options)
111
177
  data = Slack::Messages::Message.new(start)
112
178
  @url = data.url
113
179
  @store = @store_class.new(data) if @store_class
114
- socket_class.new(@url, socket_options)
180
+ @socket = socket_class.new(@url, socket_options)
115
181
  end
116
182
 
117
183
  def rtm_start_method
@@ -133,23 +199,22 @@ module Slack
133
199
  end
134
200
 
135
201
  attr_reader :callbacks
202
+
136
203
  def socket_class
137
204
  concurrency::Socket
138
205
  end
139
206
 
140
207
  def send_json(data)
141
208
  raise ClientNotStartedError unless started?
142
- logger.debug("#{self.class}##{__method__}") { data }
209
+
210
+ logger.debug("#{self}##{__method__}") { data }
143
211
  @socket.send_data(data.to_json)
144
212
  end
145
213
 
146
- def open(_event); end
214
+ def open_event(_event); end
147
215
 
148
216
  def close(_event)
149
- socket = @socket
150
- @socket = nil
151
-
152
- [socket, socket_class].each do |s|
217
+ [@socket, socket_class].each do |s|
153
218
  s.close if s.respond_to?(:close)
154
219
  end
155
220
  end
@@ -157,50 +222,54 @@ module Slack
157
222
  def callback(event, type)
158
223
  callbacks = self.callbacks[type.to_s]
159
224
  return false unless callbacks
225
+
160
226
  callbacks.each do |c|
161
227
  c.call(event)
162
228
  end
163
229
  true
164
230
  rescue StandardError => e
165
- logger.error e
231
+ logger.error("#{self}##{__method__}") { e }
166
232
  false
167
233
  end
168
234
 
169
235
  def dispatch(event)
170
236
  return false unless event.data
237
+
171
238
  data = Slack::Messages::Message.new(JSON.parse(event.data))
172
239
  type = data.type
173
240
  return false unless type
241
+
174
242
  type = type.to_s
175
- logger.debug("#{self.class}##{__method__}") { data.to_s }
243
+ logger.debug("#{self}##{__method__}") { data.to_s }
176
244
  run_handlers(type, data) if @store
177
245
  run_callbacks(type, data)
178
246
  rescue StandardError => e
179
- logger.error e
247
+ logger.error("#{self}##{__method__}") { e }
180
248
  false
181
249
  end
182
250
 
183
251
  def run_handlers(type, data)
252
+ return unless store.class.events
253
+
184
254
  handlers = store.class.events[type.to_s]
185
- if handlers
186
- handlers.each do |handler|
187
- store.instance_exec(data, &handler)
188
- end
255
+ handlers&.each do |handler|
256
+ store.instance_exec(data, &handler)
189
257
  end
190
258
  rescue StandardError => e
191
- logger.error e
259
+ logger.error("#{self}##{__method__}") { e }
192
260
  false
193
261
  end
194
262
 
195
263
  def run_callbacks(type, data)
196
264
  callbacks = self.callbacks[type]
197
265
  return false unless callbacks
266
+
198
267
  callbacks.each do |c|
199
268
  c.call(data)
200
269
  end
201
270
  true
202
271
  rescue StandardError => e
203
- logger.error e
272
+ logger.error("#{self}##{__method__}") { e }
204
273
  false
205
274
  end
206
275
  end
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  require 'async/websocket'
3
+ require 'async/notification'
4
+ require 'async/clock'
2
5
 
3
6
  module Slack
4
7
  module RealTime
@@ -12,28 +15,89 @@ module Slack
12
15
  class Socket < Slack::RealTime::Socket
13
16
  attr_reader :client
14
17
 
18
+ def start_sync(client)
19
+ start_reactor(client).wait
20
+ end
21
+
15
22
  def start_async(client)
16
23
  Thread.new do
17
- ::Async::Reactor.run do
18
- client.run_loop
24
+ start_reactor(client)
25
+ end
26
+ end
27
+
28
+ def start_reactor(client)
29
+ Async do |task|
30
+ @restart = ::Async::Notification.new
31
+
32
+ if client.run_ping?
33
+ @ping_task = task.async do |subtask|
34
+ subtask.annotate "#{client} keep-alive"
35
+
36
+ # The timer task will naturally exit after the driver is set to nil.
37
+ while @restart
38
+ subtask.sleep client.websocket_ping_timer
39
+ client.run_ping! if @restart
40
+ end
41
+ end
42
+ end
43
+
44
+ while @restart
45
+ @client_task&.stop
46
+
47
+ @client_task = task.async do |subtask|
48
+ subtask.annotate "#{client} run-loop"
49
+ client.run_loop
50
+ rescue ::Async::Wrapper::Cancelled => e
51
+ # Will get restarted by ping worker.
52
+ rescue StandardError => e
53
+ client.logger.error(subtask.to_s) { e.message }
54
+ end
55
+
56
+ @restart.wait
19
57
  end
58
+
59
+ @ping_task&.stop
20
60
  end
21
61
  end
22
62
 
63
+ def restart_async(_client, new_url)
64
+ @url = new_url
65
+ @last_message_at = current_time
66
+
67
+ @restart&.signal
68
+ end
69
+
70
+ def current_time
71
+ ::Async::Clock.now
72
+ end
73
+
23
74
  def connect!
24
75
  super
25
76
  run_loop
26
77
  end
27
78
 
79
+ # Kill the restart/ping loop.
80
+ def disconnect!
81
+ super
82
+ ensure
83
+ if (restart = @restart)
84
+ @restart = nil
85
+ restart.signal
86
+ end
87
+ end
88
+
89
+ # Close the socket.
28
90
  def close
29
- @closing = true
30
- @driver.close if @driver
31
91
  super
92
+ ensure
93
+ if @socket
94
+ @socket.close
95
+ @socket = nil
96
+ end
32
97
  end
33
98
 
34
99
  def run_loop
35
- @closing = false
36
- while @driver && @driver.next_event
100
+ while @driver&.next_event
37
101
  # $stderr.puts event.inspect
38
102
  end
39
103
  end
@@ -65,3 +129,10 @@ module Slack
65
129
  end
66
130
  end
67
131
  end
132
+
133
+ if Gem::Version.new(Async::WebSocket::VERSION) >= Gem::Version.new('0.9.0')
134
+ raise(
135
+ "Incompatible version of async-websocket, #{Async::WebSocket::VERSION}, " \
136
+ "use \"gem 'async-websocket', '~> 0.8.0'\"."
137
+ )
138
+ end
@@ -1,9 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Concurrency
4
5
  autoload :Async, 'slack/real_time/concurrency/async'
5
- autoload :Eventmachine, 'slack/real_time/concurrency/eventmachine'
6
- autoload :Celluloid, 'slack/real_time/concurrency/celluloid'
7
6
  end
8
7
  end
9
8
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Config
@@ -16,7 +17,8 @@ module Slack
16
17
  logger
17
18
  ].freeze
18
19
 
19
- attr_accessor(*Config::ATTRIBUTES)
20
+ attr_accessor(*Config::ATTRIBUTES - [:concurrency])
21
+ attr_writer :concurrency
20
22
 
21
23
  def reset
22
24
  self.websocket_ping = 30
@@ -36,15 +38,9 @@ module Slack
36
38
  private
37
39
 
38
40
  def detect_concurrency
39
- %i[Async Eventmachine Celluloid].each do |concurrency|
40
- begin
41
- return Slack::RealTime::Concurrency.const_get(concurrency)
42
- rescue LoadError, NameError
43
- false # could not be loaded, missing dependencies
44
- end
45
- end
46
-
47
- raise NoConcurrencyError, 'Missing concurrency. Add async-websocket, faye-websocket or celluloid-io to your Gemfile.'
41
+ Slack::RealTime::Concurrency.const_get(:Async)
42
+ rescue LoadError, NameError
43
+ raise NoConcurrencyError, 'Missing concurrency. Add async-websocket to your Gemfile.'
48
44
  end
49
45
  end
50
46
 
@@ -1,11 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Models
4
5
  class Base < Hashie::Mash
5
- def presence
6
- super['presence']
7
- end
8
-
9
6
  # see https://github.com/intridea/hashie/issues/394
10
7
  def log_built_in_message(*); end
11
8
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Models
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Models
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Models
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Models
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Models
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Models
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'models/base'
2
3
  require_relative 'models/user'
3
4
  require_relative 'models/bot'
@@ -1,25 +1,24 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  class Socket
4
- attr_accessor :url
5
- attr_accessor :options
5
+ attr_accessor :url, :options
6
6
  attr_reader :driver
7
- attr_reader :logger
8
- protected :logger
9
7
 
10
8
  def initialize(url, options = {})
11
9
  @url = url
12
- @options = options
10
+ @options = options.dup
13
11
  @driver = nil
14
- @logger = options.delete(:logger) || Slack::RealTime::Config.logger || Slack::Config.logger
12
+ @logger = @options.delete(:logger) || Slack::RealTime::Config.logger || Slack::Config.logger
13
+ @last_message_at = nil
15
14
  end
16
15
 
17
16
  def send_data(message)
18
17
  logger.debug("#{self.class}##{__method__}") { message }
19
18
  case message
20
- when Numeric then driver.text(message.to_s)
21
- when String then driver.text(message)
22
- when Array then driver.binary(message)
19
+ when Numeric then @driver.text(message.to_s)
20
+ when String then @driver.text(message)
21
+ when Array then @driver.binary(message)
23
22
  else false
24
23
  end
25
24
  end
@@ -28,24 +27,31 @@ module Slack
28
27
  return if connected?
29
28
 
30
29
  connect
31
- logger.debug("#{self.class}##{__method__}") { driver.class }
30
+ logger.debug("#{self.class}##{__method__}") { @driver.class }
31
+
32
+ @driver.on :message do
33
+ @last_message_at = current_time
34
+ end
32
35
 
33
- yield driver if block_given?
36
+ yield @driver if block_given?
34
37
  end
35
38
 
39
+ # Gracefully shut down the connection.
36
40
  def disconnect!
37
- driver.close
41
+ @driver.close
42
+ ensure
43
+ close
38
44
  end
39
45
 
40
46
  def connected?
41
- !driver.nil?
47
+ !@driver.nil?
42
48
  end
43
49
 
44
50
  def start_sync(client)
45
51
  thread = start_async(client)
46
- thread.join if thread
52
+ thread&.join
47
53
  rescue Interrupt
48
- thread.exit if thread
54
+ thread&.exit
49
55
  end
50
56
 
51
57
  # @return [#join]
@@ -53,12 +59,34 @@ module Slack
53
59
  raise NotImplementedError, "Expected #{self.class} to implement #{__method__}."
54
60
  end
55
61
 
62
+ def restart_async(_client, _url)
63
+ raise NotImplementedError, "Expected #{self.class} to implement #{__method__}."
64
+ end
65
+
66
+ def time_since_last_message
67
+ return 0 unless @last_message_at
68
+
69
+ current_time - @last_message_at
70
+ end
71
+
72
+ def current_time
73
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
74
+ end
75
+
56
76
  def close
77
+ # When you call `driver.emit(:close)`, it will typically end up calling `client.close`
78
+ # which will call `@socket.close` and end up back here. In order to break this infinite
79
+ # recursion, we check and set `@driver = nil` before invoking `client.close`.
80
+ return unless (driver = @driver)
81
+
57
82
  @driver = nil
83
+ driver.emit(:close)
58
84
  end
59
85
 
60
86
  protected
61
87
 
88
+ attr_reader :logger
89
+
62
90
  def addr
63
91
  URI(url).host
64
92
  end
@@ -69,9 +97,9 @@ module Slack
69
97
 
70
98
  def port
71
99
  case (uri = URI(url)).scheme
72
- when 'wss'.freeze, 'https'.freeze
100
+ when 'wss', 'https'
73
101
  URI::HTTPS::DEFAULT_PORT
74
- when 'ws', 'http'.freeze
102
+ when 'ws', 'http'
75
103
  URI::HTTP::DEFAULT_PORT
76
104
  else
77
105
  uri.port
@@ -1,16 +1,14 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Stores
4
5
  # Doesn't store anything.
5
6
  class Base
6
- class_attribute :events
7
+ class << self
8
+ attr_accessor :events
9
+ end
7
10
 
8
- attr_accessor :users
9
- attr_accessor :bots
10
- attr_accessor :channels
11
- attr_accessor :groups
12
- attr_accessor :teams
13
- attr_accessor :ims
11
+ attr_accessor :users, :bots, :channels, :groups, :teams, :ims
14
12
 
15
13
  def self
16
14
  nil
@@ -1,11 +1,10 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Stores
4
5
  # Only stores initial information.
5
6
  class Starter < Base
6
- attr_reader :self
7
-
8
- attr_reader :team
7
+ attr_reader :self, :team
9
8
 
10
9
  def initialize(attrs)
11
10
  @team = Models::Team.new(attrs.team)
@@ -14,6 +13,21 @@ module Slack
14
13
 
15
14
  ### RealTime Events
16
15
 
16
+ # A shared channel invite was sent to a Slack user.
17
+ # @see https://api.slack.com/events/shared_channel_invite_received
18
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/events/shared_channel_invite_received.json
19
+ # on :shared_channel_invite_received do |data|
20
+
21
+ # An enterprise grid migration has started on an external workspace..
22
+ # @see https://api.slack.com/events/external_org_migration_started
23
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/events/external_org_migration_started.json
24
+ # on :external_org_migration_started do |data|
25
+
26
+ # An enterprise grid migration has finished on an external workspace..
27
+ # @see https://api.slack.com/events/external_org_migration_finished
28
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/events/external_org_migration_finished.json
29
+ # on :external_org_migration_finished do |data|
30
+
17
31
  # A private channel was deleted.
18
32
  # @see https://api.slack.com/events/group_deleted
19
33
  # @see https://github.com/slack-ruby/slack-api-ref/blob/master/events/group_deleted.json