onyxcord 2.0.13 → 3.2.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 (270) hide show
  1. checksums.yaml +4 -4
  2. data/lib/onyxcord/application_commands/command.rb +4 -97
  3. data/lib/onyxcord/application_commands/context.rb +4 -94
  4. data/lib/onyxcord/application_commands/option.rb +4 -75
  5. data/lib/onyxcord/application_commands/registry.rb +4 -45
  6. data/lib/onyxcord/application_commands.rb +8 -5
  7. data/lib/onyxcord/bot.rb +24 -1759
  8. data/lib/onyxcord/{cache.rb → cache/manager.rb} +16 -14
  9. data/lib/onyxcord/cache/stores/gateway.rb +272 -0
  10. data/lib/onyxcord/commands/bot/channels.rb +48 -0
  11. data/lib/onyxcord/commands/bot/execution.rb +174 -0
  12. data/lib/onyxcord/commands/bot/message_dispatch.rb +58 -0
  13. data/lib/onyxcord/commands/bot/permissions.rb +72 -0
  14. data/lib/onyxcord/commands/bot.rb +209 -0
  15. data/lib/onyxcord/commands/container.rb +21 -2
  16. data/lib/onyxcord/commands/parser.rb +30 -1
  17. data/lib/onyxcord/container.rb +16 -960
  18. data/lib/onyxcord/core/bot/application_commands.rb +210 -0
  19. data/lib/onyxcord/core/bot/awaits.rb +112 -0
  20. data/lib/onyxcord/core/bot/invites.rb +42 -0
  21. data/lib/onyxcord/core/bot/messaging.rb +161 -0
  22. data/lib/onyxcord/core/bot/oauth.rb +27 -0
  23. data/lib/onyxcord/core/bot/presence.rb +103 -0
  24. data/lib/onyxcord/core/bot/runtime.rb +183 -0
  25. data/lib/onyxcord/core/bot/voice.rb +69 -0
  26. data/lib/onyxcord/{errors.rb → core/errors.rb} +18 -3
  27. data/lib/onyxcord/{logger.rb → core/logger.rb} +5 -0
  28. data/lib/onyxcord/core/version.rb +5 -0
  29. data/lib/onyxcord/events/await/base.rb +48 -0
  30. data/lib/onyxcord/events/await.rb +1 -46
  31. data/lib/onyxcord/events/ban/base.rb +54 -0
  32. data/lib/onyxcord/events/ban/remove.rb +11 -0
  33. data/lib/onyxcord/events/bans.rb +2 -58
  34. data/lib/onyxcord/events/channels/base.rb +91 -0
  35. data/lib/onyxcord/events/channels/delete.rb +73 -0
  36. data/lib/onyxcord/events/channels/pins.rb +44 -0
  37. data/lib/onyxcord/events/channels/recipients.rb +77 -0
  38. data/lib/onyxcord/events/channels.rb +4 -239
  39. data/lib/onyxcord/events/guilds/audit_logs.rb +79 -0
  40. data/lib/onyxcord/events/guilds/base.rb +97 -0
  41. data/lib/onyxcord/events/guilds/emoji.rb +147 -0
  42. data/lib/onyxcord/events/guilds.rb +3 -267
  43. data/lib/onyxcord/events/handlers/channels.rb +133 -0
  44. data/lib/onyxcord/events/handlers/core.rb +146 -0
  45. data/lib/onyxcord/events/handlers/guilds.rb +375 -0
  46. data/lib/onyxcord/events/handlers/interactions.rb +238 -0
  47. data/lib/onyxcord/events/handlers/lifetime.rb +71 -0
  48. data/lib/onyxcord/events/handlers/messages.rb +218 -0
  49. data/lib/onyxcord/events/handlers/presence.rb +56 -0
  50. data/lib/onyxcord/events/handlers/raw.rb +39 -0
  51. data/lib/onyxcord/events/handlers/reactions.rb +98 -0
  52. data/lib/onyxcord/events/handlers/scheduled_events.rb +243 -0
  53. data/lib/onyxcord/events/handlers/voice.rb +46 -0
  54. data/lib/onyxcord/events/integration/base.rb +45 -0
  55. data/lib/onyxcord/events/integration/create.rb +11 -0
  56. data/lib/onyxcord/events/integration/delete.rb +48 -0
  57. data/lib/onyxcord/events/integration/update.rb +11 -0
  58. data/lib/onyxcord/events/integrations.rb +4 -98
  59. data/lib/onyxcord/events/interactions/application_commands.rb +185 -0
  60. data/lib/onyxcord/events/interactions/autocomplete.rb +62 -0
  61. data/lib/onyxcord/events/interactions/base.rb +175 -0
  62. data/lib/onyxcord/events/interactions/components.rb +221 -0
  63. data/lib/onyxcord/events/interactions/permissions.rb +53 -0
  64. data/lib/onyxcord/events/interactions.rb +5 -622
  65. data/lib/onyxcord/events/invite/create.rb +79 -0
  66. data/lib/onyxcord/events/invite/delete.rb +55 -0
  67. data/lib/onyxcord/events/invites.rb +2 -125
  68. data/lib/onyxcord/events/lifetime/base.rb +31 -0
  69. data/lib/onyxcord/events/lifetime.rb +1 -29
  70. data/lib/onyxcord/events/member/add.rb +12 -0
  71. data/lib/onyxcord/events/member/base.rb +67 -0
  72. data/lib/onyxcord/events/member/delete.rb +21 -0
  73. data/lib/onyxcord/events/member/update.rb +25 -0
  74. data/lib/onyxcord/events/members.rb +4 -108
  75. data/lib/onyxcord/events/message/base.rb +295 -0
  76. data/lib/onyxcord/events/message/ids.rb +71 -0
  77. data/lib/onyxcord/events/message/mentions.rb +55 -0
  78. data/lib/onyxcord/events/message/updates.rb +27 -0
  79. data/lib/onyxcord/events/message.rb +4 -397
  80. data/lib/onyxcord/events/poll/add.rb +11 -0
  81. data/lib/onyxcord/events/poll/base.rb +106 -0
  82. data/lib/onyxcord/events/poll/remove.rb +11 -0
  83. data/lib/onyxcord/events/polls.rb +3 -116
  84. data/lib/onyxcord/events/presence/playing.rb +77 -0
  85. data/lib/onyxcord/events/presence/status.rb +60 -0
  86. data/lib/onyxcord/events/presence.rb +2 -129
  87. data/lib/onyxcord/events/raw/base.rb +74 -0
  88. data/lib/onyxcord/events/raw.rb +1 -72
  89. data/lib/onyxcord/events/reactions/base.rb +143 -0
  90. data/lib/onyxcord/events/reactions/clear.rb +99 -0
  91. data/lib/onyxcord/events/reactions.rb +2 -216
  92. data/lib/onyxcord/events/role/create.rb +46 -0
  93. data/lib/onyxcord/events/role/delete.rb +40 -0
  94. data/lib/onyxcord/events/role/update.rb +11 -0
  95. data/lib/onyxcord/events/roles.rb +3 -85
  96. data/lib/onyxcord/events/scheduled_events/events.rb +112 -0
  97. data/lib/onyxcord/events/scheduled_events/users.rb +91 -0
  98. data/lib/onyxcord/events/scheduled_events.rb +2 -169
  99. data/lib/onyxcord/events/thread/base.rb +49 -0
  100. data/lib/onyxcord/events/thread/members.rb +44 -0
  101. data/lib/onyxcord/events/thread/update.rb +18 -0
  102. data/lib/onyxcord/events/threads.rb +3 -98
  103. data/lib/onyxcord/events/typing/base.rb +73 -0
  104. data/lib/onyxcord/events/typing.rb +1 -71
  105. data/lib/onyxcord/events/voice/server_update.rb +48 -0
  106. data/lib/onyxcord/events/voice/state_update.rb +137 -0
  107. data/lib/onyxcord/events/voice_server_update.rb +2 -46
  108. data/lib/onyxcord/events/voice_state_update.rb +2 -135
  109. data/lib/onyxcord/events/webhook/update.rb +65 -0
  110. data/lib/onyxcord/events/webhooks.rb +1 -63
  111. data/lib/onyxcord/gateway/client.rb +460 -0
  112. data/lib/onyxcord/interactions/command.rb +120 -0
  113. data/lib/onyxcord/interactions/context.rb +109 -0
  114. data/lib/onyxcord/interactions/internal/application_command.rb +203 -0
  115. data/lib/onyxcord/interactions/internal/message.rb +152 -0
  116. data/lib/onyxcord/interactions/internal/metadata.rb +109 -0
  117. data/lib/onyxcord/interactions/internal/option_builder.rb +230 -0
  118. data/lib/onyxcord/interactions/internal/permission_builder.rb +90 -0
  119. data/lib/onyxcord/interactions/option.rb +88 -0
  120. data/lib/onyxcord/interactions/registry.rb +50 -0
  121. data/lib/onyxcord/interactions.rb +16 -0
  122. data/lib/onyxcord/internal/async_runtime.rb +32 -0
  123. data/lib/onyxcord/internal/event_bus.rb +591 -0
  124. data/lib/onyxcord/internal/event_executor.rb +155 -0
  125. data/lib/onyxcord/internal/gateway/opcodes.rb +22 -0
  126. data/lib/onyxcord/internal/gateway/session.rb +45 -0
  127. data/lib/onyxcord/internal/http.rb +189 -0
  128. data/lib/onyxcord/internal/json.rb +51 -0
  129. data/lib/onyxcord/internal/message_payload.rb +78 -0
  130. data/lib/onyxcord/internal/rate_limiter/async_rest.rb +151 -0
  131. data/lib/onyxcord/internal/rate_limiter/gateway.rb +44 -0
  132. data/lib/onyxcord/internal/rate_limiter/rest.rb +144 -0
  133. data/lib/onyxcord/internal/upload.rb +39 -0
  134. data/lib/onyxcord/internal/websocket.rb +79 -0
  135. data/lib/onyxcord/light/data.rb +1 -1
  136. data/lib/onyxcord/light/integrations.rb +1 -1
  137. data/lib/onyxcord/light/light_bot.rb +7 -7
  138. data/lib/onyxcord/{data → models}/activity.rb +2 -2
  139. data/lib/onyxcord/{data → models}/application.rb +3 -3
  140. data/lib/onyxcord/{data → models}/avatar_decoration.rb +1 -1
  141. data/lib/onyxcord/{data → models}/channel.rb +23 -23
  142. data/lib/onyxcord/{data → models}/collectibles.rb +1 -1
  143. data/lib/onyxcord/{data → models}/emoji.rb +1 -1
  144. data/lib/onyxcord/models/interaction.rb +450 -0
  145. data/lib/onyxcord/{data → models}/invite.rb +1 -1
  146. data/lib/onyxcord/{data → models}/member.rb +11 -11
  147. data/lib/onyxcord/{data → models}/message.rb +22 -14
  148. data/lib/onyxcord/{data → models}/poll.rb +2 -2
  149. data/lib/onyxcord/{data → models}/primary_server.rb +1 -1
  150. data/lib/onyxcord/{data → models}/profile.rb +4 -4
  151. data/lib/onyxcord/{data → models}/role.rb +6 -12
  152. data/lib/onyxcord/{data → models}/scheduled_event.rb +5 -5
  153. data/lib/onyxcord/{data → models}/server.rb +41 -41
  154. data/lib/onyxcord/{data → models}/server_preview.rb +2 -2
  155. data/lib/onyxcord/{data → models}/team.rb +1 -1
  156. data/lib/onyxcord/{data → models}/user.rb +5 -5
  157. data/lib/onyxcord/{data → models}/webhook.rb +13 -11
  158. data/lib/onyxcord/models.rb +57 -0
  159. data/lib/onyxcord/{api.rb → rest/client.rb} +83 -27
  160. data/lib/onyxcord/{api → rest/routes}/application.rb +79 -57
  161. data/lib/onyxcord/rest/routes/channel/base.rb +73 -0
  162. data/lib/onyxcord/rest/routes/channel/groups.rb +78 -0
  163. data/lib/onyxcord/rest/routes/channel/messages.rb +130 -0
  164. data/lib/onyxcord/rest/routes/channel/permissions.rb +73 -0
  165. data/lib/onyxcord/rest/routes/channel/pins.rb +45 -0
  166. data/lib/onyxcord/rest/routes/channel/polls.rb +32 -0
  167. data/lib/onyxcord/rest/routes/channel/reactions.rb +86 -0
  168. data/lib/onyxcord/rest/routes/channel/threads.rb +176 -0
  169. data/lib/onyxcord/rest/routes/channel/webhooks.rb +47 -0
  170. data/lib/onyxcord/rest/routes/channel.rb +12 -0
  171. data/lib/onyxcord/{api/interaction.rb → rest/routes/interaction/base.rb} +10 -33
  172. data/lib/onyxcord/rest/routes/interaction/response.rb +24 -0
  173. data/lib/onyxcord/rest/routes/interaction.rb +4 -0
  174. data/lib/onyxcord/{api → rest/routes}/invite.rb +7 -7
  175. data/lib/onyxcord/rest/routes/server/admin.rb +174 -0
  176. data/lib/onyxcord/rest/routes/server/assets.rb +25 -0
  177. data/lib/onyxcord/rest/routes/server/bans.rb +67 -0
  178. data/lib/onyxcord/rest/routes/server/base.rb +77 -0
  179. data/lib/onyxcord/rest/routes/server/channels.rb +58 -0
  180. data/lib/onyxcord/rest/routes/server/emoji.rb +48 -0
  181. data/lib/onyxcord/rest/routes/server/members.rb +109 -0
  182. data/lib/onyxcord/rest/routes/server/messages.rb +19 -0
  183. data/lib/onyxcord/rest/routes/server/roles.rb +156 -0
  184. data/lib/onyxcord/rest/routes/server/scheduled_events.rb +86 -0
  185. data/lib/onyxcord/rest/routes/server.rb +12 -0
  186. data/lib/onyxcord/{api → rest/routes}/user.rb +23 -23
  187. data/lib/onyxcord/{api → rest/routes}/webhook.rb +30 -32
  188. data/lib/onyxcord/{allowed_mentions.rb → utils/allowed_mentions.rb} +9 -1
  189. data/lib/onyxcord/utils/timestamp.rb +69 -0
  190. data/lib/onyxcord/voice/{voice_bot.rb → client.rb} +4 -4
  191. data/lib/onyxcord/voice/encoder.rb +1 -1
  192. data/lib/onyxcord/voice/network/udp.rb +135 -0
  193. data/lib/onyxcord/voice/network/websocket.rb +225 -0
  194. data/lib/onyxcord/voice/network.rb +5 -357
  195. data/lib/onyxcord/webhooks/builder.rb +1 -1
  196. data/lib/onyxcord/webhooks/client.rb +13 -13
  197. data/lib/onyxcord/webhooks/modal/group_builder.rb +55 -0
  198. data/lib/onyxcord/webhooks/modal/label_builder.rb +183 -0
  199. data/lib/onyxcord/webhooks/modal.rb +2 -239
  200. data/lib/onyxcord/webhooks/version.rb +3 -3
  201. data/lib/onyxcord/webhooks/view/container_builder.rb +80 -0
  202. data/lib/onyxcord/webhooks/view/file_builder.rb +24 -0
  203. data/lib/onyxcord/webhooks/view/media_gallery_builder.rb +50 -0
  204. data/lib/onyxcord/webhooks/view/row_builder.rb +120 -0
  205. data/lib/onyxcord/webhooks/view/section_builder.rb +61 -0
  206. data/lib/onyxcord/webhooks/view/select_menu_builder.rb +77 -0
  207. data/lib/onyxcord/webhooks/view/separator_builder.rb +22 -0
  208. data/lib/onyxcord/webhooks/view/text_display_builder.rb +20 -0
  209. data/lib/onyxcord/webhooks/view.rb +9 -425
  210. data/lib/onyxcord.rb +106 -40
  211. metadata +208 -91
  212. data/.github/CONTRIBUTING.md +0 -13
  213. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  214. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -24
  215. data/.github/pull_request_template.md +0 -37
  216. data/.github/workflows/ci.yml +0 -78
  217. data/.github/workflows/codeql.yml +0 -65
  218. data/.github/workflows/deploy.yml +0 -54
  219. data/.github/workflows/release.yml +0 -51
  220. data/.gitignore +0 -17
  221. data/.markdownlint.json +0 -4
  222. data/.overcommit.yml +0 -7
  223. data/.rspec +0 -2
  224. data/.rubocop.yml +0 -129
  225. data/.yardopts +0 -1
  226. data/CHANGELOG.md +0 -202
  227. data/Gemfile +0 -6
  228. data/LICENSE.txt +0 -21
  229. data/README.md +0 -448
  230. data/Rakefile +0 -13
  231. data/lib/onyxcord/api/channel.rb +0 -705
  232. data/lib/onyxcord/api/server.rb +0 -775
  233. data/lib/onyxcord/async/runtime.rb +0 -30
  234. data/lib/onyxcord/commands/command_bot.rb +0 -505
  235. data/lib/onyxcord/data/interaction.rb +0 -1143
  236. data/lib/onyxcord/data.rb +0 -57
  237. data/lib/onyxcord/event_executor.rb +0 -153
  238. data/lib/onyxcord/gateway.rb +0 -500
  239. data/lib/onyxcord/http.rb +0 -115
  240. data/lib/onyxcord/json.rb +0 -49
  241. data/lib/onyxcord/rate_limiter/async_rest.rb +0 -149
  242. data/lib/onyxcord/rate_limiter/gateway.rb +0 -42
  243. data/lib/onyxcord/rate_limiter/rest.rb +0 -142
  244. data/lib/onyxcord/version.rb +0 -7
  245. data/lib/onyxcord/websocket.rb +0 -77
  246. data/onyxcord.gemspec +0 -63
  247. /data/lib/onyxcord/{configuration.rb → core/configuration.rb} +0 -0
  248. /data/lib/onyxcord/{data → models}/attachment.rb +0 -0
  249. /data/lib/onyxcord/{data → models}/audit_logs.rb +0 -0
  250. /data/lib/onyxcord/{data → models}/call.rb +0 -0
  251. /data/lib/onyxcord/{data → models}/channel_tag.rb +0 -0
  252. /data/lib/onyxcord/{data → models}/component.rb +0 -0
  253. /data/lib/onyxcord/{data → models}/embed.rb +0 -0
  254. /data/lib/onyxcord/{data → models}/install_params.rb +0 -0
  255. /data/lib/onyxcord/{data → models}/integration.rb +0 -0
  256. /data/lib/onyxcord/{data → models}/message_activity.rb +0 -0
  257. /data/lib/onyxcord/{data → models}/overwrite.rb +0 -0
  258. /data/lib/onyxcord/{data → models}/reaction.rb +0 -0
  259. /data/lib/onyxcord/{data → models}/recipient.rb +0 -0
  260. /data/lib/onyxcord/{data → models}/role_connection_data.rb +0 -0
  261. /data/lib/onyxcord/{data → models}/role_subscription.rb +0 -0
  262. /data/lib/onyxcord/{data → models}/snapshot.rb +0 -0
  263. /data/lib/onyxcord/{data → models}/timestamp.rb +0 -0
  264. /data/lib/onyxcord/{data → models}/voice_region.rb +0 -0
  265. /data/lib/onyxcord/{data → models}/voice_state.rb +0 -0
  266. /data/lib/onyxcord/{colour_rgb.rb → utils/colour_rgb.rb} +0 -0
  267. /data/lib/onyxcord/{id_object.rb → utils/id_object.rb} +0 -0
  268. /data/lib/onyxcord/{message_components.rb → utils/message_components.rb} +0 -0
  269. /data/lib/onyxcord/{paginator.rb → utils/paginator.rb} +0 -0
  270. /data/lib/onyxcord/{permissions.rb → utils/permissions.rb} +0 -0
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnyxCord::REST::Channel
4
+ module_function
5
+
6
+ # Build attachment metadata payload for multipart uploads.
7
+ # Returns an array of { id:, filename: } hashes.
8
+ def attachment_payload(attachments)
9
+ OnyxCord::MessagePayload.attachment_payload(attachments)
10
+ end
11
+
12
+ # Build multipart body with named file fields and JSON payload.
13
+ def multipart_body(body, attachments)
14
+ OnyxCord::MessagePayload.multipart_body(body, attachments)
15
+ end
16
+
17
+ # Get a channel's data
18
+ # https://discord.com/developers/docs/resources/channel#get-channel
19
+ def resolve(token, channel_id)
20
+ OnyxCord::REST.request(
21
+ :channels_cid,
22
+ channel_id,
23
+ :get,
24
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}",
25
+ Authorization: token
26
+ )
27
+ end
28
+
29
+ # Update a channel's data
30
+ # https://discord.com/developers/docs/resources/channel#modify-channel
31
+ def update(token, channel_id, name, topic, position, bitrate, user_limit, nsfw, permission_overwrites = nil, parent_id = nil, rate_limit_per_user = nil, reason = nil, archived = nil, auto_archive_duration = nil, locked = nil, invitable = nil, flags = nil, applied_tags = nil)
32
+ data = { name: name, position: position, topic: topic, bitrate: bitrate, user_limit: user_limit, nsfw: nsfw, parent_id: parent_id, rate_limit_per_user: rate_limit_per_user, archived: archived, auto_archive_duration: auto_archive_duration, locked: locked, invitable: invitable, flags: flags, applied_tags: applied_tags }
33
+ data[:permission_overwrites] = permission_overwrites unless permission_overwrites.nil?
34
+ OnyxCord::REST.request(
35
+ :channels_cid,
36
+ channel_id,
37
+ :patch,
38
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}",
39
+ data.to_json,
40
+ Authorization: token,
41
+ content_type: :json,
42
+ 'X-Audit-Log-Reason': reason
43
+ )
44
+ end
45
+
46
+ # Modify the properties of a channel.
47
+ # https://discord.com/developers/docs/resources/channel#modify-channel
48
+ def update!(token, channel_id, name: :undef, type: :undef, position: :undef, topic: :undef, nsfw: :undef, rate_limit_per_user: :undef, bitrate: :undef, user_limit: :undef, permission_overwrites: :undef, parent_id: :undef, rtc_region: :undef, video_quality_mode: :undef, default_auto_archive_duration: :undef, flags: :undef, available_tags: :undef, default_reaction_emoji: :undef, default_thread_rate_limit_per_user: :undef, default_sort_order: :undef, default_forum_layout: :undef, archived: :undef, auto_archive_duration: :undef, locked: :undef, invitable: :undef, applied_tags: :undef, reason: nil)
49
+ OnyxCord::REST.request(
50
+ :channels_cid,
51
+ channel_id,
52
+ :patch,
53
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}",
54
+ { name:, type:, position:, topic:, nsfw:, rate_limit_per_user:, bitrate:, user_limit:, permission_overwrites:, parent_id:, rtc_region:, video_quality_mode:, default_auto_archive_duration:, flags:, available_tags:, default_reaction_emoji:, default_thread_rate_limit_per_user:, default_sort_order:, default_forum_layout:, archived:, auto_archive_duration:, locked:, invitable:, applied_tags: }.reject { |_, value| value == :undef }.to_json,
55
+ Authorization: token,
56
+ content_type: :json,
57
+ 'X-Audit-Log-Reason': reason
58
+ )
59
+ end
60
+
61
+ # Delete a channel
62
+ # https://discord.com/developers/docs/resources/channel#deleteclose-channel
63
+ def delete(token, channel_id, reason = nil)
64
+ OnyxCord::REST.request(
65
+ :channels_cid,
66
+ channel_id,
67
+ :delete,
68
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}",
69
+ Authorization: token,
70
+ 'X-Audit-Log-Reason': reason
71
+ )
72
+ end
73
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnyxCord::REST::Channel
4
+ module_function
5
+
6
+ # Create an empty group channel.
7
+ # @deprecated Discord no longer supports bots in group DMs, this endpoint was repurposed and no longer works as implemented here.
8
+ # https://discord.com/developers/docs/resources/user#create-group-dm
9
+ def create_empty_group(token, bot_user_id)
10
+ OnyxCord::REST.request(
11
+ :users_uid_channels,
12
+ nil,
13
+ :post,
14
+ "#{OnyxCord::REST.api_base}/users/#{bot_user_id}/channels",
15
+ {}.to_json,
16
+ Authorization: token,
17
+ content_type: :json
18
+ )
19
+ end
20
+
21
+ # Create a group channel.
22
+ # @deprecated Discord no longer supports bots in group DMs, this endpoint was repurposed and no longer works as implemented here.
23
+ # https://discord.com/developers/docs/resources/channel#group-dm-add-recipient
24
+ def create_group(token, pm_channel_id, user_id)
25
+ OnyxCord::REST.request(
26
+ :channels_cid_recipients_uid,
27
+ nil,
28
+ :put,
29
+ "#{OnyxCord::REST.api_base}/channels/#{pm_channel_id}/recipients/#{user_id}",
30
+ {}.to_json,
31
+ Authorization: token,
32
+ content_type: :json
33
+ )
34
+ end
35
+
36
+ # Add a user to a group channel.
37
+ # @deprecated Discord no longer supports bots in group DMs, this endpoint was repurposed and no longer works as implemented here.
38
+ # https://discord.com/developers/docs/resources/channel#group-dm-add-recipient
39
+ def add_group_user(token, group_channel_id, user_id)
40
+ OnyxCord::REST.request(
41
+ :channels_cid_recipients_uid,
42
+ nil,
43
+ :put,
44
+ "#{OnyxCord::REST.api_base}/channels/#{group_channel_id}/recipients/#{user_id}",
45
+ {}.to_json,
46
+ Authorization: token,
47
+ content_type: :json
48
+ )
49
+ end
50
+
51
+ # Remove a user from a group channel.
52
+ # @deprecated Discord no longer supports bots in group DMs, this endpoint was repurposed and no longer works as implemented here.
53
+ # https://discord.com/developers/docs/resources/channel#group-dm-remove-recipient
54
+ def remove_group_user(token, group_channel_id, user_id)
55
+ OnyxCord::REST.request(
56
+ :channels_cid_recipients_uid,
57
+ nil,
58
+ :delete,
59
+ "#{OnyxCord::REST.api_base}/channels/#{group_channel_id}/recipients/#{user_id}",
60
+ Authorization: token,
61
+ content_type: :json
62
+ )
63
+ end
64
+
65
+ # Leave a group channel.
66
+ # @deprecated Discord no longer supports bots in group DMs, this endpoint was repurposed and no longer works as implemented here.
67
+ # https://discord.com/developers/docs/resources/channel#deleteclose-channel
68
+ def leave_group(token, group_channel_id)
69
+ OnyxCord::REST.request(
70
+ :channels_cid,
71
+ nil,
72
+ :delete,
73
+ "#{OnyxCord::REST.api_base}/channels/#{group_channel_id}",
74
+ Authorization: token,
75
+ content_type: :json
76
+ )
77
+ end
78
+ end
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnyxCord::REST::Channel
4
+ module_function
5
+
6
+ # Get a list of messages from a channel's history
7
+ # https://discord.com/developers/docs/resources/channel#get-channel-messages
8
+ def messages(token, channel_id, amount, before = nil, after = nil, around = nil)
9
+ query_string = URI.encode_www_form({ limit: amount, before: before, after: after, around: around }.compact)
10
+ OnyxCord::REST.request(
11
+ :channels_cid_messages,
12
+ channel_id,
13
+ :get,
14
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages?#{query_string}",
15
+ Authorization: token
16
+ )
17
+ end
18
+
19
+ # Get a single message from a channel's history by id
20
+ # https://discord.com/developers/docs/resources/channel#get-channel-message
21
+ def message(token, channel_id, message_id)
22
+ OnyxCord::REST.request(
23
+ :channels_cid_messages_mid,
24
+ channel_id,
25
+ :get,
26
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages/#{message_id}",
27
+ Authorization: token
28
+ )
29
+ end
30
+
31
+ # Send a message to a channel
32
+ # https://discord.com/developers/docs/resources/channel#create-message
33
+ # @param attachments [Array<File>, nil] Attachments to use with `attachment://` in embeds. See
34
+ # https://discord.com/developers/docs/resources/channel#create-message-using-attachments-within-embeds
35
+ def create_message(token, channel_id, message, tts = false, embeds = nil, nonce = nil, attachments = nil, allowed_mentions = nil, message_reference = nil, components = nil, flags = nil, enforce_nonce = false, poll = nil)
36
+ tts = false unless [true, false].include?(tts)
37
+ components = OnyxCord::MessageComponents.payload(components) unless components.nil?
38
+ flags = OnyxCord::MessageComponents.apply_v2_flag(flags, components)
39
+ OnyxCord::MessagePayload.validate!(content: message, embeds: embeds, components: components, flags: flags, attachments: attachments, poll: poll)
40
+ body = { content: message, tts: tts == true, embeds: embeds, nonce: nonce, allowed_mentions: allowed_mentions, message_reference: message_reference, components: components, attachments: attachments ? attachment_payload(attachments) : nil, flags: flags, enforce_nonce: enforce_nonce, poll: poll }.compact
41
+ body = if attachments
42
+ multipart_body(body, attachments)
43
+ else
44
+ body.to_json
45
+ end
46
+
47
+ headers = { Authorization: token }
48
+ headers[:content_type] = :json unless attachments
49
+
50
+ OnyxCord::REST.request(
51
+ :channels_cid_messages_mid,
52
+ channel_id,
53
+ :post,
54
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages",
55
+ body,
56
+ **headers
57
+ )
58
+ end
59
+
60
+ # Send a file as a message to a channel
61
+ # https://discord.com/developers/docs/resources/channel#upload-file
62
+ def upload_file(token, channel_id, file, caption: nil, tts: false)
63
+ OnyxCord::REST.request(
64
+ :channels_cid_messages_mid,
65
+ channel_id,
66
+ :post,
67
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages",
68
+ { file: file, content: caption, tts: tts },
69
+ Authorization: token
70
+ )
71
+ end
72
+
73
+ # Edit a message
74
+ # https://discord.com/developers/docs/resources/channel#edit-message
75
+ def edit_message(token, channel_id, message_id, message, mentions = nil, embeds = nil, components = nil, flags = nil)
76
+ components = OnyxCord::MessageComponents.payload(components) unless components.nil? || components == :undef
77
+ flags = OnyxCord::MessageComponents.apply_v2_flag(flags, components)
78
+ body = OnyxCord::MessagePayload.edit_body(message, embeds)
79
+ body.merge!(allowed_mentions: mentions, components: components, flags: flags)
80
+ OnyxCord::REST.request(
81
+ :channels_cid_messages_mid,
82
+ channel_id,
83
+ :patch,
84
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages/#{message_id}",
85
+ body.reject { |_, v| v == :undef }.to_json,
86
+ Authorization: token,
87
+ content_type: :json
88
+ )
89
+ end
90
+
91
+ # Delete a message
92
+ # https://discord.com/developers/docs/resources/channel#delete-message
93
+ def delete_message(token, channel_id, message_id, reason = nil)
94
+ OnyxCord::REST.request(
95
+ :channels_cid_messages_mid,
96
+ channel_id,
97
+ :delete,
98
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages/#{message_id}",
99
+ Authorization: token,
100
+ 'X-Audit-Log-Reason': reason
101
+ )
102
+ end
103
+
104
+ # Crosspost a message
105
+ # https://discord.com/developers/docs/resources/message#crosspost-message
106
+ def crosspost_message(token, channel_id, message_id)
107
+ OnyxCord::REST.request(
108
+ :channels_cid_messages_mid,
109
+ channel_id,
110
+ :post,
111
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages/#{message_id}/crosspost",
112
+ Authorization: token
113
+ )
114
+ end
115
+
116
+ # Delete messages in bulk
117
+ # https://discord.com/developers/docs/resources/channel#bulk-delete-messages
118
+ def bulk_delete_messages(token, channel_id, messages = [], reason = nil)
119
+ OnyxCord::REST.request(
120
+ :channels_cid_messages_bulk_delete,
121
+ channel_id,
122
+ :post,
123
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages/bulk-delete",
124
+ { messages: messages }.to_json,
125
+ Authorization: token,
126
+ content_type: :json,
127
+ 'X-Audit-Log-Reason': reason
128
+ )
129
+ end
130
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnyxCord::REST::Channel
4
+ module_function
5
+
6
+ # Update a channels permission for a role or member
7
+ # https://discord.com/developers/docs/resources/channel#edit-channel-permissions
8
+ def update_permission(token, channel_id, overwrite_id, allow, deny, type, reason = nil)
9
+ OnyxCord::REST.request(
10
+ :channels_cid_permissions_oid,
11
+ channel_id,
12
+ :put,
13
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/permissions/#{overwrite_id}",
14
+ { type: type, id: overwrite_id, allow: allow, deny: deny }.to_json,
15
+ Authorization: token,
16
+ content_type: :json,
17
+ 'X-Audit-Log-Reason': reason
18
+ )
19
+ end
20
+
21
+ # Get a channel's invite list
22
+ # https://discord.com/developers/docs/resources/channel#get-channel-invites
23
+ def invites(token, channel_id)
24
+ OnyxCord::REST.request(
25
+ :channels_cid_invites,
26
+ channel_id,
27
+ :get,
28
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/invites",
29
+ Authorization: token
30
+ )
31
+ end
32
+
33
+ # Create an instant invite from a server or a channel id
34
+ # https://discord.com/developers/docs/resources/channel#create-channel-invite
35
+ def create_invite(token, channel_id, max_age = 0, max_uses = 0, temporary = false, unique = false, reason = nil)
36
+ OnyxCord::REST.request(
37
+ :channels_cid_invites,
38
+ channel_id,
39
+ :post,
40
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/invites",
41
+ { max_age: max_age, max_uses: max_uses, temporary: temporary, unique: unique }.to_json,
42
+ Authorization: token,
43
+ content_type: :json,
44
+ 'X-Audit-Log-Reason': reason
45
+ )
46
+ end
47
+
48
+ # Delete channel permission
49
+ # https://discord.com/developers/docs/resources/channel#delete-channel-permission
50
+ def delete_permission(token, channel_id, overwrite_id, reason = nil)
51
+ OnyxCord::REST.request(
52
+ :channels_cid_permissions_oid,
53
+ channel_id,
54
+ :delete,
55
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/permissions/#{overwrite_id}",
56
+ Authorization: token,
57
+ 'X-Audit-Log-Reason': reason
58
+ )
59
+ end
60
+
61
+ # Start typing (needs to be resent every 5 seconds to keep up the typing)
62
+ # https://discord.com/developers/docs/resources/channel#trigger-typing-indicator
63
+ def start_typing(token, channel_id)
64
+ OnyxCord::REST.request(
65
+ :channels_cid_typing,
66
+ channel_id,
67
+ :post,
68
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/typing",
69
+ nil,
70
+ Authorization: token
71
+ )
72
+ end
73
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnyxCord::REST::Channel
4
+ module_function
5
+
6
+ # Get a list of pinned messages in a channel
7
+ # https://discord.com/developers/docs/resources/message#get-channel-pins
8
+ def pinned_messages(token, channel_id, limit = 50, before = nil)
9
+ query = URI.encode_www_form({ limit: limit, before: before }.compact)
10
+ OnyxCord::REST.request(
11
+ :channels_cid_pins,
12
+ channel_id,
13
+ :get,
14
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages/pins?#{query}",
15
+ Authorization: token
16
+ )
17
+ end
18
+
19
+ # Pin a message
20
+ # https://discord.com/developers/docs/resources/message#pin-message
21
+ def pin_message(token, channel_id, message_id, reason = nil)
22
+ OnyxCord::REST.request(
23
+ :channels_cid_pins_mid,
24
+ channel_id,
25
+ :put,
26
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages/pins/#{message_id}",
27
+ nil,
28
+ Authorization: token,
29
+ 'X-Audit-Log-Reason': reason
30
+ )
31
+ end
32
+
33
+ # Unpin a message
34
+ # https://discord.com/developers/docs/resources/message#unpin-message
35
+ def unpin_message(token, channel_id, message_id, reason = nil)
36
+ OnyxCord::REST.request(
37
+ :channels_cid_pins_mid,
38
+ channel_id,
39
+ :delete,
40
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages/pins/#{message_id}",
41
+ Authorization: token,
42
+ 'X-Audit-Log-Reason': reason
43
+ )
44
+ end
45
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnyxCord::REST::Channel
4
+ module_function
5
+
6
+ # Get a list of users that have voted for a poll answer.
7
+ # https://discord.com/developers/docs/resources/poll#get-answer-voters
8
+ def get_poll_voters(token, channel_id, message_id, answer_id, limit: 100, after: nil)
9
+ query = URI.encode_www_form({ limit:, after: }.compact)
10
+
11
+ OnyxCord::REST.request(
12
+ :channels_cid_polls_mid_answers_aid,
13
+ channel_id,
14
+ :get,
15
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/polls/#{message_id}/answers/#{answer_id}?#{query}",
16
+ Authorization: token
17
+ )
18
+ end
19
+
20
+ # End a poll created by the current user.
21
+ # https://discord.com/developers/docs/resources/poll#end-poll
22
+ def end_poll(token, channel_id, message_id)
23
+ OnyxCord::REST.request(
24
+ :channels_cid_polls_mid_expire,
25
+ channel_id,
26
+ :post,
27
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/polls/#{message_id}/expire",
28
+ nil,
29
+ Authorization: token
30
+ )
31
+ end
32
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnyxCord::REST::Channel
4
+ module_function
5
+
6
+ # Create a reaction on a message using this client
7
+ # https://discord.com/developers/docs/resources/channel#create-reaction
8
+ def create_reaction(token, channel_id, message_id, emoji)
9
+ emoji = URI.encode_www_form_component(emoji) unless emoji.ascii_only?
10
+ OnyxCord::REST.request(
11
+ :channels_cid_messages_mid_reactions_emoji_me,
12
+ channel_id,
13
+ :put,
14
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages/#{message_id}/reactions/#{emoji}/@me",
15
+ nil,
16
+ Authorization: token,
17
+ content_type: :json
18
+ )
19
+ end
20
+
21
+ # Delete this client's own reaction on a message
22
+ # https://discord.com/developers/docs/resources/channel#delete-own-reaction
23
+ def delete_own_reaction(token, channel_id, message_id, emoji)
24
+ emoji = URI.encode_www_form_component(emoji) unless emoji.ascii_only?
25
+ OnyxCord::REST.request(
26
+ :channels_cid_messages_mid_reactions_emoji_me,
27
+ channel_id,
28
+ :delete,
29
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages/#{message_id}/reactions/#{emoji}/@me",
30
+ Authorization: token
31
+ )
32
+ end
33
+
34
+ # Delete another client's reaction on a message
35
+ # https://discord.com/developers/docs/resources/channel#delete-user-reaction
36
+ def delete_user_reaction(token, channel_id, message_id, emoji, user_id)
37
+ emoji = URI.encode_www_form_component(emoji) unless emoji.ascii_only?
38
+ OnyxCord::REST.request(
39
+ :channels_cid_messages_mid_reactions_emoji_uid,
40
+ channel_id,
41
+ :delete,
42
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages/#{message_id}/reactions/#{emoji}/#{user_id}",
43
+ Authorization: token
44
+ )
45
+ end
46
+
47
+ # Get a list of clients who reacted with a specific reaction on a message
48
+ # https://discord.com/developers/docs/resources/channel#get-reactions
49
+ def get_reactions(token, channel_id, message_id, emoji, before_id, after_id, limit = 100, type = 0)
50
+ emoji = URI.encode_www_form_component(emoji) unless emoji.ascii_only?
51
+ query_string = URI.encode_www_form({ limit: limit || 100, before: before_id, after: after_id, type: type }.compact)
52
+ OnyxCord::REST.request(
53
+ :channels_cid_messages_mid_reactions_emoji,
54
+ channel_id,
55
+ :get,
56
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages/#{message_id}/reactions/#{emoji}?#{query_string}",
57
+ Authorization: token
58
+ )
59
+ end
60
+
61
+ # Deletes all reactions on a message from all clients
62
+ # https://discord.com/developers/docs/resources/channel#delete-all-reactions
63
+ def delete_all_reactions(token, channel_id, message_id)
64
+ OnyxCord::REST.request(
65
+ :channels_cid_messages_mid_reactions,
66
+ channel_id,
67
+ :delete,
68
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages/#{message_id}/reactions",
69
+ Authorization: token
70
+ )
71
+ end
72
+
73
+ # Deletes all the reactions for a given emoji on a message
74
+ # https://discord.com/developers/docs/resources/channel#delete-all-reactions-for-emoji
75
+ def delete_all_emoji_reactions(token, channel_id, message_id, emoji)
76
+ emoji = URI.encode_www_form_component(emoji) unless emoji.ascii_only?
77
+
78
+ OnyxCord::REST.request(
79
+ :channels_cid_messages_mid_reactions_emoji,
80
+ channel_id,
81
+ :delete,
82
+ "#{OnyxCord::REST.api_base}/channels/#{channel_id}/messages/#{message_id}/reactions/#{emoji}",
83
+ Authorization: token
84
+ )
85
+ end
86
+ end