slack-ruby-client 0.11.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. checksums.yaml +5 -5
  2. data/.coveralls.yml +2 -0
  3. data/.github/FUNDING.yml +2 -0
  4. data/.github/dependabot.yml +6 -0
  5. data/.github/workflows/integration_test.yml +45 -0
  6. data/.github/workflows/lint.yml +14 -0
  7. data/.github/workflows/pr_lint.yml +21 -0
  8. data/.github/workflows/test.yml +56 -0
  9. data/.github/workflows/update_api.yml +81 -0
  10. data/.gitignore +7 -3
  11. data/.rubocop.yml +40 -2
  12. data/.rubocop_todo.yml +209 -55
  13. data/.ruby-version +1 -0
  14. data/CHANGELOG.md +257 -30
  15. data/CONTRIBUTING.md +44 -29
  16. data/Dangerfile +2 -0
  17. data/Gemfile +28 -6
  18. data/Gemfile.danger +6 -0
  19. data/LICENSE.md +1 -1
  20. data/README.md +473 -134
  21. data/RELEASING.md +2 -2
  22. data/Rakefile +2 -1
  23. data/SECURITY.md +9 -0
  24. data/UPGRADING.md +117 -3
  25. data/bin/commands/admin_analytics.rb +22 -0
  26. data/bin/commands/admin_apps.rb +57 -0
  27. data/bin/commands/admin_apps_activities.rb +32 -0
  28. data/bin/commands/admin_apps_approved.rb +24 -0
  29. data/bin/commands/admin_apps_config.rb +31 -0
  30. data/bin/commands/admin_apps_requests.rb +35 -0
  31. data/bin/commands/admin_apps_restricted.rb +24 -0
  32. data/bin/commands/admin_audit_anomaly_allow.rb +29 -0
  33. data/bin/commands/admin_auth_policy.rb +45 -0
  34. data/bin/commands/admin_barriers.rb +53 -0
  35. data/bin/commands/admin_conversations.rb +260 -0
  36. data/bin/commands/admin_conversations_ekm.rb +23 -0
  37. data/bin/commands/admin_conversations_restrictAccess.rb +43 -0
  38. data/bin/commands/admin_emoji.rb +60 -0
  39. data/bin/commands/admin_functions.rb +23 -0
  40. data/bin/commands/admin_functions_permissions.rb +31 -0
  41. data/bin/commands/admin_inviteRequests.rb +42 -0
  42. data/bin/commands/admin_inviteRequests_approved.rb +22 -0
  43. data/bin/commands/admin_inviteRequests_denied.rb +22 -0
  44. data/bin/commands/admin_roles.rb +46 -0
  45. data/bin/commands/admin_teams.rb +33 -0
  46. data/bin/commands/admin_teams_admins.rb +22 -0
  47. data/bin/commands/admin_teams_owners.rb +22 -0
  48. data/bin/commands/admin_teams_settings.rb +70 -0
  49. data/bin/commands/admin_usergroups.rb +54 -0
  50. data/bin/commands/admin_users.rb +106 -0
  51. data/bin/commands/admin_users_session.rb +84 -0
  52. data/bin/commands/admin_users_unsupportedVersions.rb +21 -0
  53. data/bin/commands/admin_workflows.rb +42 -0
  54. data/bin/commands/admin_workflows_collaborators.rb +31 -0
  55. data/bin/commands/admin_workflows_permissions.rb +21 -0
  56. data/bin/commands/admin_workflows_triggers_types_permissions.rb +31 -0
  57. data/bin/commands/api.rb +15 -9
  58. data/bin/commands/apps.rb +21 -0
  59. data/bin/commands/apps_activities.rb +32 -0
  60. data/bin/commands/apps_auth_external.rb +32 -0
  61. data/bin/commands/apps_connections.rb +19 -0
  62. data/bin/commands/apps_datastore.rb +116 -0
  63. data/bin/commands/apps_event_authorizations.rb +22 -0
  64. data/bin/commands/apps_manifest.rb +58 -0
  65. data/bin/commands/assistant_search.rb +27 -0
  66. data/bin/commands/assistant_threads.rb +45 -0
  67. data/bin/commands/auth.rb +22 -15
  68. data/bin/commands/auth_teams.rb +22 -0
  69. data/bin/commands/bookmarks.rb +60 -0
  70. data/bin/commands/bots.rb +16 -8
  71. data/bin/commands/calls.rb +58 -0
  72. data/bin/commands/calls_participants.rb +31 -0
  73. data/bin/commands/canvases.rb +41 -0
  74. data/bin/commands/canvases_access.rb +34 -0
  75. data/bin/commands/canvases_sections.rb +21 -0
  76. data/bin/commands/chat.rb +158 -99
  77. data/bin/commands/chat_scheduledMessages.rb +25 -0
  78. data/bin/commands/conversations.rb +241 -157
  79. data/bin/commands/conversations_canvases.rb +22 -0
  80. data/bin/commands/conversations_externalInvitePermissions.rb +22 -0
  81. data/bin/commands/conversations_requestSharedInvite.rb +48 -0
  82. data/bin/commands/dialog.rb +16 -9
  83. data/bin/commands/dnd.rb +47 -38
  84. data/bin/commands/emoji.rb +15 -7
  85. data/bin/commands/files.rb +113 -87
  86. data/bin/commands/files_comments.rb +16 -30
  87. data/bin/commands/files_remote.rb +84 -0
  88. data/bin/commands/functions.rb +31 -0
  89. data/bin/commands/functions_distributions_permissions.rb +61 -0
  90. data/bin/commands/functions_workflows_steps.rb +23 -0
  91. data/bin/commands/functions_workflows_steps_responses.rb +23 -0
  92. data/bin/commands/migration.rb +17 -9
  93. data/bin/commands/oauth.rb +19 -24
  94. data/bin/commands/oauth_v2.rb +35 -0
  95. data/bin/commands/openid_connect.rb +33 -0
  96. data/bin/commands/pins.rb +33 -30
  97. data/bin/commands/reactions.rb +53 -45
  98. data/bin/commands/reminders.rb +54 -41
  99. data/bin/commands/rtm.rb +16 -22
  100. data/bin/commands/search.rb +44 -33
  101. data/bin/commands/stars.rb +39 -29
  102. data/bin/commands/team.rb +50 -34
  103. data/bin/commands/team_billing.rb +19 -0
  104. data/bin/commands/team_externalTeams.rb +35 -0
  105. data/bin/commands/team_preferences.rb +19 -0
  106. data/bin/commands/team_profile.rb +15 -8
  107. data/bin/commands/tooling_tokens.rb +20 -0
  108. data/bin/commands/usergroups.rb +69 -53
  109. data/bin/commands/usergroups_users.rb +30 -19
  110. data/bin/commands/users.rb +114 -84
  111. data/bin/commands/users_admin.rb +29 -22
  112. data/bin/commands/users_discoverableContacts.rb +20 -0
  113. data/bin/commands/users_prefs.rb +14 -7
  114. data/bin/commands/users_profile.rb +27 -20
  115. data/bin/commands/views.rb +56 -0
  116. data/bin/commands/workflows.rb +44 -0
  117. data/bin/commands/workflows_triggers_permissions.rb +60 -0
  118. data/bin/slack +50 -46
  119. data/examples/files_upload_v2/.env.example +1 -0
  120. data/examples/{hi_real_time → files_upload_v2}/Gemfile +2 -2
  121. data/examples/files_upload_v2/README.md +13 -0
  122. data/examples/files_upload_v2/files_upload_v2.rb +45 -0
  123. data/examples/hi_real_time_and_web/Gemfile +1 -0
  124. data/examples/hi_real_time_and_web/hi.rb +7 -3
  125. data/examples/{hi_real_time_async_eventmachine → hi_real_time_async_async}/Gemfile +2 -1
  126. data/examples/{hi_real_time_async_eventmachine → hi_real_time_async_async}/hi.rb +12 -7
  127. data/examples/hi_web/Gemfile +1 -0
  128. data/examples/hi_web/hi.rb +1 -0
  129. data/examples/new_ticket/Gemfile +1 -0
  130. data/examples/new_ticket/new_ticket.rb +1 -0
  131. data/examples/oauth_v2/.env.example +4 -0
  132. data/examples/oauth_v2/Gemfile +7 -0
  133. data/examples/oauth_v2/README.md +33 -0
  134. data/examples/oauth_v2/oauth_v2.rb +60 -0
  135. data/lib/slack/config.rb +2 -2
  136. data/lib/slack/events/config.rb +32 -0
  137. data/lib/slack/events/request.rb +76 -0
  138. data/lib/slack/logger.rb +6 -5
  139. data/lib/slack/messages/formatting.rb +66 -1
  140. data/lib/slack/messages/message.rb +1 -4
  141. data/lib/slack/real_time/api/message.rb +6 -3
  142. data/lib/slack/real_time/api/message_id.rb +1 -0
  143. data/lib/slack/real_time/api/ping.rb +5 -2
  144. data/lib/slack/real_time/api/templates/event_handler.erb +5 -1
  145. data/lib/slack/real_time/api/typing.rb +5 -2
  146. data/lib/slack/real_time/client.rb +117 -54
  147. data/lib/slack/real_time/concurrency/async.rb +142 -0
  148. data/lib/slack/real_time/concurrency.rb +2 -2
  149. data/lib/slack/real_time/config.rb +12 -13
  150. data/lib/slack/real_time/models/base.rb +1 -4
  151. data/lib/slack/real_time/models/bot.rb +1 -0
  152. data/lib/slack/real_time/models/channel.rb +5 -0
  153. data/lib/slack/real_time/models/im.rb +1 -0
  154. data/lib/slack/real_time/models/{group.rb → mpim.rb} +2 -1
  155. data/lib/slack/real_time/models/team.rb +1 -0
  156. data/lib/slack/real_time/models/user.rb +1 -0
  157. data/lib/slack/real_time/models.rb +3 -1
  158. data/lib/slack/real_time/socket.rb +49 -17
  159. data/lib/slack/real_time/stores/base.rb +28 -14
  160. data/lib/slack/real_time/stores/starter.rb +325 -287
  161. data/lib/slack/real_time/stores/store.rb +271 -186
  162. data/lib/slack/real_time/stores.rb +2 -7
  163. data/lib/slack/utils/security.rb +44 -0
  164. data/lib/slack/version.rb +2 -1
  165. data/lib/slack/web/api/endpoints/admin_analytics.rb +28 -0
  166. data/lib/slack/web/api/endpoints/admin_apps.rb +78 -0
  167. data/lib/slack/web/api/endpoints/admin_apps_activities.rb +53 -0
  168. data/lib/slack/web/api/endpoints/admin_apps_approved.rb +37 -0
  169. data/lib/slack/web/api/endpoints/admin_apps_config.rb +40 -0
  170. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +53 -0
  171. data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +37 -0
  172. data/lib/slack/web/api/endpoints/admin_audit_anomaly_allow.rb +34 -0
  173. data/lib/slack/web/api/endpoints/admin_auth_policy.rb +72 -0
  174. data/lib/slack/web/api/endpoints/admin_barriers.rb +82 -0
  175. data/lib/slack/web/api/endpoints/admin_conversations.rb +397 -0
  176. data/lib/slack/web/api/endpoints/admin_conversations_ekm.rb +35 -0
  177. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +61 -0
  178. data/lib/slack/web/api/endpoints/admin_emoji.rb +88 -0
  179. data/lib/slack/web/api/endpoints/admin_functions.rb +36 -0
  180. data/lib/slack/web/api/endpoints/admin_functions_permissions.rb +41 -0
  181. data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +61 -0
  182. data/lib/slack/web/api/endpoints/admin_inviteRequests_approved.rb +33 -0
  183. data/lib/slack/web/api/endpoints/admin_inviteRequests_denied.rb +33 -0
  184. data/lib/slack/web/api/endpoints/admin_roles.rb +73 -0
  185. data/lib/slack/web/api/endpoints/admin_teams.rb +50 -0
  186. data/lib/slack/web/api/endpoints/admin_teams_admins.rb +34 -0
  187. data/lib/slack/web/api/endpoints/admin_teams_owners.rb +34 -0
  188. data/lib/slack/web/api/endpoints/admin_teams_settings.rb +99 -0
  189. data/lib/slack/web/api/endpoints/admin_usergroups.rb +77 -0
  190. data/lib/slack/web/api/endpoints/admin_users.rb +167 -0
  191. data/lib/slack/web/api/endpoints/admin_users_session.rb +121 -0
  192. data/lib/slack/web/api/endpoints/admin_users_unsupportedVersions.rb +25 -0
  193. data/lib/slack/web/api/endpoints/admin_workflows.rb +67 -0
  194. data/lib/slack/web/api/endpoints/admin_workflows_collaborators.rb +42 -0
  195. data/lib/slack/web/api/endpoints/admin_workflows_permissions.rb +26 -0
  196. data/lib/slack/web/api/endpoints/admin_workflows_triggers_types_permissions.rb +41 -0
  197. data/lib/slack/web/api/endpoints/api.rb +2 -3
  198. data/lib/slack/web/api/endpoints/apps.rb +27 -0
  199. data/lib/slack/web/api/endpoints/apps_activities.rb +54 -0
  200. data/lib/slack/web/api/endpoints/apps_auth_external.rb +41 -0
  201. data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
  202. data/lib/slack/web/api/endpoints/apps_datastore.rb +181 -0
  203. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
  204. data/lib/slack/web/api/endpoints/apps_manifest.rb +79 -0
  205. data/lib/slack/web/api/endpoints/assistant_search.rb +44 -0
  206. data/lib/slack/web/api/endpoints/assistant_threads.rb +68 -0
  207. data/lib/slack/web/api/endpoints/auth.rb +2 -1
  208. data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
  209. data/lib/slack/web/api/endpoints/bookmarks.rb +90 -0
  210. data/lib/slack/web/api/endpoints/bots.rb +4 -1
  211. data/lib/slack/web/api/endpoints/calls.rb +83 -0
  212. data/lib/slack/web/api/endpoints/calls_participants.rb +42 -0
  213. data/lib/slack/web/api/endpoints/canvases.rb +54 -0
  214. data/lib/slack/web/api/endpoints/canvases_access.rb +47 -0
  215. data/lib/slack/web/api/endpoints/canvases_sections.rb +27 -0
  216. data/lib/slack/web/api/endpoints/chat.rb +172 -87
  217. data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
  218. data/lib/slack/web/api/endpoints/conversations.rb +190 -64
  219. data/lib/slack/web/api/endpoints/conversations_canvases.rb +28 -0
  220. data/lib/slack/web/api/endpoints/conversations_externalInvitePermissions.rb +31 -0
  221. data/lib/slack/web/api/endpoints/conversations_requestSharedInvite.rb +73 -0
  222. data/lib/slack/web/api/endpoints/dialog.rb +6 -10
  223. data/lib/slack/web/api/endpoints/dnd.rb +11 -5
  224. data/lib/slack/web/api/endpoints/emoji.rb +3 -0
  225. data/lib/slack/web/api/endpoints/files.rb +85 -36
  226. data/lib/slack/web/api/endpoints/files_comments.rb +4 -36
  227. data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
  228. data/lib/slack/web/api/endpoints/functions.rb +43 -0
  229. data/lib/slack/web/api/endpoints/functions_distributions_permissions.rb +84 -0
  230. data/lib/slack/web/api/endpoints/functions_workflows_steps.rb +30 -0
  231. data/lib/slack/web/api/endpoints/functions_workflows_steps_responses.rb +30 -0
  232. data/lib/slack/web/api/endpoints/migration.rb +6 -3
  233. data/lib/slack/web/api/endpoints/oauth.rb +10 -32
  234. data/lib/slack/web/api/endpoints/oauth_v2.rb +48 -0
  235. data/lib/slack/web/api/endpoints/openid_connect.rb +42 -0
  236. data/lib/slack/web/api/endpoints/pins.rb +11 -18
  237. data/lib/slack/web/api/endpoints/reactions.rb +31 -20
  238. data/lib/slack/web/api/endpoints/reminders.rb +25 -12
  239. data/lib/slack/web/api/endpoints/rtm.rb +4 -22
  240. data/lib/slack/web/api/endpoints/search.rb +33 -18
  241. data/lib/slack/web/api/endpoints/stars.rb +23 -10
  242. data/lib/slack/web/api/endpoints/team.rb +38 -7
  243. data/lib/slack/web/api/endpoints/team_billing.rb +21 -0
  244. data/lib/slack/web/api/endpoints/team_externalTeams.rb +53 -0
  245. data/lib/slack/web/api/endpoints/team_preferences.rb +21 -0
  246. data/lib/slack/web/api/endpoints/team_profile.rb +2 -1
  247. data/lib/slack/web/api/endpoints/tooling_tokens.rb +24 -0
  248. data/lib/slack/web/api/endpoints/usergroups.rb +44 -25
  249. data/lib/slack/web/api/endpoints/usergroups_users.rb +23 -14
  250. data/lib/slack/web/api/endpoints/users.rb +57 -18
  251. data/lib/slack/web/api/endpoints/users_admin.rb +5 -2
  252. data/lib/slack/web/api/endpoints/users_discoverableContacts.rb +24 -0
  253. data/lib/slack/web/api/endpoints/users_prefs.rb +2 -0
  254. data/lib/slack/web/api/endpoints/users_profile.rb +11 -9
  255. data/lib/slack/web/api/endpoints/views.rb +86 -0
  256. data/lib/slack/web/api/endpoints/workflows.rb +63 -0
  257. data/lib/slack/web/api/endpoints/workflows_triggers_permissions.rb +87 -0
  258. data/lib/slack/web/api/endpoints.rb +136 -12
  259. data/lib/slack/web/api/error.rb +1 -0
  260. data/lib/slack/web/api/errors/server_error.rb +37 -0
  261. data/lib/slack/web/api/errors/slack_error.rb +14 -1
  262. data/lib/slack/web/api/errors/too_many_requests_error.rb +2 -4
  263. data/lib/slack/web/api/errors.rb +1396 -0
  264. data/lib/slack/web/api/helpers/files.rb +97 -0
  265. data/lib/slack/web/api/helpers.rb +13 -0
  266. data/lib/slack/web/api/mixins/conversations.id.rb +47 -0
  267. data/lib/slack/web/api/mixins/ids.id.rb +4 -3
  268. data/lib/slack/web/api/mixins/users.id.rb +18 -4
  269. data/lib/slack/web/api/mixins/users.search.rb +3 -1
  270. data/lib/slack/web/api/mixins.rb +2 -2
  271. data/lib/slack/web/api/options.rb +26 -0
  272. data/lib/slack/web/api/patches/.gitkeep +0 -0
  273. data/lib/slack/web/api/templates/command.erb +19 -12
  274. data/lib/slack/web/api/templates/endpoints.erb +2 -2
  275. data/lib/slack/web/api/templates/errors.erb +20 -0
  276. data/lib/slack/web/api/templates/method.erb +23 -3
  277. data/lib/slack/web/api/templates/method_spec.erb +40 -3
  278. data/lib/slack/web/client.rb +4 -1
  279. data/lib/slack/web/config.rb +9 -2
  280. data/lib/slack/web/faraday/connection.rb +11 -20
  281. data/lib/slack/web/faraday/options.rb +24 -0
  282. data/lib/slack/web/faraday/request.rb +6 -1
  283. data/lib/slack/web/faraday/response/raise_error.rb +14 -8
  284. data/lib/slack/web/faraday/response/wrap_error.rb +24 -0
  285. data/lib/slack/web/pagination/cursor.rb +7 -7
  286. data/lib/slack-ruby-client.rb +18 -6
  287. data/lib/slack.rb +1 -0
  288. data/lib/slack_ruby_client.rb +1 -0
  289. data/lib/tasks/git.rake +1 -0
  290. data/lib/tasks/real_time.rake +51 -21
  291. data/lib/tasks/update.rake +1 -0
  292. data/lib/tasks/web.rake +43 -17
  293. data/slack-ruby-client.gemspec +10 -14
  294. metadata +191 -307
  295. data/.travis.yml +0 -30
  296. data/bin/commands/apps_permissions.rb +0 -22
  297. data/bin/commands/channels.rb +0 -175
  298. data/bin/commands/groups.rb +0 -172
  299. data/bin/commands/im.rb +0 -67
  300. data/bin/commands/mpim.rb +0 -63
  301. data/bin/commands.rb +0 -33
  302. data/examples/hi_real_time/hi.gif +0 -0
  303. data/examples/hi_real_time/hi.rb +0 -37
  304. data/examples/hi_real_time_async_celluloid/Gemfile +0 -6
  305. data/examples/hi_real_time_async_celluloid/hi.rb +0 -36
  306. data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
  307. data/lib/slack/real_time/concurrency/celluloid.rb +0 -117
  308. data/lib/slack/real_time/concurrency/eventmachine.rb +0 -60
  309. data/lib/slack/web/api/endpoints/apps_permissions.rb +0 -35
  310. data/lib/slack/web/api/endpoints/channels.rb +0 -265
  311. data/lib/slack/web/api/endpoints/groups.rb +0 -255
  312. data/lib/slack/web/api/endpoints/im.rb +0 -113
  313. data/lib/slack/web/api/endpoints/mpim.rb +0 -98
  314. data/lib/slack/web/api/endpoints/presence.rb +0 -23
  315. data/lib/slack/web/api/mixins/channels.id.json +0 -20
  316. data/lib/slack/web/api/mixins/channels.id.rb +0 -26
  317. data/lib/slack/web/api/mixins/groups.id.json +0 -20
  318. data/lib/slack/web/api/mixins/groups.id.rb +0 -26
  319. data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +0 -13
  320. data/lib/slack/web/api/patches/chat.2.attachments-json.patch +0 -17
  321. data/lib/slack/web/api/patches/chat.3.update-attachments-support.patch +0 -21
  322. data/lib/slack/web/api/patches/chat.4.postEphemeral-attachments-support.patch +0 -17
  323. data/lib/slack/web/api/patches/dialog.1.open-json-support.patch +0 -17
  324. data/lib/slack/web/api/templates/commands.erb +0 -5
  325. data/screenshots/register-bot.png +0 -0
  326. data/spec/fixtures/slack/web/429_error.yml +0 -85
  327. data/spec/fixtures/slack/web/auth_test_error.yml +0 -48
  328. data/spec/fixtures/slack/web/auth_test_success.yml +0 -57
  329. data/spec/fixtures/slack/web/channels_info.yml +0 -46
  330. data/spec/fixtures/slack/web/groups_info.yml +0 -43
  331. data/spec/fixtures/slack/web/paginated_users_list.yml +0 -181
  332. data/spec/fixtures/slack/web/rtm_connect.yml +0 -70
  333. data/spec/fixtures/slack/web/rtm_start.yml +0 -104
  334. data/spec/fixtures/slack/web/users_info.yml +0 -130
  335. data/spec/fixtures/slack/web/users_list.yml +0 -72
  336. data/spec/integration/integration_spec.rb +0 -139
  337. data/spec/slack/config_spec.rb +0 -14
  338. data/spec/slack/messages/formatting_spec.rb +0 -43
  339. data/spec/slack/real_time/api/message_spec.rb +0 -15
  340. data/spec/slack/real_time/api/ping_spec.rb +0 -15
  341. data/spec/slack/real_time/api/typing_spec.rb +0 -15
  342. data/spec/slack/real_time/client_spec.rb +0 -425
  343. data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -62
  344. data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -47
  345. data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +0 -19
  346. data/spec/slack/real_time/event_handlers/bot_spec.rb +0 -44
  347. data/spec/slack/real_time/event_handlers/channel_spec.rb +0 -116
  348. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +0 -15
  349. data/spec/slack/real_time/event_handlers/group_spec.rb +0 -90
  350. data/spec/slack/real_time/event_handlers/im_spec.rb +0 -47
  351. data/spec/slack/real_time/event_handlers/team_spec.rb +0 -62
  352. data/spec/slack/real_time/event_handlers/user_spec.rb +0 -63
  353. data/spec/slack/real_time/rtm_connect_spec.rb +0 -13
  354. data/spec/slack/real_time/rtm_start_spec.rb +0 -13
  355. data/spec/slack/real_time/store_spec.rb +0 -11
  356. data/spec/slack/slack_spec.rb +0 -58
  357. data/spec/slack/version_spec.rb +0 -7
  358. data/spec/slack/web/api/endpoints/api_spec.rb +0 -7
  359. data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +0 -15
  360. data/spec/slack/web/api/endpoints/bots_spec.rb +0 -7
  361. data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -100
  362. data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +0 -25
  363. data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +0 -11
  364. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +0 -105
  365. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +0 -28
  366. data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +0 -11
  367. data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +0 -33
  368. data/spec/slack/web/api/endpoints/dnd_spec.rb +0 -12
  369. data/spec/slack/web/api/endpoints/emoji_spec.rb +0 -7
  370. data/spec/slack/web/api/endpoints/files_comments_spec.rb +0 -34
  371. data/spec/slack/web/api/endpoints/files_spec.rb +0 -43
  372. data/spec/slack/web/api/endpoints/im_spec.rb +0 -38
  373. data/spec/slack/web/api/endpoints/migration_spec.rb +0 -12
  374. data/spec/slack/web/api/endpoints/mpim_spec.rb +0 -38
  375. data/spec/slack/web/api/endpoints/oauth_spec.rb +0 -29
  376. data/spec/slack/web/api/endpoints/pins_spec.rb +0 -22
  377. data/spec/slack/web/api/endpoints/reactions_spec.rb +0 -17
  378. data/spec/slack/web/api/endpoints/reminders_spec.rb +0 -30
  379. data/spec/slack/web/api/endpoints/rtm_spec.rb +0 -7
  380. data/spec/slack/web/api/endpoints/search_spec.rb +0 -22
  381. data/spec/slack/web/api/endpoints/stars_spec.rb +0 -7
  382. data/spec/slack/web/api/endpoints/team_profile_spec.rb +0 -7
  383. data/spec/slack/web/api/endpoints/team_spec.rb +0 -7
  384. data/spec/slack/web/api/endpoints/usergroups_spec.rb +0 -27
  385. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +0 -20
  386. data/spec/slack/web/api/endpoints/users_admin_spec.rb +0 -17
  387. data/spec/slack/web/api/endpoints/users_prefs_spec.rb +0 -7
  388. data/spec/slack/web/api/endpoints/users_profile_spec.rb +0 -7
  389. data/spec/slack/web/api/error_spec.rb +0 -14
  390. data/spec/slack/web/api/errors/slack_error_spec.rb +0 -14
  391. data/spec/slack/web/api/mixins/channels_spec.rb +0 -31
  392. data/spec/slack/web/api/mixins/groups_spec.rb +0 -31
  393. data/spec/slack/web/api/mixins/users_spec.rb +0 -39
  394. data/spec/slack/web/api/pagination/cursor_spec.rb +0 -70
  395. data/spec/slack/web/client_spec.rb +0 -174
  396. data/spec/spec_helper.rb +0 -14
  397. data/spec/support/queue_with_timeout.rb +0 -34
  398. data/spec/support/real_time/concurrency/mock.rb +0 -30
  399. data/spec/support/real_time/connected_client.rb +0 -21
  400. data/spec/support/real_time/event.rb +0 -11
  401. data/spec/support/token.rb +0 -10
  402. data/spec/support/vcr.rb +0 -9
  403. /data/examples/{hi_real_time_async_celluloid → hi_real_time_async_async}/Procfile +0 -0
