discorb 0.8.1 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd489ad4debd6585ee50f7e260288c862b1b655d2dda44af6151398e9b722b01
4
- data.tar.gz: b5fd92c939bdbc8456dd0302b1a6d5e362afba2f39bdbe337e03918d30eb6357
3
+ metadata.gz: fbb61003015daf1f1731f80809e9c739cad169f60b7b5f7cc6c1ac7580d61bd1
4
+ data.tar.gz: e2d7bcad6c493bea84b7f2608a1d1366f76e95675c50052b034742be322d0569
5
5
  SHA512:
6
- metadata.gz: ebf5a3685316ab02f18ff2d21af0f494c13beac47554968a54b96109eebfa98c38b6e4e0c5f4c1c8e8d8ce2dee70a6424a87782ca75804830e8826da1ce64c43
7
- data.tar.gz: dfb9ee552ed4eae349ed6cf99f846f391a1afab96941a181de11a3257d1a9234bb7304baeedd36b29f751374a59492299697856728b1a7779b930dc22e43ff81
6
+ metadata.gz: 9b2cee7155fe0273181fc7cf1fdd048ebd0b9d1adba4ca7c4444a31a92b5cd86a65c77511e581858c379e1abb53d1d092ab6115394b0a9fbc076b6692b04312b
7
+ data.tar.gz: 245db18f6b68599ccf199e5c1571a3f38181d4a4a6dc5371cf55e29bc9dd1d95766ff67047091558aaf392f41ea3fb0d28b726972c120ad7dd80a216a1e3699c
data/Changelog.md CHANGED
@@ -220,3 +220,28 @@ end
220
220
  - Add: Add `File.from_string`
221
221
  - Fix: Fix `Client#update_presence`
222
222
  - Add: Add information in `discorb run -d`
223
+
224
+ ## 0.8.2
225
+
226
+ - Fix: Fix `Client#initialize`
227
+
228
+ ## 0.9.0
229
+
230
+ - Delete: Delete `-d` parameter from `discorb run`; This is caused by segement fault error.
231
+ - Change: Rename `-t`, `--token` to `-e`, `--env` parameter
232
+ - Add: Add `-t`, `--title` parameter to `discorb run`
233
+ - Add: Add `title` parameter to `Client#initialize`
234
+
235
+ ## 0.9.1
236
+
237
+ - Fix: Fix member fetching
238
+
239
+ ## 0.9.2 (yanked)
240
+
241
+ - Add: Make `Async::Task#inspect` shorter
242
+ - Add: `SourceResponse#post` will return message now
243
+ - Fix: Fix member caching
244
+
245
+ ## 0.9.3
246
+
247
+ - Fix: Fix interaction responding
data/docs/faq.md CHANGED
@@ -35,7 +35,7 @@ Use {Discorb::Client#update_presence} method.
35
35
  client.on event do
36
36
  client.update_presence(
37
37
  Discorb::Activity.new(
38
- name: "#{client.guilds.length} Servers"
38
+ "#{client.guilds.length} Servers"
39
39
  ),
40
40
  status: :online
41
41
  )
@@ -65,13 +65,14 @@ module Discorb
65
65
  # @param [Boolean] colorize_log Whether to colorize the log.
66
66
  # @param [:debug, :info, :warn, :error, :critical] log_level The log level.
67
67
  # @param [Boolean] wait_until_ready Whether to delay event dispatch until ready.
68
- # @param [Boolean] fetch_member Whether to fetch member on ready. This may slow down the client.
69
- # Defaultly, it's `false` if {Discorb::Intents#members} is false. Otherwise, it's `true`.
68
+ # @param [Boolean] fetch_member Whether to fetch member on ready. This may slow down the client. Default to `false`.
69
+ # @param [String] title The title of the process. `false` to default, `nil` to `discorb: User#0000`. Default to `nil`.
70
70
  #
71
71
  def initialize(
72
72
  allowed_mentions: nil, intents: nil, message_caches: 1000,
73
73
  log: nil, colorize_log: false, log_level: :info,
74
- wait_until_ready: true, fetch_member: nil
74
+ wait_until_ready: true, fetch_member: false,
75
+ title: nil
75
76
  )
76
77
  @allowed_mentions = allowed_mentions || AllowedMentions.new(everyone: true, roles: true, users: true)
77
78
  @intents = (intents or Intents.default)
@@ -94,7 +95,8 @@ module Discorb
94
95
  @commands = []
95
96
  @bottom_commands = []
96
97
  @status = :initialized
97
- @fetch_member = fetch_member.nil? ? !(intents&.members) : fetch_member
98
+ @fetch_member = fetch_member
99
+ @title = title
98
100
  set_default_events
99
101
  end
100
102
 
@@ -496,15 +498,10 @@ module Discorb
496
498
  end
497
499
 
498
500
  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}"
