discorb 0.13.4 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/codeql-analysis.yml +70 -0
  4. data/.github/workflows/lint-push.yml +18 -0
  5. data/.github/workflows/lint.yml +16 -0
  6. data/.rubocop.yml +70 -0
  7. data/Changelog.md +12 -0
  8. data/Gemfile +7 -3
  9. data/Rakefile +22 -22
  10. data/discorb.gemspec +1 -0
  11. data/examples/commands/bookmarker.rb +2 -1
  12. data/examples/commands/hello.rb +1 -0
  13. data/examples/commands/inspect.rb +3 -2
  14. data/examples/components/authorization_button.rb +2 -1
  15. data/examples/components/select_menu.rb +2 -1
  16. data/examples/extension/main.rb +1 -0
  17. data/examples/extension/message_expander.rb +1 -0
  18. data/examples/simple/eval.rb +3 -2
  19. data/examples/simple/ping_pong.rb +1 -0
  20. data/examples/simple/rolepanel.rb +1 -0
  21. data/examples/simple/wait_for_message.rb +4 -3
  22. data/exe/discorb +8 -7
  23. data/lib/discorb/allowed_mentions.rb +64 -0
  24. data/lib/discorb/app_command/command.rb +274 -0
  25. data/lib/discorb/app_command/handler.rb +168 -0
  26. data/lib/discorb/app_command.rb +2 -426
  27. data/lib/discorb/asset.rb +2 -0
  28. data/lib/discorb/audit_logs.rb +3 -3
  29. data/lib/discorb/channel.rb +19 -4
  30. data/lib/discorb/client.rb +30 -27
  31. data/lib/discorb/common.rb +4 -26
  32. data/lib/discorb/components/button.rb +106 -0
  33. data/lib/discorb/components/select_menu.rb +157 -0
  34. data/lib/discorb/components/text_input.rb +96 -0
  35. data/lib/discorb/components.rb +11 -276
  36. data/lib/discorb/dictionary.rb +3 -0
  37. data/lib/discorb/embed.rb +2 -2
  38. data/lib/discorb/emoji.rb +19 -3
  39. data/lib/discorb/emoji_table.rb +1 -1
  40. data/lib/discorb/error.rb +4 -6
  41. data/lib/discorb/event.rb +9 -7
  42. data/lib/discorb/exe/about.rb +1 -0
  43. data/lib/discorb/exe/irb.rb +4 -3
  44. data/lib/discorb/exe/new.rb +6 -7
  45. data/lib/discorb/exe/run.rb +2 -1
  46. data/lib/discorb/exe/setup.rb +8 -5
  47. data/lib/discorb/exe/show.rb +1 -0
  48. data/lib/discorb/extend.rb +19 -14
  49. data/lib/discorb/extension.rb +5 -1
  50. data/lib/discorb/gateway.rb +28 -30
  51. data/lib/discorb/guild.rb +11 -13
  52. data/lib/discorb/guild_template.rb +2 -2
  53. data/lib/discorb/http.rb +15 -17
  54. data/lib/discorb/integration.rb +1 -1
  55. data/lib/discorb/intents.rb +1 -1
  56. data/lib/discorb/interaction/autocomplete.rb +4 -3
  57. data/lib/discorb/interaction/command.rb +34 -9
  58. data/lib/discorb/interaction/components.rb +5 -2
  59. data/lib/discorb/interaction/modal.rb +33 -0
  60. data/lib/discorb/interaction/response.rb +33 -4
  61. data/lib/discorb/interaction/root.rb +1 -0
  62. data/lib/discorb/interaction.rb +2 -1
  63. data/lib/discorb/log.rb +1 -1
  64. data/lib/discorb/member.rb +1 -3
  65. data/lib/discorb/message.rb +26 -277
  66. data/lib/discorb/message_meta.rb +205 -0
  67. data/lib/discorb/modules.rb +1 -1
  68. data/lib/discorb/permission.rb +2 -2
  69. data/lib/discorb/presence.rb +4 -1
  70. data/lib/discorb/rate_limit.rb +2 -4
  71. data/lib/discorb/user.rb +1 -1
  72. data/lib/discorb/utils/colored_puts.rb +1 -0
  73. data/lib/discorb/voice_state.rb +3 -0
  74. data/lib/discorb/webhook.rb +1 -1
  75. data/lib/discorb.rb +1 -0
  76. data/template-replace/scripts/arrow.rb +1 -0
  77. data/template-replace/scripts/favicon.rb +1 -0
  78. data/template-replace/scripts/index.rb +2 -1
  79. data/template-replace/scripts/locale_ja.rb +5 -4
  80. data/template-replace/scripts/sidebar.rb +1 -0
  81. data/template-replace/scripts/version.rb +7 -10
  82. data/template-replace/scripts/yard_replace.rb +5 -4
  83. metadata +16 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 45868a2fa9284bc0910bdad465983c490f44b721ccc49632df681e79e78fd727
