discorb 0.2.5 → 0.4.1

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.
data/docs/cli/run.md ADDED
@@ -0,0 +1,46 @@
1
+ # @title CLI: discorb run
2
+
3
+ # discorb run
4
+
5
+ This command will run a client.
6
+
7
+
8
+ ## Usage
9
+
10
+ ```
11
+ discorb run [options] [script]
12
+ ```
13
+
14
+ ### Arguments
15
+
16
+ #### `script`
17
+
18
+ The script to run. Defaults to `main.rb`.
19
+
20
+ #### `-d`, `--deamon`
21
+
22
+ Run the client in deamon mode.
23
+
24
+ #### `-l`, `--log-level`
25
+
26
+ Specify the log level.
27
+ Should be one of the following:
28
+
29
+ * `none`
30
+ * `debug`
31
+ * `info`
32
+ * `warn`
33
+ * `error`
34
+ * `fatal`
35
+
36
+ #### `-f`, `--log-file`
37
+
38
+ Specify the file to write logs to.
39
+ You can use `stdout` to write to the standard output, and `stderr` to write to the standard error.
40
+
41
+ #### `-c`, `--[no-]log-color`
42
+
43
+ Whether to colorize the log output.
44
+ If not specified, the default will be:
45
+ - `true` if the file to write logs to is `stdout` or `stderr`.
46
+ - `false` otherwise.
data/docs/cli/setup.md ADDED
@@ -0,0 +1,17 @@
1
+ # @title CLI: discorb setup
2
+
3
+ # discorb setup
4
+
5
+ This command will setup application commands.
6
+
7
+ ## Usage
8
+
9
+ ```
10
+ discorb setup [script]
11
+ ```
12
+
13
+ ### Arguments
14
+
15
+ #### `script`
16
+
17
+ The script to setup. Defaults to `main.rb`.
data/docs/cli.md ADDED
@@ -0,0 +1,25 @@
1
+ # @title CLI tools
2
+
3
+ # CLI tools
4
+
5
+ discorb has a CLI tool for developing.
6
+
7
+ ## Usage
8
+
9
+ ```bash
10
+ bundle exec discorb <command> ...
11
+ ```
12
+
13
+ ## Commands
14
+
15
+ Currently, discorb has the following commands:
16
+
17
+ | Command | Description |
18
+ |---------|-------------|
19
+ | {file:docs/cli/init.md `init`} | Create a new project. |
20
+ | {file:docs/cli/irb.md `irb`} | Start an interactive Ruby shell with connected client. |
21
+ | {file:docs/cli/run.md `run`} | Run a client. |
22
+ | {file:docs/cli/setup.md `setup`} | Setup application commands. |
23
+ | `show` | Show your environment. (No document) |
24
+
25
+ Click the command name to see the document.
data/exe/discorb ADDED
@@ -0,0 +1,31 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ script = ARGV[0]
4
+
5
+ if script.nil?
6
+ puts "\e[94mThis is a tool for discorb. Currently these tools are available:\e[m"
7
+
8
+ discorb_path = $:.find { |path| File.directory?(path + "/discorb") }
9
+ scripts = {}
10
+ Dir.glob(discorb_path + "/discorb/exe/*.rb") do |script|
11
+ name = File.basename(script, ".rb")
12
+ description = File.read(script).match(/# description: (.+)/)&.[](1) || "No description"
13
+ scripts[name] = description
14
+ end
15
+ max_length = scripts.keys.map { |key| key.length }.max
16
+ scripts.sort.each do |name, description|
17
+ puts "\e[90m#{name.rjust(max_length)}\e[m - #{description}"
18
+ end
19
+
20
+ puts "\e[94m\nTo run a tool, type:\e[m\n" +
21
+ "\e[34m discorb [script]\e[m"
22
+
23
+ exit 1
24
+ end
25
+
26
+ begin
27
+ require "discorb/exe/#{script}"
28
+ rescue LoadError
29
+ puts "\e[91mThis tool is not available: \e[90m#{script}\e[m"
30
+ exit 1
31
+ end
@@ -279,6 +279,9 @@ module Discorb
279
279
  @new_value = data[:new_value].then(&method)
280
280
  end
281
281
 
282
+ #
283
+ # Send a message to the new value.
284
+ #
282
285
  def method_missing(method, ...)
283
286
  @new_value.__send__(method, ...)
284
287
  end
@@ -60,12 +60,11 @@ module Discorb
60
60
  # @param [Boolean] colorize_log Whether to colorize the log.
61
61
  # @param [:debug, :info, :warn, :error, :critical] log_level The log level.
62
62
  # @param [Boolean] wait_until_ready Whether to delay event dispatch until ready.
63
- # @param [Boolean] overwrite_application_commands Whether to overwrite application commands on ready.
64
63
  #
65
64
  def initialize(
66
65
  allowed_mentions: nil, intents: nil, message_caches: 1000,
67
66
  log: nil, colorize_log: false, log_level: :info,
68
- wait_until_ready: true, overwrite_application_commands: true
67
+ wait_until_ready: true
69
68
  )
70
69
  @allowed_mentions = allowed_mentions || AllowedMentions.new(everyone: true, roles: true, users: true)
71
70
  @intents = (intents or Intents.default)
@@ -86,7 +85,6 @@ module Discorb
86
85
  @tasks = []
87
86
  @conditions = {}
88
87
  @commands = []
89
- @overwrite_application_commands = overwrite_application_commands
90
88
  @status = :initialized
91
89
  end
92
90
 
@@ -384,11 +382,69 @@ module Discorb
384
382
 
385
383
  #
386
384
  # Starts the client.
385
+ # @note This method behavior will change by CLI.
386
+ # @see file:docs/cli.md
387
387
  #
388
388
  # @param [String] token The token to use.
389
389
  #
390
390
  def run(token)
391
+ case ENV["DISCORB_CLI_FLAG"]
392
+ when nil
393
+ start_client(token)
394
+ when "run"
395
+ require "json"
396
+ options = JSON.parse(ENV["DISCORB_CLI_OPTIONS"], symbolize_names: true)
397
+ Process.daemon if options[:daemon]
398
+ setup_commands(token) if options[:setup]
399
+ if options[:log_level]
400
+ if options[:log_level] == "none"
401
+ @log.out = nil
402
+ else
403
+ @log.out = case options[:log_file]
404
+ when nil, "stderr"
405
+ $stderr
406
+ when "stdout"
407
+ $stdout
408
+ else
409
+ File.open(options[:log_file], "a")
410
+ end
411
+ @log.level = options[:log_level].to_sym
412
+ @log.colorize_log = case options[:log_color]
413
+ when nil
414
+ if @log.out == $stdout || @log.out == $stderr
415
+ true
416
+ else
417
+ false
418
+ end
419
+ when true, false
420
+ options[:log_color]
421
+ end
422
+ end
423
+ end
424
+ start_client(token)
425
+ when "setup_command"
426
+ setup_commands(token)
427
+ end
428
+ end
429
+
430
+ #
431
+ # Stops the client.
432
+ #
433
+ def close!
434
+ @connection.send_close
435
+ @tasks.each(&:stop)
436
+ @status = :closed
437
+ @close_condition.signal
438
+ end
439
+
440
+ private
441
+
442
+ def start_client(token)
391
443
  Async do |task|
444
+ trap(:SIGINT) {
445
+ @log.info "SIGINT received, closing..."
446
+ close!
447
+ }
392
448
  @token = token.to_s
393
449
  @close_condition = Async::Condition.new
394
450
  main_task = Async do
@@ -403,15 +459,5 @@ module Discorb
403
459
  main_task.stop
404
460
  end
405
461
  end
406
-
407
- #
408
- # Stops the client.
409
- #
410
- def close!
411
- @connection.send_close
412
- @tasks.each(&:stop)
413
- @status = :closed
414
- @close_condition.signal
415
- end
416
462
  end
417
463
  end
@@ -92,7 +92,6 @@ module Discorb
92
92
 
93
93
  #
94
94
  # Setup commands.
95
- # @note This method is called automatically if overwrite_application_commands is set to true.
96
95
  # @see Client#initialize
97
96
  #
98
97
  # @param [String] token Bot token.
@@ -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.2.5"
7
+ VERSION = "0.4.1"
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
 
@@ -93,6 +93,9 @@ module Discorb
93
93
  !self[id].nil?
94
94
  end
95
95
 
96
+ #
97
+ # Send a message to the array of values.
98
+ #
96
99
  def method_missing(name, ...)
97
100
  if values.respond_to?(name)
98
101
  values.send(name, ...)
data/lib/discorb/error.rb CHANGED
@@ -35,6 +35,7 @@ module Discorb
35
35
 
36
36
  #
37
37
  # Represents a HTTP error.
38
+ # @abstract
38
39
  #
39
40
  class HTTPError < DiscorbError
40
41
  # @return [String] the HTTP response code.
@@ -78,6 +79,20 @@ module Discorb
78
79
  class NotFoundError < HTTPError
79
80
  end
80
81
 
82
+ #
83
+ # Represents a error because of a cloudflare ban.
84
+ #
85
+ class CloudFlareBanError < HTTPError
86
+ def initialize(resp, client)
87
+ @client = client
88
+ @client.close!
89
+ DiscorbError.instance_method(:initialize).bind(self).call(<<~MESSAGE)
90
+ The client is banned from CloudFlare.
91
+ Hint: Try to increase the number of requests per second, e.g. Use sleep in between requests.
92
+ MESSAGE
93
+ end
94
+ end
95
+
81
96
  #
82
97
  # Represents a error in client-side.
83
98
  #
@@ -0,0 +1,14 @@
1
+ # description: Show information of discorb.
2
+
3
+ puts " disco\e[31mrb\e[m - A new Discord API wrapper in Ruby. \n\n"
4
+
5
+ informations = {
6
+ "GitHub" => "https://github.com/discorb-lib/discorb",
7
+ "Documentation" => "https://discorb-lib.github.io",
8
+ "RubyGems" => "https://rubygems.org/gems/discorb",
9
+ "Changelog" => "https://discorb-lib.github.io/file.Changelog.html",
10
+ }
11
+
12
+ informations.each do |key, value|
13
+ puts "\e[90m#{key}:\e[m #{value}"
14
+ end
@@ -0,0 +1,195 @@
1
+ # description: Make files for the discorb project.
2
+
3
+ require "optparse"
4
+ require_relative "../utils/colored_puts"
5
+
6
+ $path = Dir.pwd
7
+
8
+ # @!visibility private
9
+ FILES = {
10
+ "main.rb" => <<~'RUBY',
11
+ require "discorb"
12
+ require "dotenv"
13
+
14
+ Dotenv.load
15
+
16
+ client = Discorb::Client.new
17
+
18
+ client.once :ready do
19
+ puts "Logged in as #{client.user}"
20
+ end
21
+
22
+ client.run ENV["%<token>s"]
23
+ RUBY
24
+ ".env" => <<~BASH,
25
+ %<token>s=Y0urB0tT0k3nHer3.Th1sT0ken.W0ntWorkB3c4useItH4sM34n1ng
26
+ BASH
27
+ ".gitignore" => <<~GITIGNORE,
28
+ *.gem
29
+ *.rbc
30
+ /.config
31
+ /coverage/
32
+ /InstalledFiles
33
+ /pkg/
34
+ /spec/reports/
35
+ /spec/examples.txt
36
+ /test/tmp/
37
+ /test/version_tmp/
38
+ /tmp/
39
+
40
+ # Used by dotenv library to load environment variables.
41
+ .env
42
+
43
+ # Ignore Byebug command history file.
44
+ .byebug_history
45
+
46
+ ## Specific to RubyMotion:
47
+ .dat*
48
+ .repl_history
49
+ build/
50
+ *.bridgesupport
51
+ build-iPhoneOS/
52
+ build-iPhoneSimulator/
53
+
54
+ ## Specific to RubyMotion (use of CocoaPods):
55
+ #
56
+ # We recommend against adding the Pods directory to your .gitignore. However
57
+ # you should judge for yourself, the pros and cons are mentioned at:
58
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
59
+ #
60
+ # vendor/Pods/
61
+
62
+ ## Documentation cache and generated files:
63
+ /.yardoc/
64
+ /_yardoc/
65
+ /doc/
66
+ /rdoc/
67
+
68
+ ## Environment normalization:
69
+ /.bundle/
70
+ /vendor/bundle
71
+ /lib/bundler/man/
72
+
73
+ # for a library or gem, you might want to ignore these files since the code is
74
+ # intended to run in multiple environments; otherwise, check them in:
75
+ # Gemfile.lock
76
+ # .ruby-version
77
+ # .ruby-gemset
78
+
79
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
80
+ .rvmrc
81
+
82
+ # Used by RuboCop. Remote config files pulled in from inherit_from directive.
83
+ # .rubocop-https?--*
84
+
85
+ # This gitignore is from github/gitignore.
86
+ # https://github.com/github/gitignore/blob/master/Ruby.gitignore
87
+ GITIGNORE
88
+ "Gemfile" => <<~RUBY,
89
+ # frozen_string_literal: true
90
+
91
+ source "https://rubygems.org"
92
+
93
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
94
+
95
+ gem "discorb", "~> 0.2.5"
96
+ gem "dotenv", "~> 2.7"
97
+ RUBY
98
+ }
99
+
100
+ # @!visibility private
101
+ def create_file(name)
102
+ File.write($path + "/#{name}", format(FILES[name], token: $values[:token]), mode: "wb")
103
+ end
104
+
105
+ # @!visibility private
106
+ def make_files
107
+ iputs "Making files..."
108
+ create_file("main.rb")
109
+ create_file(".env")
110
+ sputs "Made files.\n"
111
+ end
112
+
113
+ # @!visibility private
114
+ def bundle_init
115
+ iputs "Initializing bundle..."
116
+ create_file("Gemfile")
117
+ iputs "Installing gems..."
118
+ system "bundle install"
119
+ sputs "Installed gems.\n"
120
+ end
121
+
122
+ # @!visibility private
123
+ def git_init
124
+ create_file(".gitignore")
125
+ iputs "Initializing git repository..."
126
+ system "git init"
127
+ system "git add ."
128
+ system "git commit -m \"Initial commit\""
129
+ sputs "Initialized repository, use " +
130
+ "\e[32mgit commit --amend -m '...'\e[92m" +
131
+ " to change commit message of initial commit.\n"
132
+ end
133
+
134
+ opt = OptionParser.new <<~BANNER
135
+ A tool to make a new project.
136
+
137
+ Usage: discorb init [options] [dir]
138
+
139
+ dir The directory to make the files in.
140
+ BANNER
141
+
142
+ $values = {
143
+ bundle: true,
144
+ git: true,
145
+ force: false,
146
+ token: "TOKEN",
147
+ }
148
+
149
+ opt.on("--[no-]bundle", "Whether to use bundle. Default to true.") do |v|
150
+ $values[:bundle] = v
151
+ end
152
+
153
+ opt.on("--[no-]git", "Whether to initialize git. Default to true.") do |v|
154
+ $values[:git] = v
155
+ end
156
+
157
+ opt.on("-t NAME", "--token NAME", "The name of token environment variable. Default to TOKEN.") do |v|
158
+ $values[:token] = v
159
+ end
160
+
161
+ opt.on("-f", "--force", "Whether to force use directory. Default to false.") do |v|
162
+ $values[:force] = v
163
+ end
164
+
165
+ ARGV.delete_at(0)
166
+
167
+ opt.parse!(ARGV)
168
+
169
+ if (dir = ARGV[0])
170
+ $path += "/#{dir}"
171
+ if Dir.exist?($path)
172
+ if Dir.empty?($path)
173
+ gputs "Found \e[30m#{dir}\e[90m and empty, using this directory."
174
+ else
175
+ if $values[:force]
176
+ gputs "Found \e[30m#{dir}\e[90m and not empty, but force is on, using this directory."
177
+ else
178
+ eputs "Directory \e[31m#{dir}\e[91m already exists and not empty. Use \e[31m-f\e[91m to force."
179
+ exit
180
+ end
181
+ end
182
+ else
183
+ Dir.mkdir($path)
184
+ gputs "Couldn't find \e[30m#{dir}\e[90m, created directory."
185
+ end
186
+ Dir.chdir($path)
187
+ end
188
+
189
+ bundle_init if $values[:bundle]
190
+
191
+ make_files
192
+
193
+ git_init if $values[:git]
194
+
195
+ sputs "\nSuccessfully made a new project at \e[32m#{$path}\e[92m."