onyxcord 1.1.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 (133) hide show
  1. checksums.yaml +7 -0
  2. data/.devcontainer/Dockerfile +13 -0
  3. data/.devcontainer/devcontainer.json +29 -0
  4. data/.devcontainer/postcreate.sh +4 -0
  5. data/.github/CONTRIBUTING.md +13 -0
  6. data/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  7. data/.github/ISSUE_TEMPLATE/feature_request.md +24 -0
  8. data/.github/pull_request_template.md +37 -0
  9. data/.github/workflows/ci.yml +78 -0
  10. data/.github/workflows/codeql.yml +65 -0
  11. data/.github/workflows/deploy.yml +54 -0
  12. data/.github/workflows/release.yml +51 -0
  13. data/.gitignore +16 -0
  14. data/.markdownlint.json +4 -0
  15. data/.overcommit.yml +7 -0
  16. data/.rspec +2 -0
  17. data/.rubocop.yml +129 -0
  18. data/.yardopts +1 -0
  19. data/CHANGELOG.md +0 -0
  20. data/Gemfile +7 -0
  21. data/LICENSE.txt +21 -0
  22. data/README.md +305 -0
  23. data/Rakefile +17 -0
  24. data/bin/console +15 -0
  25. data/bin/setup +7 -0
  26. data/lib/onyxcord/allowed_mentions.rb +43 -0
  27. data/lib/onyxcord/api/application.rb +316 -0
  28. data/lib/onyxcord/api/channel.rb +700 -0
  29. data/lib/onyxcord/api/interaction.rb +67 -0
  30. data/lib/onyxcord/api/invite.rb +44 -0
  31. data/lib/onyxcord/api/server.rb +775 -0
  32. data/lib/onyxcord/api/user.rb +158 -0
  33. data/lib/onyxcord/api/webhook.rb +163 -0
  34. data/lib/onyxcord/api.rb +335 -0
  35. data/lib/onyxcord/await.rb +51 -0
  36. data/lib/onyxcord/bot.rb +1971 -0
  37. data/lib/onyxcord/cache.rb +326 -0
  38. data/lib/onyxcord/colour_rgb.rb +43 -0
  39. data/lib/onyxcord/commands/command_bot.rb +511 -0
  40. data/lib/onyxcord/commands/container.rb +112 -0
  41. data/lib/onyxcord/commands/events.rb +11 -0
  42. data/lib/onyxcord/commands/parser.rb +327 -0
  43. data/lib/onyxcord/commands/rate_limiter.rb +144 -0
  44. data/lib/onyxcord/configuration.rb +125 -0
  45. data/lib/onyxcord/container.rb +988 -0
  46. data/lib/onyxcord/data/activity.rb +271 -0
  47. data/lib/onyxcord/data/application.rb +341 -0
  48. data/lib/onyxcord/data/attachment.rb +91 -0
  49. data/lib/onyxcord/data/audit_logs.rb +438 -0
  50. data/lib/onyxcord/data/avatar_decoration.rb +26 -0
  51. data/lib/onyxcord/data/call.rb +22 -0
  52. data/lib/onyxcord/data/channel.rb +1355 -0
  53. data/lib/onyxcord/data/channel_tag.rb +69 -0
  54. data/lib/onyxcord/data/collectibles.rb +47 -0
  55. data/lib/onyxcord/data/component.rb +583 -0
  56. data/lib/onyxcord/data/embed.rb +258 -0
  57. data/lib/onyxcord/data/emoji.rb +123 -0
  58. data/lib/onyxcord/data/install_params.rb +24 -0
  59. data/lib/onyxcord/data/integration.rb +144 -0
  60. data/lib/onyxcord/data/interaction.rb +1141 -0
  61. data/lib/onyxcord/data/invite.rb +137 -0
  62. data/lib/onyxcord/data/member.rb +528 -0
  63. data/lib/onyxcord/data/message.rb +612 -0
  64. data/lib/onyxcord/data/message_activity.rb +41 -0
  65. data/lib/onyxcord/data/overwrite.rb +109 -0
  66. data/lib/onyxcord/data/poll.rb +365 -0
  67. data/lib/onyxcord/data/primary_server.rb +60 -0
  68. data/lib/onyxcord/data/profile.rb +79 -0
  69. data/lib/onyxcord/data/reaction.rb +64 -0
  70. data/lib/onyxcord/data/recipient.rb +34 -0
  71. data/lib/onyxcord/data/role.rb +449 -0
  72. data/lib/onyxcord/data/role_connection_data.rb +69 -0
  73. data/lib/onyxcord/data/role_subscription.rb +41 -0
  74. data/lib/onyxcord/data/scheduled_event.rb +513 -0
  75. data/lib/onyxcord/data/server.rb +1614 -0
  76. data/lib/onyxcord/data/server_preview.rb +68 -0
  77. data/lib/onyxcord/data/snapshot.rb +112 -0
  78. data/lib/onyxcord/data/team.rb +98 -0
  79. data/lib/onyxcord/data/timestamp.rb +69 -0
  80. data/lib/onyxcord/data/user.rb +324 -0
  81. data/lib/onyxcord/data/voice_region.rb +46 -0
  82. data/lib/onyxcord/data/voice_state.rb +41 -0
  83. data/lib/onyxcord/data/webhook.rb +238 -0
  84. data/lib/onyxcord/data.rb +57 -0
  85. data/lib/onyxcord/errors.rb +246 -0
  86. data/lib/onyxcord/event_executor.rb +80 -0
  87. data/lib/onyxcord/events/await.rb +48 -0
  88. data/lib/onyxcord/events/bans.rb +60 -0
  89. data/lib/onyxcord/events/channels.rb +225 -0
  90. data/lib/onyxcord/events/generic.rb +129 -0
  91. data/lib/onyxcord/events/guilds.rb +269 -0
  92. data/lib/onyxcord/events/integrations.rb +100 -0
  93. data/lib/onyxcord/events/interactions.rb +624 -0
  94. data/lib/onyxcord/events/invites.rb +127 -0
  95. data/lib/onyxcord/events/lifetime.rb +31 -0
  96. data/lib/onyxcord/events/members.rb +110 -0
  97. data/lib/onyxcord/events/message.rb +399 -0
  98. data/lib/onyxcord/events/polls.rb +118 -0
  99. data/lib/onyxcord/events/presence.rb +131 -0
  100. data/lib/onyxcord/events/raw.rb +74 -0
  101. data/lib/onyxcord/events/reactions.rb +218 -0
  102. data/lib/onyxcord/events/roles.rb +87 -0
  103. data/lib/onyxcord/events/scheduled_events.rb +171 -0
  104. data/lib/onyxcord/events/threads.rb +100 -0
  105. data/lib/onyxcord/events/typing.rb +73 -0
  106. data/lib/onyxcord/events/voice_server_update.rb +48 -0
  107. data/lib/onyxcord/events/voice_state_update.rb +106 -0
  108. data/lib/onyxcord/events/webhooks.rb +65 -0
  109. data/lib/onyxcord/gateway.rb +890 -0
  110. data/lib/onyxcord/id_object.rb +39 -0
  111. data/lib/onyxcord/light/data.rb +62 -0
  112. data/lib/onyxcord/light/integrations.rb +73 -0
  113. data/lib/onyxcord/light/light_bot.rb +58 -0
  114. data/lib/onyxcord/light.rb +8 -0
  115. data/lib/onyxcord/logger.rb +120 -0
  116. data/lib/onyxcord/message_components.rb +70 -0
  117. data/lib/onyxcord/paginator.rb +60 -0
  118. data/lib/onyxcord/permissions.rb +255 -0
  119. data/lib/onyxcord/rate_limiter/gateway.rb +42 -0
  120. data/lib/onyxcord/rate_limiter/rest.rb +89 -0
  121. data/lib/onyxcord/version.rb +7 -0
  122. data/lib/onyxcord/voice/encoder.rb +115 -0
  123. data/lib/onyxcord/voice/network.rb +380 -0
  124. data/lib/onyxcord/voice/opcodes.rb +29 -0
  125. data/lib/onyxcord/voice/sodium.rb +157 -0
  126. data/lib/onyxcord/voice/timer.rb +19 -0
  127. data/lib/onyxcord/voice/voice_bot.rb +386 -0
  128. data/lib/onyxcord/webhooks.rb +14 -0
  129. data/lib/onyxcord/websocket.rb +62 -0
  130. data/lib/onyxcord.rb +180 -0
  131. data/onyxcord-webhooks.gemspec +30 -0
  132. data/onyxcord.gemspec +50 -0
  133. metadata +421 -0
