discorb 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6b163ab1659df50cb3b66467a2a70077af84df29c378c339a1a6eb26a45a32b6
4
- data.tar.gz: ab25ec2928e9030532e099caa3857ab4852ab3b79d4f9f558f10716e50ebc339
3
+ metadata.gz: eb2e5dd94a2bda9644a1a5679fdab3006bbdb1b10c8bf3780764b7fc115aa002
4
+ data.tar.gz: 4bfd645c6e39a4f3bd48ed2b2afaaccc8c2cf5702eb6dc675cfb01b17667b09f
5
5
  SHA512:
6
- metadata.gz: f43efd7ef3eceddc1d116fd0e6be9655dc1fd489a6d9770411298a3f20f7d4c8f71811679cb865d2ef0baba9929c13b1d29d238b10ba448d440c626274547cce
7
- data.tar.gz: e83240f9ce495140613a0777f3c9a5a5a12f35cd8a6c9b39f88f7c080f370af977812d8d7c2fda8acd2a0f62208fd238a101d91998a2e23a12ef18c39373b885
6
+ metadata.gz: 8c18b4e0b809e66350c952a8d50cb2e4f899e2844cd33b43bfd6120cc4560c6889e2cc8015fe9729ecb84c1af26a434ac566f69baa1a58cfcc5b6e2232b41151
7
+ data.tar.gz: de89179dffd53f575e148c2240d278eb101dde91f8f2288c9cefcae403eb4ce2f04547a030bebb3912d33df639e8e516c92878d6eb1fe1650cde8dc4c6903d25
@@ -0,0 +1,53 @@
1
+ name: Build YARD by version
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ tags:
7
+ - "v*"
8
+ jobs:
9
+ main:
10
+
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+ with:
16
+ fetch-depth: 0
17
+ - name: Set up Ruby
18
+ uses: ruby/setup-ruby@v1
19
+ with:
20
+ ruby-version: 3.0.2
21
+ bundler-cache: true
22
+ - name: Set up git settings
23
+ run: |
24
+ git config --global user.email "action@github.com"
25
+ git config --global user.name "GitHub Action"
26
+ - name: Clone pages
27
+ env:
28
+ SSH_SECRET: ${{ secrets.SSH }}
29
+ GIT_SSH_COMMAND: ssh -i ~/ssh_secret
30
+ run: |
31
+ echo "$SSH_SECRET" > ~/ssh_secret
32
+ chmod 600 ~/ssh_secret
33
+ git clone git@github.com:discorb-lib/discorb-lib.github.io /tmp/pages
34
+ - name: Install dependencies
35
+ run: |
36
+ bundle config --local with 'docs'
37
+ bundle install
38
+ - name: Generate document
39
+ run: bundle exec rake document:build_all
40
+ - name: Push document
41
+ env:
42
+ SSH_SECRET: ${{ secrets.SSH }}
43
+ GIT_SSH_COMMAND: ssh -i ~/ssh_secret
44
+ run: |
45
+ echo "$SSH_SECRET" > ~/ssh_secret
46
+ chmod 600 ~/ssh_secret
47
+ cp -r ./doc/. /tmp/pages
48
+ cd /tmp/pages
49
+ git add -A
50
+ git commit -m "Update: Update document"
51
+ git update-ref -d refs/remotes/origin/user
52
+ git push origin main -f
53
+ continue-on-error: true
data/Changelog.md CHANGED
@@ -177,4 +177,38 @@ end
177
177
 
178
178
  ## 0.7.1
179
179
 
180
- - Fix: Fix error of responding to interaction
180
+ - Fix: Fix error of responding to interaction
181
+
182
+ ## 0.7.2
183
+
184
+ - Add: Add `Member#owner?`
185
+ - Fix: Fix `Member#permissions`
186
+ - Add: Add `Member#guild_permissions` as alias of `Member#permissions`
187
+ - Add: Add default role to `Member#roles`
188
+ - Fix: Fix error in `Integration#_set_data`
189
+ - Change: Reverse `Member#roles`
190
+
191
+ ## 0.7.3
192
+
193
+ - Add: Improve `discorb init`
194
+
195
+ ## 0.7.4 (yanked)
196
+
197
+ - Fix: Fix disconnected client
198
+
199
+ ## 0.7.5 (yanked)
200
+
201
+ - Fix: Fix critical error
202
+
203
+ ## 0.7.6
204
+
205
+ - Fix: Fix heartbeating error
206
+
207
+ ## 0.8.0
208
+
209
+ - Add: Add `Guild#fetch_members`
210
+ - Add: Add `Guild#fetch_member_list` as alias of `Guild#fetch_members`
211
+ - Add: Add `Intents#to_h`
212
+ - Add: Add `fetch_member` parameter to `Client#initialize`; Note you should set `false` if your bot doesn't have `GUILD_MEMBERS` intent
213
+ - Change: Change `ready` to `standby` event
214
+ - Change: `ready` will be fired when client receives `READY` event
data/README.md CHANGED
@@ -35,7 +35,7 @@ require "discorb"
35
35
 
