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
@@ -66,13 +66,22 @@ module Discorb
66
66
  # Whether the invite is temporary.
67
67
  # @return [Boolean]
68
68
 
69
- @target_types = {
69
+ # @private
70
+ # @return [{Integer => Symbol}] The mapping of target types.
71
+ TARGET_TYPES = {
70
72
  nil => :voice,
71
73
  1 => :stream,
72
74
  2 => :guild,
73
75
  }.freeze
74
76
 
77
+ #
78
+ # Initialize a new invite.
75
79
  # @private
80
+ #
81
+ # @param [Discorb::Client] client The client.
82
+ # @param [Hash] data The data of invite.
83
+ # @param [Boolean] gateway Whether the data is from gateway.
84
+ #
76
85
  def initialize(client, data, gateway)
77
86
  @client = client
78
87
  @data = data[:data]
@@ -124,7 +133,7 @@ module Discorb
124
133
  @expires_at = data[:expires_at] && Time.iso8601(data[:expires_at])
125
134
  end
126
135
  @inviter_data = data[:inviter]
127
- @target_type = self.class.target_types[data[:target_type]]
136
+ @target_type = TARGET_TYPES[data[:target_type]]
128
137
  @target_user = @client.users[data[:target_user][:id]] || User.new(@client, data[:target_user]) if data[:target_user]
129
138
  # @target_application = nil
130
139
 
@@ -137,10 +146,5 @@ module Discorb
137
146
  @temporary = data[:temporary]
138
147
  @created_at = Time.iso8601(data[:created_at])
139
148
  end
140
-
141
- class << self
142
- # @private
143
- attr_reader :target_types
144
- end
145
149
  end
146
150
  end
data/lib/discorb/log.rb CHANGED
@@ -5,11 +5,11 @@ module Discorb
5
5
  class Logger
6
6
  attr_accessor :out, :colorize_log
7
7
 
8
- @levels = %i[debug info warn error fatal].freeze
8
+ LEVELS = %i[debug info warn error fatal].freeze
9
9
 
10
10
  def initialize(out, colorize_log, level)
11
11
  @out = out
12
- @level = self.class.levels.index(level)
12
+ @level = LEVELS.index(level)
13
13
  @colorize_log = colorize_log
14
14
  end
15
15
 
@@ -18,11 +18,11 @@ module Discorb
18
18
  end
19
19
 
20
20
  def level
21
- self.class.levels[@level]
21
+ LEVELS[@level]
22
22
  end
23
23
 
24
24
  def level=(level)
25
- @level = self.class.levels.index(level)
25
+ @level = LEVELS.index(level)
26
26
  raise ArgumentError, "Invalid log level: #{level}" unless @level
27
27
  end
28
28
 
@@ -62,7 +62,15 @@ module Discorb
62
62
  # @!attribute [r] owner?
63
63
  # @return [Boolean] Whether the member is the owner of the guild.
64
64
 
65
+ #
66
+ # Initialize a new instance of the member.
65
67
  # @private
68
+ #
69
+ # @param [Discorb::Client] client The client.
70
+ # @param [Discorb::Snowflake] guild_id The ID of the guild.
71
+ # @param [Hash] user_data The data of the user.
72
+ # @param [Hash] member_data The data of the member.
73
+ #
66
74
  def initialize(client, guild_id, user_data, member_data)
67
75
  @guild_id = guild_id
68
76
  @client = client
@@ -248,6 +256,19 @@ module Discorb
248
256
  end
249
257
  end
250
258
 
259
+ #
260
+ # Checks if the member can manage the given role.
261
+ #
262
+ # @param [Discorb::Role] role The role.
263
+ #
264
+ # @return [Boolean] `true` if the member can manage the role.
265
+ #
266
+ def can_manage?(role)
267
+ return true if owner?
268
+ top_role = roles.max_by(&:position)
269
+ top_role.position > role.position
270
+ end
271
+
251
272
  private
252
273
 
253
274
  def _set_data(user_data, member_data)
@@ -152,7 +152,14 @@ module Discorb
152
152
  !@guild_id.nil?
153
153
  end
154
154
 
155
+ #
156
+ # Initialize a new message.
155
157
  # @private
158
+ #
159
+ # @param [Discorb::Client] client The client.
160
+ # @param [Hash] data The data of the welcome screen.
161
+ # @param [Boolean] no_cache Whether to disable caching.
162
+ #
156
163
  def initialize(client, data, no_cache: false)
157
164
  @client = client
158
165
  @data = {}
@@ -446,7 +453,8 @@ module Discorb
446
453
  "#<#{self.class} #{@content.inspect} id=#{@id}>"
447
454
  end
448
455
 
449
- # @private
456
+ private
457
+
450
458
  def _set_data(data)
451
459
  @id = Snowflake.new(data[:id])
452
460
  @channel_id = data[:channel_id]
@@ -88,18 +88,31 @@ module Discorb
88
88
  def self.from_hash(data)
89
89
  new(data[:guild_id], data[:channel_id], data[:message_id], fail_if_not_exists: data[:fail_if_not_exists])
90
90
  end
91
+
92
+ def inspect
93
+ "#<#{self.class.name} #{@channel_id}/#{@message_id}>"
94
+ end
91
95
  end
92
96
 
93
97
  #
94
98
  # Represents a sticker.
95
99
  #
96
100
  class Sticker
97
- attr_reader :id, :name, :format
101
+ # @return [Discorb::Snowflake] The sticker ID.
102
+ attr_reader :id
103
+ # @return [String] The sticker name.
104
+ attr_reader :name
105
+ # @return [Symbol] The sticker format.
106
+ attr_reader :format
98
107
 
99
108
  def initialize(data)
100
109
  @id = Snowflake.new(data[:id])
101
110
  @name = data[:name]
102
- @format = Discorb::Sticker.sticker_format[data[:format]]
111
+ @format = Discorb::Sticker::STICKER_FORMAT[data[:format]]
112
+ end
113
+
114
+ def inspect
115
+ "#<#{self.class.name} #{@id}: #{@name} format=#{@format}>"
103
116
  end
104
117
  end
105
118
 
@@ -107,7 +120,7 @@ module Discorb
107
120
  # Represents a interaction of message.
108
121
  #
109
122
  class Interaction < DiscordModel
110
- # @return [Discorb::Snowflake] The user ID.
123
+ # @return [Discorb::Snowflake] The interaction ID.
111
124
  attr_reader :id
112
125
  # @return [String] The name of command.
113
126
  # @return [nil] If the message is not a command.
@@ -117,13 +130,23 @@ module Discorb
117
130
  # @return [Discorb::User] The user.
118
131
  attr_reader :user
119
132
 
133
+ #
134
+ # Initialize a new interaction.
120
135
  # @private
136
+ #
137
+ # @param [Discorb::Client] client The client.
138
+ # @param [Hash] data The interaction data.
139
+ #
121
140
  def initialize(client, data)
122
141
  @id = Snowflake.new(data[:id])
123
142
  @name = data[:name]
124
143
  @type = Discorb::Interaction.descendants.find { |c| c.interaction_type == data[:type] }
125
144
  @user = client.users[data[:user][:id]] || User.new(client, data[:user])
126
145
  end
146
+
147
+ def inspect
148
+ "<#{self.class.name} #{@id}: #{@name} type=#{@type} #{@user}>"
149
+ end
127
150
  end
128
151
 
129
152
  #
@@ -135,22 +158,28 @@ module Discorb
135
158
  # @return [Symbol] The type of activity.
136
159
  attr_reader :type
137
160
 
138
- @type = {
161
+ # @private
162
+ # @return [{Integer => Symbol}] The mapping of activity type.
163
+ TYPES = {
139
164
  1 => :join,
140
165
  2 => :spectate,
141
166
  3 => :listen,
142
167
  5 => :join_request,
143
- }
168
+ }.freeze
144
169
 
170
+ #
171
+ # Initialize a new activity.
145
172
  # @private
173
+ #
174
+ # @param [Hash] data The activity data.
175
+ #
146
176
  def initialize(data)
147
177
  @name = data[:name]
148
- @type = self.class.type(data[:type])
178
+ @type = TYPES[data[:type]]
149
179
  end
150
180
 
151
- class << self
152
- # @private
153
- attr_reader :type
181
+ def inspect
182
+ "<#{self.class.name} #{@name} type=#{@type}>"
154
183
  end
155
184
  end
156
185
  end
@@ -138,7 +138,13 @@ module Discorb
138
138
  }.freeze
