discorb 0.12.1 → 0.13.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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +26 -0
  3. data/discorb.gemspec +1 -1
  4. data/docs/application_command.md +11 -8
  5. data/docs/cli/run.md +2 -1
  6. data/docs/events.md +53 -1
  7. data/lib/discorb/app_command.rb +5 -0
  8. data/lib/discorb/application.rb +31 -1
  9. data/lib/discorb/audit_logs.rb +28 -16
  10. data/lib/discorb/channel.rb +12 -5
  11. data/lib/discorb/client.rb +4 -4
  12. data/lib/discorb/common.rb +26 -1
  13. data/lib/discorb/components.rb +12 -0
  14. data/lib/discorb/dictionary.rb +1 -1
  15. data/lib/discorb/embed.rb +4 -0
  16. data/lib/discorb/emoji.rb +4 -0
  17. data/lib/discorb/emoji_table.rb +3891 -3806
  18. data/lib/discorb/event.rb +265 -24
  19. data/lib/discorb/event_handler.rb +39 -0
  20. data/lib/discorb/exe/run.rb +16 -1
  21. data/lib/discorb/extension.rb +4 -4
  22. data/lib/discorb/file.rb +4 -0
  23. data/lib/discorb/flag.rb +4 -0
  24. data/lib/discorb/gateway.rb +56 -1
  25. data/lib/discorb/gateway_requests.rb +4 -0
  26. data/lib/discorb/guild.rb +113 -0
  27. data/lib/discorb/http.rb +11 -4
  28. data/lib/discorb/image.rb +7 -5
  29. data/lib/discorb/integration.rb +1 -1
  30. data/lib/discorb/intents.rb +8 -3
  31. data/lib/discorb/interaction/autocomplete.rb +1 -1
  32. data/lib/discorb/interaction/command.rb +2 -2
  33. data/lib/discorb/log.rb +4 -0
  34. data/lib/discorb/member.rb +1 -1
  35. data/lib/discorb/message.rb +29 -23
  36. data/lib/discorb/permission.rb +4 -0
  37. data/lib/discorb/rate_limit.rb +6 -2
  38. data/lib/discorb/sticker.rb +9 -0
  39. data/lib/discorb/user.rb +1 -0
  40. data/lib/discorb.rb +1 -1
  41. data/po/yard.pot +4 -4
  42. data/sig/discorb.rbs +7 -7
  43. data/template-replace/scripts/yard_replace.rb +6 -0
  44. metadata +4 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2f43c7785e34661458d9837fd1e75877b8d343f8c920021624d92d0fb87c5ee3
4
- data.tar.gz: f5b1ed37f600c0b2945d737a154c9d07155d38dad1b8c3da58fc209fa2db99a9
3
+ metadata.gz: 54c0aa4482415e2d38abe5adf4765ec71681d7f0874a5208b868797c4ebc4626
4
+ data.tar.gz: 6d15fbcc255d6fddb22e4d8b73f6a7fee40b3690a2f79b4356adcec029d1e90c
5
5
  SHA512:
6
- metadata.gz: 42f7ffe2b1a851123d883f98223b7c8a755d40faff16a29c1eeecc58e3e023817c5a865bd2aaab52001a8311458a656e034de1f3349ed7778b033afd49840634
7
- data.tar.gz: 3a6789362788a6c16e38ead2f6d463162f6e852da84df703ef90e32e27477fafb3ce611c931c9f1d9516275f21fb7229e4cec51b0110720b870a2d30f474120d
6
+ metadata.gz: d866205f326de7437f2f8464e0e69fa14c024cd2427507b428507249352902c84003d741265e1b40b86e545435362fd001d949ebe2d9828216bcb5440f93eee3
7
+ data.tar.gz: 1b2797ea34e32198aa660486771db933ea6893b9542e30a813ce14c2d4b49299ef24c4ecc7ea052dbd7260c5eabe728b120026f543aca49ecc0f2040450741bc
data/Changelog.md CHANGED
@@ -2,8 +2,34 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ## v0.13
6
+
7
+ ### v0.13.0
8
+
9
+ - Change!: Event is now EventHandler.
10
+ - Add: Support for scheduled events.
11
+ - Fix: Fix bug in sticker initialization.
12
+ - Add: Support application flags
13
+ - Add: Add `#inspect` method to many classes.
14
+
5
15
  ## v0.12
