discorb 0.16.0 → 0.17.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 (115) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +1 -0
  3. data/.github/workflows/build_main.yml +2 -2
  4. data/.github/workflows/build_version.yml +1 -1
  5. data/.github/workflows/codeql-analysis.yml +1 -1
  6. data/.github/workflows/lint-push.yml +3 -5
  7. data/.github/workflows/lint.yml +1 -1
  8. data/.github/workflows/spec.yml +30 -0
  9. data/.lefthook/commit-msg/validator.rb +5 -0
  10. data/.rspec +2 -0
  11. data/.rspec_parallel +2 -0
  12. data/.rubocop.yml +43 -6
  13. data/Changelog.md +14 -1
  14. data/Gemfile +14 -8
  15. data/Rakefile +41 -26
  16. data/bin/console +3 -3
  17. data/docs/Examples.md +1 -1
  18. data/docs/application_command.md +138 -46
  19. data/docs/cli/irb.md +2 -2
  20. data/docs/cli/new.md +14 -9
  21. data/docs/cli/run.md +7 -11
  22. data/docs/cli.md +17 -10
  23. data/docs/events.md +209 -211
  24. data/docs/extension.md +1 -2
  25. data/docs/faq.md +0 -1
  26. data/docs/tutorial.md +12 -12
  27. data/docs/voice_events.md +106 -106
  28. data/examples/commands/message.rb +63 -0
  29. data/examples/commands/permission.rb +18 -0
  30. data/examples/commands/slash.rb +44 -0
  31. data/examples/commands/user.rb +51 -0
  32. data/examples/components/authorization_button.rb +2 -2
  33. data/examples/components/select_menu.rb +2 -2
  34. data/examples/extension/main.rb +1 -1
  35. data/examples/extension/message_expander.rb +5 -2
  36. data/examples/simple/eval.rb +2 -2
  37. data/examples/simple/ping_pong.rb +1 -1
  38. data/examples/simple/rolepanel.rb +1 -1
  39. data/examples/simple/shard.rb +1 -1
  40. data/examples/simple/wait_for_message.rb +1 -1
  41. data/exe/discorb +31 -16
  42. data/lefthook.yml +45 -0
  43. data/lib/discorb/allowed_mentions.rb +1 -0
  44. data/lib/discorb/app_command/command.rb +127 -65
  45. data/lib/discorb/app_command/common.rb +25 -0
  46. data/lib/discorb/app_command/handler.rb +115 -33
  47. data/lib/discorb/app_command.rb +2 -1
  48. data/lib/discorb/application.rb +1 -0
  49. data/lib/discorb/asset.rb +1 -2
  50. data/lib/discorb/attachment.rb +1 -1
  51. data/lib/discorb/audit_logs.rb +11 -8
  52. data/lib/discorb/channel/base.rb +108 -0
  53. data/lib/discorb/channel/category.rb +32 -0
  54. data/lib/discorb/channel/container.rb +44 -0
  55. data/lib/discorb/channel/dm.rb +28 -0
  56. data/lib/discorb/channel/guild.rb +245 -0
  57. data/lib/discorb/channel/stage.rb +140 -0
  58. data/lib/discorb/channel/text.rb +345 -0
  59. data/lib/discorb/channel/thread.rb +321 -0
  60. data/lib/discorb/channel/voice.rb +79 -0
  61. data/lib/discorb/channel.rb +2 -1165
  62. data/lib/discorb/client.rb +38 -26
  63. data/lib/discorb/common.rb +2 -1
  64. data/lib/discorb/components/button.rb +2 -1
  65. data/lib/discorb/components/select_menu.rb +4 -2
  66. data/lib/discorb/components/text_input.rb +12 -2
  67. data/lib/discorb/components.rb +1 -1
  68. data/lib/discorb/embed.rb +22 -7
  69. data/lib/discorb/emoji.rb +30 -3
  70. data/lib/discorb/emoji_table.rb +4969 -3
  71. data/lib/discorb/event.rb +29 -4
  72. data/lib/discorb/exe/about.rb +1 -0
  73. data/lib/discorb/exe/irb.rb +2 -4
  74. data/lib/discorb/exe/new.rb +90 -23
  75. data/lib/discorb/exe/run.rb +8 -22
  76. data/lib/discorb/exe/setup.rb +25 -12
  77. data/lib/discorb/exe/show.rb +4 -3
  78. data/lib/discorb/extend.rb +1 -0
  79. data/lib/discorb/extension.rb +6 -3
  80. data/lib/discorb/flag.rb +11 -0
  81. data/lib/discorb/gateway.rb +67 -19
  82. data/lib/discorb/guild.rb +188 -56
  83. data/lib/discorb/guild_template.rb +10 -4
  84. data/lib/discorb/http.rb +16 -9
  85. data/lib/discorb/integration.rb +4 -1
  86. data/lib/discorb/intents.rb +1 -1
  87. data/lib/discorb/interaction/autocomplete.rb +28 -16
  88. data/lib/discorb/interaction/command.rb +36 -12
  89. data/lib/discorb/interaction/components.rb +5 -2
  90. data/lib/discorb/interaction/modal.rb +0 -1
  91. data/lib/discorb/interaction/response.rb +61 -22
  92. data/lib/discorb/interaction/root.rb +13 -13
  93. data/lib/discorb/interaction.rb +1 -0
  94. data/lib/discorb/invite.rb +5 -2
  95. data/lib/discorb/member.rb +25 -5
  96. data/lib/discorb/message.rb +47 -14
  97. data/lib/discorb/message_meta.rb +1 -0
  98. data/lib/discorb/modules.rb +56 -14
  99. data/lib/discorb/presence.rb +2 -2
  100. data/lib/discorb/rate_limit.rb +7 -2
  101. data/lib/discorb/reaction.rb +4 -4
  102. data/lib/discorb/role.rb +19 -4
  103. data/lib/discorb/shard.rb +1 -1
  104. data/lib/discorb/sticker.rb +8 -7
  105. data/lib/discorb/user.rb +2 -1
  106. data/lib/discorb/utils/colored_puts.rb +1 -0
  107. data/lib/discorb/voice_state.rb +10 -6
  108. data/lib/discorb/webhook.rb +36 -24
  109. data/lib/discorb.rb +5 -3
  110. data/po/yard.pot +9 -9
  111. data/sig/discorb.rbs +7232 -7235
  112. metadata +21 -5
  113. data/examples/commands/bookmarker.rb +0 -42
  114. data/examples/commands/hello.rb +0 -10
  115. data/examples/commands/inspect.rb +0 -25