@@ -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,4 +1,8 @@
1
1
  # <%= desc %>
2
2
  # @see https://api.slack.com/events/<%= name %>
3
3
  # @see https://github.com/slack-ruby/slack-api-ref/blob/master/events/<%= name %>.json
4
- # on :<%= name %> do |data|
4
+ <% if hook %>
5
+ <%= hook %>
6
+ <% else %>
7
+ # on :<%= name %> do |data|
8
+ <% end %>
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Api
@@ -6,9 +7,11 @@ 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
- throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
13
+ raise ArgumentError, 'Required arguments :channel missing' if options[:channel].nil?
14
+
12
15
  send_json({ type: 'typing', id: next_id }.merge(options))
13
16
  end
14
17
  end
@@ -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
@@ -9,19 +11,9 @@ module Slack
9
11
  include Api::Message
10
12
  include Api::Typing
11
13
 
12
- @events = {}
13
-
14
- class << self
15
- attr_accessor :events
16
- end
14
+ attr_accessor :web_client, :store, :url, *Config::ATTRIBUTES
17
15
 
18
- attr_accessor :web_client
19
- attr_accessor :store
20
- attr_accessor :url
21
- attr_accessor(*Config::ATTRIBUTES)
22
-
23
- protected :logger, :logger=
24
- protected :store_class, :store_class=
16
+ protected :store_class, :store_class=, :store_options, :store_options=
25
17
 
