discorb 0.2.5 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
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."