501
+ next if @title == false
505
502
 
506
- Process.daemon
507
- end
503
+ title = @title || ENV["DISCORB_CLI_TITLE"] || "discorb: #{@user}"
504
+ Process.setproctitle title
508
505
  end
509
506
  end
510
507
  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.1"
7
+ VERSION = "0.9.3"
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
 
@@ -16,14 +16,13 @@ opt = OptionParser.new <<~BANNER
16
16
  script The script to run. Defaults to 'main.rb'.
17
17
  BANNER
18
18
  options = {
19
- deamon: false,
19
+ title: nil,
20
20
  log_level: nil,
21
21
  log_file: nil,
22
22
  log_color: nil,
23
23
  setup: nil,
24
24
  token: false,
25
25
  }
26
- opt.on("-d", "--deamon", "Run as a daemon.") { |v| options[:daemon] = v }
27
26
  opt.on("-l", "--log-level LEVEL", "Log level.") do |v|
28
27
  unless LOG_LEVELS.include? v.downcase
29
28
  eputs "Invalid log level: \e[31m#{v}\e[91m"
@@ -35,7 +34,8 @@ end
35
34
  opt.on("-f", "--log-file FILE", "File to write log to.") { |v| options[:log_file] = v }
36
35
  opt.on("-c", "--[no-]log-color", "Whether to colorize log output.") { |v| options[:log_color] = v }
37
36
  opt.on("-s", "--setup", "Whether to setup application commands.") { |v| options[:setup] = v }
38
- opt.on("-t", "--token [ENV]", "The name of the environment variable to use for token, or just `-t` or `--token` for intractive prompt.") { |v| options[:token] = v }
37
+ 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 }
38
+ opt.on("-t", "--title TITLE", "The title of process.") { |v| options[:title] = v }
39
39
  opt.parse!(ARGV)
40
40
 
41
41
  script = ARGV[0]
@@ -54,6 +54,8 @@ elsif options[:token].nil? || options[:token] == "-"
54
54
  puts ""
55
55
  end
56
56
 
57
+ ENV["DISCORB_CLI_TITLE"] = options[:title]
58
+
57
59
  begin
58
60
  load script
59
61
  rescue LoadError
@@ -3,7 +3,6 @@
3
3
  require "async/http"
4
4
  require "async/websocket"
5
5
  require "async/barrier"
6
- require "async/semaphore"
7
6
  require "json"
8
7
  require "zlib"
9
8
 
@@ -1035,14 +1034,13 @@ module Discorb
1035
1034
  if @fetch_member
1036
1035
  @log.debug "Fetching members"
1037
1036
  barrier = Async::Barrier.new
1038
- semaphore = Async::Semaphore.new(@guilds.length)
1039
1037
 
1040
1038
  @guilds.each do |guild|
1041
- semaphore.async(parent: barrier) do
1039
+ barrier.async(parent: barrier) do
1042
1040
  guild.fetch_members
1043
1041
  end
1044
1042
  end
1045
- semaphore.__send__(:wait)
1043
+ barrier.wait
1046
1044
  end