139
139
  @bits = @raw_bits.transform_values { |v| 1 << v }.freeze
140
140
 
141
+ #
142
+ # Initializes a new PermissionOverwrite.
141
143
  # @private
144
+ #
145
+ # @param allow [Integer] The allowed permissions.
146
+ # @param deny [Integer] The denied permissions.
147
+ #
142
148
  def initialize(allow, deny)
143
149
  @allow = allow
144
150
  @deny = deny
@@ -175,11 +181,14 @@ module Discorb
175
181
  #
176
182
  def to_hash
177
183
  self.class.bits.keys.to_h do |field|
178
- [field, if @allow & self.class.bits[field] != 0
179
- true
180
- elsif @deny & self.class.bits[method] != 0
181
- false
182
- end]
184
+ [
185
+ field,
186
+ if @allow & self.class.bits[field] != 0
187
+ true
188
+ elsif @deny & self.class.bits[field] != 0
189
+ false
190
+ end,
191
+ ]
183
192
  end
184
193
  end
185
194
 
@@ -19,7 +19,13 @@ module Discorb
19
19
  # @!attribute [r] activity
20
20
  # @return [Discorb::Presence::Activity] The activity of the presence.
21
21
 
22
+ #
23
+ # Initialize a presence.
22
24
  # @private