36
36
  client = Discorb::Client.new
37
37
 
38
- client.once :ready do
38
+ client.once :standby do
39
39
  puts "Logged in as #{client.user}"
40
40
  end
41
41
 
data/docs/cli/init.md CHANGED
@@ -32,6 +32,18 @@ If true, the command will initialize git and commit the initial files with commi
32
32
  Use `git commit --amend -m "..."` to change the commit message.
33
33
  Default to false.
34
34
 
35
+ ### `--[no-]desc`
36
+
37
+ Whether to create a description file.
38
+ If true, the command will create a `.env.sample` and `README.md` file.
39
+ Default to false.
40
+
41
+ ### `-n` `--name`
42
+
43
+ The name of the project.
44
+ It will be used in the `README.md` file.
45
+ Default to the directory name.
46
+
35
47
  ### `-t`, `--token`
36
48
 
37
49
  The name of token environment variable.
@@ -49,7 +61,9 @@ The following files will be created:
49
61
  | File | Description |
50
62
  | ---- | ----------- |
51
63
  | `.env` | Environment variables. |
64
+ | `main.rb` | Main script. |
52
65
  | `.gitignore` | Git ignore file. Won't be created if `--git` is false. |
53
66
  | `Gemfile` | Gemfile. Won't be created if `--bundle` is false. |
54
67
  | `Gemfile.lock` | Gemfile lock file. Won't be created if `--bundle` is false. |
55
- | `main.rb` | Main script. |
68
+ | `README.md` | Readme file. Won't be created if `--desc` is false. |
69
+ | `.env.sample` | Sample environment variables. Won't be created if `--desc` is false. |
data/docs/events.md CHANGED
@@ -22,7 +22,7 @@ Since v0.2.5, you can also register event handlers by adding a method to the cli
22
22
  client = Discorb::Client.new
23
23
 
24
24
  class << client
25
- def on_ready
25
+ def on_standby
26
26
  puts "Ready!"
27
27
  end
28
28
  end
@@ -43,7 +43,7 @@ end
43
43
  ```
44
44
 
45
45
  This example will print `Override!`, but not `This event handler is overrideable!`.
46
- This is useful for registering event handlers for default behaviour on errors.
46
+ This is useful for registering event handlers as default behaviour, such as error handlers.
47
47
 
48
48
  ```ruby
49
49
  # In the library...
@@ -55,7 +55,7 @@ end
55
55
  # In your code...
56
56
 
57
57
  client.on :command_error do |event, error|
58
- event.message.reply "An error occurred while executing that command!\n#{error.full_message}"
58
+ event.message.reply "An error occurred while executing the command!\n#{error.full_message}"
59
59
  end