data/lib/discorb/event.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Discorb
3
4
  #
4
5
  # Represents an event in guild.
@@ -38,6 +39,7 @@ module Discorb
38
39
  class Metadata
39
40
  # @return [String, nil] The location of the event. Only present if the event is a external event.
40
41
  attr_reader :location
42
+
41
43
  # @!visibility private
42
44
  def initialize(data)
43
45
  @location = data[:location]
@@ -137,6 +139,7 @@ module Discorb
137
139
  payload = case type == Discorb::Unset ? @entity_type : type
138
140
  when :stage_instance
139
141
  raise ArgumentError, "channel must be provided for stage_instance events" unless channel
142
+
140
143
  {
141
144
  name: name,
142
145
  description: description,
@@ -149,6 +152,7 @@ module Discorb
149
152
  }.reject { |_, v| v == Discorb::Unset }
150
153
  when :voice
151
154
  raise ArgumentError, "channel must be provided for voice events" unless channel
155
+
152
156
  {
153
157
  name: name,
154
158
  description: description,
@@ -162,6 +166,7 @@ module Discorb
162
166
  when :external
163
167
  raise ArgumentError, "location must be provided for external events" unless location
164
168
  raise ArgumentError, "end_time must be provided for external events" unless end_time
169
+
165
170
  {
166
171
  name: name,
167
172
  description: description,
@@ -178,7 +183,13 @@ module Discorb
178
183
  else
179
184
  raise ArgumentError, "Invalid scheduled event type: #{type}"
180
185
  end
181
- @client.http.request(Route.new("/guilds/#{@guild_id}/scheduled-events/#{@id}", "//guilds/:guild_id/scheduled-events/:scheduled_event_id", :patch), payload).wait
186
+ @client.http.request(
187
+ Route.new(
188
+ "/guilds/#{@guild_id}/scheduled-events/#{@id}",
189
+ "//guilds/:guild_id/scheduled-events/:scheduled_event_id",
190
+ :patch
191
+ ), payload
192
+ ).wait
182
193
  end
183
194
  end
184
195
 
@@ -215,7 +226,8 @@ module Discorb
215
226
  #
216
227
  def delete!
217
228
  Async do
218
- @client.http.request(Route.new("/guilds/#{@guild_id}/scheduled-events/#{@id}", "//guilds/:guild_id/scheduled-events/:scheduled_event_id", :delete)).wait
229
+ @client.http.request(Route.new("/guilds/#{@guild_id}/scheduled-events/#{@id}",
230
+ "//guilds/:guild_id/scheduled-events/:scheduled_event_id", :delete)).wait
219
231
  end
220
232
  end
221
233
 
@@ -241,8 +253,15 @@ module Discorb
241
253
  after = 0
242
254
  res = []
243
255
  loop do
244
- _resp, users = @client.http.request(Route.new("/guilds/#{@guild_id}/scheduled-events/#{@id}/users?limit=100&after=#{after}&with_member=true", "//guilds/:guild_id/scheduled-events/:scheduled_event_id/users", :get)).wait
256
+ _resp, users = @client.http.request(
257
+ Route.new(
258
+ "/guilds/#{@guild_id}/scheduled-events/#{@id}/users?limit=100&after=#{after}&with_member=true",
259
+ "//guilds/:guild_id/scheduled-events/:scheduled_event_id/users",
260
+ :get
261
+ )
262
+ ).wait
245
263
  break if users.empty?
264
+
246
265
  res += users.map { |u| Member.new(@client, @guild_id, u[:user], u[:member]) }
247
266
  after = users.last[:user][:id]
248
267
  end
@@ -254,7 +273,13 @@ module Discorb
254
273
  after: Discorb::Utils.try(after, :id),
255
274
  with_member: with_member,
256
275
  }.filter { |_k, v| !v.nil? }.to_h
257
- _resp, messages = @client.http.request(Route.new("/channels/#{channel_id.wait}/messages?#{URI.encode_www_form(params)}", "//channels/:channel_id/messages", :get)).wait
276
+ _resp, messages = @client.http.request(
277
+ Route.new(
278
+ "/channels/#{channel_id.wait}/messages?#{URI.encode_www_form(params)}",
279
+ "//channels/:channel_id/messages",
280
+ :get
281
+ )
282
+ ).wait
258
283
  messages.map { |m| Message.new(@client, m.merge({ guild_id: @guild_id.to_s })) }
259
284
  end
260
285
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # description: Show information of discorb.
3
4
 
4
5
  puts " disco\e[31mrb\e[m - A new Discord API wrapper in Ruby. \n\n"
@@ -10,8 +10,6 @@ require "optparse"
10
10
  intents_value = Discorb::Intents.all.value
11
11
  token_file = "token"
12
12
 
13
- ARGV.delete_at 0
14
-
15
13
  opt = OptionParser.new <<~BANNER
16
14
  This command will start an interactive Ruby shell with connected client.
17
15
 
@@ -43,7 +41,7 @@ client.on :standby do
43
41
 
44
42
  puts <<~FIRST_MESSAGE
45
43
  Running on \e[31mRuby #{RUBY_VERSION}\e[m, disco\e[31mrb #{Discorb::VERSION}\e[m
46
- Type \e[90mdirb_help\e[m to help.
44
+ Type \e[90mdirb_help\e[m to help.
47
45
  FIRST_MESSAGE
48
46
 
49
47
  binding.irb
@@ -55,7 +53,7 @@ client.on :message do |message|
55
53
  $messages << message
56
54
  end
57
55
 
58
- token = ENV["DISCORD_BOT_TOKEN"] || ENV["DISCORD_TOKEN"]
56
+ token = ENV.fetch("DISCORD_BOT_TOKEN", nil) || ENV.fetch("DISCORD_TOKEN", nil)
59
57
  if token.nil?
60
58
  if File.exist?(token_file)
61
59
  token = File.read(token_file)
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # description: Make files for the discorb project.
3
4
 
4
5
  require "optparse"
5
6
  require "discorb"
7
+ require "pathname"
6
8
  require_relative "../utils/colored_puts"
7
9
 
8
10
  $path = Dir.pwd
@@ -10,10 +12,10 @@ $path = Dir.pwd
10
12
  # @private
11
13
  FILES = {
12
14
  "main.rb" => <<~'RUBY',
13
- require "discorb"
14
- require "dotenv"
15
+ # frozen_string_literal: true
15
16
 
16
- Dotenv.load # Loads .env file
17
+ require "discorb"
18
+ require "dotenv/load" # Load environment variables from .env file.
17
19
 
18
20
  client = Discorb::Client.new # Create client for connecting to Discord
19
21
 
@@ -23,8 +25,26 @@ FILES = {
23
25
 
24
26
  client.run ENV["%<token>s"] # Starts client
25
27
  RUBY
28
+ "main.rb_nc" => <<~'RUBY',
29
+ # frozen_string_literal: true
30
+
31
+ require "discorb"
32
+ require "dotenv/load"
33
+
34
+ client = Discorb::Client.new
35
+
36
+ client.once :standby do
37
+ puts "Logged in as #{client.user}"
38
+ end
39
+
40
+ client.run ENV["%<token>s"]
41
+ RUBY
26
42
  ".env" => <<~BASH,
27
- %<token>s=Y0urB0tT0k3nHer3.Th1sT0ken.W0ntWorkB3c4useItH4sM34n1ng
43
+ # Put your token after `%<token>s=`
44
+ %<token>s=
45
+ BASH
46
+ ".env_nc" => <<~BASH,
47
+ %<token>s=
28
48
  BASH
29
49
  ".gitignore" => <<~GITIGNORE,
30
50
  *.gem
@@ -38,13 +58,13 @@ FILES = {
38
58
  /test/tmp/
39
59
  /test/version_tmp/
40
60
  /tmp/
41
-
61
+
42
62
  # Used by dotenv library to load environment variables.
43
63
  .env
44
-
64
+
45
65
  # Ignore Byebug command history file.
46
66
  .byebug_history
47
-
67
+
48
68
  ## Specific to RubyMotion:
49
69
  .dat*
50
70
  .repl_history
@@ -52,7 +72,7 @@ FILES = {
52
72
  *.bridgesupport
53
73
  build-iPhoneOS/
54
74
  build-iPhoneSimulator/
55
-
75
+
56
76
  ## Specific to RubyMotion (use of CocoaPods):
57
77
  #
58
78
  # We recommend against adding the Pods directory to your .gitignore. However
@@ -60,33 +80,68 @@ FILES = {
60
80
  # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
61
81
  #
62
82
  # vendor/Pods/
63
-
83
+
64
84
  ## Documentation cache and generated files:
65
85
  /.yardoc/
66
86
  /_yardoc/
67
87
  /doc/
68
88
  /rdoc/
69
-
89
+
70
90
  ## Environment normalization:
71
91
  /.bundle/
72
92
  /vendor/bundle
73
93
  /lib/bundler/man/
74
-
94
+
75
95
  # for a library or gem, you might want to ignore these files since the code is
76
96
  # intended to run in multiple environments; otherwise, check them in:
77
97
  # Gemfile.lock
78
98
  # .ruby-version
79
99
  # .ruby-gemset
80
-
100
+
81
101
  # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
82
102
  .rvmrc
83
-
103
+
84
104
  # Used by RuboCop. Remote config files pulled in from inherit_from directive.
85
105
  # .rubocop-https?--*
86
106
 
87
107
  # This gitignore is from github/gitignore.
88
108
  # https://github.com/github/gitignore/blob/master/Ruby.gitignore
89
109
  GITIGNORE
110
+ ".gitignore_nc" => <<~GITIGNORE,
111
+ *.gem
112
+ *.rbc
113
+ /.config
114
+ /coverage/
115
+ /InstalledFiles
116
+ /pkg/
117
+ /spec/reports/
118
+ /spec/examples.txt
119
+ /test/tmp/
120
+ /test/version_tmp/
121
+ /tmp/
122
+
123
+ .env
124
+
125
+ .byebug_history
126
+
127
+ .dat*
128
+ .repl_history
129
+ build/
130
+ *.bridgesupport
131
+ build-iPhoneOS/
132
+ build-iPhoneSimulator/
133
+
134
+ /.yardoc/
135
+ /_yardoc/
136
+ /doc/
137
+ /rdoc/
138
+
139
+ /.bundle/
140
+ /vendor/bundle
141
+ /lib/bundler/man/
142
+
143
+ .rvmrc
144
+ GITIGNORE
90
145
  "Gemfile" => <<~RUBY,
91
146
  # frozen_string_literal: true
92
147
 
@@ -96,6 +151,8 @@ FILES = {
96
151
 
97
152
  gem "discorb", "~> #{Discorb::VERSION}"
98
153
  gem "dotenv", "~> 2.7"
154
+
155
+ ruby "~> #{RUBY_VERSION.split(".")[0]}.#{RUBY_VERSION.split(".")[1]}"
99
156
  RUBY
100
157
  ".env.sample" => <<~BASH,
101
158
  %<token>s=
@@ -129,14 +186,16 @@ FILES = {
129
186
 
130
187
  TODO: Write your bot's license here.
131
188
  See https://choosealicense.com/ for more information.
132
- https://rubygems.org/gems/license-cli may be useful.
133
189
 
134
190
  MARKDOWN
135
191
  }.freeze
136
192
 
137
193
  # @private
138
194
  def create_file(name)
139
- File.write($path + "/#{name}", format(FILES[name], token: $values[:token], name: $values[:name]), mode: "wb")
195
+ template_name = name
196
+ template_name += "_nc" if !$values[:comment] && FILES.key?(name + "_nc")
197
+ content = format(FILES[template_name], token: $values[:token], name: $values[:name])
198
+ File.write($path + "/#{name}", content, mode: "wb")
140
199
  end
141
200
 
142
201
  # @private
@@ -152,7 +211,7 @@ def bundle_init
152
211
  iputs "Initializing bundle..."
153
212
  create_file("Gemfile")
154
213
  iputs "Installing gems..."
155
- system "bundle install"
214
+ system({ "BUNDLE_GEMFILE" => nil }, "bundle install", chdir: $path)
156
215
  sputs "Installed gems.\n"
157
216
  end
158
217
 
@@ -160,9 +219,9 @@ end
160
219
  def git_init
161
220
  create_file(".gitignore")
162
221
  iputs "Initializing git repository..."
163
- system "git init"
164
- system "git add ."
165
- system "git commit -m \"Initial commit\""
222
+ system "git init", chdir: $path
223
+ system "git add .", chdir: $path
224
+ system "git commit -m \"Initial commit\"", chdir: $path
166
225
  sputs "Initialized repository, use " \
167
226
  "\e[32mgit commit --amend -m '...'\e[92m" \
168
227
  " to change commit message of initial commit.\n"
@@ -191,6 +250,7 @@ $values = {
191
250
  token: "TOKEN",
192
251
  descs: false,
193
252
  name: nil,
253
+ comment: true,
194
254
  }
195
255
 
196
256
  opt.on("--[no-]bundle", "Whether to use bundle. Default to true.") do |v|
@@ -205,6 +265,10 @@ opt.on("--[no-]descs", "Whether to put some file for description. Default to fal
205
265
  $values[:descs] = v
206
266
  end
207
267
 
268
+ opt.on("--[no-]comment", "Whether to write comment. Default to true.") do |v|
269
+ $values[:comment] = v
270
+ end
271
+
208
272
  opt.on("-t NAME", "--token NAME", "The name of token environment variable. Default to TOKEN.") do |v|
209
273
  $values[:token] = v
210
274
  end
@@ -213,16 +277,16 @@ opt.on("-n NAME", "--name NAME", "The name of your project. Default to the direc
213
277
  $values[:name] = v
214
278
  end
215
279
 
216
- opt.on("-f", "--force", "Whether to force use directory. Default to false.") do |v|
280
+ opt.on("--force", "-f", "Whether to force use directory. Default to false.") do |v|
217
281
  $values[:force] = v
218
282
  end
219
283
 
220
- ARGV.delete_at(0)
221
-
222
284
  opt.parse!(ARGV)
223
285
 
224
286
  if (dir = ARGV[0])
225
287
  $path += "/#{dir}"
288
+ $path = File.expand_path($path)
289
+ dir = File.basename($path)
226
290
  if Dir.exist?($path)
227
291
  if Dir.empty?($path)
228
292
  iputs "Found \e[30m#{dir}\e[90m and empty, using this directory."
@@ -237,6 +301,9 @@ if (dir = ARGV[0])
237
301
  iputs "Couldn't find \e[30m#{dir}\e[90m, created directory."
238
302
  end
239
303
  Dir.chdir($path)
304
+ else
305
+ puts opt
306
+ abort
240
307
  end
241
308
 
242
309
  $values[:name] ||= Dir.pwd.split("/").last
@@ -249,4 +316,4 @@ make_descs if $values[:descs]
249
316
 
250
317
  git_init if $values[:git]
251
318
 
252
- sputs "\nSuccessfully made a new project at \e[32m#{$path}\e[92m."
319
+ sputs "\nSuccessfully made a new project at \e[32m#{Pathname.new($path).cleanpath.split[-1]}\e[92m."
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # description: Run a client.
3
4
  require "optparse"
4
5
  require "json"
@@ -6,8 +7,6 @@ require "discorb/utils/colored_puts"
6
7
  require "io/console"
7
8
  require "discorb"
8
9
 
9
- ARGV.delete_at 0
10
-
11
10
  opt = OptionParser.new <<~BANNER
12
11
  This command will run a client.
13
12
 
@@ -19,12 +18,13 @@ options = {
19
18
  title: nil,
20
19
  setup: nil,
21
20
  token: false,
22
- bundler: :default,
23
21
  }
24
22
  opt.on("-s", "--setup", "Whether to setup application commands.") { |v| options[:setup] = v }
25
- opt.on("-e", "--env [ENV]", "The name of the environment variable to use for token, or just `-e` or `--env` for intractive prompt.") { |v| options[:token] = v }
23
+ opt.on("-e", "--env [ENV]",
24
+ "The name of the environment variable to use for token, or just `-e` or `--env` for intractive prompt.") do |v|
25
+ options[:token] = v
26
+ end
26
27
  opt.on("-t", "--title TITLE", "The title of process.") { |v| options[:title] = v }
27
- opt.on("-b", "--[no-]bundler", "Whether to use bundler. Default to true if Gemfile exists, otherwise false.") { |v| options[:bundler] = v }
28
28
  opt.parse!(ARGV)
29
29
 
30
30
  script = ARGV[0]
@@ -38,6 +38,7 @@ if script.nil?
38
38
  break
39
39
  end
40
40
  break if dir == File.dirname(dir)
41
+
41
42
  dir = File.dirname(dir)
42
43
  end
43
44
  if File.dirname(script) != Dir.pwd
@@ -50,7 +51,7 @@ ENV["DISCORB_CLI_FLAG"] = "run"
50
51
  ENV["DISCORB_CLI_OPTIONS"] = JSON.generate(options)
51
52
 
52
53
  if options[:token]
53
- ENV["DISCORB_CLI_TOKEN"] = ENV[options[:token]]
54
+ ENV["DISCORB_CLI_TOKEN"] = ENV.fetch(options[:token], nil)
54
55
  raise "#{options[:token]} is not set." if ENV["DISCORB_CLI_TOKEN"].nil?
55
56
  elsif options[:token].nil? || options[:token] == "-"
56
57
  print "\e[90mPlease enter your token: \e[m"
@@ -58,25 +59,10 @@ elsif options[:token].nil? || options[:token] == "-"
58
59
  puts ""
59
60
  end
60
61
 
61
- if options[:bundler] == :default
62
- dir = Dir.pwd.split("/")
63
- options[:bundler] = false
64
- dir.length.times.reverse_each do |i|
65
- if File.exist? "#{dir[0..i].join("/")}/Gemfile"
66
- options[:bundler] = true
67
- break
68
- end
69
- end
70
- end
71
-
72
62
  ENV["DISCORB_CLI_TITLE"] = options[:title]
73
63
 
74
64
  if File.exist? script
75
- if options[:bundler]
76
- exec "bundle exec ruby #{script}"
77
- else
78
- exec "ruby #{script}"
79
- end
65
+ exec "ruby #{script}"
80
66
  else
81
67
  eputs "Could not load script: \e[31m#{script}\e[91m"
82
68
  end
@@ -1,10 +1,9 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # description: Setup application commands.
3
4
  require "optparse"
4
5
  require "discorb/utils/colored_puts"
5
6
 
6
- ARGV.delete_at 0
7
-
8
7
  options = {
9
8
  guilds: nil,
10
9
  script: true,
@@ -17,8 +16,21 @@ opt = OptionParser.new <<~BANNER
17
16
 
18
17
  script The script to setup.
19
18
  BANNER
20
- opt.on("-g", "--guild ID", Array, "The guild ID to setup, use comma for setup commands in multiple guilds, or `global` for setup global commands.") { |v| options[:guilds] = v }
21
- opt.on("-s", "--[no-]script", "Whether to run `:setup` event. This may be useful if setup script includes operation that shouldn't run twice. Default to true.") { |v| options[:script] = v }
19
+ opt.on("-g", "--guild ID", Array,
20
+ "The guild ID to setup, use comma for setup commands in multiple guilds, " \
21
+ "or `global` for setup global commands.") do |v|
22
+ options[:guilds] = v
23
+ end
24
+ opt.on("-c", "--clear-guild ID", Array,
25
+ "The guild ID to clear command, use comma for clear commands in multiple guilds, " \
26
+ "or `global` for clear global commands.") do |v|
27
+ options[:clear_guilds] = v
28
+ end
29
+ opt.on("-s", "--[no-]script",
30
+ "Whether to run `:setup` event. " \
31
+ "This may be useful if setup script includes operation that shouldn't run twice. Default to true.") do |v|
32
+ options[:script] = v
33
+ end
22
34
  opt.parse!(ARGV)
23
35
 
24
36
  script = ARGV[0]
@@ -26,17 +38,18 @@ script ||= "main.rb"
26
38
  ENV["DISCORB_CLI_FLAG"] = "setup"
27
39
 
28
40
  ENV["DISCORB_SETUP_GUILDS"] = if options[:guilds] == ["global"]
29
- "global"
30
- elsif options[:guilds]
31
- options[:guilds].join(",")
32
- end
41
+ "global"
42
+ elsif options[:guilds]
43
+ options[:guilds].join(",")
44
+ end
45
+
46
+ ENV["DISCORB_SETUP_CLEAR_GUILDS"] = options[:clear_guilds]&.join(",")
33
47
 
34
48
  ENV["DISCORB_SETUP_SCRIPT"] = options[:script].to_s if options[:script]
35
49
 
36
- begin
50
+ if File.exist? script
37
51
  load script
38
- rescue LoadError
39
- eputs "Could not load script: \e[31m#{script}\e[m"
40
- else
41
52
  sputs "Successfully set up commands for \e[32m#{script}\e[m."
53
+ else
54
+ eputs "Could not load script: \e[31m#{script}\e[m"
42
55
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # description: Show information of your environment.
3
4
 
4
5
  require "etc"
5
6
  require "discorb"
6
7
 
7
- puts "\e[90mRuby:\e[m #{RUBY_VERSION}"
8
- puts "\e[90mdiscorb:\e[m #{Discorb::VERSION}"
8
+ puts "\e[90m Ruby:\e[m #{RUBY_VERSION}"
9
+ puts "\e[90m discorb:\e[m #{Discorb::VERSION}"
9
10
  uname = Etc.uname
10
- puts "\e[90mSystem:\e[m #{uname[:sysname]} #{uname[:release]}"
11
+ puts "\e[90m System:\e[m #{uname[:sysname]} #{uname[:release]}"
11
12
  puts "\e[90mPlatform:\e[m #{RUBY_PLATFORM}"
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # rubocop: disable Style/Documentation
3
4
 
4
5
  class Time
@@ -14,10 +14,13 @@ module Discorb
14
14
 
15
15
  def events
16
16
  return @events if @events
17
+
17
18
  ret = {}
18
19
  self.class.events.each do |event, handlers|
19
20
  ret[event] = handlers.map do |handler|
20
- Discorb::EventHandler.new(proc { |*args, **kwargs| instance_exec(*args, **kwargs, &handler[2]) }, handler[0], handler[1])
21
+ Discorb::EventHandler.new(proc { |*args, **kwargs|
22
+ instance_exec(*args, **kwargs, &handler[2])
23
+ }, handler[0], handler[1])
21
24
  end
22
25
  end
23
26
  @events = ret
@@ -72,11 +75,11 @@ module Discorb
72
75
  # @return [Array<Discorb::ApplicationCommand::Command>] The commands of the extension.
73
76
  attr_reader :commands
74
77
  # @private
75
- attr_reader :bottom_commands
78
+ attr_reader :callable_commands
76
79
 
77
80
  def self.extended(klass)
78
81
  klass.instance_variable_set(:@commands, [])
79
- klass.instance_variable_set(:@bottom_commands, [])
82
+ klass.instance_variable_set(:@callable_commands, [])
80
83
  klass.instance_variable_set(:@events, {})
81
84
  end
82
85
  end
data/lib/discorb/flag.rb CHANGED
@@ -96,6 +96,10 @@ module Discorb
96
96
  self.class.new(~@value)
97
97
  end
98
98
 
99
+ def to_i
100
+ @value
101
+ end
102
+
99
103
  def inspect
100
104
  "#<#{self.class}: #{@value}>"
101
105
  end
@@ -112,6 +116,13 @@ module Discorb
112
116
  def max_value
113
117
  2 ** @bits.values.max - 1
114
118
  end
119
+
120
+ #
121
+ # Initialize a new flag with keys.
122
+ #
123
+ def from_keys(*keys)
124
+ new(keys.sum { |k| 1 << @bits[k] })
125
+ end
115
126
  end
116
127
  end
117
128
  end