6
16
 
17
+ ### v0.12.4
18
+
19
+ - Update: Update emoji table
20
+ - Add: Support min_value and max_value for numeric options in slash command
21
+ - Fix: Fix sending images
22
+
23
+ ### v0.12.3
24
+
25
+ - Fix: Fix NoMethodError in command interaction
26
+ - Fix: Fix NoMethodError in Integration#initialize
27
+
28
+ ### v0.12.2
29
+
30
+ - Fix: Fix `Message#type`
31
+ - Change: `discorb run` will lookup for `main.rb` in parent directories
32
+
7
33
  ### v0.12.1
8
34
 
9
35
  - Fix: Fix some texts
data/discorb.gemspec CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ["sevenc-nanashi"]
9
9
  spec.email = ["sevenc-nanashi@sevenbot.jp"]
10
10
 
11
- spec.summary = "discorb is a Discord API wrapper for Ruby."
11
+ spec.summary = "A discord API wrapper written in Ruby"
12
12
  spec.homepage = "https://github.com/discorb-lib/discorb"
13
13
  spec.license = "MIT"
14
14
  spec.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
@@ -49,6 +49,8 @@ client.run(ENV["DISCORD_BOT_TOKEN"])
49
49
  | `guild_ids` | The ID of the guild to register the command in. |
50
50
  | `block` | A block that will be called when the command is invoked. |
51
51
 
52
+ Block will be called with a {Discorb::ApplicationCommand::Interaction} object and specified options.
53
+
52
54
  In `options`, hash should be like this:
53
55
 
