discorb 0.15.0 → 0.15.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +6 -2
  3. data/Changelog.md +9 -0
  4. data/Rakefile +6 -0
  5. data/docs/events.md +50 -0
  6. data/lib/discorb/allowed_mentions.rb +7 -0
  7. data/lib/discorb/app_command/command.rb +64 -2
  8. data/lib/discorb/application.rb +16 -7
  9. data/lib/discorb/asset.rb +9 -0
  10. data/lib/discorb/attachment.rb +16 -1
  11. data/lib/discorb/audit_logs.rb +42 -4
  12. data/lib/discorb/channel.rb +42 -3
  13. data/lib/discorb/client.rb +4 -0
  14. data/lib/discorb/common.rb +17 -3
  15. data/lib/discorb/components/button.rb +5 -6
  16. data/lib/discorb/components/select_menu.rb +2 -16
  17. data/lib/discorb/dictionary.rb +2 -0
  18. data/lib/discorb/embed.rb +33 -7
  19. data/lib/discorb/emoji.rb +29 -2
  20. data/lib/discorb/emoji_table.rb +1 -1
  21. data/lib/discorb/error.rb +7 -1
  22. data/lib/discorb/event.rb +27 -17
  23. data/lib/discorb/gateway.rb +79 -22
  24. data/lib/discorb/gateway_requests.rb +4 -7
  25. data/lib/discorb/guild.rb +67 -33
  26. data/lib/discorb/guild_template.rb +24 -3
  27. data/lib/discorb/http.rb +7 -2
  28. data/lib/discorb/integration.rb +23 -8
  29. data/lib/discorb/intents.rb +7 -7
  30. data/lib/discorb/interaction/autocomplete.rb +2 -2
  31. data/lib/discorb/interaction/command.rb +32 -3
  32. data/lib/discorb/interaction/components.rb +14 -1
  33. data/lib/discorb/interaction/response.rb +12 -0
  34. data/lib/discorb/interaction/root.rb +15 -0
  35. data/lib/discorb/invite.rb +11 -7
  36. data/lib/discorb/log.rb +4 -4
  37. data/lib/discorb/member.rb +21 -0
  38. data/lib/discorb/message.rb +9 -1
  39. data/lib/discorb/message_meta.rb +38 -9
  40. data/lib/discorb/permission.rb +14 -5
  41. data/lib/discorb/presence.rb +41 -8
  42. data/lib/discorb/rate_limit.rb +5 -0
  43. data/lib/discorb/reaction.rb +6 -0
  44. data/lib/discorb/role.rb +12 -0
  45. data/lib/discorb/sticker.rb +22 -14
  46. data/lib/discorb/user.rb +11 -0
  47. data/lib/discorb/voice_state.rb +20 -2
  48. data/lib/discorb/webhook.rb +52 -1
  49. data/lib/discorb.rb +3 -1
  50. data/sig/discorb.rbs +6850 -5836
  51. metadata +2 -2
@@ -5,7 +5,9 @@ module Discorb
5
5
  # Represents an activity for Gateway Command.
6
6
  #
7
7
  class Activity
