rubycord 1.0.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 (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