4
- data.tar.gz: 969d627479e5381da98e1775186e23f9a193244180135b8dc9396878a425ee43
3
+ metadata.gz: 810e9b14c77e49e9fca7afc4fe6b98389b26cb17dc1617213f38d7655b990a49
4
+ data.tar.gz: bbaa999265ac212f90ab60d57ec772fe7ade0e47f264a136130c679b85a46952
5
5
  SHA512:
6
- metadata.gz: 2732b467bfc1ba6af2d6938b384026e5219bfce03ff646669870e311601ec7b0258a72ba1c4b6fd6c9a60d1c3186c3890842916bb2f387542cf1d2ee7fbafab3
7
- data.tar.gz: a825f0d8497f8f62c024fa381441d9a19da54b0aa2fe71a7b87fc6ef17bc74f7e65a1681b6dc9c7abb1a2f746e6d821abaf4ae28ae6d9661226e7276dce2f551
6
+ metadata.gz: 120828736edcf7eef9d78410914651edeb41ae85eadef012050b105b03c80f07f835d812105d3cfe954c7237e344b3bbc540af8840a7dde1a69f590b008a759e
7
+ data.tar.gz: f29b0399c65f180b05bf6c0c3d5f253689ff08c734f60ee7681b57c060d99e36dd85fc275f9652354933478b8139aa76c8ad854f6963fd1c074a8a260ffb6bde
data/.gitattributes ADDED
@@ -0,0 +1,2 @@
1
+ template-replace/**/* linguist-documentation
2
+ sig/* linguist-generated
@@ -0,0 +1,70 @@
1
+ # For most projects, this workflow file will not need changing; you simply need
2
+ # to commit it to your repository.
3
+ #
4
+ # You may wish to alter this file to override the set of languages analyzed,
5
+ # or to provide custom queries or build logic.
6
+ #
7
+ # ******** NOTE ********
8
+ # We have attempted to detect the languages in your repository. Please check
9
+ # the `language` matrix defined below to confirm you have the correct set of
10
+ # supported CodeQL languages.
11
+ #
12
+ name: "CodeQL"
13
+
14
+ on:
15
+ push:
16
+ branches: [ main ]
17
+ pull_request:
18
+ # The branches below must be a subset of the branches above
19
+ branches: [ main ]
20
+ schedule:
21
+ - cron: '20 10 * * 3'
22
+
23
+ jobs:
24
+ analyze:
25
+ name: Analyze
26
+ runs-on: ubuntu-latest
27
+ permissions:
28
+ actions: read
29
+ contents: read
30
+ security-events: write
31
+
32
+ strategy:
33
+ fail-fast: false
34
+ matrix:
35
+ language: [ 'ruby' ]
36
+ # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
37
+ # Learn more about CodeQL language support at https://git.io/codeql-language-support
38
+
39
+ steps:
40
+ - name: Checkout repository
41
+ uses: actions/checkout@v2
42
+
43
+ # Initializes the CodeQL tools for scanning.
44
+ - name: Initialize CodeQL
45
+ uses: github/codeql-action/init@v1
46
+ with:
47
+ languages: ${{ matrix.language }}
48
+ # If you wish to specify custom queries, you can do so here or in a config file.
49
+ # By default, queries listed here will override any specified in a config file.
50
+ # Prefix the list here with "+" to use these queries and those in the config file.
51
+ # queries: ./path/to/local/query, your-org/your-repo/queries@main
52
+
53
+ # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
54
+ # If this step fails, then you should remove it and run the build manually (see below)
55
+ - name: Autobuild
56
+ uses: github/codeql-action/autobuild@v1
57
+
58
+ # ℹ️ Command-line programs to run using the OS shell.
59
+ # 📚 https://git.io/JvXDl
60
+
61
+ # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
62
+ # and modify them (or add more) to build your code if your project
63
+ # uses a compiled language
64
+
65
+ #- run: |
66
+ # make bootstrap
67
+ # make release
68
+
69
+ - name: Perform CodeQL Analysis
70
+ uses: github/codeql-action/analyze@v1
@@ -0,0 +1,18 @@
1
+ name: Lint with RuboCop
2
+ on:
3
+ - push
4
+ jobs:
5
+ rubocop:
6
+ runs-on: ubuntu-latest
7
+ steps:
8
+ - name: Checkout repository
9
+ uses: actions/checkout@v2
10
+ - uses: ruby/setup-ruby@v1
11
+ with:
12
+ ruby-version: 3.0.0
13
+ - name: Install gems
14
+ run: |
15
+ gem install rubocop
16
+ - name: Run rubocop
17
+ run: |
18
+ rubocop lib
@@ -0,0 +1,16 @@
1
+ name: Lint with RuboCop
2
+ on:
3
+ - pull_request
4
+ jobs:
5
+ rubocop:
6
+ runs-on: ubuntu-latest
7
+ steps:
8
+ - name: Checkout repository
9
+ uses: actions/checkout@v2
10
+ - uses: ruby/setup-ruby@v1
11
+ with:
12
+ ruby-version: 3.0.0
13
+ - name: rubocop
14
+ uses: reviewdog/action-rubocop@v2
15
+ with:
16
+ rubocop_version: 1.25
data/.rubocop.yml ADDED
@@ -0,0 +1,70 @@
1
+ AllCops:
2
+ NewCops: enable
3
+ TargetRubyVersion: 3.0
4
+ Exclude:
5
+ - examples/**/*.rb
6
+
7
+ Layout:
8
+ Enabled: false
9
+ Metrics:
10
+ Enabled: false
11
+
12
+ Style/TrailingCommaInHashLiteral: # Disabled for rufo
13
+ Enabled: false
14
+
15
+ Style/StringLiterals: # Disabled for rufo
16
+ Enabled: false
17
+
18
+ Style/TrailingCommaInArguments: # Disabled for rufo
19
+ Enabled: false
20
+
21
+ Style/StringLiteralsInInterpolation: # Disabled for rufo
22
+ Enabled: false
23
+
24
+ Style/StringConcatenation: # + looks better
25
+ Enabled: false
26
+
27
+ Lint/MissingSuper: # For abstract classes
28
+ Enabled: false
29
+
30
+ Lint/AssignmentInCondition: # Looks bad
31
+ Enabled: false
32
+
33
+ Style/PerlBackrefs: # It will be longer
34
+ Enabled: false
35
+
36
+ Style/RedundantSelf: # Looks local variable
37
+ Enabled: false
38
+
39
+ Naming/VariableNumber: # Discord API docs naming
40
+ Enabled: false
41
+
42
+ Style/ParallelAssignment: # It will be longer
43
+ Enabled: false
44
+
45
+ Style/RedundantInterpolation: # For make it extendable
46
+ Enabled: false
47
+
48
+ Style/Next: # For make it extendable
49
+ Enabled: false
50
+
51
+ Lint/ShadowedException: # False positive
52
+ Enabled: false
53
+
54
+ Lint/AmbiguousOperatorPrecedence: # Not needed
55
+ Enabled: false
56
+
57
+ Style/GlobalVars: # For /exe
58
+ Enabled: false
59
+
60
+ Lint/Debugger: # For /exe
61
+ Enabled: false
62
+
63
+ Style/GuardClause: # For make it extendable
64
+ Enabled: false
65
+
66
+ Layout/EndOfLine: # For git
67
+ EnforcedStyle: lf
68
+
69
+ Lint/ScriptPermission: # For GitHub Actions
70
+ Enabled: false
data/Changelog.md CHANGED
@@ -4,6 +4,18 @@
4
4
 
