discorb 0.13.1 → 0.14.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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/build_version.yml +3 -3
  4. data/.github/workflows/codeql-analysis.yml +70 -0
  5. data/.github/workflows/lint-push.yml +18 -0
  6. data/.github/workflows/lint.yml +16 -0
  7. data/.rubocop.yml +70 -0
  8. data/CODE_OF_CONDUCT.md +128 -0
  9. data/Changelog.md +33 -0
  10. data/Gemfile +7 -3
  11. data/README.md +1 -1
  12. data/Rakefile +35 -35
  13. data/discorb.gemspec +13 -1
  14. data/examples/commands/bookmarker.rb +2 -1
  15. data/examples/commands/hello.rb +1 -0
  16. data/examples/commands/inspect.rb +3 -2
  17. data/examples/components/authorization_button.rb +2 -1
  18. data/examples/components/select_menu.rb +2 -1
  19. data/examples/extension/main.rb +1 -0
  20. data/examples/extension/message_expander.rb +1 -0
  21. data/examples/simple/eval.rb +3 -2
  22. data/examples/simple/ping_pong.rb +1 -0
  23. data/examples/simple/rolepanel.rb +1 -0
  24. data/examples/simple/wait_for_message.rb +4 -3
  25. data/exe/discorb +8 -7
  26. data/lib/discorb/allowed_mentions.rb +64 -0
  27. data/lib/discorb/app_command/command.rb +274 -0
  28. data/lib/discorb/app_command/handler.rb +168 -0
  29. data/lib/discorb/app_command.rb +2 -404
  30. data/lib/discorb/asset.rb +3 -1
  31. data/lib/discorb/audit_logs.rb +3 -3
  32. data/lib/discorb/channel.rb +89 -53
  33. data/lib/discorb/client.rb +36 -33
  34. data/lib/discorb/common.rb +28 -21
  35. data/lib/discorb/components/button.rb +106 -0
  36. data/lib/discorb/components/select_menu.rb +157 -0
  37. data/lib/discorb/components/text_input.rb +96 -0
  38. data/lib/discorb/components.rb +11 -276
  39. data/lib/discorb/dictionary.rb +13 -2
  40. data/lib/discorb/embed.rb +2 -2
  41. data/lib/discorb/emoji.rb +21 -5
  42. data/lib/discorb/emoji_table.rb +1 -1
  43. data/lib/discorb/error.rb +4 -6
  44. data/lib/discorb/event.rb +13 -11
  45. data/lib/discorb/exe/about.rb +1 -0
  46. data/lib/discorb/exe/irb.rb +4 -3
  47. data/lib/discorb/exe/new.rb +6 -7
  48. data/lib/discorb/exe/run.rb +2 -1
  49. data/lib/discorb/exe/setup.rb +8 -5
  50. data/lib/discorb/exe/show.rb +1 -0
  51. data/lib/discorb/extend.rb +19 -14
  52. data/lib/discorb/extension.rb +5 -1
  53. data/lib/discorb/gateway.rb +75 -27
  54. data/lib/discorb/guild.rb +58 -80
  55. data/lib/discorb/guild_template.rb +5 -5
  56. data/lib/discorb/http.rb +34 -169
  57. data/lib/discorb/integration.rb +32 -3
  58. data/lib/discorb/intents.rb +1 -1
  59. data/lib/discorb/interaction/autocomplete.rb +5 -4
  60. data/lib/discorb/interaction/command.rb +34 -9
  61. data/lib/discorb/interaction/components.rb +5 -2
  62. data/lib/discorb/interaction/modal.rb +33 -0
  63. data/lib/discorb/interaction/response.rb +41 -12
  64. data/lib/discorb/interaction/root.rb +1 -0
  65. data/lib/discorb/interaction.rb +2 -1
  66. data/lib/discorb/invite.rb +1 -1
  67. data/lib/discorb/log.rb +4 -3
  68. data/lib/discorb/member.rb +4 -6
  69. data/lib/discorb/message.rb +31 -282
  70. data/lib/discorb/message_meta.rb +205 -0
  71. data/lib/discorb/modules.rb +11 -11
  72. data/lib/discorb/permission.rb +2 -2
  73. data/lib/discorb/presence.rb +6 -3
  74. data/lib/discorb/rate_limit.rb +15 -21
  75. data/lib/discorb/role.rb +3 -3
  76. data/lib/discorb/sticker.rb +2 -2
  77. data/lib/discorb/user.rb +3 -3
  78. data/lib/discorb/utils/colored_puts.rb +1 -0
  79. data/lib/discorb/voice_state.rb +7 -2
  80. data/lib/discorb/webhook.rb +8 -5
  81. data/lib/discorb.rb +1 -0
  82. data/template-replace/scripts/arrow.rb +1 -0
  83. data/template-replace/scripts/favicon.rb +1 -0
  84. data/template-replace/scripts/index.rb +2 -1
  85. data/template-replace/scripts/locale_ja.rb +5 -4
  86. data/template-replace/scripts/sidebar.rb +1 -0
  87. data/template-replace/scripts/version.rb +7 -10
  88. data/template-replace/scripts/yard_replace.rb +5 -4
  89. metadata +29 -4
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Discorb
4
+ #
5
+ # Represents a button component.
6
+ #
7
+ class Button < Component
8
+ # @return [String] The label of the button.
9
+ attr_accessor :label
10
+ # @return [:primary, :secondary, :success, :danger, :link] The style of the button.
11
+ attr_accessor :style
12
+ # @return [Discorb::Emoji] The emoji of the button.
13
+ attr_accessor :emoji
14
+ # @return [String] The custom ID of the button.
15
+ # Won't be used if the style is `:link`.
16
+ attr_accessor :custom_id
17
+ # @return [String] The URL of the button.
18
+ # Only used when the style is `:link`.
19
+ attr_accessor :url
20
+ # @return [Boolean] Whether the button is disabled.
21
+ attr_accessor :disabled
22
+ alias disabled? disabled
23
+
24
+ @styles = {
25
+ primary: 1,
26
+ secondary: 2,
27
+ success: 3,
28
+ danger: 4,
29
+ link: 5,
30
+ }.freeze
31
+
32
+ #
33
+ # Initialize a new button.
34
+ #
35
+ # @param [String] label The label of the button.
36
+ # @param [:primary, :secondary, :success, :danger, :link] style The style of the button.
37
+ # @param [Discorb::Emoji] emoji The emoji of the button.
38
+ # @param [String] custom_id The custom ID of the button.
39
+ # @param [String] url The URL of the button.
40
+ # @param [Boolean] disabled Whether the button is disabled.
41
+ #
42
+ def initialize(label, style = :primary, emoji: nil, custom_id: nil, url: nil, disabled: false)
43
+ @label = label
44
+ @style = style
45
+ @emoji = emoji
46
+ @custom_id = custom_id
47
+ @url = url
48
+ @disabled = disabled
49
+ end
50
+
51
+ #
52
+ # Converts the button to a hash.
53
+ #
54
+ # @see https://discord.com/developers/docs/interactions/message-components#button-object-button-structure Official Discord API docs
55
+ # @return [Hash] A hash representation of the button.
56
+ #
57
+ def to_hash
58
+ if @style == :link
59
+ {
60
+ type: 2,
61
+ label: @label,
62
+ style: self.class.styles[@style],
63
+ url: @url,
64
+ emoji: @emoji&.to_hash,
65
+ disabled: @disabled,
66
+ }
67
+ else
68
+ {
69
+ type: 2,
70
+ label: @label,
71
+ style: self.class.styles[@style],
72
+ custom_id: @custom_id,
73
+ emoji: @emoji&.to_hash,
74
+ disabled: @disabled,
75
+ }
76
+ end
77
+ end
78
+
79
+ def inspect
80
+ "#<#{self.class}: #{@custom_id || @url}>"
81
+ end
82
+
83
+ class << self
84
+ # @private
85
+ attr_reader :styles
86
+
87
+ #
88
+ # Creates a new button from a hash.
89
+ #
90
+ # @param [Hash] data The hash to create the button from.
91
+ #
92
+ # @return [Discorb::Button] The created button.
93
+ #
94
+ def from_hash(data)
95
+ new(
96
+ data[:label],
97
+ data[:style],
98
+ emoji: data[:emoji],
99
+ custom_id: data[:custom_id],
100
+ url: data[:url],
101
+ disabled: data[:disabled],
102
+ )
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Discorb
4
+ #
5
+ # Represents a select menu component.
6
+ #
7
+ class SelectMenu < Component
8
+ # @return [String] The custom ID of the select menu.
9
+ attr_accessor :custom_id
10
+ # @return [Array<SelectMenu::Option>] The options of the select menu.
11
+ attr_accessor :options
12
+ # @return [Integer] The minimum number of values.
13
+ attr_accessor :min_values
14
+ # @return [Integer] The maximum number of values.
15
+ attr_accessor :max_values
16
+ # @return [Boolean] Whether the select menu is disabled.
17
+ attr_accessor :disabled
18
+ alias disabled? disabled
19
+
20
+ #
21
+ # Initialize a new select menu.
22
+ #
23
+ # @param [String, Symbol] custom_id Custom ID of the select menu.
24
+ # @param [Array<Discorb::SelectMenu::Option>] options The options of the select menu.
25
+ # @param [String] placeholder The placeholder of the select menu.
26
+ # @param [Integer] min_values The minimum number of values.
27
+ # @param [Integer] max_values The maximum number of values.
28
+ #
29
+ def initialize(custom_id, options, placeholder: nil, min_values: 1, max_values: 1)
30
+ @custom_id = custom_id
31
+ @options = options
32
+ @placeholder = placeholder
33
+ @min_values = min_values
34
+ @max_values = max_values
35
+ end
36
+
37
+ #
38
+ # Converts the select menu to a hash.
39
+ #
40
+ # @see https://discord.com/developers/docs/interactions/message-components#select-menu-object-select-menu-structure Official Discord API docs
41
+ # @return [Hash] A hash representation of the select menu.
42
+ #
43
+ def to_hash
44
+ {
45
+ type: 3,
46
+ custom_id: @custom_id,
47
+ options: @options.map(&:to_hash),
48
+ placeholder: @placeholder,
49
+ min_values: @min_values,
50
+ max_values: @max_values,
51
+ disabled: @disabled,
52
+ }
53
+ end
54
+
55
+ def inspect
56
+ "#<#{self.class}: #{@custom_id}>"
57
+ end
58
+
59
+ class << self
60
+ #
61
+ # Creates a new select menu from a hash.
62
+ #
63
+ # @param [Hash] data The hash to create the select menu from.
64
+ #
65
+ # @return [Discorb::SelectMenu] The created select menu.
66
+ #
67
+ def from_hash(data)
68
+ new(
69
+ data[:custom_id],
70
+ data[:options].map { |o| SelectMenu::Option.from_hash(o) },
71
+ placeholder: data[:placeholder],
72
+ min_values: data[:min_values],
73
+ max_values: data[:max_values],
74
+ )
75
+ end
76
+ end
77
+
78
+ #
79
+ # Represents an option of a select menu.
80
+ #
81
+ class Option
82
+ # @return [String] The label of the option.
83
+ attr_accessor :label
84
+ # @return [String] The value of the option.
85
+ attr_accessor :value
86
+ # @return [String] The description of the option.
87
+ attr_accessor :description
88
+ # @return [Discorb::Emoji] The emoji of the option.
89
+ attr_accessor :emoji
90
+ # @return [Boolean] Whether the option is default.
91
+ attr_accessor :default
92
+
93
+ #
94
+ # Initialize a new option.
95
+ #
96
+ # @param [String] label The label of the option.
97
+ # @param [String] value The value of the option.
98
+ # @param [String] description The description of the option.
99
+ # @param [Discorb::Emoji] emoji The emoji of the option.
100
+ # @param [Boolean] default Whether the option is default.
101
+ def initialize(label, value, description: nil, emoji: nil, default: false)
102
+ @label = label
103
+ @value = value
104
+ @description = description
105
+ @emoji = emoji
106
+ @default = default
107
+ end
108
+
109
+ #
110
+ # Converts the option to a hash.
111
+ #
112
+ # @see https://discord.com/developers/docs/interactions/message-components#select-menu-object-select-option-structure Official Discord API docs
113
+ # @return [Hash] Hash representation of the option.
114
+ #
115
+ def to_hash
116
+ {
117
+ label: @label,
118
+ value: @value,
119
+ description: @description,
120
+ emoji: @emoji&.to_hash,
121
+ default: @default,
122
+ }
123
+ end
124
+
125
+ # @private
126
+ def hash_emoji(emoji)
127
+ case emoji
128
+ when UnicodeEmoji
129
+ {
130
+ id: nil,
131
+ name: emoji.to_s,
132
+ animated: false,
133
+ }
134
+ when CustomEmoji
135
+ {
136
+ id: emoji.id,
137
+ name: emoji.name,
138
+ animated: emoji.animated?,
139
+ }
140
+ end
141
+ end
142
+
143
+ class << self
144
+ #
145
+ # Creates a new option from a hash.
146
+ #
147
+ # @param [Hash] data A hash representing the option.
148
+ #
149
+ # @return [Discorb::SelectMenu::Option] A new option.
150
+ #
151
+ def from_hash(data)
152
+ new(data[:label], data[:value], description: data[:description], emoji: data[:emoji], default: data[:default])
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Discorb
4
+ #
5
+ # Represents a text input component.
6
+ #
7
+ class TextInput < Component
8
+ # @private
9
+ STYLES = {
10
+ short: 1,
11
+ paragraph: 2,
12
+ }.freeze
13
+
14
+ # @return [String] The label of the text input.
15
+ attr_accessor :label
16
+ # @return [String] The custom id of the text input.
17
+ attr_accessor :custom_id
18
+ # @return [:short, :paragraph] The style of the text input.
19
+ attr_accessor :style
20
+ # @return [Integer, nil] The minimum length of the text input.
21
+ attr_accessor :min_length
22
+ # @return [Integer, nil] The maximum length of the text input.
23
+ attr_accessor :max_length
24
+ # @return [Boolean] Whether the text input is required.
25
+ attr_accessor :required
26
+ # @return [String, nil] The prefilled value of the text input.
27
+ attr_accessor :value
28
+ # @return [String, nil] The placeholder of the text input.
29
+ attr_accessor :placeholder
30
+
31
+ #
32
+ # Initialize a new text input component.
33
+ #
34
+ # @param [String] label The label of the text input.
35
+ # @param [String] custom_id The custom id of the text input.
36
+ # @param [:short, :paragraph] style The style of the text input.
37
+ # @param [Integer, nil] min_length The minimum length of the text input.
38
+ # @param [Integer, nil] max_length The maximum length of the text input.
39
+ # @param [Boolean] required Whether the text input is required.
40
+ # @param [String, nil] value The prefilled value of the text input.
41
+ # @param [String, nil] placeholder The placeholder of the text input.
42
+ #
43
+ def initialize(label, custom_id, style, min_length: nil, max_length: nil, required: false, value: nil, placeholder: nil)
44
+ @label = label
45
+ @custom_id = custom_id
46
+ @style = style
47
+ @min_length = min_length
48
+ @max_length = max_length
49
+ @required = required
50
+ @value = value
51
+ @placeholder = placeholder
52
+ end
53
+
54
+ #
55
+ # Converts the select menu to a hash.
56
+ #
57
+ # @see https://discord.com/developers/docs/interactions/message-components#text-inputs-text-input-structure Official Discord API docs
58
+ # @return [Hash] A hash representation of the text input.
59
+ #
60
+ def to_hash
61
+ {
62
+ type: 4,
63
+ label: @label,
64
+ style: STYLES[@style],
65
+ custom_id: @custom_id,
66
+ min_length: @min_length,
67
+ max_length: @max_length,
68
+ required: @required,
69
+ value: @value,
70
+ placeholder: @placeholder,
71
+ }
72
+ end
73
+
74
+ class << self
75
+ #
76
+ # Creates a new text input from a hash.
77
+ #
78
+ # @param [Hash] data The hash to create the text input from.
79
+ #
80
+ # @return [Discorb::TextInput] The created text input.
81
+ #
82
+ def from_hash(data)
83
+ new(
84
+ data[:label],
85
+ data[:custom_id],
86
+ STYLES.key(data[:style]),
87
+ min_length: data[:min_length],
88
+ max_length: data[:max_length],
89
+ required: data[:required],
90
+ value: data[:value],
91
+ placeholder: data[:placeholder],
92
+ )
93
+ end
94
+ end
95
+ end
96
+ end
@@ -22,23 +22,12 @@ module Discorb
22
22
  def from_hash(data)