26
18
  def initialize(options = {})
27
19
  @callbacks = Hash.new { |h, k| h[k] = [] }
@@ -33,9 +25,9 @@ module Slack
33
25
  @web_client = Slack::Web::Client.new(token: token, logger: logger)
34
26
  end
35
27
 
36
- %i[users self channels team teams groups ims bots].each do |store_method|
28
+ [:self, :team, *Stores::Base::CACHES].each do |store_method|
37
29
  define_method store_method do
38
- store.send(store_method) if store
30
+ store&.send(store_method)
39
31
  end
40
32
  end
41
33
 
@@ -46,26 +38,27 @@ module Slack
46
38
 
47
39
  # Start RealTime client and block until it disconnects.
48
40
  def start!(&block)
49
- @callback = block if block_given?
50
- @socket = build_socket
41
+ @callback = block if block
42
+ build_socket
51
43
  @socket.start_sync(self)
52
44
  end
53
45
 
54
46
  # Start RealTime client and return immediately.
55
47
  # The RealTime::Client will run in the background.
56
48
  def start_async(&block)
57
- @callback = block if block_given?
58
- @socket = build_socket
49
+ @callback = block if block
50
+ build_socket
59
51
  @socket.start_async(self)
60
52
  end
61
53
 
62
54
  def stop!