5
5
  # Changelog
6
6
 
7
+ ## v0.14
8
+
9
+ ### v0.14.0
10
+
11
+ - Add: Support Modal interaction
12
+ - Add: Support attachment option type in slash command
13
+ - Fix: Connections will no longer stacked
14
+ - Fix: Fix Client#fetch_nitro_sticker_packs returning 404
15
+ - Fix: Fix `self` reference in subcommand of extension
16
+ - Refactor: Refactored many things
17
+ - Refactor: Add Rubocop
18
+
7
19
  ## v0.13
8
20
 
9
21
  ### v0.13.4
data/Gemfile CHANGED
@@ -13,9 +13,13 @@ group :development, optional: true do
13
13
  end
14
14
 
15
15
  group :docs, optional: true do
16
- gem "redcarpet"
17
- gem "yard", "~> 0.9.26"
18
- gem "gettext", "~> 3.4.1"
19
16
  gem "crowdin-api", "~> 1.0"
17
+ gem "gettext", "~> 3.4.1"
18
+ gem "redcarpet"
20
19
  gem "rubyzip", "~> 2.3"
20
+ gem "yard", "~> 0.9.26"
21
+ end
22
+
23
+ group :lint, optional: true do
24
+ gem "rubocop", "~> 1.25"
21
25
  end
