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,295 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'onyxcord/events/generic'
4
+ require 'onyxcord/models'
5
+
6
+ module OnyxCord::Events
7
+ # Module to make sending messages easier with the presence of a text channel in an event
8
+ module Respondable
9
+ # @return [Channel] the channel in which this event occurred
10
+ attr_reader :channel
11
+
12
+ # Sends a message to the channel this message was sent in, right now. It is usually preferable to use {#<<} instead
13
+ # because it avoids rate limiting problems
14
+ # @param content [String] The message to send to the channel
15
+ # @param tts [true, false] Whether or not this message should be sent using Discord text-to-speech.
16
+ # @param embed [Hash, OnyxCord::Webhooks::Embed, nil] The rich embed to append to this message.
17
+ # @param attachments [Array<File>] Files that can be referenced in embeds via `attachment://file.png`
18
+ # @param allowed_mentions [Hash, OnyxCord::AllowedMentions, false, nil] Mentions that are allowed to ping on this message. `false` disables all pings
19
+ # @param message_reference [Message, String, Integer, nil] The message, or message ID, to reply to if any.
20
+ # @param components [View, Array<Hash>, nil] A collection of components to attach to the message.
21
+ # @param flags [Integer] Flags for this message. Currently only SUPPRESS_EMBEDS (1 << 2), SUPPRESS_NOTIFICATIONS (1 << 12), and IS_COMPONENTS_V2 (1 << 15) can be set.
22
+ # @return [OnyxCord::Message] the message that was sent
23
+ def send_message(content, tts = false, embed = nil, attachments = nil, allowed_mentions = nil, message_reference = nil, components = nil, flags = 0)
24
+ channel.send_message(content, tts, embed, attachments, allowed_mentions, message_reference, components, flags)
25
+ end
26
+
27
+ # The same as {#send_message}, but yields a {Webhooks::Embed} for easy building of embedded content inside a block.
28
+ # @see Channel#send_embed
29
+ # @param message [String] The message that should be sent along with the embed. If this is the empty string, only the embed will be shown.
30
+ # @param embed [OnyxCord::Webhooks::Embed, nil] The embed to start the building process with, or nil if one should be created anew.
31
+ # @param attachments [Array<File>] Files that can be referenced in embeds via `attachment://file.png`
32
+ # @param tts [true, false] Whether or not this message should be sent using Discord text-to-speech.
33
+ # @param allowed_mentions [Hash, OnyxCord::AllowedMentions, false, nil] Mentions that are allowed to ping on this message. `false` disables all pings
34
+ # @param message_reference [Message, String, Integer, nil] The message, or message ID, to reply to if any.
35
+ # @param components [View, Array<Hash>, nil] A collection of components to attach to the message.
36
+ # @param flags [Integer] Flags for this message. Currently only SUPPRESS_EMBEDS (1 << 2), SUPPRESS_NOTIFICATIONS (1 << 12), and IS_COMPONENTS_V2 (1 << 15) can be set.
37
+ # @yield [embed] Yields the embed to allow for easy building inside a block.
38
+ # @yieldparam embed [OnyxCord::Webhooks::Embed] The embed from the parameters, or a new one.
39
+ # @return [Message] The resulting message.
40
+ def send_embed(message = '', embed = nil, attachments = nil, tts = false, allowed_mentions = nil, message_reference = nil, components = nil, flags = 0, &block)
41
+ channel.send_embed(message, embed, attachments, tts, allowed_mentions, message_reference, components, flags, &block)
42
+ end
43
+
44
+ # Sends a temporary message to the channel this message was sent in, right now.
45
+ # @param content [String] The content to send. Should not be longer than 2000 characters or it will result in an error.
46
+ # @param timeout [Float] The amount of time in seconds after which the message sent will be deleted.
47
+ # @param tts [true, false] Whether or not this message should be sent using Discord text-to-speech.
48
+ # @param embed [Hash, OnyxCord::Webhooks::Embed, nil] The rich embed to append to this message.
49
+ # @param attachments [Array<File>] Files that can be referenced in embeds via `attachment://file.png`
50
+ # @param allowed_mentions [Hash, OnyxCord::AllowedMentions, false, nil] Mentions that are allowed to ping on this message. `false` disables all pings
51
+ # @param components [View, Array<Hash>, nil] A collection of components to attach to the message.
52
+ # @param flags [Integer] Flags for this message. Currently only SUPPRESS_EMBEDS (1 << 2), SUPPRESS_NOTIFICATIONS (1 << 12), and IS_COMPONENTS_V2 (1 << 15) can be set.
53
+ def send_temporary_message(content, timeout, tts = false, embed = nil, attachments = nil, allowed_mentions = nil, components = nil, flags = 0)
54
+ channel.send_temporary_message(content, timeout, tts, embed, attachments, allowed_mentions, components, flags)
55
+ end
56
+
57
+ # Sends a message to the channel this message was sent in, right now.
58
+ # @see Channel#send_message!
59
+ def send_message!(...)
60
+ channel.send_message!(...)
61
+ end
62
+
63
+ # Adds a string to be sent after the event has finished execution. Avoids problems with rate limiting because only
64
+ # one message is ever sent. If it is used multiple times, the strings will bunch up into one message (separated by
65
+ # newlines)
66
+ # @param message [String] The message to send to the channel
67
+ def <<(message)
68
+ addition = "#{message}\n"
69
+ @saved_message = @saved_message ? @saved_message + addition : addition
70
+ nil
71
+ end
72
+
73
+ # Drains the currently saved message, which clears it out, resulting in everything being saved before being
74
+ # thrown away and nothing being sent to the channel (unless there is something saved after this).
75
+ # @see #<<
76
+ def drain
77
+ @saved_message = ''
78
+ nil
79
+ end
80
+
81
+ # Drains the currently saved message into a result string. This prepends it before that string, clears the saved
82
+ # message and returns the concatenation.
83
+ # @param result [String] The result string to drain into.
84
+ # @return [String] a string formed by concatenating the saved message and the argument.
85
+ def drain_into(result)
86
+ return if result.is_a?(OnyxCord::Message)
87
+
88
+ result = (@saved_message.nil? ? '' : @saved_message.to_s) + (result.nil? ? '' : result.to_s)
89
+ drain
90
+ result
91
+ end
92
+
93
+ alias_method :send, :send_message
94
+ alias_method :respond, :send_message
95
+ alias_method :send_temp, :send_temporary_message
96
+
97
+ alias_method :send!, :send_message!
98
+ alias_method :respond!, :send_message!
99
+ end
100
+
101
+ # Event raised when a text message is sent to a channel
102
+
103
+ # Event raised when a text message is sent to a channel
104
+ class MessageEvent < Event
105
+ include Respondable
106
+
107
+ # @return [Message] the message which triggered this event.
108
+ attr_reader :message
109
+
110
+ # @return [String] the message that has been saved by calls to {#<<} and will be sent to Discord upon completion.
111
+ attr_reader :saved_message
112
+
113
+ # @return [File] the file that has been saved by a call to {#attach_file} and will be sent to Discord upon completion.
114
+ attr_reader :file
115
+
116
+ # @return [String] the filename set in {#attach_file} that will override the original filename when sent.
117
+ attr_reader :filename
118
+
119
+ # @return [true, false] Whether or not this file should appear as a spoiler. Set by {#attach_file}
120
+ attr_reader :file_spoiler
121
+
122
+ # @!attribute [r] author
123
+ # @return [Member, User] who sent this message.
124
+ # @see Message#author
125
+ # @!attribute [r] channel
126
+ # @return [Channel] the channel in which this message was sent.
127
+ # @see Message#channel
128
+ # @!attribute [r] content
129
+ # @return [String] the message's content.
130
+ # @see Message#content
131
+ # @!attribute [r] timestamp
132
+ # @return [Time] the time at which the message was sent.
133
+ # @see Message#timestamp
134
+ delegate :author, :channel, :content, :timestamp, to: :message
135
+
136
+ # @!attribute [r] server
137
+ # @return [Server, nil] the server where this message was sent, or nil if it was sent in PM.
138
+ # @see Channel#server
139
+ delegate :server, to: :channel
140
+
141
+ # @!visibility private
142
+ def initialize(message, bot)
143
+ @bot = bot
144
+ @message = message
145
+ @channel = message.channel
146
+ @saved_message = ''
147
+ @file = nil
148
+ @filename = nil
149
+ @file_spoiler = nil
150
+ end
151
+
152
+ # Sends file with a caption to the channel this message was sent in, right now.
153
+ # It is usually preferable to use {#<<} and {#attach_file} instead
154
+ # because it avoids rate limiting problems
155
+ # @param file [File] The file to send to the channel
156
+ # @param caption [String] The caption attached to the file
157
+ # @param filename [String] Overrides the filename of the uploaded file
158
+ # @param spoiler [true, false] Whether or not this file should appear as a spoiler.
159
+ # @return [OnyxCord::Message] the message that was sent
160
+ # @example Send a file from disk
161
+ # event.send_file(File.open('rubytaco.png', 'r'))
162
+ def send_file(file, caption: nil, filename: nil, spoiler: nil)
163
+ @message.channel.send_file(file, caption: caption, filename: filename, spoiler: spoiler)
164
+ end
165
+
166
+ # Attaches a file to the message event and converts the message into
167
+ # a caption.
168
+ # @param file [File] The file to be attached
169
+ # @param filename [String] Overrides the filename of the uploaded file
170
+ # @param spoiler [true, false] Whether or not this file should appear as a spoiler.
171
+ def attach_file(file, filename: nil, spoiler: nil)
172
+ raise ArgumentError, 'Argument is not a file!' unless file.is_a?(File)
173
+
174
+ @file = file
175
+ @filename = filename
176
+ @file_spoiler = spoiler
177
+ nil
178
+ end
179
+
180
+ # Detaches a file from the message event.
181
+ def detach_file
182
+ @file = nil
183
+ @filename = nil
184
+ @file_spoiler = nil
185
+ end
186
+
187
+ # @return [true, false] whether or not this message was sent by the bot itself
188
+ def from_bot?
189
+ @message.user.id == @bot.profile.id
190
+ end
191
+
192
+ # Utility method to get the voice bot for the current server
193
+ # @return [Client, nil] the voice bot connected to this message's server, or nil if there is none connected
194
+ def voice
195
+ @bot.voice(@message.channel.server.id)
196
+ end
197
+
198
+ alias_method :user, :author
199
+ alias_method :text, :content
200
+ end
201
+
202
+ # Event handler for MessageEvent
203
+
204
+ # Event handler for MessageEvent
205
+ class MessageEventHandler < EventHandler
206
+ def matches?(event)
207
+ # Check for the proper event type
208
+ return false unless event.is_a? MessageEvent
209
+
210
+ [
211
+ matches_all(@attributes[:starting_with] || @attributes[:start_with], event.content) do |a, e|
212
+ case a
213
+ when String
214
+ e.start_with? a
215
+ when Regexp
216
+ (e =~ a)&.zero?
217
+ end
218
+ end,
219
+ matches_all(@attributes[:ending_with] || @attributes[:end_with], event.content) do |a, e|
220
+ case a
221
+ when String
222
+ e.end_with? a
223
+ when Regexp
224
+ !(e =~ Regexp.new("#{a}$")).nil?
225
+ end
226
+ end,
227
+ matches_all(@attributes[:containing] || @attributes[:contains], event.content) do |a, e|
228
+ case a
229
+ when String
230
+ e.include? a
231
+ when Regexp
232
+ (e =~ a)
233
+ end
234
+ end,
235
+ matches_all(@attributes[:in], event.channel) do |a, e|
236
+ case a
237
+ when String
238
+ # Make sure to remove the "#" from channel names in case it was specified
239
+ a.delete('#') == e.name
240
+ when Integer
241
+ a == e.id
242
+ else
243
+ a == e
244
+ end
245
+ end,
246
+ matches_all(@attributes[:from], event.message) do |a, e|
247
+ # Resolve the author in the block in order to prevent resolving the author even when the attribute is `nil`
248
+ e = e.author
249
+ case a
250
+ when String
251
+ a == e.name
252
+ when Integer
253
+ a == e.id
254
+ when :bot
255
+ e.current_bot?
256
+ else
257
+ a == e
258
+ end
259
+ end,
260
+ matches_all(@attributes[:with_text] || @attributes[:content] || @attributes[:exact_text], event.content) do |a, e|
261
+ case a
262
+ when String
263
+ e == a
264
+ when Regexp
265
+ match = a.match(e)
266
+ match ? (e == match[0]) : false
267
+ end
268
+ end,
269
+ matches_all(@attributes[:type] || @attributes[:message_type], event.message.type) do |a, e|
270
+ case a
271
+ when String, Symbol
272
+ OnyxCord::Message::TYPES[a.to_sym] == e
273
+ when Integer
274
+ a == e
275
+ end
276
+ end,
277
+ matches_all(@attributes[:after], event.timestamp) { |a, e| a > e },
278
+ matches_all(@attributes[:before], event.timestamp) { |a, e| a < e },
279
+ matches_all(@attributes[:private], event.channel.private?) { |a, e| !e == !a },
280
+ matches_all(@attributes[:server], event.server) { |a, e| a&.resolve_id == e&.resolve_id }
281
+ ].reduce(true, &:&)
282
+ end
283
+
284
+ # @see EventHandler#after_call
285
+ def after_call(event)
286
+ if event.file.nil?
287
+ event.send_message(event.saved_message) unless event.saved_message.empty?
288
+ else
289
+ event.send_file(event.file, caption: event.saved_message, filename: event.filename, spoiler: event.file_spoiler)
290
+ end
291
+ end
292
+ end
293
+
294
+ # Event raised when the current bot is mentioned in a message.
295
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'onyxcord/events/generic'
4
+ require 'onyxcord/models'
5
+
6
+ module OnyxCord::Events
7
+ # A subset of MessageEvent that only contains a message ID and a channel
8
+ class MessageIDEvent < Event
9
+ include Respondable
10
+
11
+ # @return [Integer] the ID associated with this event
12
+ attr_reader :id
13
+
14
+ # @return [Server, nil] the server associated with this event
15
+ attr_reader :server
16
+
17
+ # @!visibility private
18
+ def initialize(data, bot)
19
+ @id = data['id'].to_i
20
+ @channel = bot.channel(data['channel_id'].to_i)
21
+ @server = @channel.server
22
+ @saved_message = ''
23
+ @bot = bot
24
+ end
25
+ end
26
+
27
+ # Event handler for {MessageIDEvent}
28
+
29
+ # Event handler for {MessageIDEvent}
30
+ class MessageIDEventHandler < EventHandler
31
+ def matches?(event)
32
+ # Check for the proper event type
33
+ return false unless event.is_a? MessageIDEvent
34
+
35
+ [
36
+ matches_all(@attributes[:id], event.id) do |a, e|
37
+ a.resolve_id == e.resolve_id
38
+ end,
39
+ matches_all(@attributes[:in], event.channel) do |a, e|
40
+ case a
41
+ when String
42
+ # Make sure to remove the "#" from channel names in case it was specified
43
+ a.delete('#') == e.name
44
+ when Integer
45
+ a == e.id
46
+ else
47
+ a == e
48
+ end
49
+ end,
50
+ matches_all(@attributes[:server], event.server) do |a, e|
51
+ a&.resolve_id == e&.resolve_id
52
+ end
53
+ ].reduce(true, &:&)
54
+ end
55
+ end
56
+
57
+ # Raised when a message is edited
58
+ # @see OnyxCord::EventContainer#message_edit
59
+
60
+ # Raised when a message is deleted
61
+ # @see OnyxCord::EventContainer#message_delete
62
+ class MessageDeleteEvent < MessageIDEvent; end
63
+
64
+ # Event handler for {MessageDeleteEvent}
65
+
66
+ # Event handler for {MessageDeleteEvent}
67
+ class MessageDeleteEventHandler < MessageIDEventHandler; end
68
+
69
+ # Raised whenever a MESSAGE_UPDATE is received
70
+ # @see OnyxCord::EventContainer#message_update
71
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'onyxcord/events/generic'
4
+ require 'onyxcord/models'
5
+
6
+ module OnyxCord::Events
7
+ # Event raised when the current bot is mentioned in a message.
8
+ class MentionEvent < MessageEvent
9
+ # @return [true, false] whether this mention event was raised
10
+ # due to a mention of the bot's auto-generated server role.
11
+ attr_reader :role_mention
12
+ alias_method :role_mention?, :role_mention
13
+
14
+ # @!visibility private
15
+ def initialize(message, bot, role_mention)
16
+ super(message, bot)
17
+
18
+ @role_mention = role_mention
19
+ end
20
+ end
21
+
22
+ # Event handler for {MentionEvent}
23
+
24
+ # Event handler for {MentionEvent}
25
+ class MentionEventHandler < MessageEventHandler
26
+ # @!visibility private
27
+ def matches?(event)
28
+ return false unless super
29
+ return false unless event.is_a?(MentionEvent)
30
+
31
+ [
32
+ matches_all(@attributes[:role_mention], event.role_mention) do |a, e|
33
+ case a
34
+ when TrueClass
35
+ e == true
36
+ when FalseClass
37
+ e == false
38
+ end
39
+ end
40
+ ].reduce(true, &:&)
41
+ end
42
+ end
43
+
44
+ # @see OnyxCord::EventContainer#pm
45
+
46
+ # @see OnyxCord::EventContainer#pm
47
+ class PrivateMessageEvent < MessageEvent; end
48
+
49
+ # Event handler for {PrivateMessageEvent}
50
+
51
+ # Event handler for {PrivateMessageEvent}
52
+ class PrivateMessageEventHandler < MessageEventHandler; end
53
+
54
+ # A subset of MessageEvent that only contains a message ID and a channel
55
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'onyxcord/events/generic'
4
+ require 'onyxcord/models'
5
+
6
+ module OnyxCord::Events
7
+ # Raised when a message is edited
8
+ # @see OnyxCord::EventContainer#message_edit
9
+ class MessageEditEvent < MessageEvent; end
10
+
11
+ # Event handler for {MessageEditEvent}
12
+
13
+ # Event handler for {MessageEditEvent}
14
+ class MessageEditEventHandler < MessageEventHandler; end
15
+
16
+ # Raised when a message is deleted
17
+ # @see OnyxCord::EventContainer#message_delete
18
+
19
+ # Raised whenever a MESSAGE_UPDATE is received
20
+ # @see OnyxCord::EventContainer#message_update
21
+ class MessageUpdateEvent < MessageEvent; end
22
+
23
+ # Event handler for {MessageUpdateEvent}
24
+
25
+ # Event handler for {MessageUpdateEvent}
26
+ class MessageUpdateEventHandler < MessageEventHandler; end
27
+ end