8
- @types = {
8
+ # @private
9
+ # @return [{Symbol => Integer}] The mapping of activity types.
10
+ TYPES = {
9
11
  playing: 0,
10
12
  streaming: 1,
11
13
  listening: 2,
@@ -22,7 +24,7 @@ module Discorb
22
24
  #
23
25
  def initialize(name, type = :playing, url = nil)
24
26
  @name = name
25
- @type = self.class.types[type]
27
+ @type = TYPES[type] or raise ArgumentError, "Invalid activity type: #{type}"
26
28
  @url = url
27
29
  end
28
30
 
@@ -42,10 +44,5 @@ module Discorb
42
44
  def inspect
43
45
  "#<#{self.class} @type=#{@type}>"
44
46
  end
45
-
46
- class << self
47
- # @private
48
- attr_reader :types
49
- end
50
47
  end
51
48
  end
data/lib/discorb/guild.rb CHANGED
@@ -115,27 +115,36 @@ module Discorb
115
115
  # @!attribute [r] me
116
116
  # @return [Discorb::Member] The client's member in the guild.
117
117
 
118
- @mfa_levels = %i[none elevated].freeze
119
- @nsfw_levels = %i[default explicit safe age_restricted].freeze
120
- @verification_levels = %i[none low medium high very_high].freeze
121
- @default_message_notifications = %i[all_messages only_mentions].freeze
122
- @explicit_content_filter = %i[disabled_in_text members_without_roles all_members].freeze
118
+ # @private
119
+ # @return [Array<Symbol>] The mapping of mfa_level.
120
+ MFA_LEVELS = %i[none elevated].freeze
121
+ # @private
122
+ # @return [Array<Symbol>] The mapping of nsfw_level.
123
+ NSFW_LEVELS = %i[default explicit safe age_restricted].freeze
124
+ # @private
125
+ # @return [Array<Symbol>] The mapping of verification_level.
126
+ VERIFICATION_LEVELS = %i[none low medium high very_high].freeze
127
+ # @private
128
+ # @return [Array<Symbol>] The mapping of default_message_notifications.
129
+ DEFAULT_MESSAGE_NOTIFICATIONS = %i[all_messages only_mentions].freeze
130
+ # @private
131
+ # @return [Array<Symbol>] The mapping of explicit_content_filter.
132
+ EXPLICIT_CONTENT_FILTER = %i[disabled_in_text members_without_roles all_members].freeze
123
133
 
134
+ #
135
+ # Creates a new guild object.
124
136
  # @private
137
+ #
138
+ # @param [Discorb::Client] client The client that owns this guild.
139
+ # @param [Hash] data The data of the guild.
140
+ # @param [Boolean] is_create_event Whether the guild is created by a `GUILD_CREATE` event.
141
+ #
125
142
  def initialize(client, data, is_create_event)
126
143
  @client = client
127
144
  @data = {}
128
145
  _set_data(data, is_create_event)
129
146
  end
130
147
 
131
- # @private
132
- def update!
133
- Async do
134
- _, data = @client.get("/guilds/#{@id}").wait
135
- _set_data(data, false)
136
- end
137
- end
138
-
139
148
  def afk_channel
140
149
  @client.channels[@afk_channel_id]
141
150
  end
@@ -242,9 +251,9 @@ module Discorb
242
251
  description: description,
243
252
  scheduled_start_time: start_time.iso8601,
244
253
  scheduled_end_time: end_time&.iso8601,
245
- privacy_level: Discorb::ScheduledEvent.privacy_level.key(privacy_level),
254
+ privacy_level: Discorb::ScheduledEvent::PRIVACY_LEVEL.key(privacy_level),
246
255
  channel_id: channel&.id,
247
- entity_type: Discorb::ScheduledEvent.entity_type.key(:stage_instance),
256
+ entity_type: Discorb::ScheduledEvent::ENTITY_TYPE.key(:stage_instance),
248
257
  }
249
258
  when :voice
250
259
  raise ArgumentError, "channel must be provided for voice events" unless channel
@@ -253,9 +262,9 @@ module Discorb
253
262
  description: description,
254
263
  scheduled_start_time: start_time.iso8601,
255
264
  scheduled_end_time: end_time&.iso8601,
256
- privacy_level: Discorb::ScheduledEvent.privacy_level.key(privacy_level),
265
+ privacy_level: Discorb::ScheduledEvent::PRIVACY_LEVEL.key(privacy_level),
257
266
  channel_id: channel&.id,
258
- entity_type: Discorb::ScheduledEvent.entity_type.key(:voice),
267
+ entity_type: Discorb::ScheduledEvent::ENTITY_TYPE.key(:voice),
259
268
  }
260
269
  when :external
261
270
  raise ArgumentError, "location must be provided for external events" unless location
@@ -265,8 +274,8 @@ module Discorb
265
274
  description: description,
266
275
  scheduled_start_time: start_time.iso8601,
267
276
  scheduled_end_time: end_time.iso8601,
268
- privacy_level: Discorb::ScheduledEvent.privacy_level.key(privacy_level),
269
- entity_type: Discorb::ScheduledEvent.entity_type.key(:external),
277
+ privacy_level: Discorb::ScheduledEvent::PRIVACY_LEVEL.key(privacy_level),
278
+ entity_type: Discorb::ScheduledEvent::ENTITY_TYPE.key(:external),
270
279
  entity_metadata: {
271
280
  location: location,
272
281
  },
