discorb 0.18.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build_version.yml +2 -2
  3. data/.rubocop.yml +12 -75
  4. data/Changelog.md +25 -0
  5. data/Gemfile +4 -4
  6. data/README.md +2 -1
  7. data/Rakefile +482 -459
  8. data/Steepfile +8 -6
  9. data/docs/application_command.md +1 -0
  10. data/docs/events.md +2 -2
  11. data/docs/voice_events.md +6 -6
  12. data/lib/discorb/allowed_mentions.rb +68 -72
  13. data/lib/discorb/app_command/command.rb +466 -394
  14. data/lib/discorb/app_command/common.rb +65 -25
  15. data/lib/discorb/app_command/handler.rb +304 -265
  16. data/lib/discorb/app_command.rb +5 -5
  17. data/lib/discorb/application.rb +198 -197
  18. data/lib/discorb/asset.rb +101 -101
  19. data/lib/discorb/attachment.rb +134 -119
  20. data/lib/discorb/audit_logs.rb +412 -385
  21. data/lib/discorb/automod.rb +279 -269
  22. data/lib/discorb/channel/base.rb +107 -108
  23. data/lib/discorb/channel/category.rb +32 -32
  24. data/lib/discorb/channel/container.rb +44 -44
  25. data/lib/discorb/channel/dm.rb +26 -28
  26. data/lib/discorb/channel/guild.rb +311 -246
  27. data/lib/discorb/channel/stage.rb +156 -140
  28. data/lib/discorb/channel/text.rb +430 -336
  29. data/lib/discorb/channel/thread.rb +374 -325
  30. data/lib/discorb/channel/voice.rb +85 -79
  31. data/lib/discorb/channel.rb +5 -5
  32. data/lib/discorb/client.rb +635 -623
  33. data/lib/discorb/color.rb +178 -182
  34. data/lib/discorb/common.rb +168 -164
  35. data/lib/discorb/components/button.rb +107 -106
  36. data/lib/discorb/components/select_menu.rb +157 -145
  37. data/lib/discorb/components/text_input.rb +103 -106
  38. data/lib/discorb/components.rb +68 -66
  39. data/lib/discorb/dictionary.rb +135 -135
  40. data/lib/discorb/embed.rb +404 -398
  41. data/lib/discorb/emoji.rb +309 -302
  42. data/lib/discorb/emoji_table.rb +16099 -8857
  43. data/lib/discorb/error.rb +131 -131
  44. data/lib/discorb/event.rb +360 -314
  45. data/lib/discorb/event_handler.rb +39 -39
  46. data/lib/discorb/exe/about.rb +17 -17
  47. data/lib/discorb/exe/irb.rb +72 -67
  48. data/lib/discorb/exe/new.rb +323 -315
  49. data/lib/discorb/exe/run.rb +69 -68
  50. data/lib/discorb/exe/setup.rb +57 -55
  51. data/lib/discorb/exe/show.rb +12 -12
  52. data/lib/discorb/extend.rb +25 -45
  53. data/lib/discorb/extension.rb +89 -83
  54. data/lib/discorb/flag.rb +126 -128
  55. data/lib/discorb/gateway.rb +984 -794
  56. data/lib/discorb/gateway_events.rb +670 -638
  57. data/lib/discorb/gateway_requests.rb +45 -48
  58. data/lib/discorb/guild.rb +2115 -1626
  59. data/lib/discorb/guild_template.rb +280 -241
  60. data/lib/discorb/http.rb +247 -232
  61. data/lib/discorb/image.rb +42 -42
  62. data/lib/discorb/integration.rb +169 -161
  63. data/lib/discorb/intents.rb +161 -163
  64. data/lib/discorb/interaction/autocomplete.rb +76 -62
  65. data/lib/discorb/interaction/command.rb +279 -224
  66. data/lib/discorb/interaction/components.rb +114 -104
  67. data/lib/discorb/interaction/modal.rb +36 -32
  68. data/lib/discorb/interaction/response.rb +379 -330
  69. data/lib/discorb/interaction/root.rb +271 -118
  70. data/lib/discorb/interaction.rb +5 -5
  71. data/lib/discorb/invite.rb +154 -153
  72. data/lib/discorb/member.rb +344 -311
  73. data/lib/discorb/message.rb +615 -544
  74. data/lib/discorb/message_meta.rb +197 -186
  75. data/lib/discorb/modules.rb +371 -290
  76. data/lib/discorb/permission.rb +305 -289
  77. data/lib/discorb/presence.rb +352 -346
  78. data/lib/discorb/rate_limit.rb +81 -76
  79. data/lib/discorb/reaction.rb +55 -54
  80. data/lib/discorb/role.rb +272 -240
  81. data/lib/discorb/shard.rb +76 -74
  82. data/lib/discorb/sticker.rb +193 -171
  83. data/lib/discorb/user.rb +205 -188
  84. data/lib/discorb/utils/colored_puts.rb +16 -16
  85. data/lib/discorb/utils.rb +12 -16
  86. data/lib/discorb/voice_state.rb +305 -281
  87. data/lib/discorb/webhook.rb +537 -507
  88. data/lib/discorb.rb +62 -56
  89. data/sig/discorb/activity.rbs +1 -0
  90. data/sig/discorb/allowed_mentions.rbs +1 -0
  91. data/sig/discorb/app_command/base.rbs +7 -1
  92. data/sig/discorb/application.rbs +6 -0
  93. data/sig/discorb/asset.rbs +2 -0
  94. data/sig/discorb/attachment.rbs +8 -0
  95. data/sig/discorb/audit_log.rbs +7 -0
  96. data/sig/discorb/automod.rbs +32 -6
  97. data/sig/discorb/avatar.rbs +1 -0
  98. data/sig/discorb/channel/base.rbs +8 -1
  99. data/sig/discorb/channel/category.rbs +1 -0
  100. data/sig/discorb/channel/container.rbs +4 -0
  101. data/sig/discorb/channel/stage.rbs +4 -0
  102. data/sig/discorb/channel/text.rbs +2 -2
  103. data/sig/discorb/channel/thread.rbs +11 -0
  104. data/sig/discorb/channel/voice.rbs +2 -0
  105. data/sig/discorb/client.rbs +21 -20
  106. data/sig/discorb/color.rbs +6 -0
  107. data/sig/discorb/component/base.rbs +1 -0
  108. data/sig/discorb/component/button.rbs +2 -0
  109. data/sig/discorb/component/select_menu.rbs +4 -0
  110. data/sig/discorb/component/text_input.rbs +1 -0
  111. data/sig/discorb/custom_emoji.rbs +5 -1
  112. data/sig/discorb/dictionary.rbs +2 -0
  113. data/sig/discorb/discord_model.rbs +2 -0
  114. data/sig/discorb/embed.rbs +7 -0
  115. data/sig/discorb/emoji.rbs +1 -0
  116. data/sig/discorb/event_handler.rbs +2 -1
  117. data/sig/discorb/extension.rbs +13 -12
  118. data/sig/discorb/flag.rbs +2 -0
  119. data/sig/discorb/gateway.rbs +5 -0
  120. data/sig/discorb/guild.rbs +8 -4
  121. data/sig/discorb/guild_template.rbs +1 -1
  122. data/sig/discorb/http.rbs +4 -1
  123. data/sig/discorb/image.rbs +2 -0
  124. data/sig/discorb/integration.rbs +1 -1
  125. data/sig/discorb/intents.rbs +4 -3
  126. data/sig/discorb/interaction/base.rbs +36 -0
  127. data/sig/discorb/interaction/message_component.rbs +1 -2
  128. data/sig/discorb/interaction/modal.rbs +1 -2
  129. data/sig/discorb/interaction/responder.rbs +49 -49
  130. data/sig/discorb/invite.rbs +1 -1
  131. data/sig/discorb/member.rbs +2 -0
  132. data/sig/discorb/message.rbs +8 -1
  133. data/sig/discorb/messageable.rbs +1 -4
  134. data/sig/discorb/partial_emoji.rbs +3 -0
  135. data/sig/discorb/permissions.rbs +7 -0
  136. data/sig/discorb/presence.rbs +2 -0
  137. data/sig/discorb/reaction.rbs +5 -1
  138. data/sig/discorb/role.rbs +7 -1
  139. data/sig/discorb/scheduled_event.rbs +2 -1
  140. data/sig/discorb/shard.rbs +2 -1
  141. data/sig/discorb/snowflake.rbs +2 -0
  142. data/sig/discorb/stage_instance.rbs +9 -3
  143. data/sig/discorb/sticker.rbs +1 -1
  144. data/sig/discorb/unicode_emoji.rbs +4 -0
  145. data/sig/discorb/user.rbs +24 -20
  146. data/sig/discorb/webhook.rbs +17 -6
  147. data/sig/discorb/welcome_screen.rbs +1 -0
  148. data/sig/override.rbs +2 -0
  149. metadata +3 -3
