discorb 0.13.2 → 0.15.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.
- checksums.yaml +4 -4
- data/.gitattributes +2 -0
- data/.github/workflows/build_version.yml +1 -1
- data/.github/workflows/codeql-analysis.yml +70 -0
- data/.github/workflows/lint-push.yml +20 -0
- data/.github/workflows/lint.yml +16 -0
- data/.rubocop.yml +70 -0
- data/CODE_OF_CONDUCT.md +128 -0
- data/Changelog.md +34 -0
- data/Gemfile +7 -3
- data/README.md +1 -1
- data/Rakefile +22 -22
- data/discorb.gemspec +13 -1
- data/docs/faq.md +8 -8
- data/examples/commands/bookmarker.rb +2 -1
- data/examples/commands/hello.rb +1 -0
- data/examples/commands/inspect.rb +3 -2
- data/examples/components/authorization_button.rb +2 -1
- data/examples/components/select_menu.rb +2 -1
- data/examples/extension/main.rb +1 -0
- data/examples/extension/message_expander.rb +1 -0
- data/examples/simple/eval.rb +3 -2
- data/examples/simple/ping_pong.rb +1 -0
- data/examples/simple/rolepanel.rb +1 -0
- data/examples/simple/wait_for_message.rb +4 -3
- data/exe/discorb +8 -7
- data/lib/discorb/allowed_mentions.rb +64 -0
- data/lib/discorb/app_command/command.rb +274 -0
- data/lib/discorb/app_command/handler.rb +168 -0
- data/lib/discorb/app_command.rb +2 -404
- data/lib/discorb/asset.rb +3 -1
- data/lib/discorb/{file.rb → attachment.rb} +42 -35
- data/lib/discorb/audit_logs.rb +3 -3
- data/lib/discorb/channel.rb +65 -61
- data/lib/discorb/client.rb +36 -33
- data/lib/discorb/common.rb +29 -22
- data/lib/discorb/components/button.rb +106 -0
- data/lib/discorb/components/select_menu.rb +157 -0
- data/lib/discorb/components/text_input.rb +96 -0
- data/lib/discorb/components.rb +11 -276
- data/lib/discorb/dictionary.rb +13 -2
- data/lib/discorb/embed.rb +40 -33
- data/lib/discorb/emoji.rb +21 -5
- data/lib/discorb/emoji_table.rb +1 -1
- data/lib/discorb/error.rb +4 -6
- data/lib/discorb/event.rb +13 -11
- data/lib/discorb/exe/about.rb +1 -0
- data/lib/discorb/exe/irb.rb +4 -3
- data/lib/discorb/exe/new.rb +6 -7
- data/lib/discorb/exe/run.rb +2 -1
- data/lib/discorb/exe/setup.rb +8 -5
- data/lib/discorb/exe/show.rb +1 -0
- data/lib/discorb/extend.rb +19 -14
- data/lib/discorb/extension.rb +5 -1
- data/lib/discorb/gateway.rb +82 -29
- data/lib/discorb/guild.rb +58 -80
- data/lib/discorb/guild_template.rb +5 -5
- data/lib/discorb/http.rb +52 -170
- data/lib/discorb/integration.rb +32 -3
- data/lib/discorb/intents.rb +9 -4
- data/lib/discorb/interaction/autocomplete.rb +5 -4
- data/lib/discorb/interaction/command.rb +34 -9
- data/lib/discorb/interaction/components.rb +5 -2
- data/lib/discorb/interaction/modal.rb +33 -0
- data/lib/discorb/interaction/response.rb +41 -12
- data/lib/discorb/interaction/root.rb +1 -0
- data/lib/discorb/interaction.rb +2 -1
- data/lib/discorb/invite.rb +1 -1
- data/lib/discorb/log.rb +4 -3
- data/lib/discorb/member.rb +4 -6
- data/lib/discorb/message.rb +38 -241
- data/lib/discorb/message_meta.rb +157 -0
- data/lib/discorb/modules.rb +47 -23
- data/lib/discorb/permission.rb +2 -2
- data/lib/discorb/presence.rb +6 -3
- data/lib/discorb/rate_limit.rb +15 -21
- data/lib/discorb/role.rb +3 -3
- data/lib/discorb/sticker.rb +2 -2
- data/lib/discorb/user.rb +3 -3
- data/lib/discorb/utils/colored_puts.rb +1 -0
- data/lib/discorb/voice_state.rb +7 -2
- data/lib/discorb/webhook.rb +9 -6
- data/lib/discorb.rb +2 -1
- data/sig/discorb.rbs +5836 -6714
- data/template-replace/scripts/arrow.rb +1 -0
- data/template-replace/scripts/favicon.rb +1 -0
- data/template-replace/scripts/index.rb +2 -1
- data/template-replace/scripts/locale_ja.rb +5 -4
- data/template-replace/scripts/sidebar.rb +1 -0
- data/template-replace/scripts/version.rb +7 -10
- data/template-replace/scripts/yard_replace.rb +5 -4
- metadata +30 -5
@@ -0,0 +1,157 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Discorb
|
3
|
+
#
|
4
|
+
# Represents a message in Discord.
|
5
|
+
#
|
6
|
+
class Message < DiscordModel
|
7
|
+
#
|
8
|
+
# Represents message flag.
|
9
|
+
# ## Flag fields
|
10
|
+
# |Field|Value|
|
11
|
+
# |-|-|
|
12
|
+
# |`1 << 0`|`:crossposted`|
|
13
|
+
# |`1 << 1`|`:crosspost`|
|
14
|
+
# |`1 << 2`|`:supress_embeds`|
|
15
|
+
# |`1 << 3`|`:source_message_deleted`|
|
16
|
+
# |`1 << 4`|`:urgent`|
|
17
|
+
# |`1 << 5`|`:has_thread`|
|
18
|
+
# |`1 << 6`|`:ephemeral`|
|
19
|
+
# |`1 << 7`|`:loading`|
|
20
|
+
#
|
21
|
+
class Flag < Discorb::Flag
|
22
|
+
@bits = {
|
23
|
+
crossposted: 0,
|
24
|
+
crosspost: 1,
|
25
|
+
supress_embeds: 2,
|
26
|
+
source_message_deleted: 3,
|
27
|
+
urgent: 4,
|
28
|
+
has_thread: 5,
|
29
|
+
ephemeral: 6,
|
30
|
+
loading: 7,
|
31
|
+
}.freeze
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# Represents reference of message.
|
36
|
+
#
|
37
|
+
class Reference
|
38
|
+
# @return [Discorb::Snowflake] The guild ID.
|
39
|
+
attr_accessor :guild_id
|
40
|
+
# @return [Discorb::Snowflake] The channel ID.
|
41
|
+
attr_accessor :channel_id
|
42
|
+
# @return [Discorb::Snowflake] The message ID.
|
43
|
+
attr_accessor :message_id
|
44
|
+
# @return [Boolean] Whether fail the request if the message is not found.
|
45
|
+
attr_accessor :fail_if_not_exists
|
46
|
+
|
47
|
+
alias fail_if_not_exists? fail_if_not_exists
|
48
|
+
|
49
|
+
#
|
50
|
+
# Initialize a new reference.
|
51
|
+
#
|
52
|
+
# @param [Discorb::Snowflake] guild_id The guild ID.
|
53
|
+
# @param [Discorb::Snowflake] channel_id The channel ID.
|
54
|
+
# @param [Discorb::Snowflake] message_id The message ID.
|
55
|
+
# @param [Boolean] fail_if_not_exists Whether fail the request if the message is not found.
|
56
|
+
#
|
57
|
+
def initialize(guild_id, channel_id, message_id, fail_if_not_exists: true)
|
58
|
+
@guild_id = guild_id
|
59
|
+
@channel_id = channel_id
|
60
|
+
@message_id = message_id
|
61
|
+
@fail_if_not_exists = fail_if_not_exists
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# Convert the reference to a hash.
|
66
|
+
#
|
67
|
+
# @return [Hash] The hash.
|
68
|
+
#
|
69
|
+
def to_hash
|
70
|
+
{
|
71
|
+
message_id: @message_id,
|
72
|
+
channel_id: @channel_id,
|
73
|
+
guild_id: @guild_id,
|
74
|
+
fail_if_not_exists: @fail_if_not_exists,
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
alias to_reference to_hash
|
79
|
+
|
80
|
+
#
|
81
|
+
# Initialize a new reference from a hash.
|
82
|
+
#
|
83
|
+
# @param [Hash] data The hash.
|
84
|
+
#
|
85
|
+
# @return [Discorb::Message::Reference] The reference.
|
86
|
+
# @see https://discord.com/developers/docs/resources/channel#message-reference-object
|
87
|
+
#
|
88
|
+
def self.from_hash(data)
|
89
|
+
new(data[:guild_id], data[:channel_id], data[:message_id], fail_if_not_exists: data[:fail_if_not_exists])
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
#
|
94
|
+
# Represents a sticker.
|
95
|
+
#
|
96
|
+
class Sticker
|
97
|
+
attr_reader :id, :name, :format
|
98
|
+
|
99
|
+
def initialize(data)
|
100
|
+
@id = Snowflake.new(data[:id])
|
101
|
+
@name = data[:name]
|
102
|
+
@format = Discorb::Sticker.sticker_format[data[:format]]
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
#
|
107
|
+
# Represents a interaction of message.
|
108
|
+
#
|
109
|
+
class Interaction < DiscordModel
|
110
|
+
# @return [Discorb::Snowflake] The user ID.
|
111
|
+
attr_reader :id
|
112
|
+
# @return [String] The name of command.
|
113
|
+
# @return [nil] If the message is not a command.
|
114
|
+
attr_reader :name
|
115
|
+
# @return [Class] The type of interaction.
|
116
|
+
attr_reader :type
|
117
|
+
# @return [Discorb::User] The user.
|
118
|
+
attr_reader :user
|
119
|
+
|
120
|
+
# @private
|
121
|
+
def initialize(client, data)
|
122
|
+
@id = Snowflake.new(data[:id])
|
123
|
+
@name = data[:name]
|
124
|
+
@type = Discorb::Interaction.descendants.find { |c| c.interaction_type == data[:type] }
|
125
|
+
@user = client.users[data[:user][:id]] || User.new(client, data[:user])
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
#
|
130
|
+
# Represents a activity of message.
|
131
|
+
#
|
132
|
+
class Activity < DiscordModel
|
133
|
+
# @return [String] The name of activity.
|
134
|
+
attr_reader :name
|
135
|
+
# @return [Symbol] The type of activity.
|
136
|
+
attr_reader :type
|
137
|
+
|
138
|
+
@type = {
|
139
|
+
1 => :join,
|
140
|
+
2 => :spectate,
|
141
|
+
3 => :listen,
|
142
|
+
5 => :join_request,
|
143
|
+
}
|
144
|
+
|
145
|
+
# @private
|
146
|
+
def initialize(data)
|
147
|
+
@name = data[:name]
|
148
|
+
@type = self.class.type(data[:type])
|
149
|
+
end
|
150
|
+
|
151
|
+
class << self
|
152
|
+
# @private
|
153
|
+
attr_reader :type
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
data/lib/discorb/modules.rb
CHANGED
@@ -16,13 +16,13 @@ module Discorb
|
|
16
16
|
# @param [Discorb::AllowedMentions] allowed_mentions The allowed mentions.
|
17
17
|
# @param [Discorb::Message, Discorb::Message::Reference] reference The message to reply to.
|
18
18
|
# @param [Array<Discorb::Component>, Array<Array<Discorb::Component>>] components The components to send.
|
19
|
-
# @param [Discorb::
|
20
|
-
# @param [Array<Discorb::
|
19
|
+
# @param [Discorb::Attachment] attachment The attachment to send.
|
20
|
+
# @param [Array<Discorb::Attachment>] attachments The attachments to send.
|
21
21
|
#
|
22
22
|
# @return [Async::Task<Discorb::Message>] The message sent.
|
23
23
|
#
|
24
24
|
def post(content = nil, tts: false, embed: nil, embeds: nil, allowed_mentions: nil,
|
25
|
-
reference: nil, components: nil,
|
25
|
+
reference: nil, components: nil, attachment: nil, attachments: nil)
|
26
26
|
Async do
|
27
27
|
payload = {}
|
28
28
|
payload[:content] = content if content
|
@@ -37,8 +37,17 @@ module Discorb
|
|
37
37
|
allowed_mentions ? allowed_mentions.to_hash(@client.allowed_mentions) : @client.allowed_mentions.to_hash
|
38
38
|
payload[:message_reference] = reference.to_reference if reference
|
39
39
|
payload[:components] = Component.to_payload(components) if components
|
40
|
-
|
41
|
-
|
40
|
+
attachments ||= attachment ? [attachment] : []
|
41
|
+
|
42
|
+
payload[:attachments] = attachments.map.with_index do |a, i|
|
43
|
+
{
|
44
|
+
id: i,
|
45
|
+
filename: a.filename,
|
46
|
+
description: a.description,
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
_resp, data = @client.http.multipart_request(Route.new("/channels/#{channel_id.wait}/messages", "//channels/:channel_id/messages", :post), payload, attachments).wait
|
42
51
|
Message.new(@client, data.merge({ guild_id: @guild_id.to_s }))
|
43
52
|
end
|
44
53
|
end
|
@@ -48,33 +57,48 @@ module Discorb
|
|
48
57
|
#
|
49
58
|
# Edit a message.
|
50
59
|
# @async
|
60
|
+
# @!macro edit
|
51
61
|
#
|
52
62
|
# @param [#to_s] message_id The message id.
|
53
63
|
# @param [String] content The message content.
|
54
64
|
# @param [Discorb::Embed] embed The embed to send.
|
55
65
|
# @param [Array<Discorb::Embed>] embeds The embeds to send.
|
56
66
|
# @param [Discorb::AllowedMentions] allowed_mentions The allowed mentions.
|
67
|
+
# @param [Array<Discorb::Attachment>] attachments The new attachments.
|
57
68
|
# @param [Array<Discorb::Component>, Array<Array<Discorb::Component>>] components The components to send.
|
58
69
|
# @param [Boolean] supress Whether to supress embeds.
|
59
70
|
#
|
60
71
|
# @return [Async::Task<void>] The task.
|
61
72
|
#
|
62
|
-
def edit_message(message_id, content =
|
63
|
-
|
73
|
+
def edit_message(message_id, content = Discorb::Unset, embed: Discorb::Unset, embeds: Discorb::Unset, allowed_mentions: Discorb::Unset,
|
74
|
+
attachments: Discorb::Unset, components: Discorb::Unset, supress: Discorb::Unset)
|
64
75
|
Async do
|
65
76
|
payload = {}
|
66
|
-
payload[:content] = content if content
|
67
|
-
tmp_embed = if embed
|
77
|
+
payload[:content] = content if content != Discorb::Unset
|
78
|
+
tmp_embed = if embed != Discorb::Unset
|
68
79
|
[embed]
|
69
|
-
elsif embeds
|
80
|
+
elsif embeds != Discorb::Unset
|
70
81
|
embeds
|
71
82
|
end
|
72
83
|
payload[:embeds] = tmp_embed.map(&:to_hash) if tmp_embed
|
73
84
|
payload[:allowed_mentions] =
|
74
|
-
allowed_mentions ?
|
75
|
-
payload[:components] = Component.to_payload(components) if components
|
76
|
-
payload[:flags] = (supress ? 1 << 2 : 0)
|
77
|
-
|
85
|
+
allowed_mentions == Discorb::Unset ? @client.allowed_mentions.to_hash : allowed_mentions.to_hash(@client.allowed_mentions)
|
86
|
+
payload[:components] = Component.to_payload(components) if components != Discorb::Unset
|
87
|
+
payload[:flags] = (supress ? 1 << 2 : 0) if supress != Discorb::Unset
|
88
|
+
if attachments != Discorb::Unset
|
89
|
+
payload[:attachments] = attachments.map.with_index do |a, i|
|
90
|
+
{
|
91
|
+
id: i,
|
92
|
+
filename: a.filename,
|
93
|
+
description: a.description,
|
94
|
+
}
|
95
|
+
end
|
96
|
+
end
|
97
|
+
@client.http.multipart_request(
|
98
|
+
Route.new("/channels/#{channel_id.wait}/messages/#{message_id}", "//channels/:channel_id/messages/:message_id", :patch),
|
99
|
+
payload,
|
100
|
+
attachments == Discorb::Unset ? [] : attachments
|
101
|
+
).wait
|
78
102
|
end
|
79
103
|
end
|
80
104
|
|
@@ -89,7 +113,7 @@ module Discorb
|
|
89
113
|
#
|
90
114
|
def delete_message!(message_id, reason: nil)
|
91
115
|
Async do
|
92
|
-
@client.http.
|
116
|
+
@client.http.request(Route.new("/channels/#{channel_id.wait}/messages/#{message_id}", "//channels/:channel_id/messages/:message_id", :delete), audit_log_reason: reason).wait
|
93
117
|
end
|
94
118
|
end
|
95
119
|
|
@@ -106,7 +130,7 @@ module Discorb
|
|
106
130
|
#
|
107
131
|
def fetch_message(id)
|
108
132
|
Async do
|
109
|
-
_resp, data = @client.http.
|
133
|
+
_resp, data = @client.http.request(Route.new("/channels/#{channel_id.wait}/messages/#{id}", "//channels/:channel_id/messages/:message_id", :get)).wait
|
110
134
|
Message.new(@client, data.merge({ guild_id: @guild_id.to_s }))
|
111
135
|
end
|
112
136
|
end
|
@@ -130,7 +154,7 @@ module Discorb
|
|
130
154
|
after: Discorb::Utils.try(around, :id),
|
131
155
|
around: Discorb::Utils.try(before, :id),
|
132
156
|
}.filter { |_k, v| !v.nil? }.to_h
|
133
|
-
_resp, messages = @client.http.
|
157
|
+
_resp, messages = @client.http.request(Route.new("/channels/#{channel_id.wait}/messages?#{URI.encode_www_form(params)}", "//channels/:channel_id/messages", :get)).wait
|
134
158
|
messages.map { |m| Message.new(@client, m.merge({ guild_id: @guild_id.to_s })) }
|
135
159
|
end
|
136
160
|
end
|
@@ -143,7 +167,7 @@ module Discorb
|
|
143
167
|
#
|
144
168
|
def fetch_pins
|
145
169
|
Async do
|
146
|
-
_resp, data = @client.http.
|
170
|
+
_resp, data = @client.http.request(Route.new("/channels/#{channel_id.wait}/pins", "//channels/:channel_id/pins", :get)).wait
|
147
171
|
data.map { |pin| Message.new(@client, pin) }
|
148
172
|
end
|
149
173
|
end
|
@@ -159,7 +183,7 @@ module Discorb
|
|
159
183
|
#
|
160
184
|
def pin_message(message, reason: nil)
|
161
185
|
Async do
|
162
|
-
@client.http.
|
186
|
+
@client.http.request(Route.new("/channels/#{channel_id.wait}/pins/#{message.id}", "//channels/:channel_id/pins/:message_id", :put), {}, audit_log_reason: reason).wait
|
163
187
|
end
|
164
188
|
end
|
165
189
|
|
@@ -174,7 +198,7 @@ module Discorb
|
|
174
198
|
#
|
175
199
|
def unpin_message(message, reason: nil)
|
176
200
|
Async do
|
177
|
-
@client.http.
|
201
|
+
@client.http.request(Route.new("/channels/#{channel_id.wait}/pins/#{message.id}", "//channels/:channel_id/pins/:message_id", :delete), audit_log_reason: reason).wait
|
178
202
|
end
|
179
203
|
end
|
180
204
|
|
@@ -195,7 +219,7 @@ module Discorb
|
|
195
219
|
begin
|
196
220
|
post_task = Async do
|
197
221
|
loop do
|
198
|
-
@client.http.
|
222
|
+
@client.http.request(Route.new("/channels/#{@id}/typing", "//channels/:channel_id/typing", :post), {})
|
199
223
|
sleep(5)
|
200
224
|
end
|
201
225
|
end
|
@@ -204,8 +228,8 @@ module Discorb
|
|
204
228
|
post_task.stop
|
205
229
|
end
|
206
230
|
else
|
207
|
-
Async do |
|
208
|
-
@client.http.
|
231
|
+
Async do |_task|
|
232
|
+
@client.http.request(Route.new("/channels/#{@id}/typing", "//channels/:channel_id/typing", :post), {})
|
209
233
|
end
|
210
234
|
end
|
211
235
|
end
|
data/lib/discorb/permission.rb
CHANGED
@@ -174,13 +174,13 @@ module Discorb
|
|
174
174
|
# @return [Hash] The permission overwrite as a hash.
|
175
175
|
#
|
176
176
|
def to_hash
|
177
|
-
self.class.bits.keys.
|
177
|
+
self.class.bits.keys.to_h do |field|
|
178
178
|
[field, if @allow & self.class.bits[field] != 0
|
179
179
|
true
|
180
180
|
elsif @deny & self.class.bits[method] != 0
|
181
181
|
false
|
182
182
|
end]
|
183
|
-
end
|
183
|
+
end
|
184
184
|
end
|
185
185
|
|
186
186
|
#
|
data/lib/discorb/presence.rb
CHANGED
@@ -105,7 +105,7 @@ module Discorb
|
|
105
105
|
@party = data[:party] && Party.new(data[:party])
|
106
106
|
@assets = data[:assets] && Asset.new(data[:assets])
|
107
107
|
@instance = data[:instance]
|
108
|
-
@buttons = data[:buttons]
|
108
|
+
@buttons = data[:buttons]&.map { |b| Button.new(b) }
|
109
109
|
@flags = data[:flags] && Flag.new(data[:flags])
|
110
110
|
end
|
111
111
|
|
@@ -147,6 +147,9 @@ module Discorb
|
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
150
|
+
#
|
151
|
+
# Represents the party of an activity.
|
152
|
+
#
|
150
153
|
class Party < DiscordModel
|
151
154
|
# @return [String] The id of the party.
|
152
155
|
attr_reader :id
|
@@ -175,12 +178,12 @@ module Discorb
|
|
175
178
|
# Represents the assets of an activity.
|
176
179
|
#
|
177
180
|
class Asset < DiscordModel
|
178
|
-
# @return [String] The large image ID of the asset.
|
181
|
+
# @return [String] The large image ID or URL of the asset.
|
179
182
|
attr_reader :large_image
|
180
183
|
alias large_id large_image
|
181
184
|
# @return [String] The large text of the activity.
|
182
185
|
attr_reader :large_text
|
183
|
-
# @return [String] The small image ID of the activity.
|
186
|
+
# @return [String] The small image ID or URL of the activity.
|
184
187
|
attr_reader :small_image
|
185
188
|
alias small_id small_image
|
186
189
|
# @return [String] The small text of the activity.
|
data/lib/discorb/rate_limit.rb
CHANGED
@@ -9,8 +9,8 @@ module Discorb
|
|
9
9
|
# @private
|
10
10
|
def initialize(client)
|
11
11
|
@client = client
|
12
|
-
@current_ratelimits = {}
|
13
12
|
@path_ratelimit_bucket = {}
|
13
|
+
@path_ratelimit_hash = {}
|
14
14
|
@global = false
|
15
15
|
end
|
16
16
|
|
@@ -21,12 +21,10 @@ module Discorb
|
|
21
21
|
#
|
22
22
|
# Wait for the rate limit to reset.
|
23
23
|
#
|
24
|
-
# @param [
|
25
|
-
# @param [String] path The path.
|
24
|
+
# @param [Discorb::Route] path The path.
|
26
25
|
#
|
27
|
-
def wait(
|
28
|
-
return if path.start_with?("https://")
|
29
|
-
|
26
|
+
def wait(path)
|
27
|
+
# return if path.url.start_with?("https://")
|
30
28
|
if @global && @global > Time.now.to_f
|
31
29
|
time = @global - Time.now.to_f
|
32
30
|
@client.log.info("global rate limit reached, waiting #{time} seconds")
|
@@ -34,36 +32,32 @@ module Discorb
|
|
34
32
|
@global = false
|
35
33
|
end
|
36
34
|
|
37
|
-
return unless hash = @
|
35
|
+
return unless hash = @path_ratelimit_hash[path.identifier]
|
38
36
|
|
39
|
-
return unless
|
37
|
+
return unless bucket = @path_ratelimit_bucket[hash + path.major_param]
|
40
38
|
|
41
|
-
if
|
42
|
-
@
|
39
|
+
if bucket[:reset_at] < Time.now.to_f
|
40
|
+
@path_ratelimit_bucket.delete(path.identifier + path.major_param)
|
43
41
|
return
|
44
42
|
end
|
45
|
-
return if
|
43
|
+
return if (bucket[:remaining]).positive?
|
46
44
|
|
47
|
-
time =
|
48
|
-
@client.log.info("rate limit for #{
|
45
|
+
time = bucket[:reset_at] - Time.now.to_f
|
46
|
+
@client.log.info("rate limit for #{path.identifier} with #{path.major_param} reached, waiting #{time.round(4)} seconds")
|
49
47
|
sleep(time)
|
50
48
|
end
|
51
49
|
|
52
50
|
#
|
53
51
|
# Save the rate limit.
|
54
52
|
#
|
55
|
-
# @param [String] method The HTTP method.
|
56
53
|
# @param [String] path The path.
|
57
54
|
# @param [Net::HTTPResponse] resp The response.
|
58
55
|
#
|
59
|
-
def save(
|
60
|
-
if resp["X-Ratelimit-Global"] == "true"
|
61
|
-
@global = Time.now.to_f + JSON.parse(resp.body, symbolize_names: true)[:retry_after]
|
62
|
-
end
|
56
|
+
def save(path, resp)
|
57
|
+
@global = Time.now.to_f + JSON.parse(resp.body, symbolize_names: true)[:retry_after] if resp["X-Ratelimit-Global"] == "true"
|
63
58
|
return unless resp["X-RateLimit-Remaining"]
|
64
|
-
|
65
|
-
@path_ratelimit_bucket[
|
66
|
-
@current_ratelimits[resp["X-RateLimit-Bucket"]] = {
|
59
|
+
@path_ratelimit_hash[path.identifier] = resp["X-Ratelimit-Bucket"]
|
60
|
+
@path_ratelimit_bucket[resp["X-Ratelimit-Bucket"] + path.major_param] = {
|
67
61
|
remaining: resp["X-RateLimit-Remaining"].to_i,
|
68
62
|
reset_at: Time.now.to_f + resp["X-RateLimit-Reset-After"].to_f,
|
69
63
|
}
|
data/lib/discorb/role.rb
CHANGED
@@ -99,7 +99,7 @@ module Discorb
|
|
99
99
|
#
|
100
100
|
def move(position, reason: nil)
|
101
101
|
Async do
|
102
|
-
@client.http.
|
102
|
+
@client.http.request(Route.new("/guilds/#{@guild.id}/roles", "//guilds/:guild_id/roles", :patch), { id: @id, position: position }, audit_log_reason: reason).wait
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
@@ -133,7 +133,7 @@ module Discorb
|
|
133
133
|
payload[:unicode_emoji] = icon.to_s
|
134
134
|
end
|
135
135
|
end
|
136
|
-
@client.http.
|
136
|
+
@client.http.request(Route.new("/guilds/#{@guild.id}/roles/#{@id}", "//guilds/:guild_id/roles/:role_id", :patch), payload, audit_log_reason: reason).wait
|
137
137
|
end
|
138
138
|
end
|
139
139
|
|
@@ -148,7 +148,7 @@ module Discorb
|
|
148
148
|
#
|
149
149
|
def delete!(reason: nil)
|
150
150
|
Async do
|
151
|
-
@client.http.
|
151
|
+
@client.http.request(Route.new("/guilds/#{@guild.id}/roles/#{@id}", "//guilds/:guild_id/roles/:role_id", :delete), audit_log_reason: reason).wait
|
152
152
|
end
|
153
153
|
end
|
154
154
|
|
data/lib/discorb/sticker.rb
CHANGED
@@ -83,7 +83,7 @@ module Discorb
|
|
83
83
|
payload[:name] = name unless name == Discorb::Unset
|
84
84
|
payload[:description] = description unless description == Discorb::Unset
|
85
85
|
payload[:tags] = tag.name unless tag == Discorb::Unset
|
86
|
-
@client.http.
|
86
|
+
@client.http.request(Route.new("/guilds/#{@guild_id}/stickers/#{@id}", "//guilds/:guild_id/stickers/:sticker_id", :patch), payload, audit_log_reason: reason).wait
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
@@ -97,7 +97,7 @@ module Discorb
|
|
97
97
|
#
|
98
98
|
def delete!(reason: nil)
|
99
99
|
Async do
|
100
|
-
@client.http.
|
100
|
+
@client.http.request(Route.new("/guilds/#{@guild_id}/stickers/#{@id}", "//guilds/:guild_id/stickers/:sticker_id", :delete), audit_log_reason: reason).wait
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
data/lib/discorb/user.rb
CHANGED
@@ -84,7 +84,7 @@ module Discorb
|
|
84
84
|
Async do
|
85
85
|
next @dm_channel_id if @dm_channel_id
|
86
86
|
|
87
|
-
_resp, dm_channel = @client.http.
|
87
|
+
_resp, dm_channel = @client.http.request(Route.new("/users/@me/channels", "//users/@me/channels", :post), { recipient_id: @id }).wait
|
88
88
|
@dm_channel_id = dm_channel[:id]
|
89
89
|
@dm_channel_id
|
90
90
|
end
|
@@ -137,7 +137,7 @@ module Discorb
|
|
137
137
|
@avatar = data[:avatar] ? Asset.new(self, data[:avatar]) : DefaultAvatar.new(data[:discriminator])
|
138
138
|
@bot = data[:bot]
|
139
139
|
@raw_data = data
|
140
|
-
@client.users[@id] = self
|
140
|
+
@client.users[@id] = self unless data[:no_cache]
|
141
141
|
@created_at = @id.timestamp
|
142
142
|
@data.update(data)
|
143
143
|
end
|
@@ -168,7 +168,7 @@ module Discorb
|
|
168
168
|
else
|
169
169
|
payload[:avatar] = avatar.to_s
|
170
170
|
end
|
171
|
-
@client.http.
|
171
|
+
@client.http.request(Route.new("/users/@me", "//users/@me", :patch), payload).wait
|
172
172
|
self
|
173
173
|
end
|
174
174
|
end
|
data/lib/discorb/voice_state.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Discorb
|
4
|
+
#
|
5
|
+
# Represents a state of user in voice channel.
|
6
|
+
#
|
4
7
|
class VoiceState < DiscordModel
|
5
8
|
# @return [Discorb::Member] The member associated with this voice state.
|
6
9
|
attr_reader :member
|
@@ -180,7 +183,9 @@ module Discorb
|
|
180
183
|
payload = {}
|
181
184
|
payload[:topic] = topic if topic != Discorb::Unset
|
182
185
|
payload[:privacy_level] = self.class.privacy_level.key(privacy_level) if privacy_level != Discorb::Unset
|
183
|
-
@client.http.
|
186
|
+
@client.http.request(
|
187
|
+
Route.new("/stage-instances/#{@channel_id}", "//stage-instances/:channel_id", :patch), payload, audit_log_reason: reason,
|
188
|
+
).wait
|
184
189
|
self
|
185
190
|
end
|
186
191
|
end
|
@@ -196,7 +201,7 @@ module Discorb
|
|
196
201
|
#
|
197
202
|
def delete!(reason: nil)
|
198
203
|
Async do
|
199
|
-
@client.http.
|
204
|
+
@client.http.request(Route.new("/stage-instances/#{@channel_id}", "//stage-instances/:stage_instance_id", :delete), audit_log_reason: reason).wait
|
200
205
|
self
|
201
206
|
end
|
202
207
|
end
|
data/lib/discorb/webhook.rb
CHANGED
@@ -75,7 +75,7 @@ module Discorb
|
|
75
75
|
payload[:username] = username if username
|
76
76
|
payload[:avatar_url] = avatar_url if avatar_url != Discorb::Unset
|
77
77
|
files = [file]
|
78
|
-
_resp, data = @http.
|
78
|
+
_resp, data = @http.multipart_request(Route.new("#{url}?wait=#{wait}", "//webhooks/:webhook_id/:token", :post), files, payload, headers: headers).wait
|
79
79
|
data && Webhook::Message.new(self, data)
|
80
80
|
end
|
81
81
|
end
|
@@ -99,7 +99,7 @@ module Discorb
|
|
99
99
|
payload[:name] = name if name != Discorb::Unset
|
100
100
|
payload[:avatar] = avatar if avatar != Discorb::Unset
|
101
101
|
payload[:channel_id] = Utils.try(channel, :id) if channel != Discorb::Unset
|
102
|
-
@http.
|
102
|
+
@http.request(Route.new(url, "//webhooks/:webhook_id/:token", :patch), payload).wait
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
@@ -113,7 +113,7 @@ module Discorb
|
|
113
113
|
#
|
114
114
|
def delete!
|
115
115
|
Async do
|
116
|
-
@http.
|
116
|
+
@http.request(Route.new(url, "//webhooks/:webhook_id/:token", :delete)).wait
|
117
117
|
self
|
118
118
|
end
|
119
119
|
end
|
@@ -151,7 +151,7 @@ module Discorb
|
|
151
151
|
payload[:attachments] = attachments.map(&:to_hash) if attachments != Discorb::Unset
|
152
152
|
payload[:allowed_mentions] = allowed_mentions if allowed_mentions != Discorb::Unset
|
153
153
|
files = [file] if file != Discorb::Unset
|
154
|
-
_resp, data = @http.
|
154
|
+
_resp, data = @http.multipart_request(Route.new("#{url}/messages/#{Utils.try(message, :id)}", "//webhooks/:webhook_id/:token/messages/:message_id", :patch), payload, files).wait
|
155
155
|
message.send(:_set_data, data)
|
156
156
|
message
|
157
157
|
end
|
@@ -166,7 +166,10 @@ module Discorb
|
|
166
166
|
#
|
167
167
|
def delete_message!(message)
|
168
168
|
Async do
|
169
|
-
@http.
|
169
|
+
@http.request(Route.new(
|
170
|
+
"#{url}/messages/#{Utils.try(message, :id)}",
|
171
|
+
"//webhooks/:webhook_id/:token/messages/:message_id", :delete
|
172
|
+
)).wait
|
170
173
|
message
|
171
174
|
end
|
172
175
|
end
|
@@ -331,7 +334,7 @@ module Discorb
|
|
331
334
|
@channel_id = Snowflake.new(data[:channel_id])
|
332
335
|
@author = Author.new(data[:author])
|
333
336
|
@attachments = data[:attachments].map { |a| Attachment.new(a) }
|
334
|
-
@embeds = data[:embeds] ? data[:embeds].map { |e| Embed.
|
337
|
+
@embeds = data[:embeds] ? data[:embeds].map { |e| Embed.from_hash(e) } : []
|
335
338
|
@mentions = data[:mentions].map { |m| Mention.new(m) }
|
336
339
|
@mention_roles = data[:mention_roles].map { |m| Snowflake.new(m) }
|
337
340
|
@mention_everyone = data[:mention_everyone]
|
data/lib/discorb.rb
CHANGED
@@ -40,9 +40,10 @@ module Discorb
|
|
40
40
|
end
|
41
41
|
|
42
42
|
require_order = %w[common flag dictionary error rate_limit http intents emoji_table modules] +
|
43
|
+
%w[message_meta allowed_mentions] +
|
43
44
|
%w[user member guild emoji channel embed message] +
|
44
45
|
%w[application audit_logs color components event event_handler] +
|
45
|
-
%w[
|
46
|
+
%w[attachment guild_template image integration interaction invite log permission] +
|
46
47
|
%w[presence reaction role sticker utils voice_state webhook] +
|
47
48
|
%w[gateway_requests gateway app_command] +
|
48
49
|
%w[asset extension client extend]
|