discorb 0.13.2 → 0.15.0
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 +4 -4
- data/.gitattributes +2 -0
- data/.github/workflows/build_version.yml +1 -1
- data/.github/workflows/codeql-analysis.yml +70 -0
- data/.github/workflows/lint-push.yml +20 -0
- data/.github/workflows/lint.yml +16 -0
- data/.rubocop.yml +70 -0
- data/CODE_OF_CONDUCT.md +128 -0
- data/Changelog.md +34 -0
- data/Gemfile +7 -3
- data/README.md +1 -1
- data/Rakefile +22 -22
- data/discorb.gemspec +13 -1
- data/docs/faq.md +8 -8
- data/examples/commands/bookmarker.rb +2 -1
- data/examples/commands/hello.rb +1 -0
- data/examples/commands/inspect.rb +3 -2
- data/examples/components/authorization_button.rb +2 -1
- data/examples/components/select_menu.rb +2 -1
- data/examples/extension/main.rb +1 -0
- data/examples/extension/message_expander.rb +1 -0
- data/examples/simple/eval.rb +3 -2
- data/examples/simple/ping_pong.rb +1 -0
- data/examples/simple/rolepanel.rb +1 -0
- data/examples/simple/wait_for_message.rb +4 -3
- data/exe/discorb +8 -7
- data/lib/discorb/allowed_mentions.rb +64 -0
- data/lib/discorb/app_command/command.rb +274 -0
- data/lib/discorb/app_command/handler.rb +168 -0
- data/lib/discorb/app_command.rb +2 -404
- data/lib/discorb/asset.rb +3 -1
- data/lib/discorb/{file.rb → attachment.rb} +42 -35
- data/lib/discorb/audit_logs.rb +3 -3
- data/lib/discorb/channel.rb +65 -61
- data/lib/discorb/client.rb +36 -33
- data/lib/discorb/common.rb +29 -22
- data/lib/discorb/components/button.rb +106 -0
- data/lib/discorb/components/select_menu.rb +157 -0
- data/lib/discorb/components/text_input.rb +96 -0
- data/lib/discorb/components.rb +11 -276
- data/lib/discorb/dictionary.rb +13 -2
- data/lib/discorb/embed.rb +40 -33
- data/lib/discorb/emoji.rb +21 -5
- data/lib/discorb/emoji_table.rb +1 -1
- data/lib/discorb/error.rb +4 -6
- data/lib/discorb/event.rb +13 -11
- data/lib/discorb/exe/about.rb +1 -0
- data/lib/discorb/exe/irb.rb +4 -3
- data/lib/discorb/exe/new.rb +6 -7
- data/lib/discorb/exe/run.rb +2 -1
- data/lib/discorb/exe/setup.rb +8 -5
- data/lib/discorb/exe/show.rb +1 -0
- data/lib/discorb/extend.rb +19 -14
- data/lib/discorb/extension.rb +5 -1
- data/lib/discorb/gateway.rb +82 -29
- data/lib/discorb/guild.rb +58 -80
- data/lib/discorb/guild_template.rb +5 -5
- data/lib/discorb/http.rb +52 -170
- data/lib/discorb/integration.rb +32 -3
- data/lib/discorb/intents.rb +9 -4
- data/lib/discorb/interaction/autocomplete.rb +5 -4
- data/lib/discorb/interaction/command.rb +34 -9
- data/lib/discorb/interaction/components.rb +5 -2
- data/lib/discorb/interaction/modal.rb +33 -0
- data/lib/discorb/interaction/response.rb +41 -12
- data/lib/discorb/interaction/root.rb +1 -0
- data/lib/discorb/interaction.rb +2 -1
- data/lib/discorb/invite.rb +1 -1
- data/lib/discorb/log.rb +4 -3
- data/lib/discorb/member.rb +4 -6
- data/lib/discorb/message.rb +38 -241
- data/lib/discorb/message_meta.rb +157 -0
- data/lib/discorb/modules.rb +47 -23
- data/lib/discorb/permission.rb +2 -2
- data/lib/discorb/presence.rb +6 -3
- data/lib/discorb/rate_limit.rb +15 -21
- data/lib/discorb/role.rb +3 -3
- data/lib/discorb/sticker.rb +2 -2
- data/lib/discorb/user.rb +3 -3
- data/lib/discorb/utils/colored_puts.rb +1 -0
- data/lib/discorb/voice_state.rb +7 -2
- data/lib/discorb/webhook.rb +9 -6
- data/lib/discorb.rb +2 -1
- data/sig/discorb.rbs +5836 -6714
- data/template-replace/scripts/arrow.rb +1 -0
- data/template-replace/scripts/favicon.rb +1 -0
- data/template-replace/scripts/index.rb +2 -1
- data/template-replace/scripts/locale_ja.rb +5 -4
- data/template-replace/scripts/sidebar.rb +1 -0
- data/template-replace/scripts/version.rb +7 -10
- data/template-replace/scripts/yard_replace.rb +5 -4
- metadata +30 -5
    
        data/lib/discorb/channel.rb
    CHANGED
    
    | @@ -174,7 +174,7 @@ module Discorb | |
| 174 174 | 
             
                #
         | 
| 175 175 | 
             
                def delete!(reason: nil)
         | 
| 176 176 | 
             
                  Async do
         | 
| 177 | 
            -
                    @client.http. | 
| 177 | 
            +
                    @client.http.request(Route.new(base_url.wait.to_s, "//webhooks/:webhook_id/:token", :delete), audit_log_reason: reason).wait
         | 
| 178 178 | 
             
                    @deleted = true
         | 
| 179 179 | 
             
                    self
         | 
| 180 180 | 
             
                  end
         | 
| @@ -201,7 +201,7 @@ module Discorb | |
| 201 201 | 
             
                    }
         | 
| 202 202 | 
             
                    payload[:lock_permissions] = lock_permissions
         | 
| 203 203 | 
             
                    payload[:parent_id] = parent&.id if parent != Discorb::Unset
         | 
| 204 | 
            -
                    @client.http. | 
| 204 | 
            +
                    @client.http.request(Route.new("/guilds/#{@guild_id}/channels", "//guilds/:guild_id/channels", :patch), payload, audit_log_reason: reason).wait
         | 