@@ -1,76 +1,81 @@
1
- # frozen_string_literal: true
2
-
3
- module Discorb
4
- #
5
- # Class to handle rate limiting.
6
- # @private
7
- #
8
- class RatelimitHandler
9
- #
10
- # Initialize a rate limit handler.
11
- # @private
12
- #
13
- # @param [Discorb::Client] client The client.
14
- #
15
- def initialize(client)
16
- @client = client
17
- @path_ratelimit_bucket = {}
18
- @path_ratelimit_hash = {}
19
- @global = false
20
- end
21
-
22
- def inspect
23
- "#<#{self.class}>"
24
- end
25
-
26
- #
27
- # Wait for the rate limit to reset.
28
- #
29
- # @param [Discorb::Route] path The path.
30
- #
31
- def wait(path)
32
- # return if path.url.start_with?("https://")
33
- if @global && @global > Time.now.to_f
34
- time = @global - Time.now.to_f
35
- @client.logger.info("global rate limit reached, waiting #{time} seconds")
36
- sleep(time)
37
- @global = false
38
- end
39
-
40
- return unless hash = @path_ratelimit_hash[path.identifier]
41
-
42
- return unless bucket = @path_ratelimit_bucket[hash + path.major_param]
43
-
44
- if bucket[:reset_at] < Time.now.to_f
45
- @path_ratelimit_bucket.delete(path.identifier + path.major_param)
46
- return
47
- end
48
- return if (bucket[:remaining]).positive?
49
-
50
- time = bucket[:reset_at] - Time.now.to_f
51
- @client.logger.info("rate limit for #{path.identifier} with #{path.major_param} reached, " \
52
- "waiting #{time.round(4)} seconds")
53
- sleep(time)
54
- end
55
-
56
- #
57
- # Save the rate limit.
58
- #
59
- # @param [String] path The path.
60
- # @param [Net::HTTPResponse] resp The response.
61
- #
62
- def save(path, resp)
63
- if resp["X-Ratelimit-Global"] == "true"
64
- @global = Time.now.to_f + JSON.parse(resp.body,
65
- symbolize_names: true)[:retry_after]
66
- end
67
- return unless resp["X-RateLimit-Remaining"]
68
-
69
- @path_ratelimit_hash[path.identifier] = resp["X-Ratelimit-Bucket"]
70
- @path_ratelimit_bucket[resp["X-Ratelimit-Bucket"] + path.major_param] = {
71
- remaining: resp["X-RateLimit-Remaining"].to_i,
72
- reset_at: Time.now.to_f + resp["X-RateLimit-Reset-After"].to_f,
73
- }
74
- end
75
- end
76
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Discorb
4
+ #
5
+ # Class to handle rate limiting.
6
+ # @private
7
+ #
8
+ class RatelimitHandler
9
+ #
10
+ # Initialize a rate limit handler.
11
+ # @private
12
+ #
13
+ # @param [Discorb::Client] client The client.
14
+ #
15
+ def initialize(client)
16
+ @client = client
17
+ @path_ratelimit_bucket = {}
18
+ @path_ratelimit_hash = {}
19
+ @global = false
20
+ end
21
+
22
+ def inspect
23
+ "#<#{self.class}>"
24
+ end
25
+
26
+ #
27
+ # Wait for the rate limit to reset.
28
+ #
29
+ # @param [Discorb::Route] path The path.
30
+ #
31
+ def wait(path)
32
+ # return if path.url.start_with?("https://")
33
+ if @global && @global > Time.now.to_f
34
+ time = @global - Time.now.to_f
35
+ @client.logger.info(
36
+ "global rate limit reached, waiting #{time} seconds"
37
+ )
38
+ sleep(time)
39
+ @global = false
40
+ end
41
+
42
+ return unless hash = @path_ratelimit_hash[path.identifier]
43
+
44
+ return unless bucket = @path_ratelimit_bucket[hash + path.major_param]
45
+
46
+ if bucket[:reset_at] < Time.now.to_f
47
+ @path_ratelimit_bucket.delete(path.identifier + path.major_param)
48
+ return
49
+ end
50
+ return if (bucket[:remaining]).positive?
51
+
52
+ time = bucket[:reset_at] - Time.now.to_f
53
+ @client.logger.info(
54
+ "rate limit for #{path.identifier} with #{path.major_param} reached, " \
55
+ "waiting #{time.round(4)} seconds"
56
+ )
57
+ sleep(time)
58
+ end
59
+
60
+ #
61
+ # Save the rate limit.
62
+ #
63
+ # @param [String] path The path.
64
+ # @param [Net::HTTPResponse] resp The response.
65
+ #
66
+ def save(path, resp)
67
+ if resp["X-Ratelimit-Global"] == "true"
68
+ @global =
69
+ Time.now.to_f +
70
+ JSON.parse(resp.body, symbolize_names: true)[:retry_after]
71
+ end
72
+ return unless resp["X-RateLimit-Remaining"]
73
+
74
+ @path_ratelimit_hash[path.identifier] = resp["X-Ratelimit-Bucket"]
75
+ @path_ratelimit_bucket[resp["X-Ratelimit-Bucket"] + path.major_param] = {
76
+ remaining: resp["X-RateLimit-Remaining"].to_i,
77
+ reset_at: Time.now.to_f + resp["X-RateLimit-Reset-After"].to_f
78
+ }
79
+ end
80
+ end
81
+ end
@@ -1,54 +1,55 @@
1
- # frozen_string_literal: true
2
-
3
- module Discorb
4
- #
5
- # Represents a reaction to a message.
6
- #
7
- class Reaction < DiscordModel
8
- # @return [Integer] The number of users that have reacted with this emoji.
9
- attr_reader :count
10
- # @return [Discorb::Emoji, Discorb::PartialEmoji] The emoji that was reacted with.
11
- attr_reader :emoji
12
- # @return [Discorb::Message] The message that this reaction is on.
13
- attr_reader :message
14
- # @return [Boolean] Whether client user reacted with this emoji.
15
- attr_reader :me
16
- alias me? me
17
- alias reacted? me
18
-
19
- #
20
- # Initialize a new reaction.
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
- #
26
- def initialize(message, data)
27
- @message = message
28
- _set_data(data)
29
- end
30
-
31
- #
32
- # Fetch the user that reacted with this emoji.
33
- #
34
- # @param (see Message#fetch_reacted_users)
35
- #
36
- # @return [Async::Task<Array<Discorb::User>>] The users that reacted with this emoji.
37
- #
38
- def fetch_users(...)
39
- message.fetch_reacted_users(@emoji, ...)
40
- end
41
-
42
- private
43
-
44
- def _set_data(data)
45
- @count = data[:count]
46
- @me = data[:me]
47
- @emoji = if data[:emoji][:id].nil?
48
- UnicodeEmoji.new(data[:emoji][:name])
49
- else
50
- PartialEmoji.new(data[:emoji])
51
- end
52
- end
53
- end
54
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Discorb
4
+ #
5
+ # Represents a reaction to a message.
6
+ #
7
+ class Reaction < DiscordModel
8
+ # @return [Integer] The number of users that have reacted with this emoji.
9
+ attr_reader :count
10
+ # @return [Discorb::Emoji, Discorb::PartialEmoji] The emoji that was reacted with.
11
+ attr_reader :emoji
12
+ # @return [Discorb::Message] The message that this reaction is on.
13
+ attr_reader :message
14
+ # @return [Boolean] Whether client user reacted with this emoji.
15
+ attr_reader :me
16
+ alias me? me
17
+ alias reacted? me
18
+
19
+ #
20
+ # Initialize a new reaction.
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
+ #
26
+ def initialize(message, data)
27
+ @message = message
28
+ _set_data(data)
29
+ end
30
+
31
+ #
32
+ # Fetch the user that reacted with this emoji.
33
+ #
34
+ # @param (see Message#fetch_reacted_users)
35
+ #
36
+ # @return [Async::Task<Array<Discorb::User>>] The users that reacted with this emoji.
37
+ #
38
+ def fetch_users(...)
39
+ message.fetch_reacted_users(@emoji, ...)
40
+ end
41
+
42
+ private
43
+
44
+ def _set_data(data)
45
+ @count = data[:count]
46
+ @me = data[:me]
47
+ @emoji =
48
+ if data[:emoji][:id].nil?
49
+ UnicodeEmoji.new(data[:emoji][:name])
50
+ else
51
+ PartialEmoji.new(data[:emoji])
52
+ end
53
+ end
54
+ end
55
+ end