async-matrix 2.0.1-x86_64-linux

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 (372) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +200 -0
  3. data/README.md +133 -0
  4. data/data/discord-api-spec/openapi.json +40404 -0
  5. data/data/matrix-spec/api/client-server/account-data.yaml +389 -0
  6. data/data/matrix-spec/api/client-server/account_deactivation.yaml +149 -0
  7. data/data/matrix-spec/api/client-server/admin.yaml +512 -0
  8. data/data/matrix-spec/api/client-server/administrative_contact.yaml +620 -0
  9. data/data/matrix-spec/api/client-server/appservice_ping.yaml +183 -0
  10. data/data/matrix-spec/api/client-server/appservice_room_directory.yaml +104 -0
  11. data/data/matrix-spec/api/client-server/authed-content-repo.yaml +590 -0
  12. data/data/matrix-spec/api/client-server/banning.yaml +177 -0
  13. data/data/matrix-spec/api/client-server/capabilities.yaml +235 -0
  14. data/data/matrix-spec/api/client-server/content-repo.yaml +887 -0
  15. data/data/matrix-spec/api/client-server/create_room.yaml +306 -0
  16. data/data/matrix-spec/api/client-server/cross_signing.yaml +300 -0
  17. data/data/matrix-spec/api/client-server/definitions/auth_data.yaml +34 -0
  18. data/data/matrix-spec/api/client-server/definitions/auth_response.yaml +62 -0
  19. data/data/matrix-spec/api/client-server/definitions/client_device.yaml +44 -0
  20. data/data/matrix-spec/api/client-server/definitions/client_event.yaml +49 -0
  21. data/data/matrix-spec/api/client-server/definitions/client_event_without_room_id.yaml +147 -0
  22. data/data/matrix-spec/api/client-server/definitions/cross_signing_key.yaml +57 -0
  23. data/data/matrix-spec/api/client-server/definitions/device_keys.yaml +70 -0
  24. data/data/matrix-spec/api/client-server/definitions/errors/error.yaml +26 -0
  25. data/data/matrix-spec/api/client-server/definitions/errors/rate_limited.yaml +34 -0
  26. data/data/matrix-spec/api/client-server/definitions/event_batch.yaml +22 -0
  27. data/data/matrix-spec/api/client-server/definitions/event_filter.yaml +55 -0
  28. data/data/matrix-spec/api/client-server/definitions/invite_3pid.yaml +45 -0
  29. data/data/matrix-spec/api/client-server/definitions/key_backup_auth_data.yaml +36 -0
  30. data/data/matrix-spec/api/client-server/definitions/key_backup_data.yaml +50 -0
  31. data/data/matrix-spec/api/client-server/definitions/key_backup_session_data.yaml +57 -0
  32. data/data/matrix-spec/api/client-server/definitions/m.login.terms_params.yaml +83 -0
  33. data/data/matrix-spec/api/client-server/definitions/m.mentions.yaml +33 -0
  34. data/data/matrix-spec/api/client-server/definitions/m.oauth_params.yaml +30 -0
  35. data/data/matrix-spec/api/client-server/definitions/m.relates_to.yaml +45 -0
  36. data/data/matrix-spec/api/client-server/definitions/megolm_export_session_data.yaml +39 -0
  37. data/data/matrix-spec/api/client-server/definitions/olm_payload.yaml +88 -0
  38. data/data/matrix-spec/api/client-server/definitions/one_time_keys.yaml +27 -0
  39. data/data/matrix-spec/api/client-server/definitions/openid_token.yaml +37 -0
  40. data/data/matrix-spec/api/client-server/definitions/protocol.yaml +44 -0
  41. data/data/matrix-spec/api/client-server/definitions/public_rooms_chunk.yaml +74 -0
  42. data/data/matrix-spec/api/client-server/definitions/public_rooms_response.yaml +59 -0
  43. data/data/matrix-spec/api/client-server/definitions/push_condition.yaml +53 -0
  44. data/data/matrix-spec/api/client-server/definitions/push_rule.yaml +53 -0
  45. data/data/matrix-spec/api/client-server/definitions/push_ruleset.yaml +206 -0
  46. data/data/matrix-spec/api/client-server/definitions/recent_emoji.yaml +29 -0
  47. data/data/matrix-spec/api/client-server/definitions/request_email_validation.yaml +36 -0
  48. data/data/matrix-spec/api/client-server/definitions/request_msisdn_validation.yaml +36 -0
  49. data/data/matrix-spec/api/client-server/definitions/request_token_response.yaml +46 -0
  50. data/data/matrix-spec/api/client-server/definitions/room_event_filter.yaml +60 -0
  51. data/data/matrix-spec/api/client-server/definitions/room_key_backup.yaml +37 -0
  52. data/data/matrix-spec/api/client-server/definitions/room_summary.yaml +44 -0
  53. data/data/matrix-spec/api/client-server/definitions/security.yaml +47 -0
  54. data/data/matrix-spec/api/client-server/definitions/sso_login_flow.yaml +98 -0
  55. data/data/matrix-spec/api/client-server/definitions/state_event_batch.yaml +21 -0
  56. data/data/matrix-spec/api/client-server/definitions/sync_filter.yaml +86 -0
  57. data/data/matrix-spec/api/client-server/definitions/tag.yaml +24 -0
  58. data/data/matrix-spec/api/client-server/definitions/third_party_signed.yaml +45 -0
  59. data/data/matrix-spec/api/client-server/definitions/timeline_batch.yaml +36 -0
  60. data/data/matrix-spec/api/client-server/definitions/user_identifier.yaml +27 -0
  61. data/data/matrix-spec/api/client-server/definitions/wellknown/full.yaml +38 -0
  62. data/data/matrix-spec/api/client-server/definitions/wellknown/homeserver.yaml +25 -0
  63. data/data/matrix-spec/api/client-server/definitions/wellknown/identity_server.yaml +25 -0
  64. data/data/matrix-spec/api/client-server/device_management.yaml +314 -0
  65. data/data/matrix-spec/api/client-server/directory.yaml +318 -0
  66. data/data/matrix-spec/api/client-server/event_context.yaml +161 -0
  67. data/data/matrix-spec/api/client-server/filter.yaml +224 -0
  68. data/data/matrix-spec/api/client-server/inviting.yaml +149 -0
  69. data/data/matrix-spec/api/client-server/joining.yaml +238 -0
  70. data/data/matrix-spec/api/client-server/key_backup.yaml +993 -0
  71. data/data/matrix-spec/api/client-server/keys.yaml +482 -0
  72. data/data/matrix-spec/api/client-server/kicking.yaml +110 -0
  73. data/data/matrix-spec/api/client-server/knocking.yaml +152 -0
  74. data/data/matrix-spec/api/client-server/leaving.yaml +163 -0
  75. data/data/matrix-spec/api/client-server/list_joined_rooms.yaml +68 -0
  76. data/data/matrix-spec/api/client-server/list_public_rooms.yaml +280 -0
  77. data/data/matrix-spec/api/client-server/login.yaml +321 -0
  78. data/data/matrix-spec/api/client-server/login_token.yaml +138 -0
  79. data/data/matrix-spec/api/client-server/logout.yaml +86 -0
  80. data/data/matrix-spec/api/client-server/message_pagination.yaml +194 -0
  81. data/data/matrix-spec/api/client-server/notifications.yaml +152 -0
  82. data/data/matrix-spec/api/client-server/oauth_server_metadata.yaml +238 -0
  83. data/data/matrix-spec/api/client-server/old_sync.yaml +379 -0
  84. data/data/matrix-spec/api/client-server/openid.yaml +98 -0
  85. data/data/matrix-spec/api/client-server/password_management.yaml +246 -0
  86. data/data/matrix-spec/api/client-server/peeking_events.yaml +122 -0
  87. data/data/matrix-spec/api/client-server/policy_server.yaml +82 -0
  88. data/data/matrix-spec/api/client-server/presence.yaml +169 -0
  89. data/data/matrix-spec/api/client-server/profile.yaml +366 -0
  90. data/data/matrix-spec/api/client-server/pusher.yaml +303 -0
  91. data/data/matrix-spec/api/client-server/pushrules.yaml +633 -0
  92. data/data/matrix-spec/api/client-server/read_markers.yaml +103 -0
  93. data/data/matrix-spec/api/client-server/receipts.yaml +139 -0
  94. data/data/matrix-spec/api/client-server/redaction.yaml +116 -0
  95. data/data/matrix-spec/api/client-server/refresh.yaml +119 -0
  96. data/data/matrix-spec/api/client-server/registration.yaml +488 -0
  97. data/data/matrix-spec/api/client-server/registration_tokens.yaml +93 -0
  98. data/data/matrix-spec/api/client-server/relations.yaml +382 -0
  99. data/data/matrix-spec/api/client-server/report_content.yaml +283 -0
  100. data/data/matrix-spec/api/client-server/room_event_by_timestamp.yaml +147 -0
  101. data/data/matrix-spec/api/client-server/room_initial_sync.yaml +188 -0
  102. data/data/matrix-spec/api/client-server/room_send.yaml +130 -0
  103. data/data/matrix-spec/api/client-server/room_state.yaml +159 -0
  104. data/data/matrix-spec/api/client-server/room_summary.yaml +138 -0
  105. data/data/matrix-spec/api/client-server/room_upgrades.yaml +130 -0
  106. data/data/matrix-spec/api/client-server/rooms.yaml +380 -0
  107. data/data/matrix-spec/api/client-server/search.yaml +385 -0
  108. data/data/matrix-spec/api/client-server/space_hierarchy.yaml +237 -0
  109. data/data/matrix-spec/api/client-server/sso_login_redirect.yaml +135 -0
  110. data/data/matrix-spec/api/client-server/support.yaml +142 -0
  111. data/data/matrix-spec/api/client-server/sync.yaml +692 -0
  112. data/data/matrix-spec/api/client-server/tags.yaml +183 -0
  113. data/data/matrix-spec/api/client-server/third_party_lookup.yaml +324 -0
  114. data/data/matrix-spec/api/client-server/third_party_membership.yaml +139 -0
  115. data/data/matrix-spec/api/client-server/threads_list.yaml +167 -0
  116. data/data/matrix-spec/api/client-server/to_device.yaml +104 -0
  117. data/data/matrix-spec/api/client-server/typing.yaml +103 -0
  118. data/data/matrix-spec/api/client-server/users.yaml +136 -0
  119. data/data/matrix-spec/api/client-server/versions.yaml +108 -0
  120. data/data/matrix-spec/api/client-server/voip.yaml +93 -0
  121. data/data/matrix-spec/api/client-server/wellknown.yaml +60 -0
  122. data/data/matrix-spec/api/client-server/whoami.yaml +121 -0
  123. data/data/matrix-spec/event-schemas/examples/core/event.json +6 -0
  124. data/data/matrix-spec/event-schemas/examples/core/room_edu.json +3 -0
  125. data/data/matrix-spec/event-schemas/examples/core/room_event.json +11 -0
  126. data/data/matrix-spec/event-schemas/examples/core/state_event.json +4 -0
  127. data/data/matrix-spec/event-schemas/examples/invite_room_state.json +18 -0
  128. data/data/matrix-spec/event-schemas/examples/knock_room_state.json +18 -0
  129. data/data/matrix-spec/event-schemas/examples/m.accepted_terms.yaml +10 -0
  130. data/data/matrix-spec/event-schemas/examples/m.call.answer.yaml +21 -0
  131. data/data/matrix-spec/event-schemas/examples/m.call.candidates.yaml +16 -0
  132. data/data/matrix-spec/event-schemas/examples/m.call.hangup.yaml +10 -0
  133. data/data/matrix-spec/event-schemas/examples/m.call.invite.yaml +22 -0
  134. data/data/matrix-spec/event-schemas/examples/m.call.negotiate.yaml +22 -0
  135. data/data/matrix-spec/event-schemas/examples/m.call.reject.yaml +9 -0
  136. data/data/matrix-spec/event-schemas/examples/m.call.sdp_stream_metadata_changed.yaml +16 -0
  137. data/data/matrix-spec/event-schemas/examples/m.call.select_answer.yaml +10 -0
  138. data/data/matrix-spec/event-schemas/examples/m.direct.yaml +10 -0
  139. data/data/matrix-spec/event-schemas/examples/m.dummy.yaml +4 -0
  140. data/data/matrix-spec/event-schemas/examples/m.forwarded_room_key.yaml +14 -0
  141. data/data/matrix-spec/event-schemas/examples/m.fully_read.yaml +7 -0
  142. data/data/matrix-spec/event-schemas/examples/m.identity_server.yaml +7 -0
  143. data/data/matrix-spec/event-schemas/examples/m.ignored_user_list.yaml +9 -0
  144. data/data/matrix-spec/event-schemas/examples/m.invite_permission_config.yaml +7 -0
  145. data/data/matrix-spec/event-schemas/examples/m.key.verification.accept.yaml +12 -0
  146. data/data/matrix-spec/event-schemas/examples/m.key.verification.cancel.yaml +8 -0
  147. data/data/matrix-spec/event-schemas/examples/m.key.verification.done.yaml +6 -0
  148. data/data/matrix-spec/event-schemas/examples/m.key.verification.key.yaml +7 -0
  149. data/data/matrix-spec/event-schemas/examples/m.key.verification.mac.yaml +10 -0
  150. data/data/matrix-spec/event-schemas/examples/m.key.verification.ready.yaml +10 -0
  151. data/data/matrix-spec/event-schemas/examples/m.key.verification.request.yaml +11 -0
  152. data/data/matrix-spec/event-schemas/examples/m.key.verification.start$m.sas.v1.yaml +12 -0
  153. data/data/matrix-spec/event-schemas/examples/m.key.verification.start.yaml +8 -0
  154. data/data/matrix-spec/event-schemas/examples/m.key_backup.yaml +7 -0
  155. data/data/matrix-spec/event-schemas/examples/m.marked_unread.yaml +7 -0
  156. data/data/matrix-spec/event-schemas/examples/m.policy.rule.room.yaml +10 -0
  157. data/data/matrix-spec/event-schemas/examples/m.policy.rule.server.yaml +10 -0
  158. data/data/matrix-spec/event-schemas/examples/m.policy.rule.user.yaml +10 -0
  159. data/data/matrix-spec/event-schemas/examples/m.presence.yaml +12 -0
  160. data/data/matrix-spec/event-schemas/examples/m.push_rules.yaml +177 -0
  161. data/data/matrix-spec/event-schemas/examples/m.reaction.yaml +11 -0
  162. data/data/matrix-spec/event-schemas/examples/m.receipt.yaml +18 -0
  163. data/data/matrix-spec/event-schemas/examples/m.recent_emoji.yaml +16 -0
  164. data/data/matrix-spec/event-schemas/examples/m.room.avatar.yaml +14 -0
  165. data/data/matrix-spec/event-schemas/examples/m.room.canonical_alias.yaml +12 -0
  166. data/data/matrix-spec/event-schemas/examples/m.room.create.yaml +13 -0
  167. data/data/matrix-spec/event-schemas/examples/m.room.encrypted$megolm.yaml +11 -0
  168. data/data/matrix-spec/event-schemas/examples/m.room.encrypted$olm.yaml +14 -0
  169. data/data/matrix-spec/event-schemas/examples/m.room.encryption.yaml +10 -0
  170. data/data/matrix-spec/event-schemas/examples/m.room.guest_access.yaml +8 -0
  171. data/data/matrix-spec/event-schemas/examples/m.room.history_visibility.yaml +8 -0
  172. data/data/matrix-spec/event-schemas/examples/m.room.join_rules$restricted.yaml +18 -0
  173. data/data/matrix-spec/event-schemas/examples/m.room.join_rules.yaml +8 -0
  174. data/data/matrix-spec/event-schemas/examples/m.room.member$invite_room_state.yaml +15 -0
  175. data/data/matrix-spec/event-schemas/examples/m.room.member$join_authorised_via_users_server.yaml +12 -0
  176. data/data/matrix-spec/event-schemas/examples/m.room.member$knock_room_state.yaml +15 -0
  177. data/data/matrix-spec/event-schemas/examples/m.room.member$third_party_invite.yaml +20 -0
  178. data/data/matrix-spec/event-schemas/examples/m.room.member.yaml +12 -0
  179. data/data/matrix-spec/event-schemas/examples/m.room.message$m.audio.yaml +14 -0
  180. data/data/matrix-spec/event-schemas/examples/m.room.message$m.emote.yaml +10 -0
  181. data/data/matrix-spec/event-schemas/examples/m.room.message$m.file.yaml +14 -0
  182. data/data/matrix-spec/event-schemas/examples/m.room.message$m.image.yaml +16 -0
  183. data/data/matrix-spec/event-schemas/examples/m.room.message$m.key.verification.request.yaml +19 -0
  184. data/data/matrix-spec/event-schemas/examples/m.room.message$m.location.yaml +18 -0
  185. data/data/matrix-spec/event-schemas/examples/m.room.message$m.notice.yaml +10 -0
  186. data/data/matrix-spec/event-schemas/examples/m.room.message$m.server_notice.yaml +11 -0
  187. data/data/matrix-spec/event-schemas/examples/m.room.message$m.text.yaml +10 -0
  188. data/data/matrix-spec/event-schemas/examples/m.room.message$m.video.yaml +23 -0
  189. data/data/matrix-spec/event-schemas/examples/m.room.name.yaml +8 -0
  190. data/data/matrix-spec/event-schemas/examples/m.room.pinned_events.yaml +8 -0
  191. data/data/matrix-spec/event-schemas/examples/m.room.policy.yaml +11 -0
  192. data/data/matrix-spec/event-schemas/examples/m.room.power_levels.yaml +24 -0
  193. data/data/matrix-spec/event-schemas/examples/m.room.redaction.yaml +8 -0
  194. data/data/matrix-spec/event-schemas/examples/m.room.server_acl.yaml +10 -0
  195. data/data/matrix-spec/event-schemas/examples/m.room.third_party_invite.yaml +14 -0
  196. data/data/matrix-spec/event-schemas/examples/m.room.tombstone.yaml +9 -0
  197. data/data/matrix-spec/event-schemas/examples/m.room.topic.yaml +16 -0
  198. data/data/matrix-spec/event-schemas/examples/m.room_key.withheld.yaml +12 -0
  199. data/data/matrix-spec/event-schemas/examples/m.room_key.yaml +10 -0
  200. data/data/matrix-spec/event-schemas/examples/m.room_key_request$cancel_request.yaml +8 -0
  201. data/data/matrix-spec/event-schemas/examples/m.room_key_request$request.yaml +14 -0
  202. data/data/matrix-spec/event-schemas/examples/m.secret.request.yaml +9 -0
  203. data/data/matrix-spec/event-schemas/examples/m.secret.send.yaml +7 -0
  204. data/data/matrix-spec/event-schemas/examples/m.space.child.yaml +10 -0
  205. data/data/matrix-spec/event-schemas/examples/m.space.parent.yaml +9 -0
  206. data/data/matrix-spec/event-schemas/examples/m.sticker.yaml +22 -0
  207. data/data/matrix-spec/event-schemas/examples/m.tag.yaml +9 -0
  208. data/data/matrix-spec/event-schemas/examples/m.typing.yaml +7 -0
  209. data/data/matrix-spec/event-schemas/moderation_policy_rule.yaml +32 -0
  210. data/data/matrix-spec/event-schemas/schema/components/m_text_content_block.yaml +28 -0
  211. data/data/matrix-spec/event-schemas/schema/components/sdp_stream_metadata.yaml +43 -0
  212. data/data/matrix-spec/event-schemas/schema/components/signed_third_party_invite.yaml +48 -0
  213. data/data/matrix-spec/event-schemas/schema/core-event-schema/call_event.yaml +27 -0
  214. data/data/matrix-spec/event-schemas/schema/core-event-schema/event.yaml +16 -0
  215. data/data/matrix-spec/event-schemas/schema/core-event-schema/msgtype_infos/avatar_info.yaml +30 -0
  216. data/data/matrix-spec/event-schemas/schema/core-event-schema/msgtype_infos/image_info.yaml +52 -0
  217. data/data/matrix-spec/event-schemas/schema/core-event-schema/msgtype_infos/thumbnail_info.yaml +22 -0
  218. data/data/matrix-spec/event-schemas/schema/core-event-schema/room_event.yaml +17 -0
  219. data/data/matrix-spec/event-schemas/schema/core-event-schema/state_event.yaml +8 -0
  220. data/data/matrix-spec/event-schemas/schema/core-event-schema/stripped_state.yaml +48 -0
  221. data/data/matrix-spec/event-schemas/schema/core-event-schema/sync_room_event.yaml +49 -0
  222. data/data/matrix-spec/event-schemas/schema/core-event-schema/sync_state_event.yaml +36 -0
  223. data/data/matrix-spec/event-schemas/schema/core-event-schema/unsigned_prop.yaml +23 -0
  224. data/data/matrix-spec/event-schemas/schema/m.accepted_terms.yaml +25 -0
  225. data/data/matrix-spec/event-schemas/schema/m.call.answer.yaml +44 -0
  226. data/data/matrix-spec/event-schemas/schema/m.call.candidates.yaml +52 -0
  227. data/data/matrix-spec/event-schemas/schema/m.call.hangup.yaml +57 -0
  228. data/data/matrix-spec/event-schemas/schema/m.call.invite.yaml +53 -0
  229. data/data/matrix-spec/event-schemas/schema/m.call.negotiate.yaml +78 -0
  230. data/data/matrix-spec/event-schemas/schema/m.call.reject.yaml +29 -0
  231. data/data/matrix-spec/event-schemas/schema/m.call.sdp_stream_metadata_changed.yaml +24 -0
  232. data/data/matrix-spec/event-schemas/schema/m.call.select_answer.yaml +29 -0
  233. data/data/matrix-spec/event-schemas/schema/m.direct.yaml +29 -0
  234. data/data/matrix-spec/event-schemas/schema/m.dummy.yaml +25 -0
  235. data/data/matrix-spec/event-schemas/schema/m.forwarded_room_key.yaml +70 -0
  236. data/data/matrix-spec/event-schemas/schema/m.fully_read.yaml +26 -0
  237. data/data/matrix-spec/event-schemas/schema/m.identity_server.yaml +28 -0
  238. data/data/matrix-spec/event-schemas/schema/m.ignored_user_list.yaml +30 -0
  239. data/data/matrix-spec/event-schemas/schema/m.invite_permission_config.yaml +21 -0
  240. data/data/matrix-spec/event-schemas/schema/m.key.verification.accept.yaml +63 -0
  241. data/data/matrix-spec/event-schemas/schema/m.key.verification.cancel.yaml +72 -0
  242. data/data/matrix-spec/event-schemas/schema/m.key.verification.done.yaml +24 -0
  243. data/data/matrix-spec/event-schemas/schema/m.key.verification.key.yaml +31 -0
  244. data/data/matrix-spec/event-schemas/schema/m.key.verification.m.relates_to.yaml +23 -0
  245. data/data/matrix-spec/event-schemas/schema/m.key.verification.mac.yaml +43 -0
  246. data/data/matrix-spec/event-schemas/schema/m.key.verification.ready.yaml +41 -0
  247. data/data/matrix-spec/event-schemas/schema/m.key.verification.request.yaml +47 -0
  248. data/data/matrix-spec/event-schemas/schema/m.key.verification.start$m.reciprocate.v1.yaml +45 -0
  249. data/data/matrix-spec/event-schemas/schema/m.key.verification.start$m.sas.v1.yaml +76 -0
  250. data/data/matrix-spec/event-schemas/schema/m.key.verification.start.yaml +46 -0
  251. data/data/matrix-spec/event-schemas/schema/m.key_backup.yaml +24 -0
  252. data/data/matrix-spec/event-schemas/schema/m.marked_unread.yaml +26 -0
  253. data/data/matrix-spec/event-schemas/schema/m.policy.rule.room.yaml +17 -0
  254. data/data/matrix-spec/event-schemas/schema/m.policy.rule.server.yaml +17 -0
  255. data/data/matrix-spec/event-schemas/schema/m.policy.rule.user.yaml +17 -0
  256. data/data/matrix-spec/event-schemas/schema/m.presence.yaml +50 -0
  257. data/data/matrix-spec/event-schemas/schema/m.push_rules.yaml +23 -0
  258. data/data/matrix-spec/event-schemas/schema/m.reaction.yaml +45 -0
  259. data/data/matrix-spec/event-schemas/schema/m.receipt.yaml +65 -0
  260. data/data/matrix-spec/event-schemas/schema/m.recent_emoji.yaml +29 -0
  261. data/data/matrix-spec/event-schemas/schema/m.room.avatar.yaml +29 -0
  262. data/data/matrix-spec/event-schemas/schema/m.room.canonical_alias.yaml +40 -0
  263. data/data/matrix-spec/event-schemas/schema/m.room.create.yaml +86 -0
  264. data/data/matrix-spec/event-schemas/schema/m.room.encrypted.yaml +91 -0
  265. data/data/matrix-spec/event-schemas/schema/m.room.encryption.yaml +38 -0
  266. data/data/matrix-spec/event-schemas/schema/m.room.guest_access.yaml +28 -0
  267. data/data/matrix-spec/event-schemas/schema/m.room.history_visibility.yaml +30 -0
  268. data/data/matrix-spec/event-schemas/schema/m.room.join_rules.yaml +78 -0
  269. data/data/matrix-spec/event-schemas/schema/m.room.member.yaml +174 -0
  270. data/data/matrix-spec/event-schemas/schema/m.room.message$m.audio.yaml +73 -0
  271. data/data/matrix-spec/event-schemas/schema/m.room.message$m.emote.yaml +36 -0
  272. data/data/matrix-spec/event-schemas/schema/m.room.message$m.file.yaml +85 -0
  273. data/data/matrix-spec/event-schemas/schema/m.room.message$m.image.yaml +63 -0
  274. data/data/matrix-spec/event-schemas/schema/m.room.message$m.key.verification.request.yaml +70 -0
  275. data/data/matrix-spec/event-schemas/schema/m.room.message$m.location.yaml +50 -0
  276. data/data/matrix-spec/event-schemas/schema/m.room.message$m.notice.yaml +36 -0
  277. data/data/matrix-spec/event-schemas/schema/m.room.message$m.server_notice.yaml +41 -0
  278. data/data/matrix-spec/event-schemas/schema/m.room.message$m.text.yaml +36 -0
  279. data/data/matrix-spec/event-schemas/schema/m.room.message$m.video.yaml +95 -0
  280. data/data/matrix-spec/event-schemas/schema/m.room.message.yaml +25 -0
  281. data/data/matrix-spec/event-schemas/schema/m.room.name.yaml +35 -0
  282. data/data/matrix-spec/event-schemas/schema/m.room.pinned_events.yaml +27 -0
  283. data/data/matrix-spec/event-schemas/schema/m.room.policy.yaml +41 -0
  284. data/data/matrix-spec/event-schemas/schema/m.room.power_levels.yaml +139 -0
  285. data/data/matrix-spec/event-schemas/schema/m.room.redaction.yaml +29 -0
  286. data/data/matrix-spec/event-schemas/schema/m.room.server_acl.yaml +88 -0
  287. data/data/matrix-spec/event-schemas/schema/m.room.third_party_invite.yaml +79 -0
  288. data/data/matrix-spec/event-schemas/schema/m.room.tombstone.yaml +29 -0
  289. data/data/matrix-spec/event-schemas/schema/m.room.topic.yaml +53 -0
  290. data/data/matrix-spec/event-schemas/schema/m.room_key.withheld.yaml +88 -0
  291. data/data/matrix-spec/event-schemas/schema/m.room_key.yaml +38 -0
  292. data/data/matrix-spec/event-schemas/schema/m.room_key_request.yaml +73 -0
  293. data/data/matrix-spec/event-schemas/schema/m.secret.request.yaml +42 -0
  294. data/data/matrix-spec/event-schemas/schema/m.secret.send.yaml +35 -0
  295. data/data/matrix-spec/event-schemas/schema/m.space.child.yaml +50 -0
  296. data/data/matrix-spec/event-schemas/schema/m.space.parent.yaml +36 -0
  297. data/data/matrix-spec/event-schemas/schema/m.sticker.yaml +36 -0
  298. data/data/matrix-spec/event-schemas/schema/m.tag.yaml +28 -0
  299. data/data/matrix-spec/event-schemas/schema/m.typing.yaml +29 -0
  300. data/lib/async/discord/api/path_tree.rb +127 -0
  301. data/lib/async/discord/api.rb +151 -0
  302. data/lib/async/discord/client.rb +283 -0
  303. data/lib/async/discord/error.rb +84 -0
  304. data/lib/async/discord/gateway.rb +359 -0
  305. data/lib/async/discord.rb +15 -0
  306. data/lib/async/matrix/3.3/async_matrix_e2ee.so +0 -0
  307. data/lib/async/matrix/3.4/async_matrix_e2ee.so +0 -0
  308. data/lib/async/matrix/4.0/async_matrix_e2ee.so +0 -0
  309. data/lib/async/matrix/api/chain.rb +578 -0
  310. data/lib/async/matrix/api/concat.rb +101 -0
  311. data/lib/async/matrix/api/path_tree.rb +205 -0
  312. data/lib/async/matrix/api.rb +200 -0
  313. data/lib/async/matrix/application_service/bot.rb +232 -0
  314. data/lib/async/matrix/application_service/config/schema/analytics.json +21 -0
  315. data/lib/async/matrix/application_service/config/schema/appservice.json +82 -0
  316. data/lib/async/matrix/application_service/config/schema/backfill.json +91 -0
  317. data/lib/async/matrix/application_service/config/schema/bridge.json +209 -0
  318. data/lib/async/matrix/application_service/config/schema/config.json +61 -0
  319. data/lib/async/matrix/application_service/config/schema/database.json +38 -0
  320. data/lib/async/matrix/application_service/config/schema/direct_media.json +35 -0
  321. data/lib/async/matrix/application_service/config/schema/double_puppet.json +24 -0
  322. data/lib/async/matrix/application_service/config/schema/encryption.json +164 -0
  323. data/lib/async/matrix/application_service/config/schema/homeserver.json +58 -0
  324. data/lib/async/matrix/application_service/config/schema/logging.json +50 -0
  325. data/lib/async/matrix/application_service/config/schema/management_room_texts.json +25 -0
  326. data/lib/async/matrix/application_service/config/schema/matrix.json +45 -0
  327. data/lib/async/matrix/application_service/config/schema/permissions.json +54 -0
  328. data/lib/async/matrix/application_service/config/schema/provisioning.json +23 -0
  329. data/lib/async/matrix/application_service/config/schema/public_media.json +39 -0
  330. data/lib/async/matrix/application_service/config/schema/relay.json +43 -0
  331. data/lib/async/matrix/application_service/config/vivify.rb +109 -0
  332. data/lib/async/matrix/application_service/config.rb +225 -0
  333. data/lib/async/matrix/application_service/dispatcher.rb +185 -0
  334. data/lib/async/matrix/application_service/error_response.rb +37 -0
  335. data/lib/async/matrix/application_service/event.rb +285 -0
  336. data/lib/async/matrix/application_service/server.rb +430 -0
  337. data/lib/async/matrix/application_service/transaction.rb +66 -0
  338. data/lib/async/matrix/application_service/transaction_handler.rb +185 -0
  339. data/lib/async/matrix/application_service/transaction_store.rb +80 -0
  340. data/lib/async/matrix/bridge/discord/db/connection.rb +141 -0
  341. data/lib/async/matrix/bridge/discord/db/file.rb +118 -0
  342. data/lib/async/matrix/bridge/discord/db/guild.rb +120 -0
  343. data/lib/async/matrix/bridge/discord/db/message.rb +160 -0
  344. data/lib/async/matrix/bridge/discord/db/migrations/001_create_users.rb +14 -0
  345. data/lib/async/matrix/bridge/discord/db/migrations/002_create_guilds.rb +14 -0
  346. data/lib/async/matrix/bridge/discord/db/migrations/003_create_portals.rb +23 -0
  347. data/lib/async/matrix/bridge/discord/db/migrations/004_create_puppets.rb +19 -0
  348. data/lib/async/matrix/bridge/discord/db/migrations/005_create_messages.rb +20 -0
  349. data/lib/async/matrix/bridge/discord/db/migrations/006_create_reactions.rb +19 -0
  350. data/lib/async/matrix/bridge/discord/db/migrations/007_create_files.rb +18 -0
  351. data/lib/async/matrix/bridge/discord/db/portal.rb +150 -0
  352. data/lib/async/matrix/bridge/discord/db/puppet.rb +128 -0
  353. data/lib/async/matrix/bridge/discord/db/reaction.rb +165 -0
  354. data/lib/async/matrix/bridge/discord/db/schema.rb +18 -0
  355. data/lib/async/matrix/bridge/discord/db/user.rb +112 -0
  356. data/lib/async/matrix/bridge/discord/db.rb +138 -0
  357. data/lib/async/matrix/client.rb +934 -0
  358. data/lib/async/matrix/connection.rb +19 -0
  359. data/lib/async/matrix/double_puppet_client.rb +82 -0
  360. data/lib/async/matrix/e2ee.rb +92 -0
  361. data/lib/async/matrix/endpoint.rb +57 -0
  362. data/lib/async/matrix/error.rb +67 -0
  363. data/lib/async/matrix/media_client.rb +170 -0
  364. data/lib/async/matrix/notifier.rb +104 -0
  365. data/lib/async/matrix/schema/registry.rb +354 -0
  366. data/lib/async/matrix/schema/validation_error.rb +225 -0
  367. data/lib/async/matrix/schema.rb +170 -0
  368. data/lib/async/matrix/server.rb +18 -0
  369. data/lib/async/matrix/stream.rb +18 -0
  370. data/lib/async/matrix/version.rb +10 -0
  371. data/lib/async/matrix.rb +22 -0
  372. metadata +588 -0
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the Apache License, Version 2.0.
4
+ # Copyright, 2026, by General Intelligence Systems.
5
+
6
+ module Async
7
+ module Discord
8
+ # Runtime-generated Discord HTTP API built from the official OpenAPI spec.
9
+ #
10
+ # Loads the OpenAPI 3.1.0 JSON file from data/discord-api-spec/openapi.json
11
+ # at require-time and builds a PathTree trie of all valid endpoints. API calls
12
+ # are constructed via method chains (reusing Async::Matrix::Api::Chain),
13
+ # validated against the tree, and terminated by .get(), .post(), .put(),
14
+ # .patch(), or .delete().
15
+ #
16
+ # Usage:
17
+ # client.api.channels("123456").messages.post(content: "hello")
18
+ # client.api.guilds("789").members.get(limit: 100)
19
+ # client.api.users("@me").get
20
+ #
21
+ module Api
22
+ # The shared PathTree instance, loaded once from the bundled spec.
23
+ def self.path_tree
24
+ @path_tree ||= PathTree.load
25
+ end
26
+
27
+ # Reset the cached path tree (useful for testing or reloading).
28
+ def self.reset!
29
+ @path_tree = nil
30
+ end
31
+
32
+ # Gateway produces Chain instances bound to a specific Discord Client.
33
+ # Each call to a method on the Gateway starts a new chain.
34
+ class Gateway
35
+ def initialize(client, prefix: %w[api v10])
36
+ @client = client
37
+ @prefix = prefix
38
+ end
39
+
40
+ # Start a fresh chain. Every method call on the gateway creates
41
+ # a new chain so chains are never reused.
42
+ def chain
43
+ Async::Matrix::Api::Chain.new(
44
+ client: @client,
45
+ path_tree: Api.path_tree,
46
+ prefix: @prefix
47
+ )
48
+ end
49
+
50
+ # Forward all unknown methods to a fresh chain, starting the path.
51
+ def method_missing(name, *args, **kwargs, &block)
52
+ if name.start_with?("to_")
53
+ super
54
+ else
55
+ chain.__send__(name, *args, **kwargs, &block)
56
+ end
57
+ end
58
+
59
+ def respond_to_missing?(name, include_private = false)
60
+ !name.start_with?("to_") || super
61
+ end
62
+
63
+ def inspect
64
+ "#<#{self.class} prefix=/#{@prefix.join("/")}>"
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ __END__
72
+ describe "Async::Discord::Api::Gateway" do
73
+ # Stub client that records calls instead of making HTTP requests.
74
+ StubDiscordClient = Struct.new(:calls) do
75
+ def initialize
76
+ super([])
77
+ end
78
+
79
+ def get(path, max_retries: nil)
80
+ calls << [:get, path, {max_retries: max_retries}]
81
+ {"stub" => true}
82
+ end
83
+
84
+ def post(path, body = {}, max_retries: nil)
85
+ calls << [:post, path, body, {max_retries: max_retries}]
86
+ {"stub" => true}
87
+ end
88
+
89
+ def put(path, body = {}, max_retries: nil)
90
+ calls << [:put, path, body, {max_retries: max_retries}]
91
+ {"stub" => true}
92
+ end
93
+
94
+ def request(method, path, body = nil, max_retries: nil)
95
+ calls << [method.downcase.to_sym, path, body, {max_retries: max_retries}]
96
+ {"stub" => true}
97
+ end
98
+
99
+ # Chain checks for media_client on binary routes; Discord doesn't need it
100
+ # but we provide a stub to avoid NoMethodError.
101
+ def media_client
102
+ nil
103
+ end
104
+ end
105
+
106
+ def make_gateway
107
+ client = StubDiscordClient.new
108
+ gateway = Async::Discord::Api::Gateway.new(client)
109
+ [gateway, client]
110
+ end
111
+
112
+ it "GET /users/@me" do
113
+ gw, client = make_gateway
114
+ gw.users("@me").get
115
+ client.calls.last[0].should == :get
116
+ client.calls.last[1].should == "/api/v10/users/%40me"
117
+ end
118
+
119
+ it "POST /channels/{id}/messages" do
120
+ gw, client = make_gateway
121
+ gw.channels("123456").messages.post(content: "hello world")
122
+ client.calls.last[0].should == :post
123
+ client.calls.last[1].should == "/api/v10/channels/123456/messages"
124
+ client.calls.last[2].should == {content: "hello world"}
125
+ end
126
+
127
+ it "GET /guilds/{id}/channels" do
128
+ gw, client = make_gateway
129
+ gw.guilds("789").channels.get
130
+ client.calls.last[0].should == :get
131
+ client.calls.last[1].should == "/api/v10/guilds/789/channels"
132
+ end
133
+
134
+ it "PATCH /channels/{id} via request" do
135
+ gw, client = make_gateway
136
+ gw.channels("123456").patch(name: "new-name")
137
+ client.calls.last[0].should == :patch
138
+ end
139
+
140
+ it "each gateway method call starts a fresh chain" do
141
+ gw, client = make_gateway
142
+ gw.users("@me").get
143
+ gw.channels("123").messages.post(content: "hi")
144
+ client.calls.length.should == 2
145
+ end
146
+
147
+ it "raises InvalidEndpointError for unknown path" do
148
+ gw, _ = make_gateway
149
+ lambda { gw.totally.bogus.endpoint.get }.should.raise Async::Matrix::InvalidEndpointError
150
+ end
151
+ end
@@ -0,0 +1,283 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the Apache License, Version 2.0.
4
+ # Copyright, 2026, by General Intelligence Systems.
5
+
6
+ require "async/http/internet"
7
+ require "json"
8
+ require "erb"
9
+ require "console"
10
+ require "time"
11
+
12
+ module Async
13
+ module Discord
14
+ # Async HTTP client for the Discord REST API.
15
+ #
16
+ # Authenticated with a Bot token. All methods are fiber-safe and run
17
+ # naturally inside Falcon's async reactor.
18
+ #
19
+ # client = Async::Discord::Client.new(token: "MTk...")
20
+ # client.api.channels("123").messages.post(content: "hello")
21
+ # client.api.users("@me").get
22
+ #
23
+ class Client
24
+ DEFAULT_BASE_URL = "https://discord.com"
25
+
26
+ # Retry defaults
27
+ DEFAULT_MAX_RETRIES = 3
28
+ DEFAULT_RETRY_BASE = 0.5
29
+ DEFAULT_MAX_RETRY_DELAY = 30
30
+
31
+ # Status codes eligible for retry
32
+ RATE_LIMIT_STATUS = 429
33
+ GATEWAY_ERROR_STATUSES = [502, 503, 504].freeze
34
+
35
+ # Response size limits (bytes)
36
+ DEFAULT_RESPONSE_SIZE_LIMIT = 50 * 1024 * 1024 # 50 MiB
37
+ DEFAULT_ERROR_RESPONSE_SIZE_LIMIT = 512 * 1024 # 512 KiB
38
+
39
+ attr_reader :token
40
+
41
+ def initialize(token:, base_url: DEFAULT_BASE_URL,
42
+ max_retries: DEFAULT_MAX_RETRIES,
43
+ retry_base_delay: DEFAULT_RETRY_BASE,
44
+ max_retry_delay: DEFAULT_MAX_RETRY_DELAY,
45
+ response_size_limit: DEFAULT_RESPONSE_SIZE_LIMIT,
46
+ error_response_size_limit: DEFAULT_ERROR_RESPONSE_SIZE_LIMIT)
47
+ @token = token
48
+ @base = base_url
49
+ @max_retries = max_retries
50
+ @retry_base_delay = retry_base_delay
51
+ @max_retry_delay = max_retry_delay
52
+ @response_size_limit = response_size_limit
53
+ @error_response_size_limit = error_response_size_limit
54
+ @headers = [
55
+ ["authorization", "Bot #{token}"],
56
+ ["content-type", "application/json"],
57
+ ["user-agent", "AsyncDiscord (https://github.com/general-intelligence-systems/async-matrix, 1.0)"]
58
+ ]
59
+ end
60
+
61
+ # ── Full API (runtime-generated from OpenAPI spec) ────────
62
+
63
+ # Returns a Gateway that provides method-chained access to every
64
+ # Discord HTTP API endpoint. Chains are validated against the official
65
+ # OpenAPI path tree and terminated by .get(), .post(), .put(),
66
+ # .patch(), or .delete().
67
+ #
68
+ # client.api.channels("123").messages.post(content: "hello")
69
+ # client.api.guilds("789").get
70
+ # client.api.users("@me").get
71
+ #
72
+ def api
73
+ Api::Gateway.new(self)
74
+ end
75
+
76
+ # ── Low-level HTTP ────────────────────────────────────────
77
+
78
+ def get(path, max_retries: nil)
79
+ request("GET", path, nil, max_retries: max_retries)
80
+ end
81
+
82
+ def post(path, body = {}, max_retries: nil)
83
+ request("POST", path, body, max_retries: max_retries)
84
+ end
85
+
86
+ def put(path, body = {}, max_retries: nil)
87
+ request("PUT", path, body, max_retries: max_retries)
88
+ end
89
+
90
+ def close
91
+ @internet&.close
92
+ @internet = nil
93
+ end
94
+
95
+ # General-purpose request method supporting any HTTP method.
96
+ def request(method, path, body = nil, max_retries: nil)
97
+ url = "#{@base}#{path}"
98
+ json_body = body ? JSON.generate(body) : nil
99
+ effective_max_retries = max_retries || @max_retries
100
+
101
+ Console.debug(self) { "#{method} #{path}" }
102
+
103
+ attempt = 0
104
+ loop do
105
+ response = internet.call(method, url, @headers, json_body)
106
+ status = response.status
107
+
108
+ if (200..299).cover?(status)
109
+ payload = read_limited(response, @response_size_limit)
110
+ return payload && !payload.empty? ? JSON.parse(payload) : {}
111
+ end
112
+
113
+ attempt += 1
114
+
115
+ if attempt <= effective_max_retries && retryable_status?(status)
116
+ delay = compute_retry_delay(status, response, attempt)
117
+ Console.warn(self) {
118
+ "#{method} #{path} returned #{status}, retry #{attempt}/#{effective_max_retries} in #{delay.round(2)}s"
119
+ }
120
+ response.close if response.respond_to?(:close)
121
+ sleep(delay)
122
+ next
123
+ end
124
+
125
+ payload = read_limited(response, @error_response_size_limit)
126
+ parsed = begin; JSON.parse(payload || "{}"); rescue; {} end
127
+ discord_code = parsed["code"]
128
+ discord_msg = parsed["message"] || payload.to_s[0..200]
129
+
130
+ Console.error(self) { "Discord API #{status}: #{discord_code} — #{discord_msg}" }
131
+
132
+ error_class = case status
133
+ when 401 then AuthError
134
+ when 429 then RateLimitError
135
+ when 400..499 then ApiError
136
+ else ServerError
137
+ end
138
+
139
+ raise error_class.new(
140
+ discord_code.to_s,
141
+ discord_msg,
142
+ status: status
143
+ )
144
+ end
145
+ end
146
+
147
+ private
148
+
149
+ def internet
150
+ @internet ||= Async::HTTP::Internet.new
151
+ end
152
+
153
+ # ── Response size limiting ──────────────────────────────
154
+
155
+ def read_limited(response, limit)
156
+ body = response.body
157
+ return nil unless body
158
+
159
+ if body.respond_to?(:length) && body.length && body.length > limit
160
+ body.close
161
+ raise ResponseTooLargeError.new(
162
+ "TOO_LARGE",
163
+ "Response Content-Length #{body.length} bytes exceeds limit of #{limit} bytes"
164
+ )
165
+ end
166
+
167
+ buffer = String.new(encoding: Encoding::BINARY)
168
+ body.each do |chunk|
169
+ buffer << chunk
170
+ if buffer.bytesize > limit
171
+ body.close
172
+ raise ResponseTooLargeError.new(
173
+ "TOO_LARGE",
174
+ "Response body exceeds limit of #{limit} bytes"
175
+ )
176
+ end
177
+ end
178
+ buffer.empty? ? nil : buffer
179
+ end
180
+
181
+ # ── Retry logic ─────────────────────────────────────────
182
+
183
+ def retryable_status?(status)
184
+ status == RATE_LIMIT_STATUS || GATEWAY_ERROR_STATUSES.include?(status)
185
+ end
186
+
187
+ # Discord sends Retry-After as seconds (float) in the JSON body on 429,
188
+ # and also as X-RateLimit-Reset-After header. We check both.
189
+ def compute_retry_delay(status, response, attempt)
190
+ if status == RATE_LIMIT_STATUS
191
+ server_delay = parse_rate_limit_delay(response)
192
+ delay = server_delay || exponential_delay(attempt)
193
+ [delay, @max_retry_delay].min
194
+ else
195
+ calculated = exponential_delay(attempt)
196
+ rand(0.0..[calculated, @max_retry_delay].min)
197
+ end
198
+ end
199
+
200
+ def exponential_delay(attempt)
201
+ @retry_base_delay * (2 ** (attempt - 1))
202
+ end
203
+
204
+ # Parse Discord rate limit delay. Checks:
205
+ # 1. X-RateLimit-Reset-After header (seconds as float)
206
+ # 2. Retry-After header (seconds as integer)
207
+ def parse_rate_limit_delay(response)
208
+ reset_after = response.headers["x-ratelimit-reset-after"]
209
+ return reset_after.to_f if reset_after
210
+
211
+ retry_after = response.headers["retry-after"]
212
+ return retry_after.to_f if retry_after && retry_after.strip.match?(/\A[\d.]+\z/)
213
+
214
+ nil
215
+ end
216
+
217
+ def encode(value)
218
+ ERB::Util.url_encode(value)
219
+ end
220
+ end
221
+ end
222
+ end
223
+
224
+ __END__
225
+ describe "Async::Discord::Client" do
226
+ it "sets authorization header with Bot prefix" do
227
+ client = Async::Discord::Client.new(token: "test_token_123")
228
+ headers = client.instance_variable_get(:@headers)
229
+ auth = headers.find { |k, _| k == "authorization" }
230
+ auth[1].should == "Bot test_token_123"
231
+ end
232
+
233
+ it "stores the token" do
234
+ client = Async::Discord::Client.new(token: "my_token")
235
+ client.token.should == "my_token"
236
+ end
237
+
238
+ it "defaults base URL to discord.com" do
239
+ client = Async::Discord::Client.new(token: "tok")
240
+ client.instance_variable_get(:@base).should == "https://discord.com"
241
+ end
242
+
243
+ it "accepts custom base URL" do
244
+ client = Async::Discord::Client.new(token: "tok", base_url: "http://localhost:9999")
245
+ client.instance_variable_get(:@base).should == "http://localhost:9999"
246
+ end
247
+
248
+ it "responds to HTTP methods" do
249
+ client = Async::Discord::Client.new(token: "tok")
250
+ client.should.respond_to :get
251
+ client.should.respond_to :post
252
+ client.should.respond_to :put
253
+ client.should.respond_to :request
254
+ client.should.respond_to :close
255
+ end
256
+
257
+ it "responds to api" do
258
+ client = Async::Discord::Client.new(token: "tok")
259
+ client.should.respond_to :api
260
+ end
261
+
262
+ it "returns a Discord Api::Gateway from api" do
263
+ client = Async::Discord::Client.new(token: "tok")
264
+ client.api.should.be.kind_of Async::Discord::Api::Gateway
265
+ end
266
+
267
+ it "accepts custom retry configuration" do
268
+ client = Async::Discord::Client.new(
269
+ token: "tok",
270
+ max_retries: 5,
271
+ retry_base_delay: 1.0,
272
+ max_retry_delay: 60
273
+ )
274
+ client.instance_variable_get(:@max_retries).should == 5
275
+ client.instance_variable_get(:@retry_base_delay).should == 1.0
276
+ client.instance_variable_get(:@max_retry_delay).should == 60
277
+ end
278
+
279
+ it "can be closed without error" do
280
+ client = Async::Discord::Client.new(token: "tok")
281
+ lambda { client.close }.should.not.raise
282
+ end
283
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the Apache License, Version 2.0.
4
+ # Copyright, 2026, by General Intelligence Systems.
5
+
6
+ module Async
7
+ module Discord
8
+ # Base error for all Discord API errors.
9
+ class Error < StandardError
10
+ attr_reader :code, :status
11
+
12
+ def initialize(code, message, status: nil)
13
+ @code = code
14
+ @status = status
15
+ super(message)
16
+ end
17
+ end
18
+
19
+ # Raised when authentication fails (401).
20
+ class AuthError < Error; end
21
+
22
+ # Raised on non-retryable Discord API errors (4xx).
23
+ class ApiError < Error; end
24
+
25
+ # Raised when rate-limited and retries are exhausted.
26
+ class RateLimitError < Error; end
27
+
28
+ # Raised on server errors after retries exhausted (5xx).
29
+ class ServerError < Error; end
30
+
31
+ # Raised when a response body exceeds the configured size limit.
32
+ class ResponseTooLargeError < Error; end
33
+
34
+ # Raised when the WebSocket gateway connection fails.
35
+ class GatewayError < Error; end
36
+ end
37
+ end
38
+
39
+ __END__
40
+ describe "Async::Discord::Error" do
41
+ it "stores code and message" do
42
+ err = Async::Discord::Error.new("DISCORD_ERROR", "something broke")
43
+ err.code.should == "DISCORD_ERROR"
44
+ err.message.should == "something broke"
45
+ end
46
+
47
+ it "stores optional status" do
48
+ err = Async::Discord::Error.new("ERR", "fail", status: 400)
49
+ err.status.should == 400
50
+ end
51
+
52
+ it "defaults status to nil" do
53
+ err = Async::Discord::Error.new("ERR", "fail")
54
+ err.status.should.be.nil
55
+ end
56
+
57
+ it "is a StandardError" do
58
+ Async::Discord::Error.new("ERR", "fail").should.be.kind_of StandardError
59
+ end
60
+ end
61
+
62
+ it "AuthError inherits from Error" do
63
+ Async::Discord::AuthError.new("AUTH", "bad token").should.be.kind_of Async::Discord::Error
64
+ end
65
+
66
+ it "ApiError inherits from Error" do
67
+ Async::Discord::ApiError.new("API", "bad request").should.be.kind_of Async::Discord::Error
68
+ end
69
+
70
+ it "RateLimitError inherits from Error" do
71
+ Async::Discord::RateLimitError.new("RATE", "slow down").should.be.kind_of Async::Discord::Error
72
+ end
73
+
74
+ it "ServerError inherits from Error" do
75
+ Async::Discord::ServerError.new("SERVER", "500").should.be.kind_of Async::Discord::Error
76
+ end
77
+
78
+ it "ResponseTooLargeError inherits from Error" do
79
+ Async::Discord::ResponseTooLargeError.new("LARGE", "too big").should.be.kind_of Async::Discord::Error
80
+ end
81
+
82
+ it "GatewayError inherits from Error" do
83
+ Async::Discord::GatewayError.new("GW", "disconnected").should.be.kind_of Async::Discord::Error
84
+ end