54
56
  ```ruby
@@ -70,6 +72,7 @@ In `options`, hash should be like this:
70
72
  | `:default` | `Object` | Default value of the option. |
71
73
  | `:channel_types` | `Array<Class<Discorb::Channel>>` | Type of the channel option. |
72
74
  | `:autocomplete` | `Proc` | Autocomplete function. |
75
+ | `:range` | `Range` | Range of the option. Only valid for numeric options. (`:int`, `:float`) |
73
76
 
74
77
  `choices` should be unspecified if you don't want to use it.
75
78
  `choices` is hash like this:
@@ -120,16 +123,16 @@ group.slash("message_expand", "Whether bot should expand message.", {
120
123
  type: :boolean,
121
124
  description: "Whether bot should expand message."
122
125
  }
123
- }) do |interaction|
126
+ }) do |interaction, enabled|
124
127
  # ...
125
128
  end
126
129
 
127
- group.slash("bump_alert", "Whether bot should notify DISBOARD bump.", {
130
+ group.slash("level", "Whether level system is enabled.", {
128
131
  "enabled" => {
129
132
  type: :boolean,
130
- description: "Whether bot should notify DISBOARD bump."
133
+ description: "Whether level system is enabled."
131
134
  }
132
- }) do |interaction|
135
+ }) do |interaction, enabled|
133
136
  # ...
134
137
  end
135
138
 
@@ -145,15 +148,15 @@ client.slash_group("settings", "Set settings of bot.") do |group|
145
148
  type: :boolean,
146
149
  description: "Whether bot should expand message."
147
150
  }
148
- }) do |interaction|
151
+ }) do |interaction, enabled|
149
152
  # ...
150
153
  end
151
- group.slash("bump_alert", "Whether bot should notify DISBOARD bump.", {
154
+ group.slash("bump_alert", "Whether level system is enabled.", {
152
155
  "enabled" => {
153
156
  type: :boolean,
154
- description: "Whether bot should notify DISBOARD bump."
157
+ description: "Whether level system is enabled."
155
158
  }
156
- }) do |interaction|
159
+ }) do |interaction, enabled|
157
160
  # ...
158
161
  end
159
162
  end
data/docs/cli/run.md CHANGED
@@ -16,6 +16,7 @@ discorb run [options] [script]
16
16
  #### `script`
17
17
 
18
18
  The script to run. Defaults to `main.rb`.
19
+ If the script wasn't specified, it will also look for a file named `main.rb` in the parent directories, like rake.
19
20
 
20
21
  ### Options
21
22
 
@@ -57,4 +58,4 @@ The name of the environment variable to use for token, or just `-t` or `--token`
57
58
 
58
59
  #### `-b`, `--bundler`
59
60
 
60
- Whether to use bundler to load the script.
61
+ Whether to use bundler to load the script.
data/docs/events.md CHANGED
@@ -503,7 +503,50 @@ Fires when a select menu is selected.
503
503
 
504
504
  ### Voice events
505
505
 
506
- It's too big, so they're documented in {file:docs/voice_events.md}
506
+ Because it's big, it's documented in {file:docs/voice_events.md}.
507
+
508
+ ### Guild scheduled event events
509
+
510
+ #### `scheduled_event_create(event)`
511
+
512
+ Fires when a scheduled event is created.
513
+
514
+ | Parameter | Type | Description |
515
+ | ---------- | ----- | ----------- |
516
+ | `event` | {Discorb::ScheduledEvent}| The created scheduled event. |
517
+
518
+ #### `scheduled_event_cancel(event)`, `scheduled_event_delete(event)`
519
+
520
+ Fires when a scheduled event is canceled or deleted.
521
+
522
+ | Parameter | Type | Description |
523
+ | ---------- | ----- | ----------- |
524
+ | `event` | {Discorb::ScheduledEvent}| The deleted scheduled event. |
525
+
526
+ #### `scheduled_event_edit(before, after)`
527
+
528
+ Fires when a scheduled event is edited.
529
+
530
+ | Parameter | Type | Description |
531
+ | ---------- | ----- | ----------- |
532
+ | `before` | {Discorb::ScheduledEvent}| The scheduled event before the edit. |
533
+ | `after` | {Discorb::ScheduledEvent}| The scheduled event after the edit. |
534
+
535
+ #### `scheduled_event_start(event)`
536
+
537
+ Fires when a scheduled event is started.
538
+
539
+ | Parameter | Type | Description |
540
+ | ---------- | ----- | ----------- |
541
+ | `event` | {Discorb::ScheduledEvent}| The scheduled event that started. |
542
+
543
+ #### `scheduled_event_end(event)`
544
+
545
+ Fires when a scheduled event is ended.
546
+
547
+ | Parameter | Type | Description |
548
+ | ---------- | ----- | ----------- |
549
+ | `event` | {Discorb::ScheduledEvent}| The scheduled event that ended. |
507
550
 
508
551
  ### Low-level events
509
552
 
@@ -530,3 +573,12 @@ Fires when `THREAD_CREATE` is received.
530
573
  | Parameter | Type | Description |
531
574
  | ---------- | ----- | ----------- |
532
575
  |`thread` | {Discorb::ThreadChannel}| The thread of the event. |
576
+
577
+ #### `scheduled_event_update(before, after)`
578
+
579
+ Fires when `SCHEDULED_EVENT_UPDATE` is received.
580
+
581
+ | Parameter | Type | Description |
582
+ | ---------- | ----- | ----------- |
583
+ | `before` | {Discorb::ScheduledEvent}| The scheduled event before the update. |
584
+ |`after` | {Discorb::ScheduledEvent}| The scheduled event after the update. |
@@ -27,6 +27,7 @@ module Discorb
27
27
  # | `:default` | `Object` | Default value of the option. |
28
28
  # | `:channel_types` | `Array<Class<Discorb::Channel>>` | Type of the channel option. |
29
29
  # | `:autocomplete` | `Proc` | Autocomplete function. |
30
+ # | `:range` | `Range` | Range of the option. Only valid for numeric options. (`:int`, `:float`) |
30
31
  #
31
32
  # @param [Array<#to_s>, false, nil] guild_ids Guild IDs to set the command to. `false` to global command, `nil` to use default.
32
33
  # @param [Proc] block Command block.
@@ -251,6 +252,10 @@ module Discorb
251
252
  ret[:channel_types] = value[:channel_types].map(&:channel_type) if value[:channel_types]
252
253
 
253
254
  ret[:autocomplete] = !!value[:autocomplete] if value[:autocomplete]
255
+ if value[:range]
256
+ ret[:min_value] = value[:range].begin
257
+ ret[:max_value] = value[:range].end
258
+ end
254
259
  ret
255
260
  end
256
261
  {
@@ -27,7 +27,8 @@ module Discorb
27
27
  # @return [Boolean] Whether the application's bot requires a code grant.
28
28
  attr_reader :bot_require_code_grant
29
29
  alias bot_require_code_grant? bot_require_code_grant
30
-
30
+ # @return [Discorb::Application::Flag] The application's flags.
31
+ attr_reader :flags
31
32
  # @private
32
33
  def initialize(client, data)
33
34
  @client = client
@@ -42,6 +43,7 @@ module Discorb
42
43
  @verify_key = data[:verify_key]
43
44
  @owner = @client.users[data[:owner][:id]] || User.new(@client, data[:owner])
44
45
  @team = data[:team] && Team.new(@client, data[:team])
46
+ @flags = Flag.new(data[:flags])
45
47
  end
46
48
 
47
49
  def inspect
@@ -52,6 +54,34 @@ module Discorb
52
54
 
53
55
  alias require_code_grant? bot_require_code_grant?
54
56
 
57
+ #
58
+ # Represents a flag for an application.
59
+ # ## Flag fields
60
+ #
61
+ # | Field|Value|
62
+ # |---|---|
63
+ # | `1 << 12` | `:gateway_presence` |
64
+ # | `1 << 13` | `:gateway_presence_limited` |
65
+ # | `1 << 14` | `:gateway_guild_members` |
66
+ # | `1 << 15` | `:gateway_guild_members_limited` |
67
+ # | `1 << 16` | `:verification_pending_guild_limit` |
68
+ # | `1 << 17` | `:embedded` |
69
+ # | `1 << 18` | `:gateway_message_content` |
70
+ # | `1 << 19` | `:gateway_message_content_limited` |
71
+ #
72
+ class Flag < Discorb::Flag
73
+ @bits = {
74
+ gateway_presence: 12,
75
+ gateway_presence_limited: 13,
76
+ gateway_guild_members: 14,
77
+ gateway_guild_members_limited: 15,
78
+ verification_pending_guild_limit: 16,
79
+ embedded: 17,
80
+ gateway_message_content: 18,
81
+ gateway_message_content_limited: 19,
82
+ }
83
+ end
84
+
55
85
  #
56
86
  # Represents a team for an application.
57
87
  #
@@ -90,6 +90,9 @@ module Discorb
90
90
  # * `:sticker_create`
91
91
  # * `:sticker_update`
92
92
  # * `:sticker_delete`
93
+ # * `:guild_scheduled_event_create`
94
+ # * `:guild_scheduled_event_update`
95
+ # * `:guild_scheduled_event_delete`
93
96
  # * `:thread_create`
94
97
  # * `:thread_update`
95
98
  # * `:thread_delete`
@@ -148,9 +151,12 @@ module Discorb
148
151
  90 => :sticker_create,
149
152
  91 => :sticker_update,
150
153
  92 => :sticker_delete,
154
+ 100 => :guild_scheduled_event_create,
155
+ 101 => :guild_scheduled_event_update,
156
+ 102 => :guild_scheduled_event_delete,
151
157
  110 => :thread_create,
152
158
  111 => :thread_update,
153
- 112 => :thread_delete
159
+ 112 => :thread_delete,
154
160
  }.freeze
155
161
 
156
162
  # @private
@@ -160,7 +166,7 @@ module Discorb
160
166
  role: ->(client, id, guild_id) { client.guilds[guild_id]&.roles&.[](id) },
161
167
  member: ->(client, id, guild_id) { client.guilds[guild_id]&.members&.[](id) },
162
168
  guild: ->(client, id, _guild_id) { client.guilds[id] },
163
- message: ->(client, id, _guild_id) { client.messages[id] }
169
+ message: ->(client, id, _guild_id) { client.messages[id] },
164
170
  }
165
171
 
166
172
  # @private
@@ -171,15 +177,15 @@ module Discorb
171
177
  @user_id = Snowflake.new(data[:user_id])
172
178
  @target_id = Snowflake.new(data[:target_id])
173
179
  @type = self.class.events[data[:action_type]]
174
- @target = self.class.converts[@type.to_s.split('_')[0].to_sym]&.call(client, @target_id, @gui)
180
+ @target = self.class.converts[@type.to_s.split("_")[0].to_sym]&.call(client, @target_id, @gui)
175
181
  @target ||= Snowflake.new(data[:target_id])
176
182
  @changes = data[:changes] && Changes.new(data[:changes])
177
183
  @reason = data[:reason]
178
184
  data[:options]&.each do |option, value|
179
185
  define_singleton_method(option) { value }
180
- if option.end_with?('_id')
181
- define_singleton_method(option.to_s.sub('_id', '')) do
182
- self.class.converts[option.to_s.split('_')[0].to_sym]&.call(client, value, @guild_id)
186
+ if option.end_with?("_id")
187
+ define_singleton_method(option.to_s.sub("_id", "")) do
188
+ self.class.converts[option.to_s.split("_")[0].to_sym]&.call(client, value, @guild_id)
183
189
  end
184
190
  end
185
191
  end
@@ -203,7 +209,7 @@ module Discorb
203
209
  end
204
210
 
205
211
  def inspect
206
- "#<#{self.class} #{@changes&.data&.length || 'No'} changes>"
212
+ "#<#{self.class} #{@changes&.data&.length || "No"} changes>"
207
213
  end
208
214
 
209
215
  class << self
@@ -268,15 +274,21 @@ module Discorb
268
274
  def initialize(data)
269
275
  @key = data[:key].to_sym
270
276
  method = case @key.to_s
271
- when /.*_id$/, 'id'
272
- ->(v) { Snowflake.new(v) }
273
- when 'permissions'
274
- ->(v) { Discorb::Permission.new(v.to_i) }
275
- else
276
- ->(v) { v }
277
- end
278
- @old_value = data[:old_value].then(&method)
279
- @new_value = data[:new_value].then(&method)
277
+ when /.*_id$/, "id"
278
+ ->(v) { Snowflake.new(v) }
279
+ when "permissions"
280
+ ->(v) { Discorb::Permission.new(v.to_i) }
281
+ when "status"
282
+ ->(v) { Discorb::ScheduledEvent.status[v] }
283
+ when "entity_type"
284
+ ->(v) { Discorb::ScheduledEvent.entity_type[v] }
285
+ when "privacy_level"
286
+ ->(v) { Discorb::StageInstance.privacy_level[v] || Discorb::ScheduledEvent.privacy_level[v] }
287
+ else
288
+ ->(v) { v }
289
+ end
290
+ @old_value = method.(data[:old_value])
291
+ @new_value = method.(data[:new_value])
280
292
  end
281
293
 
282
294
  #
@@ -491,17 +491,24 @@ module Discorb
491
491
  # @param [Discorb::Message] message The message to start the thread.
492
492
  # @param [Integer] auto_archive_duration The duration of auto-archiving.
493
493
  # @param [Boolean] public Whether the thread is public.
494
+ # @param [Integer] rate_limit_per_user The rate limit per user.
495
+ # @param [Integer] slowmode Alias of `rate_limit_per_user`.
494
496
  # @param [String] reason The reason of starting the thread.
495
497
  #
496
498
  # @return [Async::Task<Discorb::ThreadChannel>] The started thread.
497
499
  #
498
- def start_thread(name, message: nil, auto_archive_duration: 1440, public: true, reason: nil)
500
+ def start_thread(name, message: nil, auto_archive_duration: 1440, public: true, rate_limit_per_user: nil, slowmode: nil, reason: nil)
499
501
  Async do
500
502
  _resp, data = if message.nil?
501
- @client.http.post("/channels/#{@id}/threads", {
502
- name: name, auto_archive_duration: auto_archive_duration, type: public ? 11 : 10,
503
- },
504
- audit_log_reason: reason).wait
503
+ @client.http.post(
504
+ "/channels/#{@id}/threads", {
505
+ name: name,
506
+ auto_archive_duration: auto_archive_duration,
507
+ type: public ? 11 : 10,
508
+ rate_limit_per_user: rate_limit_per_user || slowmode,
509
+ },
510
+ audit_log_reason: reason,
511
+ ).wait
505
512
  else
506
513
  @client.http.post("/channels/#{@id}/messages/#{Utils.try(message, :id)}/threads", {
507
514
  name: name, auto_archive_duration: auto_archive_duration,
@@ -112,10 +112,10 @@ module Discorb
112
112
  # @param [Hash] metadata The metadata of the event.
113
113
  # @param [Proc] block The block to execute when the event is triggered.
114
114
  #
115
- # @return [Discorb::Event] The event.
115
+ # @return [Discorb::EventHandler] The event.
116
116
  #
117
117
  def on(event_name, id: nil, **metadata, &block)
118
- ne = Event.new(block, id, metadata)
118
+ ne = EventHandler.new(block, id, metadata)
119
119
  @events[event_name] ||= []
120
120
  @events[event_name].delete_if { |e| e.metadata[:override] }
121
121
  @events[event_name] << ne
@@ -127,7 +127,7 @@ module Discorb
127
127
  #
128
128
  # @param (see #on)
129
129
  #
130
- # @return [Discorb::Event] The event.
130
+ # @return [Discorb::EventHandler] The event.
131
131
  #
132
132
  def once(event_name, id: nil, **metadata, &block)
133
133
  metadata[:once] = true
@@ -184,7 +184,7 @@ module Discorb
184
184
  events.each do |block|
185
185
  Async do
186
186
  Async(annotation: "Discorb event: #{event_name}") do |task|
187
- if block.is_a?(Discorb::Event)
187
+ if block.is_a?(Discorb::EventHandler)
188
188
  @events[event_name].delete(block) if block.metadata[:once]
189
189
  end
190
190
  block.call(*args)
@@ -4,7 +4,7 @@ module Discorb
4
4
  # @return [String] The API base URL.
5
5
  API_BASE_URL = "https://discord.com/api/v9"
6
6
  # @return [String] The version of discorb.
7
- VERSION = "0.12.1"
7
+ VERSION = "0.13.0"
8
8
  # @return [String] The user agent for the bot.
9
9
  USER_AGENT = "DiscordBot (https://discorb-lib.github.io #{VERSION}) Ruby/#{RUBY_VERSION}"
10
10
 
@@ -110,6 +110,31 @@ module Discorb
110
110
  @value & 0xFFF
111
111
  end
112
112
 
113
+ def inspect
114
+ "#<#{self.class} #{to_s}>"
115
+ end
116
+
113
117
  alias id to_s
114
118
  end
119
+
120
+ Unset = Object.new
121
+ class << Unset
122
+ def method_missing(*)
123
+ self
124
+ end
125
+
126
+ def or(other)
127
+ other
128
+ end
129
+ end
130
+
131
+ module DefineOr
132
+ refine Object do
133
+ def or(other)
134
+ self
135
+ end
136
+ end
137
+ end
138
+
139
+ using DefineOr
115
140
  end
@@ -6,6 +6,10 @@ module Discorb
6
6
  # Represents a Discord component.
7
7
  #
8
8
  class Component
9
+ def inspect
10
+ "#<#{self.class}>"
11
+ end
12
+
9
13
  class << self
10
14
  #
11
15
  # Create a new component from hash data.
@@ -142,6 +146,10 @@ module Discorb
142
146
  end
143
147
  end
144
148
 
149
+ def inspect
150
+ "#<#{self.class}: #{@custom_id || @url}>"
151
+ end
152
+
145
153
  class << self
146
154
  # @private
147
155
  attr_reader :styles
@@ -218,6 +226,10 @@ module Discorb
218
226
  }
219
227
  end
220
228
 
229
+ def inspect
230
+ "#<#{self.class}: #{@custom_id}>"
231
+ end
232
+
221
233
  #
222
234
  # Represents an option of a select menu.
223
235
  #
@@ -48,7 +48,7 @@ module Discorb
48
48
  # @param [#to_s] id The ID of the item to remove.
49
49
  #
50
50
  def remove(id)
51
- @cache.remove(id.to_s)
51
+ @cache.delete(id.to_s)
52
52
  end
53
53
 
54
54
  #
data/lib/discorb/embed.rb CHANGED
@@ -86,6 +86,10 @@ module Discorb
86
86
  @thumbnail = (value.is_a?(String)) ? Thumbnail.new(value) : value
87
87
  end
88
88
 
89
+ def inspect
90
+ "#<#{self.class} \"#{@title}\">"
91
+ end
92
+
89
93
  #
90
94
  # Convert embed to hash.
91
95
  #
data/lib/discorb/emoji.rb CHANGED
@@ -13,6 +13,10 @@ module Discorb
13
13
  def ==(other)
14
14
  eql?(other)
15
15
  end
16
+
17
+ def inspect
18
+ "#<#{self.class}>"
19
+ end
16
20
  end
17
21
 
18
22
  # Represents a custom emoji in discord.