63
55
  raise ClientNotStartedError unless started?
64
- @socket.disconnect! if @socket
56
+
57
+ @socket&.disconnect!
65
58
  end
66
59
 
67
60
  def started?
68
- @socket && @socket.connected?
61
+ @socket&.connected?
69
62
  end
70
63
 
71
64
  class << self
@@ -80,48 +73,105 @@ module Slack
80
73
 
81
74
  def run_loop
82
75
  @socket.connect! do |driver|
83
- @callback.call(driver) if @callback
84
-
85
76
  driver.on :open do |event|
86
- logger.debug("#{self.class}##{__method__}") { event.class.name }
87
- open(event)
77
+ logger.debug("#{self}##{__method__}") { event.class.name }
78
+ open_event(event)
88
79
  callback(event, :open)
89
80
  end
90
81
 
91
82
  driver.on :message do |event|
92
- logger.debug("#{self.class}##{__method__}") { "#{event.class}, #{event.data}" }
83
+ logger.debug("#{self}##{__method__}") { "#{event.class}, #{event.data}" }
93
84
  dispatch(event)
94
85
  end
95
86
 
96
87
  driver.on :close do |event|
97
- logger.debug("#{self.class}##{__method__}") { event.class.name }
88
+ logger.debug("#{self}##{__method__}") { event.class.name }
98
89
  callback(event, :close)