@@ -858,7 +867,7 @@ module Discorb
858
867
  def fetch_voice_regions
859
868
  Async do
860
869
  _resp, data = @client.http.request(Route.new("/guilds/#{@id}/voice", "//guilds/:guild_id/voice", :get)).wait
861
- data.map { |d| VoiceRegion.new(@client, d) }
870
+ data.map { |d| VoiceRegion.new(d) }
862
871
  end
863
872
  end
864
873
 
@@ -871,7 +880,7 @@ module Discorb
871
880
  def fetch_invites
872
881
  Async do
873
882
  _resp, data = @client.http.request(Route.new("/guilds/#{@id}/invites", "//guilds/:guild_id/invites", :get)).wait
874
- data.map { |d| Invite.new(@client, d) }
883
+ data.map { |d| Invite.new(@client, d, false) }
875
884
  end
876
885
  end
877
886
 
@@ -884,7 +893,7 @@ module Discorb
884
893
  def fetch_integrations
885
894
  Async do
886
895
  _resp, data = @client.http.request(Route.new("/guilds/#{@id}/integrations", "//guilds/:guild_id/integrations", :get)).wait
887
- data.map { |d| Integration.new(@client, d) }
896
+ data.map { |d| Integration.new(@client, d, @id) }
888
897
  end
889
898
  end
890
899
 
@@ -1012,7 +1021,14 @@ module Discorb
1012
1021
  # @!attribute [r] url
1013
1022
  # @return [String] The vanity URL.
1014
1023
 
1024
+ #
1025
+ # Initialize a new instance of the {VanityInvite} class.
1015
1026
  # @private
1027
+ #
1028
+ # @param [Discorb::Client] client The client.
1029
+ # @param [Discorb::Guild] guild The guild.
1030
+ # @param [Hash] data The data of the invite.
1031
+ #
1016
1032
  def initialize(client, guild, data)
1017
1033
  @client = client
1018
1034
  @guild = guild
@@ -1047,7 +1063,14 @@ module Discorb
1047
1063
  # @!attribute [r] json_url
1048
1064
  # @return [String] The JSON URL.
1049
1065
 
1066
+ #
1067
+ # Initialize a new instance of the {Widget} class.
1050
1068
  # @private
1069
+ #
1070
+ # @param [Discorb::Client] client The client.
1071
+ # @param [Discorb::Snowflake] guild_id The guild ID.
1072
+ # @param [Hash] data The data from Discord.
1073
+ #
1051
1074
  def initialize(client, guild_id, data)
1052
1075
  @client = client
1053
1076
  @enabled = data[:enabled]
@@ -1097,7 +1120,7 @@ module Discorb
1097
1120
  def iframe(theme: "dark", width: 350, height: 500)
1098
1121
  [
1099
1122
  %(<iframe src="https://canary.discord.com/widget?id=#{@guild_id}&theme=#{theme}" width="#{width}" height="#{height}"),
1100
- %(allowtransparency="true" frameborder="0" sandbox="allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts"></iframe>)
1123
+ %(allowtransparency="true" frameborder="0" sandbox="allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts"></iframe>),
1101
1124
  ].join
1102
1125
  end
1103
1126
  end
@@ -1111,7 +1134,14 @@ module Discorb
1111
1134
  # @return [String] The reason for the ban.
1112
1135
  attr_reader :reason
1113
1136
 
1137
+ #
1138
+ # Initialize a new instance of the {Ban} class.
1114
1139
  # @private
1140
+ #
1141
+ # @param [Discorb::Client] client The client.
1142
+ # @param [Discorb::Guild] guild The guild.
1143
+ # @param [Hash] data The data from Discord.
1144
+ #
1115
1145
  def initialize(client, guild, data)
1116
1146
  @client = client
1117
1147
  @guild = guild
@@ -1121,9 +1151,6 @@ module Discorb
1121
1151
  end
1122
1152
 
1123
1153
  class << self