| 205 205 | 
             
                  end
         | 
| 206 206 | 
             
                end
         | 
| 207 207 |  | 
| @@ -211,9 +211,9 @@ module Discorb | |
| 211 211 | 
             
                  @guild_id = data[:guild_id]
         | 
| 212 212 | 
             
                  @position = data[:position]
         | 
| 213 213 | 
             
                  @permission_overwrites = if data[:permission_overwrites]
         | 
| 214 | 
            -
                      data[:permission_overwrites]. | 
| 214 | 
            +
                      data[:permission_overwrites].to_h do |ow|
         | 
| 215 215 | 
             
                        [(ow[:type] == 1 ? guild.roles : guild.members)[ow[:id]], PermissionOverwrite.new(ow[:allow], ow[:deny])]
         | 
| 216 | 
            -
                      end | 
| 216 | 
            +
                      end
         | 
| 217 217 | 
             
                    else
         | 
| 218 218 | 
             
                      {}
         | 
| 219 219 | 
             
                    end
         | 
| @@ -239,17 +239,15 @@ module Discorb | |
| 239 239 | 
             
                # @return [Time] The time when the last pinned message was pinned.
         | 
| 240 240 | 
             
                attr_reader :last_pin_timestamp
         | 
| 241 241 | 
             
                alias last_pinned_at last_pin_timestamp
         | 
| 242 | 
            -
                # @return [Array<Discorb::ThreadChannel>] The threads in the channel.
         | 
| 243 | 
            -
                attr_reader :threads
         | 
| 244 242 |  | 
| 245 243 | 
             
                include Messageable
         | 
| 246 244 |  | 
| 247 245 | 
             
                @channel_type = 0
         | 
| 248 246 |  | 
| 249 | 
            -
                #  | 
| 250 | 
            -
                 | 
| 251 | 
            -
             | 
| 252 | 
            -
                   | 
| 247 | 
            +
                # @!attribute [r] threads
         | 
| 248 | 
            +
                #   @return [Array<Discorb::ThreadChannel>] The threads in the channel.
         | 
| 249 | 
            +
                def threads
         | 
| 250 | 
            +
                  guild.threads.select { |thread| thread.parent == self }
         | 
| 253 251 | 
             
                end
         | 
| 254 252 |  | 
| 255 253 | 
             
                #
         | 
| @@ -292,7 +290,7 @@ module Discorb | |
| 292 290 | 
             
                    default_auto_archive_duration ||= archive_in
         | 
| 293 291 | 
             
                    payload[:default_auto_archive_duration] = default_auto_archive_duration if default_auto_archive_duration != Discorb::Unset
         | 
| 294 292 |  | 
| 295 | 
            -
                    @client.http. | 
| 293 | 
            +
                    @client.http.request(Route.new("/channels/#{@id}", "//channels/:channel_id", :patch), payload, audit_log_reason: reason).wait
         | 
| 296 294 | 
             
                    self
         | 
| 297 295 | 
             
                  end
         | 
| 298 296 | 
             
                end
         | 
| @@ -313,7 +311,7 @@ module Discorb | |
| 313 311 | 
             
                    payload = {}
         | 
| 314 312 | 
             
                    payload[:name] = name
         | 
| 315 313 | 
             
                    payload[:avatar] = avatar.to_s if avatar
         | 
| 316 | 
            -
                    _resp, data = @client.http. | 
| 314 | 
            +
                    _resp, data = @client.http.request(Route.new("/channels/#{@id}/webhooks", "//channels/:channel_id/webhooks", :post), payload).wait
         | 
| 317 315 | 
             
                    Webhook.new([@client, data])
         | 
| 318 316 | 
             
                  end
         | 
| 319 317 | 
             
                end
         | 
| @@ -326,7 +324,7 @@ module Discorb | |
| 326 324 | 
             
                #
         | 
| 327 325 | 
             
                def fetch_webhooks
         | 
| 328 326 | 
             
                  Async do
         | 
| 329 | 
            -
                    _resp, data = @client.http. | 
| 327 | 
            +
                    _resp, data = @client.http.request(Route.new("/channels/#{@id}/webhooks", "//channels/:channel_id/webhooks", :get)).wait
         | 
| 330 328 | 
             
                    data.map { |webhook| Webhook.new([@client, webhook]) }
         | 
| 331 329 | 
             
                  end
         | 
| 332 330 | 
             
                end
         | 
| @@ -354,7 +352,7 @@ module Discorb | |
| 354 352 |  | 
| 355 353 | 
             
                    message_ids = messages.map { |m| Discorb::Utils.try(m, :id).to_s }
         | 
| 356 354 |  | 
| 357 | 
            -
                    @client.http. | 
| 355 | 
            +
                    @client.http.request(Route.new("/channels/#{@id}/messages/bulk-delete", "//channels/:channel_id/messages/bulk-delete", :post), { messages: message_ids }).wait
         | 
| 358 356 | 
             
                  end
         | 
| 359 357 | 
             
                end
         | 
| 360 358 |  | 
| @@ -384,7 +382,7 @@ module Discorb | |
| 384 382 | 
             
                      deny: deny_value,
         | 
| 385 383 | 
             
                      type: target.is_a?(Member) ? 1 : 0,
         | 
| 386 384 | 
             
                    }
         | 
| 387 | 
            -
                    @client.http. | 
| 385 | 
            +
                    @client.http.request(Route.new("/channels/#{@id}/permissions/#{target.id}", "//channels/:channel_id/permissions/:target_id", :put), payload, audit_log_reason: reason).wait
         | 
| 388 386 | 
             
                  end
         | 
| 389 387 | 
             
                end
         | 
| 390 388 |  | 
| @@ -404,7 +402,7 @@ module Discorb | |
| 404 402 | 
             
                #
         | 
| 405 403 | 
             
                def delete_permissions(target, reason: nil)
         | 
| 406 404 | 
             
                  Async do
         | 
| 407 | 
            -
                    @client.http. | 
| 405 | 
            +
                    @client.http.request(Route.new("/channels/#{@id}/permissions/#{target.id}", "//channels/:channel_id/permissions/:target_id", :delete), audit_log_reason: reason).wait
         | 