data/Rakefile CHANGED
@@ -5,15 +5,14 @@ require_relative "lib/discorb/utils/colored_puts"
5
5
  task default: %i[]
6
6
 
7
7
  # @private
8
- def get_version
8
+ def current_version
9
9
  require_relative "lib/discorb/common"
10
10
  tag = `git tag --points-at HEAD`.force_encoding("utf-8").strip
11
11
  if tag.empty?
12
- version = "main"
12
+ "main"
13
13
  else
14
- version = Discorb::VERSION
14
+ Discorb::VERSION
15
15
  end
16
- version
17
16
  end
18
17
 
19
18
  desc "Build emoji_table.rb"
@@ -63,8 +62,7 @@ end
63
62
 
64
63
  desc "Generate document and replace"
65
64
  namespace :document do
66
- version = get_version
67
-
65
+ version = current_version
68
66
  desc "Just generate document"
69
67
  task :yard do
70
68
  sh "bundle exec yardoc -o doc/#{version} --locale #{ENV["rake_locale"] or "en"}"
@@ -86,12 +84,12 @@ namespace :document do
86
84
 
87
85
  desc "Replace HTML"
88
86
  task :html do
89
- require_relative "template-replace/scripts/sidebar.rb"
90
- require_relative "template-replace/scripts/version.rb"
91
- require_relative "template-replace/scripts/index.rb"
92
- require_relative "template-replace/scripts/yard_replace.rb"
93
- require_relative "template-replace/scripts/favicon.rb"
94
- require_relative "template-replace/scripts/arrow.rb"
87
+ require_relative "template-replace/scripts/sidebar"
88
+ require_relative "template-replace/scripts/version"
89
+ require_relative "template-replace/scripts/index"
90
+ require_relative "template-replace/scripts/yard_replace"
91
+ require_relative "template-replace/scripts/favicon"
92
+ require_relative "template-replace/scripts/arrow"
95
93
  iputs "Resetting changes"