99
90
  close(event)
100
91
  callback(event, :closed)
101
92
  end
93
+
94
+ # This must be called last to ensure any events are registered before invoking user code.
95
+ @callback&.call(driver)
96
+ end
97
+ end
98
+
99
+ # Ensure the server is running, and ping the remote server if no other messages were sent.
100
+ def keep_alive?
101
+ # We can't ping the remote server if we aren't connected.
102
+ return false if @socket.nil? || !@socket.connected?
103
+
104
+ time_since_last_message = @socket.time_since_last_message
105
+
106
+ # If the server responded within the specified time, we are okay:
107
+ return true if time_since_last_message < websocket_ping
108
+
109
+ # If the server has not responded for a while:
110
+ return false if time_since_last_message > (websocket_ping * 2)
111
+
112
+ # Kick off the next ping message:
113
+ ping
114
+
115
+ true
116
+ end
117
+
118
+ # Check if the remote server is responsive, and if not, restart the connection.
119
+ def run_ping!
120
+ return if keep_alive?
121
+
122
+ logger.warn(to_s) { 'is offline' }
123
+
124
+ restart_async
125
+ rescue Slack::Web::Api::Errors::SlackError => e
126
+ # stop pinging if bot was uninstalled
127
+ case e.message
128
+ when 'account_inactive', 'invalid_auth'
129
+ logger.warn(to_s) { e.message }
130
+ raise e
131
+ end
132
+ logger.debug("#{self}##{__method__}") { e }
133
+ rescue StandardError => e
134
+ # disregard all ping worker failures, keep pinging
135
+ logger.debug("#{self}##{__method__}") { e }
136
+ end
137
+
138
+ def run_ping?
139
+ !websocket_ping.nil? && websocket_ping.positive?
140
+ end
141
+
142
+ def websocket_ping_timer
143
+ websocket_ping / 2
144
+ end
145
+
146
+ def to_s
147
+ if store&.team
148
+ "id=#{store.team.id}, name=#{store.team.name}, domain=#{store.team.domain}"
149
+ else
150
+ super
102
151
  end