1047
1045
  @ready = true
1048
1046
  dispatch(:standby)
@@ -131,6 +131,8 @@ module Discorb
131
131
  # @param [Array<Discorb::Component>, Array<Array<Discorb::Component>>] components The components to send.
132
132
  # @param [Boolean] ephemeral Whether to make the response ephemeral.
133
133
  #
134
+ # @return [Discorb::Interaction::SourceResponse::CallbackMessage, Discorb::Webhook::Message] The callback message.
135
+ #
134
136
  def post(content = nil, tts: false, embed: nil, embeds: nil, allowed_mentions: nil, components: nil, ephemeral: false)
135
137
  Async do
136
138
  payload = {}
@@ -165,14 +167,79 @@ module Discorb
165
167
  end
166
168
  payload[:flags] = (ephemeral ? 1 << 6 : 0)
167
169
 
168
- if @responded
169
- @client.http.post("/webhooks/#{@application_id}/#{@token}", payload).wait
170
- elsif @defered
171
- @client.http.patch("/webhooks/#{@application_id}/#{@token}/messages/@original", payload).wait
172
- else
173
- @client.http.post("/interactions/#{@id}/#{@token}/callback", { type: 4, data: payload }).wait
174
- end
170
+ ret = if @responded
171
+ _resp, data = @client.http.post("/webhooks/#{@application_id}/#{@token}", payload).wait
172
+ webhook = Webhook::URLWebhook.new("/webhooks/#{@application_id}/#{@token}")
173
+ Webhook::Message.new(webhook, data, @client)
174
+ elsif @defered
175
+ @client.http.patch("/webhooks/#{@application_id}/#{@token}/messages/@original", payload).wait
176
+ CallbackMessage.new(@client, payload, @application_id, @token)
177
+ else
178
+ @client.http.post("/interactions/#{@id}/#{@token}/callback", { type: 4, data: payload }).wait
179
+ CallbackMessage.new(@client, payload, @application_id, @token)
180
+ end
175
181
  @responded = true
182
+ ret
183
+ end
184
+ end
185
+
186
+ class CallbackMessage
187
+ # @!visibility private
188
+ def initialize(client, data, application_id, token)
189
+ @client = client
190
+ @data = data
191
+ @application_id = application_id
192
+ @token = token
193
+ end
194
+
195
+ #
196
+ # Edits the callback message.
197
+ # @macro async
198
+ # @macro http
199
+ # @macro edit
200
+ #
201
+ # @param [Discorb::Webhook::Message] message The message to edit.
202
+ # @param [String] content The new content of the message.
203
+ # @param [Discorb::Embed] embed The new embed of the message.
204
+ # @param [Array<Discorb::Embed>] embeds The new embeds of the message.
205
+ # @param [Array<Discorb::Attachment>] attachments The attachments to remain.
206
+ # @param [Discorb::File] file The file to send.
207
+ # @param [Array<Discorb::File>] files The files to send.
208
+ #
209
+ def edit(
210
+ content = :unset,
211
+ embed: :unset, embeds: :unset,
212
+ file: :unset, files: :unset,
213
+ attachments: :unset
214
+ )
215
+ Async do
216
+ payload = {}
217
+ payload[:content] = content if content != :unset
218
+ payload[:embeds] = embed ? [embed.to_hash] : [] if embed != :unset
219
+ payload[:embeds] = embeds.map(&:to_hash) if embeds != :unset
220
+ payload[:attachments] = attachments.map(&:to_hash) if attachments != :unset
221
+ files = [file] if file != :unset
222
+ if files == :unset
223
+ headers = {
224
+ "Content-Type" => "application/json",
225
+ }
226
+ else
227
+ headers, payload = HTTP.multipart(payload, files)
228
+ end
229
+ @client.http.patch("/webhooks/#{@application_id}/#{@token}/messages/@original", payload, headers: headers).wait
230
+ end
231
+ end
232
+
233
+ alias modify edit
234
+
235
+ #
236
+ # Deletes the callback message.
237
+ # @note This will fail if the message is ephemeral.
238
+ #
239
+ def delete!
240
+ Async do
241
+ @client.http.delete("/webhooks/#{@application_id}/#{@token}/messages/@original").wait
242
+ end
176
243
  end