23
23
  case data[:type]
24
24
  when 2
25
- Button.new(
26
- data[:label],
27
- data[:style],
28
- emoji: data[:emoji],
29
- custom_id: data[:custom_id],
30
- url: data[:url],
31
- disabled: data[:disabled],
32
- )
25
+ Button
33
26
  when 3
34
- SelectMenu.new(
35
- data[:custom_id],
36
- data[:options].map { |o| SelectMenu::Option.from_hash(o) },
37
- placeholder: data[:placeholder],
38
- min_values: data[:min_values],
39
- max_values: data[:max_values],
40
- )
41
- end
27
+ SelectMenu
28
+ when 4
29
+ TextInput
30
+ end.from_hash(data)
42
31
  end
43
32
 
44
33
  #
@@ -57,7 +46,7 @@ module Discorb
57
46
  tmp_components << tmp_row
58
47
  tmp_row = []
59
48
  tmp_components << c
60
- when SelectMenu
49
+ when SelectMenu, TextInput
61
50
  tmp_components << tmp_row
62
51
  tmp_row = []
63
52
  tmp_components << [c]
@@ -66,266 +55,12 @@ module Discorb
66
55
  end
67
56
  end
68
57
  tmp_components << tmp_row
69
- return tmp_components.filter { |c| c.length.positive? }.map { |c| { type: 1, components: c.map(&:to_hash) } }
70
- end
71
- end
72
- end
73
-
74
- #
75
- # Represents a button component.
76
- #
77
- class Button < Component
78
- # @return [String] The label of the button.
79
- attr_accessor :label
80
- # @return [:primary, :secondary, :success, :danger, :link] The style of the button.
81
- attr_accessor :style
82
- # @return [Discorb::Emoji] The emoji of the button.
83
- attr_accessor :emoji
84
- # @return [String] The custom ID of the button.
85
- # Won't be used if the style is `:link`.
86
- attr_accessor :custom_id
87
- # @return [String] The URL of the button.
88
- # Only used when the style is `:link`.
89
- attr_accessor :url
90
- # @return [Boolean] Whether the button is disabled.
91
- attr_accessor :disabled
92
- alias disabled? disabled
93
-
94
- @styles = {
95
- primary: 1,
96
- secondary: 2,
97
- success: 3,
98
- danger: 4,
99
- link: 5,
100
- }.freeze
101
-
102
- #
103
- # Initialize a new button.
104
- #
105
- # @param [String] label The label of the button.
106
- # @param [:primary, :secondary, :success, :danger, :link] style The style of the button.
107
- # @param [Discorb::Emoji] emoji The emoji of the button.
108
- # @param [String] custom_id The custom ID of the button.
109
- # @param [String] url The URL of the button.
110
- # @param [Boolean] disabled Whether the button is disabled.
111
- #
112
- def initialize(label, style = :primary, emoji: nil, custom_id: nil, url: nil, disabled: false)
113
- @label = label
114
- @style = style
115
- @emoji = emoji
116
- @custom_id = custom_id
117
- @url = url
118
- @disabled = disabled
119
- end
120
-
121
- #
122
- # Converts the button to a hash.
123
- #
124
- # @see https://discord.com/developers/docs/interactions/message-components#button-object-button-structure Official Discord API docs
125
- # @return [Hash] A hash representation of the button.
126
- #
127
- def to_hash
128
- if @style == :link
129
- {
130
- type: 2,
131
- label: @label,
132
- style: self.class.styles[@style],
133
- url: @url,
134
- emoji: hash_emoji(@emoji),
135
- disabled: @disabled,
136
- }
137
- else
138
- {
139
- type: 2,
140
- label: @label,
141
- style: self.class.styles[@style],
142
- custom_id: @custom_id,
143
- emoji: hash_emoji(@emoji),
144
- disabled: @disabled,
145
- }
146
- end
147
- end
148
-
149
- def inspect
150
- "#<#{self.class}: #{@custom_id || @url}>"
151
- end
152
-
153
- class << self
154
- # @private
155
- attr_reader :styles
156
- end
157
-
158
- private
159
-
160
- def hash_emoji(emoji)
161
- case emoji
162
- when UnicodeEmoji
163
- {
164
- id: nil,
165
- name: emoji.to_s,
166
- animated: false,
167
- }
168
- when CustomEmoji
169
- {
170
- id: emoji.id,
171
- name: emoji.name,
172
- animated: emoji.animated?,
173
- }
174
- end
175
- end
176
- end
177
-
178
- #
179
- # Represents a select menu component.
180
- #
181
- class SelectMenu < Component
182
- # @return [String] The custom ID of the select menu.
183
- attr_accessor :custom_id
184
- # @return [Array<SelectMenu::Option>] The options of the select menu.
185
- attr_accessor :options
186
- # @return [Integer] The minimum number of values.
187
- attr_accessor :min_values
188
- # @return [Integer] The maximum number of values.
189
- attr_accessor :max_values
190
- # @return [Boolean] Whether the select menu is disabled.
191
- attr_accessor :disabled
192
- alias disabled? disabled
193
-
194
- #
195
- # Initialize a new select menu.
196
- #
197
- # @param [String, Symbol] custom_id Custom ID of the select menu.
198
- # @param [Array<Discorb::SelectMenu::Option>] options The options of the select menu.
199
- # @param [String] placeholder The placeholder of the select menu.
200
- # @param [Integer] min_values The minimum number of values.
201
- # @param [Integer] max_values The maximum number of values.
202
- #
203
- def initialize(custom_id, options, placeholder: nil, min_values: 1, max_values: 1)
204
- @custom_id = custom_id
205
- @options = options
206
- @placeholder = placeholder
207
- @min_values = min_values
208
- @max_values = max_values
209
- end
210
-
211
- #
212
- # Converts the select menu to a hash.
213
- #
214
- # @see https://discord.com/developers/docs/interactions/message-components#select-menu-object-select-menu-structure Official Discord API docs
215
- # @return [Hash] A hash representation of the select menu.
216
- #
217
- def to_hash
218
- {
219
- type: 3,
220
- custom_id: @custom_id,
221
- options: @options.map(&:to_hash),
222
- placeholder: @placeholder,
223
- min_values: @min_values,
224
- max_values: @max_values,
225
- disabled: @disabled,
226
- }
227
- end
228
-
229
- def inspect
230
- "#<#{self.class}: #{@custom_id}>"
231
- end
232
-
233
- #
234
- # Represents an option of a select menu.
235
- #
236
- class Option
237
- # @return [String] The label of the option.
238
- attr_accessor :label
239
- # @return [String] The value of the option.
240
- attr_accessor :value
241
- # @return [String] The description of the option.
242
- attr_accessor :description
243
- # @return [Discorb::Emoji] The emoji of the option.
244
- attr_accessor :emoji
245
- # @return [Boolean] Whether the option is default.
246
- attr_accessor :default
247
-
248
- #
249
- # Initialize a new option.
250
- #
251
- # @param [String] label The label of the option.
252
- # @param [String] value The value of the option.
253
- # @param [String] description The description of the option.
254
- # @param [Discorb::Emoji] emoji The emoji of the option.
255
- # @param [Boolean] default Whether the option is default.
256
- def initialize(label, value, description: nil, emoji: nil, default: false)
257
- @label = label
258
- @value = value
259
- @description = description
260
- @emoji = emoji
261
- @default = default
262
- end
263
-
264
- #
265
- # Converts the option to a hash.
266
- #
267
- # @see https://discord.com/developers/docs/interactions/message-components#select-menu-object-select-option-structure Official Discord API docs
268
- # @return [Hash] Hash representation of the option.
269
- #
270
- def to_hash
271
- {
272
- label: @label,
273
- value: @value,
274
- description: @description,
275
- emoji: hash_emoji(@emoji),
276
- default: @default,
277
- }
278
- end
279
-
280
- # @private
281
- def hash_emoji(emoji)
282
- case emoji
283
- when UnicodeEmoji
284
- {
285
- id: nil,
286
- name: emoji.to_s,
287
- animated: false,
288
- }
289
- when CustomEmoji
290
- {
291
- id: emoji.id,
292
- name: emoji.name,
293
- animated: emoji.animated?,
294
- }
295
- end
296
- end
297
-
298
- class << self
299
- #
300
- # Creates a new option from a hash.
301
- #
302
- # @param [Hash] data A hash representing the option.
303
- #
304
- # @return [Discorb::SelectMenu::Option] A new option.
305
- #
306
- def from_hash(data)
307
- new(data[:label], data[:value], description: data[:description], emoji: data[:emoji], default: data[:default])
308
- end
309
- end
310
- end
311
-
312
- private
313
-
314
- def hash_emoji(emoji)
315
- case emoji
316
- when UnicodeEmoji
317
- {
318
- id: nil,
319
- name: emoji.to_s,
320
- animated: false,
321
- }
322
- when CustomEmoji
323
- {
324
- id: emoji.id,
325
- name: emoji.name,
326
- animated: emoji.animated?,
327
- }
58
+ tmp_components.filter { |c| c.length.positive? }.map { |c| { type: 1, components: c.map(&:to_hash) } }
328
59
  end
