discordrb 3.5.0 → 3.6.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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.devcontainer/Dockerfile +13 -0
  3. data/.devcontainer/devcontainer.json +29 -0
  4. data/.devcontainer/postcreate.sh +4 -0
  5. data/.github/workflows/ci.yml +78 -0
  6. data/.github/workflows/codeql.yml +3 -3
  7. data/.github/workflows/deploy.yml +54 -0
  8. data/.github/workflows/release.yml +45 -0
  9. data/.rubocop.yml +52 -2
  10. data/CHANGELOG.md +95 -0
  11. data/README.md +5 -5
  12. data/discordrb-webhooks.gemspec +1 -1
  13. data/discordrb.gemspec +16 -11
  14. data/lib/discordrb/api/application.rb +84 -8
  15. data/lib/discordrb/api/channel.rb +51 -13
  16. data/lib/discordrb/api/interaction.rb +15 -6
  17. data/lib/discordrb/api/invite.rb +1 -1
  18. data/lib/discordrb/api/server.rb +96 -60
  19. data/lib/discordrb/api/user.rb +12 -2
  20. data/lib/discordrb/api/webhook.rb +20 -5
  21. data/lib/discordrb/api.rb +16 -20
  22. data/lib/discordrb/bot.rb +139 -53
  23. data/lib/discordrb/cache.rb +15 -1
  24. data/lib/discordrb/commands/command_bot.rb +7 -17
  25. data/lib/discordrb/commands/parser.rb +7 -7
  26. data/lib/discordrb/container.rb +46 -0
  27. data/lib/discordrb/data/activity.rb +1 -1
  28. data/lib/discordrb/data/application.rb +1 -0
  29. data/lib/discordrb/data/attachment.rb +23 -3
  30. data/lib/discordrb/data/avatar_decoration.rb +26 -0
  31. data/lib/discordrb/data/call.rb +22 -0
  32. data/lib/discordrb/data/channel.rb +140 -15
  33. data/lib/discordrb/data/collectibles.rb +45 -0
  34. data/lib/discordrb/data/embed.rb +10 -3
  35. data/lib/discordrb/data/emoji.rb +20 -1
  36. data/lib/discordrb/data/integration.rb +3 -0
  37. data/lib/discordrb/data/interaction.rb +164 -27
  38. data/lib/discordrb/data/member.rb +145 -28
  39. data/lib/discordrb/data/message.rb +198 -51
  40. data/lib/discordrb/data/overwrite.rb +2 -0
  41. data/lib/discordrb/data/primary_server.rb +60 -0
  42. data/lib/discordrb/data/profile.rb +2 -7
  43. data/lib/discordrb/data/reaction.rb +2 -1
  44. data/lib/discordrb/data/recipient.rb +1 -1
  45. data/lib/discordrb/data/role.rb +151 -22
  46. data/lib/discordrb/data/server.rb +115 -41
  47. data/lib/discordrb/data/server_preview.rb +68 -0
  48. data/lib/discordrb/data/snapshot.rb +110 -0
  49. data/lib/discordrb/data/user.rb +68 -8
  50. data/lib/discordrb/data/voice_region.rb +1 -0
  51. data/lib/discordrb/data/webhook.rb +2 -5
  52. data/lib/discordrb/data.rb +6 -0
  53. data/lib/discordrb/errors.rb +5 -2
  54. data/lib/discordrb/events/await.rb +1 -1
  55. data/lib/discordrb/events/channels.rb +37 -0
  56. data/lib/discordrb/events/generic.rb +2 -0
  57. data/lib/discordrb/events/guilds.rb +6 -1
  58. data/lib/discordrb/events/interactions.rb +135 -42
  59. data/lib/discordrb/events/invites.rb +2 -0
  60. data/lib/discordrb/events/members.rb +19 -2
  61. data/lib/discordrb/events/message.rb +39 -8
  62. data/lib/discordrb/events/presence.rb +2 -0
  63. data/lib/discordrb/events/raw.rb +1 -0
  64. data/lib/discordrb/events/reactions.rb +2 -0
  65. data/lib/discordrb/events/roles.rb +2 -0
  66. data/lib/discordrb/events/threads.rb +10 -6
  67. data/lib/discordrb/events/typing.rb +1 -0
  68. data/lib/discordrb/events/voice_server_update.rb +1 -0
  69. data/lib/discordrb/events/voice_state_update.rb +1 -0
  70. data/lib/discordrb/events/webhooks.rb +1 -0
  71. data/lib/discordrb/gateway.rb +29 -13
  72. data/lib/discordrb/paginator.rb +3 -3
  73. data/lib/discordrb/permissions.rb +54 -43
  74. data/lib/discordrb/version.rb +1 -1
  75. data/lib/discordrb/websocket.rb +0 -10
  76. data/lib/discordrb.rb +17 -1
  77. metadata +53 -25
  78. data/.circleci/config.yml +0 -152
