rubycord 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +7 -0
  2. data/lib/rubycord/allowed_mentions.rb +34 -0
  3. data/lib/rubycord/api/application.rb +200 -0
  4. data/lib/rubycord/api/channel.rb +597 -0
  5. data/lib/rubycord/api/interaction.rb +52 -0
  6. data/lib/rubycord/api/invite.rb +42 -0
  7. data/lib/rubycord/api/server.rb +557 -0
  8. data/lib/rubycord/api/user.rb +153 -0
  9. data/lib/rubycord/api/webhook.rb +138 -0
  10. data/lib/rubycord/api.rb +356 -0
  11. data/lib/rubycord/await.rb +49 -0
  12. data/lib/rubycord/bot.rb +1757 -0
  13. data/lib/rubycord/cache.rb +259 -0
  14. data/lib/rubycord/colour_rgb.rb +41 -0
  15. data/lib/rubycord/commands/command_bot.rb +519 -0
  16. data/lib/rubycord/commands/container.rb +110 -0
  17. data/lib/rubycord/commands/events.rb +9 -0
  18. data/lib/rubycord/commands/parser.rb +325 -0
  19. data/lib/rubycord/commands/rate_limiter.rb +142 -0
  20. data/lib/rubycord/container.rb +753 -0
  21. data/lib/rubycord/data/activity.rb +269 -0
  22. data/lib/rubycord/data/application.rb +48 -0
  23. data/lib/rubycord/data/attachment.rb +109 -0
  24. data/lib/rubycord/data/audit_logs.rb +343 -0
  25. data/lib/rubycord/data/channel.rb +996 -0
  26. data/lib/rubycord/data/component.rb +227 -0
  27. data/lib/rubycord/data/embed.rb +249 -0
  28. data/lib/rubycord/data/emoji.rb +80 -0
  29. data/lib/rubycord/data/integration.rb +120 -0
  30. data/lib/rubycord/data/interaction.rb +798 -0
  31. data/lib/rubycord/data/invite.rb +135 -0
  32. data/lib/rubycord/data/member.rb +370 -0
  33. data/lib/rubycord/data/message.rb +412 -0
  34. data/lib/rubycord/data/overwrite.rb +106 -0
  35. data/lib/rubycord/data/profile.rb +89 -0
  36. data/lib/rubycord/data/reaction.rb +31 -0
  37. data/lib/rubycord/data/recipient.rb +32 -0
  38. data/lib/rubycord/data/role.rb +246 -0
  39. data/lib/rubycord/data/server.rb +1002 -0
  40. data/lib/rubycord/data/user.rb +261 -0
  41. data/lib/rubycord/data/voice_region.rb +43 -0
  42. data/lib/rubycord/data/voice_state.rb +39 -0
  43. data/lib/rubycord/data/webhook.rb +232 -0
  44. data/lib/rubycord/data.rb +40 -0
  45. data/lib/rubycord/errors.rb +737 -0
  46. data/lib/rubycord/events/await.rb +46 -0
  47. data/lib/rubycord/events/bans.rb +58 -0
  48. data/lib/rubycord/events/channels.rb +186 -0
  49. data/lib/rubycord/events/generic.rb +126 -0
  50. data/lib/rubycord/events/guilds.rb +191 -0
  51. data/lib/rubycord/events/interactions.rb +480 -0
  52. data/lib/rubycord/events/invites.rb +123 -0
  53. data/lib/rubycord/events/lifetime.rb +29 -0
  54. data/lib/rubycord/events/members.rb +91 -0
  55. data/lib/rubycord/events/message.rb +337 -0
  56. data/lib/rubycord/events/presence.rb +127 -0
  57. data/lib/rubycord/events/raw.rb +45 -0
  58. data/lib/rubycord/events/reactions.rb +156 -0
  59. data/lib/rubycord/events/roles.rb +86 -0
  60. data/lib/rubycord/events/threads.rb +94 -0
  61. data/lib/rubycord/events/typing.rb +70 -0
  62. data/lib/rubycord/events/voice_server_update.rb +45 -0
  63. data/lib/rubycord/events/voice_state_update.rb +103 -0
  64. data/lib/rubycord/events/webhooks.rb +62 -0
  65. data/lib/rubycord/gateway.rb +867 -0
  66. data/lib/rubycord/id_object.rb +37 -0
  67. data/lib/rubycord/light/data.rb +60 -0
  68. data/lib/rubycord/light/integrations.rb +71 -0
  69. data/lib/rubycord/light/light_bot.rb +56 -0
  70. data/lib/rubycord/light.rb +6 -0
  71. data/lib/rubycord/logger.rb +118 -0
  72. data/lib/rubycord/paginator.rb +55 -0
  73. data/lib/rubycord/permissions.rb +251 -0
  74. data/lib/rubycord/version.rb +5 -0
  75. data/lib/rubycord/voice/encoder.rb +113 -0
  76. data/lib/rubycord/voice/network.rb +366 -0
  77. data/lib/rubycord/voice/sodium.rb +96 -0
  78. data/lib/rubycord/voice/voice_bot.rb +408 -0
  79. data/lib/rubycord/webhooks/builder.rb +100 -0
  80. data/lib/rubycord/webhooks/client.rb +132 -0
  81. data/lib/rubycord/webhooks/embeds.rb +248 -0
  82. data/lib/rubycord/webhooks/modal.rb +78 -0
  83. data/lib/rubycord/webhooks/version.rb +7 -0
  84. data/lib/rubycord/webhooks/view.rb +192 -0
  85. data/lib/rubycord/webhooks.rb +12 -0
  86. data/lib/rubycord/websocket.rb +70 -0
  87. data/lib/rubycord.rb +140 -0
  88. metadata +231 -0
