discorb 0.12.2 → 0.13.1
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/.github/workflows/build_main.yml +1 -0
- data/.github/workflows/build_version.yml +1 -0
- data/.github/workflows/crowdin.yml +32 -0
- data/.gitignore +3 -1
- data/.yardopts +2 -0
- data/Changelog.md +399 -367
- data/Gemfile +5 -1
- data/README.md +1 -1
- data/Rakefile +139 -9
- data/crowdin.yml +2 -0
- data/discorb.gemspec +1 -1
- data/docs/Examples.md +2 -0
- data/docs/application_command.md +17 -12
- data/docs/cli/irb.md +2 -0
- data/docs/cli/new.md +2 -0
- data/docs/cli/run.md +3 -1
- data/docs/cli/setup.md +4 -2
- data/docs/cli.md +2 -0
- data/docs/events.md +59 -5
- data/docs/extension.md +2 -2
- data/docs/faq.md +4 -2
- data/docs/license.md +2 -0
- data/docs/tutorial.md +4 -3
- data/docs/voice_events.md +2 -0
- data/lib/discorb/app_command.rb +13 -7
- data/lib/discorb/application.rb +32 -2
- data/lib/discorb/audit_logs.rb +28 -16
- data/lib/discorb/channel.rb +112 -81
- data/lib/discorb/client.rb +17 -19
- data/lib/discorb/common.rb +28 -1
- data/lib/discorb/components.rb +12 -0
- data/lib/discorb/dictionary.rb +1 -1
- data/lib/discorb/embed.rb +4 -0
- data/lib/discorb/emoji.rb +9 -7
- data/lib/discorb/emoji_table.rb +3774 -3689
- data/lib/discorb/event.rb +266 -24
- data/lib/discorb/event_handler.rb +39 -0
- data/lib/discorb/exe/show.rb +2 -0
- data/lib/discorb/extension.rb +5 -5
- data/lib/discorb/file.rb +4 -0
- data/lib/discorb/flag.rb +5 -1
- data/lib/discorb/gateway.rb +65 -14
- data/lib/discorb/gateway_requests.rb +4 -0
- data/lib/discorb/guild.rb +169 -82
- data/lib/discorb/guild_template.rb +12 -9
- data/lib/discorb/http.rb +82 -37
- data/lib/discorb/image.rb +7 -5
- data/lib/discorb/integration.rb +4 -1
- data/lib/discorb/intents.rb +8 -3
- data/lib/discorb/interaction/autocomplete.rb +1 -1
- data/lib/discorb/interaction/command.rb +2 -2
- data/lib/discorb/interaction/response.rb +27 -25
- data/lib/discorb/interaction/root.rb +8 -0
- data/lib/discorb/invite.rb +3 -2
- data/lib/discorb/log.rb +4 -0
- data/lib/discorb/member.rb +42 -13
- data/lib/discorb/message.rb +32 -17
- data/lib/discorb/modules.rb +19 -26
- data/lib/discorb/permission.rb +4 -0
- data/lib/discorb/rate_limit.rb +6 -2
- data/lib/discorb/role.rb +15 -11
- data/lib/discorb/sticker.rb +17 -12
- data/lib/discorb/user.rb +8 -7
- data/lib/discorb/voice_state.rb +8 -5
- data/lib/discorb/webhook.rb +38 -47
- data/lib/discorb.rb +2 -2
- data/po/yard.pot +7775 -5157
- data/sig/discorb.rbs +3317 -3820
- data/template-replace/scripts/locale_ja.rb +62 -0
- data/template-replace/scripts/yard_replace.rb +6 -0
- metadata +7 -4
data/lib/discorb/event.rb
CHANGED
@@ -1,35 +1,277 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
module Discorb
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
2
|
+
class ScheduledEvent < DiscordModel
|
3
|
+
@privacy_level = {
|
4
|
+
2 => :guild_only,
|
5
|
+
}
|
6
|
+
@status = {
|
7
|
+
1 => :scheduled,
|
8
|
+
2 => :active,
|
9
|
+
3 => :completed,
|
10
|
+
4 => :canceled,
|
11
|
+
}
|
12
|
+
@entity_type = {
|
13
|
+
1 => :stage_instance,
|
14
|
+
2 => :voice,
|
15
|
+
3 => :external,
|
16
|
+
}
|
17
|
+
|
18
|
+
# @!visibility private
|
19
|
+
def initialize(client, data)
|
20
|
+
@client = client
|
21
|
+
@data = data
|
22
|
+
_set_data(data)
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
# Represents the metadata of the event.
|
27
|
+
#
|
28
|
+
class Metadata
|
29
|
+
# @return [String, nil] The location of the event. Only present if the event is a external event.
|
30
|
+
attr_reader :location
|
31
|
+
# @!visibility private
|
32
|
+
def initialize(data)
|
33
|
+
@location = data[:location]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# @return [Discorb::Snowflake] The ID of the event.
|
13
38
|
attr_reader :id
|
14
|
-
# @return [
|
39
|
+
# @return [String] The name of the event.
|
40
|
+
attr_reader :name
|
41
|
+
# @return [String] The description of the event.
|
42
|
+
attr_reader :description
|
43
|
+
|
44
|
+
# @return [Time] The time the event starts.
|
45
|
+
attr_reader :scheduled_start_time
|
46
|
+
alias start_time scheduled_start_time
|
47
|
+
alias start_at scheduled_start_time
|
48
|
+
# @return [Time] The time the event ends.
|
49
|
+
attr_reader :scheduled_end_time
|
50
|
+
alias end_time scheduled_end_time
|
51
|
+
alias end_at scheduled_end_time
|
52
|
+
# @return [:guild_only] The privacy level of the event.
|
53
|
+
attr_reader :privacy_level
|
54
|
+
# @return [:scheduled, :active, :completed, :canceled] The status of the event.
|
55
|
+
attr_reader :status
|
56
|
+
# @return [:stage_instance, :voice, :external] The type of the event.
|
57
|
+
attr_reader :entity_type
|
58
|
+
# @return [Discorb::Snowflake] The ID of the entity the event is for.
|
59
|
+
attr_reader :entity_id
|
60
|
+
# @return [Discorb::ScheduledEvent::Metadata] The metadata of the event.
|
15
61
|
attr_reader :metadata
|
16
|
-
# @return [
|
17
|
-
attr_reader :
|
18
|
-
|
62
|
+
# @return [Integer] The user count of the event.
|
63
|
+
attr_reader :user_count
|
64
|
+
|
65
|
+
# @!attribute [r] guild
|
66
|
+
# @return [Discorb::Guild, nil] The guild of the event.
|
67
|
+
# @!attribute [r] channel
|
68
|
+
# @return [Discorb::Channel, nil] The channel of the event.
|
69
|
+
# Only present if the event will do in stage instance or voice channel.
|
70
|
+
# @!attribute [r] creator
|
71
|
+
# @return [Discorb::User] The user who created the event.#
|
72
|
+
# @!attribute [r] time
|
73
|
+
# @return [Range<Time>] The time range of the event.
|
74
|
+
|
75
|
+
def guild
|
76
|
+
@client.guilds[@guild_id]
|
77
|
+
end
|
78
|
+
|
79
|
+
def channel
|
80
|
+
@client.channels[@channel_id]
|
81
|
+
end
|
82
|
+
|
83
|
+
def creator
|
84
|
+
@creator || @client.users[@creator_id]
|
85
|
+
end
|
86
|
+
|
87
|
+
def time
|
88
|
+
@scheduled_start_time..@scheduled_end_time
|
89
|
+
end
|
90
|
+
|
91
|
+
#
|
92
|
+
# Create a scheduled event for the guild.
|
93
|
+
# @async
|
94
|
+
#
|
95
|
+
# @param [:stage_instance, :voice, :external] type The type of event to create.
|
96
|
+
# @param [String] name The name of the event.
|
97
|
+
# @param [String] description The description of the event.
|
98
|
+
# @param [Time] start_time The start time of the event.
|
99
|
+
# @param [Time, nil] end_time The end time of the event. Defaults to `nil`.
|
100
|
+
# @param [Discorb::Channel, Discorb::Snowflake, nil] channel The channel to run the event in.
|
101
|
+
# @param [String, nil] location The location of the event. Defaults to `nil`.
|
102
|
+
# @param [:guild_only] privacy_level The privacy level of the event. This must be `:guild_only`.
|
103
|
+
# @param [:active, :completed, :canceled] status The status of the event.
|
104
|
+
#
|
105
|
+
# @return [Async::Task<Discorb::ScheduledEvent>] The event that was created.
|
106
|
+
#
|
107
|
+
# @see Event#start
|
108
|
+
# @see Event#cancel
|
109
|
+
# @see Event#complete
|
110
|
+
#
|
111
|
+
def edit(
|
112
|
+
type: Discorb::Unset,
|
113
|
+
name: Discorb::Unset,
|
114
|
+
description: Discorb::Unset,
|
115
|
+
start_time: Discorb::Unset,
|
116
|
+
end_time: Discorb::Unset,
|
117
|
+
privacy_level: Discorb::Unset,
|
118
|
+
location: Discorb::Unset,
|
119
|
+
channel: Discorb::Unset,
|
120
|
+
status: Discorb::Unset
|
121
|
+
)
|
122
|
+
Async do
|
123
|
+
payload = case (type == Discorb::Unset) ? @entity_type : type
|
124
|
+
when :stage_instance
|
125
|
+
raise ArgumentError, "channel must be provided for stage_instance events" unless channel
|
126
|
+
{
|
127
|
+
name: name,
|
128
|
+
description: description,
|
129
|
+
scheduled_start_time: start_time.iso8601,
|
130
|
+
scheduled_end_time: end_time&.iso8601,
|
131
|
+
privacy_level: Discorb::ScheduledEvent.privacy_level.key(privacy_level) || Discorb::Unset,
|
132
|
+
channel_id: channel&.id,
|
133
|
+
entity_type: Discorb::ScheduledEvent.entity_type.key(:stage_instance),
|
134
|
+
status: Discorb::ScheduledEvent.status.key(status) || Discorb::Unset,
|
135
|
+
}.reject { |_, v| v == Discorb::Unset }
|
136
|
+
when :voice
|
137
|
+
raise ArgumentError, "channel must be provided for voice events" unless channel
|
138
|
+
{
|
139
|
+
name: name,
|
140
|
+
description: description,
|
141
|
+
scheduled_start_time: start_time.iso8601,
|
142
|
+
scheduled_end_time: end_time&.iso8601,
|
143
|
+
privacy_level: Discorb::ScheduledEvent.privacy_level.key(privacy_level) || Discorb::Unset,
|
144
|
+
channel_id: channel&.id,
|
145
|
+
entity_type: Discorb::ScheduledEvent.entity_type.key(:voice),
|
146
|
+
status: Discorb::ScheduledEvent.status.key(status) || Discorb::Unset,
|
147
|
+
}.reject { |_, v| v == Discorb::Unset }
|
148
|
+
when :external
|
149
|
+
raise ArgumentError, "location must be provided for external events" unless location
|
150
|
+
raise ArgumentError, "end_time must be provided for external events" unless end_time
|
151
|
+
{
|
152
|
+
name: name,
|
153
|
+
description: description,
|
154
|
+
channel_id: nil,
|
155
|
+
scheduled_start_time: start_time.iso8601,
|
156
|
+
scheduled_end_time: end_time.iso8601,
|
157
|
+
privacy_level: Discorb::ScheduledEvent.privacy_level.key(privacy_level) || Discorb::Unset,
|
158
|
+
entity_type: Discorb::ScheduledEvent.entity_type.key(:external),
|
159
|
+
entity_metadata: {
|
160
|
+
location: location,
|
161
|
+
},
|
162
|
+
status: Discorb::ScheduledEvent.status.key(status) || Discorb::Unset,
|
163
|
+
}.reject { |_, v| v == Discorb::Unset }
|
164
|
+
else
|
165
|
+
raise ArgumentError, "Invalid scheduled event type: #{type}"
|
166
|
+
end
|
167
|
+
@client.http.patch("/guilds/#{@guild_id}/scheduled-events/#{@id}", payload).wait
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
alias modify edit
|
19
172
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
173
|
+
#
|
174
|
+
# Starts the event. Shortcut for `edit(status: :active)`.
|
175
|
+
#
|
176
|
+
def start
|
177
|
+
edit(status: :active)
|
178
|
+
end
|
179
|
+
|
180
|
+
#
|
181
|
+
# Completes the event. Shortcut for `edit(status: :completed)`.
|
182
|
+
#
|
183
|
+
def complete
|
184
|
+
edit(status: :completed)
|
185
|
+
end
|
186
|
+
|
187
|
+
alias finish complete
|
188
|
+
|
189
|
+
#
|
190
|
+
# Cancels the event. Shortcut for `edit(status: :canceled)`.
|
191
|
+
#
|
192
|
+
def cancel
|
193
|
+
edit(status: :canceled)
|
194
|
+
end
|
195
|
+
|
196
|
+
#
|
197
|
+
# Deletes the event.
|
198
|
+
# @async
|
199
|
+
#
|
200
|
+
# @return [Async::Task<void>] The task.
|
201
|
+
#
|
202
|
+
def delete!
|
203
|
+
Async do
|
204
|
+
@client.http.delete("/guilds/#{@guild_id}/scheduled-events/#{@id}").wait
|
205
|
+
end
|
26
206
|
end
|
27
207
|
|
208
|
+
alias destroy! delete!
|
209
|
+
|
210
|
+
#
|
211
|
+
# Fetches the event users.
|
212
|
+
# @async
|
213
|
+
#
|
214
|
+
# @note You can fetch all of members by not specifying a parameter.
|
215
|
+
#
|
216
|
+
# @param [Integer] limit The maximum number of users to fetch. Defaults to `100`.
|
217
|
+
# @param [#to_s] after The ID of the user to start fetching from. Defaults to `nil`.
|
218
|
+
# @param [#to_s] before The ID of the user to stop fetching at. Defaults to `nil`.
|
219
|
+
# @param [Boolean] with_member Whether to include the member object of the event. Defaults to `false`.
|
220
|
+
# This should be used for manual fetching of members.
|
28
221
|
#
|
29
|
-
#
|
222
|
+
# @return [Async::Task<Array<Discorb::Member>>] The event users.
|
30
223
|
#
|
31
|
-
def
|
32
|
-
|
224
|
+
def fetch_users(limit = nil, before: nil, after: nil, with_member: true)
|
225
|
+
Async do
|
226
|
+
if limit.nil?
|
227
|
+
after = 0
|
228
|
+
res = []
|
229
|
+
while true
|
230
|
+
_resp, users = @client.http.get("/guilds/#{@guild_id}/scheduled-events/#{@id}/users?limit=100&after=#{after}&with_member=true").wait
|
231
|
+
if users.empty?
|
232
|
+
break
|
233
|
+
end
|
234
|
+
res += users.map { |u| Member.new(@client, @guild_id, u[:user], u[:member]) }
|
235
|
+
after = users.last[:user][:id]
|
236
|
+
end
|
237
|
+
res
|
238
|
+
else
|
239
|
+
params = {
|
240
|
+
limit: limit,
|
241
|
+
before: Discorb::Utils.try(after, :id),
|
242
|
+
after: Discorb::Utils.try(around, :id),
|
243
|
+
with_member: with_member,
|
244
|
+
}.filter { |_k, v| !v.nil? }.to_h
|
245
|
+
_resp, messages = @client.http.get("/channels/#{channel_id.wait}/messages?#{URI.encode_www_form(params)}").wait
|
246
|
+
messages.map { |m| Message.new(@client, m.merge({ guild_id: @guild_id.to_s })) }
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
alias fetch_members fetch_users
|
252
|
+
|
253
|
+
private
|
254
|
+
|
255
|
+
def _set_data(data)
|
256
|
+
@id = Snowflake.new(data[:id])
|
257
|
+
@guild_id = Snowflake.new(data[:guild_id])
|
258
|
+
@channel_id = data[:channel_id] && Snowflake.new(data[:channel_id])
|
259
|
+
@creator_id = data[:creator_id] && Snowflake.new(data[:creator_id])
|
260
|
+
@name = data[:name]
|
261
|
+
@description = data[:description]
|
262
|
+
@scheduled_start_time = Time.iso8601(data[:scheduled_start_time])
|
263
|
+
@scheduled_end_time = data[:scheduled_end_time] && Time.iso8601(data[:scheduled_end_time])
|
264
|
+
@privacy_level = :guild_only # data[:privacy_level]
|
265
|
+
@status = self.class.status[data[:status]]
|
266
|
+
@entity_type = self.class.entity_type[data[:entity_type]]
|
267
|
+
@entity_id = data[:entity_id] && Snowflake.new(data[:entity_id])
|
268
|
+
@entity_metadata = data[:entity_metadata] && Metadata.new(data[:entity_metadata])
|
269
|
+
@creator = @client.users[@creator_id] || (data[:creator] && User.new(@client, data[:creator]))
|
270
|
+
@user_count = data[:user_count]
|
271
|
+
end
|
272
|
+
|
273
|
+
class << self
|
274
|
+
attr_reader :status, :entity_type, :privacy_level
|
33
275
|
end
|
34
276
|
end
|
35
277
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Discorb
|
4
|
+
#
|
5
|
+
# Represents a event handler.
|
6
|
+
# This class shouldn't be instantiated directly.
|
7
|
+
# Use {Client#on} instead.
|
8
|
+
#
|
9
|
+
class EventHandler
|
10
|
+
# @return [Proc] the block to be called.
|
11
|
+
attr_reader :block
|
12
|
+
# @return [Symbol] the event id.
|
13
|
+
attr_reader :id
|
14
|
+
# @return [Hash] the event metadata.
|
15
|
+
attr_reader :metadata
|
16
|
+
# @return [Boolean] whether the event is once or not.
|
17
|
+
attr_reader :once
|
18
|
+
alias once? once
|
19
|
+
|
20
|
+
def initialize(block, id, metadata)
|
21
|
+
@block = block
|
22
|
+
@id = id
|
23
|
+
@once = metadata.fetch(:once, false)
|
24
|
+
@metadata = metadata
|
25
|
+
@rescue = nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def inspect
|
29
|
+
"#<#{self.class} @id=#{@id}"
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
# Calls the block associated with the event.
|
34
|
+
#
|
35
|
+
def call(...)
|
36
|
+
@block.call(...)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/discorb/exe/show.rb
CHANGED
data/lib/discorb/extension.rb
CHANGED
@@ -4,7 +4,7 @@ module Discorb
|
|
4
4
|
#
|
5
5
|
# Abstract class to make extension.
|
6
6
|
# Include from this module to make your own extension.
|
7
|
-
# @see file:docs/extension.md
|
7
|
+
# @see file:docs/extension.md Extension
|
8
8
|
# @abstract
|
9
9
|
#
|
10
10
|
module Extension
|
@@ -17,7 +17,7 @@ module Discorb
|
|
17
17
|
ret = {}
|
18
18
|
self.class.events.each do |event, handlers|
|
19
19
|
ret[event] = handlers.map do |handler|
|
20
|
-
Discorb::
|
20
|
+
Discorb::EventHandler.new(Proc.new { |*args, **kwargs| instance_exec(*args, **kwargs, &handler[2]) }, handler[0], handler[1])
|
21
21
|
end
|
22
22
|
end
|
23
23
|
@events = ret
|
@@ -38,7 +38,7 @@ module Discorb
|
|
38
38
|
# @param [Symbol] id The id of the event. Used to delete the event.
|
39
39
|
# @param [Hash] metadata Other metadata.
|
40
40
|
#
|
41
|
-
# @return [Discorb::
|
41
|
+
# @return [Discorb::EventHandler] The event.
|
42
42
|
#
|
43
43
|
def event(event_name, id: nil, **metadata, &block)
|
44
44
|
raise ArgumentError, "Event name must be a symbol" unless event_name.is_a?(Symbol)
|
@@ -57,13 +57,13 @@ module Discorb
|
|
57
57
|
# @param [Hash] metadata Other metadata.
|
58
58
|
# @param [Proc] block The block to execute when the event is triggered.
|
59
59
|
#
|
60
|
-
# @return [Discorb::
|
60
|
+
# @return [Discorb::EventHandler] The event.
|
61
61
|
#
|
62
62
|
def once_event(event_name, id: nil, **metadata, &block)
|
63
63
|
event(event_name, id: id, once: true, **metadata, &block)
|
64
64
|
end
|
65
65
|
|
66
|
-
# @return [Hash{Symbol => Array<Discorb::
|
66
|
+
# @return [Hash{Symbol => Array<Discorb::EventHandler>}] The events of the extension.
|
67
67
|
attr_reader :events
|
68
68
|
# @return [Array<Discorb::ApplicationCommand::Command>] The commands of the extension.
|
69
69
|
attr_reader :commands
|
data/lib/discorb/file.rb
CHANGED
data/lib/discorb/flag.rb
CHANGED
@@ -92,10 +92,14 @@ module Discorb
|
|
92
92
|
#
|
93
93
|
# @return [Discorb::Flag] The negation of the flag.
|
94
94
|
#
|
95
|
-
def
|
95
|
+
def ~
|
96
96
|
self.class.new(~@value)
|
97
97
|
end
|
98
98
|
|
99
|
+
def inspect
|
100
|
+
"#<#{self.class}: #{@value}>"
|
101
|
+
end
|
102
|
+
|
99
103
|
class << self
|
100
104
|
# @return [Hash{Integer => Symbol}] the bits of the flag.
|
101
105
|
attr_reader :bits
|
data/lib/discorb/gateway.rb
CHANGED
@@ -94,8 +94,7 @@ module Discorb
|
|
94
94
|
|
95
95
|
# Fetch the message.
|
96
96
|
# If message is cached, it will be returned.
|
97
|
-
# @
|
98
|
-
# @macro http
|
97
|
+
# @async
|
99
98
|
#
|
100
99
|
# @param [Boolean] force Whether to force fetching the message.
|
101
100
|
#
|
@@ -143,8 +142,7 @@ module Discorb
|
|
143
142
|
|
144
143
|
# Fetch the message.
|
145
144
|
# If message is cached, it will be returned.
|
146
|
-
# @
|
147
|
-
# @macro http
|
145
|
+
# @async
|
148
146
|
#
|
149
147
|
# @param [Boolean] force Whether to force fetching the message.
|
150
148
|
#
|
@@ -195,8 +193,7 @@ module Discorb
|
|
195
193
|
|
196
194
|
# Fetch the message.
|
197
195
|
# If message is cached, it will be returned.
|
198
|
-
# @
|
199
|
-
# @macro http
|
196
|
+
# @async
|
200
197
|
#
|
201
198
|
# @param [Boolean] force Whether to force fetching the message.
|
202
199
|
#
|
@@ -210,6 +207,28 @@ module Discorb
|
|
210
207
|
end
|
211
208
|
end
|
212
209
|
|
210
|
+
#
|
211
|
+
# Represents a `GUILD_SCHEDULED_EVENT_USER_ADD` and `GUILD_SCHEDULED_EVENT_USER_REMOVE` event.
|
212
|
+
#
|
213
|
+
class ScheduledEventUserEvent < GatewayEvent
|
214
|
+
# @return [Discorb::User] The user that triggered the event.
|
215
|
+
attr_reader :user
|
216
|
+
# @return [Discorb::Guild] The guild the event was triggered in.
|
217
|
+
attr_reader :guild
|
218
|
+
# @return [Discorb::ScheduledEvent] The scheduled event.
|
219
|
+
attr_reader :scheduled_event
|
220
|
+
# @private
|
221
|
+
def initialize(client, data)
|
222
|
+
@client = client
|
223
|
+
@scheduled_event_id = Snowflake.new(data[:scheduled_event_id])
|
224
|
+
@user_id = Snowflake.new(data[:user_id])
|
225
|
+
@guild_id = Snowflake.new(data[:guild_id])
|
226
|
+
@guild = client.guilds[data[:guild_id]]
|
227
|
+
@scheduled_event = @guild.scheduled_events[@scheduled_event_id]
|
228
|
+
@user = client.users[data[:user_id]]
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
213
232
|
#
|
214
233
|
# Represents a `MESSAGE_UPDATE` event.
|
215
234
|
#
|
@@ -271,8 +290,7 @@ module Discorb
|
|
271
290
|
end
|
272
291
|
|
273
292
|
# Fetch the message.
|
274
|
-
# @
|
275
|
-
# @macro http
|
293
|
+
# @async
|
276
294
|
#
|
277
295
|
# @return [Async::Task<Discorb::Message>] The message.
|
278
296
|
def fetch_message
|
@@ -481,14 +499,14 @@ module Discorb
|
|
481
499
|
module Handler
|
482
500
|
private
|
483
501
|
|
484
|
-
def connect_gateway(reconnect)
|
502
|
+
def connect_gateway(reconnect, no_close: false)
|
485
503
|
if reconnect
|
486
504
|
@log.info "Reconnecting to gateway..."
|
487
505
|
else
|
488
506
|
@log.info "Connecting to gateway..."
|
489
507
|
end
|
490
508
|
Async do
|
491
|
-
@connection&.close
|
509
|
+
@connection&.close unless no_close
|
492
510
|
@http = HTTP.new(self)
|
493
511
|
_, gateway_response = @http.get("/gateway").wait
|
494
512
|
gateway_url = gateway_response[:url]
|
@@ -515,9 +533,9 @@ module Discorb
|
|
515
533
|
end
|
516
534
|
end
|
517
535
|
end
|
518
|
-
rescue Async::Wrapper::Cancelled, OpenSSL::SSL::SSLError, Async::Wrapper::WaitError, EOFError => e
|
519
|
-
@log.error "Gateway connection closed: #{e.class}: #{e.message}"
|
520
|
-
connect_gateway(true)
|
536
|
+
rescue Async::Wrapper::Cancelled, OpenSSL::SSL::SSLError, Async::Wrapper::WaitError, EOFError, Errno::EPIPE => e
|
537
|
+
@log.error "Gateway connection closed accidentally: #{e.class}: #{e.message}"
|
538
|
+
connect_gateway(true, no_close: true)
|
521
539
|
else # should never happen
|
522
540
|
connect_gateway(true)
|
523
541
|
end
|
@@ -1042,11 +1060,44 @@ module Discorb
|
|
1042
1060
|
@log.info("Successfully resumed connection")
|
1043
1061
|
@tasks << handle_heartbeat
|
1044
1062
|
dispatch(:resumed)
|
1063
|
+
when "GUILD_SCHEDULED_EVENT_CREATE"
|
1064
|
+
@log.warn("Unknown guild id #{data[:guild_id]}, ignoring") unless (guild = @guilds[data[:guild_id]])
|
1065
|
+
event = ScheduledEvent.new(self, data)
|
1066
|
+
guild.scheduled_events[data[:id]] = event
|
1067
|
+
dispatch(:scheduled_event_create, event)
|
1068
|
+
when "GUILD_SCHEDULED_EVENT_UPDATE"
|
1069
|
+
@log.warn("Unknown guild id #{data[:guild_id]}, ignoring") unless (guild = @guilds[data[:guild_id]])
|
1070
|
+
@log.warn("Unknown scheduled event id #{data[:id]}, ignoring") unless (event = guild.scheduled_events[data[:id]])
|
1071
|
+
old = event.dup
|
1072
|
+
event.send(:_set_data, data)
|
1073
|
+
dispatch(:scheduled_event_update, old, event)
|
1074
|
+
if old.status != event.status
|
1075
|
+
case event.status
|
1076
|
+
when :active
|
1077
|
+
dispatch(:scheduled_event_start, event)
|
1078
|
+
when :completed
|
1079
|
+
dispatch(:scheduled_event_end, event)
|
1080
|
+
end
|
1081
|
+
else
|
1082
|
+
dispatch(:scheduled_event_edit, old, event)
|
1083
|
+
end
|
1084
|
+
when "GUILD_SCHEDULED_EVENT_DELETE"
|
1085
|
+
@log.warn("Unknown guild id #{data[:guild_id]}, ignoring") unless (guild = @guilds[data[:guild_id]])
|
1086
|
+
@log.warn("Unknown scheduled event id #{data[:id]}, ignoring") unless (event = guild.scheduled_events[data[:id]])
|
1087
|
+
guild.scheduled_events.remove(data[:id])
|
1088
|
+
dispatch(:scheduled_event_delete, event)
|
1089
|
+
dispatch(:scheduled_event_cancel, event)
|
1090
|
+
when "GUILD_SCHEDULED_EVENT_USER_ADD"
|
1091
|
+
@log.warn("Unknown guild id #{data[:guild_id]}, ignoring") unless (guild = @guilds[data[:guild_id]])
|
1092
|
+
dispatch(:scheduled_event_user_add, ScheduledEventUserEvent.new(self, data))
|
1093
|
+
when "GUILD_SCHEDULED_EVENT_USER_REMOVE"
|
1094
|
+
@log.warn("Unknown guild id #{data[:guild_id]}, ignoring") unless (guild = @guilds[data[:guild_id]])
|
1095
|
+
dispatch(:scheduled_event_user_remove, ScheduledEventUserEvent.new(self, data))
|
1045
1096
|
else
|
1046
1097
|
if respond_to?("event_" + event_name.downcase)
|
1047
1098
|
__send__("event_" + event_name.downcase, data)
|
1048
1099
|
else
|
1049
|
-
@log.debug "#{event_name}\n#{data.inspect}"
|
1100
|
+
@log.debug "Unhandled event: #{event_name}\n#{data.inspect}"
|
1050
1101
|
end
|
1051
1102
|
end
|
1052
1103
|
end
|