103
152
  end
104
153
 
105
154
  protected
106
155
 
156
+ def restart_async
157
+ logger.debug("#{self}##{__method__}")
158
+ @socket.close
159
+ start = web_client.rtm_connect(start_options)
160
+ data = Slack::Messages::Message.new(start)
161
+ @url = data.url
162
+ @store = store_class.new(data, store_options.to_h) if store_class
163
+ @socket.restart_async(self, @url)
164
+ end
165
+
107
166
  # @return [Slack::RealTime::Socket]
108
167
  def build_socket
109
168
  raise ClientAlreadyStartedError if started?
110
- start = web_client.send(rtm_start_method, start_options)
169
+
170
+ start = web_client.rtm_connect(start_options)
111
171
  data = Slack::Messages::Message.new(start)
112
172
  @url = data.url
113
- @store = @store_class.new(data) if @store_class
114
- socket_class.new(@url, socket_options)
115
- end
116
-
117
- def rtm_start_method
118
- if start_method
119
- start_method
120
- elsif @store_class && @store_class <= Slack::RealTime::Stores::Store
121
- :rtm_start
122
- else
123
- :rtm_connect
124
- end
173
+ @store = store_class.new(data, store_options.to_h) if store_class
174
+ @socket = socket_class.new(@url, socket_options)
125
175
  end
