onyxcord 2.1.0 → 3.2.1

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/{logger.rb → core/logger.rb} +5 -0
  27. data/lib/onyxcord/core/version.rb +5 -0
  28. data/lib/onyxcord/events/await/base.rb +48 -0
  29. data/lib/onyxcord/events/await.rb +1 -46
  30. data/lib/onyxcord/events/ban/base.rb +54 -0
  31. data/lib/onyxcord/events/ban/remove.rb +11 -0
  32. data/lib/onyxcord/events/bans.rb +2 -58
  33. data/lib/onyxcord/events/channels/base.rb +91 -0
  34. data/lib/onyxcord/events/channels/delete.rb +73 -0
  35. data/lib/onyxcord/events/channels/pins.rb +44 -0
  36. data/lib/onyxcord/events/channels/recipients.rb +77 -0
  37. data/lib/onyxcord/events/channels.rb +4 -239
  38. data/lib/onyxcord/events/guilds/audit_logs.rb +79 -0
  39. data/lib/onyxcord/events/guilds/base.rb +97 -0
  40. data/lib/onyxcord/events/guilds/emoji.rb +147 -0
  41. data/lib/onyxcord/events/guilds.rb +3 -267
  42. data/lib/onyxcord/events/handlers/channels.rb +133 -0
  43. data/lib/onyxcord/events/handlers/core.rb +146 -0
  44. data/lib/onyxcord/events/handlers/guilds.rb +375 -0
  45. data/lib/onyxcord/events/handlers/interactions.rb +238 -0
  46. data/lib/onyxcord/events/handlers/lifetime.rb +71 -0
  47. data/lib/onyxcord/events/handlers/messages.rb +218 -0
  48. data/lib/onyxcord/events/handlers/presence.rb +56 -0
  49. data/lib/onyxcord/events/handlers/raw.rb +39 -0
  50. data/lib/onyxcord/events/handlers/reactions.rb +98 -0
  51. data/lib/onyxcord/events/handlers/scheduled_events.rb +243 -0
  52. data/lib/onyxcord/events/handlers/voice.rb +46 -0
  53. data/lib/onyxcord/events/integration/base.rb +45 -0
  54. data/lib/onyxcord/events/integration/create.rb +11 -0
  55. data/lib/onyxcord/events/integration/delete.rb +48 -0
  56. data/lib/onyxcord/events/integration/update.rb +11 -0
  57. data/lib/onyxcord/events/integrations.rb +4 -98
  58. data/lib/onyxcord/events/interactions/application_commands.rb +185 -0
  59. data/lib/onyxcord/events/interactions/autocomplete.rb +62 -0
  60. data/lib/onyxcord/events/interactions/base.rb +175 -0
  61. data/lib/onyxcord/events/interactions/components.rb +221 -0
  62. data/lib/onyxcord/events/interactions/permissions.rb +53 -0
  63. data/lib/onyxcord/events/interactions.rb +5 -622
  64. data/lib/onyxcord/events/invite/create.rb +79 -0
  65. data/lib/onyxcord/events/invite/delete.rb +55 -0
  66. data/lib/onyxcord/events/invites.rb +2 -125
  67. data/lib/onyxcord/events/lifetime/base.rb +31 -0
  68. data/lib/onyxcord/events/lifetime.rb +1 -29
  69. data/lib/onyxcord/events/member/add.rb +12 -0
  70. data/lib/onyxcord/events/member/base.rb +67 -0
  71. data/lib/onyxcord/events/member/delete.rb +21 -0
  72. data/lib/onyxcord/events/member/update.rb +25 -0
  73. data/lib/onyxcord/events/members.rb +4 -108
  74. data/lib/onyxcord/events/message/base.rb +295 -0
  75. data/lib/onyxcord/events/message/ids.rb +71 -0
  76. data/lib/onyxcord/events/message/mentions.rb +55 -0
  77. data/lib/onyxcord/events/message/updates.rb +27 -0
  78. data/lib/onyxcord/events/message.rb +4 -397
  79. data/lib/onyxcord/events/poll/add.rb +11 -0
  80. data/lib/onyxcord/events/poll/base.rb +106 -0
  81. data/lib/onyxcord/events/poll/remove.rb +11 -0
  82. data/lib/onyxcord/events/polls.rb +3 -116
  83. data/lib/onyxcord/events/presence/playing.rb +77 -0
  84. data/lib/onyxcord/events/presence/status.rb +60 -0
  85. data/lib/onyxcord/events/presence.rb +2 -129
  86. data/lib/onyxcord/events/raw/base.rb +74 -0
  87. data/lib/onyxcord/events/raw.rb +1 -72
  88. data/lib/onyxcord/events/reactions/base.rb +143 -0
  89. data/lib/onyxcord/events/reactions/clear.rb +99 -0
  90. data/lib/onyxcord/events/reactions.rb +2 -216
  91. data/lib/onyxcord/events/role/create.rb +46 -0
  92. data/lib/onyxcord/events/role/delete.rb +40 -0
  93. data/lib/onyxcord/events/role/update.rb +11 -0
  94. data/lib/onyxcord/events/roles.rb +3 -85
  95. data/lib/onyxcord/events/scheduled_events/events.rb +112 -0
  96. data/lib/onyxcord/events/scheduled_events/users.rb +91 -0
  97. data/lib/onyxcord/events/scheduled_events.rb +2 -169
  98. data/lib/onyxcord/events/thread/base.rb +49 -0
  99. data/lib/onyxcord/events/thread/members.rb +44 -0
  100. data/lib/onyxcord/events/thread/update.rb +18 -0
  101. data/lib/onyxcord/events/threads.rb +3 -98
  102. data/lib/onyxcord/events/typing/base.rb +73 -0
  103. data/lib/onyxcord/events/typing.rb +1 -71
  104. data/lib/onyxcord/events/voice/server_update.rb +48 -0
  105. data/lib/onyxcord/events/voice/state_update.rb +137 -0
  106. data/lib/onyxcord/events/voice_server_update.rb +2 -46
  107. data/lib/onyxcord/events/voice_state_update.rb +2 -135
  108. data/lib/onyxcord/events/webhook/update.rb +65 -0
  109. data/lib/onyxcord/events/webhooks.rb +1 -63
  110. data/lib/onyxcord/gateway/client.rb +460 -0
  111. data/lib/onyxcord/interactions/command.rb +120 -0
  112. data/lib/onyxcord/interactions/context.rb +109 -0
  113. data/lib/onyxcord/interactions/internal/application_command.rb +203 -0
  114. data/lib/onyxcord/interactions/internal/message.rb +152 -0
  115. data/lib/onyxcord/interactions/internal/metadata.rb +109 -0
  116. data/lib/onyxcord/interactions/internal/option_builder.rb +230 -0
  117. data/lib/onyxcord/interactions/internal/permission_builder.rb +90 -0
  118. data/lib/onyxcord/interactions/option.rb +88 -0
  119. data/lib/onyxcord/interactions/registry.rb +50 -0
  120. data/lib/onyxcord/interactions.rb +16 -0
  121. data/lib/onyxcord/internal/async_runtime.rb +32 -0
  122. data/lib/onyxcord/internal/event_bus.rb +591 -0
  123. data/lib/onyxcord/internal/event_executor.rb +155 -0
  124. data/lib/onyxcord/internal/gateway/opcodes.rb +22 -0
  125. data/lib/onyxcord/internal/gateway/session.rb +45 -0
  126. data/lib/onyxcord/internal/http.rb +189 -0
  127. data/lib/onyxcord/internal/json.rb +51 -0
  128. data/lib/onyxcord/{message_payload.rb → internal/message_payload.rb} +3 -3
  129. data/lib/onyxcord/internal/rate_limiter/async_rest.rb +151 -0
  130. data/lib/onyxcord/internal/rate_limiter/gateway.rb +44 -0
  131. data/lib/onyxcord/internal/rate_limiter/rest.rb +144 -0
  132. data/lib/onyxcord/internal/websocket.rb +79 -0
  133. data/lib/onyxcord/light/data.rb +1 -1
  134. data/lib/onyxcord/light/integrations.rb +1 -1
  135. data/lib/onyxcord/light/light_bot.rb +7 -7
  136. data/lib/onyxcord/{data → models}/activity.rb +2 -2
  137. data/lib/onyxcord/{data → models}/application.rb +3 -3
  138. data/lib/onyxcord/{data → models}/avatar_decoration.rb +1 -1
  139. data/lib/onyxcord/{data → models}/channel.rb +23 -23
  140. data/lib/onyxcord/{data → models}/collectibles.rb +1 -1
  141. data/lib/onyxcord/{data → models}/emoji.rb +1 -1
  142. data/lib/onyxcord/models/interaction.rb +450 -0
  143. data/lib/onyxcord/{data → models}/invite.rb +1 -1
  144. data/lib/onyxcord/{data → models}/member.rb +11 -11
  145. data/lib/onyxcord/{data → models}/message.rb +18 -14
  146. data/lib/onyxcord/{data → models}/poll.rb +2 -2
  147. data/lib/onyxcord/{data → models}/primary_server.rb +1 -1
  148. data/lib/onyxcord/{data → models}/profile.rb +4 -4
  149. data/lib/onyxcord/{data → models}/role.rb +6 -12
  150. data/lib/onyxcord/{data → models}/scheduled_event.rb +5 -5
  151. data/lib/onyxcord/{data → models}/server.rb +41 -41
  152. data/lib/onyxcord/{data → models}/server_preview.rb +2 -2
  153. data/lib/onyxcord/{data → models}/team.rb +1 -1
  154. data/lib/onyxcord/{data → models}/user.rb +5 -5
  155. data/lib/onyxcord/{data → models}/webhook.rb +10 -10
  156. data/lib/onyxcord/models.rb +57 -0
  157. data/lib/onyxcord/{api.rb → rest/client.rb} +23 -22
  158. data/lib/onyxcord/{api → rest/routes}/application.rb +79 -57
  159. data/lib/onyxcord/rest/routes/channel/base.rb +73 -0
  160. data/lib/onyxcord/rest/routes/channel/groups.rb +78 -0
  161. data/lib/onyxcord/rest/routes/channel/messages.rb +130 -0
  162. data/lib/onyxcord/rest/routes/channel/permissions.rb +73 -0
  163. data/lib/onyxcord/rest/routes/channel/pins.rb +45 -0
  164. data/lib/onyxcord/rest/routes/channel/polls.rb +32 -0
  165. data/lib/onyxcord/rest/routes/channel/reactions.rb +86 -0
  166. data/lib/onyxcord/rest/routes/channel/threads.rb +176 -0
  167. data/lib/onyxcord/rest/routes/channel/webhooks.rb +47 -0
  168. data/lib/onyxcord/rest/routes/channel.rb +12 -0
  169. data/lib/onyxcord/{api/interaction.rb → rest/routes/interaction/base.rb} +7 -25
  170. data/lib/onyxcord/rest/routes/interaction/response.rb +24 -0
  171. data/lib/onyxcord/rest/routes/interaction.rb +4 -0
  172. data/lib/onyxcord/{api → rest/routes}/invite.rb +7 -7
  173. data/lib/onyxcord/rest/routes/server/admin.rb +174 -0
  174. data/lib/onyxcord/rest/routes/server/assets.rb +25 -0
  175. data/lib/onyxcord/rest/routes/server/bans.rb +67 -0
  176. data/lib/onyxcord/rest/routes/server/base.rb +77 -0
  177. data/lib/onyxcord/rest/routes/server/channels.rb +58 -0
  178. data/lib/onyxcord/rest/routes/server/emoji.rb +48 -0
  179. data/lib/onyxcord/rest/routes/server/members.rb +109 -0
  180. data/lib/onyxcord/rest/routes/server/messages.rb +19 -0
  181. data/lib/onyxcord/rest/routes/server/roles.rb +156 -0
  182. data/lib/onyxcord/rest/routes/server/scheduled_events.rb +86 -0
  183. data/lib/onyxcord/rest/routes/server.rb +12 -0
  184. data/lib/onyxcord/{api → rest/routes}/user.rb +23 -23
  185. data/lib/onyxcord/{api → rest/routes}/webhook.rb +22 -22
  186. data/lib/onyxcord/{allowed_mentions.rb → utils/allowed_mentions.rb} +1 -1
  187. data/lib/onyxcord/utils/timestamp.rb +69 -0
  188. data/lib/onyxcord/voice/{voice_bot.rb → client.rb} +4 -4
  189. data/lib/onyxcord/voice/encoder.rb +1 -1
  190. data/lib/onyxcord/voice/network/udp.rb +135 -0
  191. data/lib/onyxcord/voice/network/websocket.rb +225 -0
  192. data/lib/onyxcord/voice/network.rb +5 -357
  193. data/lib/onyxcord/webhooks/builder.rb +1 -1
  194. data/lib/onyxcord/webhooks/client.rb +13 -13
  195. data/lib/onyxcord/webhooks/modal/group_builder.rb +55 -0
  196. data/lib/onyxcord/webhooks/modal/label_builder.rb +183 -0
  197. data/lib/onyxcord/webhooks/modal.rb +2 -239
  198. data/lib/onyxcord/webhooks/version.rb +3 -3
  199. data/lib/onyxcord/webhooks/view/container_builder.rb +80 -0
  200. data/lib/onyxcord/webhooks/view/file_builder.rb +24 -0
  201. data/lib/onyxcord/webhooks/view/media_gallery_builder.rb +50 -0
  202. data/lib/onyxcord/webhooks/view/row_builder.rb +120 -0
  203. data/lib/onyxcord/webhooks/view/section_builder.rb +61 -0
  204. data/lib/onyxcord/webhooks/view/select_menu_builder.rb +77 -0
  205. data/lib/onyxcord/webhooks/view/separator_builder.rb +22 -0
  206. data/lib/onyxcord/webhooks/view/text_display_builder.rb +20 -0
  207. data/lib/onyxcord/webhooks/view.rb +9 -425
  208. data/lib/onyxcord.rb +106 -42
  209. metadata +207 -92
  210. data/.github/CONTRIBUTING.md +0 -13
  211. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  212. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -24
  213. data/.github/pull_request_template.md +0 -37
  214. data/.github/workflows/ci.yml +0 -78
  215. data/.github/workflows/codeql.yml +0 -65
  216. data/.github/workflows/deploy.yml +0 -54
  217. data/.github/workflows/release.yml +0 -51
  218. data/.gitignore +0 -17
  219. data/.markdownlint.json +0 -4
  220. data/.overcommit.yml +0 -7
  221. data/.rspec +0 -2
  222. data/.rubocop.yml +0 -129
  223. data/.yardopts +0 -1
  224. data/CHANGELOG.md +0 -257
  225. data/Gemfile +0 -6
  226. data/LICENSE.txt +0 -21
  227. data/README.md +0 -448
  228. data/Rakefile +0 -13
  229. data/lib/onyxcord/api/channel.rb +0 -703
  230. data/lib/onyxcord/api/server.rb +0 -775
  231. data/lib/onyxcord/async/runtime.rb +0 -30
  232. data/lib/onyxcord/commands/command_bot.rb +0 -505
  233. data/lib/onyxcord/data/interaction.rb +0 -1151
  234. data/lib/onyxcord/data.rb +0 -57
  235. data/lib/onyxcord/event_executor.rb +0 -153
  236. data/lib/onyxcord/gateway.rb +0 -505
  237. data/lib/onyxcord/http.rb +0 -186
  238. data/lib/onyxcord/json.rb +0 -49
  239. data/lib/onyxcord/rate_limiter/async_rest.rb +0 -150
  240. data/lib/onyxcord/rate_limiter/gateway.rb +0 -42
  241. data/lib/onyxcord/rate_limiter/rest.rb +0 -142
  242. data/lib/onyxcord/version.rb +0 -7
  243. data/lib/onyxcord/websocket.rb +0 -77
  244. data/onyxcord.gemspec +0 -63
  245. /data/lib/onyxcord/{configuration.rb → core/configuration.rb} +0 -0
  246. /data/lib/onyxcord/{errors.rb → core/errors.rb} +0 -0
  247. /data/lib/onyxcord/{upload.rb → internal/upload.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,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ class OnyxCord::Webhooks::View
4
+ class RowBuilder
5
+ # @!visibility private
6
+ def initialize(id: nil)
7
+ @id = id
8
+ @components = []
9
+
10
+ yield self if block_given?
11
+ end
12
+
13
+ # Add a button to this action row.
14
+ # @param style [Symbol, Integer] The button's style type. See {BUTTON_STYLES}
15
+ # @param id [Integer, nil] The unique 32-bit ID of the button component. This is not to be confused with the `custom_id`.
16
+ # @param label [String, nil] The text label for the button. Either a label or emoji must be provided.
17
+ # @param emoji [#to_h, String, Integer] An emoji ID, or unicode emoji to attach to the button. Can also be an object
18
+ # that responds to `#to_h` which returns a hash in the format of `{ id: Integer, name: string }`.
19
+ # @param custom_id [String] Custom IDs are used to pass state to the events that are raised from interactions.
20
+ # There is a limit of 100 characters to each custom_id.
21
+ # @param disabled [true, false] Whether this button is disabled and shown as greyed out.
22
+ # @param url [String, nil] The URL, when using a link style button.
23
+ def button(style:, id: nil, label: nil, emoji: nil, custom_id: nil, disabled: nil, url: nil, sku_id: nil)
24
+ style = BUTTON_STYLES[style] || style
25
+
26
+ emoji = case emoji
27
+ when Integer, String
28
+ emoji.to_i.positive? ? { id: emoji } : { name: emoji }
29
+ else
30
+ emoji&.to_h
31
+ end
32
+
33
+ @components << { type: COMPONENT_TYPES[:button], id: id, label: label, emoji: emoji, style: style, custom_id: custom_id, disabled: disabled, url: url, sku_id: sku_id }.compact
34
+ end
35
+
36
+ # Add a string select to this action row.
37
+ # @param custom_id [String] Custom IDs are used to pass state to the events that are raised from interactions.
38
+ # There is a limit of 100 characters to each custom_id.
39
+ # @param id [Integer, nil] The unique 32-bit ID of the string select. This is not to be confused with the `custom_id`.
40
+ # @param options [Array<Hash>] Options that can be selected in this menu. Can also be provided via the yielded builder.
41
+ # @param placeholder [String, nil] Default text to show when no entries are selected.
42
+ # @param min_values [Integer, nil] The minimum amount of values a user must select.
43
+ # @param max_values [Integer, nil] The maximum amount of values a user can select.
44
+ # @param disabled [true, false, nil] Grey out the component to make it unusable.
45
+ # @yieldparam builder [SelectMenuBuilder]
46
+ def string_select(custom_id:, options: [], id: nil, placeholder: nil, min_values: nil, max_values: nil, disabled: nil)
47
+ builder = SelectMenuBuilder.new(custom_id, options, placeholder, min_values, max_values, disabled, select_type: :string_select, id: id)
48
+
49
+ yield builder if block_given?
50
+
51
+ @components << builder.to_h
52
+ end
53
+
54
+ alias_method :select_menu, :string_select
55
+
56
+ # Add a user select to this action row.
57
+ # @param custom_id [String] Custom IDs are used to pass state to the events that are raised from interactions.
58
+ # There is a limit of 100 characters to each custom_id.
59
+ # @param id [Integer, nil] The unique 32-bit ID of the user select. This is not to be confused with the `custom_id`.
60
+ # @param placeholder [String, nil] Default text to show when no entries are selected.
61
+ # @param min_values [Integer, nil] The minimum amount of values a user must select.
62
+ # @param max_values [Integer, nil] The maximum amount of values a user can select.
63
+ # @param disabled [true, false, nil] Grey out the component to make it unusable.
64
+ # @param default_values [Array<User, Member, Recipient, Integer, String, Hash>, nil] The users to populate in the select menu by default.
65
+ def user_select(custom_id:, id: nil, placeholder: nil, min_values: nil, max_values: nil, disabled: nil, default_values: nil)
66
+ @components << SelectMenuBuilder.new(custom_id, [], placeholder, min_values, max_values, disabled, select_type: :user_select, id: id, default_values: default_values).to_h
67
+ end
68
+
69
+ # Add a role select to this action row.
70
+ # @param custom_id [String] Custom IDs are used to pass state to the events that are raised from interactions.
71
+ # There is a limit of 100 characters to each custom_id.
72
+ # @param id [Integer, nil] The unique 32-bit ID of the role select. This is not to be confused with the `custom_id`.
73
+ # @param placeholder [String, nil] Default text to show when no entries are selected.
74
+ # @param min_values [Integer, nil] The minimum amount of values a user must select.
75
+ # @param max_values [Integer, nil] The maximum amount of values a user can select.
76
+ # @param disabled [true, false, nil] Grey out the component to make it unusable.
77
+ # @param default_values [Array<Role, Integer, String, Hash>, nil] The roles to populate in the select menu by default.
78
+ def role_select(custom_id:, id: nil, placeholder: nil, min_values: nil, max_values: nil, disabled: nil, default_values: nil)
79
+ @components << SelectMenuBuilder.new(custom_id, [], placeholder, min_values, max_values, disabled, select_type: :role_select, id: id, default_values: default_values).to_h
80
+ end
81
+
82
+ # Add a mentionable select to this action row.
83
+ # @param custom_id [String] Custom IDs are used to pass state to the events that are raised from interactions.
84
+ # There is a limit of 100 characters to each custom_id.
85
+ # @param id [Integer, nil] The unique 32-bit ID of the mentionable select. This is not to be confused with the `custom_id`.
86
+ # @param placeholder [String, nil] Default text to show when no entries are selected.
87
+ # @param min_values [Integer, nil] The minimum amount of values a user must select.
88
+ # @param max_values [Integer, nil] The maximum amount of values a user can select.
89
+ # @param disabled [true, false, nil] Grey out the component to make it unusable.
90
+ # @param default_values [Array<User, Role, Member, Recipient, Hash>, nil] The mentionable entities to populate in the select menu by default.
91
+ def mentionable_select(custom_id:, id: nil, placeholder: nil, min_values: nil, max_values: nil, disabled: nil, default_values: nil)
92
+ @components << SelectMenuBuilder.new(custom_id, [], placeholder, min_values, max_values, disabled, select_type: :mentionable_select, id: id, default_values: default_values).to_h
93
+ end
94
+
95
+ # Add a channel select to this action row.
96
+ # @param custom_id [String] Custom IDs are used to pass state to the events that are raised from interactions.
97
+ # There is a limit of 100 characters to each custom_id.
98
+ # @param id [Integer, nil] The unique 32-bit ID of the channel select. This is not to be confused with the `custom_id`.
99
+ # @param placeholder [String, nil] Default text to show when no entries are selected.
100
+ # @param min_values [Integer, nil] The minimum amount of values a user must select.
101
+ # @param max_values [Integer, nil] The maximum amount of values a user can select.
102
+ # @param disabled [true, false, nil] Grey out the component to make it unusable.
103
+ # @param types [Array<Symbol, Integer>, nil] The channel types to include in the select menu.
104
+ # @param default_values [Array<Channel, Integer, String, Hash>, nil] The channels to populate in the select menu by default.
105
+ def channel_select(custom_id:, id: nil, placeholder: nil, min_values: nil, max_values: nil, disabled: nil, types: nil, default_values: nil)
106
+ builder = SelectMenuBuilder.new(custom_id, [], placeholder, min_values, max_values, disabled, select_type: :channel_select, id: id, default_values: default_values).to_h
107
+
108
+ builder[:channel_types] = types.map { |type| OnyxCord::Channel::TYPES[type] || type } if types
109
+
110
+ @components << builder
111
+ end
112
+
113
+ # @!visibility private
114
+ def to_h
115
+ { type: COMPONENT_TYPES[:action_row], id: @id, components: @components }.compact
116
+ end
117
+ end
118
+
119
+ # A builder to assist in adding options to select menus.
120
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ class OnyxCord::Webhooks::View
4
+ class SectionBuilder
5
+ # Create a section component.
6
+ # @param id [Integer, nil] The unique 32-bit ID of the section component.
7
+ # @yieldparam builder [SectionBuilder] Yields the initialized section component.
8
+ def initialize(id: nil)
9
+ @id = id
10
+ @accessory = nil
11
+ @components = []
12
+
13
+ yield self if block_given?
14
+ end
15
+
16
+ # Add a text display component to this section.
17
+ # @see TextDisplayBuilder#initialize
18
+ def text_display(...)
19
+ @components << TextDisplayBuilder.new(...)
20
+ end
21
+
22
+ # Set the thumbnail for the section. This is mutually exclusive with {#button}.
23
+ # @param url [String] The URL to the thumbnail image.
24
+ # @param id [Integer, nil] The unique 32-bit ID of the thumbnail component.
25
+ # @param description [String, nil] The description of the thumbnail.
26
+ # @param spoiler [true, false] Whether or not to apply a spoiler label to the thumbnail.
27
+ def thumbnail(url:, id: nil, description: nil, spoiler: false)
28
+ @accessory = { type: COMPONENT_TYPES[:thumbnail], id: id, media: { url: }, description: description, spoiler: spoiler }.compact
29
+ end
30
+
31
+ # Set the button for the section. This is mutually exclusive with {#thumbnail}.
32
+ # @param style [Symbol, Integer] The button's style type. See {BUTTON_STYLES}
33
+ # @param id [Integer, nil] The unique 32-bit ID of the button component. This is not to be confused with the `custom_id`.
34
+ # @param label [String, nil] The text label for the button. Either a label or emoji must be provided.
35
+ # @param emoji [#to_h, String, Integer] An emoji ID, or unicode emoji to attach to the button. Can also be an object
36
+ # that responds to `#to_h` which returns a hash in the format of `{ id: Integer, name: string }`.
37
+ # @param custom_id [String] Custom IDs are used to pass state to the events that are raised from interactions.
38
+ # There is a limit of 100 characters to each custom_id.
39
+ # @param disabled [true, false] Whether this button is disabled and shown as greyed out.
40
+ # @param url [String, nil] The URL, when using a link style button.
41
+ def button(style:, id: nil, label: nil, emoji: nil, custom_id: nil, disabled: nil, url: nil, sku_id: nil)
42
+ style = BUTTON_STYLES[style] || style
43
+
44
+ emoji = case emoji
45
+ when Integer, String
46
+ emoji.to_i.positive? ? { id: emoji } : { name: emoji }
47
+ else
48
+ emoji&.to_h
49
+ end
50
+
51
+ @accessory = { type: COMPONENT_TYPES[:button], id: id, label: label, emoji: emoji, style: style, custom_id: custom_id, disabled: disabled, url: url, sku_id: sku_id }.compact
52
+ end
53
+
54
+ # @!visibility private
55
+ def to_h
56
+ { type: COMPONENT_TYPES[:section], id: @id, components: @components.map(&:to_h), accessory: @accessory }.compact
57
+ end
58
+ end
59
+
60
+ # This builder can be used to construct a container. These are similar to embeds.
61
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ class OnyxCord::Webhooks::View
4
+ class SelectMenuBuilder
5
+ # @!visibility private
6
+ def initialize(custom_id, options = [], placeholder = nil, min_values = nil, max_values = nil, disabled = nil, select_type: :string_select, id: nil, required: nil, default_values: nil)
7
+ @id = id
8
+ @custom_id = custom_id
9
+ @options = options
10
+ @placeholder = placeholder
11
+ @min_values = min_values
12
+ @max_values = max_values
13
+ @disabled = disabled
14
+ @select_type = select_type
15
+ @required = required
16
+ @default_values = process_defaults(default_values)
17
+ end
18
+
19
+ # Add an option to this select menu.
20
+ # @param label [String] The title of this option.
21
+ # @param value [String] The value that this option represents.
22
+ # @param description [String, nil] An optional description of the option.
23
+ # @param emoji [#to_h, String, Integer] An emoji ID, or unicode emoji to attach to the button. Can also be an object
24
+ # that responds to `#to_h` which returns a hash in the format of `{ id: Integer, name: string }`.
25
+ # @param default [true, false, nil] Whether this is the default selected option.
26
+ def option(label:, value:, description: nil, emoji: nil, default: nil)
27
+ emoji = case emoji
28
+ when Integer, String
29
+ emoji.to_i.positive? ? { id: emoji } : { name: emoji }
30
+ else
31
+ emoji&.to_h
32
+ end
33
+
34
+ @options << { label: label, value: value, description: description, emoji: emoji, default: default }
35
+ end
36
+
37
+ # @!visibility private
38
+ def to_h
39
+ {
40
+ type: COMPONENT_TYPES[@select_type],
41
+ id: @id,
42
+ options: @options,
43
+ placeholder: @placeholder,
44
+ min_values: @min_values,
45
+ max_values: @max_values,
46
+ custom_id: @custom_id,
47
+ disabled: @disabled,
48
+ required: @required,
49
+ default_values: @default_values
50
+ }.compact
51
+ end
52
+
53
+ private
54
+
55
+ # @!visibility private
56
+ def process_defaults(default_values)
57
+ if @select_type == :mentionable_select
58
+ default_values&.map do |default_value|
59
+ case default_value
60
+ when OnyxCord::Recipient, OnyxCord::User, OnyxCord::Member
61
+ { id: default_value.id, type: :user }
62
+ when OnyxCord::Role
63
+ { id: default_value.id, type: :role }
64
+ when Hash
65
+ default_value
66
+ else
67
+ raise TypeError, "Unsupported type: #{default_value.class}"
68
+ end
69
+ end
70
+ else
71
+ default_values&.map { |id| id.is_a?(Hash) ? id : { id: id.resolve_id, type: @select_type[..-8] } }
72
+ end
73
+ end
74
+ end
75
+
76
+ # A text display component allows you to send message content.
77
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ class OnyxCord::Webhooks::View
4
+ class SeparatorBuilder
5
+ # Create a separator component.
6
+ # @param divider [true, false] Whether or not the separator should act as a visible barrier.
7
+ # @param id [Integer, nil] The unique 32-bit ID of the separator component.
8
+ # @param spacing [Symbol, Integer] The size of the separator component's padding. See {SEPARATOR_SIZES}.
9
+ def initialize(divider:, id: nil, spacing: nil)
10
+ @id = id
11
+ @divider = divider
12
+ @spacing = SEPARATOR_SIZES[spacing] || spacing
13
+ end
14
+
15
+ # @!visibility private
16
+ def to_h
17
+ { type: COMPONENT_TYPES[:separator], id: @id, divider: @divider, spacing: @spacing }.compact
18
+ end
19
+ end
20
+
21
+ # A file component lets you send a file via an attachment://<filename> reference.
22
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ class OnyxCord::Webhooks::View
4
+ class TextDisplayBuilder
5
+ # Create a text display component.
6
+ # @param content [String] The content of the text display component.
7
+ # @param id [Integer, nil] The unique 32-bit ID of the text display component.
8
+ def initialize(content:, id: nil)
9
+ @id = id
10
+ @content = content
11
+ end
12
+
13
+ # @!visibility private
14
+ def to_h
15
+ { type: COMPONENT_TYPES[:text_display], id: @id, content: @content }.compact
16
+ end
17
+ end
18
+
19
+ # A separator allows you to add a barrier between components.
20
+ end