discorb 0.16.0 → 0.18.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 +2 -4
- data/.github/workflows/spec.yml +33 -0
- data/.github/workflows/validate.yml +21 -0
- data/.gitignore +2 -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 +30 -1
- data/Gemfile +20 -8
- data/Rakefile +226 -98
- data/Steepfile +28 -0
- data/bin/console +3 -3
- data/docs/Examples.md +1 -1
- data/docs/application_command.md +156 -47
- 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 +247 -213
- data/docs/extension.md +1 -2
- data/docs/faq.md +0 -1
- data/docs/tutorial.md +18 -18
- data/docs/voice_events.md +106 -106
- data/examples/commands/message.rb +68 -0
- data/examples/commands/permission.rb +19 -0
- data/examples/commands/slash.rb +48 -0
- data/examples/commands/user.rb +54 -0
- data/examples/components/authorization_button.rb +4 -3
- data/examples/components/select_menu.rb +6 -3
- data/examples/extension/main.rb +2 -1
- data/examples/extension/message_expander.rb +6 -2
- data/examples/sig/commands/message.rbs +5 -0
- data/examples/simple/eval.rb +3 -2
- data/examples/simple/ping_pong.rb +2 -1
- data/examples/simple/rolepanel.rb +17 -6
- data/examples/simple/shard.rb +3 -2
- data/examples/simple/wait_for_message.rb +4 -1
- data/exe/discorb +33 -18
- data/lefthook.yml +45 -0
- data/lib/discorb/allowed_mentions.rb +2 -1
- data/lib/discorb/app_command/command.rb +130 -72
- data/lib/discorb/app_command/common.rb +25 -0
- data/lib/discorb/app_command/handler.rb +130 -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 +19 -10
- data/lib/discorb/automod.rb +269 -0
- 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 +246 -0
- data/lib/discorb/channel/stage.rb +140 -0
- data/lib/discorb/channel/text.rb +336 -0
- data/lib/discorb/channel/thread.rb +325 -0
- data/lib/discorb/channel/voice.rb +79 -0
- data/lib/discorb/channel.rb +2 -1165
- data/lib/discorb/client.rb +50 -36
- data/lib/discorb/color.rb +37 -60
- 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/dictionary.rb +1 -1
- data/lib/discorb/embed.rb +26 -10
- data/lib/discorb/emoji.rb +31 -4
- data/lib/discorb/emoji_table.rb +4969 -3
- data/lib/discorb/event.rb +29 -4
- data/lib/discorb/exe/about.rb +2 -1
- data/lib/discorb/exe/irb.rb +2 -4
- data/lib/discorb/exe/new.rb +89 -26
- 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 -7
- data/lib/discorb/flag.rb +13 -2
- data/lib/discorb/gateway.rb +79 -589
- data/lib/discorb/gateway_events.rb +638 -0
- data/lib/discorb/guild.rb +318 -67
- data/lib/discorb/guild_template.rb +11 -5
- data/lib/discorb/http.rb +53 -24
- data/lib/discorb/integration.rb +4 -1
- data/lib/discorb/intents.rb +28 -19
- data/lib/discorb/interaction/autocomplete.rb +28 -16
- data/lib/discorb/interaction/command.rb +42 -14
- data/lib/discorb/interaction/components.rb +5 -2
- data/lib/discorb/interaction/modal.rb +0 -1
- data/lib/discorb/interaction/response.rb +125 -26
- 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 +28 -8
- data/lib/discorb/message.rb +60 -25
- data/lib/discorb/message_meta.rb +3 -3
- data/lib/discorb/modules.rb +59 -16
- data/lib/discorb/presence.rb +2 -0
- data/lib/discorb/rate_limit.rb +7 -2
- data/lib/discorb/reaction.rb +2 -2
- data/lib/discorb/role.rb +20 -5
- data/lib/discorb/shard.rb +1 -1
- data/lib/discorb/sticker.rb +9 -8
- data/lib/discorb/user.rb +4 -3
- data/lib/discorb/utils/colored_puts.rb +1 -0
- data/lib/discorb/voice_state.rb +6 -2
- data/lib/discorb/webhook.rb +64 -31
- data/lib/discorb.rb +7 -5
- data/po/yard.pot +20 -20
- data/rbs_collection.lock.yaml +88 -0
- data/rbs_collection.yaml +21 -0
- data/sig/async.rbs +11 -0
- data/sig/discorb/activity.rbs +23 -0
- data/sig/discorb/allowed_mentions.rbs +44 -0
- data/sig/discorb/app_command/base.rbs +282 -0
- data/sig/discorb/app_command/handler.rbs +171 -0
- data/sig/discorb/application.rbs +142 -0
- data/sig/discorb/asset.rbs +32 -0
- data/sig/discorb/attachment.rbs +91 -0
- data/sig/discorb/audit_log.rbs +231 -0
- data/sig/discorb/automod.rbs +128 -0
- data/sig/discorb/avatar.rbs +26 -0
- data/sig/discorb/channel/base.rbs +179 -0
- data/sig/discorb/channel/category.rbs +56 -0
- data/sig/discorb/channel/container.rbs +29 -0
- data/sig/discorb/channel/dm.rbs +14 -0
- data/sig/discorb/channel/news.rbs +20 -0
- data/sig/discorb/channel/stage.rbs +77 -0
- data/sig/discorb/channel/text.rbs +158 -0
- data/sig/discorb/channel/thread.rbs +185 -0
- data/sig/discorb/channel/voice.rbs +41 -0
- data/sig/discorb/client.rbs +2495 -0
- data/sig/discorb/color.rbs +142 -0
- data/sig/discorb/component/base.rbs +28 -0
- data/sig/discorb/component/button.rbs +65 -0
- data/sig/discorb/component/select_menu.rbs +107 -0
- data/sig/discorb/component/text_input.rbs +69 -0
- data/sig/discorb/connectable.rbs +8 -0
- data/sig/discorb/custom_emoji.rbs +90 -0
- data/sig/discorb/dictionary.rbs +85 -0
- data/sig/discorb/discord_model.rbs +15 -0
- data/sig/discorb/embed.rbs +279 -0
- data/sig/discorb/emoji.rbs +13 -0
- data/sig/discorb/error.rbs +73 -0
- data/sig/discorb/event_handler.rbs +27 -0
- data/sig/discorb/extension.rbs +1734 -0
- data/sig/discorb/flag.rbs +72 -0
- data/sig/discorb/gateway.rbs +481 -0
- data/sig/discorb/guild.rbs +870 -0
- data/sig/discorb/guild_template.rbs +174 -0
- data/sig/discorb/http.rbs +147 -0
- data/sig/discorb/image.rbs +20 -0
- data/sig/discorb/integration.rbs +118 -0
- data/sig/discorb/intents.rbs +97 -0
- data/sig/discorb/interaction/autocomplete.rbs +9 -0
- data/sig/discorb/interaction/base.rbs +66 -0
- data/sig/discorb/interaction/command.rbs +66 -0
- data/sig/discorb/interaction/message_component.rbs +140 -0
- data/sig/discorb/interaction/modal.rbs +50 -0
- data/sig/discorb/interaction/responder.rbs +157 -0
- data/sig/discorb/invite.rbs +86 -0
- data/sig/discorb/member.rbs +187 -0
- data/sig/discorb/message.rbs +469 -0
- data/sig/discorb/messageable.rbs +153 -0
- data/sig/discorb/partial_emoji.rbs +35 -0
- data/sig/discorb/permissions.rbs +149 -0
- data/sig/discorb/presence.rbs +237 -0
- data/sig/discorb/reaction.rbs +33 -0
- data/sig/discorb/role.rbs +145 -0
- data/sig/discorb/scheduled_event.rbs +148 -0
- data/sig/discorb/shard.rbs +62 -0
- data/sig/discorb/snowflake.rbs +56 -0
- data/sig/discorb/stage_instance.rbs +63 -0
- data/sig/discorb/sticker.rbs +116 -0
- data/sig/discorb/system_channel_flag.rbs +17 -0
- data/sig/discorb/unicode_emoji.rbs +49 -0
- data/sig/discorb/user.rbs +93 -0
- data/sig/discorb/utils.rbs +8 -0
- data/sig/discorb/voice_region.rbs +30 -0
- data/sig/discorb/voice_state.rbs +71 -0
- data/sig/discorb/webhook.rbs +327 -0
- data/sig/discorb/welcome_screen.rbs +78 -0
- data/sig/discorb.rbs +6 -7230
- data/sig/manifest.yaml +3 -0
- data/sig/override.rbs +19 -0
- data/template-replace/files/css/common.css +4 -0
- metadata +102 -6
- data/examples/commands/bookmarker.rb +0 -42
- data/examples/commands/hello.rb +0 -10
- data/examples/commands/inspect.rb +0 -25
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
|
|
@@ -103,10 +105,12 @@ module Discorb
|
|
103
105
|
# * `:thread_create`
|
104
106
|
# * `:thread_update`
|
105
107
|
# * `:thread_delete`
|
108
|
+
# * `:application_command_permission_update``
|
106
109
|
attr_reader :type
|
107
110
|
# @return [Discorb::AuditLog::Entry::Changes] The changes in this entry.
|
108
111
|
attr_reader :changes
|
109
|
-
# @return [Discorb::Channel, Discorb::Role, Discorb::Member, Discorb::Guild, Discorb::Message]
|
112
|
+
# @return [Discorb::Channel, Discorb::Role, Discorb::Member, Discorb::Guild, Discorb::Message, Discorb::Snowflake]
|
113
|
+
# The target of the entry.
|
110
114
|
attr_reader :target
|
111
115
|
# @return [Hash{Symbol => Object}] The optional data for this entry.
|
112
116
|
# @note You can use dot notation to access the data.
|
@@ -167,6 +171,11 @@ module Discorb
|
|
167
171
|
110 => :thread_create,
|
168
172
|
111 => :thread_update,
|
169
173
|
112 => :thread_delete,
|
174
|
+
121 => :application_command_permission_update,
|
175
|
+
140 => :automod_rule_create,
|
176
|
+
141 => :automod_rule_update,
|
177
|
+
142 => :automod_rule_delete,
|
178
|
+
143 => :automod_block_message,
|
170
179
|
}.freeze
|
171
180
|
|
172
181
|
#
|
@@ -192,16 +201,16 @@ module Discorb
|
|
192
201
|
@id = Snowflake.new(data[:id])
|
193
202
|
@user_id = Snowflake.new(data[:user_id])
|
194
203
|
@target_id = Snowflake.new(data[:target_id])
|
195
|
-
@type = EVENTS[data[:action_type]]
|
196
|
-
@target =
|
204
|
+
@type = EVENTS[data[:action_type]] || :unknown
|
205
|
+
@target = CONVERTERS[@type.to_s.split("_")[0].to_sym]&.call(client, @target_id, @gui)
|
197
206
|
@target ||= Snowflake.new(data[:target_id])
|
198
207
|
@changes = data[:changes] && Changes.new(data[:changes])
|
199
208
|
@reason = data[:reason]
|
200
209
|
data[:options]&.each do |option, value|
|
201
210
|
define_singleton_method(option) { value }
|
202
|
-
if option.end_with?("_id")
|
211
|
+
if option.end_with?("_id") && CONVERTERS.key?(option.to_s.split("_")[0].to_sym)
|
203
212
|
define_singleton_method(option.to_s.sub("_id", "")) do
|
204
|
-
|
213
|
+
CONVERTERS[option.to_s.split("_")[0].to_sym]&.call(client, value, @guild_id)
|
205
214
|
end
|
206
215
|
end
|
207
216
|
end
|
@@ -304,11 +313,11 @@ module Discorb
|
|
304
313
|
when "permissions"
|
305
314
|
->(v) { Discorb::Permission.new(v.to_i) }
|
306
315
|
when "status"
|
307
|
-
->(v) { Discorb::ScheduledEvent
|
316
|
+
->(v) { Discorb::ScheduledEvent::STATUS[v] }
|
308
317
|
when "entity_type"
|
309
|
-
->(v) { Discorb::ScheduledEvent
|
318
|
+
->(v) { Discorb::ScheduledEvent::ENTITY_TYPE[v] }
|
310
319
|
when "privacy_level"
|
311
|
-
->(v) { Discorb::StageInstance
|
320
|
+
->(v) { Discorb::StageInstance::PRIVACY_LEVEL[v] || Discorb::ScheduledEvent::PRIVACY_LEVEL[v] }
|
312
321
|
else
|
313
322
|
->(v) { v }
|
314
323
|
end
|
@@ -0,0 +1,269 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Discorb
|
4
|
+
#
|
5
|
+
# Represents a rule of auto moderation.
|
6
|
+
#
|
7
|
+
class AutoModRule < DiscordModel
|
8
|
+
# @return [Hash{Integer => Symbol}] The mapping of trigger types.
|
9
|
+
# @private
|
10
|
+
TRIGGER_TYPES = {
|
11
|
+
1 => :keyword,
|
12
|
+
2 => :harmful_link,
|
13
|
+
3 => :spam,
|
14
|
+
4 => :keyword_preset,
|
15
|
+
}.freeze
|
16
|
+
# @return [Hash{Integer => Symbol}] The mapping of preset types.
|
17
|
+
# @private
|
18
|
+
PRESET_TYPES = {
|
19
|
+
1 => :profanity,
|
20
|
+
2 => :sexual_content,
|
21
|
+
3 => :slurs,
|
22
|
+
}.freeze
|
23
|
+
# @return [Hash{Integer => Symbol}] The mapping of event types.
|
24
|
+
# @private
|
25
|
+
EVENT_TYPES = {
|
26
|
+
1 => :message_send,
|
27
|
+
}.freeze
|
28
|
+
|
29
|
+
# @return [Discorb::Snowflake] The ID of the rule.
|
30
|
+
attr_reader :id
|
31
|
+
# @return [String] The name of the rule.
|
32
|
+
attr_reader :name
|
33
|
+
# @return [Boolean] Whether the rule is enabled.
|
34
|
+
attr_reader :enabled
|
35
|
+
alias enabled? enabled
|
36
|
+
# @return [Array<Discorb::AutoModRule::Action>] The actions of the rule.
|
37
|
+
attr_reader :actions
|
38
|
+
# @return [Array<String>] The keywords that the rule is triggered by.
|
39
|
+
# @note This is only available if the trigger type is `:keyword`.
|
40
|
+
attr_reader :keyword_filter
|
41
|
+
|
42
|
+
#
|
43
|
+
# Initialize a new auto mod.
|
44
|
+
# @private
|
45
|
+
#
|
46
|
+
# @param [Discorb::Client] client The client.
|
47
|
+
# @param [Hash] data The auto mod data.
|
48
|
+
#
|
49
|
+
def initialize(client, data)
|
50
|
+
@client = client
|
51
|
+
_set_data(data)
|
52
|
+
end
|
53
|
+
|
54
|
+
# @!attribute [r]
|
55
|
+
# @return [Symbol] Returns the type of the preset.
|
56
|
+
# @note This is only available if the trigger type is `:keyword_preset`.
|
57
|
+
def preset_type
|
58
|
+
PRESET_TYPES[@presets_raw]
|
59
|
+
end
|
60
|
+
|
61
|
+
# @!attribute [r]
|
62
|
+
# @return [Symbol] Returns the type of the trigger.
|
63
|
+
def trigger_type
|
64
|
+
TRIGGER_TYPES[@trigger_type_raw]
|
65
|
+
end
|
66
|
+
|
67
|
+
# @!attribute [r]
|
68
|
+
# @return [Symbol] Returns the type of the event.
|
69
|
+
def event_type
|
70
|
+
EVENT_TYPES[@event_type_raw]
|
71
|
+
end
|
72
|
+
|
73
|
+
# @!attribute [r]
|
74
|
+
# @macro client_cache
|
75
|
+
# @return [Discorb::Member] The member who created the rule.
|
76
|
+
def creator
|
77
|
+
guild.members[@creator_id]
|
78
|
+
end
|
79
|
+
|
80
|
+
# @!attribute [r]
|
81
|
+
# @return [Discorb::Guild] The guild that the rule is in.
|
82
|
+
def guild
|
83
|
+
@client.guilds[@guild_id]
|
84
|
+
end
|
85
|
+
|
86
|
+
# @!attribute [r]
|
87
|
+
# @return [Array<Discorb::Role>] The roles that the rule is exempt from.
|
88
|
+
def exempt_roles
|
89
|
+
@exempt_roles_id.map { |id| guild.roles[id] }
|
90
|
+
end
|
91
|
+
|
92
|
+
# @!attribute [r]
|
93
|
+
# @return [Array<Discorb::Channel>] The channels that the rule is exempt from.
|
94
|
+
def exempt_channels
|
95
|
+
@exempt_channels_id.map { |id| guild.channels[id] }
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# Edit the rule.
|
100
|
+
# @async
|
101
|
+
# @edit
|
102
|
+
#
|
103
|
+
# @param [String] name The name of the rule.
|
104
|
+
# @param [Symbol] event_type The event type of the rule. See {Discorb::AutoModRule::EVENT_TYPES}.
|
105
|
+
# @param [Array<Discorb::AutoModRule::Action>] actions The actions of the rule.
|
106
|
+
# @param [Boolean] enabled Whether the rule is enabled or not.
|
107
|
+
# @param [Array<Discorb::Role>] exempt_roles The roles that are exempt from the rule.
|
108
|
+
# @param [Array<Discorb::Channel>] exempt_channels The channels that are exempt from the rule.
|
109
|
+
# @param [Array<String>] keyword_filter The keywords to filter.
|
110
|
+
# @param [Symbol] presets The preset of the rule. See {Discorb::AutoModRule::PRESET_TYPES}.
|
111
|
+
# @param [String] reason The reason for creating the rule.
|
112
|
+
#
|
113
|
+
# @return [Async::Task<void>] The task.
|
114
|
+
#
|
115
|
+
def edit(
|
116
|
+
name: Discorb::Unset,
|
117
|
+
event_type: Discorb::Unset,
|
118
|
+
actions: Discorb::Unset,
|
119
|
+
enabled: Discorb::Unset,
|
120
|
+
exempt_roles: Discorb::Unset,
|
121
|
+
exempt_channels: Discorb::Unset,
|
122
|
+
keyword_filter: Discorb::Unset,
|
123
|
+
presets: Discorb::Unset,
|
124
|
+
reason: nil
|
125
|
+
)
|
126
|
+
# @type var payload: Hash[Symbol, untyped]
|
127
|
+
payload = {
|
128
|
+
metadata: {},
|
129
|
+
}
|
130
|
+
payload[:name] = name unless name == Discorb::Unset
|
131
|
+
payload[:event_type] = EVENT_TYPES.key(event_type) unless event_type == Discorb::Unset
|
132
|
+
payload[:actions] = actions unless actions == Discorb::Unset
|
133
|
+
payload[:enabled] = enabled unless enabled == Discorb::Unset
|
134
|
+
payload[:exempt_roles] = exempt_roles.map(&:id) unless exempt_roles == Discorb::Unset
|
135
|
+
payload[:exempt_channels] = exempt_channels.map(&:id) unless exempt_channels == Discorb::Unset
|
136
|
+
payload[:metadata][:keyword_filter] = keyword_filter unless keyword_filter == Discorb::Unset
|
137
|
+
payload[:metadata][:presets] = PRESET_TYPES.key(presets) unless presets == Discorb::Unset
|
138
|
+
|
139
|
+
@client.http.request(
|
140
|
+
Route.new(
|
141
|
+
"/guilds/#{@guild_id}/automod/rules/#{@id}",
|
142
|
+
"//guilds/:guild_id/automod/rules/:id",
|
143
|
+
:patch
|
144
|
+
),
|
145
|
+
payload,
|
146
|
+
audit_log_reason: reason,
|
147
|
+
)
|
148
|
+
end
|
149
|
+
|
150
|
+
#
|
151
|
+
# Delete the rule.
|
152
|
+
#
|
153
|
+
# @param [String] reason The reason for deleting the rule.
|
154
|
+
#
|
155
|
+
# @return [Async::Task<void>] The task.
|
156
|
+
#
|
157
|
+
def delete!(reason: nil)
|
158
|
+
Async do
|
159
|
+
@client.http.request(
|
160
|
+
Route.new(
|
161
|
+
"/guilds/#{@guild_id}/automod/rules/#{@id}",
|
162
|
+
"//guilds/:guild_id/automod/rules/:id",
|
163
|
+
:delete
|
164
|
+
),
|
165
|
+
audit_log_reason: reason,
|
166
|
+
)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
# @private
|
171
|
+
def _set_data(data)
|
172
|
+
@id = Snowflake.new(data[:id])
|
173
|
+
@guild_id = data[:guild_id]
|
174
|
+
@name = data[:name]
|
175
|
+
@creator_id = data[:creator_id]
|
176
|
+
@trigger_type_raw = data[:trigger_type]
|
177
|
+
@event_type_raw = data[:event_type]
|
178
|
+
@actions = data[:actions].map { |action| Action.from_hash(@client, action) }
|
179
|
+
case trigger_type
|
180
|
+
when :keyword
|
181
|
+
@keyword_filter = data[:trigger_metadata][:keyword_filter]
|
182
|
+
when :presets
|
183
|
+
@presets_raw = data[:trigger_metadata][:presets]
|
184
|
+
end
|
185
|
+
@enabled = data[:enabled]
|
186
|
+
@exempt_roles_id = data[:exempt_roles]
|
187
|
+
@exempt_channels_id = data[:exempt_channels]
|
188
|
+
end
|
189
|
+
|
190
|
+
#
|
191
|
+
# Represents the action of auto moderation.
|
192
|
+
#
|
193
|
+
class Action < DiscordModel
|
194
|
+
# @return [Hash{Integer => Symbol}] The mapping of action types.
|
195
|
+
# @private
|
196
|
+
ACTION_TYPES = {
|
197
|
+
1 => :block_message,
|
198
|
+
2 => :send_alert_message,
|
199
|
+
3 => :timeout,
|
200
|
+
}.freeze
|
201
|
+
|
202
|
+
# @return [Symbol] Returns the type of the action.
|
203
|
+
attr_reader :type
|
204
|
+
# @return [Integer] The duration of the timeout.
|
205
|
+
# @note This is only available if the action type is `:timeout`.
|
206
|
+
attr_reader :duration_seconds
|
207
|
+
|
208
|
+
#
|
209
|
+
# Initialize a new action.
|
210
|
+
#
|
211
|
+
# @param [Symbol] type The type of the action.
|
212
|
+
# @param [Integer] duration_seconds The duration of the timeout.
|
213
|
+
# This is only available if the action type is `:timeout`.
|
214
|
+
# @param [Discorb::Channel] channel The channel that the alert message is sent to.
|
215
|
+
# This is only available if the action type is `:send_alert_message`.
|
216
|
+
#
|
217
|
+
def initialize(type, duration_seconds: nil, channel: nil)
|
218
|
+
@type = type
|
219
|
+
@duration_seconds = duration_seconds
|
220
|
+
@channel = channel
|
221
|
+
end
|
222
|
+
|
223
|
+
#
|
224
|
+
# Convert the action to hash.
|
225
|
+
#
|
226
|
+
# @return [Hash] The action hash.
|
227
|
+
#
|
228
|
+
def to_hash
|
229
|
+
{
|
230
|
+
type: @type,
|
231
|
+
metadata: {
|
232
|
+
channel_id: @channel&.id,
|
233
|
+
duration_seconds: @duration_seconds,
|
234
|
+
},
|
235
|
+
}
|
236
|
+
end
|
237
|
+
|
238
|
+
#
|
239
|
+
# Initialize a new action from hash.
|
240
|
+
# @private
|
241
|
+
#
|
242
|
+
# @param [Discorb::Client] client The client.
|
243
|
+
# @param [Hash] data The action data.
|
244
|
+
#
|
245
|
+
def initialize_hash(client, data)
|
246
|
+
@client = client
|
247
|
+
_set_data(data)
|
248
|
+
end
|
249
|
+
|
250
|
+
# @!attribute [r]
|
251
|
+
# @return [Discorb::Channel] The channel that the alert message is sent to.
|
252
|
+
# @note This is only available if the action type is `:send_alert_message`.
|
253
|
+
def channel
|
254
|
+
@client.channels[@channel_id]
|
255
|
+
end
|
256
|
+
|
257
|
+
# @private
|
258
|
+
def _set_data(data)
|
259
|
+
@type = ACTION_TYPES[data[:type]]
|
260
|
+
@channel_id = data[:metadata][:channel_id]
|
261
|
+
@duration_seconds = data[:metadata][:duration_seconds]
|
262
|
+
end
|
263
|
+
|
264
|
+
def self.from_hash(client, data)
|
265
|
+
allocate.tap { |action| action.initialize_hash(client, data) }
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
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
|