126
176
 
127
177
  def socket_options
@@ -133,23 +183,22 @@ module Slack
133
183
  end
134
184
 
135
185
  attr_reader :callbacks
186
+
136
187
  def socket_class
137
188
  concurrency::Socket
138
189
  end
139
190
 
140
191
  def send_json(data)
141
192
  raise ClientNotStartedError unless started?
142
- logger.debug("#{self.class}##{__method__}") { data }
193
+
194
+ logger.debug("#{self}##{__method__}") { data }
143
195
  @socket.send_data(data.to_json)
144
196
  end
145
197
 
146
- def open(_event); end
198
+ def open_event(_event); end
147
199
 
148
200
  def close(_event)
149
- socket = @socket
150
- @socket = nil
151
-
152
- [socket, socket_class].each do |s|
201
+ [@socket, socket_class].each do |s|
153
202
  s.close if s.respond_to?(:close)
154
203
  end
155
204
  end
@@ -157,50 +206,64 @@ module Slack
157
206
  def callback(event, type)
158
207
  callbacks = self.callbacks[type.to_s]
159
208
  return false unless callbacks
209
+
160
210
  callbacks.each do |c|
161
211
  c.call(event)
162
212
  end
163
213
  true
164
214
  rescue StandardError => e
165
- logger.error e
215
+ logger.error("#{self}##{__method__}") { e }
166
216
  false
167
217
  end
168
218
 
169
219
  def dispatch(event)
170
220
  return false unless event.data
221
+
171
222
  data = Slack::Messages::Message.new(JSON.parse(event.data))
172
223
  type = data.type
173
224
  return false unless type
225
+
174
226
  type = type.to_s
175
- logger.debug("#{self.class}##{__method__}") { data.to_s }
227
+ logger.debug("#{self}##{__method__}") { data.to_s }
176
228
  run_handlers(type, data) if @store
177
229
  run_callbacks(type, data)
178
230
  rescue StandardError => e
179
- logger.error e
231
+ logger.error("#{self}##{__method__}") { e }
180
232
  false
181
233
  end
182
234
 
183
235
  def run_handlers(type, data)
184
236
  handlers = store.class.events[type.to_s]
185
- if handlers
186
- handlers.each do |handler|
187
- store.instance_exec(data, &handler)
188
- end
237
+ case async_handlers
238
+ when :all
239
+ @socket.run_async { handlers_loop(handlers, data) }
240
+ when :none
241
+ handlers_loop(handlers, data)
242
+ else
243
+ raise Config::InvalidAsyncHandlersError,
244
+ "Invalid value '#{async_handlers.inspect}' for config#async_handlers, must be :all or :none."
189
245
  end
190
246
  rescue StandardError => e
191
- logger.error e
247
+ logger.error("#{self}##{__method__}") { e }
192
248
  false
193
249
  end
194
250
 
251
+ def handlers_loop(handlers, data)
252
+ handlers.each do |handler|
253
+ store.instance_exec(data, self, &handler)
254
+ end
255
+ end
256
+
195
257
  def run_callbacks(type, data)
196
258
  callbacks = self.callbacks[type]
197
259
  return false unless callbacks
260
+
198
261
  callbacks.each do |c|
199
262
  c.call(data)
200
263
  end
201
264
  true
202
265
  rescue StandardError => e
203
- logger.error e
266
+ logger.error("#{self}##{__method__}") { e }
204
267
  false