@@ -0,0 +1,171 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'onyxcord/data'
4
+ require 'onyxcord/events/generic'
5
+
6
+ module OnyxCord::Events
7
+ # Generic superclass for scheduled events.
8
+ class ScheduledEventEvent < Event
9
+ # @return [Server] the server associated with the event.
10
+ attr_reader :server
11
+
12
+ # @return [ScheduledEvent] the scheduled event associated with the event.
13
+ attr_reader :scheduled_event
14
+
15
+ # @!visibility private
16
+ def initialize(data, bot)
17
+ @bot = bot
18
+ @server = bot.server(data['guild_id'].to_i)
19
+ @scheduled_event = @server&.scheduled_event(data['id'].to_i)
20
+ end
21
+ end
22
+
23
+ # Raised whenever a scheduled event is created.
24
+ class ScheduledEventCreateEvent < ScheduledEventEvent; end
25
+
26
+ # Raised whenever a scheduled event is updated.
27
+ class ScheduledEventUpdateEvent < ScheduledEventEvent; end
28
+
29
+ # Raised whenever a scheduled event is deleted.
30
+ class ScheduledEventDeleteEvent < ScheduledEventEvent
31
+ # @!visibility private
32
+ def initialize(data, bot)
33
+ @bot = bot
34
+ @server = bot.server(data['guild_id'].to_i)
35
+ @scheduled_event = OnyxCord::ScheduledEvent.new(data, @server, @bot)
36
+ end
37
+ end
38
+
39
+ # Generic superclass for scheduled event user events.
40
+ class ScheduledEventUserEvent < Event
41
+ # @!visibility private
42
+ attr_reader :user_id
43
+
44
+ # @!visibility private
45
+ attr_reader :server_id
46
+
47
+ # @!visibility private
48
+ attr_reader :scheduled_event_id
49
+
50
+ # @!visibility private
51
+ def initialize(data, bot)
52
+ @bot = bot
53
+ @user_id = data['user_id'].to_i
54
+ @server_id = data['guild_id'].to_i
55
+ @scheduled_event_id = data['guild_scheduled_event_id'].to_i
56
+ end
57
+
58
+ # Get the server the scheduled event in question is from.
59
+ # @return [Server] the server the scheduled event is associated with.
60
+ def server
61
+ @bot.server(@server_id)
62
+ end
63
+
64
+ # Get the scheduled event that the user was added to or removed from.
65
+ # @return [ScheduledEvent] the scheduled event that the user was actioned on.
66
+ def scheduled_event
67
+ server.scheduled_event(@scheduled_event_id)
68
+ end
69
+
70
+ # Get the user that was added to or removed from the scheduled event.
71
+ # @return [Member, User] the server member that was added to or removed from the
72
+ # scheduled event, or a user if the member cannot be accessed by the bot.
73
+ def member
74
+ server.member(@user_id) || @bot.user(@user_id)
75
+ end
76
+
77
+ alias_method :user, :member
78
+ end
79
+
80
+ # Raised whenever a user is added to a scheduled event.
81
+ class ScheduledEventUserAddEvent < ScheduledEventUserEvent; end
82
+
83
+ # Raised whenever a user is removed from a scheduled event.
84
+ class ScheduledEventUserRemoveEvent < ScheduledEventUserEvent; end
85
+
86
+ # Generic event handler for scheduled event.
87
+ class ScheduledEventEventHandler < EventHandler
88
+ # @!visibility private
89
+ def matches?(event)
90
+ # Check for the proper event type.
91
+ return false unless event.is_a?(ScheduledEventEvent)
92
+
93
+ [
94
+ matches_all(@attributes[:server], event.server) do |a, e|
95
+ a&.resolve_id == e&.resolve_id
96
+ end,
97
+
98
+ matches_all(@attributes[:id], event.scheduled_event) do |a, e|
99
+ a&.resolve_id == e&.resolve_id
100
+ end,
101
+
102
+ matches_all(@attributes[:creator], event.scheduled_event.creator) do |a, e|
103
+ a&.resolve_id == e&.resolve_id
104
+ end,
105
+
106
+ matches_all(@attributes[:channel], event.scheduled_event.channel) do |a, e|
107
+ a&.resolve_id == e&.resolve_id
108
+ end,
109
+
110
+ matches_all(@attributes[:entity_id], event.scheduled_event.entity_id) do |a, e|
111
+ a&.resolve_id == e&.resolve_id
112
+ end,
113
+
114
+ matches_all(@attributes[:entity_type], event.scheduled_event.entity_type) do |a, e|
115
+ case a
116
+ when Symbol, String
117
+ OnyxCord::ScheduledEvent::ENTITY_TYPES[a.to_sym] == e
118
+ else
119
+ a == e
120
+ end
121
+ end,
122
+
123
+ matches_all(@attributes[:status], event.scheduled_event.status) do |a, e|
124
+ case a
125
+ when Symbol, String
126
+ OnyxCord::ScheduledEvent::STATUSES[a.to_sym] == e
127
+ else
128
+ a == e
129
+ end
130
+ end
131
+ ].reduce(true, &:&)
132
+ end
133
+ end
134
+
135
+ # Event handler for :GUILD_SCHEDULED_EVENT_CREATE events.
136
+ class ScheduledEventCreateEventHandler < ScheduledEventEventHandler; end
137
+
138
+ # Event handler for :GUILD_SCHEDULED_EVENT_UPDATE events.
139
+ class ScheduledEventUpdateEventHandler < ScheduledEventEventHandler; end
140
+
141
+ # Event handler for :GUILD_SCHEDULED_EVENT_DELETE events.
142
+ class ScheduledEventDeleteEventHandler < ScheduledEventEventHandler; end
143
+
144
+ # Generic event handler for scheduled event user events.
145
+ class ScheduledEventUserEventHandler < EventHandler
146
+ # @!visibility private
147
+ def matches?(event)
148
+ return false unless event.is_a?(ScheduledEventUserEvent)
149
+
150
+ [
151
+ matches_all(@attributes[:user], event.user_id) do |a, e|
152
+ a.resolve_id == e.resolve_id
153
+ end,
154
+
155
+ matches_all(@attributes[:server], event.server_id) do |a, e|
156
+ a.resolve_id == e.resolve_id
157
+ end,
158
+
159
+ matches_all(@attributes[:scheduled_event], event.scheduled_event_id) do |a, e|
160
+ a.resolve_id == e.resolve_id
161
+ end
162
+ ].reduce(true, &:&)
163
+ end
164
+ end
165
+
166
+ # Event handler for :GUILD_SCHEDULED_EVENT_USER_ADD events.
167
+ class ScheduledEventUserAddEventHandler < ScheduledEventUserEventHandler; end
168
+
169
+ # Event handler for :GUILD_SCHEDULED_EVENT_USER_REMOVE events.
170
+ class ScheduledEventUserRemoveEventHandler < ScheduledEventUserEventHandler; end
171
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Generic subclass for threads
4
+ module OnyxCord::Events
5
+ # Raised when a thread is created
6
+ class ThreadCreateEvent < Event
7
+ # @return [Channel] the thread in question.
8
+ attr_reader :thread
9
+
10
+ delegate :name, :server, :owner, :parent_channel, :thread_metadata, to: :thread
11
+
12
+ # @!visibility private
13
+ def initialize(data, bot)
14
+ @bot = bot
15
+ @thread = data.is_a?(OnyxCord::Channel) ? data : bot.channel(data['id'].to_i)
16
+ end
17
+ end
18
+
19
+ # Event handler for ChannelCreateEvent
20
+ class ThreadCreateEventHandler < EventHandler
21
+ def matches?(event)
22
+ # Check for the proper event type
23
+ return false unless event.is_a? ThreadCreateEvent
24
+
25
+ [
26
+ matches_all(@attributes[:name], event.name) do |a, e|
27
+ a == if a.is_a? String
28
+ e.to_s
29
+ else
30
+ e
31
+ end
32
+ end,
33
+ matches_all(@attributes[:server], event.server) do |a, e|
34
+ a.resolve_id == e.resolve_id
35
+ end,
36
+ matches_all(@attributes[:invitable], event.thread.invitable) do |a, e|
37
+ a == e
38
+ end,
39
+ matches_all(@attributes[:owner], event.thread.owner) do |a, e|
40
+ a.resolve_id == e.resolve_id
41
+ end,
42
+ matches_all(@attributes[:channel], event.thread.parent) do |a, e|
43
+ a.resolve_id == e.resolve_id
44
+ end
45
+ ].reduce(true, &:&)
46
+ end
47
+ end
48
+
49
+ # Raised when a thread is updated (e.g. name changes)
50
+ class ThreadUpdateEvent < ThreadCreateEvent; end
51
+
52
+ # Event handler for ThreadUpdateEvent
53
+ class ThreadUpdateEventHandler < ThreadCreateEventHandler
54
+ def matches?(event)
55
+ # Check for the proper event type
56
+ return false unless event.is_a? ThreadUpdateEvent
57
+
58
+ super
59
+ end
60
+ end
61
+
62
+ # Raised when members are added or removed from a thread.
63
+ class ThreadMembersUpdateEvent < Event
64
+ # @return [Channel]
65
+ attr_reader :thread
66
+
67
+ # @return [Array<Integer>]
68
+ attr_reader :removed_member_ids
69
+
70
+ # @return [Integer]
71
+ attr_reader :member_count
72
+
73
+ delegate :name, :server, :owner, :parent_channel, :thread_metadata, to: :thread
74
+
75
+ # @!visibility private
76
+ def initialize(data, bot)
77
+ @bot = bot
78
+ @server = bot.server(data['guild_id'].to_i) if data['guild_id']
79
+ @thread = data.is_a?(OnyxCord::Channel) ? data : bot.channel(data['id'].to_i)
80
+ @added_member_ids = data['added_members']&.map { |m| m['user_id']&.to_i } || []
81
+ @removed_member_ids = data['removed_member_ids']&.map(&:resolve_id) || []
82
+ @member_count = data['member_count']
83
+ end
84
+ end
85
+
86
+ # @return [Array<Member, User>] the members that were added to the thread
87
+ def added_members
88
+ @added_members ||= @added_member_ids&.map { |id| @server&.member(id) || @bot.user(id) }
89
+ end
90
+
91
+ # Event handler for ThreadMembersUpdateEvent
92
+ class ThreadMembersUpdateEventHandler < ThreadCreateEventHandler
93
+ def matches?(event)
94
+ # Check for the proper event type
95
+ return false unless event.is_a? ThreadMembersUpdateEvent
96
+
97
+ super
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'onyxcord/events/generic'
4
+
5
+ module OnyxCord::Events
6
+ # Event raised when a user starts typing
7
+ class TypingEvent < Event
8
+ include Respondable
9
+
10
+ # @return [Channel] the channel on which a user started typing.
11
+ attr_reader :channel
12
+
13
+ # @return [User, Member, Recipient] the user that started typing.
14
+ attr_reader :user
15
+ alias_method :member, :user
16
+
17
+ # @return [Time] when the typing happened.
18
+ attr_reader :timestamp
19
+
20
+ # @!visibility private
21
+ def initialize(data, bot)
22
+ @bot = bot
23
+
24
+ @user_id = data['user_id'].to_i
25
+
26
+ @channel_id = data['channel_id'].to_i
27
+ @channel = bot.channel(@channel_id)
28
+
29
+ @user = if channel.pm?
30
+ channel.recipient
31
+ elsif channel.group?
32
+ bot.user(@user_id)
33
+ else
34
+ bot.member(@channel.server.id, @user_id)
35
+ end
36
+
37
+ @timestamp = Time.at(data['timestamp'].to_i)
38
+ end
39
+ end
40
+
41
+ # Event handler for TypingEvent
42
+ class TypingEventHandler < EventHandler
43
+ def matches?(event)
44
+ # Check for the proper event type
45
+ return false unless event.is_a? TypingEvent
46
+
47
+ [
48
+ matches_all(@attributes[:in], event.channel) do |a, e|
49
+ case a
50
+ when String
51
+ a.delete('#') == e.name
52
+ when Integer
53
+ a == e.id
54
+ else
55
+ a == e
56
+ end
57
+ end,
58
+ matches_all(@attributes[:from], event.user) do |a, e|
59
+ a == case a
60
+ when String
61
+ e.name
62
+ when Integer
63
+ e.id
64
+ else
65
+ e
66
+ end
67
+ end,
68
+ matches_all(@attributes[:after], event.timestamp) { |a, e| a > e },
69
+ matches_all(@attributes[:before], event.timestamp) { |a, e| a < e }
70
+ ].reduce(true, &:&)
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'onyxcord/events/generic'
4
+ require 'onyxcord/data'
5
+
6
+ module OnyxCord::Events
7
+ # Event raised when a server's voice server is updating.
8
+ # Sent when initially connecting to voice and when a voice instance fails
9
+ # over to a new server.
10
+ # This event is exposed for use with library agnostic interfaces like telecom and
11
+ # lavalink.
12
+ class VoiceServerUpdateEvent < Event
13
+ # @return [String] The voice connection token
14
+ attr_reader :token
15
+
16
+ # @return [Server] The server this update is for.
17
+ attr_reader :server
18
+
19
+ # @return [String] The voice server host.
20
+ attr_reader :endpoint
21
+
22
+ # @!visibility private
23
+ def initialize(data, bot)
24
+ @bot = bot
25
+
26
+ @token = data['token']
27
+ @endpoint = data['endpoint']
28
+ @server = bot.server(data['guild_id'])
29
+ end
30
+ end
31
+
32
+ # Event handler for VoiceServerUpdateEvent
33
+ class VoiceServerUpdateEventHandler < EventHandler
34
+ def matches?(event)
35
+ return false unless event.is_a? VoiceServerUpdateEvent
36
+
37
+ [
38
+ matches_all(@attributes[:from], event.server) do |a, e|
39
+ a == if a.is_a? String
40
+ e.name
41
+ else
42
+ e
43
+ end
44
+ end
45
+ ]
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'onyxcord/events/generic'
4
+ require 'onyxcord/data'
5
+
6
+ module OnyxCord::Events
7
+ # Event raised when a user's voice state updates
8
+ class VoiceStateUpdateEvent < Event
9
+ attr_reader :user, :token, :suppress, :session_id, :self_mute, :self_deaf, :mute, :deaf, :server, :channel
10
+
11
+ # @return [Channel, nil] the old channel this user was on, or nil if the user is newly joining voice.
12
+ attr_reader :old_channel
13
+
14
+ # @!visibility private
15
+ def initialize(data, old_channel_id, bot)
16
+ @bot = bot
17
+
18
+ @token = data['token']
19
+ @suppress = data['suppress']
20
+ @session_id = data['session_id']
21
+ @self_mute = data['self_mute']
22
+ @self_deaf = data['self_deaf']
23
+ @mute = data['mute']
24
+ @deaf = data['deaf']
25
+ @server = bot.server(data['guild_id'].to_i)
26
+ return unless @server
27
+
28
+ @channel = bot.channel(data['channel_id'].to_i) if data['channel_id']
29
+ @old_channel = bot.channel(old_channel_id) if old_channel_id
30
+ @user = bot.user(data['user_id'].to_i)
31
+ end
32
+ end
33
+
34
+ # Event handler for VoiceStateUpdateEvent
35
+ class VoiceStateUpdateEventHandler < EventHandler
36
+ def matches?(event)
37
+ # Check for the proper event type
38
+ return false unless event.is_a? VoiceStateUpdateEvent
39
+
40
+ [
41
+ matches_all(@attributes[:from], event.user) do |a, e|
42
+ a == case a
43
+ when String
44
+ e.name
45
+ when Integer
46
+ e.id
47
+ else
48
+ e
49
+ end
50
+ end,
51
+ matches_all(@attributes[:mute], event.mute) do |a, e|
52
+ a == if a.is_a? String
53
+ e.to_s
54
+ else
55
+ e
56
+ end
57
+ end,
58
+ matches_all(@attributes[:deaf], event.deaf) do |a, e|
59
+ a == if a.is_a? String
60
+ e.to_s
61
+ else
62
+ e
63
+ end
64
+ end,
65
+ matches_all(@attributes[:self_mute], event.self_mute) do |a, e|
66
+ a == if a.is_a? String
67
+ e.to_s
68
+ else
69
+ e
70
+ end
71
+ end,
72
+ matches_all(@attributes[:self_deaf], event.self_deaf) do |a, e|
73
+ a == if a.is_a? String
74
+ e.to_s
75
+ else
76
+ e
77
+ end
78
+ end,
79
+ matches_all(@attributes[:channel], event.channel) do |a, e|
80
+ next unless e # Don't bother if the channel is nil
81
+
82
+ a == case a
83
+ when String
84
+ e.name
85
+ when Integer
86
+ e.id
87
+ else
88
+ e
89
+ end
90
+ end,
91
+ matches_all(@attributes[:old_channel], event.old_channel) do |a, e|
92
+ next unless e # Don't bother if the channel is nil
93
+
94
+ a == case a
95
+ when String
96
+ e.name
97
+ when Integer
98
+ e.id
99
+ else
100
+ e
101
+ end
102
+ end
103
+ ].reduce(true, &:&)
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'onyxcord/events/generic'
4
+ require 'onyxcord/data'
5
+
6
+ module OnyxCord::Events
7
+ # Event raised when a webhook is updated
8
+ class WebhookUpdateEvent < Event
9
+ # @return [Server] the server where the webhook updated
10
+ attr_reader :server
11
+
12
+ # @return [Channel] the channel the webhook is associated to
13
+ attr_reader :channel
14
+
15
+ # @!visibility private
16
+ def initialize(data, bot)
17
+ @bot = bot
18
+
19
+ @server = bot.server(data['guild_id'].to_i)
20
+ @channel = bot.channel(data['channel_id'].to_i)
21
+ end
22
+ end
23
+
24
+ # Event handler for {WebhookUpdateEvent}
25
+ class WebhookUpdateEventHandler < EventHandler
26
+ def matches?(event)
27
+ # Check for the proper event type
28
+ return false unless event.is_a? WebhookUpdateEvent
29
+
30
+ [
31
+ matches_all(@attributes[:server], event.server) do |a, e|
32
+ a == case a
33
+ when String
34
+ e.name
35
+ when Integer
36
+ e.id
37
+ else
38
+ e
39
+ end
40
+ end,
41
+ matches_all(@attributes[:channel], event.channel) do |a, e|
42
+ case a
43
+ when String
44
+ # Make sure to remove the "#" from channel names in case it was specified
45
+ a.delete('#') == e.name
46
+ when Integer
47
+ a == e.id
48
+ else
49
+ a == e
50
+ end
51
+ end,
52
+ matches_all(@attributes[:webhook], event) do |a, e|
53
+ a == case a
54
+ when String
55
+ e.name
56
+ when Integer
57
+ e.id
58
+ else
59
+ e
60
+ end
61
+ end
62
+ ].reduce(true, &:&)
63
+ end
64
+ end
65
+ end