96
94
  Dir.glob("doc/#{version}/**/*.html") do |f|
97
95
  next if (m = f.match(/[0-9]+\.[0-9]+\.[0-9]+(-[a-z]+)?/)) && m[0] != version
@@ -143,20 +141,18 @@ namespace :document do
143
141
  replace_locale("doc/main")
144
142
  end
145
143
  end
146
- task :replace => %i[replace:css replace:html replace:eol]
144
+ task replace: %i[replace:css replace:html replace:eol]
147
145
 
148
146
  desc "Build all versions"
149
147
  task :build_all do
150
148
  require "fileutils"
151
149
 
152
- class Bundler::Definition
153
- def validate_platforms!
154
- # noop
155
- end
156
- end
157
-
158
150
  iputs "Building all versions"
159
- FileUtils.rm_rf("doc") rescue nil
151
+ begin
152
+ FileUtils.rm_rf("doc")
153
+ rescue StandardError
154
+ nil
155
+ end
160
156
  FileUtils.cp_r("./template-replace/.", "./tmp-template-replace")
161
157
  Rake::Task["document:yard"].execute
162
158
  Rake::Task["document:replace:html"].execute
@@ -181,7 +177,7 @@ namespace :document do
181
177
  FileUtils.cp_r("./tmp-doc/.", "./doc")
182
178
  FileUtils.cp_r("./doc/#{tags.last.delete_prefix("v")}/.", "./doc")
183
179
  sputs "Successfully built all versions"
184
- rescue => e
180
+ rescue StandardError => e
185
181
  sh "git switch main -f"
186
182
  raise e
187
183
  end
@@ -322,4 +318,8 @@ task :rbs do
322
318
  File.write("sig/discorb.rbs", base)
323
319
  end
324
320
 
325
- task :document => %i[document:yard document:replace]
321
+ task document: %i[document:yard document:replace]
322
+
323
+ task :lint do
324
+ sh "rubocop lib"
325
+ end
data/discorb.gemspec CHANGED
@@ -46,4 +46,5 @@ Gem::Specification.new do |spec|
46
46
  spec.add_dependency "mime-types", "~> 3.3"
47
47
  # For more information and examples about making a new gem, checkout our
48
48
  # guide at: https://bundler.io/guides/creating_gem.html
49
+ spec.metadata["rubygems_mfa_required"] = "true"
49
50
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "discorb"
2
3
  require "json"
3
4
 
@@ -20,7 +21,7 @@ def build_embed_from_message(message)
20
21
  embed
21
22
  end
22
23
 
23
- client.message_command("Bookmark", guild_ids: [857373681096327180]) do |interaction, message|
24
+ client.message_command("Bookmark", guild_ids: [857_373_681_096_327_180]) do |interaction, message|
24
25
  unless channel = bookmark_channel(interaction.guild)
25
26
  interaction.post("Bookmark channel not found. Please create one called `bookmarks`.", ephemeral: true)
26
27
  next
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "discorb"
2
3
 
3
4
  client = Discorb::Client.new
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "discorb"
2
3
 
3
4
  client = Discorb::Client.new
@@ -6,7 +7,7 @@ client.once :standby do
6
7
  puts "Logged in as #{client.user}"
7
8
  end
8
9
 