@@ -90,14 +90,22 @@ module Discordrb
90
90
  # This class stores the data of an active gateway session. Note that this is different from a websocket connection -
91
91
  # there may be multiple sessions per connection or one session may persist over multiple connections.
92
92
  class Session
93
+ # @return [String] Used to uniquely identify this session. Mostly used when resuming connections.
93
94
  attr_reader :session_id
95
+
96
+ # @return [Integer] Incrementing integer used to determine the most recent event reccived from Discord.
94
97
  attr_accessor :sequence
95
98
 
96
- def initialize(session_id)
99
+ # @return [String] Gateway URL used to reconnect to the gateway node that Discord wants this session to use.
100
+ attr_reader :resume_gateway_url
101
+
102
+ # @!visibility private
103
+ def initialize(session_id, resume_gateway_url)
97
104
  @session_id = session_id
98
105
  @sequence = 0
99
106
  @suspended = false
100
107
  @invalid = false
108
+ @resume_gateway_url = resume_gateway_url
101
109
  end
102
110
 
103
111
  # Flags this session as suspended, so we know not to try and send heartbeats, etc. to the gateway until we've reconnected
@@ -117,6 +125,7 @@ module Discordrb
117
125
  # Flags this session as being invalid
118
126
  def invalidate
119
127
  @invalid = true
128
+ @resume_gateway_url = nil
120
129
  end
121
130
 
122
131
  def invalid?
@@ -136,6 +145,13 @@ module Discordrb
136
145
  # The version of the gateway that's supposed to be used.
137
146
  GATEWAY_VERSION = 9
138
147
 
148
+ # Close codes that are unrecoverable, after which we should not try to reconnect.
149
+ # - 4003: Not authenticated. How did this happen?
150
+ # - 4004: Authentication failed. Token was wrong, nothing we can do.
151
+ # - 4011: Sharding required. Currently requires developer intervention.
152
+ # - 4014: Use of disabled privileged intents.
153
+ FATAL_CLOSE_CODES = [4003, 4004, 4011, 4014].freeze
154
+
139
155
  # Heartbeat ACKs are Discord's way of verifying on the client side whether the connection is still alive. If this is
140
156
  # set to true (default value) the gateway client will use that functionality to detect zombie connections and
141
157
  # reconnect in such a case; however it may lead to instability if there's some problem with the ACKs. If this occurs
@@ -452,8 +468,13 @@ module Discordrb
452
468
  # suspended (e.g. after op7)
453
469
  if (@session && !@session.suspended?) || !@session
454
470
  sleep @heartbeat_interval
455
- @bot.raise_heartbeat_event
456
- heartbeat
471
+ # Check if we're connected here, since we could possibly be waiting for a reconnect to occur.
472
+ if @handshaked && !@closed
473
+ @bot.raise_heartbeat_event
474
+ heartbeat
475
+ else
476
+ LOGGER.debug('Tried to send a heartbeat without being connected! Ignoring, we should be fine.')
477
+ end
457
478
  else
458
479
  sleep 1
459
480
  end
@@ -538,7 +559,7 @@ module Discordrb
538
559
  end
539
560
 
540
561
  def process_gateway
541
- raw_url = find_gateway
562
+ raw_url = @session&.resume_gateway_url || find_gateway
542
563
 
543
564
  # Append a slash in case it's not there (I'm not sure how well WSCS handles it otherwise)
544
565
  raw_url += '/' unless raw_url.end_with? '/'
@@ -656,7 +677,9 @@ module Discordrb
656
677
  LOGGER.log_exception(e)
657
678
  end
658
679
 
680
+ # rubocop:disable Lint/UselessConstantScoping
659
681
  ZLIB_SUFFIX = "\x00\x00\xFF\xFF".b.freeze
682
+ # rubocop:enable Lint/UselessConstantScoping
660
683
 