1124
- # @private
1125
- attr_reader :nsfw_levels, :mfa_levels, :verification_levels, :default_message_notifications, :explicit_content_filter
1126
-
1127
1154
  #
1128
1155
  # Returns a banner url from the guild's ID.
1129
1156
  #
@@ -1151,8 +1178,8 @@ module Discorb
1151
1178
  @name = data[:name]
1152
1179
  @members = Discorb::Dictionary.new
1153
1180
  data[:members]&.each do |m|
1154
- Member.new(@client, @id, m[:user], m)
1155
- end
1181
+ Member.new(@client, @id, m[:user], m)
1182
+ end
1156
1183
  @splash = data[:splash] && Asset.new(self, data[:splash], path: "splashes/#{@id}")
1157
1184
  @discovery_splash = data[:discovery_splash] && Asset.new(self, data[:discovery_splash], path: "discovery-splashes/#{@id}")
1158
1185
  @owner_id = data[:owner_id]
@@ -1170,10 +1197,10 @@ module Discorb
1170
1197
  @emojis[e[:id]] = CustomEmoji.new(@client, self, e)
1171
1198
  end
1172
1199
  @features = data[:features].map { |f| f.downcase.to_sym }
1173
- @mfa_level = self.class.mfa_levels[data[:mfa_level]]
1174
- @verification_level = self.class.verification_levels[data[:verification_level]]
1175
- @default_message_notifications = self.class.default_message_notifications[data[:default_message_notifications]]
1176
- @explicit_content_filter = self.class.explicit_content_filter[data[:explicit_content_filter]]
1200
+ @mfa_level = MFA_LEVELS[data[:mfa_level]]
1201
+ @verification_level = VERIFICATION_LEVELS[data[:verification_level]]
1202
+ @default_message_notifications = DEFAULT_MESSAGE_NOTIFICATIONS[data[:default_message_notifications]]
1203
+ @explicit_content_filter = EXPLICIT_CONTENT_FILTER[data[:explicit_content_filter]]
1177
1204
  @system_channel_id = data[:system_channel_id]
1178
1205
  @system_channel_flag = SystemChannelFlag.new(0b111 - data[:system_channel_flags])
1179
1206
  @rules_channel_id = data[:rules_channel_id]
@@ -1188,7 +1215,7 @@ module Discorb
1188
1215
  @approximate_member_count = data[:approximate_member_count]
1189
1216
  @approximate_presence_count = data[:approximate_presence_count]
1190
1217
  @welcome_screen = data[:welcome_screen].nil? ? nil : WelcomeScreen.new(@client, self, data[:welcome_screen])
1191
- @nsfw_level = self.class.nsfw_levels[data[:nsfw_level]]
1218
+ @nsfw_level = NSFW_LEVELS[data[:nsfw_level]]
1192
1219
  return unless is_create_event
1193
1220
 
1194
1221
  @stickers = data[:stickers].nil? ? [] : data[:stickers].map { |s| Sticker::GuildSticker.new(self, s) }
@@ -1239,7 +1266,14 @@ module Discorb
1239
1266
  # @return [Discorb::Guild] The guild the welcome screen belongs to.
1240
1267
  attr_reader :guild
1241
1268
 
1269
+ #
1270
+ # Initializes the welcome screen.
1242
1271
  # @private
1272
+ #
1273
+ # @param [Discorb::Client] client The client.
1274
+ # @param [Discorb::Guild] guild The guild the welcome screen belongs to.
1275
+ # @param [Hash] data The data of the welcome screen.
1276
+ #
1243
1277
  def initialize(client, guild, data)
1244
1278
  @client = client
1245
1279
  @description = data[:description]
@@ -33,7 +33,13 @@ module Discorb
33
33
  # @return [Discorb::Guild] The guild this template is based on.
34
34
  # @return [nil] Client wasn't able to find the guild this template is based on.
35
35
 
36
+ #
37
+ # Initialize a new template.
36
38
  # @private
39
+ #
40
+ # @param [Discorb::Client] client The client.
41
+ # @param [Hash] data The data from Discord.
42
+ #
37
43
  def initialize(client, data)
38
44
  @client = client
39
45
  _set_data(data)
@@ -120,14 +126,19 @@ module Discorb
120
126
  attr_reader :widget_enabled