177
244
  end
178
245
  end
@@ -213,6 +213,55 @@ module Discorb
213
213
  !@updated_at.nil?
214
214
  end
215
215
 
216
+ #
217
+ # Removes the mentions from the message.
218
+ #
219
+ # @param [Boolean] user Whether to clean user mentions.
220
+ # @param [Boolean] channel Whether to clean channel mentions.
221
+ # @param [Boolean] role Whether to clean role mentions.
222
+ # @param [Boolean] emoji Whether to clean emoji.
223
+ # @param [Boolean] everyone Whether to clean `@everyone` and `@here`.
224
+ # @param [Boolean] codeblock Whether to clean codeblocks.
225
+ #
226
+ # @return [String] The cleaned content of the message.
227
+ #
228
+ def clean_content(user: true, channel: true, role: true, emoji: true, everyone: true, codeblock: false)
229
+ ret = @content.dup
230
+ ret.gsub!(/<@!?(\d+)>/) do |match|
231
+ member = guild&.members&.[]($1)
232
+ member ||= @client.users[$1]
233
+ member ? "@#{member.name}" : "@Unknown User"
234
+ end if user
235
+ ret.gsub!(/<#(\d+)>/) do |match|
236
+ channel = @client.channels[$1]
237
+ channel ? "<##{channel.id}>" : "#Unknown Channel"
238
+ end
239
+ ret.gsub!(/<@&(\d+)>/) do |match|
240
+ role = guild&.roles&.[]($1)
241
+ role ? "@#{role.name}" : "@Unknown Role"
242
+ end if role
243
+ ret.gsub!(/<a?:([a-zA-Z0-9_]+):\d+>/) do |match|
244
+ $1
245
+ end if emoji
246
+ ret.gsub!(/@(everyone|here)/, "@\u200b\\1") if everyone
247
+ unless codeblock
248
+ codeblocks = ret.split("```", -1)
249
+ original_codeblocks = @content.scan(/```(.+?)```/m)
250
+ res = []
251
+ max = codeblocks.length
252
+ codeblocks.each_with_index do |codeblock, i|
253
+ if max % 2 == 0 && i == max - 1 or i.even?
254
+ res << codeblock
255
+ else
256
+ res << original_codeblocks[i / 2]
257
+ end
258
+ end
259
+ res.join("```")
260
+ else
261
+ ret
262
+ end
263
+ end
264
+
216
265
  #
217
266
  # Edit the message.
218
267
  #
data/lib/discorb/utils.rb CHANGED
@@ -14,3 +14,23 @@ module Discorb
14
14
  module_function :try
15
15
  end
16
16
  end
17
+
18
+ class Async::Node
19
+ def description
20
+ @object_name ||= "#{self.class}:0x#{object_id.to_s(16)}#{@transient ? ' transient' : nil}"
21
+
22
+ if @annotation
23
+ "#{@object_name} #{@annotation}"
24
+ elsif line = self.backtrace(0, 1)&.first
25
+ "#{@object_name} #{line}"
26
+ else
27
+ @object_name
28
+ end
29
+ end
30
+
31
+ def to_s
32
+ "\#<#{self.description}>"
33
+ end
34
+
35
+ alias inspect to_s
36
+ 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.1
4
+ version: 0.9.3
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-23 00:00:00.000000000 Z
11
+ date: 2021-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -79,8 +79,6 @@ 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"
84
82
  - ".gitignore"
85
83
  - ".yardopts"
86
84
  - Changelog.md
@@ -1,12 +0,0 @@
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")}"
@@ -1,39 +0,0 @@
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 }}