9
- client.user_command("Info", guild_ids: [857373681096327180]) do |interaction|
10
+ client.user_command("Info", guild_ids: [857_373_681_096_327_180]) do |interaction|
10
11
  interaction.post(embed: Discorb::Embed.new(
11
12
  "Information of #{interaction.target.to_s_user}",
12
13
  fields: [
@@ -14,7 +15,7 @@ client.user_command("Info", guild_ids: [857373681096327180]) do |interaction|
14
15
  Discorb::Embed::Field.new("ID", interaction.target.id),
15
16
  Discorb::Embed::Field.new("Bot", interaction.target.bot? ? "Yes" : "No"),
16
17
  Discorb::Embed::Field.new("Joined at", interaction.target.joined_at.to_df("F")),
17
- Discorb::Embed::Field.new("Created at", interaction.target.created_at.to_df("F")),
18
+ Discorb::Embed::Field.new("Created at", interaction.target.created_at.to_df("F"))
18
19
  ],
19
20
  thumbnail: interaction.target.avatar&.url,
20
21
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "discorb"
2
3
 
3
4
  client = Discorb::Client.new
@@ -27,7 +28,7 @@ client.on :message do |message|
27
28
  components: [
28
29
  Discorb::Button.new(
29
30
  "Get role", custom_id: "auth:#{role.id}",
30
- ),
31
+ )
31
32
  ],
32
33
  )
33
34
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "discorb"
2
3
 
3
4
  client = Discorb::Client.new