| 408 406 | 
             
                  end
         | 
| 409 407 | 
             
                end
         | 
| 410 408 |  | 
| @@ -420,7 +418,7 @@ module Discorb | |
| 420 418 | 
             
                #
         | 
| 421 419 | 
             
                def fetch_invites
         | 
| 422 420 | 
             
                  Async do
         | 
| 423 | 
            -
                    _resp, data = @client.http. | 
| 421 | 
            +
                    _resp, data = @client.http.request(Route.new("/channels/#{@id}/invites", "//channels/:channel_id/invites", :get)).wait
         | 
| 424 422 | 
             
                    data.map { |invite| Invite.new(@client, invite) }
         | 
| 425 423 | 
             
                  end
         | 
| 426 424 | 
             
                end
         | 
| @@ -440,7 +438,7 @@ module Discorb | |
| 440 438 | 
             
                #
         | 
| 441 439 | 
             
                def create_invite(max_age: nil, max_uses: nil, temporary: false, unique: false, reason: nil)
         | 
| 442 440 | 
             
                  Async do
         | 
| 443 | 
            -
                    _resp, data = @client.http. | 
| 441 | 
            +
                    _resp, data = @client.http.request(Route.new("/channels/#{@id}/invites", "//channels/:channel_id/invites", :post), {
         | 
| 444 442 | 
             
                      max_age: max_age,
         | 
| 445 443 | 
             
                      max_uses: max_uses,
         | 
| 446 444 | 
             
                      temporary: temporary,
         | 
| @@ -461,7 +459,7 @@ module Discorb | |
| 461 459 | 
             
                #
         | 
| 462 460 | 
             
                def follow_from(target, reason: nil)
         | 
| 463 461 | 
             
                  Async do
         | 
| 464 | 
            -
                    @client.http. | 
| 462 | 
            +
                    @client.http.request(Route.new("/channels/#{target.id}/followers", "//channels/:channel_id/followers", :post), { webhook_channel_id: @id }, audit_log_reason: reason).wait
         | 
| 465 463 | 
             
                  end
         | 
| 466 464 | 
             
                end
         | 
| 467 465 |  | 
| @@ -476,7 +474,7 @@ module Discorb | |
| 476 474 | 
             
                #
         | 
| 477 475 | 
             
                def follow_to(target, reason: nil)
         | 
| 478 476 | 
             
                  Async do
         | 
| 479 | 
            -
                    @client.http. | 
| 477 | 
            +
                    @client.http.request(Route.new("/channels/#{@id}/followers", "//channels/:channel_id/followers", :post), { webhook_channel_id: target.id }, audit_log_reason: reason).wait
         | 
| 480 478 | 
             
                  end
         | 
| 481 479 | 
             
                end
         | 
| 482 480 |  | 
| @@ -497,17 +495,15 @@ module Discorb | |
| 497 495 | 
             
                def start_thread(name, message: nil, auto_archive_duration: 1440, public: true, rate_limit_per_user: nil, slowmode: nil, reason: nil)
         | 
| 498 496 | 
             
                  Async do
         | 
| 499 497 | 
             
                    _resp, data = if message.nil?
         | 
| 500 | 
            -
                        @client.http.post | 
| 501 | 
            -
                           | 
| 502 | 
            -
             | 
| 503 | 
            -
             | 
| 504 | 
            -
             | 
| 505 | 
            -
             | 
| 506 | 
            -
             | 
| 507 | 
            -
                          audit_log_reason: reason,
         | 
| 508 | 
            -
                        ).wait
         | 
| 498 | 
            +
                        @client.http.request(Route.new("/channels/#{@id}/threads", "//channels/:channel_id/threads", :post), {
         | 
| 499 | 
            +
                          name: name,
         | 
| 500 | 
            +
                          auto_archive_duration: auto_archive_duration,
         | 
| 501 | 
            +
                          type: public ? 11 : 10,
         | 
| 502 | 
            +
                          rate_limit_per_user: rate_limit_per_user || slowmode,
         | 
| 503 | 
            +
                        },
         | 
| 504 | 
            +
                                             audit_log_reason: reason).wait
         | 
| 509 505 | 
             
                      else
         | 
| 510 | 
            -
                        @client.http. | 
| 506 | 
            +
                        @client.http.request(Route.new("/channels/#{@id}/messages/#{Utils.try(message, :id)}/threads", "//channels/:channel_id/messages/:message_id/threads", :post), {
         | 
| 511 507 | 
             
                          name: name, auto_archive_duration: auto_archive_duration,
         | 
| 512 508 | 
             
                        }, audit_log_reason: reason).wait
         | 
| 513 509 | 
             
                      end
         | 
| @@ -525,7 +521,7 @@ module Discorb | |
| 525 521 | 
             
                #
         | 
| 526 522 | 
             
                def fetch_archived_public_threads
         | 
| 527 523 | 
             
                  Async do
         | 
| 528 | 
            -
                    _resp, data = @client.http. | 
| 524 | 
            +
                    _resp, data = @client.http.request(Route.new("/channels/#{@id}/threads/archived/public", "//channels/:channel_id/threads/archived/public", :get)).wait
         | 
| 529 525 | 
             
                    data.map { |thread| Channel.make_channel(@client, thread) }
         | 
| 530 526 | 
             
                  end
         | 
| 531 527 | 
             
                end
         | 
| @@ -538,7 +534,7 @@ module Discorb | |
| 538 534 | 
             
                #
         | 
| 539 535 | 
             
                def fetch_archived_private_threads
         | 
| 540 536 | 
             
                  Async do
         | 
| 541 | 
            -
                    _resp, data = @client.http. | 
| 537 | 
            +
                    _resp, data = @client.http.request(Route.new("/channels/#{@id}/threads/archived/private", "//channels/:channel_id/threads/archived/private", :get)).wait
         | 
| 542 538 | 
             
                    data.map { |thread| Channel.make_channel(@client, thread) }
         | 
| 543 539 | 
             
                  end
         | 
| 544 540 | 
             
                end
         | 
| @@ -558,7 +554,7 @@ module Discorb | |
| 558 554 | 
             
                      before = 0
         | 
| 559 555 | 
             
                      threads = []
         | 
| 560 556 | 
             
                      loop do
         | 
| 561 | 
            -
                        _resp, data = @client.http. | 
| 557 | 
            +
                        _resp, data = @client.http.request(Route.new("/channels/#{@id}/users/@me/threads/archived/private?before=#{before}", "//channels/:channel_id/users/@me/threads/archived/private", :get)).wait
         | 
| 562 558 | 
             
                        threads += data[:threads].map { |thread| Channel.make_channel(@client, thread) }
         | 
| 563 559 | 
             
                        before = data[:threads][-1][:id]
         | 
| 564 560 |  | 
| @@ -566,7 +562,7 @@ module Discorb | |
| 566 562 | 
             
                      end
         | 
| 567 563 | 
             
                      threads
         | 
| 568 564 | 
             
                    else
         | 
| 569 | 
            -
                      _resp, data = @client.http. | 
| 565 | 
            +
                      _resp, data = @client.http.request(Route.new("/channels/#{@id}/users/@me/threads/archived/private?limit=#{limit}&before=#{before}", "//channels/:channel_id/users/@me/threads/archived/private", :get)).wait
         | 
| 570 566 | 
             
                      data.map { |thread| Channel.make_channel(@client, thread) }
         | 
| 571 567 | 
             
                    end
         | 
| 572 568 | 
             
                  end
         | 
| @@ -634,7 +630,7 @@ module Discorb | |
| 634 630 | 
             
                    payload[:user_limit] = user_limit if user_limit != Discorb::Unset
         | 
| 635 631 | 
             
                    payload[:rtc_region] = rtc_region if rtc_region != Discorb::Unset
         | 
| 636 632 |  | 
| 637 | 
            -
                    @client.http. | 
| 633 | 
            +
                    @client.http.request(Route.new("/channels/#{@id}", "//channels/:channel_id", :patch), payload, audit_log_reason: reason).wait
         | 
| 638 634 | 
             
                    self
         | 
| 639 635 | 
             
                  end
         | 
| 640 636 | 
             
                end
         | 
| @@ -707,7 +703,7 @@ module Discorb | |
| 707 703 | 
             
                    payload[:position] = position if position != Discorb::Unset
         | 
| 708 704 | 
             
                    payload[:bitrate] = bitrate if bitrate != Discorb::Unset
         | 
| 709 705 | 
             
                    payload[:rtc_region] = rtc_region if rtc_region != Discorb::Unset
         | 
| 710 | 
            -
                    @client.http. | 
| 706 | 
            +
                    @client.http.request(Route.new("/channels/#{@id}", "//channels/:channel_id", :patch), payload, audit_log_reason: reason).wait
         | 
| 711 707 | 
             
                    self
         | 
| 712 708 | 
             
                  end
         | 
| 713 709 | 
             
                end
         | 
| @@ -726,7 +722,7 @@ module Discorb | |
| 726 722 | 
             
                #
         | 
| 727 723 | 
             
                def start(topic, public: false, reason: nil)
         | 
| 728 724 | 
             
                  Async do
         | 
| 729 | 
            -
                    _resp, data = @client.http. | 
| 725 | 
            +
                    _resp, data = @client.http.request(Route.new("/stage-instances", "//stage-instances", :post), { channel_id: @id, topic: topic, public: public ? 2 : 1 }, audit_log_reason: reason).wait
         | 
| 730 726 | 
             
                    StageInstance.new(@client, data)
         | 
| 731 727 | 
             
                  end
         | 
| 732 728 | 
             
                end
         | 
| @@ -740,7 +736,7 @@ module Discorb | |
| 740 736 | 
             
                #
         | 
| 741 737 | 
             
                def fetch_stage_instance
         | 
| 742 738 | 
             
                  Async do
         | 
| 743 | 
            -
                    _resp, data = @client.http. | 
| 739 | 
            +
                    _resp, data = @client.http.request(Route.new("/stage-instances/#{@id}", "//stage-instances/:stage_instance_id", :get)).wait
         | 
| 744 740 | 
             
                  rescue Discorb::NotFoundError
         | 
| 745 741 | 
             
                    nil
         | 
| 746 742 | 
             
                  else
         | 
| @@ -761,7 +757,7 @@ module Discorb | |
| 761 757 | 
             
                end
         | 
| 762 758 |  | 
| 763 759 | 
             
                def audiences
         | 
| 764 | 
            -
                  voice_states.filter | 
| 760 | 
            +
                  voice_states.filter(&:suppress?).map(&:member)
         | 
| 765 761 | 
             
                end
         | 
| 766 762 |  | 
| 767 763 | 
             
                private
         | 
| @@ -831,8 +827,6 @@ module Discorb | |
| 831 827 | 
             
                def initialize(client, data, no_cache: false)
         | 
| 832 828 | 
             
                  @members = Dictionary.new
         | 
| 833 829 | 
             
                  super
         | 
| 834 | 
            -
                  @client.channels[@parent_id].threads[@id] = self
         | 
| 835 | 
            -
             | 
| 836 830 | 
             
                  @client.channels[@id] = self unless no_cache
         | 
| 837 831 | 
             
                end
         | 
| 838 832 |  | 
| @@ -863,7 +857,7 @@ module Discorb | |
| 863 857 | 
             
                    auto_archive_duration ||= archive_in
         | 
| 864 858 | 
             
                    payload[:auto_archive_duration] = auto_archive_duration if auto_archive_duration != Discorb::Unset
         | 
| 865 859 | 
             
                    payload[:locked] = locked if locked != Discorb::Unset
         | 
| 866 | 
            -
                    @client.http. | 
| 860 | 
            +
                    @client.http.request(Route.new("/channels/#{@id}", "//channels/:channel_id", :patch), payload, audit_log_reason: reason).wait
         | 
| 867 861 | 
             
                    self
         | 
| 868 862 | 
             
                  end
         | 
| 869 863 | 
             
                end
         | 
| @@ -952,9 +946,9 @@ module Discorb | |
| 952 946 | 
             
                def add_member(member = :me)
         | 
| 953 947 | 
             
                  Async do
         | 
| 954 948 | 
             
                    if member == :me
         | 
| 955 | 
            -
                      @client.http. | 
| 949 | 
            +
                      @client.http.request(Route.new("/channels/#{@id}/thread-members/@me", "//channels/:channel_id/thread-members/@me", :post)).wait
         | 
| 956 950 | 
             
                    else
         | 
| 957 | 
            -
                      @client.http. | 
| 951 | 
            +
                      @client.http.request(Route.new("/channels/#{@id}/thread-members/#{Utils.try(member, :id)}", "//channels/:channel_id/thread-members/:user_id", :post)).wait
         | 
| 958 952 | 
             
                    end
         | 
| 959 953 | 
             
                  end
         | 
| 960 954 | 
             
                end
         | 
| @@ -971,9 +965,9 @@ module Discorb | |
| 971 965 | 
             
                def remove_member(member = :me)
         | 
| 972 966 | 
             
                  Async do
         | 
| 973 967 | 
             
                    if member == :me
         | 
| 974 | 
            -
                      @client.http. | 
| 968 | 
            +
                      @client.http.request(Route.new("/channels/#{@id}/thread-members/@me", "//channels/:channel_id/thread-members/@me", :delete)).wait
         | 
| 975 969 | 
             
                    else
         | 
| 976 | 
            -
                      @client.http. | 
| 970 | 
            +
                      @client.http.request(Route.new("/channels/#{@id}/thread-members/#{Utils.try(member, :id)}", "//channels/:channel_id/thread-members/:user_id", :delete)).wait
         | 
| 977 971 | 
             
                    end
         | 
| 978 972 | 
             
                  end
         | 
| 979 973 | 
             
                end
         | 
| @@ -987,19 +981,28 @@ module Discorb | |
| 987 981 | 
             
                #
         | 
| 988 982 | 
             
                def fetch_members
         | 
| 989 983 | 
             
                  Async do
         | 
| 990 | 
            -
                    _resp, data = @client.http. | 
| 984 | 
            +
                    _resp, data = @client.http.request(Route.new("/channels/#{@id}/thread-members", "//channels/:channel_id/thread-members", :get)).wait
         | 
| 991 985 | 
             
                    data.map { |d| @members[d[:id]] = Member.new(@client, d) }
         | 
| 992 986 | 
             
                  end
         | 
| 993 987 | 
             
                end
         | 
| 994 988 |  | 
| 989 | 
            +
                #
         | 
| 990 | 
            +
                # Represents a thread in news channel(aka announcement channel).
         | 
| 991 | 
            +
                #
         | 
| 995 992 | 
             
                class News < ThreadChannel
         | 
| 996 993 | 
             
                  @channel_type = 10
         | 
| 997 994 | 
             
                end
         | 
| 998 995 |  | 
| 996 | 
            +
                #
         | 
| 997 | 
            +
                # Represents a public thread in text channel.
         | 
| 998 | 
            +
                #
         | 
| 999 999 | 
             
                class Public < ThreadChannel
         | 
| 1000 1000 | 
             
                  @channel_type = 11
         | 
| 1001 1001 | 
             
                end
         | 
| 1002 1002 |  | 
| 1003 | 
            +
                #
         | 
| 1004 | 
            +
                # Represents a private thread in text channel.
         | 
| 1005 | 
            +
                #
         | 
| 1003 1006 | 
             
                class Private < ThreadChannel
         | 
| 1004 1007 | 
             
                  @channel_type = 12
         | 
| 1005 1008 | 
             
                end
         | 
| @@ -1009,7 +1012,7 @@ module Discorb | |
| 1009 1012 | 
             
                end
         | 
| 1010 1013 |  | 
| 1011 1014 | 
             
                #
         | 
| 1012 | 
            -
                #  | 
| 1015 | 
            +
                # Represents a member in a thread.
         | 
| 1013 1016 | 
             
                #
         | 
| 1014 1017 | 
             
                class Member < DiscordModel
         | 
| 1015 1018 | 
             
                  attr_reader :joined_at
         | 
| @@ -1061,25 +1064,30 @@ module Discorb | |
| 1061 1064 | 
             
                end
         | 
| 1062 1065 | 
             
              end
         | 
| 1063 1066 |  | 
| 1067 | 
            +
              #
         | 
| 1068 | 
            +
              # Represents a category in a guild.
         | 
| 1069 | 
            +
              #
         | 
| 1064 1070 | 
             
              class CategoryChannel < GuildChannel
         | 
| 1065 | 
            -
                attr_reader :channels
         | 
| 1066 | 
            -
             | 
| 1067 1071 | 
             
                @channel_type = 4
         | 
| 1068 1072 |  | 
| 1073 | 
            +
                def channels
         | 
| 1074 | 
            +
                  @client.channels.values.filter { |channel| channel.parent == self }
         | 
| 1075 | 
            +
                end
         | 
| 1076 | 
            +
             | 
| 1069 1077 | 
             
                def text_channels
         | 
| 1070 | 
            -
                   | 
| 1078 | 
            +
                  channels.filter { |c| c.is_a? TextChannel }
         | 
| 1071 1079 | 
             
                end
         | 
| 1072 1080 |  | 
| 1073 1081 | 
             
                def voice_channels
         | 
| 1074 | 
            -
                   | 
| 1082 | 
            +
                  channels.filter { |c| c.is_a? VoiceChannel }
         | 
| 1075 1083 | 
             
                end
         | 
| 1076 1084 |  | 
| 1077 1085 | 
             
                def news_channel
         | 
| 1078 | 
            -
                   | 
| 1086 | 
            +
                  channels.filter { |c| c.is_a? NewsChannel }
         | 
| 1079 1087 | 
             
                end
         | 
| 1080 1088 |  | 
| 1081 1089 | 
             
                def stage_channels
         | 
| 1082 | 
            -
                   | 
| 1090 | 
            +
                  channels.filter { |c| c.is_a? StageChannel }
         | 
| 1083 1091 | 
             
                end
         | 
| 1084 1092 |  | 
| 1085 1093 | 
             
                def create_text_channel(*args, **kwargs)
         | 
| @@ -1097,15 +1105,11 @@ module Discorb | |
| 1097 1105 | 
             
                def create_stage_channel(*args, **kwargs)
         | 
| 1098 1106 | 
             
                  guild.create_stage_channel(*args, parent: self, **kwargs)
         | 
| 1099 1107 | 
             
                end
         | 
| 1100 | 
            -
             | 
| 1101 | 
            -
                private
         | 
| 1102 | 
            -
             | 
| 1103 | 
            -
                def _set_data(data)
         | 
| 1104 | 
            -
                  @channels = @client.channels.values.filter { |channel| channel.parent == self }
         | 
| 1105 | 
            -
                  super
         | 
| 1106 | 
            -
                end
         | 
| 1107 1108 | 
             
              end
         | 
| 1108 1109 |  | 
| 1110 | 
            +
              #
         | 
| 1111 | 
            +
              # Represents a DM channel.
         | 
| 1112 | 
            +
              #
         | 
| 1109 1113 | 
             
              class DMChannel < Channel
         | 
| 1110 1114 | 
             
                include Messageable
         | 
| 1111 1115 |  | 
    
        data/lib/discorb/client.rb
    CHANGED
    
    | @@ -63,7 +63,7 @@ module Discorb | |
| 63 63 | 
             
                # @param [Discorb::AllowedMentions] allowed_mentions The allowed mentions that the client is using.
         | 
| 64 64 | 
             
                # @param [Discorb::Intents] intents The intents that the client is currently using.
         | 
| 65 65 | 
             
                # @param [Integer] message_caches The number of messages to cache.
         | 
| 66 | 
            -
                # @param [# | 
| 66 | 
            +
                # @param [#write] log The IO object to use for logging.
         | 
| 67 67 | 
             
                # @param [Boolean] colorize_log Whether to colorize the log.
         | 
| 68 68 | 
             
                # @param [:debug, :info, :warn, :error, :critical] log_level The log level.
         | 
| 69 69 | 
             
                # @param [Boolean] wait_until_ready Whether to delay event dispatch until ready.
         | 
| @@ -186,10 +186,8 @@ module Discorb | |
| 186 186 | 
             
                    @log.debug "Dispatching event #{event_name}"
         | 
| 187 187 | 
             
                    events.each do |block|
         | 
| 188 188 | 
             
                      Async do
         | 
| 189 | 
            -
                        Async(annotation: "Discorb event: #{event_name}") do | | 
| 190 | 
            -
                          if block.is_a?(Discorb::EventHandler)
         | 
| 191 | 
            -
                            @events[event_name].delete(block) if block.metadata[:once]
         | 
| 192 | 
            -
                          end
         | 
| 189 | 
            +
                        Async(annotation: "Discorb event: #{event_name}") do |_task|
         | 
| 190 | 
            +
                          @events[event_name].delete(block) if block.is_a?(Discorb::EventHandler) && block.metadata[:once]
         | 
| 193 191 | 
             
                          block.call(*args)
         | 
| 194 192 | 
             
                          @log.debug "Dispatched proc with ID #{block.id.inspect}"
         | 
| 195 193 | 
             
                        rescue StandardError, ScriptError => e
         | 
| @@ -212,7 +210,7 @@ module Discorb | |
| 212 210 | 
             
                #
         | 
| 213 211 | 
             
                def fetch_user(id)
         | 
| 214 212 | 
             
                  Async do
         | 
| 215 | 
            -
                    _resp, data = http. | 
| 213 | 
            +
                    _resp, data = @http.request(Route.new("/users/#{id}", "//users/:user_id", :get)).wait
         | 
| 216 214 | 
             
                    User.new(self, data)
         | 
| 217 215 | 
             
                  end
         | 
| 218 216 | 
             
                end
         | 
| @@ -229,7 +227,7 @@ module Discorb | |
| 229 227 | 
             
                #
         | 
| 230 228 | 
             
                def fetch_channel(id)
         | 
| 231 229 | 
             
                  Async do
         | 
| 232 | 
            -
                    _resp, data = http. | 
| 230 | 
            +
                    _resp, data = @http.request(Route.new("/channels/#{id}", "//channels/:channel_id", :get)).wait
         | 
| 233 231 | 
             
                    Channel.make_channel(self, data)
         | 
| 234 232 | 
             
                  end
         | 
| 235 233 | 
             
                end
         | 
| @@ -246,7 +244,7 @@ module Discorb | |
| 246 244 | 
             
                #
         | 
| 247 245 | 
             
                def fetch_guild(id)
         | 
| 248 246 | 
             
                  Async do
         | 
| 249 | 
            -
                    _resp, data = http. | 
| 247 | 
            +
                    _resp, data = @http.request(Route.new("/guilds/#{id}", "//guilds/:guild_id", :get)).wait
         | 
| 250 248 | 
             
                    Guild.new(self, data, false)
         | 
| 251 249 | 
             
                  end
         | 
| 252 250 | 
             
                end
         | 
| @@ -261,9 +259,9 @@ module Discorb | |
| 261 259 | 
             
                #
         | 
| 262 260 | 
             
                # @return [Async::Task<Discorb::Invite>] The invite.
         | 
| 263 261 | 
             
                #
         | 
| 264 | 
            -
                def fetch_invite(code, with_count:  | 
| 262 | 
            +
                def fetch_invite(code, with_count: true, with_expiration: true)
         | 
| 265 263 | 
             
                  Async do
         | 
| 266 | 
            -
                    _resp, data = http. | 
| 264 | 
            +
                    _resp, data = @http.request(Route.new("/invites/#{code}?with_count=#{with_count}&with_expiration=#{with_expiration}", "//invites/:code", :get)).wait
         | 
| 267 265 | 
             
                    Invite.new(self, data, false)
         | 
| 268 266 | 
             
                  end
         | 
| 269 267 | 
             
                end
         | 
| @@ -281,7 +279,7 @@ module Discorb | |
| 281 279 | 
             
                  Async do
         | 
| 282 280 | 
             
                    next @application if @application && !force
         | 
| 283 281 |  | 
| 284 | 
            -
                    _resp, data = http. | 
| 282 | 
            +
                    _resp, data = @http.request(Route.new("/oauth2/applications/@me", "//oauth2/applications/@me", :get)).wait
         | 
| 285 283 | 
             
                    @application = Application.new(self, data)
         | 
| 286 284 | 
             
                    @application
         | 
| 287 285 | 
             
                  end
         | 
| @@ -295,8 +293,8 @@ module Discorb | |
| 295 293 | 
             
                #
         | 
| 296 294 | 
             
                def fetch_nitro_sticker_packs
         | 
| 297 295 | 
             
                  Async do
         | 
| 298 | 
            -
                    _resp, data = http. | 
| 299 | 
            -
                    data.map { |pack| Sticker::Pack.new(self, pack) }
         | 
| 296 | 
            +
                    _resp, data = @http.request(Route.new("/sticker-packs", "//sticker-packs", :get)).wait
         | 
| 297 | 
            +
                    data[:sticker_packs].map { |pack| Sticker::Pack.new(self, pack) }
         | 
| 300 298 | 
             
                  end
         | 
| 301 299 | 
             
                end
         | 
| 302 300 |  | 
| @@ -305,18 +303,14 @@ module Discorb | |
| 305 303 | 
             
                #
         | 
| 306 304 | 
             
                # @param [Discorb::Activity] activity The activity to update.
         | 
| 307 305 | 
             
                # @param [:online, :idle, :dnd, :invisible] status The status to update.
         | 
| 308 | 
            -
                # @param [String] afk Whether to set the client as AFK.
         | 
| 309 306 | 
             
                #
         | 
| 310 | 
            -
                def update_presence(activity = nil, status: nil | 
| 307 | 
            +
                def update_presence(activity = nil, status: nil)
         | 
| 311 308 | 
             
                  payload = {
         | 
| 312 309 | 
             
                    activities: [],
         | 
| 313 310 | 
             
                    status: status,
         | 
| 314 | 
            -
                    afk: nil,
         | 
| 315 311 | 
             
                    since: nil,
         | 
| 316 312 | 
             
                  }
         | 
| 317 | 
            -
                   | 
| 318 | 
            -
                    payload[:activities] = [activity.to_hash]
         | 
| 319 | 
            -
                  end
         | 
| 313 | 
            +
                  payload[:activities] = [activity.to_hash] unless activity.nil?
         | 
| 320 314 | 
             
                  payload[:status] = status unless status.nil?
         | 
| 321 315 | 
             
                  if @connection
         | 
| 322 316 | 
             
                    Async do
         | 
| @@ -374,10 +368,11 @@ module Discorb | |
| 374 368 | 
             
                # @param [Object] ... The arguments to pass to the `ext#initialize`.
         | 
| 375 369 | 
             
                #
         | 
| 376 370 | 
             
                def load_extension(ext, ...)
         | 
| 377 | 
            -
                   | 
| 371 | 
            +
                  case ext
         | 
| 372 | 
            +
                  when Class
         | 
| 378 373 | 
             
                    raise ArgumentError, "#{ext} is not a extension" unless ext < Discorb::Extension
         | 
| 379 374 | 
             
                    ins = ext.new(self, ...)
         | 
| 380 | 
            -
                   | 
| 375 | 
            +
                  when Discorb::Extension
         | 
| 381 376 | 
             
                    ins = ext
         | 
| 382 377 | 
             
                  else
         | 
| 383 378 | 
             
                    raise ArgumentError, "#{ext} is not a extension"
         | 
| @@ -398,12 +393,20 @@ module Discorb | |
| 398 393 | 
             
                  ins.class.commands.each do |cmd|
         | 
| 399 394 | 
             
                    cmd.define_singleton_method(:extension) { ins.class.name }
         | 
| 400 395 | 
             
                    cmd.replace_block(ins)
         | 
| 396 | 
            +
                    cmd.block.define_singleton_method(:self_replaced) { true }
         | 
| 401 397 | 
             
                    @commands << cmd
         | 
| 402 398 | 
             
                  end
         | 
| 403 399 |  | 
| 404 400 | 
             
                  cls = ins.class
         | 
| 405 401 | 
             
                  cls.loaded(self, ...) if cls.respond_to? :loaded
         | 
| 406 | 
            -
                   | 
| 402 | 
            +
                  ins.class.bottom_commands.each do |cmd|
         | 
| 403 | 
            +
                    unless cmd.respond_to? :self_replaced
         | 
| 404 | 
            +
                      cmd.define_singleton_method(:extension) { ins.class.name }
         | 
| 405 | 
            +
                      cmd.replace_block(ins)
         | 
| 406 | 
            +
                      cmd.block.define_singleton_method(:self_replaced) { true }
         | 
| 407 | 
            +
                    end
         | 
| 408 | 
            +
                    @bottom_commands << cmd
         | 
| 409 | 
            +
                  end
         | 
| 407 410 | 
             
                  @extensions[ins.class.name] = ins
         | 
| 408 411 | 
             
                  ins
         | 
| 409 412 | 
             
                end
         | 
| @@ -463,7 +466,7 @@ module Discorb | |
| 463 466 | 
             
                          ::File.open(options[:log_file], "a")
         | 
| 464 467 | 
             
                        end
         | 
| 465 468 | 
             
                      @log.level = options[:log_level].to_sym
         | 
| 466 | 
            -
                      @log.colorize_log = options[:log_color] | 
| 469 | 
            +
                      @log.colorize_log = options[:log_color].nil? ? @log.out.isatty : options[:log_color]
         | 
| 467 470 | 
             
                    end
         | 
| 468 471 | 
             
                  end
         | 
| 469 472 | 
             
                end
         | 
| @@ -473,29 +476,29 @@ module Discorb | |
| 473 476 | 
             
                  if guilds = ENV["DISCORB_SETUP_GUILDS"]
         | 
| 474 477 | 
             
                    guild_ids = guilds.split(",")
         | 
| 475 478 | 
             
                  end
         | 
| 476 | 
            -
                  if guild_ids == ["global"]
         | 
| 477 | 
            -
                    guild_ids = false
         | 
| 478 | 
            -
                  end
         | 
| 479 | 
            +
                  guild_ids = false if guild_ids == ["global"]
         | 
| 479 480 | 
             
                  setup_commands(token, guild_ids: guild_ids).wait
         | 
| 480 | 
            -
                   | 
| 481 | 
            -
                    event | 
| 481 | 
            +
                  if ENV["DISCORB_SETUP_SCRIPT"] == "true"
         | 
| 482 | 
            +
                    @events[:setup]&.each do |event|
         | 
| 483 | 
            +
                      event.call
         | 
| 484 | 
            +
                    end
         | 
| 485 | 
            +
                    self.on_setup if respond_to? :on_setup
         | 
| 482 486 | 
             
                  end
         | 
| 483 | 
            -
                  self.on_setup if respond_to? :on_setup
         | 
| 484 487 | 
             
                end
         | 
| 485 488 |  | 
| 486 489 | 
             
                def start_client(token)
         | 
| 487 | 
            -
                  Async do | | 
| 488 | 
            -
                    Signal.trap(:SIGINT)  | 
| 490 | 
            +
                  Async do |_task|
         | 
| 491 | 
            +
                    Signal.trap(:SIGINT) do
         | 
| 489 492 | 
             
                      @log.info "SIGINT received, closing..."
         | 
| 490 493 | 
             
                      Signal.trap(:SIGINT, "DEFAULT")
         | 
| 491 494 | 
             
                      close!
         | 
| 492 | 
            -
                     | 
| 495 | 
            +
                    end
         | 
| 493 496 | 
             
                    @token = token.to_s
         | 
| 494 497 | 
             
                    @close_condition = Async::Condition.new
         | 
| 495 498 | 
             
                    @main_task = Async do
         | 
| 496 499 | 
             
                      @status = :running
         | 
| 497 500 | 
             
                      connect_gateway(false).wait
         | 
| 498 | 
            -
                    rescue
         | 
| 501 | 
            +
                    rescue StandardError
         | 
| 499 502 | 
             
                      @status = :stopped
         | 
| 500 503 | 
             
                      @close_condition.signal
         | 
| 501 504 | 
             
                      raise
         | 
    
        data/lib/discorb/common.rb
    CHANGED
    
    | @@ -2,11 +2,11 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            module Discorb
         | 
| 4 4 | 
             
              # @return [String] The API base URL.
         | 
| 5 | 
            -
              API_BASE_URL = "https://discord.com/api/ | 
| 5 | 
            +
              API_BASE_URL = "https://discord.com/api/v10"
         | 
| 6 6 | 
             
              # @return [String] The version of discorb.
         | 
| 7 | 
            -
              VERSION = "0. | 
| 7 | 
            +
              VERSION = "0.15.0"
         | 
| 8 8 | 
             
              # @return [String] The user agent for the bot.
         | 
| 9 | 
            -
              USER_AGENT = "DiscordBot (https://discorb-lib.github.io #{VERSION}) Ruby/#{RUBY_VERSION}"
         | 
| 9 | 
            +
              USER_AGENT = "DiscordBot (https://discorb-lib.github.io #{VERSION}) Ruby/#{RUBY_VERSION}".freeze
         | 
| 10 10 |  | 
| 11 11 | 
             
              #
         | 
| 12 12 | 
             
              # @abstract
         | 
| @@ -26,9 +26,6 @@ module Discorb | |
| 26 26 | 
             
                end
         | 
| 27 27 |  | 
| 28 28 | 
             
                # @private
         | 
| 29 | 
            -
                def inspect
         | 
| 30 | 
            -
                  super
         | 
| 31 | 
            -
                end
         | 
| 32 29 |  | 
| 33 30 | 
             
                def hash
         | 
| 34 31 | 
             
                  @id.hash
         | 
| @@ -111,32 +108,42 @@ module Discorb | |
| 111 108 | 
             
                end
         | 
| 112 109 |  | 
| 113 110 | 
             
                def inspect
         | 
| 114 | 
            -
                  "#<#{self.class} #{ | 
| 111 | 
            +
                  "#<#{self.class} #{self}>"
         | 
| 115 112 | 
             
                end
         | 
| 116 113 |  | 
| 117 114 | 
             
                alias id to_s
         | 
| 118 115 | 
             
              end
         | 
| 119 116 |  | 
| 120 | 
            -
              # | 
| 121 | 
            -
              # | 
| 122 | 
            -
               | 
| 123 | 
            -
               | 
| 124 | 
            -
             | 
| 125 | 
            -
             | 
| 117 | 
            +
              #
         | 
| 118 | 
            +
              # Represents an endpoint.
         | 
| 119 | 
            +
              # @private
         | 
| 120 | 
            +
              #
         | 
| 121 | 
            +
              class Route
         | 
| 122 | 
            +
                attr_reader :url, :key, :method
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                def initialize(url, key, method)
         | 
| 125 | 
            +
                  @url = url
         | 
| 126 | 
            +
                  @key = key
         | 
| 127 | 
            +
                  @method = method
         | 
| 126 128 | 
             
                end
         | 
| 127 129 |  | 
| 128 | 
            -
                def  | 
| 129 | 
            -
                   | 
| 130 | 
            +
                def hash
         | 
| 131 | 
            +
                  @url.hash
         | 
| 130 132 | 
             
                end
         | 
| 131 | 
            -
              end
         | 
| 132 133 |  | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 135 | 
            -
             | 
| 136 | 
            -
             | 
| 137 | 
            -
             | 
| 134 | 
            +
                def identifier
         | 
| 135 | 
            +
                  "#{@method} #{@key}"
         | 
| 136 | 
            +
                end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                def major_param
         | 
| 139 | 
            +
                  param_type = @key.split("/").find { |k| k.start_with?(":") }
         | 
| 140 | 
            +
                  return "" unless param_type
         | 
| 141 | 
            +
                  param = url.gsub(API_BASE_URL, "").split("/")[@key.split("/").index(param_type) - 1]
         | 
| 142 | 
            +
                  %w[:channel_id :guild_id :webhook_id].include?(param_type) ? param : ""
         | 
| 138 143 | 
             
                end
         | 
| 139 144 | 
             
              end
         | 
| 140 145 |  | 
| 141 | 
            -
               | 
| 146 | 
            +
              # @return [Object] Object that represents unspecified value.
         | 
| 147 | 
            +
              #   This is used as a default value for optional parameters.
         | 
| 148 | 
            +
              Unset = Object.new
         | 
| 142 149 | 
             
            end
         |