@@ -0,0 +1,46 @@
1
+ require "rubycord/events/generic"
2
+ require "rubycord/await"
3
+
4
+ module Rubycord::Events
5
+ # @see Bot#await
6
+ class AwaitEvent < Event
7
+ # The await that was triggered.
8
+ # @return [Await] The await
9
+ attr_reader :await
10
+
11
+ # The event that triggered the await.
12
+ # @return [Event] The event
13
+ attr_reader :event
14
+
15
+ # @!attribute [r] key
16
+ # @return [Symbol] the await's key.
17
+ # @see Await#key
18
+ # @!attribute [r] type
19
+ # @return [Class] the await's event class.
20
+ # @see Await#type
21
+ # @!attribute [r] attributes
22
+ # @return [Hash] a hash of attributes defined on the await.
23
+ # @see Await#attributes
24
+ delegate :key, :type, :attributes, to: :await
25
+
26
+ # For internal use only
27
+ def initialize(await, event, bot)
28
+ @await = await
29
+ @event = event
30
+ @bot = bot
31
+ end
32
+ end
33
+
34
+ # Event handler for {AwaitEvent}
35
+ class AwaitEventHandler < EventHandler
36
+ def matches?(event)
37
+ # Check for the proper event type
38
+ return false unless event.is_a? AwaitEvent
39
+
40
+ [
41
+ matches_all(@attributes[:key], event.key) { |a, e| a == e },
42
+ matches_all(@attributes[:type], event.type) { |a, e| a == e }
43
+ ].reduce(true, &:&)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,58 @@
1
+ require "rubycord/events/generic"
2
+
3
+ module Rubycord::Events
4
+ # Raised when a user is banned
5
+ class UserBanEvent < Event
6
+ # @return [User] the user that was banned
7
+ attr_reader :user
8
+
9
+ # @return [Server] the server from which the user was banned
10
+ attr_reader :server
11
+
12
+ # @!visibility private
13
+ def initialize(data, bot)
14
+ @user = bot.user(data["user"]["id"].to_i)
15
+ @server = bot.server(data["guild_id"].to_i)
16
+ @bot = bot
17
+ end
18
+ end
19
+
20
+ # Event handler for {UserBanEvent}
21
+ class UserBanEventHandler < EventHandler
22
+ def matches?(event)
23
+ # Check for the proper event type
24
+ return false unless event.is_a? UserBanEvent
25
+
26
+ [
27
+ matches_all(@attributes[:user], event.user) do |a, e|
28
+ case a
29
+ when String
30
+ a == e.name
31
+ when Integer
32
+ a == e.id
33
+ when :bot
34
+ e.current_bot?
35
+ else
36
+ a == e
37
+ end
38
+ end,
39
+ matches_all(@attributes[:server], event.server) do |a, e|
40
+ a == case a
41
+ when String
42
+ e.name
43
+ when Integer
44
+ e.id
45
+ else
46
+ e
47
+ end
48
+ end
49
+ ].reduce(true, &:&)
50
+ end
51
+ end
52
+
53
+ # Raised when a user is unbanned from a server
54
+ class UserUnbanEvent < UserBanEvent; end
55
+
56
+ # Event handler for {UserUnbanEvent}
57
+ class UserUnbanEventHandler < UserBanEventHandler; end
58
+ end
@@ -0,0 +1,186 @@
1
+ require "rubycord/events/generic"
2
+ require "rubycord/data"
3
+
4
+ module Rubycord::Events
5
+ # Raised when a channel is created
6
+ class ChannelCreateEvent < Event
7
+ # @return [Channel] the channel in question.
8
+ attr_reader :channel
9
+
10
+ # @!attribute [r] type
11
+ # @return [Integer] the channel's type (0: text, 1: private, 2: voice, 3: group).
12
+ # @see Channel#type
13
+ # @!attribute [r] topic
14
+ # @return [String] the channel's topic.
15
+ # @see Channel#topic
16
+ # @!attribute [r] position
17
+ # @return [Integer] the position of the channel in the channels list.
18
+ # @see Channel#position
19
+ # @!attribute [r] name
20
+ # @return [String] the channel's name
21
+ # @see Channel#name
22
+ # @!attribute [r] id
23
+ # @return [Integer] the channel's unique ID.
24
+ # @see Channel#id
25
+ # @!attribute [r] server
26
+ # @return [Server] the server the channel belongs to.
27
+ # @see Channel#server
28
+ delegate :name, :server, :type, :owner_id, :recipients, :topic, :user_limit, :position, :permission_overwrites, to: :channel
29
+
30
+ def initialize(data, bot)
31
+ @bot = bot
32
+ @channel = data.is_a?(Rubycord::Channel) ? data : bot.channel(data["id"].to_i)
33
+ end
34
+ end
35
+
36
+ # Event handler for ChannelCreateEvent
37
+ class ChannelCreateEventHandler < EventHandler
38
+ def matches?(event)
39
+ # Check for the proper event type
40
+ return false unless event.is_a? ChannelCreateEvent
41
+
42
+ [
43
+ matches_all(@attributes[:type], event.type) do |a, e|
44
+ a == if a.is_a? String
45
+ e.name
46
+ else
47
+ e
48
+ end
49
+ end,
50
+ matches_all(@attributes[:name], event.name) do |a, e|
51
+ a == if a.is_a? String
52
+ e.to_s
53
+ else
54
+ e
55
+ end
56
+ end
57
+ ].reduce(true, &:&)
58
+ end
59
+ end
60
+
61
+ # Raised when a channel is deleted
62
+ class ChannelDeleteEvent < Event
63
+ # @return [Integer] the channel's type (0: text, 1: private, 2: voice, 3: group).
64
+ attr_reader :type
65
+
66
+ # @return [String] the channel's topic
67
+ attr_reader :topic
68
+
69
+ # @return [Integer] the position of the channel on the list
70
+ attr_reader :position
71
+
72
+ # @return [String] the channel's name
73
+ attr_reader :name
74
+
75
+ # @return [Integer] the channel's ID
76
+ attr_reader :id
77
+
78
+ # @return [Server] the channel's server
79
+ attr_reader :server
80
+
81
+ # @return [Integer, nil] the channel's owner ID if this is a group channel
82
+ attr_reader :owner_id
83
+
84
+ def initialize(data, bot)
85
+ @bot = bot
86
+
87
+ @type = data["type"]
88
+ @topic = data["topic"]
89
+ @position = data["position"]
90
+ @name = data["name"]
91
+ @is_private = data["is_private"]
92
+ @id = data["id"].to_i
93
+ @server = bot.server(data["guild_id"].to_i) if data["guild_id"]
94
+ @owner_id = bot.user(data["owner_id"]) if @type == 3
95
+ end
96
+ end
97
+
98
+ # Event handler for ChannelDeleteEvent
99
+ class ChannelDeleteEventHandler < EventHandler
100
+ def matches?(event)
101
+ # Check for the proper event type
102
+ return false unless event.is_a? ChannelDeleteEvent
103
+
104
+ [
105
+ matches_all(@attributes[:type], event.type) do |a, e|
106
+ a == if a.is_a? String
107
+ e.name
108
+ else
109
+ e
110
+ end
111
+ end,
112
+ matches_all(@attributes[:name], event.name) do |a, e|
113
+ a == if a.is_a? String
114
+ e.to_s
115
+ else
116
+ e
117
+ end
118
+ end
119
+ ].reduce(true, &:&)
120
+ end
121
+ end
122
+
123
+ # Generic subclass for recipient events (add/remove)
124
+ class ChannelRecipientEvent < Event
125
+ # @return [Channel] the channel in question.
126
+ attr_reader :channel
127
+
128
+ delegate :name, :server, :type, :owner_id, :recipients, :topic, :user_limit, :position, :permission_overwrites, to: :channel
129
+
130
+ # @return [Recipient] the recipient that was added/removed from the group
131
+ attr_reader :recipient
132
+
133
+ delegate :id, to: :recipient
134
+
135
+ def initialize(data, bot)
136
+ @bot = bot
137
+
138
+ @channel = bot.channel(data["channel_id"].to_i)
139
+ recipient = data["user"]
140
+ recipient_user = bot.ensure_user(recipient)
141
+ @recipient = Rubycord::Recipient.new(recipient_user, @channel, bot)
142
+ end
143
+ end
144
+
145
+ # Generic event handler for channel recipient events
146
+ class ChannelRecipientEventHandler < EventHandler
147
+ def matches?(event)
148
+ # Check for the proper event type
149
+ return false unless event.is_a? ChannelRecipientEvent
150
+
151
+ [
152
+ matches_all(@attributes[:owner_id], event.owner_id) do |a, e|
153
+ a.resolve_id == e.resolve_id
154
+ end,
155
+ matches_all(@attributes[:id], event.id) do |a, e|
156
+ a.resolve_id == e.resolve_id
157
+ end,
158
+ matches_all(@attributes[:name], event.name) do |a, e|
159
+ a == if a.is_a? String
160
+ e.to_s
161
+ else
162
+ e
163
+ end
164
+ end
165
+ ]
166
+ end
167
+ end
168
+
169
+ # Raised when a user is added to a private channel
170
+ class ChannelRecipientAddEvent < ChannelRecipientEvent; end
171
+
172
+ # Event handler for ChannelRecipientAddEvent
173
+ class ChannelRecipientAddEventHandler < ChannelRecipientEventHandler; end
174
+
175
+ # Raised when a recipient that isn't the bot leaves or is kicked from a group channel
176
+ class ChannelRecipientRemoveEvent < ChannelRecipientEvent; end
177
+
178
+ # Event handler for ChannelRecipientRemoveEvent
179
+ class ChannelRecipientRemoveEventHandler < ChannelRecipientEventHandler; end
180
+
181
+ # Raised when a channel is updated (e.g. topic changes)
182
+ class ChannelUpdateEvent < ChannelCreateEvent; end
183
+
184
+ # Event handler for ChannelUpdateEvent
185
+ class ChannelUpdateEventHandler < ChannelCreateEventHandler; end
186
+ end
@@ -0,0 +1,126 @@
1
+ # Events used by rubycord
2
+ module Rubycord::Events
3
+ # A negated object, used to not match something in event parameters.
4
+ # @see Rubycord::Events.matches_all
5
+ class Negated
6
+ attr_reader :object
7
+
8
+ def initialize(object)
9
+ @object = object
10
+ end
11
+ end
12
+
13
+ # Attempts to match possible formats of event attributes to a set comparison value, using a comparison block.
14
+ # It allows five kinds of attribute formats:
15
+ # 0. nil -> always returns true
16
+ # 1. A single attribute, not negated
17
+ # 2. A single attribute, negated
18
+ # 3. An array of attributes, not negated
19
+ # 4. An array of attributes, not negated
20
+ # Note that it doesn't allow an array of negated attributes. For info on negation stuff, see {::#not!}
21
+ # @param attributes [Object, Array<Object>, Negated<Object>, Negated<Array<Object>>, nil] One or more attributes to
22
+ # compare to the to_check value.
23
+ # @param to_check [Object] What to compare the attributes to.
24
+ # @yield [a, e] The block will be called when a comparison happens.
25
+ # @yieldparam [Object] a The attribute to compare to the value to check. Will always be a single not-negated object,
26
+ # all the negation and array handling is done by the method
27
+ # @yieldparam [Object] e The value to compare the attribute to. Will always be the value passed to the function as
28
+ # to_check.
29
+ # @yieldreturn [true, false] Whether or not the attribute a matches the given comparison value e.
30
+ # @return [true, false] whether the attributes match the comparison value in at least one way.
31
+ def self.matches_all(attributes, to_check, &)
32
+ # "Zeroth" case: attributes is nil
33
+ return true if attributes.nil?
34
+
35
+ # First case: there's a single negated attribute
36
+ if attributes.is_a? Negated
37
+ # The contained object might also be an array, so recursively call matches_all (and negate the result)
38
+ return !matches_all(attributes.object, to_check, &)
39
+ end
40
+
41
+ # Second case: there's a single, not-negated attribute
42
+ return yield(attributes, to_check) unless attributes.is_a? Array
43
+
44
+ # Third case: it's an array of attributes
45
+ attributes.reduce(false) do |result, element|
46
+ result || yield(element, to_check)
47
+ end
48
+ end
49
+
50
+ # Generic event class that can be extended
51
+ class Event
52
+ # @return [Bot] the bot used to initialize this event.
53
+ attr_reader :bot
54
+
55
+ class << self
56
+ protected
57
+
58
+ # Delegates a list of methods to a particular object. This is essentially a reimplementation of ActiveSupport's
59
+ # `#delegate`, but without the overhead provided by the rest. Used in subclasses of `Event` to delegate properties
60
+ # on events to properties on data objects.
61
+ # @param methods [Array<Symbol>] The methods to delegate.
62
+ # @param hash [Hash<Symbol => Symbol>] A hash with one `:to` key and the value the method to be delegated to.
63
+ def delegate(*methods, hash)
64
+ methods.each do |e|
65
+ define_method(e) do
66
+ object = __send__(hash[:to])
67
+ object.__send__(e)
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ # Generic event handler that can be extended
75
+ class EventHandler
76
+ def initialize(attributes, block)
77
+ @attributes = attributes
78
+ @block = block
79
+ end
80
+
81
+ # Whether or not this event handler matches the given event with its attributes.
82
+ # @raise [RuntimeError] if this method is called - overwrite it in your event handler!
83
+ def matches?(_)
84
+ raise "Attempted to call matches?() from a generic EventHandler"
85
+ end
86
+
87
+ # Checks whether this handler matches the given event, and then calls it.
88
+ # @param event [Object] The event object to match and call the handler with
89
+ def match(event)
90
+ call(event) if matches? event
91
+ end
92
+
93
+ # Calls this handler
94
+ # @param event [Object] The event object to call this handler with
95
+ def call(event)
96
+ @block.call(event)
97
+ end
98
+
99
+ # to be overwritten by extending event handlers
100
+ def after_call(event)
101
+ end
102
+
103
+ # @see Rubycord::Events::matches_all
104
+ def matches_all(attributes, to_check, &)
105
+ Rubycord::Events.matches_all(attributes, to_check, &)
106
+ end
107
+ end
108
+
109
+ # Event handler that matches all events. Only useful for making an event that has no attributes, such as {ReadyEvent}.
110
+ class TrueEventHandler < EventHandler
111
+ # Always returns true.
112
+ # @return [true]
113
+ def matches?(_)
114
+ true
115
+ end
116
+ end
117
+ end
118
+
119
+ # Utility function that creates a negated object for {Rubycord::Events.matches_all}
120
+ # @param [Object] object The object to negate
121
+ # @see Rubycord::Events::Negated
122
+ # @see Rubycord::Events.matches_all
123
+ # @return [Negated<Object>] the object, negated, as an attribute to pass to matches_all
124
+ def not!(object)
125
+ Rubycord::Events::Negated.new(object)
126
+ end
@@ -0,0 +1,191 @@
1
+ require "rubycord/events/generic"
2
+ require "rubycord/data"
3
+
4
+ module Rubycord::Events
5
+ # Generic subclass for server events (create/update/delete)
6
+ class ServerEvent < Event
7
+ # @return [Server] the server in question.
8
+ attr_reader :server
9
+
10
+ def initialize(data, bot)
11
+ @bot = bot
12
+
13
+ init_server(data, bot)
14
+ end
15
+
16
+ # Initializes this event with server data. Should be overwritten in case the server doesn't exist at the time
17
+ # of event creation (e. g. {ServerDeleteEvent})
18
+ def init_server(data, bot)
19
+ @server = bot.server(data["id"].to_i)
20
+ end
21
+ end
22
+
23
+ # Generic event handler for member events
24
+ class ServerEventHandler < EventHandler
25
+ def matches?(event)
26
+ # Check for the proper event type
27
+ return false unless event.is_a? ServerEvent
28
+
29
+ [
30
+ matches_all(@attributes[:server], event.server) do |a, e|
31
+ a == case a
32
+ when String
33
+ e.name
34
+ when Integer
35
+ e.id
36
+ else
37
+ e
38
+ end
39
+ end
40
+ ].reduce(true, &:&)
41
+ end
42
+ end
43
+
44
+ # Server is created
45
+ # @see Rubycord::EventContainer#server_create
46
+ class ServerCreateEvent < ServerEvent; end
47
+
48
+ # Event handler for {ServerCreateEvent}
49
+ class ServerCreateEventHandler < ServerEventHandler; end
50
+
51
+ # Server is updated (e.g. name changed)
52
+ # @see Rubycord::EventContainer#server_update
53
+ class ServerUpdateEvent < ServerEvent; end
54
+
55
+ # Event handler for {ServerUpdateEvent}
56
+ class ServerUpdateEventHandler < ServerEventHandler; end
57
+
58
+ # Server is deleted, the server was left because the bot was kicked, or the
59
+ # bot made itself leave the server.
60
+ # @see Rubycord::EventContainer#server_delete
61
+ class ServerDeleteEvent < ServerEvent
62
+ # @return [Integer] The ID of the server that was left.
63
+ attr_reader :server
64
+
65
+ # Override init_server to account for the deleted server
66
+ def init_server(data, _bot)
67
+ @server = data["id"].to_i
68
+ end
69
+ end
70
+
71
+ # Event handler for {ServerDeleteEvent}
72
+ class ServerDeleteEventHandler < ServerEventHandler; end
73
+
74
+ # Emoji is created/deleted/updated
75
+ class ServerEmojiChangeEvent < ServerEvent
76
+ # @return [Server] the server in question.
77
+ attr_reader :server
78
+
79
+ # @return [Array<Emoji>] array of emojis.
80
+ attr_reader :emoji
81
+
82
+ def initialize(server, data, bot)
83
+ @bot = bot
84
+ @server = server
85
+ process_emoji(data)
86
+ end
87
+
88
+ # @!visibility private
89
+ def process_emoji(data)
90
+ @emoji = data["emojis"].map do |e|
91
+ @server.emoji[e["id"]]
92
+ end
93
+ end
94
+ end
95
+
96
+ # Generic event helper for when an emoji is either created or deleted
97
+ class ServerEmojiCDEvent < ServerEvent
98
+ # @return [Server] the server in question.
99
+ attr_reader :server
100
+
101
+ # @return [Emoji] the emoji data.
102
+ attr_reader :emoji
103
+
104
+ def initialize(server, emoji, bot)
105
+ @bot = bot
106
+ @emoji = emoji
107
+ @server = server
108
+ end
109
+ end
110
+
111
+ # Emoji is created
112
+ class ServerEmojiCreateEvent < ServerEmojiCDEvent; end
113
+
114
+ # Emoji is deleted
115
+ class ServerEmojiDeleteEvent < ServerEmojiCDEvent; end
116
+
117
+ # Emoji is updated
118
+ class ServerEmojiUpdateEvent < ServerEvent
119
+ # @return [Server] the server in question.
120
+ attr_reader :server
121
+
122
+ # @return [Emoji, nil] the emoji data before the event.
123
+ attr_reader :old_emoji
124
+
125
+ # @return [Emoji, nil] the updated emoji data.
126
+ attr_reader :emoji
127
+
128
+ def initialize(server, old_emoji, emoji, bot)
129
+ @bot = bot
130
+ @old_emoji = old_emoji
131
+ @emoji = emoji
132
+ @server = server
133
+ end
134
+ end
135
+
136
+ # Event handler for {ServerEmojiChangeEvent}
137
+ class ServerEmojiChangeEventHandler < ServerEventHandler; end
138
+
139
+ # Generic handler for emoji create and delete
140
+ class ServerEmojiCDEventHandler < ServerEventHandler
141
+ def matches?(event)
142
+ # Check for the proper event type
143
+ return false unless event.is_a? ServerEmojiCDEvent
144
+
145
+ [
146
+ matches_all(@attributes[:server], event.server) do |a, e|
147
+ a == case a
148
+ when String
149
+ e.name
150
+ when Integer
151
+ e.id
152
+ else
153
+ e
154
+ end
155
+ end,
156
+ matches_all(@attributes[:id], event.emoji.id) { |a, e| a.resolve_id == e.resolve_id },
157
+ matches_all(@attributes[:name], event.emoji.name) { |a, e| a == e }
158
+ ].reduce(true, &:&)
159
+ end
160
+ end
161
+
162
+ # Event handler for {ServerEmojiCreateEvent}
163
+ class ServerEmojiCreateEventHandler < ServerEmojiCDEventHandler; end
164
+
165
+ # Event handler for {ServerEmojiDeleteEvent}
166
+ class ServerEmojiDeleteEventHandler < ServerEmojiCDEventHandler; end
167
+
168
+ # Event handler for {ServerEmojiUpdateEvent}
169
+ class ServerEmojiUpdateEventHandler < EventHandler
170
+ def matches?(event)
171
+ # Check for the proper event type
172
+ return false unless event.is_a? ServerEmojiUpdateEvent
173
+
174
+ [
175
+ matches_all(@attributes[:server], event.server) do |a, e|
176
+ a == case a
177
+ when String
178
+ e.name
179
+ when Integer
180
+ e.id
181
+ else
182
+ e
183
+ end
184
+ end,
185
+ matches_all(@attributes[:id], event.old_emoji.id) { |a, e| a.resolve_id == e.resolve_id },
186
+ matches_all(@attributes[:old_name], event.old_emoji.name) { |a, e| a == e },
187
+ matches_all(@attributes[:name], event.emoji.name) { |a, e| a == e }
188
+ ].reduce(true, &:&)
189
+ end
190
+ end
191
+ end