661
684
  def handle_message(msg)
662
685
  case @compress_mode
@@ -716,9 +739,9 @@ module Discordrb
716
739
  when :READY
717
740
  LOGGER.info("Discord using gateway protocol version: #{data['v']}, requested: #{GATEWAY_VERSION}")
718
741
 
719
- @session = Session.new(data['session_id'])
742
+ @session = Session.new(data['session_id'], data['resume_gateway_url'])
720
743
  @session.sequence = 0
721
- @bot.__send__(:notify_ready) if @intents && (@intents & INTENTS[:servers]).zero?
744
+ @bot.__send__(:notify_ready) if @intents && @intents.nobits?(INTENTS[:servers])
722
745
  when :RESUMED
723
746
  # The RESUMED event is received after a successful op 6 (resume). It does nothing except tell the bot the
724
747
  # connection is initiated (like READY would). Starting with v5, it doesn't set a new heartbeat interval anymore
@@ -789,13 +812,6 @@ module Discordrb
789
812
  handle_close(e)
790
813
  end
791
814
 
792
- # Close codes that are unrecoverable, after which we should not try to reconnect.
793
- # - 4003: Not authenticated. How did this happen?
794
- # - 4004: Authentication failed. Token was wrong, nothing we can do.
795
- # - 4011: Sharding required. Currently requires developer intervention.
796
- # - 4014: Use of disabled privileged intents.
797
- FATAL_CLOSE_CODES = [4003, 4004, 4011, 4014].freeze
798
-
799
815
  def handle_close(e)
800
816
  @bot.__send__(:raise_event, Events::DisconnectEvent.new(@bot))
801
817
 
@@ -24,7 +24,7 @@ module Discordrb
24
24
  # no more results or the configured `limit` is reached.
25
25
  def each
26
26
  last_page = nil
27
- until limit_check
27
+ until limit_exceeded?
28
28
  page = @block.call(last_page)
29
29
  return if page.empty?
30
30
 
@@ -38,7 +38,7 @@ module Discordrb
38
38
  enumerator.each do |item|
39
39
  yield item
40
40
  @count += 1
41
- break if limit_check
41
+ break if limit_exceeded?
42
42
  end
43
43
 
44
44
  last_page = page
@@ -48,7 +48,7 @@ module Discordrb
48
48
  private
49
49
 
50
50
  # Whether the paginator limit has been exceeded
51
- def limit_check
51
+ def limit_exceeded?
52
52
  return false if @limit.nil?
53
53
 
54
54
  @count >= @limit
@@ -6,47 +6,56 @@ module Discordrb
6
6
  # This hash maps bit positions to logical permissions.