25
+ #
26
+ # @param [Discorb::Client] client The client.
27
+ # @param [Hash] data The data of the presence.
28
+ #
23
29
  def initialize(client, data)
24
30
  @client = client
25
31
  @data = data
@@ -80,19 +86,26 @@ module Discorb
80
86
  # @return [Discorb::Presence::Activity::Flag] The flags of the activity.
81
87
  attr_reader :flags
82
88
 
83
- @activity_types = {
89
+ # @private
90
+ # @return [{Integer => Symbol}] The mapping of activity types.
91
+ ACTIVITY_TYPES = {
84
92
  0 => :game,
85
93
  1 => :streaming,
86
94
  2 => :listening,
87
95
  3 => :watching,
88
96
  4 => :custom,
89
97
  5 => :competing,
90
- }
98
+ }.freeze
91
99
 
100
+ #
101
+ # Initialize the activity.
92
102
  # @private
103
+ #
104
+ # @param [Hash] data The activity data.
105
+ #
93
106
  def initialize(data)
94
107
  @name = data[:name]
95
- @type = self.class.activity_types[data[:type]]
108
+ @type = ACTIVITY_TYPES[data[:type]]
96
109
  @url = data[:url]
97
110
  @created_at = Time.at(data[:created_at])
98
111
  @timestamps = data[:timestamps] && Timestamps.new(data[:timestamps])
@@ -140,7 +153,12 @@ module Discorb
140
153
  # @return [Time] The end time of the activity.
141
154
  attr_reader :end
142
155
 
156
+ #
157
+ # Initialize the timestamps.
143
158
  # @private
159
+ #
160
+ # @param [Hash] data The timestamps data.
161
+ #
144
162
  def initialize(data)
145
163
  @start = data[:start] && Time.at(data[:start])
146
164
  @end = data[:end] && Time.at(data[:end])
@@ -159,7 +177,12 @@ module Discorb
159
177
  # @!attribute [r] max_size
160
178
  # @return [Integer] The max size of the party.
161
179
 
180
+ #
181
+ # Initialize the party.
162
182
  # @private
183
+ #
184
+ # @param [Hash] data The party data.
185
+ #
163
186
  def initialize(data)
164
187
  @id = data[:id]
165
188
  @size = data[:size]
@@ -229,7 +252,12 @@ module Discorb
229
252
  # @return [String] The match secret of the activity.
230
253
  attr_reader :match
231
254
 
255
+ #
256
+ # Initialize the secrets.
232
257
  # @private
258
+ #
259
+ # @param [Hash] data The secrets data.
260
+ #
233
261
  def initialize(data)
234
262
  @join = data[:join]
235
263
  @spectate = data[:spectate]
@@ -247,17 +275,17 @@ module Discorb
247
275
  attr_reader :url
248
276
  alias text label
249
277
 
278
+ #
279
+ # Initialize the button.
250
280
  # @private
281
+ #
282
+ # @param [Hash] data The button data.
283
+ #
251
284
  def initialize(data)
252
285
  @label = data[0]
253
286
  @url = data[1]
254
287
  end
255
288
  end
