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
data/lib/discorb/user.rb CHANGED
@@ -1,188 +1,205 @@
1
- # frozen_string_literal: true
2
-
3
- module Discorb
4
- #
5
- # Represents a user of discord.
6
- #
7
- class User < DiscordModel
8
- # @return [Boolean] Whether the user is verified.
9
- attr_reader :verified
10
- # @return [String] The user's username.
11
- attr_reader :username
12
- alias name username
13
- # @return [Discorb::Snowflake] The user's ID.
14
- attr_reader :id
15
- # @return [Discorb::User::Flag] The user's flags.
16
- attr_reader :flag
17
- # @return [String] The user's discriminator.
18
- attr_reader :discriminator
19
- # @return [Discorb::Asset, Discorb::DefaultAvatar] The user's avatar.
20
- attr_reader :avatar
21
- # @return [Boolean] Whether the user is a bot.
22
- attr_reader :bot
23
- alias bot? bot
24
- # @return [Time] The time the user was created.
25
- attr_reader :created_at
26
-
27
- include Discorb::Messageable
28
-
29
- # @!attribute [r] mention
30
- # @return [String] The user's mention.
31
-
32
- #
33
- # Initializes a new user.
34
- # @private
35
- #
36
- # @param [Discorb::Client] client The client.
37
- # @param [Hash] data The user data.
38
- #
39
- def initialize(client, data)
40
- @client = client
41
- @data = {}
42
- @dm_channel_id = nil
43
- _set_data(data)
44
- end
45
-
46
- #
47
- # Format the user as `Username#Discriminator` style.
48
- #
49
- # @return [String] The formatted username.
50
- #
51
- def to_s
52
- "#{@username}##{@discriminator}"
53
- end
54
-
55
- def mention
56
- "<@#{@id}>"
57
- end
58
-
59
- alias to_s_user to_s
60
-
61
- def inspect
62
- "#<#{self.class} #{self}>"
63
- end
64
-
65
- #
66
- # Whether the user is a owner of the client.
67
- # @async
68
- #
69
- # @param [Boolean] strict Whether don't allow if the user is a member of the team.
70
- #
71
- # @return [Async::Task<Boolean>] Whether the user is a owner of the client.
72
- #
73
- def bot_owner?(strict: false)
74
- Async do
75
- app = @client.fetch_application.wait
76
- if app.team.nil?
77
- app.owner == self
78
- elsif strict
79
- app.team.owner == self
80
- else
81
- app.team.members.any? { |m| m.user == self }
82
- end
83
- end
84
- end
85
-
86
- alias app_owner? bot_owner?
87
-
88
- #
89
- # Returns the dm channel id of the user.
90
- # @private
91
- #
92
- # @return [Async::Task<Discorb::Snowflake>] A task that resolves to the channel id.
93
- #
94
- def channel_id
95
- Async do
96
- next @dm_channel_id if @dm_channel_id
97
-
98
- _resp, dm_channel = @client.http.request(Route.new("/users/@me/channels", "//users/@me/channels", :post),
99
- { recipient_id: @id }).wait
100
- @dm_channel_id = dm_channel[:id]
101
- @dm_channel_id
102
- end
103
- end
104
-
105
- #
106
- # Represents the user's flags.
107
- # ## Flag fields
108
- # |`1 << 0`|`:discord_employee`|
109
- # |`1 << 1`|`:partnered_server_owner`|
110
- # |`1 << 2`|`:hypesquad_events`|
111
- # |`1 << 3`|`:bug_hunter_level_1`|
112
- # |`1 << 6`|`:house_bravery`|
113
- # |`1 << 7`|`:house_brilliance`|
114
- # |`1 << 8`|`:house_balance`|
115
- # |`1 << 9`|`:early_supporter`|
116
- # |`1 << 10`|`:team_user`|
117
- # |`1 << 14`|`:bug_hunter_level_2`|
118
- # |`1 << 16`|`:verified_bot`|
119
- # |`1 << 17`|`:early_verified_bot_developer`|
120
- # |`1 << 18`|`:discord_certified_moderator`|
121
- #
122
- class Flag < Discorb::Flag
123
- @bits = {
124
- discord_employee: 0,
125
- partnered_server_owner: 1,
126
- hypesquad_events: 2,
127
- bug_hunter_level_1: 3,
128
- house_bravery: 6,
129
- house_brilliance: 7,
130
- house_balance: 8,
131
- early_supporter: 9,
132
- team_user: 10,
133
- bug_hunter_level_2: 14,
134
- verified_bot: 16,
135
- early_verified_bot_developer: 17,
136
- discord_certified_moderator: 18,
137
- bot_http_interactions: 19,
138
- }.freeze
139
- end
140
-
141
- private
142
-
143
- def _set_data(data)
144
- @username = data[:username]
145
- @verified = data[:verified]
146
- @id = Snowflake.new(data[:id])
147
- @flag = User::Flag.new(data[:public_flags] | (data[:flags] || 0))
148
- @discriminator = data[:discriminator]
149
- @avatar = data[:avatar] ? Asset.new(self, data[:avatar]) : DefaultAvatar.new(data[:discriminator])
150
- @bot = data[:bot] || false
151
- @raw_data = data
152
- @client.users[@id] = self unless data[:no_cache]
153
- @created_at = @id.timestamp
154
- @data.update(data)
155
- end
156
- end
157
-
158
- #
159
- # Represents a client user.
160
- #
161
- class ClientUser < User
162
- #
163
- # Edit the client user.
164
- # @async
165
- # @macro edit
166
- #
167
- # @param [String] name The new username.
168
- # @param [Discorb::Image] avatar The new avatar.
169
- #
170
- # @return [Async::Task<void>] The task.
171
- #
172
- def edit(name: Discorb::Unset, avatar: Discorb::Unset)
173
- Async do
174
- payload = {}
175
- payload[:username] = name unless name == Discorb::Unset
176
- if avatar == Discorb::Unset
177
- # Nothing
178
- elsif avatar.nil?
179
- payload[:avatar] = nil
180
- else
181
- payload[:avatar] = avatar.to_s
182
- end
183
- @client.http.request(Route.new("/users/@me", "//users/@me", :patch), payload).wait
184
- self
185
- end
186
- end
187
- end
188
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Discorb
4
+ #
5
+ # Represents a user of discord.
6
+ #
7
+ class User < DiscordModel
8
+ # @return [Boolean] Whether the user is verified.
9
+ attr_reader :verified
10
+ # @return [String] The user's username.
11
+ attr_reader :username
12
+ alias name username
13
+ # @return [Discorb::Snowflake] The user's ID.
14
+ attr_reader :id
15
+ # @return [Discorb::User::Flag] The user's flags.
16
+ attr_reader :flag
17
+ # @return [String] The user's discriminator.
18
+ attr_reader :discriminator
19
+ # @return [Discorb::Asset, Discorb::DefaultAvatar] The user's avatar.
20
+ attr_reader :avatar
21
+ # @return [Boolean] Whether the user is a bot.
22
+ attr_reader :bot
23
+ alias bot? bot
24
+ # @return [Time] The time the user was created.
25
+ attr_reader :created_at
26
+
27
+ include Discorb::Messageable
28
+
29
+ # @!attribute [r] mention
30
+ # @return [String] The user's mention.
31
+
32
+ #
33
+ # Initializes a new user.
34
+ # @private
35
+ #
36
+ # @param [Discorb::Client] client The client.
37
+ # @param [Hash] data The user data.
38
+ #
39
+ def initialize(client, data)
40
+ @client = client
41
+ @data = {}
42
+ @dm_channel_id = nil
43
+ _set_data(data)
44
+ end
45
+
46
+ #
47
+ # Format the user as `Username#Discriminator` style.
48
+ #
49
+ # @return [String] The formatted username.
50
+ #
51
+ def to_s
52
+ "#{@username}##{@discriminator}"
53
+ end
54
+
55
+ def mention
56
+ "<@#{@id}>"
57
+ end
58
+
59
+ alias to_s_user to_s
60
+
61
+ def inspect
62
+ "#<#{self.class} #{self}>"
63
+ end
64
+
65
+ #
66
+ # Whether the user is a owner of the client.
67
+ # @async
68
+ #
69
+ # @param [Boolean] strict Whether don't allow if the user is a member of the team.
70
+ #
71
+ # @return [Async::Task<Boolean>] Whether the user is a owner of the client.
72
+ #
73
+ def bot_owner?(strict: false)
74
+ Async do
75
+ app = @client.fetch_application.wait
76
+ if app.team.nil?
77
+ app.owner == self
78
+ elsif strict
79
+ app.team.owner == self
80
+ else
81
+ app.team.members.any? { |m| m.user == self }
82
+ end
83
+ end
84
+ end
85
+
86
+ alias app_owner? bot_owner?
87
+
88
+ #
89
+ # Returns the dm channel id of the user.
90
+ # @private
91
+ #
92
+ # @return [Async::Task<Discorb::Snowflake>] A task that resolves to the channel id.
93
+ #
94
+ def channel_id
95
+ Async do
96
+ next @dm_channel_id if @dm_channel_id
97
+
98
+ _resp, dm_channel =
99
+ @client
100
+ .http
101
+ .request(
102
+ Route.new("/users/@me/channels", "//users/@me/channels", :post),
103
+ { recipient_id: @id }
104
+ )
105
+ .wait
106
+ @dm_channel_id = dm_channel[:id]
107
+ @dm_channel_id
108
+ end
109
+ end
110
+
111
+ #
112
+ # Represents the user's flags.
113
+ # ## Flag fields
114
+ # |`1 << 0`|`:staff`|
115
+ # |`1 << 1`|`:partner`|
116
+ # |`1 << 2`|`:hypesquad`|
117
+ # |`1 << 3`|`:bug_hunter_level_1`|
118
+ # |`1 << 6`|`:hypesquad_online_house_1`|
119
+ # |`1 << 7`|`:hypesquad_online_house_2`|
120
+ # |`1 << 8`|`:hypesquad_online_house_3`|
121
+ # |`1 << 9`|`:premium_early_supporter`|
122
+ # |`1 << 10`|`:team_psuedo_user`|
123
+ # |`1 << 14`|`:bug_hunter_level_2`|
124
+ # |`1 << 16`|`:verified_bot`|
125
+ # |`1 << 17`|`:verified_developer`|
126
+ # |`1 << 18`|`:certified_moderator`|
127
+ # |`1 << 19`|`:bot_http_interactions`|
128
+ #
129
+ class Flag < Discorb::Flag
130
+ @bits = {
131
+ staff: 0,
132
+ partner: 1,
133
+ hypesquad: 2,
134
+ bug_hunter_level_1: 3,
135
+ hypesquad_online_house_1: 6,
136
+ hypesquad_online_house_2: 7,
137
+ hypesquad_online_house_3: 8,
138
+ premium_early_supporter: 9,
139
+ team_psuedo_user: 10,
140
+ bug_hunter_level_2: 14,
141
+ verified_bot: 16,
142
+ verified_developer: 17,
143
+ certified_moderator: 18,
144
+ bot_http_interactions: 19
145
+ }.freeze
146
+ end
147
+
148
+ private
149
+
150
+ def _set_data(data)
151
+ @username = data[:username]
152
+ @verified = data[:verified]
153
+ @id = Snowflake.new(data[:id])
154
+ @flag = User::Flag.new(data[:public_flags] | (data[:flags] || 0))
155
+ @discriminator = data[:discriminator]
156
+ @avatar =
157
+ (
158
+ if data[:avatar]
159
+ Asset.new(self, data[:avatar])
160
+ else
161
+ DefaultAvatar.new(data[:discriminator])
162
+ end
163
+ )
164
+ @bot = data[:bot] || false
165
+ @raw_data = data
166
+ @client.users[@id] = self unless data[:no_cache]
167
+ @created_at = @id.timestamp
168
+ @data.update(data)
169
+ end
170
+ end
171
+
172
+ #
173
+ # Represents a client user.
174
+ #
175
+ class ClientUser < User
176
+ #
177
+ # Edit the client user.
178
+ # @async
179
+ # @macro edit
180
+ #
181
+ # @param [String] name The new username.
182
+ # @param [Discorb::Image] avatar The new avatar.
183
+ #
184
+ # @return [Async::Task<void>] The task.
185
+ #
186
+ def edit(name: Discorb::Unset, avatar: Discorb::Unset)
187
+ Async do
188
+ payload = {}
189
+ payload[:username] = name unless name == Discorb::Unset
190
+ if avatar == Discorb::Unset
191
+ # Nothing
192
+ elsif avatar.nil?
193
+ payload[:avatar] = nil
194
+ else
195
+ payload[:avatar] = avatar.to_s
196
+ end
197
+ @client
198
+ .http
199
+ .request(Route.new("/users/@me", "//users/@me", :patch), payload)
200
+ .wait
201
+ self
202
+ end
203
+ end
204
+ end
205
+ end
@@ -1,16 +1,16 @@
1
- # frozen_string_literal: true
2
-
3
- # @private
4
- def sputs(text)
5
- puts "\e[92m#{text}\e[m"
6
- end
7
-
8
- # @private
9
- def eputs(text)
10
- puts "\e[91m#{text}\e[m"
11
- end
12
-
13
- # @private
14
- def iputs(text)
15
- puts "\e[90m#{text}\e[m"
16
- end
1
+ # frozen_string_literal: true
2
+
3
+ # @private
4
+ def sputs(text)
5
+ puts "\e[92m#{text}\e[m"
6
+ end
7
+
8
+ # @private
9
+ def eputs(text)
10
+ puts "\e[91m#{text}\e[m"
11
+ end
12
+
13
+ # @private
14
+ def iputs(text)
15
+ puts "\e[90m#{text}\e[m"
16
+ end
data/lib/discorb/utils.rb CHANGED
@@ -1,16 +1,12 @@
1
- # frozen_string_literal: true
2
-
3
- module Discorb
4
- # @private
5
- module Utils
6
- def try(object, message, ...)
7
- if object.respond_to?(message)
8
- object.send(message, ...)
9
- else
10
- object
11
- end
12
- end
13
-
14
- module_function :try
15
- end
16
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Discorb
4
+ # @private
5
+ module Utils
6
+ def try(object, message, ...)
7
+ object.respond_to?(message) ? object.send(message, ...) : object
8
+ end
9
+
10
+ module_function :try
11
+ end
12
+ end