discorb 0.8.0 → 0.8.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eb2e5dd94a2bda9644a1a5679fdab3006bbdb1b10c8bf3780764b7fc115aa002
4
- data.tar.gz: 4bfd645c6e39a4f3bd48ed2b2afaaccc8c2cf5702eb6dc675cfb01b17667b09f
3
+ metadata.gz: dd489ad4debd6585ee50f7e260288c862b1b655d2dda44af6151398e9b722b01
4
+ data.tar.gz: b5fd92c939bdbc8456dd0302b1a6d5e362afba2f39bdbe337e03918d30eb6357
5
5
  SHA512:
6
- metadata.gz: 8c18b4e0b809e66350c952a8d50cb2e4f899e2844cd33b43bfd6120cc4560c6889e2cc8015fe9729ecb84c1af26a434ac566f69baa1a58cfcc5b6e2232b41151
7
- data.tar.gz: de89179dffd53f575e148c2240d278eb101dde91f8f2288c9cefcae403eb4ce2f04547a030bebb3912d33df639e8e516c92878d6eb1fe1650cde8dc4c6903d25
6
+ metadata.gz: ebf5a3685316ab02f18ff2d21af0f494c13beac47554968a54b96109eebfa98c38b6e4e0c5f4c1c8e8d8ce2dee70a6424a87782ca75804830e8826da1ce64c43
7
+ data.tar.gz: dfb9ee552ed4eae349ed6cf99f846f391a1afab96941a181de11a3257d1a9234bb7304baeedd36b29f751374a59492299697856728b1a7779b930dc22e43ff81
@@ -0,0 +1,12 @@
1
+ changelog = File.read("./Changelog.md")
2
+ releases = changelog.split("## ")
3
+ releases_hash = releases.map do |release|
4
+ release_name = "v" + release.split("\n")[0]
5
+ release_body = release.split("\n")[1..-1].join("\n").strip
6
+ [release_name, release_body]
7
+ end.to_h
8
+
9
+ release_version = ENV["GITHUB_REF"].split("/")[-1]
10
+
11
+ release_body = releases_hash[release_version] || "No release notes for this version"
12
+ puts "::set-output name=release_body::#{release_body.gsub("\n", "\\n")}"
@@ -0,0 +1,39 @@
1
+ name: Release from changelog
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: Install dependencies
23
+ run: |
24
+ bundle install
25
+ - name: Get changelog
26
+ run: |
27
+ bundle exec ruby .github/workflows/changelog.rb
28
+ id: get-changelog
29
+ - name: Build gem
30
+ run: |
31
+ bundle exec rake build
32
+ - name: Release
33
+ uses: softprops/action-gh-release@v1
34
+ with:
35
+ files: |
36
+ $(ls -1 pkg/*.gem)
37
+ body: ${{ steps.get-changelog.outputs.release_body }}
38
+ env:
39
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
data/Changelog.md CHANGED
@@ -211,4 +211,12 @@ end
211
211
  - Add: Add `Intents#to_h`
212
212
  - Add: Add `fetch_member` parameter to `Client#initialize`; Note you should set `false` if your bot doesn't have `GUILD_MEMBERS` intent
213
213
  - Change: Change `ready` to `standby` event
214
- - Change: `ready` will be fired when client receives `READY` event
214
+ - Change: `ready` will be fired when client receives `READY` event
215
+
216
+ ## 0.8.1
217
+
218
+ - Add: Add FAQ
219
+ - Fix: Fix sending files
220
+ - Add: Add `File.from_string`
221
+ - Fix: Fix `Client#update_presence`
222
+ - Add: Add information in `discorb run -d`
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  ![discorb](./assets/banner.svg)
2
2
 
3
3
  <div align="center"><a href="https://discorb-lib.github.io/"><img src="https://img.shields.io/badge/Document-discorb--lib.github.io-blue.svg" alt="Document"></a>
4
- <a href="https://rubygems.org/gems/discorb"><img src="https://img.shields.io/gem/dt/discorb?logo=rubygems&logoColor=fff" alt="Gem"></a>
5
- <a href="https://rubygems.org/gems/discorb"><img src="https://img.shields.io/gem/v/discorb?logo=rubygems&logoColor=fff" alt="Gem"></a>
4
+ <a href="https://rubygems.org/gems/discorb"><img src="https://img.shields.io/gem/dt/discorb?logo=rubygems&logoColor=fff&label=Downloads" alt="Gem"></a>
5
+ <a href="https://rubygems.org/gems/discorb"><img src="https://img.shields.io/gem/v/discorb?logo=rubygems&logoColor=fff&label=Version" alt="Gem"></a>
6
6
  <a href="https://discord.gg/hCP6zq8Vpj"><img src="https://img.shields.io/discord/863581274916913193?logo=discord&logoColor=fff&color=5865f2&label=Discord" alt="Discord"></a>
7
7
  <a href="https://github.com/discorb-lib/discorb"><img src="https://img.shields.io/github/stars/discorb-lib/discorb?color=24292e&label=Stars&logo=GitHub&logoColor=fff" alt="GitHub"></a></div>
8
8
 
@@ -28,7 +28,7 @@ Or install it yourself as:
28
28
 
29
29
  ## Usage
30
30
 
31
- ### Simple ping-pong
31
+ ### Ping & Pong
32
32
 
33
33
  ```ruby
34
34
  require "discorb"
@@ -49,6 +49,57 @@ end
49
49
  client.run(ENV["DISCORD_BOT_TOKEN"])
50
50
  ```
51
51
 
52
+ ### Quiz Game
53
+
54
+ ```ruby
55
+ require "discorb"
56
+
57
+ client = Discorb::Client.new
58
+
59
+ client.once :standby do
60
+ puts "Logged in as #{client.user}"
61
+ end
62
+
63
+ client.on :message do |message|
64
+ next if message.author.bot?
65
+ next unless message.content == "!quiz"
66
+
67
+ operator = [:+, :-, :*].sample
68
+ num1 = rand(1..10)
69
+ num2 = rand(1..10)
70
+
71
+ val = num1.send(operator, num2)
72
+ message.channel.post("Quiz: `#{num1} #{operator} #{num2}`")
73
+ begin
74
+ msg = client.event_lock(:message, 30) { |m|
75
+ m.content == val.to_s && m.channel == message.channel
76
+ }.wait
77
+ rescue Discorb::TimeoutError
78
+ message.channel.post("No one answered...")
79
+ else
80
+ msg.reply("Correct!")
81
+ end
82
+ end
83
+
84
+ client.run(ENV["DISCORD_BOT_TOKEN"])
85
+ ```
86
+
87
+ ### Slash Commands
88
+
89
+ ```ruby
90
+ require "discorb"
91
+
92
+ client = Discorb::Client.new
93
+
94
+ client.slash("hello", "Greet for you") do |interaction|
95
+ interaction.post("Hello!", ephemeral: true)
96
+ end
97
+
98
+ client.run(ENV["DISCORD_BOT_TOKEN"])
99
+ ```
100
+
101
+ Note: You must run `discorb setup` before using slash commands.
102
+
52
103
  ## Contributing
53
104
 
54
105
  Bug reports and pull requests are welcome on GitHub at https://github.com/discorb-lib/discorb.
data/assets/banner.svg CHANGED
@@ -1,125 +1,101 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
- <svg version="1.1" id="レイヤー_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
5
- y="0px" width="1080px" height="150px" viewBox="0 0 1080 150" enable-background="new 0 0 1080 150" xml:space="preserve">
6
- <g>
7
- <defs>
8
- <rect id="SVGID_1_" x="283.667" y="-12.667" width="343.333" height="201.333"/>
9
- </defs>
10
- <clipPath id="SVGID_2_">
11
- <use xlink:href="#SVGID_1_" overflow="visible"/>
12
- </clipPath>
13
- <g clip-path="url(#SVGID_2_)">
14
- <g>
15
- <g>
16
- <path fill="#2E3338" d="M370.533,119.061c-13.503,0-21.565-10.312-21.565-27.582c0-18.543,9.872-30.525,25.149-30.525
17
- c5.186,0,10.446,0.915,14.432,2.509l3.429,1.372V31.79l6.393-1.006v86.997h-4.456l-1.936-12.146l-3.522,4.208
18
- C383.265,116.045,377.402,119.061,370.533,119.061z M374.501,65.554c-9.191,0-19.013,6.676-19.013,25.413
19
- c0,13.96,6.559,22.98,16.708,22.98c7.18,0,13.308-3.736,19.286-11.758l0.495-0.665V69.983l-1.358-0.697
20
- C385.253,66.53,381.035,65.554,374.501,65.554z"/>
21
- </g>
22
- <g>
23
- <path fill="#2E3338" d="M419.624,117.78V61.721h6.393v56.059H419.624z M422.884,44.433c-2.645,0-4.796-2.094-4.796-4.668
24
- c0-2.6,2.196-4.796,4.796-4.796c2.574,0,4.668,2.152,4.668,4.796C427.552,42.338,425.458,44.433,422.884,44.433z"/>
25
- </g>
26
- <g>
27
- <path fill="#2E3338" d="M463.332,119.061c-7.015,0-14.662-2.282-19.529-4.647l0.809-5.23c4.905,2.794,11.627,5.405,19.616,5.405
28
- c9.34,0,14.917-3.949,14.917-10.564c0-8.187-6.482-10.382-16.372-12.797c-13.937-3.485-18.19-7.314-18.19-16.388
29
- c0-8.611,7.638-14.397,19.005-14.397c6.173,0,11.985,1.055,17.305,3.139l-0.902,5.412c-5.417-2.532-11.33-3.95-16.659-3.95
30
- c-12.06,0-12.997,7.302-12.997,9.54c0,6.302,5.57,8.979,14.559,11.256c15.329,3.897,20.003,7.967,20.003,17.418
31
- C484.897,113.3,477.037,119.061,463.332,119.061z"/>
32
- </g>
33
- <g>
34
- <path fill="#2E3338" d="M523.746,119.061c-15.986,0-25.917-11.206-25.917-29.246c0-17.843,10.273-29.373,26.173-29.373
35
- c6.897,0,12.696,1.453,17.263,4.322l-0.821,5.493c-5.086-3.282-10.441-4.83-16.57-4.83c-12.043,0-19.525,9.296-19.525,24.262
36
- c0,15.271,7.777,24.389,20.805,24.389c6.137,0,11.114-1.451,15.996-4.757l0.746,4.59
37
- C536.669,117.509,531.15,119.061,523.746,119.061z"/>
38
- </g>
39
- <g>
40
- <path fill="#2E3338" d="M580.834,119.061c-15.511,0-25.533-11.479-25.533-29.246c0-17.843,10.022-29.373,25.533-29.373
41
- c15.744,0,25.917,11.53,25.917,29.373C606.751,107.581,596.578,119.061,580.834,119.061z M580.834,65.042
42
- c-11.729,0-19.014,9.492-19.014,24.772c0,15.049,7.463,24.773,19.014,24.773c11.964,0,19.396-9.492,19.396-24.773
43
- C600.23,74.766,592.617,65.042,580.834,65.042z"/>
44
- </g>
45
- <g>
46
- <path d="M623.652,117.78V61.721h4.444l2.615,16.91l3.563-5.661c3.16-5.019,8.634-11.016,17.176-12.309l0.981,5.953
47
- c-9.186,1.447-17.664,7.67-22.117,16.437l-0.271,0.533v34.196H623.652z"/>
48
- </g>
49
- <g>
50
- <path d="M688.224,118.549c-8.27,0-14.267-1.167-21.31-3.208V31.79l6.393-1.006V72.56l4.295-4.43
51
- c5.017-5.173,10.417-7.688,16.51-7.688c13.302,0,21.565,10.569,21.565,27.582C715.677,107.423,705.671,118.549,688.224,118.549z
52
- M692.447,65.554c-6.539,0-12.794,3.675-18.593,10.923l-0.548,0.685v33.856l1.64,0.601c3.981,1.461,7.108,2.202,13.148,2.202
53
- c9.608,0,21.062-4.387,21.062-25.285C709.156,74.575,702.598,65.554,692.447,65.554z"/>
54
- </g>
55
- </g>
56
- </g>
57
- </g>
58
- <g>
59
- <defs>
60
- <rect id="SVGID_3_" x="610.334" y="8" width="268" height="246"/>
61
- </defs>
62
- <clipPath id="SVGID_4_">
63
- <use xlink:href="#SVGID_3_" overflow="visible"/>
64
- </clipPath>
65
- <g clip-path="url(#SVGID_4_)">
66
- <g>
67
- <path fill="#2E3338" d="M391.782,120.28l-1.408-8.833c-4.608,5.505-10.88,10.113-19.841,10.113
68
- c-13.185,0-24.065-9.601-24.065-30.082c0-22.272,12.8-33.025,27.649-33.025c6.017,0,11.521,1.152,15.361,2.688v-31.49
69
- l11.393-1.792v92.42H391.782z M389.478,71.51c-4.736-2.432-8.448-3.456-14.977-3.456c-9.601,0-16.513,7.809-16.513,22.913
70
- c0,13.441,6.016,20.48,14.208,20.48c7.041,0,12.417-4.224,17.281-10.752V71.51z"/>
71
- <path fill="#2E3338" d="M422.884,46.933c-3.968,0-7.296-3.2-7.296-7.168s3.328-7.296,7.296-7.296s7.168,3.328,7.168,7.296
72
- S426.852,46.933,422.884,46.933z M417.124,120.28V59.221h11.393v61.059H417.124z"/>
73
- <path fill="#2E3338" d="M463.332,121.561c-8.064,0-17.025-2.816-22.273-5.76l1.664-10.754c5.76,3.969,13.185,7.041,21.505,7.041
74
- c7.808,0,12.417-2.944,12.417-8.064c0-5.633-3.456-7.68-14.465-10.368c-14.336-3.585-20.097-7.937-20.097-18.817
75
- c0-9.729,8.192-16.897,21.505-16.897c7.552,0,14.336,1.536,20.097,4.096l-1.792,10.752c-5.376-3.072-12.161-5.248-18.561-5.248
76
- c-6.913,0-10.497,2.688-10.497,7.04c0,4.096,3.072,6.4,12.672,8.832c15.105,3.841,21.889,8.193,21.889,19.842
77
- C487.397,114.393,479.077,121.561,463.332,121.561z"/>
78
- <path fill="#2E3338" d="M523.746,121.561c-16.385,0-28.417-11.393-28.417-31.746c0-20.865,12.8-31.873,28.673-31.873
79
- c8.96,0,15.36,2.304,19.968,5.632l-1.664,11.136c-5.632-4.608-11.392-6.784-18.432-6.784c-9.985,0-17.025,7.552-17.025,21.762
80
- c0,14.848,7.552,21.889,18.305,21.889c6.145,0,11.521-1.408,17.793-6.785l1.664,10.241
81
- C538.339,119.768,531.938,121.561,523.746,121.561z"/>
82
- <path fill="#2E3338" d="M580.834,121.561c-16.258,0-28.033-11.648-28.033-31.746c0-20.097,11.775-31.873,28.033-31.873
83
- c16.385,0,28.417,11.776,28.417,31.873C609.251,109.912,597.219,121.561,580.834,121.561z M580.834,67.542
84
- c-11.009,0-16.514,9.472-16.514,22.272c0,12.545,5.761,22.273,16.514,22.273c11.264,0,16.896-9.473,16.896-22.273
85
- C597.73,77.271,591.842,67.542,580.834,67.542z"/>
86
- <path fill="#CC342D" d="M632.545,84.183v36.098h-11.393V59.221h9.088l1.92,12.417c4.353-6.913,11.393-13.185,21.377-13.697
87
- l1.793,10.88C645.217,69.334,636.641,76.118,632.545,84.183z"/>
88
- <path fill="#CC342D" d="M688.224,121.049c-9.217,0-15.745-1.408-23.81-3.841V29.652l11.393-1.792v38.53
89
- c4.096-4.224,9.984-8.448,18.305-8.448c13.185,0,24.065,9.729,24.065,30.082C718.177,110.296,705.888,121.049,688.224,121.049z
90
- M692.447,68.054c-6.4,0-12.032,4.224-16.641,9.984v31.233c3.84,1.408,6.656,2.049,12.288,2.049
91
- c11.905,0,18.562-7.041,18.562-22.785C706.656,75.222,700.64,68.054,692.447,68.054z"/>
92
- </g>
93
- </g>
94
- </g>
95
- <g>
96
- </g>
97
- <g>
98
- </g>
99
- <g>
100
- </g>
101
- <g>
102
- </g>
103
- <g>
104
- </g>
105
- <g>
106
- </g>
107
- <g>
108
- </g>
109
- <g>
110
- </g>
111
- <g>
112
- </g>
113
- <g>
114
- </g>
115
- <g>
116
- </g>
117
- <g>
118
- </g>
119
- <g>
120
- </g>
121
- <g>
122
- </g>
123
- <g>
124
- </g>
125
- </svg>
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg version="1.1" id="レイヤー_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
5
+ y="0px" width="1080px" height="150px" viewBox="0 0 1080 150" enable-background="new 0 0 1080 150" xml:space="preserve">
6
+ <rect x="0" fill="#FFFFFF" width="1080" height="150"/>
7
+ <g>
8
+ <g>
9
+ <defs>
10
+ <rect id="SVGID_1_" x="283.667" y="-12.667" width="343.333" height="201.333"/>
11
+ </defs>
12
+ <clipPath id="SVGID_2_">
13
+ <use xlink:href="#SVGID_1_" overflow="visible"/>
14
+ </clipPath>
15
+ <g clip-path="url(#SVGID_2_)">
16
+ <g>
17
+ <g>
18
+ <path fill="#2E3338" d="M370.532,119.061c-13.503,0-21.564-10.312-21.564-27.582c0-18.542,9.872-30.524,25.148-30.524
19
+ c5.187,0,10.446,0.915,14.433,2.509l3.429,1.372V31.79l6.393-1.006v86.997h-4.456l-1.936-12.146l-3.522,4.209
20
+ C383.265,116.045,377.402,119.061,370.532,119.061z M374.501,65.554c-9.191,0-19.014,6.676-19.014,25.413
21
+ c0,13.961,6.56,22.98,16.708,22.98c7.181,0,13.309-3.736,19.286-11.758l0.495-0.666V69.983l-1.358-0.697
22
+ C385.253,66.53,381.034,65.554,374.501,65.554z"/>
23
+ </g>
24
+ <g>
25
+ <path fill="#2E3338" d="M419.623,117.779V61.721h6.394v56.058H419.623z M422.884,44.433c-2.646,0-4.796-2.094-4.796-4.668
26
+ c0-2.6,2.195-4.796,4.796-4.796c2.573,0,4.668,2.152,4.668,4.796C427.552,42.338,425.457,44.433,422.884,44.433z"/>
27
+ </g>
28
+ <g>
29
+ <path fill="#2E3338" d="M463.332,119.061c-7.016,0-14.662-2.281-19.529-4.646l0.809-5.23
30
+ c4.905,2.795,11.627,5.405,19.616,5.405c9.34,0,14.917-3.948,14.917-10.563c0-8.188-6.482-10.383-16.372-12.797
31
+ c-13.937-3.485-18.19-7.314-18.19-16.389c0-8.611,7.639-14.397,19.006-14.397c6.173,0,11.984,1.055,17.305,3.139l-0.902,5.412
32
+ c-5.417-2.532-11.33-3.95-16.659-3.95c-12.06,0-12.997,7.302-12.997,9.54c0,6.303,5.57,8.979,14.56,11.256
33
+ c15.329,3.896,20.003,7.967,20.003,17.418C484.897,113.3,477.036,119.061,463.332,119.061z"/>
34
+ </g>
35
+ <g>
36
+ <path fill="#2E3338" d="M523.745,119.061c-15.985,0-25.917-11.205-25.917-29.246c0-17.842,10.273-29.373,26.174-29.373
37
+ c6.896,0,12.695,1.453,17.263,4.322l-0.821,5.493c-5.086-3.282-10.44-4.83-16.57-4.83c-12.043,0-19.524,9.296-19.524,24.262
38
+ c0,15.271,7.776,24.389,20.805,24.389c6.138,0,11.114-1.451,15.996-4.758l0.746,4.591
39
+ C536.669,117.51,531.15,119.061,523.745,119.061z"/>
40
+ </g>
41
+ <g>
42
+ <path fill="#2E3338" d="M580.834,119.061c-15.512,0-25.533-11.479-25.533-29.246c0-17.842,10.021-29.373,25.533-29.373
43
+ c15.743,0,25.916,11.53,25.916,29.373C606.75,107.581,596.577,119.061,580.834,119.061z M580.834,65.042
44
+ c-11.729,0-19.015,9.492-19.015,24.772c0,15.049,7.463,24.772,19.015,24.772c11.964,0,19.396-9.491,19.396-24.772
45
+ C600.23,74.766,592.616,65.042,580.834,65.042z"/>
46
+ </g>
47
+ <g>
48
+ <path d="M623.652,117.779V61.721h4.444l2.615,16.91l3.563-5.661c3.16-5.019,8.634-11.016,17.176-12.309l0.981,5.953
49
+ c-9.187,1.447-17.664,7.67-22.117,16.437l-0.271,0.533v34.195H623.652L623.652,117.779z"/>
50
+ </g>
51
+ <g>
52
+ <path d="M688.224,118.549c-8.271,0-14.268-1.167-21.311-3.208V31.79l6.394-1.006V72.56l4.295-4.43
53
+ c5.017-5.173,10.417-7.688,16.51-7.688c13.302,0,21.565,10.569,21.565,27.582C715.677,107.423,705.671,118.549,688.224,118.549
54
+ z M692.447,65.554c-6.539,0-12.794,3.675-18.593,10.922l-0.548,0.686v33.855l1.64,0.602c3.981,1.461,7.108,2.201,13.148,2.201
55
+ c9.607,0,21.062-4.387,21.062-25.284C709.156,74.575,702.598,65.554,692.447,65.554z"/>
56
+ </g>
57
+ </g>
58
+ </g>
59
+ </g>
60
+ </g>
61
+ <g>
62
+ <g>
63
+ <defs>
64
+ <rect id="SVGID_3_" x="610.334" y="8" width="268" height="246"/>
65
+ </defs>
66
+ <clipPath id="SVGID_4_">
67
+ <use xlink:href="#SVGID_3_" overflow="visible"/>
68
+ </clipPath>
69
+ <g clip-path="url(#SVGID_4_)">
70
+ <g>
71
+ <path fill="#2E3338" d="M391.781,120.279l-1.408-8.832c-4.607,5.505-10.88,10.113-19.841,10.113
72
+ c-13.185,0-24.064-9.602-24.064-30.082c0-22.272,12.8-33.025,27.648-33.025c6.018,0,11.521,1.152,15.361,2.688v-31.49
73
+ l11.393-1.792v92.42H391.781L391.781,120.279z M389.478,71.51c-4.736-2.432-8.448-3.456-14.977-3.456
74
+ c-9.602,0-16.514,7.809-16.514,22.913c0,13.441,6.017,20.48,14.208,20.48c7.041,0,12.417-4.225,17.281-10.752L389.478,71.51
75
+ L389.478,71.51z"/>
76
+ <path fill="#2E3338" d="M422.884,46.933c-3.968,0-7.296-3.2-7.296-7.168c0-3.968,3.328-7.296,7.296-7.296
77
+ s7.168,3.328,7.168,7.296C430.052,43.733,426.852,46.933,422.884,46.933z M417.123,120.279V59.221h11.394v61.058H417.123z"/>
78
+ <path fill="#2E3338" d="M463.332,121.561c-8.064,0-17.025-2.815-22.273-5.76l1.664-10.754c5.76,3.969,13.185,7.041,21.505,7.041
79
+ c7.808,0,12.417-2.943,12.417-8.064c0-5.633-3.456-7.68-14.465-10.367c-14.336-3.586-20.098-7.938-20.098-18.817
80
+ c0-9.729,8.192-16.897,21.506-16.897c7.552,0,14.336,1.536,20.097,4.096l-1.792,10.752c-5.376-3.072-12.161-5.248-18.561-5.248
81
+ c-6.913,0-10.498,2.688-10.498,7.04c0,4.096,3.072,6.4,12.673,8.832c15.104,3.841,21.889,8.193,21.889,19.842
82
+ C487.397,114.393,479.076,121.561,463.332,121.561z"/>
83
+ <path fill="#2E3338" d="M523.745,121.561c-16.385,0-28.417-11.393-28.417-31.746c0-20.864,12.801-31.873,28.674-31.873
84
+ c8.96,0,15.359,2.304,19.968,5.632l-1.664,11.136c-5.632-4.608-11.393-6.784-18.433-6.784c-9.984,0-17.024,7.552-17.024,21.761
85
+ c0,14.849,7.552,21.89,18.305,21.89c6.146,0,11.521-1.408,17.793-6.785l1.664,10.241
86
+ C538.339,119.768,531.938,121.561,523.745,121.561z"/>
87
+ <path fill="#2E3338" d="M580.834,121.561c-16.259,0-28.033-11.647-28.033-31.746c0-20.096,11.774-31.873,28.033-31.873
88
+ c16.385,0,28.416,11.776,28.416,31.873C609.25,109.912,597.219,121.561,580.834,121.561z M580.834,67.542
89
+ c-11.01,0-16.515,9.472-16.515,22.272c0,12.545,5.761,22.272,16.515,22.272c11.264,0,16.896-9.474,16.896-22.272
90
+ C597.73,77.271,591.842,67.542,580.834,67.542z"/>
91
+ <path fill="#CC342D" d="M632.545,84.184v36.098h-11.394v-61.06h9.088l1.92,12.417c4.354-6.913,11.394-13.185,21.377-13.697
92
+ l1.793,10.88C645.217,69.334,636.641,76.118,632.545,84.184z"/>
93
+ <path fill="#CC342D" d="M688.224,121.049c-9.217,0-15.745-1.408-23.811-3.841V29.652l11.394-1.792v38.53
94
+ c4.096-4.224,9.984-8.448,18.305-8.448c13.186,0,24.065,9.729,24.065,30.082C718.177,110.296,705.888,121.049,688.224,121.049z
95
+ M692.447,68.054c-6.399,0-12.032,4.224-16.641,9.984v31.233c3.84,1.408,6.656,2.049,12.288,2.049
96
+ c11.905,0,18.562-7.041,18.562-22.785C706.656,75.222,700.64,68.054,692.447,68.054z"/>
97
+ </g>
98
+ </g>
99
+ </g>
100
+ </g>
101
+ </svg>
data/docs/faq.md ADDED
@@ -0,0 +1,77 @@
1
+ # @title FAQ
2
+
3
+ # Fequently asked questions
4
+
5
+ ## What is `Async::Task`?
6
+
7
+ Async::Task is a object for asynchronous tasks.
8
+
9
+ https://socketry.github.io/async/ for more information.
10
+
11
+ ## How do I do something with sent messages?
12
+
13
+ Use `Async::Task#wait` method.
14
+
15
+ ```ruby
16
+ # NG
17
+ message = channel.post("Hello world!") # => Async::Task
18
+ message.pin # => NoMethodError
19
+
20
+ # OK
21
+ message = channel.post("Hello world!").wait # => Message
22
+ message.pin
23
+ ```
24
+
25
+ ## How can I send DM to a user?
26
+
27
+ Use {Discorb::User#post} method, {Discorb::User} includes {Discorb::Messageable}.
28
+
29
+ ## How can I edit status?
30
+
31
+ Use {Discorb::Client#update_presence} method.
32
+
33
+ ```ruby
34
+ %i[standby guild_join guild_leave].each do |event|
35
+ client.on event do
36
+ client.update_presence(
37
+ Discorb::Activity.new(
38
+ name: "#{client.guilds.length} Servers"
39
+ ),
40
+ status: :online
41
+ )
42
+ end
43
+ end
44
+
45
+ client.on :ready do
46
+ client.update_presence(status: :dnd)
47
+ end
48
+ ```
49
+
50
+ ## How can I send files?
51
+
52
+ Use {Discorb::File} class.
53
+
54
+ ```ruby
55
+ # Send a file
56
+ message.channel.post file: Discorb::File.new(File.open("./README.md"))
57
+
58
+ # Send some files with text
59
+ message.channel.post "File!", files: [Discorb::File.new(File.open("./README.md")), Discorb::File.new(File.open("./License.txt"))]
60
+
61
+ # Send a string as a file
62
+ message.channel.post file: Discorb::File.from_string("Hello world!", "hello.txt")
63
+ ```
64
+
65
+ # Not fequently asked questions
66
+
67
+ ## How can I pronounce `discorb`?
68
+
69
+ Discorb is pronounced `disco-R-B`.
70
+
71
+ ## Why did you make `discorb`?
72
+
73
+ There are many reasons -- One is I didn't like `discordrb`'s `bot.message` -- but the main reason is, "Just for Fun".
74
+
75
+ ## How was `discorb` named?
76
+
77
+ `discord` and `.rb`.
data/docs/license.md ADDED
@@ -0,0 +1,7 @@
1
+ # @title License
2
+
3
+ # License
4
+
5
+ discorb is licensed under the [MIT license](https://opensource.org/licenses/MIT).
6
+
7
+ {include:file:License.txt}
@@ -5,6 +5,7 @@ require "logger"
5
5
 
6
6
  require "async"
7
7
  require "async/websocket/client"
8
+ require_relative "./utils/colored_puts"
8
9
 
9
10
  module Discorb
10
11
  #
@@ -302,9 +303,15 @@ module Discorb
302
303
  #
303
304
  # @param [Discorb::Activity] activity The activity to update.
304
305
  # @param [:online, :idle, :dnd, :invisible] status The status to update.
305
- #
306
- def update_presence(activity = nil, status: nil)
307
- payload = {}
306
+ # @param [String] afk Whether to set the client as AFK.
307
+ #
308
+ def update_presence(activity = nil, status: nil, afk: false)
309
+ payload = {
310
+ activities: [],
311
+ status: status,
312
+ afk: nil,
313
+ since: nil,
314
+ }
308
315
  if !activity.nil?
309
316
  payload[:activities] = [activity.to_hash]
310
317
  end
@@ -408,7 +415,8 @@ module Discorb
408
415
  when "run"
409
416
  require "json"
410
417
  options = JSON.parse(ENV["DISCORB_CLI_OPTIONS"], symbolize_names: true)
411
- Process.daemon if options[:daemon]
418
+ @daemon = options[:daemon]
419
+
412
420
  setup_commands(token) if options[:setup]
413
421
  if options[:log_level]
414
422
  if options[:log_level] == "none"
@@ -486,6 +494,18 @@ module Discorb
486
494
  message = "An error occurred while dispatching #{event_name}:\n#{e.full_message}"
487
495
  @log.error message, fallback: $stderr
488
496
  end
497
+
498
+ once :standby do
499
+ if @daemon
500
+ title = "discorb: #{@user}"
501
+ Process.setproctitle title
502
+ sputs "Your discorb client is now in standby mode."
503
+ iputs "Process ID: #{Process.pid}"
504
+ iputs "Title: #{title}"
505
+
506
+ Process.daemon
507
+ end
508
+ end
489
509
  end
490
510
  end
491
511
  end
@@ -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.8.0"
7
+ VERSION = "0.8.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
 
@@ -11,5 +11,5 @@ informations = {
11
11
  }
12
12
 
13
13
  informations.each do |key, value|
14
- puts "\e[90m#{key}:\e[m #{value}"
14
+ puts "\e[90m#{key.rjust(informations.keys.map(&:size).max)}:\e[m #{value}"
15
15
  end
data/lib/discorb/file.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "mime/types"
4
+ require "stringio"
4
5
 
5
6
  module Discorb
6
7
  #
@@ -62,8 +63,13 @@ module Discorb
62
63
  def initialize(io, filename = nil, content_type: nil)
63
64
  @io = io
64
65
  @filename = filename || (io.respond_to?(:path) ? io.path : io.object_id)
65
- @content_type = content_type || MIME::Types.type_for(@filename)[0].to_s
66
+ @content_type = content_type || MIME::Types.type_for(@filename.to_s)[0].to_s
66
67
  @content_type = "application/octet-stream" if @content_type == ""
67
68
  end
69
+
70
+ def self.from_string(string, filename: nil, content_type: nil)
71
+ io = StringIO.new(string)
72
+ new(io, filename, content_type: content_type)
73
+ end
68
74
  end
69
75
  end
@@ -499,9 +499,17 @@ module Discorb
499
499
  while (message = @connection.read)
500
500
  @buffer << message
501
501
  if message.end_with?((+"\x00\x00\xff\xff").force_encoding("ASCII-8BIT"))
502
- message = JSON.parse(@zlib_stream.inflate(@buffer), symbolize_names: true)
503
- @buffer = +""
504
- handle_gateway(message)
502
+ begin
503
+ data = @zlib_stream.inflate(@buffer)
504
+ @buffer = +""
505
+ message = JSON.parse(data, symbolize_names: true)
506
+ rescue JSON::ParserError
507
+ @buffer = +""
508
+ @log.error "Received invalid JSON from gateway."
509
+ @log.debug data
510
+ else
511
+ handle_gateway(message)
512
+ end
505
513
  end
506
514
  end
507
515
  end
@@ -526,7 +534,7 @@ module Discorb
526
534
  def send_gateway(opcode, **value)
527
535
  @connection.write({ op: opcode, d: value }.to_json)
528
536
  @connection.flush
529
- @log.debug "Sent message with opcode #{opcode}: #{value.to_json.gsub(@token, "[Token]")}"
537
+ @log.debug "Sent message: #{{ op: opcode, d: value }.to_json.gsub(@token, "[Token]")}"
530
538
  end
531
539
 
532
540
  def handle_gateway(payload)
data/lib/discorb/http.rb CHANGED
@@ -221,7 +221,7 @@ module Discorb
221
221
  { "User-Agent" => USER_AGENT, "authorization" => "Bot #{@client.token}",
222
222
  "content-type" => "application/json" }
223
223
  end
224
- ret.merge(headers) if !headers.nil? && headers.length.positive?
224
+ ret.merge!(headers) if !headers.nil? && headers.length.positive?
225
225
  ret["X-Audit-Log-Reason"] = audit_log_reason unless audit_log_reason.nil?
226
226
  ret
227
227
  end
@@ -59,7 +59,8 @@ module Discorb
59
59
  end
60
60
  files = [file] if file
61
61
  if files
62
- headers, payload = HTTP.multipart(payload, files)
62
+ seperator, payload = HTTP.multipart(payload, files)
63
+ headers = { "content-type" => "multipart/form-data; boundary=#{seperator}" }
63
64
  else
64
65
  headers = {}
65
66
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: discorb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
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-22 00:00:00.000000000 Z
11
+ date: 2021-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -79,6 +79,8 @@ files:
79
79
  - ".github/ISSUE_TEMPLATE/feature_request.md"
80
80
  - ".github/workflows/build_main.yml"
81
81
  - ".github/workflows/build_version.yml"
82
+ - ".github/workflows/changelog.rb"
83
+ - ".github/workflows/release_from_changelog.yml"
82
84
  - ".gitignore"
83
85
  - ".yardopts"
84
86
  - Changelog.md
@@ -109,6 +111,8 @@ files:
109
111
  - docs/cli/setup.md
110
112
  - docs/events.md
111
113
  - docs/extension.md
114
+ - docs/faq.md
115
+ - docs/license.md
112
116
  - docs/tutorial.md
113
117
  - docs/voice_events.md
114
118
  - examples/commands/bookmarker.rb