121
127
  alias widget_enabled? widget_enabled
122
128
 
129
+ #
130
+ # Initialize a new guild in guild template.
123
131
  # @private
132
+ #
133
+ # @param [Hash] data The data from Discord.
134
+ #
124
135
  def initialize(data)
125
136
  @name = data[:name]
126
137
  @description = data[:description]
127
138
  @region = data[:region]
128
- @verification_level = Discorb::Guild.mfa_levels[data[:verification_level]]
129
- @default_message_notifications = Discorb::Guild.notification_levels[data[:default_message_notifications]]
130
- @explicit_content_filter = Discorb::Guild.explicit_content_filter[data[:explicit_content_filter]]
139
+ @verification_level = Discorb::Guild::MFA_LEVELS[data[:verification_level]]
140
+ @default_message_notifications = Discorb::Guild::NOTIFICATION_LEVELS[data[:default_message_notifications]]
141
+ @explicit_content_filter = Discorb::Guild::EXPLICIT_CONTENT_FILTERS[data[:explicit_content_filter]]
131
142
  @preferred_locale = data[:preferred_locale]
132
143
  @afk_timeout = data[:afk_timeout]
133
144
  @roles = data[:roles].map { |r| Role.new(r) }
@@ -146,7 +157,12 @@ module Discorb
146
157
  # @return [Discorb::Color] The color of the role.
147
158
  attr_reader :color
148
159
 
160
+ #
161
+ # Initialize a new role in guild template.
149
162
  # @private
163
+ #
164
+ # @param [Hash] data The data from Discord.
165
+ #
150
166
  def initialize(data)
151
167
  @name = data[:name]
152
168
  @permissions = Permission.new(data[:permissions])
@@ -177,7 +193,12 @@ module Discorb
177
193
  # @return [Class] The class of the channel.
178
194
  attr_reader :type
179
195
 
196
+ #
197
+ # Initialize a new channel in guild template.
180
198
  # @private
199
+ #
200
+ # @param [Hash] data The data from Discord.
201
+ #
181
202
  def initialize(data)
182
203
  @name = data[:name]
183
204
  @position = data[:position]
data/lib/discorb/http.rb CHANGED
@@ -10,7 +10,12 @@ module Discorb
10
10
  class HTTP
11
11
  @nil_body = nil
12
12
 
13
+ #
14
+ # Initializes the http client.
13
15
  # @private
16
+ #
17
+ # @param [Discorb::Client] client The client.
18
+ #
14
19
  def initialize(client)
15
20
  @client = client
16
21
  @ratelimit_handler = RatelimitHandler.new(client)
@@ -66,7 +71,7 @@ module Discorb
66
71
  @ratelimit_handler.wait(path)
67
72
  req = Net::HTTP.const_get(path.method.to_s.capitalize).new(get_path(path), get_headers(headers, body, audit_log_reason), **kwargs)
68
73
  data = [
69
- ["payload_json", get_body(body)]
74
+ ["payload_json", get_body(body)],
70
75
  ]
71
76
  files&.each_with_index do |file, i|
72
77
  next if file.nil?
@@ -123,7 +128,7 @@ module Discorb
123
128
  { "User-Agent" => USER_AGENT, "authorization" => "Bot #{@client.token}" }
124
129
  else
125
130
  { "User-Agent" => USER_AGENT, "authorization" => "Bot #{@client.token}",
126
- "content-type" => "application/json" }
131
+ "content-type" => "application/json", }
127
132
  end
128
133
  ret.merge!(headers) if !headers.nil? && headers.length.positive?
129
134
  ret["X-Audit-Log-Reason"] = audit_log_reason unless audit_log_reason.nil?
@@ -38,12 +38,21 @@ module Discorb
38
38
  # @macro client_cache
39
39
  # @return [Discorb::Guild] The guild this integration is in.
40
40
 
41
- @expire_behavior = {
41
+ # @private
42
+ # @return [{Integer => String}] The map of the expire behavior.
43
+ EXPIRE_BEHAVIOR = {
42
44
  0 => :remove_role,
43
45
  1 => :kick,
44
- }
46
+ }.freeze
45
47
 
