discorb 0.3.0 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/build_main.yml +51 -0
- data/.gitignore +5 -1
- data/Changelog.md +26 -1
- data/Gemfile.lock +5 -4
- data/Rakefile +60 -27
- data/discorb.gemspec +4 -4
- data/docs/application_command.md +7 -1
- data/docs/cli/irb.md +1 -1
- data/docs/cli/run.md +46 -0
- data/docs/cli/setup.md +17 -0
- data/docs/cli.md +6 -1
- data/exe/discorb +3 -0
- data/lib/discorb/client.rb +59 -13
- data/lib/discorb/command.rb +0 -1
- data/lib/discorb/common.rb +1 -1
- data/lib/discorb/error.rb +15 -0
- data/lib/discorb/exe/about.rb +14 -0
- data/lib/discorb/exe/init.rb +23 -13
- data/lib/discorb/exe/irb.rb +9 -3
- data/lib/discorb/exe/run.rb +49 -0
- data/lib/discorb/exe/setup.rb +26 -0
- data/lib/discorb/exe/show.rb +8 -0
- data/lib/discorb/gateway.rb +0 -1
- data/lib/discorb/http.rb +16 -24
- data/lib/discorb/log.rb +4 -3
- data/lib/discorb/utils/colored_puts.rb +3 -0
- data/template-replace/files/css/common.css +13 -2
- data/template-replace/resources/version_list.html +2 -2
- data/template-replace/scripts/version.rb +15 -3
- metadata +22 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7322e6131e0e5d070df790e4a4b7ea6ea6ea7a286c975b0732c0c7eff2e9903d
|
4
|
+
data.tar.gz: 045ef3ab63628e0e0fe867de4aef8b1f872076cd74912b38e035c8cb6907c731
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2b045e2b31b6a8fb95d74f87de931b30e67c8f34f647a0994b4feb4f3c3d8c270f2fddab03e995cce4eaf2f770d2698ae537e0e5d328152dc0244f3e6f5c59d
|
7
|
+
data.tar.gz: 3582014d604c85091c3c6180a13766ccab7dce8e0df0319278eb0d89e7cd0d0df2d236b3a58763cc55e5ccf80ef6c46317ad62028c30f0d89002bf48f1bc4b8b
|
@@ -0,0 +1,51 @@
|
|
1
|
+
name: Build YARD with main
|
2
|
+
|
3
|
+
on:
|
4
|
+
workflow_dispatch:
|
5
|
+
schedule:
|
6
|
+
- cron: "*/8 * * * *"
|
7
|
+
|
8
|
+
jobs:
|
9
|
+
main:
|
10
|
+
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
|
13
|
+
steps:
|
14
|
+
- uses: actions/checkout@v2
|
15
|
+
- name: Set up Ruby
|
16
|
+
uses: ruby/setup-ruby@v1
|
17
|
+
with:
|
18
|
+
ruby-version: 3.0.2
|
19
|
+
bundler-cache: true
|
20
|
+
- name: Set up git settings
|
21
|
+
run: |
|
22
|
+
git config --global user.email "action@github.com"
|
23
|
+
git config --global user.name "GitHub Action"
|
24
|
+
- name: Clone pages
|
25
|
+
env:
|
26
|
+
SSH_SECRET: ${{ secrets.SSH }}
|
27
|
+
GIT_SSH_COMMAND: ssh -i ~/ssh_secret
|
28
|
+
run: |
|
29
|
+
echo "$SSH_SECRET" > ~/ssh_secret
|
30
|
+
chmod 600 ~/ssh_secret
|
31
|
+
git clone git@github.com:discorb-lib/discorb-lib.github.io /tmp/pages
|
32
|
+
- name: Install dependencies
|
33
|
+
run: |
|
34
|
+
bundle config --local with 'docs'
|
35
|
+
bundle install
|
36
|
+
- name: Generate document
|
37
|
+
run: bundle exec rake document
|
38
|
+
- name: Push document
|
39
|
+
env:
|
40
|
+
SSH_SECRET: ${{ secrets.SSH }}
|
41
|
+
GIT_SSH_COMMAND: ssh -i ~/ssh_secret
|
42
|
+
run: |
|
43
|
+
echo "$SSH_SECRET" > ~/ssh_secret
|
44
|
+
chmod 600 ~/ssh_secret
|
45
|
+
cp -r ./doc/. /tmp/pages
|
46
|
+
cd /tmp/pages
|
47
|
+
git add -A
|
48
|
+
git commit -m "Update: Update document for ${{ github.sha }} by cron"
|
49
|
+
git update-ref -d refs/remotes/origin/user
|
50
|
+
git push origin main -f
|
51
|
+
continue-on-error: true
|
data/.gitignore
CHANGED
@@ -35,7 +35,7 @@ build-iPhoneSimulator/
|
|
35
35
|
## Documentation cache and generated files:
|
36
36
|
/.yardoc/
|
37
37
|
/_yardoc/
|
38
|
-
/doc/
|
38
|
+
# /doc/
|
39
39
|
/rdoc/
|
40
40
|
|
41
41
|
## Environment normalization:
|
@@ -54,4 +54,8 @@ build-iPhoneSimulator/
|
|
54
54
|
|
55
55
|
# Used by RuboCop. Remote config files pulled in from inherit_from directive.
|
56
56
|
# .rubocop-https?--*
|
57
|
+
|
58
|
+
# For documentation generation.
|
57
59
|
tmp-template-replace
|
60
|
+
tmp-doc
|
61
|
+
doc
|
data/Changelog.md
CHANGED
@@ -73,4 +73,29 @@
|
|
73
73
|
## 0.2.5
|
74
74
|
|
75
75
|
- Add: Add way to add event listener
|
76
|
-
- Change: Move document to https://discorb-lib.github.io/
|
76
|
+
- Change: Move document to https://discorb-lib.github.io/
|
77
|
+
|
78
|
+
## 0.3.0
|
79
|
+
|
80
|
+
- Add: Improve CLI tools
|
81
|
+
- Add: Add `discorb init`
|
82
|
+
- Change: Change `discord-irb` to `discorb irb`
|
83
|
+
|
84
|
+
## 0.3.1
|
85
|
+
|
86
|
+
- Add: Add `discorb show`
|
87
|
+
- Fix: Fix documenting
|
88
|
+
|
89
|
+
## 0.4.0
|
90
|
+
|
91
|
+
- Add: Add `discorb setup`
|
92
|
+
- Add: Add `discorb run`
|
93
|
+
- Add: Add realtime documentation
|
94
|
+
|
95
|
+
## 0.4.1
|
96
|
+
|
97
|
+
- Add: Add `-s` option to `discorb run`
|
98
|
+
|
99
|
+
## 0.4.2
|
100
|
+
|
101
|
+
- Fix: Fix error in `discorb run`
|
data/Gemfile.lock
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
discorb (0.
|
5
|
-
async
|
6
|
-
async-http
|
7
|
-
async-websocket
|
4
|
+
discorb (0.4.2)
|
5
|
+
async (~> 1.30.1)
|
6
|
+
async-http (~> 0.56.5)
|
7
|
+
async-websocket (~> 0.19.0)
|
8
8
|
mime-types (~> 3.3)
|
9
9
|
|
10
10
|
GEM
|
@@ -54,6 +54,7 @@ GEM
|
|
54
54
|
|
55
55
|
PLATFORMS
|
56
56
|
x86-mingw32
|
57
|
+
x86_64-linux
|
57
58
|
|
58
59
|
DEPENDENCIES
|
59
60
|
discorb!
|
data/Rakefile
CHANGED
@@ -1,30 +1,26 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "bundler/gem_tasks"
|
4
|
+
require_relative "lib/discorb/utils/colored_puts"
|
4
5
|
task default: %i[]
|
5
6
|
|
7
|
+
# @!visibility private
|
6
8
|
def get_version
|
7
9
|
require_relative "lib/discorb/common"
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
tag = `git tag --points-at HEAD`.force_encoding("utf-8").strip
|
11
|
+
if tag.empty?
|
12
|
+
version = "main"
|
13
|
+
else
|
14
|
+
version = Discorb::VERSION
|
12
15
|
end
|
13
16
|
version
|
14
17
|
end
|
15
18
|
|
16
|
-
|
17
|
-
puts "\e[90m#{text}\e[m"
|
18
|
-
end
|
19
|
-
|
20
|
-
def sputs(text)
|
21
|
-
puts "\e[92m#{text}\e[m"
|
22
|
-
end
|
23
|
-
|
19
|
+
desc "Build emoji_table.rb"
|
24
20
|
task :emoji_table do
|
25
21
|
require_relative "lib/discorb"
|
26
22
|
|
27
|
-
|
23
|
+
iputs "Building emoji_table.rb"
|
28
24
|
res = {}
|
29
25
|
Discorb::EmojiTable::DISCORD_TO_UNICODE.each do |discord, unicode|
|
30
26
|
res[unicode] ||= []
|
@@ -47,11 +43,12 @@ task :emoji_table do
|
|
47
43
|
sputs "Successfully made emoji_table.rb"
|
48
44
|
end
|
49
45
|
|
46
|
+
desc "Format files"
|
50
47
|
task :format do
|
51
48
|
Dir.glob("**/*.rb").each do |file|
|
52
49
|
next if file.start_with?("vendor")
|
53
50
|
|
54
|
-
|
51
|
+
iputs "Formatting #{file}"
|
55
52
|
`rufo ./#{file}`
|
56
53
|
content = ""
|
57
54
|
File.open(file, "rb") do |f|
|
@@ -63,27 +60,37 @@ task :format do
|
|
63
60
|
end
|
64
61
|
end
|
65
62
|
end
|
63
|
+
|
64
|
+
desc "Generate document and replace"
|
66
65
|
namespace :document do
|
67
66
|
version = get_version
|
67
|
+
|
68
|
+
desc "Just generate document"
|
68
69
|
task :yard do
|
69
|
-
sh "yardoc -o doc/#{version}"
|
70
|
+
sh "bundle exec yardoc -o doc/#{version}"
|
70
71
|
end
|
72
|
+
|
73
|
+
desc "Replace files"
|
71
74
|
namespace :replace do
|
72
75
|
require "fileutils"
|
76
|
+
|
77
|
+
desc "Replace CSS"
|
73
78
|
task :css do
|
74
|
-
|
79
|
+
iputs "Replacing css"
|
75
80
|
Dir.glob("template-replace/files/**/*.*")
|
76
81
|
.map { |f| f.delete_prefix("template-replace/files") }.each do |file|
|
77
82
|
FileUtils.cp("template-replace/files" + file, "doc/#{version}/#{file}")
|
78
83
|
end
|
79
84
|
sputs "Successfully replaced css"
|
80
85
|
end
|
86
|
+
|
87
|
+
desc "Replace HTML"
|
81
88
|
task :html do
|
82
89
|
require_relative "template-replace/scripts/sidebar.rb"
|
83
90
|
require_relative "template-replace/scripts/version.rb"
|
84
91
|
require_relative "template-replace/scripts/index.rb"
|
85
92
|
require_relative "template-replace/scripts/yard_replace.rb"
|
86
|
-
|
93
|
+
iputs "Resetting changes"
|
87
94
|
Dir.glob("doc/#{version}/**/*.html") do |f|
|
88
95
|
next if (m = f.match(/[0-9]+\.[0-9]+\.[0-9]+(-[a-z]+)?/)) && m[0] != version
|
89
96
|
|
@@ -91,21 +98,23 @@ namespace :document do
|
|
91
98
|
content.gsub!(/<!--od-->[\s\S]*<!--eod-->/, "")
|
92
99
|
File.write(f, content)
|
93
100
|
end
|
94
|
-
|
101
|
+
iputs "Adding version tab"
|
95
102
|
%w[file_list class_list method_list].each do |f|
|
96
103
|
replace_sidebar("doc/#{version}/#{f}.html")
|
97
104
|
end
|
98
105
|
|
99
|
-
|
100
|
-
build_version_sidebar("doc/#{version}")
|
101
|
-
|
106
|
+
iputs "Building version tab"
|
107
|
+
build_version_sidebar("doc/#{version}", version)
|
108
|
+
iputs "Replacing _index.html"
|
102
109
|
replace_index("doc/#{version}", version)
|
103
|
-
|
110
|
+
iputs "Replacing YARD credits"
|
104
111
|
yard_replace("doc/#{version}", version)
|
105
|
-
|
112
|
+
iputs "Successfully replaced htmls"
|
106
113
|
end
|
114
|
+
|
115
|
+
desc "Replace EOL"
|
107
116
|
task :eol do
|
108
|
-
|
117
|
+
iputs "Replacing CRLF with LF"
|
109
118
|
Dir.glob("doc/**/*.*") do |file|
|
110
119
|
next unless File.file?(file)
|
111
120
|
|
@@ -122,20 +131,36 @@ namespace :document do
|
|
122
131
|
end
|
123
132
|
end
|
124
133
|
task :replace => %i[replace:css replace:html replace:eol]
|
134
|
+
|
135
|
+
desc "Build all versions"
|
125
136
|
task :build_all do
|
126
137
|
require "fileutils"
|
127
|
-
|
138
|
+
|
139
|
+
class Bundler::Definition
|
140
|
+
def validate_platforms!
|
141
|
+
# noop
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
iputs "Building all versions"
|
146
|
+
FileUtils.rm_rf("doc") rescue nil
|
128
147
|
FileUtils.cp_r("./template-replace/.", "./tmp-template-replace")
|
148
|
+
Rake::Task["document:yard"].execute
|
149
|
+
Rake::Task["document:replace:html"].execute
|
150
|
+
Rake::Task["document:replace:css"].execute
|
151
|
+
Rake::Task["document:replace:eol"].execute
|
129
152
|
tags = `git tag`.force_encoding("utf-8").split("\n")
|
130
153
|
tags.each do |tag|
|
131
154
|
sh "git checkout #{tag} -f"
|
132
|
-
|
155
|
+
iputs "Building #{tag}"
|
133
156
|
FileUtils.cp_r("./tmp-template-replace/.", "./template-replace")
|
134
157
|
version = tag.delete_prefix("v")
|
135
158
|
Rake::Task["document:yard"].execute
|
136
159
|
Rake::Task["document:replace:html"].execute
|
137
160
|
Rake::Task["document:replace:css"].execute
|
138
161
|
Rake::Task["document:replace:eol"].execute
|
162
|
+
FileUtils.cp_r("./doc/.", "./tmp-doc")
|
163
|
+
FileUtils.rm_rf("doc")
|
139
164
|
end
|
140
165
|
version = "."
|
141
166
|
Rake::Task["document:yard"].execute
|
@@ -143,11 +168,19 @@ namespace :document do
|
|
143
168
|
Rake::Task["document:replace:css"].execute
|
144
169
|
Rake::Task["document:replace:eol"].execute
|
145
170
|
sh "git switch main -f"
|
171
|
+
FileUtils.cp_r("./tmp-doc/.", "./doc")
|
146
172
|
sputs "Successfully built all versions"
|
173
|
+
rescue => e
|
174
|
+
sh "git switch main -f"
|
175
|
+
raise e
|
147
176
|
end
|
177
|
+
|
178
|
+
desc "Push to discorb-lib/discorb-lib.github.io"
|
148
179
|
task :push do
|
149
|
-
|
180
|
+
iputs "Pushing documents"
|
150
181
|
Dir.chdir("doc") do
|
182
|
+
sh "git init"
|
183
|
+
sh "git remote add origin git@github.com:discorb-lib/discorb-lib.github.io"
|
151
184
|
sh "git add ."
|
152
185
|
sh "git commit -m \"Update: Update document\""
|
153
186
|
sh "git push -f"
|
data/discorb.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
|
18
18
|
spec.metadata["homepage_uri"] = spec.homepage
|
19
19
|
spec.metadata["source_code_uri"] = "https://github.com/discorb-lib/discorb"
|
20
|
-
spec.metadata["changelog_uri"] = "https://
|
20
|
+
spec.metadata["changelog_uri"] = "https://discorb-lib.github.io/file.Changelog.html"
|
21
21
|
spec.metadata["documentation_uri"] = "https://discorb-lib.github.io"
|
22
22
|
|
23
23
|
# Specify which files should be added to the gem when it is released.
|
@@ -30,9 +30,9 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.require_paths = ["lib"]
|
31
31
|
|
32
32
|
# Uncomment to register a new dependency of your gem
|
33
|
-
spec.add_dependency "async"
|
34
|
-
spec.add_dependency "async-http"
|
35
|
-
spec.add_dependency "async-websocket"
|
33
|
+
spec.add_dependency "async", "~> 1.30.1"
|
34
|
+
spec.add_dependency "async-http", "~> 0.56.5"
|
35
|
+
spec.add_dependency "async-websocket", "~> 0.19.0"
|
36
36
|
|
37
37
|
spec.add_dependency "mime-types", "~> 3.3"
|
38
38
|
# For more information and examples about making a new gem, checkout our
|
data/docs/application_command.md
CHANGED
@@ -10,7 +10,13 @@ From: [Discord API docs](https://discord.com/developers/docs/interactions/applic
|
|
10
10
|
|
11
11
|
## How do I register an application command?
|
12
12
|
|
13
|
-
|
13
|
+
Write to a your script:
|
14
|
+
- {Discorb::Command::Handler.slash}, {Discorb::Command::Handler.slash_group} for slash commands,
|
15
|
+
- {Discorb::Command::Handler.user_command} for user menu commands,
|
16
|
+
- {Discorb::Command::Handler.message_command} for message menu commands.
|
17
|
+
|
18
|
+
And then run `discorb setup` to register your application commands.
|
19
|
+
{file:docs/cli/setup.md Learn more about `discorb setup`}.
|
14
20
|
|
15
21
|
### Note
|
16
22
|
|
data/docs/cli/irb.md
CHANGED
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
data/docs/cli.md
CHANGED
@@ -17,4 +17,9 @@ Currently, discorb has the following commands:
|
|
17
17
|
| Command | Description |
|
18
18
|
|---------|-------------|
|
19
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. |
|
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
CHANGED
data/lib/discorb/client.rb
CHANGED
@@ -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
|
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
|
data/lib/discorb/command.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.
|
7
|
+
VERSION = "0.4.2"
|
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
@@ -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
|
data/lib/discorb/exe/init.rb
CHANGED
@@ -5,6 +5,7 @@ require_relative "../utils/colored_puts"
|
|
5
5
|
|
6
6
|
$path = Dir.pwd
|
7
7
|
|
8
|
+
# @!visibility private
|
8
9
|
FILES = {
|
9
10
|
"main.rb" => <<~'RUBY',
|
10
11
|
require "discorb"
|
@@ -84,19 +85,7 @@ FILES = {
|
|
84
85
|
# This gitignore is from github/gitignore.
|
85
86
|
# https://github.com/github/gitignore/blob/master/Ruby.gitignore
|
86
87
|
GITIGNORE
|
87
|
-
|
88
|
-
|
89
|
-
def make_files
|
90
|
-
iputs "Making files..."
|
91
|
-
FILES.each do |file, content|
|
92
|
-
File.write($path + "/#{file}", format(content, token: $values[:token]), mode: "wb")
|
93
|
-
end
|
94
|
-
sputs "Made files.\n"
|
95
|
-
end
|
96
|
-
|
97
|
-
def bundle_init
|
98
|
-
iputs "Initializing bundle..."
|
99
|
-
File.write($path + "/Gemfile", <<~'RUBY', mode: "wb")
|
88
|
+
"Gemfile" => <<~RUBY,
|
100
89
|
# frozen_string_literal: true
|
101
90
|
|
102
91
|
source "https://rubygems.org"
|
@@ -106,12 +95,33 @@ def bundle_init
|
|
106
95
|
gem "discorb", "~> 0.2.5"
|
107
96
|
gem "dotenv", "~> 2.7"
|
108
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")
|
109
117
|
iputs "Installing gems..."
|
110
118
|
system "bundle install"
|
111
119
|
sputs "Installed gems.\n"
|
112
120
|
end
|
113
121
|
|
122
|
+
# @!visibility private
|
114
123
|
def git_init
|
124
|
+
create_file(".gitignore")
|
115
125
|
iputs "Initializing git repository..."
|
116
126
|
system "git init"
|
117
127
|
system "git add ."
|
data/lib/discorb/exe/irb.rb
CHANGED
@@ -9,10 +9,16 @@ require "optparse"
|
|
9
9
|
intents_value = Discorb::Intents.all.value
|
10
10
|
token_file = "token"
|
11
11
|
|
12
|
-
|
12
|
+
ARGV.delete_at 0
|
13
|
+
|
14
|
+
opt = OptionParser.new <<~BANNER
|
15
|
+
This command will start an interactive Ruby shell with connected client.
|
16
|
+
|
17
|
+
Usage: discorb irb [options]
|
18
|
+
BANNER
|
13
19
|
opt.on("-i", "--intents", "intents to use, default to all") { |v| intents_value = v }
|
14
20
|
opt.on("-t", "--token-file", "token file to load, default to \"token\"") { |v| token_file = v }
|
15
|
-
opt.parse(ARGV)
|
21
|
+
opt.parse!(ARGV)
|
16
22
|
|
17
23
|
client = Discorb::Client.new(intents: Discorb::Intents.from_value(intents_value))
|
18
24
|
$messages = []
|
@@ -30,7 +36,7 @@ client.on :ready do
|
|
30
36
|
This is a debug client for Discord.
|
31
37
|
\e[90mmessage\e[m to get latest message.
|
32
38
|
|
33
|
-
\e[36mhttps://
|
39
|
+
\e[36mhttps://discorb-lib.github.io/#{Discorb::VERSION}/file.irb.html\e[m for more information.
|
34
40
|
EOS
|
35
41
|
end
|
36
42
|
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# description: Run a client.
|
2
|
+
require "optparse"
|
3
|
+
require "json"
|
4
|
+
require "discorb/utils/colored_puts"
|
5
|
+
|
6
|
+
ARGV.delete_at 0
|
7
|
+
# @!visibility private
|
8
|
+
LOG_LEVELS = %w[none debug info warn error fatal]
|
9
|
+
|
10
|
+
opt = OptionParser.new <<~BANNER
|
11
|
+
This command will run a client.
|
12
|
+
|
13
|
+
Usage: discorb run [options] [script]
|
14
|
+
|
15
|
+
script The script to run. Defaults to 'main.rb'.
|
16
|
+
BANNER
|
17
|
+
options = {
|
18
|
+
deamon: false,
|
19
|
+
log_level: nil,
|
20
|
+
log_file: nil,
|
21
|
+
log_color: nil,
|
22
|
+
setup: nil,
|
23
|
+
}
|
24
|
+
opt.on("-d", "--deamon", "Run as a daemon.") { |v| options[:daemon] = v }
|
25
|
+
opt.on("-l", "--log-level LEVEL", "Log level.") do |v|
|
26
|
+
unless LOG_LEVELS.include? v.downcase
|
27
|
+
eputs "Invalid log level: \e[31m#{v}\e[91m"
|
28
|
+
eputs "Valid log levels: \e[31m#{LOG_LEVELS.join("\e[91m, \e[31m")}\e[91m"
|
29
|
+
exit 1
|
30
|
+
end
|
31
|
+
options[:log_level] = v.downcase
|
32
|
+
end
|
33
|
+
opt.on("-f", "--log-file FILE", "File to write log to.") { |v| options[:log_file] = v }
|
34
|
+
opt.on("-c", "--[no-]log-color", "Whether to colorize log output.") { |v| options[:log_color] = v }
|
35
|
+
opt.on("-s", "--setup", "Whether to setup application commands.") { |v| options[:setup] = v }
|
36
|
+
opt.parse!(ARGV)
|
37
|
+
|
38
|
+
script = ARGV[0]
|
39
|
+
|
40
|
+
script ||= "main.rb"
|
41
|
+
|
42
|
+
ENV["DISCORB_CLI_FLAG"] = "run"
|
43
|
+
ENV["DISCORB_CLI_OPTIONS"] = JSON.generate(options)
|
44
|
+
|
45
|
+
begin
|
46
|
+
load script
|
47
|
+
rescue LoadError
|
48
|
+
eputs "Could not load script: \e[31m#{script}\e[91m"
|
49
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# description: Setup application commands.
|
2
|
+
require "optparse"
|
3
|
+
require "discorb/utils/colored_puts"
|
4
|
+
|
5
|
+
ARGV.delete_at 0
|
6
|
+
|
7
|
+
opt = OptionParser.new <<~BANNER
|
8
|
+
This command will setup application commands.
|
9
|
+
|
10
|
+
Usage: discorb setup [script]
|
11
|
+
|
12
|
+
script The script to setup.
|
13
|
+
BANNER
|
14
|
+
opt.parse!(ARGV)
|
15
|
+
|
16
|
+
script = ARGV[0]
|
17
|
+
script ||= "main.rb"
|
18
|
+
ENV["DISCORB_CLI_FLAG"] = "setup"
|
19
|
+
|
20
|
+
begin
|
21
|
+
load script
|
22
|
+
rescue LoadError
|
23
|
+
eputs "Could not load script: \e[31m#{script}\e[m"
|
24
|
+
else
|
25
|
+
sputs "Successfully set up commands for \e[32m#{script}\e[m."
|
26
|
+
end
|
data/lib/discorb/gateway.rb
CHANGED
data/lib/discorb/http.rb
CHANGED
@@ -32,12 +32,7 @@ module Discorb
|
|
32
32
|
def get(path, headers: nil, audit_log_reason: nil, **kwargs)
|
33
33
|
Async do |task|
|
34
34
|
resp = http.get(get_path(path), get_headers(headers, "", audit_log_reason), **kwargs)
|
35
|
-
|
36
|
-
data = if rd.nil? || rd.empty?
|
37
|
-
nil
|
38
|
-
else
|
39
|
-
JSON.parse(rd, symbolize_names: true)
|
40
|
-
end
|
35
|
+
data = get_response_data(resp)
|
41
36
|
test_error(if resp.code == "429"
|
42
37
|
@client.log.warn "Ratelimit exceeded for #{path}, trying again in #{data[:retry_after]} seconds."
|
43
38
|
task.sleep(data[:retry_after])
|
@@ -66,12 +61,7 @@ module Discorb
|
|
66
61
|
def post(path, body = "", headers: nil, audit_log_reason: nil, **kwargs)
|
67
62
|
Async do |task|
|
68
63
|
resp = http.post(get_path(path), get_body(body), get_headers(headers, body, audit_log_reason), **kwargs)
|
69
|
-
|
70
|
-
data = if rd.nil? || rd.empty?
|
71
|
-
nil
|
72
|
-
else
|
73
|
-
JSON.parse(rd, symbolize_names: true)
|
74
|
-
end
|
64
|
+
data = get_response_data(resp)
|
75
65
|
test_error(if resp.code == "429"
|
76
66
|
task.sleep(data[:retry_after])
|
77
67
|
post(path, body, headers: headers, audit_log_reason: audit_log_reason, **kwargs).wait
|
@@ -132,12 +122,7 @@ module Discorb
|
|
132
122
|
def put(path, body = "", headers: nil, audit_log_reason: nil, **kwargs)
|
133
123
|
Async do |task|
|
134
124
|
resp = http.put(get_path(path), get_body(body), get_headers(headers, body, audit_log_reason), **kwargs)
|
135
|
-
|
136
|
-
data = if rd.nil? || rd.empty?
|
137
|
-
nil
|
138
|
-
else
|
139
|
-
JSON.parse(rd, symbolize_names: true)
|
140
|
-
end
|
125
|
+
data = get_response_data(resp)
|
141
126
|
test_error(if resp.code == "429"
|
142
127
|
task.sleep(data[:retry_after])
|
143
128
|
put(path, body, headers: headers, audit_log_reason: audit_log_reason, **kwargs).wait
|
@@ -164,12 +149,7 @@ module Discorb
|
|
164
149
|
def delete(path, headers: nil, audit_log_reason: nil, **kwargs)
|
165
150
|
Async do |task|
|
166
151
|
resp = http.delete(get_path(path), get_headers(headers, "", audit_log_reason))
|
167
|
-
|
168
|
-
data = if rd.nil? || rd.empty?
|
169
|
-
nil
|
170
|
-
else
|
171
|
-
JSON.parse(rd, symbolize_names: true)
|
172
|
-
end
|
152
|
+
data = get_response_data(resp)
|
173
153
|
test_error(if resp.code == "429"
|
174
154
|
task.sleep(data[:retry_after])
|
175
155
|
delete(path, headers: headers, audit_log_reason: audit_log_reason, **kwargs).wait
|
@@ -257,6 +237,18 @@ module Discorb
|
|
257
237
|
URI(full_path).path
|
258
238
|
end
|
259
239
|
|
240
|
+
def get_response_data(resp)
|
241
|
+
if resp["Via"].nil?
|
242
|
+
raise CloudFlareBanError.new(@client, resp)
|
243
|
+
end
|
244
|
+
rd = resp.body
|
245
|
+
if rd.nil? || rd.empty?
|
246
|
+
nil
|
247
|
+
else
|
248
|
+
JSON.parse(rd, symbolize_names: true)
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
260
252
|
def http
|
261
253
|
https = Net::HTTP.new("discord.com", 443)
|
262
254
|
https.use_ssl = true
|
data/lib/discorb/log.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
module Discorb
|
4
4
|
# @!visibility private
|
5
5
|
class Logger
|
6
|
-
|
6
|
+
attr_accessor :out, :colorize_log
|
7
7
|
|
8
8
|
@levels = %i[debug info warn error fatal].freeze
|
9
9
|
|
@@ -14,11 +14,12 @@ module Discorb
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def level
|
17
|
-
|
17
|
+
self.class.levels[@level]
|
18
18
|
end
|
19
19
|
|
20
20
|
def level=(level)
|
21
|
-
@level =
|
21
|
+
@level = self.class.levels.index(level)
|
22
|
+
raise ArgumentError, "Invalid log level: #{level}" unless @level
|
22
23
|
end
|
23
24
|
|
24
25
|
def debug(message)
|
@@ -216,8 +216,8 @@ tt {
|
|
216
216
|
font-family: var(--monospace-font);
|
217
217
|
}
|
218
218
|
|
219
|
-
pre.code {
|
220
|
-
color: var(--header-secondary);
|
219
|
+
pre.code code {
|
220
|
+
color: var(--header-secondary) !important;
|
221
221
|
tab-size: 2;
|
222
222
|
}
|
223
223
|
|
@@ -310,6 +310,11 @@ li.even {
|
|
310
310
|
background: var(--background-secondary);
|
311
311
|
}
|
312
312
|
|
313
|
+
li.current {
|
314
|
+
background: var(--background-tertiary);
|
315
|
+
}
|
316
|
+
|
317
|
+
|
313
318
|
.item:hover {
|
314
319
|
background: var(--background-secondary-alt);
|
315
320
|
}
|
@@ -516,4 +521,10 @@ li.r2 {
|
|
516
521
|
border-color: var(--background-tertiary);
|
517
522
|
color: var(--interactive-active);
|
518
523
|
fill: var(--interactive-active);
|
524
|
+
}
|
525
|
+
|
526
|
+
dd pre.code {
|
527
|
+
padding: 9px 14px;
|
528
|
+
border-radius: 4px;
|
529
|
+
border: 1px solid var(--background-tertiary);
|
519
530
|
}
|
@@ -47,9 +47,9 @@
|
|
47
47
|
<ul id="full_list" class="method">
|
48
48
|
<!--replace-->
|
49
49
|
<!--template-->
|
50
|
-
<li class="!
|
50
|
+
<li class="!class!">
|
51
51
|
<div class="item">
|
52
|
-
<span class='object_link'><a href="
|
52
|
+
<span class='object_link'><a href="!path!/index.html" title="!version!">!version!</a></span>
|
53
53
|
<small class='git_sha'>!sha!</small>
|
54
54
|
</div>
|
55
55
|
</li>
|
@@ -1,12 +1,24 @@
|
|
1
|
-
def build_version_sidebar(dir)
|
1
|
+
def build_version_sidebar(dir, version)
|
2
2
|
raw = File.read("template-replace/resources/version_list.html")
|
3
3
|
template = raw.match(/<!--template-->(.*)<!--endtemplate-->/m)[1]
|
4
4
|
raw.gsub!(template, "")
|
5
5
|
res = +""
|
6
|
-
|
6
|
+
i = 0
|
7
|
+
`git tag`.force_encoding("utf-8").split("\n").each.with_index do |tag|
|
8
|
+
i += 1
|
7
9
|
sha = `git rev-parse #{tag}`.force_encoding("utf-8").strip
|
8
10
|
version = tag.delete_prefix("v")
|
9
|
-
|
11
|
+
cls = i % 2 == 0 ? "even" : "odd"
|
12
|
+
if version == "."
|
13
|
+
cls += " current"
|
14
|
+
end
|
15
|
+
res += template.gsub("!version!", version).gsub("!path!", "../" + version).gsub("!class!", cls).gsub("!sha!", sha)
|
10
16
|
end
|
17
|
+
i += 1
|
18
|
+
cls = i % 2 == 0 ? "even" : "odd"
|
19
|
+
if version == "main"
|
20
|
+
cls += " current"
|
21
|
+
end
|
22
|
+
res += template.gsub("!version!", "main").gsub("!path!", "../main").gsub("!class!", cls).gsub("!sha!", "(Latest on GitHub)")
|
11
23
|
File.write(dir + "/version_list.html", raw.gsub("<!--replace-->", res))
|
12
24
|
end
|
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: discorb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.2
|
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-09-
|
11
|
+
date: 2021-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.30.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.30.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: async-http
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.56.5
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 0.56.5
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: async-websocket
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 0.19.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 0.19.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: mime-types
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -74,6 +74,7 @@ executables:
|
|
74
74
|
extensions: []
|
75
75
|
extra_rdoc_files: []
|
76
76
|
files:
|
77
|
+
- ".github/workflows/build_main.yml"
|
77
78
|
- ".gitignore"
|
78
79
|
- ".yardopts"
|
79
80
|
- Changelog.md
|
@@ -91,6 +92,8 @@ files:
|
|
91
92
|
- docs/cli.md
|
92
93
|
- docs/cli/init.md
|
93
94
|
- docs/cli/irb.md
|
95
|
+
- docs/cli/run.md
|
96
|
+
- docs/cli/setup.md
|
94
97
|
- docs/events.md
|
95
98
|
- docs/extension.md
|
96
99
|
- docs/voice_events.md
|
@@ -122,8 +125,12 @@ files:
|
|
122
125
|
- lib/discorb/emoji_table.rb
|
123
126
|
- lib/discorb/error.rb
|
124
127
|
- lib/discorb/event.rb
|
128
|
+
- lib/discorb/exe/about.rb
|
125
129
|
- lib/discorb/exe/init.rb
|
126
130
|
- lib/discorb/exe/irb.rb
|
131
|
+
- lib/discorb/exe/run.rb
|
132
|
+
- lib/discorb/exe/setup.rb
|
133
|
+
- lib/discorb/exe/show.rb
|
127
134
|
- lib/discorb/extend.rb
|
128
135
|
- lib/discorb/extension.rb
|
129
136
|
- lib/discorb/file.rb
|
@@ -166,7 +173,7 @@ metadata:
|
|
166
173
|
allowed_push_host: https://rubygems.org
|
167
174
|
homepage_uri: https://github.com/discorb-lib/discorb
|
168
175
|
source_code_uri: https://github.com/discorb-lib/discorb
|
169
|
-
changelog_uri: https://
|
176
|
+
changelog_uri: https://discorb-lib.github.io/file.Changelog.html
|
170
177
|
documentation_uri: https://discorb-lib.github.io
|
171
178
|
post_install_message:
|
172
179
|
rdoc_options: []
|