7
7
  FLAGS = {
8
8
  # Bit => Permission # Value
9
- 0 => :create_instant_invite, # 1
10
- 1 => :kick_members, # 2
11
- 2 => :ban_members, # 4
12
- 3 => :administrator, # 8
13
- 4 => :manage_channels, # 16
14
- 5 => :manage_server, # 32
15
- 6 => :add_reactions, # 64
16
- 7 => :view_audit_log, # 128
17
- 8 => :priority_speaker, # 256
18
- 9 => :stream, # 512
19
- 10 => :read_messages, # 1024
20
- 11 => :send_messages, # 2048
21
- 12 => :send_tts_messages, # 4096
22
- 13 => :manage_messages, # 8192
23
- 14 => :embed_links, # 16384
24
- 15 => :attach_files, # 32768
25
- 16 => :read_message_history, # 65536
26
- 17 => :mention_everyone, # 131072
27
- 18 => :use_external_emoji, # 262144
28
- 19 => :view_server_insights, # 524288
29
- 20 => :connect, # 1048576
30
- 21 => :speak, # 2097152
31
- 22 => :mute_members, # 4194304
32
- 23 => :deafen_members, # 8388608
33
- 24 => :move_members, # 16777216
34
- 25 => :use_voice_activity, # 33554432
35
- 26 => :change_nickname, # 67108864
36
- 27 => :manage_nicknames, # 134217728
37
- 28 => :manage_roles, # 268435456, also Manage Permissions
38
- 29 => :manage_webhooks, # 536870912
39
- 30 => :manage_emojis, # 1073741824, also Manage Stickers
40
- 31 => :use_slash_commands, # 2147483648
41
- 32 => :request_to_speak, # 4294967296
42
- 33 => :manage_events, # 8589934592
43
- 34 => :manage_threads, # 17179869184
44
- 35 => :use_public_threads, # 34359738368
45
- 36 => :use_private_threads, # 68719476736
46
- 37 => :use_external_stickers, # 137438953472
47
- 38 => :send_messages_in_threads, # 274877906944
48
- 39 => :use_embedded_activities, # 549755813888
49
- 40 => :moderate_members # 1099511627776
9
+ 0 => :create_instant_invite, # 1
10
+ 1 => :kick_members, # 2
11
+ 2 => :ban_members, # 4
12
+ 3 => :administrator, # 8
13
+ 4 => :manage_channels, # 16
14
+ 5 => :manage_server, # 32
15
+ 6 => :add_reactions, # 64
16
+ 7 => :view_audit_log, # 128
17
+ 8 => :priority_speaker, # 256
18
+ 9 => :stream, # 512
19
+ 10 => :read_messages, # 1024
20
+ 11 => :send_messages, # 2048
21
+ 12 => :send_tts_messages, # 4096
22
+ 13 => :manage_messages, # 8192
23
+ 14 => :embed_links, # 16384
24
+ 15 => :attach_files, # 32768
25
+ 16 => :read_message_history, # 65536
26
+ 17 => :mention_everyone, # 131072
27
+ 18 => :use_external_emoji, # 262144
28
+ 19 => :view_server_insights, # 524288
29
+ 20 => :connect, # 1048576
30
+ 21 => :speak, # 2097152
31
+ 22 => :mute_members, # 4194304
32
+ 23 => :deafen_members, # 8388608
33
+ 24 => :move_members, # 16777216
34
+ 25 => :use_voice_activity, # 33554432
35
+ 26 => :change_nickname, # 67108864
36
+ 27 => :manage_nicknames, # 134217728
37
+ 28 => :manage_roles, # 268435456, also Manage Permissions
38
+ 29 => :manage_webhooks, # 536870912
39
+ 30 => :manage_emojis, # 1073741824, also Manage Stickers
40
+ 31 => :use_slash_commands, # 2147483648
41
+ 32 => :request_to_speak, # 4294967296
42
+ 33 => :manage_events, # 8589934592
43
+ 34 => :manage_threads, # 17179869184
44
+ 35 => :use_public_threads, # 34359738368
45
+ 36 => :use_private_threads, # 68719476736
46
+ 37 => :use_external_stickers, # 137438953472
47
+ 38 => :send_messages_in_threads, # 274877906944
48
+ 39 => :use_embedded_activities, # 549755813888
49
+ 40 => :moderate_members, # 1099511627776
50
+ 41 => :view_monetization_analytics, # 2199023255552
51
+ 42 => :use_soundboard, # 4398046511104
52
+ 43 => :create_server_expressions, # 8796093022208
53
+ 44 => :create_scheduled_events, # 17592186044416
54
+ 45 => :use_external_sounds, # 35184372088832
55
+ 46 => :send_voice_messages, # 70368744177664
56
+ 49 => :send_polls, # 562949953421312
57
+ 50 => :use_external_apps, # 1125899906842624
58
+ 51 => :pin_messages # 2251799813685248
50
59
  }.freeze
51
60
 
52
61
  FLAGS.each do |position, flag|
@@ -80,7 +89,7 @@ module Discordrb
80
89
  # Initialize the instance variables based on the bitset.
81
90
  def init_vars
82
91
  FLAGS.each do |position, flag|
83
- flag_set = ((@bits >> position) & 0x1) == 1
92
+ flag_set = (@bits >> position).allbits?(0x1)
84
93
  instance_variable_set "@#{flag}", flag_set
85
94
  end
86
95
  end
@@ -131,12 +140,14 @@ module Discordrb
131
140
  # permissions.defined_permissions #=> [:create_instant_invite, :administrator]
132
141
  # @return [Array<Symbol>] the permissions
133
142
  def defined_permissions
134
- FLAGS.filter_map { |value, name| (@bits & (1 << value)).positive? ? name : nil }
143
+ FLAGS.filter_map { |value, name| @bits.anybits?((1 << value)) ? name : nil }
135
144
  end
136
145
 
137
146
  # Comparison based on permission bits
138
147
  def ==(other)
148
+ # rubocop:disable Lint/Void
139
149
  false unless other.is_a? Discordrb::Permissions
