discorb 0.16.0 → 0.17.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 +1 -0
- data/.github/workflows/build_main.yml +2 -2
- data/.github/workflows/build_version.yml +1 -1
- data/.github/workflows/codeql-analysis.yml +1 -1
- data/.github/workflows/lint-push.yml +3 -5
- data/.github/workflows/lint.yml +1 -1
- data/.github/workflows/spec.yml +30 -0
- data/.lefthook/commit-msg/validator.rb +5 -0
- data/.rspec +2 -0
- data/.rspec_parallel +2 -0
- data/.rubocop.yml +43 -6
- data/Changelog.md +14 -1
- data/Gemfile +14 -8
- data/Rakefile +41 -26
- data/bin/console +3 -3
- data/docs/Examples.md +1 -1
- data/docs/application_command.md +138 -46
- data/docs/cli/irb.md +2 -2
- data/docs/cli/new.md +14 -9
- data/docs/cli/run.md +7 -11
- data/docs/cli.md +17 -10
- data/docs/events.md +209 -211
- data/docs/extension.md +1 -2
- data/docs/faq.md +0 -1
- data/docs/tutorial.md +12 -12
- data/docs/voice_events.md +106 -106
- data/examples/commands/message.rb +63 -0
- data/examples/commands/permission.rb +18 -0
- data/examples/commands/slash.rb +44 -0
- data/examples/commands/user.rb +51 -0
- data/examples/components/authorization_button.rb +2 -2
- data/examples/components/select_menu.rb +2 -2
- data/examples/extension/main.rb +1 -1
- data/examples/extension/message_expander.rb +5 -2
- data/examples/simple/eval.rb +2 -2
- data/examples/simple/ping_pong.rb +1 -1
- data/examples/simple/rolepanel.rb +1 -1
- data/examples/simple/shard.rb +1 -1
- data/examples/simple/wait_for_message.rb +1 -1
- data/exe/discorb +31 -16
- data/lefthook.yml +45 -0
- data/lib/discorb/allowed_mentions.rb +1 -0
- data/lib/discorb/app_command/command.rb +127 -65
- data/lib/discorb/app_command/common.rb +25 -0
- data/lib/discorb/app_command/handler.rb +115 -33
- data/lib/discorb/app_command.rb +2 -1
- data/lib/discorb/application.rb +1 -0
- data/lib/discorb/asset.rb +1 -2
- data/lib/discorb/attachment.rb +1 -1
- data/lib/discorb/audit_logs.rb +11 -8
- data/lib/discorb/channel/base.rb +108 -0
- data/lib/discorb/channel/category.rb +32 -0
- data/lib/discorb/channel/container.rb +44 -0
- data/lib/discorb/channel/dm.rb +28 -0
- data/lib/discorb/channel/guild.rb +245 -0
- data/lib/discorb/channel/stage.rb +140 -0
- data/lib/discorb/channel/text.rb +345 -0
- data/lib/discorb/channel/thread.rb +321 -0
- data/lib/discorb/channel/voice.rb +79 -0
- data/lib/discorb/channel.rb +2 -1165
- data/lib/discorb/client.rb +38 -26
- data/lib/discorb/common.rb +2 -1
- data/lib/discorb/components/button.rb +2 -1
- data/lib/discorb/components/select_menu.rb +4 -2
- data/lib/discorb/components/text_input.rb +12 -2
- data/lib/discorb/components.rb +1 -1
- data/lib/discorb/embed.rb +22 -7
- data/lib/discorb/emoji.rb +30 -3
- data/lib/discorb/emoji_table.rb +4969 -3
- data/lib/discorb/event.rb +29 -4
- data/lib/discorb/exe/about.rb +1 -0
- data/lib/discorb/exe/irb.rb +2 -4
- data/lib/discorb/exe/new.rb +90 -23
- data/lib/discorb/exe/run.rb +8 -22
- data/lib/discorb/exe/setup.rb +25 -12
- data/lib/discorb/exe/show.rb +4 -3
- data/lib/discorb/extend.rb +1 -0
- data/lib/discorb/extension.rb +6 -3
- data/lib/discorb/flag.rb +11 -0
- data/lib/discorb/gateway.rb +67 -19
- data/lib/discorb/guild.rb +188 -56
- data/lib/discorb/guild_template.rb +10 -4
- data/lib/discorb/http.rb +16 -9
- data/lib/discorb/integration.rb +4 -1
- data/lib/discorb/intents.rb +1 -1
- data/lib/discorb/interaction/autocomplete.rb +28 -16
- data/lib/discorb/interaction/command.rb +36 -12
- data/lib/discorb/interaction/components.rb +5 -2
- data/lib/discorb/interaction/modal.rb +0 -1
- data/lib/discorb/interaction/response.rb +61 -22
- data/lib/discorb/interaction/root.rb +13 -13
- data/lib/discorb/interaction.rb +1 -0
- data/lib/discorb/invite.rb +5 -2
- data/lib/discorb/member.rb +25 -5
- data/lib/discorb/message.rb +47 -14
- data/lib/discorb/message_meta.rb +1 -0
- data/lib/discorb/modules.rb +56 -14
- data/lib/discorb/presence.rb +2 -2
- data/lib/discorb/rate_limit.rb +7 -2
- data/lib/discorb/reaction.rb +4 -4
- data/lib/discorb/role.rb +19 -4
- data/lib/discorb/shard.rb +1 -1
- data/lib/discorb/sticker.rb +8 -7
- data/lib/discorb/user.rb +2 -1
- data/lib/discorb/utils/colored_puts.rb +1 -0
- data/lib/discorb/voice_state.rb +10 -6
- data/lib/discorb/webhook.rb +36 -24
- data/lib/discorb.rb +5 -3
- data/po/yard.pot +9 -9
- data/sig/discorb.rbs +7232 -7235
- metadata +21 -5
- data/examples/commands/bookmarker.rb +0 -42
- data/examples/commands/hello.rb +0 -10
- data/examples/commands/inspect.rb +0 -25
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module Discorb
|
|
4
|
-
#
|
|
5
|
-
# Handles application commands.
|
|
6
|
-
#
|
|
7
4
|
module ApplicationCommand
|
|
8
5
|
#
|
|
9
6
|
# Module to handle application commands.
|
|
@@ -12,44 +9,83 @@ module Discorb
|
|
|
12
9
|
#
|
|
13
10
|
# Add new top-level command.
|
|
14
11
|
#
|
|
15
|
-
# @param [String] command_name Command name.
|
|
16
|
-
#
|
|
17
|
-
#
|
|
12
|
+
# @param [String, Hash{Symbol => String}] command_name Command name.
|
|
13
|
+
# If hash is passed, it must be a pair of Language code and Command name, and `:default` key is required.
|
|
14
|
+
# You can use `_` instead of `-` in language code.
|
|
15
|
+
# @param [String, Hash{Symbol => String}] description Command description.
|
|
16
|
+
# If hash is passed, it must be a pair of Language code and Command description, and `:default` key is required.
|
|
17
|
+
# You can use `_` instead of `-` in language code.
|
|
18
|
+
# @param [Hash{String => Hash{:description => String, :optional => Boolean, :type => Object}}] options
|
|
19
|
+
# Command options.
|
|
18
20
|
# The key is the option name, the value is a hash with the following keys:
|
|
19
21
|
#
|
|
20
22
|
# | Key | Type | Description |
|
|
21
23
|
# | --- | --- | --- |
|
|
22
|
-
# | `:description` | `String`
|
|
23
|
-
#
|
|
24
|
-
#
|
|
24
|
+
# | `:description` | `String` \| `Hash{Symbol => String}` |
|
|
25
|
+
# Description of the option. If hash is passed, it must be a pair of Language code and description,
|
|
26
|
+
# and `:default` key is required. You can use `_` instead of `-` in language code. |
|
|
27
|
+
# | `:required` | Boolean(true | false) |
|
|
28
|
+
# Whether the argument is required. `optional` will be used if not specified. |
|
|
29
|
+
# | `:optional` | Boolean(true | false) |
|
|
30
|
+
# Whether the argument is optional. `required` will be used if not specified. |
|
|
25
31
|
# | `:type` | `Object` | Type of the option. |
|
|
26
|
-
# | `:
|
|
32
|
+
# | `:choices` | `Hash{String => String, Integer, Float}` | Type of the option. |
|
|
33
|
+
# | `:choices_localizations` | `Hash{String => Hash{Symbol => String}}` |
|
|
34
|
+
# Localization of the choice. Key must be the name of a choice. |
|
|
27
35
|
# | `:default` | `Object` | Default value of the option. |
|
|
28
36
|
# | `:channel_types` | `Array<Class<Discorb::Channel>>` | Type of the channel option. |
|
|
29
37
|
# | `:autocomplete` | `Proc` | Autocomplete function. |
|
|
30
38
|
# | `:range` | `Range` | Range of the option. Only valid for numeric options. (`:int`, `:float`) |
|
|
31
39
|
#
|
|
32
|
-
# @param [Array<#to_s>, false, nil] guild_ids
|
|
40
|
+
# @param [Array<#to_s>, false, nil] guild_ids
|
|
41
|
+
# Guild IDs to set the command to. `false` to global command, `nil` to use default.
|
|
42
|
+
# @param [Boolean] dm_permission Whether the command is available in DM.
|
|
43
|
+
# @param [Discorb::Permission] default_permission The default permission of the command.
|
|
33
44
|
# @param [Proc] block Command block.
|
|
34
45
|
#
|
|
35
|
-
# @return [Discorb::ApplicationCommand::Command::
|
|
46
|
+
# @return [Discorb::ApplicationCommand::Command::ChatInputCommand] Command object.
|
|
36
47
|
#
|
|
37
48
|
# @see file:docs/application_command.md#register-slash-command Application Comamnds: Register Slash Command
|
|
38
49
|
# @see file:docs/cli/setup.md CLI: setup
|
|
39
50
|
#
|
|
40
|
-
def slash(
|
|
41
|
-
|
|
51
|
+
def slash(
|
|
52
|
+
command_name,
|
|
53
|
+
description,
|
|
54
|
+
options = {},
|
|
55
|
+
guild_ids: nil,
|
|
56
|
+
dm_permission: true,
|
|
57
|
+
default_permission: nil,
|
|
58
|
+
&block
|
|
59
|
+
)
|
|
60
|
+
command_name = { default: command_name } if command_name.is_a?(String)
|
|
61
|
+
description = { default: description } if description.is_a?(String)
|
|
62
|
+
command_name = ApplicationCommand.modify_localization_hash(command_name)
|
|
63
|
+
description = ApplicationCommand.modify_localization_hash(description)
|
|
64
|
+
command = Discorb::ApplicationCommand::Command::ChatInputCommand.new(
|
|
65
|
+
command_name,
|
|
66
|
+
description,
|
|
67
|
+
options,
|
|
68
|
+
guild_ids,
|
|
69
|
+
block,
|
|
70
|
+
1,
|
|
71
|
+
nil,
|
|
72
|
+
dm_permission,
|
|
73
|
+
default_permission
|
|
74
|
+
)
|
|
42
75
|
@commands << command
|
|
43
|
-
@
|
|
76
|
+
@callable_commands << command
|
|
44
77
|
command
|
|
45
78
|
end
|
|
46
79
|
|
|
47
80
|
#
|
|
48
81
|
# Add new command with group.
|
|
49
82
|
#
|
|
50
|
-
# @param [String] command_name Command name.
|
|
51
|
-
# @param [String] description Command description.
|
|
52
|
-
# @param [Array<#to_s>, false, nil] guild_ids
|
|
83
|
+
# @param [String, Hash{Symbol => String}] command_name Command name.
|
|
84
|
+
# @param [String, Hash{Symbol => String}] description Command description.
|
|
85
|
+
# @param [Array<#to_s>, false, nil] guild_ids
|
|
86
|
+
# Guild IDs to set the command to. `false` to global command, `nil` to use default.
|
|
87
|
+
# @param [Boolean] dm_permission Whether the command is available in DM.
|
|
88
|
+
# @param [Discorb::Permission] default_permission The default permission of the command.
|
|
53
89
|
#
|
|
54
90
|
# @yield Block to yield with the command.
|
|
55
91
|
# @yieldparam [Discorb::ApplicationCommand::Command::GroupCommand] group Group command.
|
|
@@ -59,9 +95,14 @@ module Discorb
|
|
|
59
95
|
# @see file:docs/application_command.md Application Commands
|
|
60
96
|
# @see file:docs/cli/setup.md CLI: setup
|
|
61
97
|
#
|
|
62
|
-
def slash_group(command_name, description, guild_ids: nil, &block)
|
|
63
|
-
|
|
64
|
-
|
|
98
|
+
def slash_group(command_name, description, guild_ids: nil, dm_permission: true, default_permission: nil, &block)
|
|
99
|
+
command_name = { default: command_name } if command_name.is_a?(String)
|
|
100
|
+
description = { default: description } if description.is_a?(String)
|
|
101
|
+
command_name = ApplicationCommand.modify_localization_hash(command_name)
|
|
102
|
+
description = ApplicationCommand.modify_localization_hash(description)
|
|
103
|
+
command = Discorb::ApplicationCommand::Command::GroupCommand.new(command_name, description, guild_ids, nil,
|
|
104
|
+
self, dm_permission, default_permission)
|
|
105
|
+
command.then(&block) if block_given?
|
|
65
106
|
@commands << command
|
|
66
107
|
command
|
|
67
108
|
end
|
|
@@ -69,8 +110,11 @@ module Discorb
|
|
|
69
110
|
#
|
|
70
111
|
# Add message context menu command.
|
|
71
112
|
#
|
|
72
|
-
# @param [String] command_name Command name.
|
|
73
|
-
# @param [Array<#to_s>, false, nil] guild_ids
|
|
113
|
+
# @param [String, Hash{Symbol => String}] command_name Command name.
|
|
114
|
+
# @param [Array<#to_s>, false, nil] guild_ids
|
|
115
|
+
# Guild IDs to set the command to. `false` to global command, `nil` to use default.
|
|
116
|
+
# @param [Boolean] dm_permission Whether the command is available in DM.
|
|
117
|
+
# @param [Discorb::Permission] default_permission The default permission of the command.
|
|
74
118
|
# @param [Proc] block Command block.
|
|
75
119
|
# @yield [interaction, message] Block to execute.
|
|
76
120
|
# @yieldparam [Discorb::CommandInteraction::UserMenuCommand] interaction Interaction object.
|
|
@@ -78,8 +122,11 @@ module Discorb
|
|
|
78
122
|
#
|
|
79
123
|
# @return [Discorb::ApplicationCommand::Command] Command object.
|
|
80
124
|
#
|
|
81
|
-
def message_command(command_name, guild_ids: nil, &block)
|
|
82
|
-
|
|
125
|
+
def message_command(command_name, guild_ids: nil, dm_permission: true, default_permission: nil, &block)
|
|
126
|
+
command_name = { default: command_name } if command_name.is_a?(String)
|
|
127
|
+
command_name = ApplicationCommand.modify_localization_hash(command_name)
|
|
128
|
+
command = Discorb::ApplicationCommand::Command.new(command_name, guild_ids, block, 3, dm_permission,
|
|
129
|
+
default_permission)
|
|
83
130
|
@commands << command
|
|
84
131
|
command
|
|
85
132
|
end
|
|
@@ -87,8 +134,11 @@ module Discorb
|
|
|
87
134
|
#
|
|
88
135
|
# Add user context menu command.
|
|
89
136
|
#
|
|
90
|
-
# @param [String] command_name Command name.
|
|
91
|
-
# @param [Array<#to_s>, false, nil] guild_ids
|
|
137
|
+
# @param [String, Hash{Symbol => String}] command_name Command name.
|
|
138
|
+
# @param [Array<#to_s>, false, nil] guild_ids
|
|
139
|
+
# Guild IDs to set the command to. `false` to global command, `nil` to use default.
|
|
140
|
+
# @param [Boolean] dm_permission Whether the command is available in DM.
|
|
141
|
+
# @param [Discorb::Permission] default_permission The default permission of the command.
|
|
92
142
|
# @param [Proc] block Command block.
|
|
93
143
|
# @yield [interaction, user] Block to execute.
|
|
94
144
|
# @yieldparam [Discorb::CommandInteraction::UserMenuCommand] interaction Interaction object.
|
|
@@ -96,8 +146,11 @@ module Discorb
|
|
|
96
146
|
#
|
|
97
147
|
# @return [Discorb::ApplicationCommand::Command] Command object.
|
|
98
148
|
#
|
|
99
|
-
def user_command(command_name, guild_ids: nil, &block)
|
|
100
|
-
|
|
149
|
+
def user_command(command_name, guild_ids: nil, dm_permission: true, default_permission: nil, &block)
|
|
150
|
+
command_name = { default: command_name } if command_name.is_a?(String)
|
|
151
|
+
command_name = ApplicationCommand.modify_localization_hash(command_name)
|
|
152
|
+
command = Discorb::ApplicationCommand::Command.new(command_name, guild_ids, block, 2, dm_permission,
|
|
153
|
+
default_permission)
|
|
101
154
|
@commands << command
|
|
102
155
|
command
|
|
103
156
|
end
|
|
@@ -108,7 +161,8 @@ module Discorb
|
|
|
108
161
|
# @see Client#initialize
|
|
109
162
|
#
|
|
110
163
|
# @param [String] token Bot token.
|
|
111
|
-
# @param [Array<#to_s>, false, nil] guild_ids
|
|
164
|
+
# @param [Array<#to_s>, false, nil] guild_ids
|
|
165
|
+
# Guild IDs to use as default. If `false` is given, it will be global command.
|
|
112
166
|
#
|
|
113
167
|
# @note `token` parameter only required if you don't run client.
|
|
114
168
|
#
|
|
@@ -139,10 +193,10 @@ module Discorb
|
|
|
139
193
|
global_commands.map(&:to_hash)
|
|
140
194
|
).wait
|
|
141
195
|
end
|
|
142
|
-
if ENV
|
|
196
|
+
if ENV.fetch("DISCORB_CLI_FLAG", nil) == "setup"
|
|
143
197
|
sputs "Registered commands for global:"
|
|
144
198
|
global_commands.each do |command|
|
|
145
|
-
iputs "- #{command.name}"
|
|
199
|
+
iputs "- #{command.name["default"]}"
|
|
146
200
|
end
|
|
147
201
|
end
|
|
148
202
|
unless final_guild_ids.empty?
|
|
@@ -156,13 +210,41 @@ module Discorb
|
|
|
156
210
|
).wait
|
|
157
211
|
sputs "Registered commands for #{guild_id}:"
|
|
158
212
|
commands.each do |command|
|
|
159
|
-
iputs "- #{command.name}"
|
|
213
|
+
iputs "- #{command.name["default"]}"
|
|
160
214
|
end
|
|
161
215
|
end
|
|
162
216
|
end
|
|
163
217
|
@logger.info "Successfully setup commands"
|
|
164
218
|
end
|
|
165
219
|
end
|
|
220
|
+
|
|
221
|
+
#
|
|
222
|
+
# Claer commands in specified guilds.
|
|
223
|
+
# @async
|
|
224
|
+
# @see Client#initialize
|
|
225
|
+
#
|
|
226
|
+
# @param [String] token Bot token.
|
|
227
|
+
# @param [Array<#to_s>, false, nil] guild_ids Guild IDs to clear.
|
|
228
|
+
#
|
|
229
|
+
# @note `token` parameter only required if you don't run client.
|
|
230
|
+
#
|
|
231
|
+
def clear_commands(token, guild_ids)
|
|
232
|
+
Async do
|
|
233
|
+
@token ||= token
|
|
234
|
+
@http = HTTP.new(self)
|
|
235
|
+
app_info = fetch_application.wait
|
|
236
|
+
|
|
237
|
+
guild_ids.each do |guild_id|
|
|
238
|
+
@http.request(
|
|
239
|
+
Route.new("/applications/#{app_info.id}/guilds/#{guild_id}/commands",
|
|
240
|
+
"//applications/:application_id/guilds/:guild_id/commands",
|
|
241
|
+
:put),
|
|
242
|
+
[]
|
|
243
|
+
).wait
|
|
244
|
+
end
|
|
245
|
+
sputs "Cleared commands for #{guild_ids.length} guilds." if ENV.fetch("DISCORB_CLI_FLAG", nil) == "setup"
|
|
246
|
+
end
|
|
247
|
+
end
|
|
166
248
|
end
|
|
167
249
|
end
|
|
168
250
|
end
|
data/lib/discorb/app_command.rb
CHANGED
data/lib/discorb/application.rb
CHANGED
data/lib/discorb/asset.rb
CHANGED
|
@@ -51,7 +51,7 @@ module Discorb
|
|
|
51
51
|
case @target
|
|
52
52
|
when User, Member, Webhook
|
|
53
53
|
"avatars"
|
|
54
|
-
when Guild,
|
|
54
|
+
when Guild, Webhook::FollowerWebhook::Guild
|
|
55
55
|
"icons"
|
|
56
56
|
when Application, Integration::Application
|
|
57
57
|
"app-icons"
|
|
@@ -65,7 +65,6 @@ module Discorb
|
|
|
65
65
|
# Represents a default avatar.
|
|
66
66
|
#
|
|
67
67
|
class DefaultAvatar < DiscordModel
|
|
68
|
-
|
|
69
68
|
# @!attribute [r] animated?
|
|
70
69
|
# @return [false] For compatibility with {Asset}, always `false`.
|
|
71
70
|
|
data/lib/discorb/attachment.rb
CHANGED
|
@@ -70,7 +70,7 @@ module Discorb
|
|
|
70
70
|
def initialize_hash(data)
|
|
71
71
|
@id = Snowflake.new(data[:id])
|
|
72
72
|
@filename = data[:filename]
|
|
73
|
-
@content_type = data[:content_type]
|
|
73
|
+
@content_type = data[:content_type] || "application/octet-stream"
|
|
74
74
|
@size = data[:size]
|
|
75
75
|
@url = data[:url]
|
|
76
76
|
@proxy_url = data[:proxy_url]
|
data/lib/discorb/audit_logs.rb
CHANGED
|
@@ -21,9 +21,11 @@ module Discorb
|
|
|
21
21
|
def initialize(client, data, guild)
|
|
22
22
|
@client = client
|
|
23
23
|
@guild = guild
|
|
24
|
-
@webhooks = data[:webhooks].map { |webhook| Webhook.
|
|
24
|
+
@webhooks = data[:webhooks].map { |webhook| Webhook.from_data(@client, webhook) }
|
|
25
25
|
@users = data[:users].map { |user| client.users[user[:id]] || User.new(@client, user) }
|
|
26
|
-
@threads = data[:threads].map
|
|
26
|
+
@threads = data[:threads].map do |thread|
|
|
27
|
+
client.channels[thread[:id]] || Channel.make_channel(@client, thread, no_cache: true)
|
|
28
|
+
end
|
|
27
29
|
@entries = data[:audit_log_entries].map { |entry| AuditLog::Entry.new(@client, entry, guild.id) }
|
|
28
30
|
end
|
|
29
31
|
|
|
@@ -106,7 +108,8 @@ module Discorb
|
|
|
106
108
|
attr_reader :type
|
|
107
109
|
# @return [Discorb::AuditLog::Entry::Changes] The changes in this entry.
|
|
108
110
|
attr_reader :changes
|
|
109
|
-
# @return [Discorb::Channel, Discorb::Role, Discorb::Member, Discorb::Guild, Discorb::Message]
|
|
111
|
+
# @return [Discorb::Channel, Discorb::Role, Discorb::Member, Discorb::Guild, Discorb::Message]
|
|
112
|
+
# The target of the entry.
|
|
110
113
|
attr_reader :target
|
|
111
114
|
# @return [Hash{Symbol => Object}] The optional data for this entry.
|
|
112
115
|
# @note You can use dot notation to access the data.
|
|
@@ -193,7 +196,7 @@ module Discorb
|
|
|
193
196
|
@user_id = Snowflake.new(data[:user_id])
|
|
194
197
|
@target_id = Snowflake.new(data[:target_id])
|
|
195
198
|
@type = EVENTS[data[:action_type]]
|
|
196
|
-
@target =
|
|
199
|
+
@target = CONVERTERS[@type.to_s.split("_")[0].to_sym]&.call(client, @target_id, @gui)
|
|
197
200
|
@target ||= Snowflake.new(data[:target_id])
|
|
198
201
|
@changes = data[:changes] && Changes.new(data[:changes])
|
|
199
202
|
@reason = data[:reason]
|
|
@@ -201,7 +204,7 @@ module Discorb
|
|
|
201
204
|
define_singleton_method(option) { value }
|
|
202
205
|
if option.end_with?("_id")
|
|
203
206
|
define_singleton_method(option.to_s.sub("_id", "")) do
|
|
204
|
-
|
|
207
|
+
CONVERTERS[option.to_s.split("_")[0].to_sym]&.call(client, value, @guild_id)
|
|
205
208
|
end
|
|
206
209
|
end
|
|
207
210
|
end
|
|
@@ -304,11 +307,11 @@ module Discorb
|
|
|
304
307
|
when "permissions"
|
|
305
308
|
->(v) { Discorb::Permission.new(v.to_i) }
|
|
306
309
|
when "status"
|
|
307
|
-
->(v) { Discorb::ScheduledEvent
|
|
310
|
+
->(v) { Discorb::ScheduledEvent::STATUS[v] }
|
|
308
311
|
when "entity_type"
|
|
309
|
-
->(v) { Discorb::ScheduledEvent
|
|
312
|
+
->(v) { Discorb::ScheduledEvent::ENTITY_TYPE[v] }
|
|
310
313
|
when "privacy_level"
|
|
311
|
-
->(v) { Discorb::StageInstance
|
|
314
|
+
->(v) { Discorb::StageInstance::PRIVACY_LEVEL[v] || Discorb::ScheduledEvent::PRIVACY_LEVEL[v] }
|
|
312
315
|
else
|
|
313
316
|
->(v) { v }
|
|
314
317
|
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Discorb
|
|
4
|
+
#
|
|
5
|
+
# Represents a channel of Discord.
|
|
6
|
+
# @abstract
|
|
7
|
+
#
|
|
8
|
+
class Channel < DiscordModel
|
|
9
|
+
# @return [Discorb::Snowflake] The ID of the channel.
|
|
10
|
+
attr_reader :id
|
|
11
|
+
# @return [String] The name of the channel.
|
|
12
|
+
attr_reader :name
|
|
13
|
+
|
|
14
|
+
# @!attribute [r] type
|
|
15
|
+
# @return [Integer] The type of the channel as integer.
|
|
16
|
+
|
|
17
|
+
@channel_type = nil
|
|
18
|
+
@subclasses = []
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
# Initializes a new instance of the Channel class.
|
|
22
|
+
# @private
|
|
23
|
+
#
|
|
24
|
+
def initialize(client, data, no_cache: false)
|
|
25
|
+
@client = client
|
|
26
|
+
@data = {}
|
|
27
|
+
@no_cache = no_cache
|
|
28
|
+
_set_data(data)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
#
|
|
32
|
+
# Checks if the channel is other channel.
|
|
33
|
+
#
|
|
34
|
+
# @param [Discorb::Channel] other The channel to check.
|
|
35
|
+
#
|
|
36
|
+
# @return [Boolean] True if the channel is other channel.
|
|
37
|
+
#
|
|
38
|
+
def ==(other)
|
|
39
|
+
return false unless other.respond_to?(:id)
|
|
40
|
+
|
|
41
|
+
@id == other.id
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def inspect
|
|
45
|
+
"#<#{self.class} \"##{@name}\" id=#{@id}>"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# Returns the descendants of the Channel class.
|
|
50
|
+
# @private
|
|
51
|
+
#
|
|
52
|
+
def self.descendants
|
|
53
|
+
ObjectSpace.each_object(Class).select { |klass| klass < self }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# Creates a new instance of the Channel class or instance of its descendants.
|
|
58
|
+
# @private
|
|
59
|
+
#
|
|
60
|
+
# @param [Discorb::Client] client The client that instantiated the object.
|
|
61
|
+
# @param [Hash] data The data of the object.
|
|
62
|
+
# @param [Boolean] no_cache Whether to disable cache the object.
|
|
63
|
+
#
|
|
64
|
+
def self.make_channel(client, data, no_cache: false)
|
|
65
|
+
descendants.each do |klass|
|
|
66
|
+
if !klass.channel_type.nil? && klass.channel_type == data[:type]
|
|
67
|
+
return klass.new(client, data,
|
|
68
|
+
no_cache: no_cache)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
client.logger.warn("Unknown channel type #{data[:type]}, initialized GuildChannel")
|
|
72
|
+
GuildChannel.new(client, data)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
class << self
|
|
76
|
+
#
|
|
77
|
+
# @private
|
|
78
|
+
# @return [Integer] The type of the channel.
|
|
79
|
+
#
|
|
80
|
+
attr_reader :channel_type
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def type
|
|
84
|
+
self.class.channel_type
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
#
|
|
88
|
+
# Returns the channel id to request.
|
|
89
|
+
# @private
|
|
90
|
+
#
|
|
91
|
+
# @return [Async::Task<Discorb::Snowflake>] A task that resolves to the channel id.
|
|
92
|
+
#
|
|
93
|
+
def channel_id
|
|
94
|
+
Async do
|
|
95
|
+
@id
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
private
|
|
100
|
+
|
|
101
|
+
def _set_data(data)
|
|
102
|
+
@id = Snowflake.new(data[:id])
|
|
103
|
+
@name = data[:name]
|
|
104
|
+
@client.channels[@id] = self if !@no_cache && !(data[:no_cache])
|
|
105
|
+
@data.update(data)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Discorb
|
|
4
|
+
#
|
|
5
|
+
# Represents a category in a guild.
|
|
6
|
+
#
|
|
7
|
+
class CategoryChannel < GuildChannel
|
|
8
|
+
@channel_type = 4
|
|
9
|
+
|
|
10
|
+
include Discorb::ChannelContainer
|
|
11
|
+
|
|
12
|
+
def channels
|
|
13
|
+
@client.channels.values.filter { |channel| channel.parent == self }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def create_text_channel(*args, **kwargs)
|
|
17
|
+
guild.create_text_channel(*args, parent: self, **kwargs)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def create_voice_channel(*args, **kwargs)
|
|
21
|
+
guild.create_voice_channel(*args, parent: self, **kwargs)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def create_news_channel(*args, **kwargs)
|
|
25
|
+
guild.create_news_channel(*args, parent: self, **kwargs)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def create_stage_channel(*args, **kwargs)
|
|
29
|
+
guild.create_stage_channel(*args, parent: self, **kwargs)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Discorb
|
|
4
|
+
#
|
|
5
|
+
# Module for container of channels.
|
|
6
|
+
#
|
|
7
|
+
module ChannelContainer
|
|
8
|
+
#
|
|
9
|
+
# Returns text channels.
|
|
10
|
+
#
|
|
11
|
+
# @return [Array<Discorb::TextChannel>] The text channels.
|
|
12
|
+
#
|
|
13
|
+
def text_channels
|
|
14
|
+
channels.filter { |c| c.instance_of? TextChannel }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
#
|
|
18
|
+
# Returns voice channels.
|
|
19
|
+
#
|
|
20
|
+
# @return [Array<Discorb::VoiceChannel>] The voice channels.
|
|
21
|
+
#
|
|
22
|
+
def voice_channels
|
|
23
|
+
channels.filter { |c| c.instance_of? VoiceChannel }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
#
|
|
27
|
+
# Returns news channels.
|
|
28
|
+
#
|
|
29
|
+
# @return [Array<Discorb::NewsChannel>] The news channels.
|
|
30
|
+
#
|
|
31
|
+
def news_channels
|
|
32
|
+
channels.filter { |c| c.instance_of? NewsChannel }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Returns stage channels.
|
|
37
|
+
#
|
|
38
|
+
# @return [Array<Discorb::StageChannel>] The stage channels.
|
|
39
|
+
#
|
|
40
|
+
def stage_channels
|
|
41
|
+
channels.filter { |c| c.instance_of? StageChannel }
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Discorb
|
|
4
|
+
#
|
|
5
|
+
# Represents a DM channel.
|
|
6
|
+
#
|
|
7
|
+
class DMChannel < Channel
|
|
8
|
+
include Messageable
|
|
9
|
+
|
|
10
|
+
#
|
|
11
|
+
# Returns the channel id to request.
|
|
12
|
+
# @private
|
|
13
|
+
#
|
|
14
|
+
# @return [Async::Task<Discorb::Snowflake>] A task that resolves to the channel id.
|
|
15
|
+
#
|
|
16
|
+
def channel_id
|
|
17
|
+
Async do
|
|
18
|
+
@id
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def _set_data(data)
|
|
25
|
+
@id = Snowflake.new(data)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|