256
-
257
- class << self
258
- # @private
259
- attr_reader :activity_types
260
- end
261
289
  end
262
290
 
263
291
  #
@@ -278,7 +306,12 @@ module Discorb
278
306
  # @!attribute [r] web?
279
307
  # @return [Boolean] Whether the user is not offline on web.
280
308
 
309
+ #
310
+ # Initialize the client status.
281
311
  # @private
312
+ #
313
+ # @param [Hash] data The client status data.
314
+ #
282
315
  def initialize(data)
283
316
  @desktop = data[:desktop]&.to_sym || :offline
284
317
  @mobile = data[:mobile]&.to_sym || :offline
@@ -6,7 +6,12 @@ module Discorb
6
6
  # @private
7
7
  #
8
8
  class RatelimitHandler
9
+ #
10
+ # Initialize a rate limit handler.
9
11
  # @private
12
+ #
13
+ # @param [Discorb::Client] client The client.
14
+ #
10
15
  def initialize(client)
11
16
  @client = client
12
17
  @path_ratelimit_bucket = {}
@@ -16,7 +16,13 @@ module Discorb
16
16
  alias me? me
17
17
  alias reacted? me
18
18
 
19
+ #
20
+ # Initialize a new reaction.
19
21
  # @private
22
+ #
23
+ # @param [Discorb::Message] message The message that this reaction is on.
24
+ # @param [Hash] data The data of the reaction.
25
+ #
20
26
  def initialize(message, data)
21
27
  @message = message
22
28
  _set_data(data)
data/lib/discorb/role.rb CHANGED
@@ -42,7 +42,14 @@ module Discorb
42
42
 
43
43
  include Comparable
44
44
 
45
+ #
46
+ # Initializes a new role.
45
47
  # @private
48
+ #
49
+ # @param [Discorb::Client] client The client.
50
+ # @param [Discorb::Guild] guild The guild the role belongs to.
51
+ # @param [Hash] data The data of the role.
52
+ #
46
53
  def initialize(client, guild, data)
47
54
  @client = client
48
55
  @guild = guild
@@ -176,7 +183,12 @@ module Discorb
176
183
  # @!attribute [r] integration?
177
184
  # @return [Boolean] Whether the role is an integration role.
178
185
 
186
+ #
187
+ # Initializes a new tag.
179
188
  # @private
189
+ #
190
+ # @param [Hash] data The data of the tag.
191
+ #
180
192
  def initialize(data)
181
193
  @bot_id = Snowflake.new(data[:bot_id])
182
194
  @integration_id = Snowflake.new(data[:integration_id])
@@ -29,16 +29,27 @@ module Discorb
29
29
  attr_reader :available
30
30
  alias available? available
31
31
 