150
+ # rubocop:enable Lint/Void
140
151
  bits == other.bits
141
152
  end
142
153
  end
@@ -3,5 +3,5 @@
3
3
  # Discordrb and all its functionality, in this case only the version.
4
4
  module Discordrb
5
5
  # The current version of discordrb.
6
- VERSION = '3.5.0'
6
+ VERSION = '3.6.0'
7
7
  end
@@ -2,16 +2,6 @@
2
2
 
3
3
  require 'websocket-client-simple'
4
4
 
5
- # The WSCS module which we're hooking
6
- # @see Websocket::Client::Simple::Client
7
- module WebSocket::Client::Simple
8
- # Patch to the WSCS class to allow reading the internal thread
9
- class Client
10
- # @return [Thread] the internal thread this client is using for the event loop.
11
- attr_reader :thread
12
- end
13
- end
14
-
15
5
  module Discordrb
16
6
  # Utility wrapper class that abstracts an instance of WSCS. Useful should we decide that WSCS isn't good either -
17
7
  # in that case we can just switch to something else
data/lib/discordrb.rb CHANGED
@@ -46,10 +46,13 @@ module Discordrb
46
46
  NO_INTENTS = 0
47
47
 
48
48
  # Compares two objects based on IDs - either the objects' IDs are equal, or one object is equal to the other's ID.
49
- def self.id_compare(one_id, other)
49
+ def self.id_compare?(one_id, other)
50
50
  other.respond_to?(:resolve_id) ? (one_id.resolve_id == other.resolve_id) : (one_id == other)
51
51
  end
52
52
 
53
+ # @deprecated Please use {Discordrb.id_compare?}
54
+ singleton_class.alias_method :id_compare, :id_compare?
55
+
53
56
  # The maximum length a Discord message can have
54
57
  CHARACTER_LIMIT = 2000
55
58
 
@@ -117,6 +120,19 @@ module Discordrb
117
120
  "<t:#{time.to_i}:#{TIMESTAMP_STYLES[style] || style}>"
118
121
  end
119
122
  end
123
+
124
+ # A utility method to base64 encode a file like object using its mime type.
125
+ # @param file [File, #read] A file like object that responds to #read.
126
+ # @return [String] The file object encoded as base64 image data.
127
+ def self.encode64(file)
128
+ path_method = %i[original_filename path local_path].find { |method| file.respond_to?(method) }
129
+
130
+ raise ArgumentError, 'File object must respond to original_filename, path, or local path.' unless path_method
131
+ raise ArgumentError, 'File object must respond to read.' unless file.respond_to?(:read)
132
+
133
+ mime_type = MIME::Types.type_for(file.__send__(path_method)).first&.to_s || 'image/jpeg'
134
+ "data:#{mime_type};base64,#{Base64.encode64(file.read).strip}"
135
+ end
120
136
  end
121
137
 
122
138
  # In discordrb, Integer and {String} are monkey-patched to allow for easy resolution of IDs
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: discordrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.0
4
+ version: 3.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - meew0
@@ -9,8 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2023-07-05 00:00:00.000000000 Z
12
+ date: 2025-10-22 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: base64
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 0.2.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 0.2.0
14
28
  - !ruby/object:Gem::Dependency
15
29
  name: ffi
16
30
  requirement: !ruby/object:Gem::Requirement
@@ -59,28 +73,28 @@ dependencies:
59
73
  requirements:
60
74
  - - ">="
61
75
  - !ruby/object:Gem::Version
62
- version: 0.3.0
76
+ version: 0.9.0
63
77
  type: :runtime
64
78
  prerelease: false
65
79
  version_requirements: !ruby/object:Gem::Requirement
66
80
  requirements:
67
81
  - - ">="
68
82
  - !ruby/object:Gem::Version
69
- version: 0.3.0
83
+ version: 0.9.0
70
84
  - !ruby/object:Gem::Dependency
71
85
  name: discordrb-webhooks
72
86
  requirement: !ruby/object:Gem::Requirement
73
87
  requirements:
74
88
  - - "~>"
75
89
  - !ruby/object:Gem::Version
76
- version: 3.5.0
90
+ version: 3.6.0
77
91
  type: :runtime
78
92
  prerelease: false
79
93
  version_requirements: !ruby/object:Gem::Requirement
80
94
  requirements:
81
95
  - - "~>"
82
96
  - !ruby/object:Gem::Version