48
+ #
49
+ # Initialize a new integration.
46
50
  # @private
51
+ #
52
+ # @param [Discorb::Client] client The client.
53
+ # @param [Hash] data The data of the welcome screen.
54
+ # @param [Discorb::Guild] guild The guild this integration is in.
55
+ #
47
56
  def initialize(client, data, guild_id)
48
57
  @client = client
49
58
  @data = data
@@ -80,7 +89,7 @@ module Discorb
80
89
  @syncing = data[:syncing]
81
90
  @role_id = Snowflake.new(data[:role_id])
82
91
  @enable_emoticons = data[:enable_emoticons]
83
- @expire_behavior = self.class.expire_behavior[data[:expire_behavior]]
92
+ @expire_behavior = EXPIRE_BEHAVIOR[data[:expire_behavior]]
84
93
  @expire_grace_period = data[:expire_grace_period]
85
94
  @user = @client.users[data[:user][:id]] or Discorb::User.new(@client, data[:user])
86
95
  @account = Account.new(data[:account])
@@ -89,11 +98,6 @@ module Discorb
89
98
  @application = data[:application] and Application.new(@client, data[:application])
90
99
  end
91
100
 
92
- class << self
93
- # @private
94
- attr_reader :expire_behavior
95
- end
96
-
97
101
  #
98
102
  # Represents an account for an integration.
99
103
  #
@@ -103,7 +107,12 @@ module Discorb
103
107
  # @return [String] The name of the account.
104
108
  attr_reader :name
105
109
 
110
+ #
111
+ # Initialize a new account.
106
112
  # @private
113
+ #
114
+ # @param [Hash] data The data from Discord.
115
+ #
107
116
  def initialize(data)
108
117
  @id = data[:id]
109
118
  @name = data[:name]
@@ -129,7 +138,13 @@ module Discorb
129
138
  # @return [nil] If the application has no bot user.
130
139
  attr_reader :bot
131
140
 
141
+ #
142
+ # Initialize a new application.
132
143
  # @private
144
+ #
145
+ # @param [Discorb::Client] client The client.
146
+ # @param [Hash] data The data from Discord.
147
+ #
133
148
  def initialize(client, data)
134
149
  @id = Snowflake.new(data[:id])
135
150
  @name = data[:name]
@@ -3,7 +3,9 @@
3
3
  module Discorb
4
4
  # Represents intents.
5
5
  class Intents
