discorb 0.15.0 → 0.15.1

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 (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