83
- version: 3.5.0
97
+ version: 3.6.0
84
98
  - !ruby/object:Gem::Dependency
85
99
  name: bundler
86
100
  requirement: !ruby/object:Gem::Requirement
@@ -121,42 +135,42 @@ dependencies:
121
135
  requirements:
122
136
  - - "~>"
123
137
  - !ruby/object:Gem::Version
124
- version: 3.5.0
138
+ version: '3.5'
125
139
  type: :development
126
140
  prerelease: false
127
141
  version_requirements: !ruby/object:Gem::Requirement
128
142
  requirements:
129
143
  - - "~>"
130
144
  - !ruby/object:Gem::Version
131
- version: 3.5.0
145
+ version: '3.5'
132
146
  - !ruby/object:Gem::Dependency
133
147
  name: rspec
134
148
  requirement: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - "~>"
137
151
  - !ruby/object:Gem::Version
138
- version: 3.11.0
152
+ version: '3.0'
139
153
  type: :development
140
154
  prerelease: false
141
155
  version_requirements: !ruby/object:Gem::Requirement
142
156
  requirements:
143
157
  - - "~>"
144
158
  - !ruby/object:Gem::Version
145
- version: 3.11.0
159
+ version: '3.0'
146
160
  - !ruby/object:Gem::Dependency
147
161
  name: rspec_junit_formatter
148
162
  requirement: !ruby/object:Gem::Requirement
149
163
  requirements:
150
164
  - - "~>"
151
165
  - !ruby/object:Gem::Version
152
- version: 0.5.1
166
+ version: 0.6.0
153
167
  type: :development
154
168
  prerelease: false
155
169
  version_requirements: !ruby/object:Gem::Requirement
156
170
  requirements:
157
171
  - - "~>"
158
172
  - !ruby/object:Gem::Version
159
- version: 0.5.1
173
+ version: 0.6.0
160
174
  - !ruby/object:Gem::Dependency
161
175
  name: rspec-prof
162
176
  requirement: !ruby/object:Gem::Requirement
@@ -177,70 +191,70 @@ dependencies:
177
191
  requirements:
178
192
  - - "~>"
179
193
  - !ruby/object:Gem::Version
180
- version: 1.36.0
194
+ version: 1.77.0
181
195
  type: :development
182
196
  prerelease: false
183
197
  version_requirements: !ruby/object:Gem::Requirement
184
198
  requirements:
185
199
  - - "~>"
186
200
  - !ruby/object:Gem::Version
187
- version: 1.36.0
201
+ version: 1.77.0
188
202
  - !ruby/object:Gem::Dependency
189
203
  name: rubocop-performance
190
204
  requirement: !ruby/object:Gem::Requirement
191
205
  requirements:
192
206
  - - "~>"
193
207
  - !ruby/object:Gem::Version
194
- version: '1.0'
208
+ version: 1.25.0
195
209
  type: :development
196
210
  prerelease: false
197
211
  version_requirements: !ruby/object:Gem::Requirement
198
212
  requirements:
199
213
  - - "~>"
200
214
  - !ruby/object:Gem::Version
201
- version: '1.0'
215
+ version: 1.25.0
202
216
  - !ruby/object:Gem::Dependency
203
217
  name: rubocop-rake
204
218
  requirement: !ruby/object:Gem::Requirement
205
219
  requirements:
206
220
  - - "~>"
207
221
  - !ruby/object:Gem::Version
208
- version: 0.6.0
222
+ version: 0.7.0
209
223
  type: :development
210
224
  prerelease: false
211
225
  version_requirements: !ruby/object:Gem::Requirement
212
226
  requirements:
213
227
  - - "~>"
214
228
  - !ruby/object:Gem::Version
215
- version: 0.6.0
229
+ version: 0.7.0
216
230
  - !ruby/object:Gem::Dependency
217
231
  name: simplecov
218
232
  requirement: !ruby/object:Gem::Requirement
219
233
  requirements:
220
234
  - - "~>"
221
235
  - !ruby/object:Gem::Version
222
- version: 0.21.0
236
+ version: '0.21'
223
237
  type: :development
224
238
  prerelease: false
225
239
  version_requirements: !ruby/object:Gem::Requirement
226
240
  requirements:
227
241
  - - "~>"
228
242
  - !ruby/object:Gem::Version
