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,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'onyxcord/events/generic'
4
+ require 'onyxcord/models'
5
+
6
+ module OnyxCord::Events
7
+ # Emoji is created/deleted/updated
8
+ class ServerEmojiChangeEvent < ServerEvent
9
+ # @return [Server] the server in question.
10
+ attr_reader :server
11
+
12
+ # @return [Array<Emoji>] array of emojis.
13
+ attr_reader :emoji
14
+
15
+ # @!visibility private
16
+ def initialize(server, data, bot)
17
+ @bot = bot
18
+ @server = server
19
+ process_emoji(data)
20
+ end
21
+
22
+ # @!visibility private
23
+ def process_emoji(data)
24
+ @emoji = data['emojis'].map do |e|
25
+ @server.emoji[e['id']]
26
+ end
27
+ end
28
+ end
29
+
30
+ # Generic event helper for when an emoji is either created or deleted
31
+
32
+ # Generic event helper for when an emoji is either created or deleted
33
+ class ServerEmojiCDEvent < ServerEvent
34
+ # @return [Server] the server in question.
35
+ attr_reader :server
36
+
37
+ # @return [Emoji] the emoji data.
38
+ attr_reader :emoji
39
+
40
+ # @!visibility private
41
+ def initialize(server, emoji, bot)
42
+ @bot = bot
43
+ @emoji = emoji
44
+ @server = server
45
+ end
46
+ end
47
+
48
+ # Emoji is created
49
+
50
+ # Emoji is created
51
+ class ServerEmojiCreateEvent < ServerEmojiCDEvent; end
52
+
53
+ # Emoji is deleted
54
+
55
+ # Emoji is deleted
56
+ class ServerEmojiDeleteEvent < ServerEmojiCDEvent; end
57
+
58
+ # Emoji is updated
59
+
60
+ # Emoji is updated
61
+ class ServerEmojiUpdateEvent < ServerEvent
62
+ # @return [Server] the server in question.
63
+ attr_reader :server
64
+
65
+ # @return [Emoji, nil] the emoji data before the event.
66
+ attr_reader :old_emoji
67
+
68
+ # @return [Emoji, nil] the updated emoji data.
69
+ attr_reader :emoji
70
+
71
+ # @!visibility private
72
+ def initialize(server, old_emoji, emoji, bot)
73
+ @bot = bot
74
+ @old_emoji = old_emoji
75
+ @emoji = emoji
76
+ @server = server
77
+ end
78
+ end
79
+
80
+ # Event handler for {ServerEmojiChangeEvent}
81
+
82
+ # Event handler for {ServerEmojiChangeEvent}
83
+ class ServerEmojiChangeEventHandler < ServerEventHandler; end
84
+
85
+ # Generic handler for emoji create and delete
86
+
87
+ # Generic handler for emoji create and delete
88
+ class ServerEmojiCDEventHandler < ServerEventHandler
89
+ def matches?(event)
90
+ # Check for the proper event type
91
+ return false unless event.is_a? ServerEmojiCDEvent
92
+
93
+ [
94
+ matches_all(@attributes[:server], event.server) do |a, e|
95
+ a == case a
96
+ when String
97
+ e.name
98
+ when Integer
99
+ e.id
100
+ else
101
+ e
102
+ end
103
+ end,
104
+ matches_all(@attributes[:id], event.emoji.id) { |a, e| a.resolve_id == e.resolve_id },
105
+ matches_all(@attributes[:name], event.emoji.name) { |a, e| a == e }
106
+ ].reduce(true, &:&)
107
+ end
108
+ end
109
+
110
+ # Event handler for {ServerEmojiCreateEvent}
111
+
112
+ # Event handler for {ServerEmojiCreateEvent}
113
+ class ServerEmojiCreateEventHandler < ServerEmojiCDEventHandler; end
114
+
115
+ # Event handler for {ServerEmojiDeleteEvent}
116
+
117
+ # Event handler for {ServerEmojiDeleteEvent}
118
+ class ServerEmojiDeleteEventHandler < ServerEmojiCDEventHandler; end
119
+
120
+ # Event handler for {ServerEmojiUpdateEvent}
121
+
122
+ # Event handler for {ServerEmojiUpdateEvent}
123
+ class ServerEmojiUpdateEventHandler < EventHandler
124
+ def matches?(event)
125
+ # Check for the proper event type
126
+ return false unless event.is_a? ServerEmojiUpdateEvent
127
+
128
+ [
129
+ matches_all(@attributes[:server], event.server) do |a, e|
130
+ a == case a
131
+ when String
132
+ e.name
133
+ when Integer
134
+ e.id
135
+ else
136
+ e
137
+ end
138
+ end,
139
+ matches_all(@attributes[:id], event.old_emoji.id) { |a, e| a.resolve_id == e.resolve_id },
140
+ matches_all(@attributes[:old_name], event.old_emoji.name) { |a, e| a == e },
141
+ matches_all(@attributes[:name], event.emoji.name) { |a, e| a == e }
142
+ ].reduce(true, &:&)
143
+ end
144
+ end
145
+
146
+ # Raised whenever an audit log entry is created.
147
+ end
@@ -1,269 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'onyxcord/events/generic'
4
- require 'onyxcord/data'
5
-
6
- module OnyxCord::Events
7
- # Generic subclass for server events (create/update/delete)
8
- class ServerEvent < Event
9
- # @return [Server] the server in question.
10
- attr_reader :server
11
-
12
- # @!visibility private
13
- def initialize(data, bot)
14
- @bot = bot
15
-
16
- init_server(data, bot)
17
- end
18
-
19
- # Initializes this event with server data. Should be overwritten in case the server doesn't exist at the time
20
- # of event creation (e. g. {ServerDeleteEvent})
21
- def init_server(data, bot)
22
- @server = bot.server(data['id'].to_i)
23
- end
24
- end
25
-
26
- # Generic event handler for member events
27
- class ServerEventHandler < EventHandler
28
- def matches?(event)
29
- # Check for the proper event type
30
- return false unless event.is_a? ServerEvent
31
-
32
- [
33
- matches_all(@attributes[:server], event.server) do |a, e|
34
- a == case a
35
- when String
36
- e.name
37
- when Integer
38
- e.id
39
- else
40
- e
41
- end
42
- end
43
- ].reduce(true, &:&)
44
- end
45
- end
46
-
47
- # Server is created
48
- # @see OnyxCord::EventContainer#server_create
49
- class ServerCreateEvent < ServerEvent; end
50
-
51
- # Event handler for {ServerCreateEvent}
52
- class ServerCreateEventHandler < ServerEventHandler; end
53
-
54
- # Server is updated (e.g. name changed)
55
- # @see OnyxCord::EventContainer#server_update
56
- class ServerUpdateEvent < ServerEvent; end
57
-
58
- # Event handler for {ServerUpdateEvent}
59
- class ServerUpdateEventHandler < ServerEventHandler; end
60
-
61
- # Server is deleted, the server was left because the bot was kicked, or the
62
- # bot made itself leave the server.
63
- # @see OnyxCord::EventContainer#server_delete
64
- class ServerDeleteEvent < ServerEvent
65
- # @return [Integer] The ID of the server that was left.
66
- attr_reader :server
67
-
68
- # @!visibility private
69
- # @note Override init_server to account for the deleted server
70
- def init_server(data, _bot)
71
- @server = data['id'].to_i
72
- end
73
- end
74
-
75
- # Event handler for {ServerDeleteEvent}
76
- class ServerDeleteEventHandler < ServerEventHandler; end
77
-
78
- # Emoji is created/deleted/updated
79
- class ServerEmojiChangeEvent < ServerEvent
80
- # @return [Server] the server in question.
81
- attr_reader :server
82
-
83
- # @return [Array<Emoji>] array of emojis.
84
- attr_reader :emoji
85
-
86
- # @!visibility private
87
- def initialize(server, data, bot)
88
- @bot = bot
89
- @server = server
90
- process_emoji(data)
91
- end
92
-
93
- # @!visibility private
94
- def process_emoji(data)
95
- @emoji = data['emojis'].map do |e|
96
- @server.emoji[e['id']]
97
- end
98
- end
99
- end
100
-
101
- # Generic event helper for when an emoji is either created or deleted
102
- class ServerEmojiCDEvent < ServerEvent
103
- # @return [Server] the server in question.
104
- attr_reader :server
105
-
106
- # @return [Emoji] the emoji data.
107
- attr_reader :emoji
108
-
109
- # @!visibility private
110
- def initialize(server, emoji, bot)
111
- @bot = bot
112
- @emoji = emoji
113
- @server = server
114
- end
115
- end
116
-
117
- # Emoji is created
118
- class ServerEmojiCreateEvent < ServerEmojiCDEvent; end
119
-
120
- # Emoji is deleted
121
- class ServerEmojiDeleteEvent < ServerEmojiCDEvent; end
122
-
123
- # Emoji is updated
124
- class ServerEmojiUpdateEvent < ServerEvent
125
- # @return [Server] the server in question.
126
- attr_reader :server
127
-
128
- # @return [Emoji, nil] the emoji data before the event.
129
- attr_reader :old_emoji
130
-
131
- # @return [Emoji, nil] the updated emoji data.
132
- attr_reader :emoji
133
-
134
- # @!visibility private
135
- def initialize(server, old_emoji, emoji, bot)
136
- @bot = bot
137
- @old_emoji = old_emoji
138
- @emoji = emoji
139
- @server = server
140
- end
141
- end
142
-
143
- # Event handler for {ServerEmojiChangeEvent}
144
- class ServerEmojiChangeEventHandler < ServerEventHandler; end
145
-
146
- # Generic handler for emoji create and delete
147
- class ServerEmojiCDEventHandler < ServerEventHandler
148
- def matches?(event)
149
- # Check for the proper event type
150
- return false unless event.is_a? ServerEmojiCDEvent
151
-
152
- [
153
- matches_all(@attributes[:server], event.server) do |a, e|
154
- a == case a
155
- when String
156
- e.name
157
- when Integer
158
- e.id
159
- else
160
- e
161
- end
162
- end,
163
- matches_all(@attributes[:id], event.emoji.id) { |a, e| a.resolve_id == e.resolve_id },
164
- matches_all(@attributes[:name], event.emoji.name) { |a, e| a == e }
165
- ].reduce(true, &:&)
166
- end
167
- end
168
-
169
- # Event handler for {ServerEmojiCreateEvent}
170
- class ServerEmojiCreateEventHandler < ServerEmojiCDEventHandler; end
171
-
172
- # Event handler for {ServerEmojiDeleteEvent}
173
- class ServerEmojiDeleteEventHandler < ServerEmojiCDEventHandler; end
174
-
175
- # Event handler for {ServerEmojiUpdateEvent}
176
- class ServerEmojiUpdateEventHandler < EventHandler
177
- def matches?(event)
178
- # Check for the proper event type
179
- return false unless event.is_a? ServerEmojiUpdateEvent
180
-
181
- [
182
- matches_all(@attributes[:server], event.server) do |a, e|
183
- a == case a
184
- when String
185
- e.name
186
- when Integer
187
- e.id
188
- else
189
- e
190
- end
191
- end,
192
- matches_all(@attributes[:id], event.old_emoji.id) { |a, e| a.resolve_id == e.resolve_id },
193
- matches_all(@attributes[:old_name], event.old_emoji.name) { |a, e| a == e },
194
- matches_all(@attributes[:name], event.emoji.name) { |a, e| a == e }
195
- ].reduce(true, &:&)
196
- end
197
- end
198
-
199
- # Raised whenever an audit log entry is created.
200
- class AuditLogEntryCreateEvent < Event
201
- # @return [Server] the server of the audit log event.
202
- attr_reader :server
203
-
204
- # @return [AuditLogs::Entry] the entry of the audit log event.
205
- attr_reader :entry
206
-
207
- # @return [Integer] the raw action type of the audit log entry.
208
- attr_reader :action
209
-
210
- # @return [Integer] the ID of the user or bot that made the entry.
211
- attr_reader :user_id
212
-
213
- # @return [Integer, nil] the ID of the affected webhook, user, etc.
214
- attr_reader :target_id
215
-
216
- # @!visibility private
217
- def initialize(data, bot)
218
- @bot = bot
219
- @action = data['action_type']
220
- @user_id = data['user_id']&.to_i
221
- @target_id = data['target_id']&.to_i
222
- @server = bot.server(data['guild_id'].to_i)
223
- @entry = OnyxCord::AuditLogs::Entry.new(nil, @server, @bot, data)
224
- end
225
- end
226
-
227
- # Event handler for GUILD_AUDIT_LOG_ENTRY_CREATE events.
228
- class AuditLogEntryCreateEventHandler < EventHandler
229
- # @!visibility private
230
- def matches?(event)
231
- # Check for the proper event type.
232
- return false unless event.is_a?(AuditLogEntryCreateEvent)
233
-
234
- [
235
- matches_all(@attributes[:action], event) do |a, e|
236
- case a
237
- when Numeric
238
- a == e.action
239
- when String, Symbol
240
- a.to_sym == e.entry.action
241
- end
242
- end,
243
-
244
- matches_all(@attributes[:reason], event.entry) do |a, e|
245
- if e.reason
246
- case a
247
- when String
248
- a == e.reason
249
- when Regexp
250
- a.match?(e.reason)
251
- end
252
- end
253
- end,
254
-
255
- matches_all(@attributes[:user], event.user_id) do |a, e|
256
- a&.resolve_id == e&.resolve_id
257
- end,
258
-
259
- matches_all(@attributes[:server], event.server) do |a, e|
260
- a&.resolve_id == e&.resolve_id
261
- end,
262
-
263
- matches_all(@attributes[:target], event.target_id) do |a, e|
264
- a&.resolve_id == e&.resolve_id
265
- end
266
- ].reduce(true, &:&)
267
- end
268
- end
269
- end
3
+ require 'onyxcord/events/guilds/base'
4
+ require 'onyxcord/events/guilds/emoji'
5
+ require 'onyxcord/events/guilds/audit_logs'
@@ -0,0 +1,133 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnyxCord
4
+ module EventContainer
5
+ # This **event** is raised when a channel is created.
6
+ # @param attributes [Hash] The event's attributes.
7
+ # @option attributes [Integer] :type Matches the type of channel that is being created (0: text, 1: private, 2: voice, 3: group)
8
+ # @option attributes [String] :name Matches the name of the created channel.
9
+ # @yield The block is executed when the event is raised.
10
+ # @yieldparam event [ChannelCreateEvent] The event that was raised.
11
+ # @return [ChannelCreateEventHandler] the event handler that was registered.
12
+ def channel_create(attributes = {}, &block)
13
+ register_event(ChannelCreateEvent, attributes, block)
14
+ end
15
+
16
+ # This **event** is raised when a channel is updated.
17
+ # @param attributes [Hash] The event's attributes.
18
+ # @option attributes [Integer] :type Matches the type of channel that is being updated (0: text, 1: private, 2: voice, 3: group).
19
+ # @option attributes [String] :name Matches the new name of the channel.
20
+ # @yield The block is executed when the event is raised.
21
+ # @yieldparam event [ChannelUpdateEvent] The event that was raised.
22
+ # @return [ChannelUpdateEventHandler] the event handler that was registered.
23
+
24
+ # This **event** is raised when a channel is updated.
25
+ # @param attributes [Hash] The event's attributes.
26
+ # @option attributes [Integer] :type Matches the type of channel that is being updated (0: text, 1: private, 2: voice, 3: group).
27
+ # @option attributes [String] :name Matches the new name of the channel.
28
+ # @yield The block is executed when the event is raised.
29
+ # @yieldparam event [ChannelUpdateEvent] The event that was raised.
30
+ # @return [ChannelUpdateEventHandler] the event handler that was registered.
31
+ def channel_update(attributes = {}, &block)
32
+ register_event(ChannelUpdateEvent, attributes, block)
33
+ end
34
+
35
+ # This **event** is raised when a channel is deleted.
36
+ # @param attributes [Hash] The event's attributes.
37
+ # @option attributes [Integer] :type Matches the type of channel that is being deleted (0: text, 1: private, 2: voice, 3: group).
38
+ # @option attributes [String] :name Matches the name of the deleted channel.
39
+ # @yield The block is executed when the event is raised.
40
+ # @yieldparam event [ChannelDeleteEvent] The event that was raised.
41
+ # @return [ChannelDeleteEventHandler] the event handler that was registered.
42
+
43
+ # This **event** is raised when a channel is deleted.
44
+ # @param attributes [Hash] The event's attributes.
45
+ # @option attributes [Integer] :type Matches the type of channel that is being deleted (0: text, 1: private, 2: voice, 3: group).
46
+ # @option attributes [String] :name Matches the name of the deleted channel.
47
+ # @yield The block is executed when the event is raised.
48
+ # @yieldparam event [ChannelDeleteEvent] The event that was raised.
49
+ # @return [ChannelDeleteEventHandler] the event handler that was registered.
50
+ def channel_delete(attributes = {}, &block)
51
+ register_event(ChannelDeleteEvent, attributes, block)
52
+ end
53
+
54
+ # This **event** is raised when a recipient is added to a group channel.
55
+ # @param attributes [Hash] The event's attributes.
56
+ # @option attributes [String] :name Matches the name of the group channel that the recipient is added to.
57
+ # @option attributes [String, Integer] :owner_id Matches the ID of the group channel's owner.
58
+ # @option attributes [String, Integer] :id Matches the ID of the recipient added to the group channel.
59
+ # @yield The block is executed when the event is raised.
60
+ # @yieldparam event [ChannelRecipientAddEvent] The event that was raised.
61
+ # @return [ChannelRecipientAddHandler] the event handler that was registered.
62
+
63
+ # This **event** is raised when a recipient is added to a group channel.
64
+ # @param attributes [Hash] The event's attributes.
65
+ # @option attributes [String] :name Matches the name of the group channel that the recipient is added to.
66
+ # @option attributes [String, Integer] :owner_id Matches the ID of the group channel's owner.
67
+ # @option attributes [String, Integer] :id Matches the ID of the recipient added to the group channel.
68
+ # @yield The block is executed when the event is raised.
69
+ # @yieldparam event [ChannelRecipientAddEvent] The event that was raised.
70
+ # @return [ChannelRecipientAddHandler] the event handler that was registered.
71
+ def channel_recipient_add(attributes = {}, &block)
72
+ register_event(ChannelRecipientAddEvent, attributes, block)
73
+ end
74
+
75
+ # This **event** is raised when a recipient is removed from a group channel.
76
+ # @param attributes [Hash] The event's attributes.
77
+ # @option attributes [String] :name Matches the name of the group channel that the recipient is added to.
78
+ # @option attributes [String, Integer] :owner_id Matches the ID of the group channel's owner.
79
+ # @option attributes [String, Integer] :id Matches the ID of the recipient removed from the group channel.
80
+ # @yield The block is executed when the event is raised.
81
+ # @yieldparam event [ChannelRecipientRemoveEvent] The event that was raised.
82
+ # @return [ChannelRecipientRemoveHandler] the event handler that was registered.
83
+
84
+ # This **event** is raised when a recipient is removed from a group channel.
85
+ # @param attributes [Hash] The event's attributes.
86
+ # @option attributes [String] :name Matches the name of the group channel that the recipient is added to.
87
+ # @option attributes [String, Integer] :owner_id Matches the ID of the group channel's owner.
88
+ # @option attributes [String, Integer] :id Matches the ID of the recipient removed from the group channel.
89
+ # @yield The block is executed when the event is raised.
90
+ # @yieldparam event [ChannelRecipientRemoveEvent] The event that was raised.
91
+ # @return [ChannelRecipientRemoveHandler] the event handler that was registered.
92
+ def channel_recipient_remove(attributes = {}, &block)
93
+ register_event(ChannelRecipientRemoveEvent, attributes, block)
94
+ end
95
+
96
+ # This **event** is raised when a user's voice state changes. This includes when a user joins, leaves, or
97
+ # moves between voice channels, as well as their mute and deaf status for themselves and on the server.
98
+ # @param attributes [Hash] The event's attributes.
99
+ # @option attributes [String, Integer, User] :from Matches the user that raised the event.
100
+ # @option attributes [String, Integer, Channel] :channel Matches the voice channel the user has joined.
101
+ # @option attributes [String, Integer, Channel] :old_channel Matches the voice channel the user was in previously.
102
+ # @option attributes [true, false] :mute Matches whether or not the user is muted server-wide.
103
+ # @option attributes [true, false] :deaf Matches whether or not the user is deafened server-wide.
104
+ # @option attributes [true, false] :self_mute Matches whether or not the user is muted by the bot.
105
+ # @option attributes [true, false] :self_deaf Matches whether or not the user is deafened by the bot.
106
+ # @yield The block is executed when the event is raised.
107
+ # @yieldparam event [VoiceStateUpdateEvent] The event that was raised.
108
+ # @return [VoiceStateUpdateEventHandler] the event handler that was registered.
109
+
110
+ # This **event** is raised whenever a message is pinned or unpinned.
111
+ # @param attributes [Hash] The event's attributes.
112
+ # @option attributes [String, Integer, Channel] :channel A channel to match against.
113
+ # @option attributes [String, Integer, Server] :server A server to match against.
114
+ # @yield The block is executed when the event is raised.
115
+ # @yieldparam event [ChannelPinsUpdateEvent] The event that was raised.
116
+ # @return [ChannelPinsUpdateEventHandler] The event handler that was registered.
117
+ def channel_pins_update(attributes = {}, &block)
118
+ register_event(ChannelPinsUpdateEvent, attributes, block)
119
+ end
120
+
121
+ # This **event** is raised whenever an autocomplete interaction is created.
122
+ # @param name [String, Symbol, nil] An option name to match against.
123
+ # @param attributes [Hash] The event's attributes.
124
+ # @option attributes [String, Integer] :command_id A command ID to match against.
125
+ # @option attributes [String, Symbol] :subcommand A subcommand name to match against.
126
+ # @option attributes [String, Symbol] :subcommand_group A subcommand group to match against.
127
+ # @option attributes [String, Symbol] :command_name A command name to match against.
128
+ # @option attributes [String, Integer, Server] :server A server to match against.
129
+ # @yield The block is executed when the event is raised.
130
+ # @yieldparam event [AutocompleteEvent] The event that was raised.
131
+ # @return [AutocompleteEventHandler] The event handler that was registered.
132
+ end
133
+ end
@@ -0,0 +1,146 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnyxCord
4
+ module EventContainer
5
+ # Removes an event handler from this container. If you're looking for a way to do temporary events, I recommend
6
+ # {Await}s instead of this.
7
+ # @param handler [OnyxCord::Events::EventHandler] The handler to remove.
8
+ def remove_handler(handler)
9
+ if handler.is_a?(OnyxCord::Events::RawDispatchHandler)
10
+ @raw_handlers&.delete(handler)
11
+ return
12
+ end
13
+
14
+ clazz = EventContainer.event_class(handler.class)
15
+ @event_handlers ||= {}
16
+ @event_handlers[clazz].delete(handler)
17
+ end
18
+
19
+ # Remove an application command handler
20
+ # @param name [String, Symbol] The name of the command handler to remove.
21
+
22
+ # Remove an application command handler
23
+ # @param name [String, Symbol] The name of the command handler to remove.
24
+ def remove_application_command_handler(name)
25
+ @application_commands.delete(name)
26
+ end
27
+
28
+ # Removes all events from this event handler.
29
+
30
+ # Removes all events from this event handler.
31
+ def clear!
32
+ @event_handlers&.clear
33
+ @raw_handlers&.clear
34
+ @application_commands&.clear
35
+ end
36
+
37
+ # Adds an event handler to this container. Usually, it's more expressive to just use one of the shorthand adder
38
+ # methods like {#message}, but if you want to create one manually you can use this.
39
+ # @param handler [OnyxCord::Events::EventHandler] The handler to add.
40
+
41
+ # Adds an event handler to this container. Usually, it's more expressive to just use one of the shorthand adder
42
+ # methods like {#message}, but if you want to create one manually you can use this.
43
+ # @param handler [OnyxCord::Events::EventHandler] The handler to add.
44
+ def add_handler(handler)
45
+ clazz = EventContainer.event_class(handler.class)
46
+ @event_handlers ||= {}
47
+ @event_handlers[clazz] ||= []
48
+ @event_handlers[clazz] << handler
49
+ end
50
+
51
+ # Adds all event handlers from another container into this one. Existing event handlers will be overwritten.
52
+ # @param container [Module] A module that `extend`s {EventContainer} from which the handlers will be added.
53
+
54
+ # Adds all event handlers from another container into this one. Existing event handlers will be overwritten.
55
+ # @param container [Module] A module that `extend`s {EventContainer} from which the handlers will be added.
56
+ def include_events(container)
57
+ application_command_handlers = container.instance_variable_get(:@application_commands)
58
+ handlers = container.instance_variable_get :@event_handlers
59
+ raw_handlers = container.instance_variable_get(:@raw_handlers)
60
+ return unless handlers || application_command_handlers || raw_handlers
61
+
62
+ @event_handlers ||= {}
63
+ @event_handlers.merge!(handlers || {}) { |_, old, new| old + new }
64
+
65
+ @raw_handlers ||= []
66
+ @raw_handlers.concat(raw_handlers || [])
67
+
68
+ @application_commands ||= {}
69
+
70
+ @application_commands.merge!(application_command_handlers || {}) do |_, old, new|
71
+ old.subcommands.merge!(new.subcommands)
72
+ old
73
+ end
74
+ end
75
+
76
+ alias_method :include!, :include_events
77
+ alias_method :<<, :add_handler
78
+
79
+ # Returns the handler class for an event class type
80
+ # @see #event_class
81
+ # @param event_class [Class] The event type
82
+ # @return [Class] the handler type
83
+
84
+ # Returns the handler class for an event class type
85
+ # @see #event_class
86
+ # @param event_class [Class] The event type
87
+ # @return [Class] the handler type
88
+ def self.handler_class(event_class)
89
+ class_from_string("#{event_class}Handler")
90
+ end
91
+
92
+ # Returns the event class for a handler class type
93
+ # @see #handler_class
94
+ # @param handler_class [Class] The handler type
95
+ # @return [Class, nil] the event type, or nil if the handler_class isn't a handler class (i.e. ends with Handler)
96
+
97
+ # Returns the event class for a handler class type
98
+ # @see #handler_class
99
+ # @param handler_class [Class] The handler type
100
+ # @return [Class, nil] the event type, or nil if the handler_class isn't a handler class (i.e. ends with Handler)
101
+ def self.event_class(handler_class)
102
+ class_name = handler_class.to_s
103
+ return nil unless class_name.end_with? 'Handler'
104
+
105
+ EventContainer.class_from_string(class_name[0..-8])
106
+ end
107
+
108
+ # Utility method to return a class object from a string of its name. Mostly useful for internal stuff
109
+ # @param str [String] The name of the class
110
+ # @return [Class] the class
111
+
112
+ # Utility method to return a class object from a string of its name. Mostly useful for internal stuff
113
+ # @param str [String] The name of the class
114
+ # @return [Class] the class
115
+ def self.class_from_string(str)
116
+ str.split('::').inject(Object) do |mod, class_name|
117
+ mod.const_get(class_name)
118
+ end
119
+ end
120
+
121
+ private
122
+
123
+ include OnyxCord::Events
124
+
125
+ # @return [EventHandler]
126
+
127
+ # @return [EventHandler]
128
+ def register_event(clazz, attributes, block)
129
+ handler = EventContainer.handler_class(clazz).new(attributes, block)
130
+
131
+ @event_handlers ||= {}
132
+ @event_handlers[clazz] ||= []
133
+ @event_handlers[clazz] << handler
134
+
135
+ # Return the handler so it can be removed later
136
+ handler
137
+ end
138
+
139
+ def register_raw_handler(filter, block)
140
+ handler = OnyxCord::Events::RawDispatchHandler.new(filter, block)
141
+ @raw_handlers ||= []
142
+ @raw_handlers << handler
143
+ handler
144
+ end
145
+ end
146
+ end