205
268
  end
206
269
  end
@@ -0,0 +1,142 @@
1
+ # frozen_string_literal: true
2
+ require 'async/websocket'
3
+ require 'async/notification'
4
+ require 'async/clock'
5
+
6
+ module Slack
7
+ module RealTime
8
+ module Concurrency
9
+ module Async
10
+ class Client < ::Async::WebSocket::Client
11
+ extend ::Forwardable
12
+ def_delegators :@driver, :on, :text, :binary, :emit
13
+ end
14
+
15
+ class Socket < Slack::RealTime::Socket
16
+ attr_reader :client
17
+
18
+ def start_sync(client)
19
+ start_reactor(client).wait
20
+ end
21
+
22
+ def start_async(client)
23
+ Thread.new do
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
57
+ end
58
+
59
+ @ping_task&.stop
60
+ end
61
+ end
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 run_async(&block)
71
+ ::Async.run(&block)
72
+ end
73
+
74
+ def current_time
75
+ ::Async::Clock.now
76
+ end
77
+
78
+ def connect!
79
+ super
80
+ run_loop
81
+ end
82
+
83
+ # Kill the restart/ping loop.
84
+ def disconnect!
85
+ super
86
+ ensure
87
+ if (restart = @restart)
88
+ @restart = nil
89
+ restart.signal
90
+ end
91
+ end
92
+
93
+ # Close the socket.
94
+ def close
95
+ super
96
+ ensure
97
+ if @socket
98
+ @socket.close
99
+ @socket = nil
100
+ end
101
+ end
102
+
103
+ def run_loop
104
+ while @driver&.next_event
105
+ # $stderr.puts event.inspect
106
+ end
107
+ end
108
+
109
+ protected
110
+
111
+ def build_ssl_context
112
+ OpenSSL::SSL::SSLContext.new(:TLSv1_2_client).tap do |ctx|
113
+ ctx.set_params(verify_mode: OpenSSL::SSL::VERIFY_PEER)
114
+ end
115
+ end
116
+
117
+ def build_endpoint
118
+ endpoint = ::Async::IO::Endpoint.tcp(addr, port)
119
+ endpoint = ::Async::IO::SSLEndpoint.new(endpoint, ssl_context: build_ssl_context) if secure?
120
+ endpoint
121
+ end
122
+
123
+ def connect_socket
124
+ build_endpoint.connect
125
+ end
126
+
127
+ def connect
128
+ @socket = connect_socket
129
+ @driver = Client.new(@socket, url)
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+
137
+ if Gem::Version.new(Async::WebSocket::VERSION) >= Gem::Version.new('0.9.0')
138
+ raise(
139
+ "Incompatible version of async-websocket, #{Async::WebSocket::VERSION}, " \
140
+ "use \"gem 'async-websocket', '~> 0.8.0'\"."
141
+ )
142
+ end
@@ -1,8 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Concurrency
4
- autoload :Eventmachine, 'slack/real_time/concurrency/eventmachine'
5
- autoload :Celluloid, 'slack/real_time/concurrency/celluloid'
5
+ autoload :Async, 'slack/real_time/concurrency/async'
6
6
  end
7
7
  end
8
8
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Config
4
5
  class NoConcurrencyError < StandardError; end
6
+ class InvalidAsyncHandlersError < StandardError; end
5
7
 
6
8
  extend self
7
9
 
@@ -10,23 +12,26 @@ module Slack
10
12
  websocket_ping
11
13
  websocket_proxy
12
14
  concurrency
13
- start_method
14
15
  start_options
15
16
  store_class
17
+ store_options
16
18
  logger
19
+ async_handlers
17
20
  ].freeze
18
21
 
19
- attr_accessor(*Config::ATTRIBUTES)
22
+ attr_accessor(*Config::ATTRIBUTES - [:concurrency])
23
+ attr_writer :concurrency
20
24
 
21
25
  def reset
22
26
  self.websocket_ping = 30
23
27
  self.websocket_proxy = nil
24
28
  self.token = nil
25
29
  self.concurrency = method(:detect_concurrency)
26
- self.start_method = nil
27
30
  self.start_options = { request: { timeout: 180 } }
28
- self.store_class = Slack::RealTime::Store
31
+ self.store_class = Slack::RealTime::Stores::Starter
32
+ self.store_options = {}
29
33
  self.logger = nil
34
+ self.async_handlers = :none
30
35
  end
31
36
 
32
37
  def concurrency
@@ -36,15 +41,9 @@ module Slack
36
41
  private
37
42
 
38
43
  def detect_concurrency
39
- %i[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 faye-websocket or celluloid-io to your Gemfile.'
44
+ Slack::RealTime::Concurrency.const_get(:Async)
45
+ rescue LoadError, NameError
46
+ raise NoConcurrencyError, 'Missing concurrency. Add async-websocket to your Gemfile.'
48
47
  end
49
48
  end
50
49
 
@@ -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,7 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Slack
2
4
  module RealTime
3
5
  module Models
4
6
  class Channel < Base
7
+ def is_public? # rubocop:disable Naming/PredicateName
8
+ !is_private?
9
+ end
5
10
  end
6
11
  end
7
12
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Models
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Models
4
- class Group < Base
5
+ class Mpim < Base
5
6
  end
6
7
  end
7
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,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'models/base'
2
4
  require_relative 'models/user'
3
5
  require_relative 'models/bot'
4
6
  require_relative 'models/channel'
5
- require_relative 'models/group'
6
7
  require_relative 'models/team'
7
8
  require_relative 'models/im'
9
+ require_relative 'models/mpim'