32
- @sticker_type = {
32
+ # @private
33
+ # @return [{Integer => Symbol}] The mapping of sticker types.
34
+ STICKER_TYPE = {
33
35
  1 => :official,
34
36
  2 => :guild,
35
37
  }.freeze
36
- @sticker_format = {
38
+
39
+ # @private
40
+ # @return [{Integer => Symbol}] The mapping of sticker format.
41
+ STICKER_FORMAT = {
37
42
  1 => :png,
38
43
  2 => :apng,
39
44
  3 => :lottie,
40
- }
45
+ }.freeze
46
+ #
47
+ # Initialize a new sticker.
41
48
  # @private
49
+ #
50
+ # @param [Discorb::Client] client The client.
51
+ # @param [Hash] data The sticker data.
52
+ #
42
53
  def initialize(client, data)
43
54
  @client = client
44
55
  _set_data(data)
@@ -51,15 +62,6 @@ module Discorb
51
62
  # @!attribute [r] guild
52
63
  # @macro client_cache
53
64
  # @return [Discorb::Guild] The guild the sticker is in.
54
- @sticker_type = {
55
- 1 => :official,
56
- 2 => :guild,
57
- }.freeze
58
- @sticker_format = {
59
- 1 => :png,
60
- 2 => :apng,
61
- 3 => :lottie,
62
- }
63
65
 
64
66
  def guild
65
67
  @client.guilds[@guild_id]
@@ -121,7 +123,13 @@ module Discorb
121
123
  # @return [Discorb::Asset] The banner of the pack.
122
124
  attr_reader :banner
123
125
 
126
+ #
127
+ # Initialize a new sticker pack.
124
128
  # @private
129
+ #
130
+ # @param [Discorb::Client] client The client.
131
+ # @param [Hash] data The sticker pack data.
132
+ #
125
133
  def initialize(client, data)
126
134
  @client = client
127
135
  @id = Snowflake.new(data[:id])
@@ -141,8 +149,8 @@ module Discorb
141
149
  @id = Snowflake.new(data[:id])
142
150
  @name = data[:name]
143
151
  @tags = data[:tags].split(",")
144
- @type = self.class.sticker_type[data[:type]]
145
- @format = self.class.sticker_format[data[:format]]
152
+ @type = STICKER_TYPE[data[:type]]
153
+ @format = STICKER_FORMAT[data[:format]]
146
154
  @description = data[:description]
147
155
  @available = data[:available]
148
156
  if @type == :official
data/lib/discorb/user.rb CHANGED
@@ -29,7 +29,13 @@ module Discorb
29
29
  # @!attribute [r] mention
30
30
  # @return [String] The user's mention.
31
31
 
32
+ #
33
+ # Initializes a new user.
32
34
  # @private
35
+ #
36
+ # @param [Discorb::Client] client The client.
37
+ # @param [Hash] data The user data.
38
+ #
33
39
  def initialize(client, data)
34
40
  @client = client
35
41
  @data = {}
@@ -79,7 +85,12 @@ module Discorb
79
85
 
80
86
  alias app_owner? bot_owner?
81
87
 
88
+ #
89
+ # Returns the dm channel id of the user.
82
90
  # @private
91
+ #
92
+ # @return [Async::Task<Discorb::Snowflake>] A task that resolves to the channel id.
93
+ #
83
94
  def channel_id
84
95
  Async do
85
96
  next @dm_channel_id if @dm_channel_id
@@ -46,7 +46,13 @@ module Discorb
46
46
  # @macro client_cache
47
47
  # @return [Discorb::User] The user this voice state is for.
48
48
 
49
+ #
50
+ # Initialize a new voice state.
49
51
  # @private
52
+ #
53
+ # @param [Discorb::Client] client The client this voice state belongs to.
54
+ # @param [Hash] data The data of the voice state.
55
+ #
50
56
  def initialize(client, data)
51
57
  @client = client
52
58
  _set_data(data)
@@ -135,7 +141,14 @@ module Discorb
135
141
  2 => :guild_only,
136
142
  }
137
143
 
144
+ #
145
+ # Initialize a new instance of the StageInstance class.
138
146
  # @private
147
+ #
148
+ # @param [Discorb::Client] client The client.
149
+ # @param [Hash] data The data of the stage instance.
150
+ # @param [Boolean] no_cache Whether to disable caching.
151
+ #
139
152
  def initialize(client, data, no_cache: false)
140
153
  @client = client
141
154
  @data = data
@@ -182,7 +195,7 @@ module Discorb
182
195
  Async do
183
196
  payload = {}
184
197
  payload[:topic] = topic if topic != Discorb::Unset
185
- payload[:privacy_level] = self.class.privacy_level.key(privacy_level) if privacy_level != Discorb::Unset
198
+ payload[:privacy_level] = PRIVACY_LEVEL.key(privacy_level) if privacy_level != Discorb::Unset
186
199
  @client.http.request(
187
200
  Route.new("/stage-instances/#{@channel_id}", "//stage-instances/:channel_id", :patch), payload, audit_log_reason: reason,
188
201
  ).wait
@@ -216,7 +229,7 @@ module Discorb
216
229
  @guild_id = Snowflake.new(data[:guild_id])
217
230
  @channel_id = Snowflake.new(data[:channel_id])
218
231
  @topic = data[:topic]
219
- @privacy_level = self.class.privacy_level[data[:privacy_level]]
232
+ @privacy_level = PRIVACY_LEVEL[data[:privacy_level]]
220
233
  @discoverable_disabled = data[:discoverable_disabled]
221
234
  end
222
235
 
@@ -246,7 +259,12 @@ module Discorb
246
259
  attr_reader :custom
247
260
  alias custom? custom
248
261
 
262
+ #
263
+ # Initialize a new instance of the VoiceRegion class.
249
264
  # @private
265
+ #
266
+ # @param [Hash] data The data of the voice region.
267
+ #
250
268
  def initialize(data)
251
269
  @id = data[:id]
252
270
  @name = data[:name]