discorb 0.11.0 → 0.11.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/package_register.yml +34 -0
- data/Changelog.md +22 -0
- data/README.md +2 -2
- data/discorb.gemspec +0 -2
- data/docs/cli/{init.md → new.md} +0 -0
- data/docs/cli/setup.md +1 -1
- data/docs/cli.md +1 -1
- data/docs/events.md +5 -0
- data/lib/discorb/channel.rb +0 -42
- data/lib/discorb/client.rb +6 -11
- data/lib/discorb/color.rb +1 -0
- data/lib/discorb/common.rb +7 -1
- data/lib/discorb/gateway.rb +62 -47
- data/lib/discorb/http.rb +12 -7
- data/lib/discorb/integration.rb +1 -1
- data/lib/discorb/interaction.rb +2 -0
- data/lib/discorb/log.rb +3 -2
- data/lib/discorb/message.rb +3 -1
- data/lib/discorb/modules.rb +42 -0
- data/lib/discorb/rate_limit.rb +14 -15
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3154cd1b844888bec798cdead182285e335733206758fddea8c2fd8e0015499e
|
4
|
+
data.tar.gz: 9d0ba163982a7676045dce791409227f2c99c3e28bce29cae25033b85f7485a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20ee7dd354fc5be471617ed61367ceb85bad364cd8e2afd95df9c46453665b61c15d387c2bafb36b295836f5cb02f699edfc3118af4fa6c39e30a52f72904e6d
|
7
|
+
data.tar.gz: c860a7fa1335a7be40dafa7e9bda5bbfd6a7d7e7790ece875db350b154f3e7ab7f523387b5be4a77f4cae7f43c01b3a726f2c917dd81c2b97502f0097b9b5ecc
|
@@ -0,0 +1,34 @@
|
|
1
|
+
name: Publish Gem
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
tags:
|
6
|
+
- "v*"
|
7
|
+
workflow_dispatch:
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
build:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
|
13
|
+
steps:
|
14
|
+
- uses: actions/checkout@master
|
15
|
+
|
16
|
+
- name: Set up Ruby
|
17
|
+
uses: ruby/setup-ruby@v1
|
18
|
+
with:
|
19
|
+
ruby-version: "3.0"
|
20
|
+
|
21
|
+
- name: Setup Release Credentials
|
22
|
+
env:
|
23
|
+
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
24
|
+
run: |
|
25
|
+
mkdir -p $HOME/.gem
|
26
|
+
touch $HOME/.gem/credentials
|
27
|
+
chmod 600 $HOME/.gem/credentials
|
28
|
+
echo "---" >$HOME/.gem/credentials
|
29
|
+
echo ":github: Bearer ${GITHUB_TOKEN}" >> $HOME/.gem/credentials
|
30
|
+
- name: Publish Gem to GitHub Packages
|
31
|
+
run: |
|
32
|
+
export OWNER=$( echo ${{ github.repository }} | cut -d "/" -f 1 )
|
33
|
+
gem build *.gemspec
|
34
|
+
gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
|
data/Changelog.md
CHANGED
@@ -4,6 +4,28 @@
|
|
4
4
|
|
5
5
|
## v0.11
|
6
6
|
|
7
|
+
### v0.11.4
|
8
|
+
|
9
|
+
- Fix: Fix unpinning messages
|
10
|
+
|
11
|
+
### v0.11.3
|
12
|
+
|
13
|
+
- Add: Add `Snowflake#id` as alias for `Snowflake#to_s`
|
14
|
+
- Fix: Fix `Message#unpin`
|
15
|
+
|
16
|
+
### v0.11.2
|
17
|
+
|
18
|
+
- Add: Add `setup` event
|
19
|
+
- Fix: Fix gateway resuming
|
20
|
+
- Add: Add GitHub Packages
|
21
|
+
|
22
|
+
### v0.11.1
|
23
|
+
|
24
|
+
- Improve: Improve rate limit handling
|
25
|
+
- Fix: Fix bug in Integration initalization
|
26
|
+
- Change: Change log style
|
27
|
+
- Add: Support OP code 7
|
28
|
+
|
7
29
|
### v0.11.0
|
8
30
|
|
9
31
|
- Add: Improve documents
|
data/README.md
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
----
|
10
10
|
|
11
|
-
discorb is a Discord API wrapper
|
11
|
+
discorb is a Discord API wrapper written in Ruby.
|
12
12
|
|
13
13
|
## Installation
|
14
14
|
|
@@ -98,7 +98,7 @@ end
|
|
98
98
|
client.run(ENV["DISCORD_BOT_TOKEN"])
|
99
99
|
```
|
100
100
|
|
101
|
-
Note
|
101
|
+
Note you must run `discorb setup` before using slash commands.
|
102
102
|
|
103
103
|
## Contributing
|
104
104
|
|
data/discorb.gemspec
CHANGED
@@ -13,8 +13,6 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.license = "MIT"
|
14
14
|
spec.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
|
15
15
|
|
16
|
-
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
17
|
-
|
18
16
|
spec.metadata["homepage_uri"] = spec.homepage
|
19
17
|
spec.metadata["source_code_uri"] = "https://github.com/discorb-lib/discorb"
|
20
18
|
spec.metadata["changelog_uri"] = "https://discorb-lib.github.io/file.Changelog.html"
|
data/docs/cli/{init.md → new.md}
RENAMED
File without changes
|
data/docs/cli/setup.md
CHANGED
data/docs/cli.md
CHANGED
@@ -16,7 +16,7 @@ Currently, discorb has the following commands:
|
|
16
16
|
|
17
17
|
| Command | Description |
|
18
18
|
|---------|-------------|
|
19
|
-
| {file:docs/cli/
|
19
|
+
| {file:docs/cli/new.md `new`} | Create a new project. |
|
20
20
|
| {file:docs/cli/irb.md `irb`} | Start an interactive Ruby shell with connected client. |
|
21
21
|
| {file:docs/cli/run.md `run`} | Run a client. |
|
22
22
|
| {file:docs/cli/setup.md `setup`} | Setup application commands. |
|
data/docs/events.md
CHANGED
@@ -88,6 +88,11 @@ Fires when the client is resumed connection.
|
|
88
88
|
Fires when an error occurs during an event.
|
89
89
|
Defaults to printing the error to stderr, override to handle it yourself.
|
90
90
|
|
91
|
+
#### `setup()`
|
92
|
+
|
93
|
+
Fires when `discorb setup` is run.
|
94
|
+
This is useful for setting up some dependencies, such as the database.
|
95
|
+
|
91
96
|
### Guild events
|
92
97
|
|
93
98
|
#### `guild_join(guild)`
|
data/lib/discorb/channel.rb
CHANGED
@@ -482,48 +482,6 @@ module Discorb
|
|
482
482
|
end
|
483
483
|
end
|
484
484
|
|
485
|
-
#
|
486
|
-
# Fetch the pinned messages in the channel.
|
487
|
-
# @macro async
|
488
|
-
# @macro http
|
489
|
-
#
|
490
|
-
# @return [Async::Task<Array<Discorb::Message>>] The pinned messages in the channel.
|
491
|
-
#
|
492
|
-
def fetch_pins
|
493
|
-
Async do
|
494
|
-
_resp, data = @client.http.get("/channels/#{@id}/pins").wait
|
495
|
-
data.map { |pin| Message.new(@client, pin) }
|
496
|
-
end
|
497
|
-
end
|
498
|
-
|
499
|
-
#
|
500
|
-
# Pin a message in the channel.
|
501
|
-
# @macro async
|
502
|
-
# @macro http
|
503
|
-
#
|
504
|
-
# @param [Discorb::Message] message The message to pin.
|
505
|
-
# @param [String] reason The reason of pinning the message.
|
506
|
-
#
|
507
|
-
def pin_message(message, reason: nil)
|
508
|
-
Async do
|
509
|
-
@client.http.put("/channels/#{@id}/pins/#{message.id}", {}, audit_log_reason: reason).wait
|
510
|
-
end
|
511
|
-
end
|
512
|
-
|
513
|
-
#
|
514
|
-
# Unpin a message in the channel.
|
515
|
-
# @macro async
|
516
|
-
# @macro http
|
517
|
-
#
|
518
|
-
# @param [Discorb::Message] message The message to unpin.
|
519
|
-
# @param [String] reason The reason of unpinning the message.
|
520
|
-
#
|
521
|
-
def unpin_message(message, reason: nil)
|
522
|
-
Async do
|
523
|
-
@client.http.delete("/channels/#{@id}/pins/#{message.id}", {}, audit_log_reason: reason).wait
|
524
|
-
end
|
525
|
-
end
|
526
|
-
|
527
485
|
#
|
528
486
|
# Start thread in the channel.
|
529
487
|
# @macro async
|
data/lib/discorb/client.rb
CHANGED
@@ -446,16 +446,7 @@ module Discorb
|
|
446
446
|
::File.open(options[:log_file], "a")
|
447
447
|
end
|
448
448
|
@log.level = options[:log_level].to_sym
|
449
|
-
@log.colorize_log =
|
450
|
-
when nil
|
451
|
-
if @log.out == $stdout || @log.out == $stderr
|
452
|
-
true
|
453
|
-
else
|
454
|
-
false
|
455
|
-
end
|
456
|
-
when true, false
|
457
|
-
options[:log_color]
|
458
|
-
end
|
449
|
+
@log.colorize_log = options[:log_color] == nil ? @log.out.isatty : options[:log_color]
|
459
450
|
end
|
460
451
|
end
|
461
452
|
start_client(token)
|
@@ -468,6 +459,10 @@ module Discorb
|
|
468
459
|
guild_ids = false
|
469
460
|
end
|
470
461
|
setup_commands(token, guild_ids: guild_ids).wait
|
462
|
+
@events[:setup]&.each do |event|
|
463
|
+
event.call
|
464
|
+
end
|
465
|
+
self.on_setup if respond_to? :on_setup
|
471
466
|
end
|
472
467
|
end
|
473
468
|
|
@@ -493,7 +488,7 @@ module Discorb
|
|
493
488
|
@close_condition = Async::Condition.new
|
494
489
|
@main_task = Async do
|
495
490
|
@status = :running
|
496
|
-
connect_gateway(
|
491
|
+
connect_gateway(false).wait
|
497
492
|
rescue
|
498
493
|
@status = :stopped
|
499
494
|
@close_condition.signal
|
data/lib/discorb/color.rb
CHANGED
data/lib/discorb/common.rb
CHANGED
@@ -4,7 +4,7 @@ module Discorb
|
|
4
4
|
# @return [String] The API base URL.
|
5
5
|
API_BASE_URL = "https://discord.com/api/v9"
|
6
6
|
# @return [String] The version of discorb.
|
7
|
-
VERSION = "0.11.
|
7
|
+
VERSION = "0.11.4"
|
8
8
|
# @return [String] The user agent for the bot.
|
9
9
|
USER_AGENT = "DiscordBot (https://discorb-lib.github.io #{VERSION}) Ruby/#{RUBY_VERSION}"
|
10
10
|
|
@@ -64,6 +64,10 @@ module Discorb
|
|
64
64
|
# Increment of snowflake.
|
65
65
|
#
|
66
66
|
# @return [Integer] Increment of snowflake.
|
67
|
+
# @!attribute [r] id
|
68
|
+
# Alias of to_s.
|
69
|
+
#
|
70
|
+
# @return [String] The snowflake.
|
67
71
|
|
68
72
|
#
|
69
73
|
# Compares snowflake with other object.
|
@@ -105,5 +109,7 @@ module Discorb
|
|
105
109
|
def increment
|
106
110
|
@value & 0xFFF
|
107
111
|
end
|
112
|
+
|
113
|
+
alias id to_s
|
108
114
|
end
|
109
115
|
end
|
data/lib/discorb/gateway.rb
CHANGED
@@ -481,11 +481,10 @@ module Discorb
|
|
481
481
|
module Handler
|
482
482
|
private
|
483
483
|
|
484
|
-
def connect_gateway(
|
484
|
+
def connect_gateway(reconnect)
|
485
485
|
@log.info "Connecting to gateway."
|
486
486
|
Async do
|
487
|
-
@http = HTTP.new(self)
|
488
|
-
@first = first
|
487
|
+
@http = HTTP.new(self)
|
489
488
|
_, gateway_response = @http.get("/gateway").wait
|
490
489
|
gateway_url = gateway_response[:url]
|
491
490
|
endpoint = Async::HTTP::Endpoint.parse("#{gateway_url}?v=9&encoding=json&compress=zlib-stream",
|
@@ -495,36 +494,55 @@ module Discorb
|
|
495
494
|
@connection = connection
|
496
495
|
@zlib_stream = Zlib::Inflate.new(Zlib::MAX_WBITS)
|
497
496
|
@buffer = +""
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
497
|
+
begin
|
498
|
+
while (message = @connection.read)
|
499
|
+
@buffer << message
|
500
|
+
if message.end_with?((+"\x00\x00\xff\xff").force_encoding("ASCII-8BIT"))
|
501
|
+
begin
|
502
|
+
data = @zlib_stream.inflate(@buffer)
|
503
|
+
@buffer = +""
|
504
|
+
message = JSON.parse(data, symbolize_names: true)
|
505
|
+
rescue JSON::ParserError
|
506
|
+
@buffer = +""
|
507
|
+
@log.error "Received invalid JSON from gateway."
|
508
|
+
@log.debug "#{data}"
|
509
|
+
else
|
510
|
+
handle_gateway(message, reconnect)
|
511
|
+
end
|
511
512
|
end
|
512
513
|
end
|
514
|
+
rescue EOFError, Async::Wrapper::Cancelled, Async::Wrapper::WaitError
|
515
|
+
# Ignore
|
513
516
|
end
|
514
517
|
end
|
515
518
|
rescue Protocol::WebSocket::ClosedError => e
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
raise ClientError.new("Authentication failed
|
520
|
-
when
|
521
|
-
@log.info "
|
522
|
-
connect_gateway(
|
519
|
+
@tasks.map(&:stop)
|
520
|
+
case e.code
|
521
|
+
when 4004
|
522
|
+
raise ClientError.new("Authentication failed"), cause: nil
|
523
|
+
when 4009
|
524
|
+
@log.info "Session timed out, reconnecting."
|
525
|
+
connect_gateway(true)
|
526
|
+
when 4014
|
527
|
+
raise ClientError.new("Disallowed intents were specified"), cause: nil
|
528
|
+
when 4002, 4003, 4005, 4007
|
529
|
+
raise ClientError.new(<<~EOS), cause: e
|
530
|
+
Disconnected from gateway, probably due to library issues.
|
531
|
+
#{e.message}
|
532
|
+
|
533
|
+
Please report this to the library issue tracker.
|
534
|
+
https://github.com/discorb-lib/discorb/issues
|
535
|
+
EOS
|
536
|
+
when 1001
|
537
|
+
@log.info "Gateway closed with code 1001, reconnecting."
|
538
|
+
connect_gateway(true)
|
523
539
|
else
|
524
|
-
@log.error "Discord WebSocket closed
|
540
|
+
@log.error "Discord WebSocket closed with code #{e.code}."
|
541
|
+
@log.debug "#{e.message}"
|
525
542
|
connect_gateway(false)
|
526
543
|
end
|
527
|
-
rescue
|
544
|
+
rescue => e
|
545
|
+
@log.error "Discord WebSocket error: #{e.message}"
|
528
546
|
connect_gateway(false)
|
529
547
|
end
|
530
548
|
end
|
@@ -533,18 +551,26 @@ module Discorb
|
|
533
551
|
def send_gateway(opcode, **value)
|
534
552
|
@connection.write({ op: opcode, d: value }.to_json)
|
535
553
|
@connection.flush
|
536
|
-
@log.debug "Sent message
|
554
|
+
@log.debug "Sent message #{{ op: opcode, d: value }.to_json.gsub(@token, "[Token]")}"
|
537
555
|
end
|
538
556
|
|
539
|
-
def handle_gateway(payload)
|
557
|
+
def handle_gateway(payload, reconnect)
|
540
558
|
Async do |task|
|
541
559
|
data = payload[:d]
|
542
560
|
@last_s = payload[:s] if payload[:s]
|
543
|
-
@log.debug "Received message with opcode #{payload[:op]} from gateway:
|
561
|
+
@log.debug "Received message with opcode #{payload[:op]} from gateway:"
|
562
|
+
@log.debug "#{payload.to_json.gsub(@token, "[Token]")}"
|
544
563
|
case payload[:op]
|
545
564
|
when 10
|
546
565
|
@heartbeat_interval = data[:heartbeat_interval]
|
547
|
-
if
|
566
|
+
if reconnect
|
567
|
+
payload = {
|
568
|
+
token: @token,
|
569
|
+
session_id: @session_id,
|
570
|
+
seq: @last_s,
|
571
|
+
}
|
572
|
+
send_gateway(6, **payload)
|
573
|
+
else
|
548
574
|
payload = {
|
549
575
|
token: @token,
|
550
576
|
intents: @intents.value,
|
@@ -553,33 +579,22 @@ module Discorb
|
|
553
579
|
}
|
554
580
|
payload[:presence] = @identify_presence if @identify_presence
|
555
581
|
send_gateway(2, **payload)
|
556
|
-
Async do
|
557
|
-
sleep 2
|
558
|
-
next unless @uncached_guilds.nil?
|
559
|
-
|
560
|
-
raise ClientError, "Failed to connect to gateway.\nHint: This usually means that your intents are invalid."
|
561
|
-
exit 1
|
562
|
-
end
|
563
|
-
else
|
564
|
-
payload = {
|
565
|
-
token: @token,
|
566
|
-
session_id: @session_id,
|
567
|
-
seq: @last_s,
|
568
|
-
}
|
569
|
-
send_gateway(6, **payload)
|
570
582
|
end
|
583
|
+
when 7
|
584
|
+
@log.info "Received opcode 7, reconnecting"
|
585
|
+
@tasks.map(&:stop)
|
571
586
|
when 9
|
572
587
|
@log.warn "Received opcode 9, closed connection"
|
573
588
|
@tasks.map(&:stop)
|
574
589
|
if data
|
575
590
|
@log.info "Connection is resumable, reconnecting"
|
576
591
|
@connection.close
|
577
|
-
connect_gateway(
|
592
|
+
connect_gateway(true)
|
578
593
|
else
|
579
594
|
@log.info "Connection is not resumable, reconnecting with opcode 2"
|
580
|
-
sleep(2)
|
581
595
|
@connection.close
|
582
|
-
|
596
|
+
sleep(2)
|
597
|
+
connect_gateway(false)
|
583
598
|
end
|
584
599
|
when 11
|
585
600
|
@log.debug "Received opcode 11"
|
@@ -1024,7 +1039,7 @@ module Discorb
|
|
1024
1039
|
if respond_to?("event_" + event_name.downcase)
|
1025
1040
|
__send__("event_" + event_name.downcase, data)
|
1026
1041
|
else
|
1027
|
-
@log.debug "
|
1042
|
+
@log.debug "#{event_name}\n#{data.inspect}"
|
1028
1043
|
end
|
1029
1044
|
end
|
1030
1045
|
end
|
data/lib/discorb/http.rb
CHANGED
@@ -175,6 +175,7 @@ module Discorb
|
|
175
175
|
def handle_response(method, resp, data, path, body, headers, audit_log_reason, kwargs)
|
176
176
|
case resp.code
|
177
177
|
when "429"
|
178
|
+
@client.log.info("Rate limit exceeded for #{method} #{path}, waiting #{data[:retry_after]} seconds")
|
178
179
|
sleep(data[:retry_after])
|
179
180
|
if body
|
180
181
|
__send__(method, path, body, headers: headers, audit_log_reason: audit_log_reason, **kwargs).wait
|
@@ -227,15 +228,19 @@ module Discorb
|
|
227
228
|
end
|
228
229
|
|
229
230
|
def get_response_data(resp)
|
230
|
-
|
231
|
-
|
231
|
+
begin
|
232
|
+
data = JSON.parse(resp.body, symbolize_names: true)
|
233
|
+
rescue JSON::ParserError, TypeError
|
234
|
+
if resp.body.nil? || resp.body.empty?
|
235
|
+
data = nil
|
236
|
+
else
|
237
|
+
data = resp.body
|
238
|
+
end
|
232
239
|
end
|
233
|
-
|
234
|
-
|
235
|
-
nil
|
236
|
-
else
|
237
|
-
JSON.parse(rd, symbolize_names: true)
|
240
|
+
if resp["Via"].nil? && resp.code == "429" && data.is_a?(String)
|
241
|
+
raise CloudFlareBanError.new(resp, @client)
|
238
242
|
end
|
243
|
+
data
|
239
244
|
end
|
240
245
|
|
241
246
|
def http
|
data/lib/discorb/integration.rb
CHANGED
@@ -80,7 +80,7 @@ module Discorb
|
|
80
80
|
@enable_emoticons = data[:enable_emoticons]
|
81
81
|
@expire_behavior = self.class.expire_behavior[data[:expire_behavior]]
|
82
82
|
@expire_grace_period = data[:expire_grace_period]
|
83
|
-
@user = @client.users[data[:user].
|
83
|
+
@user = @client.users[data[:user][:id]] or Discorb::User.new(@client, data[:user])
|
84
84
|
@account = Account.new(data[:account])
|
85
85
|
@subscriber_count = data[:subscriber_count]
|
86
86
|
@revoked = data[:revoked]
|
data/lib/discorb/interaction.rb
CHANGED
@@ -458,6 +458,7 @@ module Discorb
|
|
458
458
|
@interaction_type = 4
|
459
459
|
@interaction_name = :auto_complete
|
460
460
|
|
461
|
+
# @private
|
461
462
|
def _set_data(data)
|
462
463
|
super
|
463
464
|
Sync do
|
@@ -511,6 +512,7 @@ module Discorb
|
|
511
512
|
end
|
512
513
|
end
|
513
514
|
|
515
|
+
# @private
|
514
516
|
def send_complete_result(val)
|
515
517
|
@client.http.post("/interactions/#{@id}/#{@token}/callback", {
|
516
518
|
type: 8,
|
data/lib/discorb/log.rb
CHANGED
@@ -65,10 +65,11 @@ module Discorb
|
|
65
65
|
return
|
66
66
|
end
|
67
67
|
|
68
|
+
time = Time.now.iso8601
|
68
69
|
if @colorize_log
|
69
|
-
@out.puts("\e[
|
70
|
+
@out.puts("\e[90m#{time}\e[0m #{color}#{name.ljust(5)}\e[0m #{message}")
|
70
71
|
else
|
71
|
-
@out.puts("
|
72
|
+
@out.puts("#{time} #{name.ljust(5)} #{message}")
|
72
73
|
end
|
73
74
|
end
|
74
75
|
end
|
data/lib/discorb/message.rb
CHANGED
data/lib/discorb/modules.rb
CHANGED
@@ -142,6 +142,48 @@ module Discorb
|
|
142
142
|
end
|
143
143
|
end
|
144
144
|
|
145
|
+
#
|
146
|
+
# Fetch the pinned messages in the channel.
|
147
|
+
# @macro async
|
148
|
+
# @macro http
|
149
|
+
#
|
150
|
+
# @return [Async::Task<Array<Discorb::Message>>] The pinned messages in the channel.
|
151
|
+
#
|
152
|
+
def fetch_pins
|
153
|
+
Async do
|
154
|
+
_resp, data = @client.http.get("/channels/#{channel_id.wait}/pins").wait
|
155
|
+
data.map { |pin| Message.new(@client, pin) }
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
#
|
160
|
+
# Pin a message in the channel.
|
161
|
+
# @macro async
|
162
|
+
# @macro http
|
163
|
+
#
|
164
|
+
# @param [Discorb::Message] message The message to pin.
|
165
|
+
# @param [String] reason The reason of pinning the message.
|
166
|
+
#
|
167
|
+
def pin_message(message, reason: nil)
|
168
|
+
Async do
|
169
|
+
@client.http.put("/channels/#{channel_id.wait}/pins/#{message.id}", {}, audit_log_reason: reason).wait
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
#
|
174
|
+
# Unpin a message in the channel.
|
175
|
+
# @macro async
|
176
|
+
# @macro http
|
177
|
+
#
|
178
|
+
# @param [Discorb::Message] message The message to unpin.
|
179
|
+
# @param [String] reason The reason of unpinning the message.
|
180
|
+
#
|
181
|
+
def unpin_message(message, reason: nil)
|
182
|
+
Async do
|
183
|
+
@client.http.delete("/channels/#{channel_id.wait}/pins/#{message.id}", audit_log_reason: reason).wait
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
145
187
|
#
|
146
188
|
# Trigger the typing indicator in the channel.
|
147
189
|
# @macro async
|
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
|
-
@
|
13
|
-
@
|
12
|
+
@current_ratelimits = {}
|
13
|
+
@path_ratelimit_bucket = {}
|
14
14
|
@global = false
|
15
15
|
end
|
16
16
|
|
@@ -24,25 +24,24 @@ module Discorb
|
|
24
24
|
return if path.start_with?("https://")
|
25
25
|
|
26
26
|
if @global
|
27
|
-
time = b[:reset_at] - Time.now.
|
28
|
-
@client.log.info("
|
27
|
+
time = b[:reset_at] - Time.now.to_f
|
28
|
+
@client.log.info("global rate limit reached, waiting #{time} seconds")
|
29
29
|
sleep(time)
|
30
30
|
@global = false
|
31
|
-
|
32
31
|
end
|
33
32
|
|
34
|
-
return unless hash = @
|
33
|
+
return unless hash = @path_ratelimit_bucket[method + path]
|
35
34
|
|
36
|
-
return unless b = @
|
35
|
+
return unless b = @current_ratelimits[hash]
|
37
36
|
|
38
|
-
if b[:reset_at] < Time.now.
|
39
|
-
@
|
37
|
+
if b[:reset_at] < Time.now.to_f
|
38
|
+
@current_ratelimits.delete(hash)
|
40
39
|
return
|
41
40
|
end
|
42
41
|
return if b[:remaining] > 0
|
43
42
|
|
44
|
-
time = b[:reset_at] - Time.now.
|
45
|
-
@client.log.info("
|
43
|
+
time = b[:reset_at] - Time.now.to_f
|
44
|
+
@client.log.info("rate limit for #{method} #{path} reached, waiting #{time} seconds")
|
46
45
|
sleep(time)
|
47
46
|
end
|
48
47
|
|
@@ -55,14 +54,14 @@ module Discorb
|
|
55
54
|
#
|
56
55
|
def save(method, path, resp)
|
57
56
|
if resp["X-Ratelimit-Global"] == "true"
|
58
|
-
@global = Time.now.
|
57
|
+
@global = Time.now.to_f + JSON.parse(resp.body, symbolize_names: true)[:retry_after]
|
59
58
|
end
|
60
59
|
return unless resp["X-RateLimit-Remaining"]
|
61
60
|
|
62
|
-
@
|
63
|
-
@
|
61
|
+
@path_ratelimit_bucket[method + path] = resp["X-RateLimit-Bucket"]
|
62
|
+
@current_ratelimits[resp["X-RateLimit-Bucket"]] = {
|
64
63
|
remaining: resp["X-RateLimit-Remaining"].to_i,
|
65
|
-
reset_at: resp["X-RateLimit-Reset"].
|
64
|
+
reset_at: Time.now.to_f + resp["X-RateLimit-Reset-After"].to_f,
|
66
65
|
}
|
67
66
|
end
|
68
67
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: discorb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sevenc-nanashi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-10-
|
11
|
+
date: 2021-10-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async
|
@@ -79,6 +79,7 @@ files:
|
|
79
79
|
- ".github/ISSUE_TEMPLATE/feature_request.md"
|
80
80
|
- ".github/workflows/build_main.yml"
|
81
81
|
- ".github/workflows/build_version.yml"
|
82
|
+
- ".github/workflows/package_register.yml"
|
82
83
|
- ".gitignore"
|
83
84
|
- ".yardopts"
|
84
85
|
- Changelog.md
|
@@ -103,8 +104,8 @@ files:
|
|
103
104
|
- docs/assets/08_hello_once.png
|
104
105
|
- docs/assets/unused_ping_pong.png
|
105
106
|
- docs/cli.md
|
106
|
-
- docs/cli/init.md
|
107
107
|
- docs/cli/irb.md
|
108
|
+
- docs/cli/new.md
|
108
109
|
- docs/cli/run.md
|
109
110
|
- docs/cli/setup.md
|
110
111
|
- docs/events.md
|
@@ -191,7 +192,6 @@ homepage: https://github.com/discorb-lib/discorb
|
|
191
192
|
licenses:
|
192
193
|
- MIT
|
193
194
|
metadata:
|
194
|
-
allowed_push_host: https://rubygems.org
|
195
195
|
homepage_uri: https://github.com/discorb-lib/discorb
|
196
196
|
source_code_uri: https://github.com/discorb-lib/discorb
|
197
197
|
changelog_uri: https://discorb-lib.github.io/file.Changelog.html
|