229
- version: 0.21.0
243
+ version: '0.21'
230
244
  - !ruby/object:Gem::Dependency
231
245
  name: yard
232
246
  requirement: !ruby/object:Gem::Requirement
233
247
  requirements:
234
248
  - - "~>"
235
249
  - !ruby/object:Gem::Version
236
- version: 0.9.9
250
+ version: 0.9.37
237
251
  type: :development
238
252
  prerelease: false
239
253
  version_requirements: !ruby/object:Gem::Requirement
240
254
  requirements:
241
255
  - - "~>"
242
256
  - !ruby/object:Gem::Version
243
- version: 0.9.9
257
+ version: 0.9.37
244
258
  description: A Ruby implementation of the Discord (https://discord.com) API.
245
259
  email:
246
260
  - ''
@@ -248,12 +262,17 @@ executables: []
248
262
  extensions: []
249
263
  extra_rdoc_files: []
250
264
  files:
251
- - ".circleci/config.yml"
265
+ - ".devcontainer/Dockerfile"
266
+ - ".devcontainer/devcontainer.json"
267
+ - ".devcontainer/postcreate.sh"
252
268
  - ".github/CONTRIBUTING.md"
253
269
  - ".github/ISSUE_TEMPLATE/bug_report.md"
254
270
  - ".github/ISSUE_TEMPLATE/feature_request.md"
255
271
  - ".github/pull_request_template.md"
272
+ - ".github/workflows/ci.yml"
256
273
  - ".github/workflows/codeql.yml"
274
+ - ".github/workflows/deploy.yml"
275
+ - ".github/workflows/release.yml"
257
276
  - ".gitignore"
258
277
  - ".markdownlint.json"
259
278
  - ".overcommit.yml"
@@ -294,7 +313,10 @@ files:
294
313
  - lib/discordrb/data/application.rb
295
314
  - lib/discordrb/data/attachment.rb
296
315
  - lib/discordrb/data/audit_logs.rb
316
+ - lib/discordrb/data/avatar_decoration.rb
317
+ - lib/discordrb/data/call.rb
297
318
  - lib/discordrb/data/channel.rb
319
+ - lib/discordrb/data/collectibles.rb
298
320
  - lib/discordrb/data/component.rb
299
321
  - lib/discordrb/data/embed.rb
300
322
  - lib/discordrb/data/emoji.rb
@@ -304,11 +326,14 @@ files:
304
326
  - lib/discordrb/data/member.rb
305
327
  - lib/discordrb/data/message.rb
306
328
  - lib/discordrb/data/overwrite.rb
329
+ - lib/discordrb/data/primary_server.rb
307
330
  - lib/discordrb/data/profile.rb
308
331
  - lib/discordrb/data/reaction.rb
309
332
  - lib/discordrb/data/recipient.rb
310
333
  - lib/discordrb/data/role.rb
311
334
  - lib/discordrb/data/server.rb
335
+ - lib/discordrb/data/server_preview.rb
336
+ - lib/discordrb/data/snapshot.rb
312
337
  - lib/discordrb/data/user.rb
313
338
  - lib/discordrb/data/voice_region.rb
314
339
  - lib/discordrb/data/voice_state.rb
@@ -353,7 +378,10 @@ homepage: https://github.com/shardlab/discordrb
353
378
  licenses:
354
379
  - MIT
355
380
  metadata:
381
+ bug_tracker_uri: https://github.com/shardlab/discordrb/issues
356
382
  changelog_uri: https://github.com/shardlab/discordrb/blob/main/CHANGELOG.md
383
+ documentation_uri: https://github.com/shardlab/discordrb/wiki
384
+ source_code_uri: https://github.com/shardlab/discordrb
357
385
  rubygems_mfa_required: 'true'
358
386
  post_install_message:
359
387
  rdoc_options: []
@@ -363,14 +391,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
363
391
  requirements:
364
392
  - - ">="
365
393
  - !ruby/object:Gem::Version
366
- version: '2.7'
394
+ version: '3.2'
367
395
  required_rubygems_version: !ruby/object:Gem::Requirement
368
396
  requirements:
369
397
  - - ">="
370
398
  - !ruby/object:Gem::Version
371
399
  version: '0'
372
400
  requirements: []
373
- rubygems_version: 3.3.3
401
+ rubygems_version: 3.5.3
374
402
  signing_key:
375
403
  specification_version: 4
376
404
  summary: Discord API for Ruby