@@ -21,7 +22,7 @@ SECTIONS = [
21
22
  > So I decided to make it.
22
23
  Matsumoto describes the design of Ruby as being like a simple Lisp language at its core, with an object system like that of Smalltalk, blocks inspired by higher-order functions, and practical utility like that of Perl.
23
24
  WIKI
24
- ["First publication", <<~WIKI],
25
+ ["First publication", <<~WIKI]
25
26
  The first public release of Ruby 0.95 was announced on Japanese domestic newsgroups on December 21, 1995.
26
27
  Subsequently, three more versions of Ruby were released in two days.
27
28
  The release coincided with the launch of the Japanese-language ruby-list mailing list, which was the first mailing list for the new language.
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "discorb"
2
3
  require_relative "message_expander"
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "discorb"
2
3
 
3
4
  class MessageExpander
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "discorb"
2
3
 
3
4
  client = Discorb::Client.new
@@ -24,8 +25,8 @@ client.on :message do |message|
24
25
  res = res.wait if res.is_a? Async::Task
25
26
  message.channel.post("```rb\n#{res.inspect[...1990]}\n```")
26
27
  end
27
- rescue Exception => error
28
- message.reply embed: Discorb::Embed.new("Error!", "```rb\n#{error.full_message(highlight: false)[...1990]}\n```",
28
+ rescue Exception => e
29
+ message.reply embed: Discorb::Embed.new("Error!", "```rb\n#{e.full_message(highlight: false)[...1990]}\n```",
29
30
  color: Discorb::Color[:red])
30
31
  end
31
32
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "discorb"
2
3
 
3
4
  client = Discorb::Client.new
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "discorb"
2
3
  intents = Discorb::Intents.new
3
4
  intents.members = true
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "discorb"
2
3
 
3
4
  client = Discorb::Client.new
@@ -10,16 +11,16 @@ client.on :message do |message|
10
11
  next if message.author.bot?
11
12
  next unless message.content == "!quiz"
12
13
 
13
- operator = [:+, :-, :*].sample
14
+ operator = %i[+ - *].sample
14
15
  num1 = rand(1..10)
15
16
  num2 = rand(1..10)
16
17
 
17
18
  val = num1.send(operator, num2)
18
19
  message.channel.post("Quiz: `#{num1} #{operator} #{num2}`")
19
20
  begin
20
- msg = client.event_lock(:message, 30) { |m|
21
+ msg = client.event_lock(:message, 30) do |m|
21
22
  m.content == val.to_s && m.channel == message.channel
22
- }.wait
23
+ end.wait
23
24
  rescue Discorb::TimeoutError
24
25
  message.channel.post("No one answered...")
25
26
  else
data/exe/discorb CHANGED
@@ -1,24 +1,25 @@
1
1
  #! /usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  script = ARGV[0]
4
5
 
5
6
  if script.nil?
6
7
  puts "\e[94mThis is a tool for discorb. Currently these tools are available:\e[m"
7
8
 
8
- discorb_path = $:.find { |path| File.directory?(path + "/discorb") }
9
+ discorb_path = $LOAD_PATH.find { |path| File.directory?(path + "/discorb") }
9
10
  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"
11
+ Dir.glob(discorb_path + "/discorb/exe/*.rb") do |exe_script|
12
+ name = File.basename(exe_script, ".rb")
13
+ description = File.read(exe_script).match(/# description: (.+)/)&.[](1) || "No description"
13
14
  scripts[name] = description
14
15
  end
15
- max_length = scripts.keys.map { |key| key.length }.max
16
+ max_length = scripts.keys.map(&:length).max
16
17
  scripts.sort.each do |name, description|
17
18
  puts "\e[90m#{name.rjust(max_length)}\e[m - #{description}"
18
19
  end
19
20
 
20
- puts "\e[94m\nTo run a tool, type:\e[m\n" +
21
- "\e[34m discorb [script]\e[m"
21
+ puts "\e[94m\nTo run a tool, type:\e[m\n" \
22
+ "\e[34m discorb [script]\e[m"
22
23
 
23
24
  exit 1
24
25
  end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+ module Discorb
3
+ #
4
+ # Represents a allowed mentions in a message.
5
+ #
6
+ class AllowedMentions
7
+ # @return [Boolean] Whether to allow @everyone or @here.
8
+ attr_accessor :everyone
9
+ # @return [Boolean, Array<Discorb::Role>] The roles to allow, or false to disable.
10
+ attr_accessor :roles
11
+ # @return [Boolean, Array<Discorb::User>] The users to allow, or false to disable.
12
+ attr_accessor :users
13
+ # @return [Boolean] Whether to ping the user that sent the message to reply.
14
+ attr_accessor :replied_user
15
+
16
+ #
17
+ # Initializes a new instance of the AllowedMentions class.
18
+ #
19
+ # @param [Boolean] everyone Whether to allow @everyone or @here.
20
+ # @param [Boolean, Array<Discorb::Role>] roles The roles to allow, or false to disable.
21
+ # @param [Boolean, Array<Discorb::User>] users The users to allow, or false to disable.
22
+ # @param [Boolean] replied_user Whether to ping the user that sent the message to reply.
23
+ #
24
+ def initialize(everyone: nil, roles: nil, users: nil, replied_user: nil)
25
+ @everyone = everyone
26
+ @roles = roles
27
+ @users = users
28
+ @replied_user = replied_user
29
+ end
30
+
31
+ def inspect
32
+ "#<#{self.class} @everyone=#{@everyone} @roles=#{@roles} @users=#{@users} @replied_user=#{@replied_user}>"
33
+ end
34
+
35
+ # @private
36
+ def to_hash(other = nil)
37
+ payload = {
38
+ parse: %w[everyone roles users],
39
+ }
40
+ replied_user = nil_merge(@replied_user, other&.replied_user)
41
+ everyone = nil_merge(@everyone, other&.everyone)
42
+ roles = nil_merge(@roles, other&.roles)
43
+ users = nil_merge(@users, other&.users)
44
+ payload[:replied_user] = replied_user
45
+ payload[:parse].delete("everyone") if everyone == false
46
+ if (roles == false) || roles.is_a?(Array)
47
+ payload[:roles] = roles.map { |u| u.id.to_s } if roles.is_a? Array
48
+ payload[:parse].delete("roles")
49
+ end
50
+ if (users == false) || users.is_a?(Array)
51
+ payload[:users] = users.map { |u| u.id.to_s } if users.is_a? Array
52
+ payload[:parse].delete("users")
53
+ end
54
+ payload
55
+ end
56
+
57
+ def nil_merge(*args)
58
+ args.each do |a|
59
+ return a unless a.nil?
60
+ end
61
+ nil
62
+ end
63
+ end
64
+ end