329
60
  end
330
61
  end
331
62
  end
63
+
64
+ %w[button text_input select_menu].each do |name|
65
+ require_relative "components/#{name}"
66
+ end
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Discorb
4
+ #
5
+ # Extended hash class. This is used for storing pair of ID and object.
6
+ #
4
7
  class Dictionary
5
8
  # @return [Integer] The maximum number of items in the dictionary.
6
9
  attr_accessor :limit
@@ -16,6 +19,7 @@ module Discorb
16
19
  @cache = hash.transform_keys(&:to_s)
17
20
  @limit = limit
18
21
  @sort = sort
22
+ @cache = @cache.sort_by(&@sort).to_h if @sort
19
23
  end
20
24
 
21
25
  #
@@ -39,7 +43,7 @@ module Discorb
39
43
  # @param [Discorb::Dictionary] other The dictionary to merge.
40
44
  #
41
45
  def merge(other)
42
- @cache.merge!(other)
46
+ @cache.merge!(other.to_h)
43
47
  end
44
48
 
45
49
  #
@@ -73,6 +77,13 @@ module Discorb
73
77
  end
74
78
  end
75
79
 
80
+ #
81
+ # Convert the dictionary to a hash.
82
+ #
83
+ def to_h
84
+ @cache
85
+ end
86
+
76
87
  #
77
88
  # Returns the values of the dictionary.
78
89
  #
@@ -104,7 +115,7 @@ module Discorb
104
115
  end
105
116
  end
106
117
 
107
- def respond_to_missing?(name, args, kwargs)
118
+ def respond_to_missing?(name, ...)
108
119
  if values.respond_to?(name)
109
120
  true
110
121
  else