60
60
  ```
61
61
 
@@ -73,7 +73,11 @@ Fires when a event is received.
73
73
 
74
74
  #### `ready()`
75
75
 
76
- Fires when the client is ready.
76
+ Fires when the client receives the `READY` event.
77
+
78
+ #### `standby()`
79
+
80
+ Fires when the client is standby. (When the client connects to Discord, and has cached guilds and members.)
77
81
 
78
82
  #### `resumed()`
79
83
 
data/docs/tutorial.md CHANGED
@@ -101,7 +101,7 @@ Dotenv.load # Loads .env file
101
101
 
102
102
  client = Discorb::Client.new # Create client for connecting to Discord
103
103
 
104
- client.once :ready do
104
+ client.once :standby do
105
105
  puts "Logged in as #{client.user}" # Prints username of logged in user
106
106
  end
107
107
 
@@ -3,7 +3,7 @@ require "json"
3
3
 
4
4
  client = Discorb::Client.new
5
5
 
6
- client.once :ready do
6
+ client.once :standby do
7
7
  puts "Logged in as #{client.user}"
8
8
  end
9
9
 
@@ -2,7 +2,7 @@ require "discorb"
2
2
 
3
3
  client = Discorb::Client.new
4
4
 
5
- client.once :ready do
5
+ client.once :standby do
6
6
  puts "Logged in as #{client.user}"
7
7
  end
8
8
 
@@ -8,7 +8,7 @@ def convert_role(guild, string)
8
8
  end
9
9
  end
10
10
 
11
- client.once :ready do
11
+ client.once :standby do
12
12
  puts "Logged in as #{client.user}"
13
13
  end
14
14
 
@@ -32,7 +32,7 @@ SECTIONS = [
32
32
 
33
33
  WIKIPEDIA_CREDIT = "(From: [Wikipedia](https://en.wikipedia.org/wiki/Ruby_(programming_language)))"
34
34
 
35
- client.once :ready do
35
+ client.once :standby do
36
36
  puts "Logged in as #{client.user}"
37
37
  end
38
38
 
@@ -3,7 +3,7 @@ require_relative "message_expander"
3
3
 
4
4
  client = Discorb::Client.new
5
5
 
6
- client.once :ready do
6
+ client.once :standby do
7
7
  puts "Logged in as #{client.user}"
8
8
  end
9
9
 
@@ -2,7 +2,7 @@ require "discorb"
2
2
 
3
3
  client = Discorb::Client.new
4
4
 
5
- client.once :ready do
5
+ client.once :standby do
6
6
  puts "Logged in as #{client.user}"
7
7
  end
8
8
 
@@ -2,7 +2,7 @@ require "discorb"
2
2
 
3
3
  client = Discorb::Client.new
4
4
 
5
- client.once :ready do
5
+ client.once :standby do
6
6
  puts "Logged in as #{client.user}"
7
7
  end
8
8
 
@@ -9,7 +9,7 @@ def convert_role(guild, string)
9
9
  end
10
10
  end
11
11
 
12
- client.once :ready do
12
+ client.once :standby do
13
13
  puts "Logged in as #{client.user}"
14
14
  end
15
15
 
@@ -2,7 +2,7 @@ require "discorb"
2
2
 
3
3
  client = Discorb::Client.new
4
4
 
5
- client.once :ready do
5
+ client.once :standby do
6
6
  puts "Logged in as #{client.user}"
7
7
  end
8
8
 
@@ -64,11 +64,13 @@ module Discorb
64
64
  # @param [Boolean] colorize_log Whether to colorize the log.
65
65
  # @param [:debug, :info, :warn, :error, :critical] log_level The log level.
66
66
  # @param [Boolean] wait_until_ready Whether to delay event dispatch until ready.
67
+ # @param [Boolean] fetch_member Whether to fetch member on ready. This may slow down the client.
68
+ # Defaultly, it's `false` if {Discorb::Intents#members} is false. Otherwise, it's `true`.
67
69
  #
68
70
  def initialize(
69
71
  allowed_mentions: nil, intents: nil, message_caches: 1000,
70
72
  log: nil, colorize_log: false, log_level: :info,
71
- wait_until_ready: true
73
+ wait_until_ready: true, fetch_member: nil
72
74
  )
73
75
  @allowed_mentions = allowed_mentions || AllowedMentions.new(everyone: true, roles: true, users: true)
74
76
  @intents = (intents or Intents.default)
@@ -91,6 +93,7 @@ module Discorb
91
93
  @commands = []
92
94
  @bottom_commands = []
93
95
  @status = :initialized
96
+ @fetch_member = fetch_member.nil? ? !(intents&.members) : fetch_member
94
97
  set_default_events
95
98
  end
96
99
 
@@ -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.7.1"
7
+ VERSION = "0.8.0"
8
8
  # @return [String] The user agent for the bot.
9
9
  USER_AGENT = "DiscordBot (https://github.com/discorb-lib/discorb #{VERSION}) Ruby/#{RUBY_VERSION}"
10
10
 
data/lib/discorb/error.rb CHANGED
@@ -92,10 +92,12 @@ module Discorb
92
92
  def initialize(resp, client)
93
93
  @client = client
94
94
  @client.close!
95
- DiscorbError.instance_method(:initialize).bind(self).call(<<~MESSAGE)
95
+ message = <<~MESSAGE
96
96
  The client is banned from CloudFlare.
97
97
  Hint: Try to decrease the number of requests per second, e.g. Use sleep in between requests.
98
98
  MESSAGE
99
+ $stderr.puts message
100
+ DiscorbError.instance_method(:initialize).bind(self).call(message)
99
101
  end
100
102
  end
101
103
 
@@ -16,7 +16,7 @@ FILES = {
16
16
 
17
17
  client = Discorb::Client.new # Create client for connecting to Discord
18
18
 
19
- client.once :ready do
19
+ client.once :standby do
20
20
  puts "Logged in as #{client.user}" # Prints username of logged in user
21
21
  end
22
22
 
@@ -96,11 +96,46 @@ FILES = {
96
96
  gem "discorb", "~> #{Discorb::VERSION}"
97
97
  gem "dotenv", "~> 2.7"
98
98
  RUBY
99
+ ".env.sample" => <<~BASH,
100
+ %<token>s=
101
+ BASH
102
+ "README.md" => <<~MARKDOWN,
103
+ # %<name>s
104
+
105
+ Welcome to your bot: %<name>s!
106
+
107
+ TODO: Write your bot's description here.
108
+
109
+ ## Usage
110
+
111
+ TODO: Write your bot's usage here.
112
+
113
+ ## Features
114
+
115
+ TODO: Write your bot's features here.
116
+
117
+ ## How to host
118
+
119
+ 1. Clone the repository.
120
+ 2. Run `bundle install`.
121
+ 3. Get your bot's token from the Discord developer portal.
122
+ 4. Copy `.env.sample` to `.env` and fill in the token.
123
+ 5. Run `bundle exec discorb run`.
124
+
125
+ TODO: Write your own customizations here.
126
+
127
+ ## License
128
+
129
+ TODO: Write your bot's license here.
130
+ See https://choosealicense.com/ for more information.
131
+ https://rubygems.org/gems/license-cli may be useful.
132
+
133
+ MARKDOWN
99
134
  }
100
135
 
101
136
  # @!visibility private
102
137
  def create_file(name)
103
- File.write($path + "/#{name}", format(FILES[name], token: $values[:token]), mode: "wb")
138
+ File.write($path + "/#{name}", format(FILES[name], token: $values[:token], name: $values[:name]), mode: "wb")
104
139
  end
105
140
 
106
141
  # @!visibility private
@@ -132,6 +167,14 @@ def git_init
132
167
  " to change commit message of initial commit.\n"
133
168
  end
134
169
 
170
+ # @!visibility private
171
+ def make_descs
172
+ iputs "Making descriptions..."
173
+ create_file(".env.sample")
174
+ create_file("README.md")
175
+ sputs "Made descriptions.\n"
176
+ end
177
+
135
178
  opt = OptionParser.new <<~BANNER
136
179
  A tool to make a new project.
137
180
 
@@ -145,6 +188,8 @@ $values = {
145
188
  git: false,
146
189
  force: false,
147
190
  token: "TOKEN",
191
+ descs: false,
192
+ name: nil,
148
193
  }
149
194
 
150
195
  opt.on("--[no-]bundle", "Whether to use bundle. Default to true.") do |v|
@@ -155,10 +200,18 @@ opt.on("--[no-]git", "Whether to initialize git. Default to false.") do |v|
155
200
  $values[:git] = v
156
201
  end
157
202
 
203
+ opt.on("--[no-]descs", "Whether to put some file for description. Default to false.") do |v|
204
+ $values[:descs] = v
205
+ end
206
+
158
207
  opt.on("-t NAME", "--token NAME", "The name of token environment variable. Default to TOKEN.") do |v|
159
208
  $values[:token] = v
160
209
  end
161
210
 
211
+ opt.on("-n NAME", "--name NAME", "The name of your project. Default to the directory name.") do |v|
212
+ $values[:name] = v
213
+ end
214
+
162
215
  opt.on("-f", "--force", "Whether to force use directory. Default to false.") do |v|
163
216
  $values[:force] = v
164
217
  end
@@ -187,10 +240,14 @@ if (dir = ARGV[0])
187
240
  Dir.chdir($path)
188
241
  end
189
242
 
243
+ $values[:name] ||= Dir.pwd.split("/").last
244
+
190
245
  bundle_init if $values[:bundle]
191
246
 
192
247
  make_files
193
248
 
194
249
  git_init if $values[:git]
195
250
 
251
+ make_descs if $values[:descs]
252
+
196
253
  sputs "\nSuccessfully made a new project at \e[32m#{$path}\e[92m."
@@ -23,7 +23,7 @@ opt.parse!(ARGV)
23
23
  client = Discorb::Client.new(intents: Discorb::Intents.from_value(intents_value))
24
24
  $messages = []
25
25
 
26
- client.on :ready do
26
+ client.on :standby do
27
27
  puts "\e[96mLogged in as #{client.user}\e[m"
28
28
 
29
29
  def message
data/lib/discorb/flag.rb CHANGED
@@ -8,6 +8,7 @@ module Discorb
8
8
  class Flag
9
9
  # @return [Hash{Symbol => Boolean}] the values of the flag.
10
10
  attr_reader :values
11
+ alias to_h values
11
12
  # @return [Integer] the value of the flag.
12
13
  attr_reader :value
13
14
 
@@ -2,6 +2,8 @@
2
2
 
3
3
  require "async/http"
4
4
  require "async/websocket"
5
+ require "async/barrier"
6
+ require "async/semaphore"
5
7
  require "json"
6
8
  require "zlib"
7
9
 
@@ -488,7 +490,7 @@ module Discorb
488
490
  _, gateway_response = @http.get("/gateway").wait
489
491
  gateway_url = gateway_response[:url]
490
492
  endpoint = Async::HTTP::Endpoint.parse("#{gateway_url}?v=9&encoding=json&compress=zlib-stream",
491
- alpn_protocols: Async::HTTP::Protocol::HTTP11.names)
493
+ alpn_protocols: Async::HTTP::Protocol::HTTP11.names)
492
494
  begin
493
495
  Async::WebSocket::Client.connect(endpoint, headers: [["User-Agent", Discorb::USER_AGENT]], handler: RawConnection) do |connection|
494
496
  @connection = connection
@@ -510,7 +512,9 @@ module Discorb
510
512
  raise ClientError.new("Authentication failed."), cause: nil
511
513
  when "Discord WebSocket requesting client reconnect."
512
514
  @log.info "Discord WebSocket requesting client reconnect"
513
- @tasks.map(&:stop)
515
+ connect_gateway(false)
516
+ else
517
+ @log.error "Discord WebSocket closed: #{e.message}"
514
518
  connect_gateway(false)
515
519
  end
516
520
  rescue EOFError, Async::Wrapper::Cancelled
@@ -579,15 +583,18 @@ module Discorb
579
583
  end
580
584
  end
581
585
 
582
- def handle_heartbeat(interval)
586
+ def handle_heartbeat
583
587
  Async do |task|
588
+ interval = @heartbeat_interval
584
589
  sleep((interval / 1000.0 - 1) * rand)
585
590
  loop do
586
- @heartbeat_before = Time.now.to_f
587
- @connection.write({ op: 1, d: @last_s }.to_json)
588
- @connection.flush
589
- @log.debug "Sent opcode 1."
590
- @log.debug "Waiting for heartbeat."
591
+ unless @connection.closed?
592
+ @heartbeat_before = Time.now.to_f
593
+ @connection.write({ op: 1, d: @last_s }.to_json)
594
+ @connection.flush
595
+ @log.debug "Sent opcode 1."
596
+ @log.debug "Waiting for heartbeat."
597
+ end
591
598
  sleep(interval / 1000.0 - 1)
592
599
  end
593
600
  end
@@ -605,19 +612,17 @@ module Discorb
605
612
  @user = ClientUser.new(self, data[:user])
606
613
  @uncached_guilds = data[:guilds].map { |g| g[:id] }
607
614
  if @uncached_guilds == [] or !@intents.guilds
608
- @ready = true
609
- dispatch(:ready)
610
- @log.info("Successfully connected to Discord.")
615
+ ready
611
616
  end
612
- @tasks << handle_heartbeat(@heartbeat_interval)
617
+ dispatch(:ready)
618
+ @tasks << handle_heartbeat
613
619
  when "GUILD_CREATE"
614
620
  if @uncached_guilds.include?(data[:id])
615
621
  Guild.new(self, data, true)
616
622
  @uncached_guilds.delete(data[:id])
617
623
  if @uncached_guilds == []
618
- @ready = true
619
- dispatch(:ready)
620
- @log.info("Successfully connected to Discord, and cached all guilds.")
624
+ @log.debug "All guilds cached"
625
+ ready
621
626
  end
622
627
  elsif @guilds.has?(data[:id])
623
628
  @guilds[data[:id]].send(:_set_data, data)
@@ -839,12 +844,12 @@ module Discorb
839
844
  dispatch(:voice_state_update, old, current)
840
845
  if old&.channel != current&.channel
841
846
  dispatch(:voice_channel_update, old, current)
842
- case [old&.channel, current&.channel]
843
- in [nil, _]
847
+ case [old&.channel.nil?, current&.channel.nil?]
848
+ when [true, false]
844
849
  dispatch(:voice_channel_connect, current)
845
- in [_, nil]
850
+ when [false, true]
846
851
  dispatch(:voice_channel_disconnect, old)
847
- in _
852
+ when [false, false]
848
853
  dispatch(:voice_channel_move, old, current)
849
854
  end
850
855
  end
@@ -980,9 +985,9 @@ module Discorb
980
985
  dispatch(:reaction_add, ReactionEvent.new(self, data))
981
986
  when "MESSAGE_REACTION_REMOVE"
982
987
  if (target_message = @messages[data[:message_id]]) &&
983
- (target_reaction = target_message.reactions.find do |r|
984
- data[:emoji][:id].nil? ? r.emoji.name == data[:emoji][:name] : r.emoji.id == data[:emoji][:id]
985
- end)
988
+ (target_reaction = target_message.reactions.find do |r|
989
+ data[:emoji][:id].nil? ? r.emoji.name == data[:emoji][:name] : r.emoji.id == data[:emoji][:id]
990
+ end)
986
991
  target_reaction.instance_variable_set(:@count, target_reaction.count - 1)
987
992
  target_message.reactions.delete(target_reaction) if target_reaction.count.zero?
988
993
  end
@@ -994,7 +999,7 @@ module Discorb
994
999
  dispatch(:reaction_remove_all, ReactionRemoveAllEvent.new(self, data))
995
1000
  when "MESSAGE_REACTION_REMOVE_EMOJI"
996
1001
  if (target_message = @messages[data[:message_id]]) &&
997
- (target_reaction = target_message.reactions.find { |r| data[:emoji][:id].nil? ? r.name == data[:emoji][:name] : r.id == data[:emoji][:id] })
1002
+ (target_reaction = target_message.reactions.find { |r| data[:emoji][:id].nil? ? r.name == data[:emoji][:name] : r.id == data[:emoji][:id] })
998
1003
  target_message.reactions.delete(target_reaction)
999
1004
  end
1000
1005
  dispatch(:reaction_remove_emoji, ReactionRemoveEmojiEvent.new(data))
@@ -1016,26 +1021,56 @@ module Discorb
1016
1021
  end
1017
1022
  end
1018
1023
  end
1024
+
1025
+ def ready
1026
+ Async do
1027
+ if @fetch_member
1028
+ @log.debug "Fetching members"
1029
+ barrier = Async::Barrier.new
1030
+ semaphore = Async::Semaphore.new(@guilds.length)
1031
+
1032
+ @guilds.each do |guild|
1033
+ semaphore.async(parent: barrier) do
1034
+ guild.fetch_members
1035
+ end
1036
+ end
1037
+ semaphore.__send__(:wait)
1038
+ end
1039
+ @ready = true
1040
+ dispatch(:standby)
1041
+ @log.info("Client is ready!")
1042
+ end
1043
+ end
1019
1044
  end
1020
-
1045
+
1021
1046
  #
1022
1047
  # A class for connecting websocket with raw bytes data.
1023
1048
  # @private
1024
1049
  #
1025
- class RawConnection < Async::WebSocket::Connection
1026
- def initialize(...)
1050
+ class RawConnection < Async::WebSocket::Connection
1051
+ def initialize(*, **)
1052
+ super
1053
+ @closed = false
1054
+ end
1055
+
1056
+ def closed?
1057
+ @closed
1058
+ end
1059
+
1060
+ def close
1027
1061
  super
1062
+ @closed = true
1028
1063
  end
1029
-
1030
- def parse(buffer)
1031
- # noop
1064
+
1065
+ def parse(buffer)
1066
+ # noop
1032
1067
  buffer.to_s
1033
- end
1034
-
1035
- def dump(object)
1036
- # noop
1068
+ end
1069
+
1070
+ def dump(object)
1071
+ # noop
1037
1072
  object.to_s
1038
- end
1073
+ end
1039
1074
  end
1040
1075
  end
1041
- end
1076
+ end