6
- @intent_bits = {
6
+ # @private
7
+ # @return [{Symbol => Integer}] The mapping of intent names to bit values.
8
+ INTENT_BITS = {
7
9
  guilds: 1 << 0,
8
10
  members: 1 << 1,
9
11
  bans: 1 << 2,
@@ -101,7 +103,7 @@ module Discorb
101
103
  end
102
104
  end
103
105
 
104
- def respond_to_missing?(sym, include_private)
106
+ def respond_to_missing?(name, include_private)
105
107
  @raw_value.key?(name) ? true : super
106
108
  end
107
109
 
@@ -109,7 +111,7 @@ module Discorb
109
111
  # @return [Integer] The value of the intent.
110
112
  def value
111
113
  res = 0
112
- self.class.intent_bits.each do |intent, bit|
114
+ INTENT_BITS.each do |intent, bit|
113
115
  res += bit if @raw_value[intent]
114
116
  end
115
117
  res
@@ -128,7 +130,7 @@ module Discorb
128
130
  # @param value [Integer] The value of the intent.
129
131
  def from_value(value)
130
132
  raw_value = {}
131
- @intent_bits.each do |intent, bit|
133
+ INTENT_BITS.each do |intent, bit|
132
134
  raw_value[intent] = value & bit != 0
133
135
  end
134
136
  new(**raw_value)
@@ -140,15 +142,13 @@ module Discorb
140
142
 
141
143
  # Create new intent object with all intents.
142
144
  def all
143
- from_value(@intent_bits.values.reduce(:+))
145
+ from_value(INTENT_BITS.values.reduce(:+))
144
146
  end
145
147
 
146
148
  # Create new intent object with no intents.
147
149
  def none
148
150
  from_value(0)
149
151
  end
150
-
151
- attr_reader :intent_bits
152
152
  end
153
153
  end
154
154
  end
@@ -7,7 +7,8 @@ module Discorb
7
7
  @interaction_type = 4
8
8
  @interaction_name = :auto_complete
9
9
 
10
- # @private
10
+ private
11
+
11
12
  def _set_data(data)
12
13
  super
13
14
  Sync do
@@ -26,7 +27,6 @@ module Discorb
26
27
  end
27
28
  end
28
29
 
29
- # @private
30
30
  def send_complete_result(val)
31
31
  @client.http.request(Route.new("/interactions/#{@id}/#{@token}/callback", "//interactions/:interaction_id/:token/callback", :post), {
32
32
  type: 8,
@@ -14,6 +14,7 @@ module Discorb
14
14
  #
15
15
  class SlashCommand < CommandInteraction
16
16
  @command_type = 1
17
+ @event_name = :slash_command
17
18
 
18
19
  private
19
20
 
@@ -34,7 +35,12 @@ module Discorb
34
35
  end
35
36
 
36
37
  class << self
38
+ #
39
+ # Get command data from the given data.
37
40
  # @private
41
+ #
42
+ # @param [Hash] data The data of the command.
43
+ #
38
44
  def get_command_data(data)
39
45
  name = data[:name]
40
46
  options = nil
@@ -60,7 +66,15 @@ module Discorb
60
66
  [name, options]
61
67
  end
62
68
 
69
+ #
70
+ # Modify the option map with the given options.
63
71
  # @private
72
+ #
73
+ # @param [Hash] option_map The option map to modify.
74
+ # @param [Array<Hash>] options The options for modifying.
75
+ # @param [Discorb::Guild] guild The guild where the command is executed.
76
+ # @param [{Discorb::Snowflake => Discorb::Member}] members The cached members of the guild.
77
+ # @param [{Integer => Discorb::Attachment}] attachments The cached attachments of the message.
64
78
  def modify_option_map(option_map, options, guild, members, attachments)
65
79
  options ||= []
66
80
  options.each do |option|
@@ -68,7 +82,7 @@ module Discorb
68
82
  when 3, 4, 5, 10
69
83
  option[:value]
70
84
  when 6
71
- guild.members[option[:value]] || guild.fetch_member(option[:value]).wait
85
+ members[option[:value]] || guild.members[option[:value]] || guild.fetch_member(option[:value]).wait
72
86
  when 7
73
87
  guild.channels[option[:value]] || guild.fetch_channels.wait.find { |channel| channel.id == option[:value] }
74
88
  when 8
@@ -89,6 +103,7 @@ module Discorb
89
103
  #
90
104
  class UserMenuCommand < CommandInteraction
91
105
  @command_type = 2
106
+ @event_name = :user_command
92
107
 
93
108
  # @return [Discorb::Member, Discorb::User] The target user.
94
109
  attr_reader :target
@@ -107,6 +122,7 @@ module Discorb
107
122
  #
108
123
  class MessageMenuCommand < CommandInteraction
109
124
  @command_type = 3
125
+ @event_name = :message_command
110
126
 
111
127
  # @return [Discorb::Message] The target message.
112
128
  attr_reader :target
@@ -147,18 +163,31 @@ module Discorb
147
163
 
148
164
  class << self
149
165
  # @private
150
- attr_reader :command_type
166
+ attr_reader :command_type, :event_name
151
167
 
168
+ #
169
+ # Creates a new CommandInteraction instance for the given data.
152
170
  # @private
171
+ #
172
+ # @param [Discorb::Client] client The client.
173
+ # @param [Hash] data The data for the command.
174
+ #
153
175
  def make_interaction(client, data)
154
176
  nested_classes.each do |klass|
155
- return klass.new(client, data) if !klass.command_type.nil? && klass.command_type == data[:data][:type]
177
+ if !klass.command_type.nil? && klass.command_type == data[:data][:type]
178
+ interaction = klass.new(client, data)
179
+ client.dispatch(klass.event_name, interaction)
180
+ return interaction
181
+ end
156
182
  end
157
183
  client.log.warn("Unknown command type #{data[:type]}, initialized CommandInteraction")
158
184
  CommandInteraction.new(client, data)
159
185
  end
160
186
 
187
+ #
188
+ # Returns the classes under this class.
161
189
  # @private
190
+ #
162
191
  def nested_classes
163
192
  constants.select { |c| const_get(c).is_a? Class }.map { |c| const_get(c) }
164
193
  end
@@ -18,17 +18,27 @@ module Discorb
18
18
  @interaction_type = 3
19
19
  @interaction_name = :message_component
20
20
 
21
+ #
22
+ # Initialize a new message component interaction.
21
23
  # @private
24
+ #
25
+ # @param [Discorb::Client] client The client.
26
+ # @param [Hash] data The data.
27
+ #
22
28
  def initialize(client, data)
23
29
  super
24
- @message = Message.new(@client, data[:message].merge({ member: data[:member] }))
30
+ @message = Message.new(@client, data[:message].merge({ member: data[:member], guild_id: data[:guild_id] }))
25
31
  end
26
32
 
27
33
  class << self
28
34
  # @private
35
+ # @return [Integer] The component type.
29
36
  attr_reader :component_type
30
37
 
38
+ #
39
+ # Create a MessageComponentInteraction instance for the given data.
31
40
  # @private
41
+ #
32
42
  def make_interaction(client, data)
33
43
  nested_classes.each do |klass|
34
44
  return klass.new(client, data) if !klass.component_type.nil? && klass.component_type == data[:data][:component_type]
@@ -37,7 +47,10 @@ module Discorb
37
47
  MessageComponentInteraction.new(client, data)
38
48
  end
39
49
 
50
+ #
51
+ # Returns the classes under this class.
40
52
  # @private
53
+ #
41
54
  def nested_classes
42
55
  constants.select { |c| const_get(c).is_a? Class }.map { |c| const_get(c) }
43
56
  end
@@ -74,7 +74,15 @@ module Discorb
74
74
  # Represents of a callback message of interaction.
75
75
  #
76
76
  class CallbackMessage
77
+ #
78
+ # Initializes a new instance of CallbackMessage.
77
79
  # @private
80
+ #
81
+ # @param [Client] client The client.
82
+ # @param [Hash] data The payload.
83
+ # @param [String] application_id The application ID.
84
+ # @param [String] token The token.
85
+ #
78
86
  def initialize(client, data, application_id, token)
79
87
  @client = client
80
88
  @data = data
@@ -128,6 +136,10 @@ module Discorb
128
136
  @client.http.request(Route.new("/webhooks/#{@application_id}/#{@token}/messages/@original", "//webhooks/:webhook_id/:token/messages/@original", :delete)).wait
129
137
  end
130
138
  end
139
+
140
+ def inspect
141
+ "#<#{self.class.name} application_id=#{@application_id}"
142
+ end
131
143
  end
132
144
  end
133
145
 
@@ -38,7 +38,13 @@ module Discorb
38
38
  @interaction_type = nil
39
39
  @interaction_name = nil
40
40
 
41
+ #
42
+ # Initialize a new interaction.
41
43
  # @private
44
+ #
45
+ # @param [Discorb::Client] client The client this interaction belongs to.
46
+ # @param [Hash] data The data of the interaction.
47
+ #
42
48
  def initialize(client, data)
43
49
  @client = client
44
50
  @id = Snowflake.new(data[:id])
@@ -81,7 +87,13 @@ module Discorb
81
87
  # @private
82
88
  attr_reader :interaction_type, :interaction_name, :event_name
83
89
 
90
+ #
91
+ # Create a new Interaction instance from the data.
84
92
  # @private
93
+ #
94
+ # @param [Discorb::Client] client The client this interaction belongs to.
95
+ # @param [Hash] data The data of the interaction.
96
+ #
85
97
  def make_interaction(client, data)
86
98
  interaction = nil
87
99
  descendants.each do |klass|
@@ -94,7 +106,10 @@ module Discorb
94
106
  interaction
95
107
  end
96
108
 
109
+ #
110
+ # Returns the descendants of the class.
97
111
  # @private
112
+ #
98
113
  def descendants
99
114
  ObjectSpace.each_object(Class).select { |klass| klass < self }
100
115
  end