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,156 @@
1
+ require "rubycord/events/generic"
2
+ require "rubycord/data"
3
+
4
+ module Rubycord::Events
5
+ # Generic superclass for events about adding and removing reactions
6
+ class ReactionEvent < Event
7
+ include Respondable
8
+
9
+ # @return [Emoji] the emoji that was reacted with.
10
+ attr_reader :emoji
11
+
12
+ # @!visibility private
13
+ attr_reader :message_id
14
+
15
+ def initialize(data, bot)
16
+ @bot = bot
17
+
18
+ @emoji = Rubycord::Emoji.new(data["emoji"], bot, nil)
19
+ @user_id = data["user_id"].to_i
20
+ @message_id = data["message_id"].to_i
21
+ @channel_id = data["channel_id"].to_i
22
+ end
23
+
24
+ # @return [User, Member] the user that reacted to this message, or member if a server exists.
25
+ def user
26
+ # Cache the user so we don't do requests all the time
27
+ @user ||= if server
28
+ @server.member(@user_id)
29
+ else
30
+ @bot.user(@user_id)
31
+ end
32
+ end
33
+
34
+ # @return [Message] the message that was reacted to.
35
+ def message
36
+ @message ||= channel.load_message(@message_id)
37
+ end
38
+
39
+ # @return [Channel] the channel that was reacted in.
40
+ def channel
41
+ @channel ||= @bot.channel(@channel_id)
42
+ end
43
+
44
+ # @return [Server, nil] the server that was reacted in. If reacted in a PM channel, it will be nil.
45
+ def server
46
+ @server ||= channel.server
47
+ end
48
+ end
49
+
50
+ # Generic superclass for event handlers pertaining to adding and removing reactions
51
+ class ReactionEventHandler < EventHandler
52
+ def matches?(event)
53
+ # Check for the proper event type
54
+ return false unless event.is_a? ReactionEvent
55
+
56
+ [
57
+ matches_all(@attributes[:emoji], event.emoji) do |a, e|
58
+ case a
59
+ when Integer
60
+ e.id == a
61
+ when String
62
+ e.name == a || e.name == a.delete(":") || e.id == a.resolve_id
63
+ else
64
+ e == a
65
+ end
66
+ end,
67
+ matches_all(@attributes[:message], event.message_id) do |a, e|
68
+ a == e
69
+ end,
70
+ matches_all(@attributes[:in], event.channel) do |a, e|
71
+ case a
72
+ when String
73
+ # Make sure to remove the "#" from channel names in case it was specified
74
+ a.delete("#") == e.name
75
+ when Integer
76
+ a == e.id
77
+ else
78
+ a == e
79
+ end
80
+ end,
81
+ matches_all(@attributes[:from], event.user) do |a, e|
82
+ case a
83
+ when String
84
+ a == e.name
85
+ when :bot
86
+ e.current_bot?
87
+ else
88
+ a == e
89
+ end
90
+ end
91
+ ].reduce(true, &:&)
92
+ end
93
+ end
94
+
95
+ # Event raised when somebody reacts to a message
96
+ class ReactionAddEvent < ReactionEvent; end
97
+
98
+ # Event handler for {ReactionAddEvent}
99
+ class ReactionAddEventHandler < ReactionEventHandler; end
100
+
101
+ # Event raised when somebody removes a reaction to a message
102
+ class ReactionRemoveEvent < ReactionEvent; end
103
+
104
+ # Event handler for {ReactionRemoveEvent}
105
+ class ReactionRemoveEventHandler < ReactionEventHandler; end
106
+
107
+ # Event raised when somebody removes all reactions from a message
108
+ class ReactionRemoveAllEvent < Event
109
+ include Respondable
110
+
111
+ # @!visibility private
112
+ attr_reader :message_id
113
+
114
+ def initialize(data, bot)
115
+ @bot = bot
116
+
117
+ @message_id = data["message_id"].to_i
118
+ @channel_id = data["channel_id"].to_i
119
+ end
120
+
121
+ # @return [Channel] the channel where the removal occurred.
122
+ def channel
123
+ @channel ||= @bot.channel(@channel_id)
124
+ end
125
+
126
+ # @return [Message] the message all reactions were removed from.
127
+ def message
128
+ @message ||= channel.load_message(@message_id)
129
+ end
130
+ end
131
+
132
+ # Event handler for {ReactionRemoveAllEvent}
133
+ class ReactionRemoveAllEventHandler < EventHandler
134
+ def matches?(event)
135
+ # Check for the proper event type
136
+ return false unless event.is_a? ReactionRemoveAllEvent
137
+
138
+ [
139
+ matches_all(@attributes[:message], event.message_id) do |a, e|
140
+ a == e
141
+ end,
142
+ matches_all(@attributes[:in], event.channel) do |a, e|
143
+ case a
144
+ when String
145
+ # Make sure to remove the "#" from channel names in case it was specified
146
+ a.delete("#") == e.name
147
+ when Integer
148
+ a == e.id
149
+ else
150
+ a == e
151
+ end
152
+ end
153
+ ].reduce(true, &:&)
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,86 @@
1
+ require "rubycord/events/generic"
2
+ require "rubycord/data"
3
+
4
+ module Rubycord::Events
5
+ # Raised when a role is created on a server
6
+ class ServerRoleCreateEvent < Event
7
+ # @return [Role] the role that got created
8
+ attr_reader :role
9
+
10
+ # @return [Server] the server on which a role got created
11
+ attr_reader :server
12
+
13
+ # @!attribute [r] name
14
+ # @return [String] this role's name
15
+ # @see Role#name
16
+ delegate :name, to: :role
17
+
18
+ def initialize(data, bot)
19
+ @bot = bot
20
+
21
+ @server = bot.server(data["guild_id"].to_i)
22
+ return unless @server
23
+
24
+ role_id = data["role"]["id"].to_i
25
+ @role = @server.roles.find { |r| r.id == role_id }
26
+ end
27
+ end
28
+
29
+ # Event handler for ServerRoleCreateEvent
30
+ class ServerRoleCreateEventHandler < EventHandler
31
+ def matches?(event)
32
+ # Check for the proper event type
33
+ return false unless event.is_a? ServerRoleCreateEvent
34
+
35
+ [
36
+ matches_all(@attributes[:name], event.name) do |a, e|
37
+ a == if a.is_a? String
38
+ e.to_s
39
+ else
40
+ e
41
+ end
42
+ end
43
+ ].reduce(true, &:&)
44
+ end
45
+ end
46
+
47
+ # Raised when a role is deleted from a server
48
+ class ServerRoleDeleteEvent < Event
49
+ # @return [Integer] the ID of the role that got deleted.
50
+ attr_reader :id
51
+
52
+ # @return [Server] the server on which a role got deleted.
53
+ attr_reader :server
54
+
55
+ def initialize(data, bot)
56
+ @bot = bot
57
+
58
+ # The role should already be deleted from the server's list
59
+ # by the time we create this event, so we'll create a temporary
60
+ # role object for event consumers to use.
61
+ @id = data["role_id"].to_i
62
+ server_id = data["guild_id"].to_i
63
+ @server = bot.server(server_id)
64
+ end
65
+ end
66
+
67
+ # EventHandler for ServerRoleDeleteEvent
68
+ class ServerRoleDeleteEventHandler < EventHandler
69
+ def matches?(event)
70
+ # Check for the proper event type
71
+ return false unless event.is_a? ServerRoleDeleteEvent
72
+
73
+ [
74
+ matches_all(@attributes[:id], event.id) do |a, e|
75
+ a.resolve_id == e.resolve_id
76
+ end
77
+ ].reduce(true, &:&)
78
+ end
79
+ end
80
+
81
+ # Event raised when a role updates on a server
82
+ class ServerRoleUpdateEvent < ServerRoleCreateEvent; end
83
+
84
+ # Event handler for ServerRoleUpdateEvent
85
+ class ServerRoleUpdateEventHandler < ServerRoleCreateEventHandler; end
86
+ end
@@ -0,0 +1,94 @@
1
+ module Rubycord::Events
2
+ # Raised when a thread is created
3
+ class ThreadCreateEvent < Event
4
+ # @return [Channel] the thread in question.
5
+ attr_reader :thread
6
+
7
+ delegate :name, :server, :owner, :parent_channel, :thread_metadata, to: :thread
8
+
9
+ def initialize(data, bot)
10
+ @bot = bot
11
+ @thread = data.is_a?(Rubycord::Channel) ? data : bot.channel(data["id"].to_i)
12
+ end
13
+ end
14
+
15
+ # Event handler for ChannelCreateEvent
16
+ class ThreadCreateEventHandler < EventHandler
17
+ def matches?(event)
18
+ # Check for the proper event type
19
+ return false unless event.is_a? ThreadCreateEvent
20
+
21
+ [
22
+ matches_all(@attributes[:name], event.name) do |a, e|
23
+ a == if a.is_a? String
24
+ e.to_s
25
+ else
26
+ e
27
+ end
28
+ end,
29
+ matches_all(@attributes[:server], event.server) do |a, e|
30
+ a.resolve_id == e.resolve_id
31
+ end,
32
+ matches_all(@attributes[:invitable], event.thread.invitable) do |a, e|
33
+ a == e
34
+ end,
35
+ matches_all(@attributes[:owner], event.thread.owner) do |a, e|
36
+ a.resolve_id == e.resolve_id
37
+ end,
38
+ matches_all(@attributes[:channel], event.thread.parent) do |a, e|
39
+ a.resolve_id == e.resolve_id
40
+ end
41
+ ].reduce(true, &:&)
42
+ end
43
+ end
44
+
45
+ # Raised when a thread is updated (e.g. name changes)
46
+ class ThreadUpdateEvent < ThreadCreateEvent; end
47
+
48
+ # Event handler for ThreadUpdateEvent
49
+ class ThreadUpdateEventHandler < ThreadCreateEventHandler
50
+ def matches?(event)
51
+ # Check for the proper event type
52
+ return false unless event.is_a? ThreadUpdateEvent
53
+
54
+ super
55
+ end
56
+ end
57
+
58
+ # Raised when members are added or removed from a thread.
59
+ class ThreadMembersUpdateEvent < Event
60
+ # @return [Channel]
61
+ attr_reader :thread
62
+
63
+ # @return [Array<Member, User>]
64
+ attr_reader :added_members
65
+
66
+ # @return [Array<Integer>]
67
+ attr_reader :removed_member_ids
68
+
69
+ # @return [Integer]
70
+ attr_reader :member_count
71
+
72
+ delegate :name, :server, :owner, :parent_channel, :thread_metadata, to: :thread
73
+
74
+ def initialize(data, bot)
75
+ @bot = bot
76
+ @thread = data.is_a?(Rubycord::Channel) ? data : bot.channel(data["id"].to_i)
77
+ @added_members = data["added_members"]&.map do |member|
78
+ data["guild_id"] ? bot.member(data["guild_id"], member["user_id"]) : bot.user(member["user_id"])
79
+ end || []
80
+ @removed_member_ids = data["removed_member_ids"]&.map(&:resolve_id) || []
81
+ @member_count = data["member_count"]
82
+ end
83
+ end
84
+
85
+ # Event handler for ThreadMembersUpdateEvent
86
+ class ThreadMembersUpdateEventHandler < ThreadCreateEventHandler
87
+ def matches?(event)
88
+ # Check for the proper event type
89
+ return false unless event.is_a? ThreadMembersUpdateEvent
90
+
91
+ super
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,70 @@
1
+ require "rubycord/events/generic"
2
+
3
+ module Rubycord::Events
4
+ # Event raised when a user starts typing
5
+ class TypingEvent < Event
6
+ include Respondable
7
+
8
+ # @return [Channel] the channel on which a user started typing.
9
+ attr_reader :channel
10
+
11
+ # @return [User, Member, Recipient] the user that started typing.
12
+ attr_reader :user
13
+ alias_method :member, :user
14
+
15
+ # @return [Time] when the typing happened.
16
+ attr_reader :timestamp
17
+
18
+ def initialize(data, bot)
19
+ @bot = bot
20
+
21
+ @user_id = data["user_id"].to_i
22
+
23
+ @channel_id = data["channel_id"].to_i
24
+ @channel = bot.channel(@channel_id)
25
+
26
+ @user = if channel.pm?
27
+ channel.recipient
28
+ elsif channel.group?
29
+ bot.user(@user_id)
30
+ else
31
+ bot.member(@channel.server.id, @user_id)
32
+ end
33
+
34
+ @timestamp = Time.at(data["timestamp"].to_i)
35
+ end
36
+ end
37
+
38
+ # Event handler for TypingEvent
39
+ class TypingEventHandler < EventHandler
40
+ def matches?(event)
41
+ # Check for the proper event type
42
+ return false unless event.is_a? TypingEvent
43
+
44
+ [
45
+ matches_all(@attributes[:in], event.channel) do |a, e|
46
+ case a
47
+ when String
48
+ a.delete("#") == e.name
49
+ when Integer
50
+ a == e.id
51
+ else
52
+ a == e
53
+ end
54
+ end,
55
+ matches_all(@attributes[:from], event.user) do |a, e|
56
+ a == case a
57
+ when String
58
+ e.name
59
+ when Integer
60
+ e.id
61
+ else
62
+ e
63
+ end
64
+ end,
65
+ matches_all(@attributes[:after], event.timestamp) { |a, e| a > e },
66
+ matches_all(@attributes[:before], event.timestamp) { |a, e| a < e }
67
+ ].reduce(true, &:&)
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,45 @@
1
+ require "rubycord/events/generic"
2
+ require "rubycord/data"
3
+
4
+ module Rubycord::Events
5
+ # Event raised when a server's voice server is updating.
6
+ # Sent when initially connecting to voice and when a voice instance fails
7
+ # over to a new server.
8
+ # This event is exposed for use with library agnostic interfaces like telecom and
9
+ # lavalink.
10
+ class VoiceServerUpdateEvent < Event
11
+ # @return [String] The voice connection token
12
+ attr_reader :token
13
+
14
+ # @return [Server] The server this update is for.
15
+ attr_reader :server
16
+
17
+ # @return [String] The voice server host.
18
+ attr_reader :endpoint
19
+
20
+ def initialize(data, bot)
21
+ @bot = bot
22
+
23
+ @token = data["token"]
24
+ @endpoint = data["endpoint"]
25
+ @server = bot.server(data["guild_id"])
26
+ end
27
+ end
28
+
29
+ # Event handler for VoiceServerUpdateEvent
30
+ class VoiceServerUpdateEventHandler < EventHandler
31
+ def matches?(event)
32
+ return false unless event.is_a? VoiceServerUpdateEvent
33
+
34
+ [
35
+ matches_all(@attributes[:from], event.server) do |a, e|
36
+ a == if a.is_a? String
37
+ e.name
38
+ else
39
+ e
40
+ end
41
+ end
42
+ ]
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,103 @@
1
+ require "rubycord/events/generic"
2
+ require "rubycord/data"
3
+
4
+ module Rubycord::Events
5
+ # Event raised when a user's voice state updates
6
+ class VoiceStateUpdateEvent < Event
7
+ attr_reader :user, :token, :suppress, :session_id, :self_mute, :self_deaf, :mute, :deaf, :server, :channel
8
+
9
+ # @return [Channel, nil] the old channel this user was on, or nil if the user is newly joining voice.
10
+ attr_reader :old_channel
11
+
12
+ def initialize(data, old_channel_id, bot)
13
+ @bot = bot
14
+
15
+ @token = data["token"]
16
+ @suppress = data["suppress"]
17
+ @session_id = data["session_id"]
18
+ @self_mute = data["self_mute"]
19
+ @self_deaf = data["self_deaf"]
20
+ @mute = data["mute"]
21
+ @deaf = data["deaf"]
22
+ @server = bot.server(data["guild_id"].to_i)
23
+ return unless @server
24
+
25
+ @channel = bot.channel(data["channel_id"].to_i) if data["channel_id"]
26
+ @old_channel = bot.channel(old_channel_id) if old_channel_id
27
+ @user = bot.user(data["user_id"].to_i)
28
+ end
29
+ end
30
+
31
+ # Event handler for VoiceStateUpdateEvent
32
+ class VoiceStateUpdateEventHandler < EventHandler
33
+ def matches?(event)
34
+ # Check for the proper event type
35
+ return false unless event.is_a? VoiceStateUpdateEvent
36
+
37
+ [
38
+ matches_all(@attributes[:from], event.user) do |a, e|
39
+ a == case a
40
+ when String
41
+ e.name
42
+ when Integer
43
+ e.id
44
+ else
45
+ e
46
+ end
47
+ end,
48
+ matches_all(@attributes[:mute], event.mute) do |a, e|
49
+ a == if a.is_a? String
50
+ e.to_s
51
+ else
52
+ e
53
+ end
54
+ end,
55
+ matches_all(@attributes[:deaf], event.deaf) do |a, e|
56
+ a == if a.is_a? String
57
+ e.to_s
58
+ else
59
+ e
60
+ end
61
+ end,
62
+ matches_all(@attributes[:self_mute], event.self_mute) do |a, e|
63
+ a == if a.is_a? String
64
+ e.to_s
65
+ else
66
+ e
67
+ end
68
+ end,
69
+ matches_all(@attributes[:self_deaf], event.self_deaf) do |a, e|
70
+ a == if a.is_a? String
71
+ e.to_s
72
+ else
73
+ e
74
+ end
75
+ end,
76
+ matches_all(@attributes[:channel], event.channel) do |a, e|
77
+ next unless e # Don't bother if the channel is nil
78
+
79
+ a == case a
80
+ when String
81
+ e.name
82
+ when Integer
83
+ e.id
84
+ else
85
+ e
86
+ end
87
+ end,
88
+ matches_all(@attributes[:old_channel], event.old_channel) do |a, e|
89
+ next unless e # Don't bother if the channel is nil
90
+
91
+ a == case a
92
+ when String
93
+ e.name
94
+ when Integer
95
+ e.id
96
+ else
97
+ e
98
+ end
99
+ end
100
+ ].reduce(true, &:&)
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,62 @@
1
+ require "rubycord/events/generic"
2
+ require "rubycord/data"
3
+
4
+ module Rubycord::Events
5
+ # Event raised when a webhook is updated
6
+ class WebhookUpdateEvent < Event
7
+ # @return [Server] the server where the webhook updated
8
+ attr_reader :server
9
+
10
+ # @return [Channel] the channel the webhook is associated to
11
+ attr_reader :channel
12
+
13
+ def initialize(data, bot)
14
+ @bot = bot
15
+
16
+ @server = bot.server(data["guild_id"].to_i)
17
+ @channel = bot.channel(data["channel_id"].to_i)
18
+ end
19
+ end
20
+
21
+ # Event handler for {WebhookUpdateEvent}
22
+ class WebhookUpdateEventHandler < EventHandler
23
+ def matches?(event)
24
+ # Check for the proper event type
25
+ return false unless event.is_a? WebhookUpdateEvent
26
+
27
+ [
28
+ matches_all(@attributes[:server], event.server) do |a, e|
29
+ a == case a
30
+ when String
31
+ e.name
32
+ when Integer
33
+ e.id
34
+ else
35
+ e
36
+ end
37
+ end,
38
+ matches_all(@attributes[:channel], event.channel) do |a, e|
39
+ case a
40
+ when String
41
+ # Make sure to remove the "#" from channel names in case it was specified
42
+ a.delete("#") == e.name
43
+ when Integer
44
+ a == e.id
45
+ else
46
+ a == e
47
+ end
48
+ end,
49
+ matches_all(@attributes[:webhook], event) do |a, e|
50
+ a == case a
51
+ when String
52
+ e.name
53
+ when Integer
54
+ e.id
55
+ else
56
+ e
57
+ end
58
+ end
59
+ ].reduce(true, &:&)
60
+ end
61
+ end
62
+ end