discorb 0.0.8 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog.md +32 -1
- data/Gemfile.lock +1 -1
- data/docs/application_command.md +251 -0
- data/docs/events.md +8 -8
- data/docs/extension.md +39 -0
- data/examples/commands/bookmarker.rb +41 -0
- data/examples/commands/hello.rb +9 -0
- data/examples/commands/inspect.rb +24 -0
- data/examples/components/authorization_button.rb +1 -1
- data/examples/components/select_menu.rb +1 -1
- data/lib/discorb/asset.rb +34 -0
- data/lib/discorb/client.rb +20 -3
- data/lib/discorb/command.rb +393 -0
- data/lib/discorb/common.rb +5 -5
- data/lib/discorb/dictionary.rb +1 -1
- data/lib/discorb/embed.rb +7 -7
- data/lib/discorb/emoji.rb +6 -1
- data/lib/discorb/emoji_table.rb +9 -2
- data/lib/discorb/error.rb +4 -1
- data/lib/discorb/extension.rb +5 -2
- data/lib/discorb/gateway.rb +487 -478
- data/lib/discorb/http.rb +1 -1
- data/lib/discorb/interaction.rb +131 -19
- data/lib/discorb/log.rb +1 -1
- data/lib/discorb/member.rb +10 -1
- data/lib/discorb/user.rb +6 -1
- data/lib/discorb/webhook.rb +12 -1
- data/lib/discorb.rb +7 -7
- metadata +8 -2
data/lib/discorb/common.rb
CHANGED
@@ -4,7 +4,7 @@ module Discorb
|
|
4
4
|
# @return [String] The API base URL.
|
5
5
|
API_BASE_URL = "https://discord.com/api/v9"
|
6
6
|
# @return [String] The version of discorb.
|
7
|
-
VERSION = "0.0
|
7
|
+
VERSION = "0.1.0"
|
8
8
|
# @return [String] The user agent for the bot.
|
9
9
|
USER_AGENT = "DiscordBot (https://github.com/discorb-lib/discorb #{VERSION}) Ruby/#{RUBY_VERSION}"
|
10
10
|
|
@@ -108,19 +108,19 @@ module Discorb
|
|
108
108
|
end
|
109
109
|
|
110
110
|
def timestamp
|
111
|
-
Time.at(((
|
111
|
+
Time.at(((@value >> 22) + 1_420_070_400_000) / 1000)
|
112
112
|
end
|
113
113
|
|
114
114
|
def worker_id
|
115
|
-
(
|
115
|
+
(@value & 0x3E0000) >> 17
|
116
116
|
end
|
117
117
|
|
118
118
|
def process_id
|
119
|
-
(
|
119
|
+
(@value & 0x1F000) >> 12
|
120
120
|
end
|
121
121
|
|
122
122
|
def increment
|
123
|
-
|
123
|
+
@value & 0xFFF
|
124
124
|
end
|
125
125
|
end
|
126
126
|
end
|
data/lib/discorb/dictionary.rb
CHANGED
@@ -29,7 +29,7 @@ module Discorb
|
|
29
29
|
def register(id, body)
|
30
30
|
@cache[id.to_s] = body
|
31
31
|
@cache = @cache.sort_by(&@sort).to_h if @sort
|
32
|
-
@cache.
|
32
|
+
@cache.delete(@cache.keys[0]) if !@limit.nil? && @cache.size > @limit
|
33
33
|
body
|
34
34
|
end
|
35
35
|
|
data/lib/discorb/embed.rb
CHANGED
@@ -41,8 +41,8 @@ module Discorb
|
|
41
41
|
# @param [Discorb::Embed::Author] author The author field of embed.
|
42
42
|
# @param [Array<Discorb::Embed::Field>] fields The fields of embed.
|
43
43
|
# @param [Discorb::Embed::Footer] footer The footer of embed.
|
44
|
-
# @param [Discorb::Embed::Image] image The image of embed.
|
45
|
-
# @param [Discorb::Embed::Thumbnail] thumbnail The thumbnail of embed.
|
44
|
+
# @param [Discorb::Embed::Image, String] image The image of embed.
|
45
|
+
# @param [Discorb::Embed::Thumbnail, String] thumbnail The thumbnail of embed.
|
46
46
|
#
|
47
47
|
def initialize(title = nil, description = nil, color: nil, url: nil, timestamp: nil, author: nil,
|
48
48
|
fields: nil, footer: nil, image: nil, thumbnail: nil, data: nil)
|
@@ -55,8 +55,8 @@ module Discorb
|
|
55
55
|
@author = author
|
56
56
|
@fields = fields || []
|
57
57
|
@footer = footer
|
58
|
-
@image = image
|
59
|
-
@thumbnail = thumbnail
|
58
|
+
@image = image && (image.is_a?(String) ? Image.new(image) : image)
|
59
|
+
@thumbnail = thumbnail && (thumbnail.is_a?(String) ? Thumbnail.new(thumbnail) : thumbnail)
|
60
60
|
@type = "rich"
|
61
61
|
else
|
62
62
|
@title = data[:title]
|
@@ -336,9 +336,9 @@ module Discorb
|
|
336
336
|
attr_reader :url
|
337
337
|
|
338
338
|
# @!visibility private
|
339
|
-
def initialize(
|
340
|
-
@name = name
|
341
|
-
@url = url
|
339
|
+
def initialize(data)
|
340
|
+
@name = data[:name]
|
341
|
+
@url = data[:url]
|
342
342
|
end
|
343
343
|
end
|
344
344
|
end
|
data/lib/discorb/emoji.rb
CHANGED
@@ -179,9 +179,11 @@ module Discorb
|
|
179
179
|
attr_reader :name
|
180
180
|
# @return [String] The unicode value of the emoji. (e.g. U+1F600)
|
181
181
|
attr_reader :value
|
182
|
+
# @return [Integer] The skin tone of the emoji.
|
183
|
+
attr_reader :skin_tone
|
182
184
|
|
183
185
|
# @!visibility private
|
184
|
-
def initialize(name)
|
186
|
+
def initialize(name, tone: 0)
|
185
187
|
if EmojiTable::DISCORD_TO_UNICODE.key?(name)
|
186
188
|
@name = name
|
187
189
|
@value = EmojiTable::DISCORD_TO_UNICODE[name]
|
@@ -191,6 +193,9 @@ module Discorb
|
|
191
193
|
else
|
192
194
|
raise ArgumentError, "No such emoji: #{name}"
|
193
195
|
end
|
196
|
+
if tone > 0
|
197
|
+
@value += EmojiTable::SKIN_TONES[tone]
|
198
|
+
end
|
194
199
|
end
|
195
200
|
|
196
201
|
# @return [String] The unicode string of the emoji.
|
data/lib/discorb/emoji_table.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# rubocop:disable Metrics/ModuleLength
|
4
3
|
module Discorb
|
5
4
|
#
|
6
5
|
# A table of emoji names and their unicode values.
|
@@ -3794,6 +3793,14 @@ module Discorb
|
|
3794
3793
|
"\xF0\x9F\x95\x9B" => %w[clock12],
|
3795
3794
|
"\xF0\x9F\x95\xA7" => %w[clock1230],
|
3796
3795
|
}.freeze
|
3797
|
-
|
3796
|
+
|
3797
|
+
SKIN_TONES = [
|
3798
|
+
:dummy,
|
3799
|
+
"\xf0\x9f\x8f\xbb",
|
3800
|
+
"\xf0\x9f\x8f\xbc",
|
3801
|
+
"\xf0\x9f\x8f\xbd",
|
3802
|
+
"\xf0\x9f\x8f\xbe",
|
3803
|
+
"\xf0\x9f\x8f\xbf",
|
3804
|
+
].freeze
|
3798
3805
|
end
|
3799
3806
|
end
|
data/lib/discorb/error.rb
CHANGED
@@ -11,6 +11,9 @@ module Discorb
|
|
11
11
|
def enumerate_errors(hash)
|
12
12
|
res = {}
|
13
13
|
_recr_items([], hash, res)
|
14
|
+
if res == { "" => nil }
|
15
|
+
res = {}
|
16
|
+
end
|
14
17
|
res
|
15
18
|
end
|
16
19
|
|
@@ -56,7 +59,7 @@ module Discorb
|
|
56
59
|
@code = data[:code]
|
57
60
|
@response = resp
|
58
61
|
DiscorbError.instance_method(:initialize).bind(self).call(
|
59
|
-
[data[:message],
|
62
|
+
[data[:message], enumerate_errors(data[:errors]).map do |ek, ev|
|
60
63
|
"#{ek}=>#{ev}"
|
61
64
|
end.join("\n")].join("\n")
|
62
65
|
)
|
data/lib/discorb/extension.rb
CHANGED
@@ -25,9 +25,8 @@ module Discorb
|
|
25
25
|
raise ArgumentError, "Event name must be a symbol" unless event_name.is_a?(Symbol)
|
26
26
|
raise ArgumentError, "block must be a Proc" unless block.is_a?(Proc)
|
27
27
|
|
28
|
-
@events = {} if @events.nil?
|
29
28
|
@events[event_name] ||= []
|
30
|
-
discriminator[:extension] =
|
29
|
+
discriminator[:extension] = self.name
|
31
30
|
@events[event_name] << Discorb::Event.new(block, id, discriminator)
|
32
31
|
end
|
33
32
|
|
@@ -50,5 +49,9 @@ module Discorb
|
|
50
49
|
|
51
50
|
# @!visibility private
|
52
51
|
attr_accessor :client
|
52
|
+
|
53
|
+
def self.extended(obj)
|
54
|
+
obj.instance_variable_set(:@events, {})
|
55
|
+
end
|
53
56
|
end
|
54
57
|
end
|
data/lib/discorb/gateway.rb
CHANGED
@@ -4,10 +4,10 @@ require "async/http"
|
|
4
4
|
|
5
5
|
module Discorb
|
6
6
|
#
|
7
|
-
# A module
|
7
|
+
# A module for Discord Gateway.
|
8
8
|
# This module is internal use only.
|
9
9
|
#
|
10
|
-
module
|
10
|
+
module Gateway
|
11
11
|
#
|
12
12
|
# Represents an event.
|
13
13
|
#
|
@@ -451,519 +451,528 @@ module Discorb
|
|
451
451
|
end
|
452
452
|
end
|
453
453
|
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
454
|
+
#
|
455
|
+
# A module to handle gateway events.
|
456
|
+
#
|
457
|
+
module Handler
|
458
|
+
private
|
459
|
+
|
460
|
+
def connect_gateway(first)
|
461
|
+
@log.info "Connecting to gateway."
|
462
|
+
Async do
|
463
|
+
@http = HTTP.new(self) if first
|
464
|
+
@first = first
|
465
|
+
_, gateway_response = @http.get("/gateway").wait
|
466
|
+
gateway_url = gateway_response[:url]
|
467
|
+
endpoint = Async::HTTP::Endpoint.parse("#{gateway_url}?v=9&encoding=json",
|
468
|
+
alpn_protocols: Async::HTTP::Protocol::HTTP11.names)
|
469
|
+
begin
|
470
|
+
Async::WebSocket::Client.connect(endpoint, headers: [["User-Agent", Discorb::USER_AGENT]]) do |connection|
|
471
|
+
@connection = connection
|
472
|
+
while (message = @connection.read)
|
473
|
+
handle_gateway(message)
|
474
|
+
end
|
470
475
|
end
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
476
|
+
rescue Protocol::WebSocket::ClosedError => e
|
477
|
+
case e.message
|
478
|
+
when "Authentication failed."
|
479
|
+
@tasks.map(&:stop)
|
480
|
+
raise ClientError.new("Authentication failed."), cause: nil
|
481
|
+
when "Discord WebSocket requesting client reconnect."
|
482
|
+
@log.info "Discord WebSocket requesting client reconnect"
|
483
|
+
@tasks.map(&:stop)
|
484
|
+
connect_gateway(false)
|
485
|
+
end
|
486
|
+
rescue EOFError, Async::Wrapper::Cancelled
|
480
487
|
connect_gateway(false)
|
481
488
|
end
|
482
|
-
rescue EOFError, Async::Wrapper::Cancelled
|
483
|
-
connect_gateway(false)
|
484
489
|
end
|
485
490
|
end
|
486
|
-
end
|
487
|
-
|
488
|
-
def send_gateway(opcode, **value)
|
489
|
-
@connection.write({ op: opcode, d: value })
|
490
|
-
@connection.flush
|
491
|
-
@log.debug "Sent message with opcode #{opcode}: #{value.to_json.gsub(@token, "[Token]")}"
|
492
|
-
end
|
493
491
|
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
@
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
if
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
@
|
529
|
-
|
530
|
-
|
531
|
-
|
492
|
+
def send_gateway(opcode, **value)
|
493
|
+
@connection.write({ op: opcode, d: value })
|
494
|
+
@connection.flush
|
495
|
+
@log.debug "Sent message with opcode #{opcode}: #{value.to_json.gsub(@token, "[Token]")}"
|
496
|
+
end
|
497
|
+
|
498
|
+
def handle_gateway(payload)
|
499
|
+
Async do |task|
|
500
|
+
data = payload[:d]
|
501
|
+
@last_s = payload[:s] if payload[:s]
|
502
|
+
@log.debug "Received message with opcode #{payload[:op]} from gateway: #{data}"
|
503
|
+
case payload[:op]
|
504
|
+
when 10
|
505
|
+
@heartbeat_interval = data[:heartbeat_interval]
|
506
|
+
@tasks << handle_heartbeat(@heartbeat_interval)
|
507
|
+
if @first
|
508
|
+
payload = {
|
509
|
+
token: @token,
|
510
|
+
intents: @intents.value,
|
511
|
+
compress: false,
|
512
|
+
properties: { "$os" => RUBY_PLATFORM, "$browser" => "discorb", "$device" => "discorb" },
|
513
|
+
}
|
514
|
+
payload[:presence] = @identify_presence if @identify_presence
|
515
|
+
send_gateway(2, **payload)
|
516
|
+
else
|
517
|
+
payload = {
|
518
|
+
token: @token,
|
519
|
+
session_id: @session_id,
|
520
|
+
seq: @last_s,
|
521
|
+
}
|
522
|
+
send_gateway(6, **payload)
|
523
|
+
end
|
524
|
+
when 9
|
525
|
+
@log.warn "Received opcode 9, closed connection"
|
526
|
+
@tasks.map(&:stop)
|
527
|
+
if data
|
528
|
+
@log.info "Connection is resumable, reconnecting"
|
529
|
+
@connection.close
|
530
|
+
connect_gateway(false)
|
531
|
+
else
|
532
|
+
@log.info "Connection is not resumable, reconnecting with opcode 2"
|
533
|
+
task.sleep(2)
|
534
|
+
@connection.close
|
535
|
+
connect_gateway(true)
|
536
|
+
end
|
537
|
+
when 11
|
538
|
+
@log.info "Received opcode 11"
|
539
|
+
@ping = Time.now.to_f - @heartbeat_before
|
540
|
+
when 0
|
541
|
+
handle_event(payload[:t], data)
|
532
542
|
end
|
533
|
-
when 0
|
534
|
-
handle_event(payload[:t], data)
|
535
543
|
end
|
536
544
|
end
|
537
|
-
end
|
538
545
|
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
546
|
+
def handle_heartbeat(interval)
|
547
|
+
Async do |task|
|
548
|
+
task.sleep((interval / 1000.0 - 1) * rand)
|
549
|
+
loop do
|
550
|
+
@heartbeat_before = Time.now.to_f
|
551
|
+
@connection.write({ op: 1, d: @last_s })
|
552
|
+
@connection.flush
|
553
|
+
@log.debug "Sent opcode 1."
|
554
|
+
@log.debug "Waiting for heartbeat."
|
555
|
+
sleep(interval / 1000.0 - 1)
|
556
|
+
end
|
548
557
|
end
|
549
558
|
end
|
550
|
-
end
|
551
559
|
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
560
|
+
def handle_event(event_name, data)
|
561
|
+
return @log.debug "Client isn't ready; event #{event_name} wasn't handled" if @wait_until_ready && !@ready && !%w[READY GUILD_CREATE].include?(event_name)
|
562
|
+
|
563
|
+
dispatch(:event_receive, event_name, data)
|
564
|
+
@log.debug "Handling event #{event_name}"
|
565
|
+
case event_name
|
566
|
+
when "READY"
|
567
|
+
@api_version = data[:v]
|
568
|
+
@session_id = data[:session_id]
|
569
|
+
@user = ClientUser.new(self, data[:user])
|
570
|
+
@uncached_guilds = data[:guilds].map { |g| g[:id] }
|
571
|
+
when "GUILD_CREATE"
|
572
|
+
if @uncached_guilds.include?(data[:id])
|
573
|
+
Guild.new(self, data, true)
|
574
|
+
@uncached_guilds.delete(data[:id])
|
575
|
+
if @uncached_guilds == []
|
576
|
+
@ready = true
|
577
|
+
setup_commands.wait if @overwrite_application_commands
|
578
|
+
dispatch(:ready)
|
579
|
+
@log.info("Guilds were cached")
|
580
|
+
end
|
581
|
+
elsif @guilds.has?(data[:id])
|
582
|
+
@guilds[data[:id]].send(:_set_data, data)
|
583
|
+
dispatch(:guild_available, guild)
|
584
|
+
else
|
585
|
+
guild = Guild.new(self, data, true)
|
586
|
+
dispatch(:guild_join, guild)
|
571
587
|
end
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
dispatch(:message, message)
|
583
|
-
when "GUILD_UPDATE"
|
584
|
-
if @guilds.has?(data[:id])
|
585
|
-
current = @guilds[data[:id]]
|
586
|
-
before = Guild.new(self, current.instance_variable_get(:@data).merge(no_cache: true), false)
|
587
|
-
current.send(:_set_data, data, false)
|
588
|
-
dispatch(:guild_update, before, current)
|
589
|
-
else
|
590
|
-
@log.warn "Unknown guild id #{data[:id]}, ignoring"
|
591
|
-
end
|
592
|
-
when "GUILD_DELETE"
|
593
|
-
return @log.warn "Unknown guild id #{data[:id]}, ignoring" unless (guild = @guilds.delete(data[:id]))
|
594
|
-
|
595
|
-
dispatch(:guild_delete, guild)
|
596
|
-
if guild.has?(:unavailable)
|
597
|
-
dispatch(:guild_destroy, guild)
|
598
|
-
else
|
599
|
-
dispatch(:guild_leave, guild)
|
600
|
-
end
|
601
|
-
when "GUILD_ROLE_CREATE"
|
602
|
-
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
603
|
-
|
604
|
-
nr = Role.new(@client, guild, data[:role])
|
605
|
-
guild.roles[data[:role][:id]] = nr
|
606
|
-
dispatch(:role_create, nr)
|
607
|
-
when "GUILD_ROLE_UPDATE"
|
608
|
-
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
609
|
-
return @log.warn "Unknown role id #{data[:role][:id]}, ignoring" unless guild.roles.has?(data[:role][:id])
|
610
|
-
|
611
|
-
current = guild.roles[data[:role][:id]]
|
612
|
-
before = Role.new(@client, guild, current.instance_variable_get(:@data).update({ no_cache: true }))
|
613
|
-
current.send(:_set_data, data[:role])
|
614
|
-
dispatch(:role_update, before, current)
|
615
|
-
when "GUILD_ROLE_DELETE"
|
616
|
-
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
617
|
-
return @log.warn "Unknown role id #{data[:role_id]}, ignoring" unless (role = guild.roles.delete(data[:role_id]))
|
618
|
-
|
619
|
-
dispatch(:role_delete, role)
|
620
|
-
when "CHANNEL_CREATE"
|
621
|
-
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
622
|
-
|
623
|
-
nc = Channel.make_channel(self, data)
|
624
|
-
guild.channels[data[:id]] = nc
|
625
|
-
|
626
|
-
dispatch(:channel_create, nc)
|
627
|
-
when "CHANNEL_UPDATE"
|
628
|
-
return @log.warn "Unknown channel id #{data[:id]}, ignoring" unless (current = @channels[data[:id]])
|
629
|
-
|
630
|
-
before = Channel.make_channel(self, current.instance_variable_get(:@data), no_cache: true)
|
631
|
-
current.send(:_set_data, data)
|
632
|
-
dispatch(:channel_update, before, current)
|
633
|
-
when "CHANNEL_DELETE"
|
634
|
-
return @log.warn "Unknown channel id #{data[:id]}, ignoring" unless (channel = @channels.delete(data[:id]))
|
635
|
-
|
636
|
-
@guilds[data[:guild_id]]&.channels&.delete(data[:id])
|
637
|
-
dispatch(:channel_delete, channel)
|
638
|
-
when "CHANNEL_PINS_UPDATE"
|
639
|
-
nil # do in MESSAGE_UPDATE
|
640
|
-
when "THREAD_CREATE"
|
641
|
-
thread = Channel.make_channel(self, data)
|
642
|
-
|
643
|
-
dispatch(:thread_create, thread)
|
644
|
-
if data.key?(:member)
|
645
|
-
dispatch(:thread_join, thread)
|
646
|
-
else
|
647
|
-
dispatch(:thread_new, thread)
|
648
|
-
end
|
649
|
-
when "THREAD_UPDATE"
|
650
|
-
return @log.warn "Unknown thread id #{data[:id]}, ignoring" unless (thread = @channels[data[:id]])
|
651
|
-
|
652
|
-
before = Channel.make_channel(self, thread.instance_variable_get(:@data), no_cache: true)
|
653
|
-
thread.send(:_set_data, data)
|
654
|
-
dispatch(:thread_update, before, thread)
|
655
|
-
when "THREAD_DELETE"
|
656
|
-
return @log.warn "Unknown thread id #{data[:id]}, ignoring" unless (thread = @channels.delete(data[:id]))
|
657
|
-
|
658
|
-
@guilds[data[:guild_id]]&.channels&.delete(data[:id])
|
659
|
-
dispatch(:thread_delete, thread)
|
660
|
-
when "THREAD_LIST_SYNC"
|
661
|
-
data[:threads].each do |raw_thread|
|
662
|
-
thread = Channel.make_channel(self, raw_thread.merge({ member: raw_thread[:members].find { |m| m[:id] == raw_thread[:id] } }))
|
663
|
-
@channels[thread.id] = thread
|
664
|
-
end
|
665
|
-
when "THREAD_MEMBER_UPDATE"
|
666
|
-
return @log.warn "Unknown thread id #{data[:id]}, ignoring" unless (thread = @channels[data[:id]])
|
667
|
-
|
668
|
-
if (member = thread.members[data[:id]])
|
669
|
-
old = ThreadChannel::Member.new(self, member.instance_variable_get(:@data))
|
670
|
-
member._set_data(data)
|
671
|
-
else
|
672
|
-
old = nil
|
673
|
-
member = ThreadChannel::Member.new(self, data)
|
674
|
-
thread.members[data[:user_id]] = member
|
675
|
-
end
|
676
|
-
dispatch(:thread_member_update, thread, old, member)
|
677
|
-
when "THREAD_MEMBERS_UPDATE"
|
678
|
-
return @log.warn "Unknown thread id #{data[:id]}, ignoring" unless (thread = @channels[data[:id]])
|
679
|
-
|
680
|
-
thread.instance_variable_set(:@member_count, data[:member_count])
|
681
|
-
members = []
|
682
|
-
(data[:added_members] || []).each do |raw_member|
|
683
|
-
member = ThreadChannel::Member.new(self, raw_member)
|
684
|
-
thread.members[member.id] = member
|
685
|
-
members << member
|
686
|
-
end
|
687
|
-
removed_members = []
|
688
|
-
(data[:removed_member_ids] || []).each do |id|
|
689
|
-
removed_members << thread.members.delete(id)
|
690
|
-
end
|
691
|
-
dispatch(:thread_members_update, thread, members, removed_members)
|
692
|
-
when "STAGE_INSTANCE_CREATE"
|
693
|
-
instance = StageInstance.new(self, data)
|
694
|
-
dispatch(:stage_instance_create, instance)
|
695
|
-
when "STAGE_INSTANCE_UPDATE"
|
696
|
-
return @log.warn "Unknown channel id #{data[:channel_id]} , ignoring" unless (channel = @channels[data[:channel_id]])
|
697
|
-
return @log.warn "Unknown stage instance id #{data[:id]}, ignoring" unless (instance = channel.stage_instances[data[:id]])
|
698
|
-
|
699
|
-
old = StageInstance.new(self, instance.instance_variable_get(:@data), no_cache: true)
|
700
|
-
current.send(:_set_data, data)
|
701
|
-
dispatch(:stage_instance_update, old, current)
|
702
|
-
when "STAGE_INSTANCE_DELETE"
|
703
|
-
return @log.warn "Unknown channel id #{data[:channel_id]} , ignoring" unless (channel = @channels[data[:channel_id]])
|
704
|
-
return @log.warn "Unknown stage instance id #{data[:id]}, ignoring" unless (instance = channel.stage_instances.delete(data[:id]))
|
705
|
-
|
706
|
-
dispatch(:stage_instance_delete, instance)
|
707
|
-
when "GUILD_MEMBER_ADD"
|
708
|
-
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
709
|
-
|
710
|
-
nm = Member.new(self, data[:guild_id], data[:user].update({ no_cache: true }), data)
|
711
|
-
guild.members[nm.id] = nm
|
712
|
-
dispatch(:member_add, nm)
|
713
|
-
when "GUILD_MEMBER_UPDATE"
|
714
|
-
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
715
|
-
return @log.warn "Unknown member id #{data[:user][:id]}, ignoring" unless (nm = guild.members[data[:user][:id]])
|
716
|
-
|
717
|
-
old = Member.new(self, data[:guild_id], data[:user], data.update({ no_cache: true }))
|
718
|
-
nm.send(:_set_data, data[:user], data)
|
719
|
-
dispatch(:member_update, old, nm)
|
720
|
-
when "GUILD_MEMBER_REMOVE"
|
721
|
-
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
722
|
-
return @log.warn "Unknown member id #{data[:user][:id]}, ignoring" unless (member = guild.members.delete(data[:user][:id]))
|
723
|
-
|
724
|
-
dispatch(:member_remove, member)
|
725
|
-
when "GUILD_BAN_ADD"
|
726
|
-
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
727
|
-
|
728
|
-
user = if @users.has? data[:user][:id]
|
729
|
-
@users[data[:user][:id]]
|
588
|
+
dispatch(:guild_create, @guilds[data[:id]])
|
589
|
+
when "MESSAGE_CREATE"
|
590
|
+
message = Message.new(self, data)
|
591
|
+
dispatch(:message, message)
|
592
|
+
when "GUILD_UPDATE"
|
593
|
+
if @guilds.has?(data[:id])
|
594
|
+
current = @guilds[data[:id]]
|
595
|
+
before = Guild.new(self, current.instance_variable_get(:@data).merge(no_cache: true), false)
|
596
|
+
current.send(:_set_data, data, false)
|
597
|
+
dispatch(:guild_update, before, current)
|
730
598
|
else
|
731
|
-
|
599
|
+
@log.warn "Unknown guild id #{data[:id]}, ignoring"
|
732
600
|
end
|
601
|
+
when "GUILD_DELETE"
|
602
|
+
return @log.warn "Unknown guild id #{data[:id]}, ignoring" unless (guild = @guilds.delete(data[:id]))
|
733
603
|
|
734
|
-
|
735
|
-
|
736
|
-
|
604
|
+
dispatch(:guild_delete, guild)
|
605
|
+
if guild.has?(:unavailable)
|
606
|
+
dispatch(:guild_destroy, guild)
|
607
|
+
else
|
608
|
+
dispatch(:guild_leave, guild)
|
609
|
+
end
|
610
|
+
when "GUILD_ROLE_CREATE"
|
611
|
+
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
612
|
+
|
613
|
+
nr = Role.new(@client, guild, data[:role])
|
614
|
+
guild.roles[data[:role][:id]] = nr
|
615
|
+
dispatch(:role_create, nr)
|
616
|
+
when "GUILD_ROLE_UPDATE"
|
617
|
+
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
618
|
+
return @log.warn "Unknown role id #{data[:role][:id]}, ignoring" unless guild.roles.has?(data[:role][:id])
|
619
|
+
|
620
|
+
current = guild.roles[data[:role][:id]]
|
621
|
+
before = Role.new(@client, guild, current.instance_variable_get(:@data).update({ no_cache: true }))
|
622
|
+
current.send(:_set_data, data[:role])
|
623
|
+
dispatch(:role_update, before, current)
|
624
|
+
when "GUILD_ROLE_DELETE"
|
625
|
+
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
626
|
+
return @log.warn "Unknown role id #{data[:role_id]}, ignoring" unless (role = guild.roles.delete(data[:role_id]))
|
627
|
+
|
628
|
+
dispatch(:role_delete, role)
|
629
|
+
when "CHANNEL_CREATE"
|
630
|
+
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
631
|
+
|
632
|
+
nc = Channel.make_channel(self, data)
|
633
|
+
guild.channels[data[:id]] = nc
|
634
|
+
|
635
|
+
dispatch(:channel_create, nc)
|
636
|
+
when "CHANNEL_UPDATE"
|
637
|
+
return @log.warn "Unknown channel id #{data[:id]}, ignoring" unless (current = @channels[data[:id]])
|
638
|
+
|
639
|
+
before = Channel.make_channel(self, current.instance_variable_get(:@data), no_cache: true)
|
640
|
+
current.send(:_set_data, data)
|
641
|
+
dispatch(:channel_update, before, current)
|
642
|
+
when "CHANNEL_DELETE"
|
643
|
+
return @log.warn "Unknown channel id #{data[:id]}, ignoring" unless (channel = @channels.delete(data[:id]))
|
644
|
+
|
645
|
+
@guilds[data[:guild_id]]&.channels&.delete(data[:id])
|
646
|
+
dispatch(:channel_delete, channel)
|
647
|
+
when "CHANNEL_PINS_UPDATE"
|
648
|
+
nil # do in MESSAGE_UPDATE
|
649
|
+
when "THREAD_CREATE"
|
650
|
+
thread = Channel.make_channel(self, data)
|
651
|
+
|
652
|
+
dispatch(:thread_create, thread)
|
653
|
+
if data.key?(:member)
|
654
|
+
dispatch(:thread_join, thread)
|
655
|
+
else
|
656
|
+
dispatch(:thread_new, thread)
|
657
|
+
end
|
658
|
+
when "THREAD_UPDATE"
|
659
|
+
return @log.warn "Unknown thread id #{data[:id]}, ignoring" unless (thread = @channels[data[:id]])
|
660
|
+
|
661
|
+
before = Channel.make_channel(self, thread.instance_variable_get(:@data), no_cache: true)
|
662
|
+
thread.send(:_set_data, data)
|
663
|
+
dispatch(:thread_update, before, thread)
|
664
|
+
when "THREAD_DELETE"
|
665
|
+
return @log.warn "Unknown thread id #{data[:id]}, ignoring" unless (thread = @channels.delete(data[:id]))
|
666
|
+
|
667
|
+
@guilds[data[:guild_id]]&.channels&.delete(data[:id])
|
668
|
+
dispatch(:thread_delete, thread)
|
669
|
+
when "THREAD_LIST_SYNC"
|
670
|
+
data[:threads].each do |raw_thread|
|
671
|
+
thread = Channel.make_channel(self, raw_thread.merge({ member: raw_thread[:members].find { |m| m[:id] == raw_thread[:id] } }))
|
672
|
+
@channels[thread.id] = thread
|
673
|
+
end
|
674
|
+
when "THREAD_MEMBER_UPDATE"
|
675
|
+
return @log.warn "Unknown thread id #{data[:id]}, ignoring" unless (thread = @channels[data[:id]])
|
737
676
|
|
738
|
-
|
739
|
-
|
677
|
+
if (member = thread.members[data[:id]])
|
678
|
+
old = ThreadChannel::Member.new(self, member.instance_variable_get(:@data))
|
679
|
+
member._set_data(data)
|
740
680
|
else
|
741
|
-
|
681
|
+
old = nil
|
682
|
+
member = ThreadChannel::Member.new(self, data)
|
683
|
+
thread.members[data[:user_id]] = member
|
684
|
+
end
|
685
|
+
dispatch(:thread_member_update, thread, old, member)
|
686
|
+
when "THREAD_MEMBERS_UPDATE"
|
687
|
+
return @log.warn "Unknown thread id #{data[:id]}, ignoring" unless (thread = @channels[data[:id]])
|
688
|
+
|
689
|
+
thread.instance_variable_set(:@member_count, data[:member_count])
|
690
|
+
members = []
|
691
|
+
(data[:added_members] || []).each do |raw_member|
|
692
|
+
member = ThreadChannel::Member.new(self, raw_member)
|
693
|
+
thread.members[member.id] = member
|
694
|
+
members << member
|
695
|
+
end
|
696
|
+
removed_members = []
|
697
|
+
(data[:removed_member_ids] || []).each do |id|
|
698
|
+
removed_members << thread.members.delete(id)
|
742
699
|
end
|
700
|
+
dispatch(:thread_members_update, thread, members, removed_members)
|
701
|
+
when "STAGE_INSTANCE_CREATE"
|
702
|
+
instance = StageInstance.new(self, data)
|
703
|
+
dispatch(:stage_instance_create, instance)
|
704
|
+
when "STAGE_INSTANCE_UPDATE"
|
705
|
+
return @log.warn "Unknown channel id #{data[:channel_id]} , ignoring" unless (channel = @channels[data[:channel_id]])
|
706
|
+
return @log.warn "Unknown stage instance id #{data[:id]}, ignoring" unless (instance = channel.stage_instances[data[:id]])
|
707
|
+
|
708
|
+
old = StageInstance.new(self, instance.instance_variable_get(:@data), no_cache: true)
|
709
|
+
current.send(:_set_data, data)
|
710
|
+
dispatch(:stage_instance_update, old, current)
|
711
|
+
when "STAGE_INSTANCE_DELETE"
|
712
|
+
return @log.warn "Unknown channel id #{data[:channel_id]} , ignoring" unless (channel = @channels[data[:channel_id]])
|
713
|
+
return @log.warn "Unknown stage instance id #{data[:id]}, ignoring" unless (instance = channel.stage_instances.delete(data[:id]))
|
714
|
+
|
715
|
+
dispatch(:stage_instance_delete, instance)
|
716
|
+
when "GUILD_MEMBER_ADD"
|
717
|
+
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
718
|
+
|
719
|
+
nm = Member.new(self, data[:guild_id], data[:user].update({ no_cache: true }), data)
|
720
|
+
guild.members[nm.id] = nm
|
721
|
+
dispatch(:member_add, nm)
|
722
|
+
when "GUILD_MEMBER_UPDATE"
|
723
|
+
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
724
|
+
return @log.warn "Unknown member id #{data[:user][:id]}, ignoring" unless (nm = guild.members[data[:user][:id]])
|
725
|
+
|
726
|
+
old = Member.new(self, data[:guild_id], data[:user], data.update({ no_cache: true }))
|
727
|
+
nm.send(:_set_data, data[:user], data)
|
728
|
+
dispatch(:member_update, old, nm)
|
729
|
+
when "GUILD_MEMBER_REMOVE"
|
730
|
+
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
731
|
+
return @log.warn "Unknown member id #{data[:user][:id]}, ignoring" unless (member = guild.members.delete(data[:user][:id]))
|
732
|
+
|
733
|
+
dispatch(:member_remove, member)
|
734
|
+
when "GUILD_BAN_ADD"
|
735
|
+
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
736
|
+
|
737
|
+
user = if @users.has? data[:user][:id]
|
738
|
+
@users[data[:user][:id]]
|
739
|
+
else
|
740
|
+
User.new(self, data[:user].update({ no_cache: true }))
|
741
|
+
end
|
743
742
|
|
744
|
-
|
745
|
-
|
746
|
-
|
743
|
+
dispatch(:guild_ban_add, guild, user)
|
744
|
+
when "GUILD_BAN_REMOVE"
|
745
|
+
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
747
746
|
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
guild
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
when "INTEGRATION_UPDATE"
|
762
|
-
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
763
|
-
return @log.warn "Unknown integration id #{data[:id]}, ignoring" unless (integration = guild.integrations[data[:id]])
|
764
|
-
|
765
|
-
before = Integration.new(self, integration.instance_variable_get(:@data), data[:guild_id], no_cache: true)
|
766
|
-
integration.send(:_set_data, data)
|
767
|
-
dispatch(:integration_update, before, integration)
|
768
|
-
when "INTEGRATION_DELETE"
|
769
|
-
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
770
|
-
return @log.warn "Unknown integration id #{data[:id]}, ignoring" unless (integration = guild.integrations.delete(data[:id]))
|
771
|
-
|
772
|
-
dispatch(:integration_delete, integration)
|
773
|
-
when "WEBHOOKS_UPDATE"
|
774
|
-
dispatch(:webhooks_update, WebhooksUpdateEvent.new(self, data))
|
775
|
-
when "INVITE_CREATE"
|
776
|
-
dispatch(:invite_create, Invite.new(self, data, true))
|
777
|
-
when "INVITE_DELETE"
|
778
|
-
dispatch(:invite_delete, InviteDeleteEvent.new(self, data))
|
779
|
-
when "VOICE_STATE_UPDATE"
|
780
|
-
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
781
|
-
|
782
|
-
current = guild.voice_states[data[:user_id]]
|
783
|
-
if current.nil?
|
784
|
-
old = nil
|
785
|
-
current = VoiceState.new(self, data)
|
786
|
-
guild.voice_states[data[:user_id]] = current
|
787
|
-
else
|
788
|
-
old = VoiceState.new(self, current.instance_variable_get(:@data))
|
789
|
-
current.send(:_set_data, data)
|
790
|
-
end
|
791
|
-
dispatch(:voice_state_update, old, current)
|
792
|
-
if old&.channel != current&.channel
|
793
|
-
dispatch(:voice_channel_update, old, current)
|
794
|
-
case [old&.channel, current&.channel]
|
795
|
-
in [nil, _]
|
796
|
-
dispatch(:voice_channel_connect, current)
|
797
|
-
in [_, nil]
|
798
|
-
dispatch(:voice_channel_disconnect, old)
|
799
|
-
in _
|
800
|
-
dispatch(:voice_channel_move, old, current)
|
747
|
+
user = if @users.has? data[:user][:id]
|
748
|
+
@users[data[:user][:id]]
|
749
|
+
else
|
750
|
+
User.new(self, data[:user].update({ no_cache: true }))
|
751
|
+
end
|
752
|
+
|
753
|
+
dispatch(:guild_ban_remove, guild, user)
|
754
|
+
when "GUILD_EMOJIS_UPDATE"
|
755
|
+
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
756
|
+
|
757
|
+
before_emojis = guild.emojis.values.map(&:id).to_set
|
758
|
+
data[:emojis].each do |emoji|
|
759
|
+
guild.emojis[emoji[:id]] = CustomEmoji.new(self, guild, emoji)
|
801
760
|
end
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
case [old&.mute?, current&.mute?]
|
806
|
-
when [false, true]
|
807
|
-
dispatch(:voice_mute_enable, current)
|
808
|
-
when [true, false]
|
809
|
-
dispatch(:voice_mute_disable, old)
|
761
|
+
deleted_emojis = before_emojis - guild.emojis.values.map(&:id).to_set
|
762
|
+
deleted_emojis.each do |emoji|
|
763
|
+
guild.emojis.delete(emoji)
|
810
764
|
end
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
765
|
+
when "GUILD_INTEGRATIONS_UPDATE"
|
766
|
+
# dispatch(:guild_integrations_update, GuildIntegrationsUpdateEvent.new(self, data))
|
767
|
+
# Currently not implemented
|
768
|
+
when "INTEGRATION_CREATE"
|
769
|
+
dispatch(:integration_create, Integration.new(self, data, data[:guild_id]))
|
770
|
+
when "INTEGRATION_UPDATE"
|
771
|
+
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
772
|
+
return @log.warn "Unknown integration id #{data[:id]}, ignoring" unless (integration = guild.integrations[data[:id]])
|
773
|
+
|
774
|
+
before = Integration.new(self, integration.instance_variable_get(:@data), data[:guild_id], no_cache: true)
|
775
|
+
integration.send(:_set_data, data)
|
776
|
+
dispatch(:integration_update, before, integration)
|
777
|
+
when "INTEGRATION_DELETE"
|
778
|
+
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
779
|
+
return @log.warn "Unknown integration id #{data[:id]}, ignoring" unless (integration = guild.integrations.delete(data[:id]))
|
780
|
+
|
781
|
+
dispatch(:integration_delete, integration)
|
782
|
+
when "WEBHOOKS_UPDATE"
|
783
|
+
dispatch(:webhooks_update, WebhooksUpdateEvent.new(self, data))
|
784
|
+
when "INVITE_CREATE"
|
785
|
+
dispatch(:invite_create, Invite.new(self, data, true))
|
786
|
+
when "INVITE_DELETE"
|
787
|
+
dispatch(:invite_delete, InviteDeleteEvent.new(self, data))
|
788
|
+
when "VOICE_STATE_UPDATE"
|
789
|
+
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
790
|
+
|
791
|
+
current = guild.voice_states[data[:user_id]]
|
792
|
+
if current.nil?
|
793
|
+
old = nil
|
794
|
+
current = VoiceState.new(self, data)
|
795
|
+
guild.voice_states[data[:user_id]] = current
|
796
|
+
else
|
797
|
+
old = VoiceState.new(self, current.instance_variable_get(:@data))
|
798
|
+
current.send(:_set_data, data)
|
819
799
|
end
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
825
|
-
|
826
|
-
|
827
|
-
|
800
|
+
dispatch(:voice_state_update, old, current)
|
801
|
+
if old&.channel != current&.channel
|
802
|
+
dispatch(:voice_channel_update, old, current)
|
803
|
+
case [old&.channel, current&.channel]
|
804
|
+
in [nil, _]
|
805
|
+
dispatch(:voice_channel_connect, current)
|
806
|
+
in [_, nil]
|
807
|
+
dispatch(:voice_channel_disconnect, old)
|
808
|
+
in _
|
809
|
+
dispatch(:voice_channel_move, old, current)
|
810
|
+
end
|
828
811
|
end
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
|
812
|
+
if old&.mute? != current&.mute?
|
813
|
+
dispatch(:voice_mute_update, old, current)
|
814
|
+
case [old&.mute?, current&.mute?]
|
815
|
+
when [false, true]
|
816
|
+
dispatch(:voice_mute_enable, current)
|
817
|
+
when [true, false]
|
818
|
+
dispatch(:voice_mute_disable, old)
|
819
|
+
end
|
837
820
|
end
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
821
|
+
if old&.deaf? != current&.deaf?
|
822
|
+
dispatch(:voice_deaf_update, old, current)
|
823
|
+
case [old&.deaf?, current&.deaf?]
|
824
|
+
when [false, true]
|
825
|
+
dispatch(:voice_deaf_enable, current)
|
826
|
+
when [true, false]
|
827
|
+
dispatch(:voice_deaf_disable, old)
|
828
|
+
end
|
846
829
|
end
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
830
|
+
if old&.self_mute? != current&.self_mute?
|
831
|
+
dispatch(:voice_self_mute_update, old, current)
|
832
|
+
case [old&.self_mute?, current&.self_mute?]
|
833
|
+
when [false, true]
|
834
|
+
dispatch(:voice_self_mute_enable, current)
|
835
|
+
when [true, false]
|
836
|
+
dispatch(:voice_self_mute_disable, old)
|
837
|
+
end
|
855
838
|
end
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
862
|
-
|
863
|
-
|
839
|
+
if old&.self_deaf? != current&.self_deaf?
|
840
|
+
dispatch(:voice_self_deaf_update, old, current)
|
841
|
+
case [old&.self_deaf?, current&.self_deaf?]
|
842
|
+
when [false, true]
|
843
|
+
dispatch(:voice_self_deaf_enable, current)
|
844
|
+
when [true, false]
|
845
|
+
dispatch(:voice_self_deaf_disable, old)
|
846
|
+
end
|
864
847
|
end
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
|
848
|
+
if old&.server_mute? != current&.server_mute?
|
849
|
+
dispatch(:voice_server_mute_update, old, current)
|
850
|
+
case [old&.server_mute?, current&.server_mute?]
|
851
|
+
when [false, true]
|
852
|
+
dispatch(:voice_server_mute_enable, current)
|
853
|
+
when [true, false]
|
854
|
+
dispatch(:voice_server_mute_disable, old)
|
855
|
+
end
|
873
856
|
end
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
|
882
|
-
message.send(:_set_data, message.instance_variable_get(:@data).merge(data))
|
883
|
-
else
|
884
|
-
@log.info "Uncached message ID #{data[:id]}, ignoring"
|
885
|
-
before = nil
|
886
|
-
message = nil
|
887
|
-
end
|
888
|
-
if data[:edited_timestamp].nil?
|
889
|
-
if message.nil?
|
890
|
-
nil
|
891
|
-
elsif message.pinned?
|
892
|
-
message.instance_variable_set(:@pinned, false)
|
893
|
-
else
|
894
|
-
message.instance_variable_set(:@pinned, true)
|
857
|
+
if old&.server_deaf? != current&.server_deaf?
|
858
|
+
dispatch(:voice_server_deaf_update, old, current)
|
859
|
+
case [old&.server_deaf?, current&.server_deaf?]
|
860
|
+
when [false, true]
|
861
|
+
dispatch(:voice_server_deaf_enable, current)
|
862
|
+
when [true, false]
|
863
|
+
dispatch(:voice_server_deaf_disable, old)
|
864
|
+
end
|
895
865
|
end
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
866
|
+
if old&.video? != current&.video?
|
867
|
+
dispatch(:voice_video_update, old, current)
|
868
|
+
case [old&.video?, current&.video?]
|
869
|
+
when [false, true]
|
870
|
+
dispatch(:voice_video_start, current)
|
871
|
+
when [true, false]
|
872
|
+
dispatch(:voice_video_end, old)
|
873
|
+
end
|
874
|
+
end
|
875
|
+
if old&.stream? != current&.stream?
|
876
|
+
dispatch(:voice_stream_update, old, current)
|
877
|
+
case [old&.stream?, current&.stream?]
|
878
|
+
when [false, true]
|
879
|
+
dispatch(:voice_stream_start, current)
|
880
|
+
when [true, false]
|
881
|
+
dispatch(:voice_stream_end, old)
|
882
|
+
end
|
883
|
+
end
|
884
|
+
when "PRESENCE_UPDATE"
|
885
|
+
return @log.warn "Unknown guild id #{data[:guild_id]}, ignoring" unless (guild = @guilds[data[:guild_id]])
|
886
|
+
|
887
|
+
guild.presences[data[:user][:id]] = Presence.new(self, data)
|
888
|
+
when "MESSAGE_UPDATE"
|
889
|
+
if (message = @messages[data[:id]])
|
890
|
+
before = Message.new(self, message.instance_variable_get(:@data), no_cache: true)
|
891
|
+
message.send(:_set_data, message.instance_variable_get(:@data).merge(data))
|
911
892
|
else
|
912
|
-
|
893
|
+
before = nil
|
894
|
+
message = nil
|
913
895
|
end
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
896
|
+
if data[:edited_timestamp].nil?
|
897
|
+
if message.nil?
|
898
|
+
nil
|
899
|
+
elsif message.pinned?
|
900
|
+
message.instance_variable_set(:@pinned, false)
|
901
|
+
else
|
902
|
+
message.instance_variable_set(:@pinned, true)
|
903
|
+
end
|
904
|
+
dispatch(:message_pin_update, MessagePinEvent.new(self, data, message))
|
922
905
|
else
|
923
|
-
|
924
|
-
self,
|
925
|
-
{
|
926
|
-
count: 1,
|
927
|
-
me: @user.id == data[:user_id],
|
928
|
-
emoji: data[:emoji],
|
929
|
-
}
|
930
|
-
)
|
906
|
+
dispatch(:message_update, MessageUpdateEvent.new(self, data, before, current))
|
931
907
|
end
|
908
|
+
when "MESSAGE_DELETE"
|
909
|
+
message.instance_variable_set(:@deleted, true) if (message = @messages[data[:id]])
|
910
|
+
|
911
|
+
dispatch(:message_delete_id, Snowflake.new(data[:id]), channels[data[:channel_id]], data[:guild_id] && guilds[data[:guild_id]])
|
912
|
+
dispatch(:message_delete, message, channels[data[:channel_id]], data[:guild_id] && guilds[data[:guild_id]])
|
913
|
+
when "MESSAGE_DELETE_BULK"
|
914
|
+
messages = []
|
915
|
+
data[:ids].each do |id|
|
916
|
+
if (message = @messages[id])
|
917
|
+
message.instance_variable_set(:@deleted, true)
|
918
|
+
messages.push(message)
|
919
|
+
else
|
920
|
+
messages.push(UnknownDeleteBulkMessage.new(self, id))
|
921
|
+
end
|
922
|
+
end
|
923
|
+
dispatch(:message_delete_bulk, messages)
|
924
|
+
when "MESSAGE_REACTION_ADD"
|
925
|
+
if (target_message = @messages[data[:message_id]])
|
926
|
+
if (target_reaction = target_message.reactions.find do |r|
|
927
|
+
r.emoji.is_a?(UnicodeEmoji) ? r.emoji.value == data[:emoji][:name] : r.emoji.id == data[:emoji][:id]
|
928
|
+
end)
|
929
|
+
target_reaction.set_instance_variable(:@count, target_reaction.count + 1)
|
930
|
+
else
|
931
|
+
target_message.reactions << Reaction.new(
|
932
|
+
self,
|
933
|
+
{
|
934
|
+
count: 1,
|
935
|
+
me: @user.id == data[:user_id],
|
936
|
+
emoji: data[:emoji],
|
937
|
+
}
|
938
|
+
)
|
939
|
+
end
|
940
|
+
end
|
941
|
+
dispatch(:reaction_add, ReactionEvent.new(self, data))
|
942
|
+
when "MESSAGE_REACTION_REMOVE"
|
943
|
+
if (target_message = @messages[data[:message_id]]) &&
|
944
|
+
(target_reaction = target_message.reactions.find do |r|
|
945
|
+
data[:emoji][:id].nil? ? r.emoji.name == data[:emoji][:name] : r.emoji.id == data[:emoji][:id]
|
946
|
+
end)
|
947
|
+
target_reaction.set_instance_variable(:@count, target_reaction.count - 1)
|
948
|
+
target_message.reactions.delete(target_reaction) if target_reaction.count.zero?
|
949
|
+
end
|
950
|
+
dispatch(:reaction_remove, ReactionEvent.new(self, data))
|
951
|
+
when "MESSAGE_REACTION_REMOVE_ALL"
|
952
|
+
if (target_message = @messages[data[:message_id]])
|
953
|
+
target_message.reactions = []
|
954
|
+
end
|
955
|
+
dispatch(:reaction_remove_all, ReactionRemoveAllEvent.new(self, data))
|
956
|
+
when "MESSAGE_REACTION_REMOVE_EMOJI"
|
957
|
+
if (target_message = @messages[data[:message_id]]) &&
|
958
|
+
(target_reaction = target_message.reactions.find { |r| data[:emoji][:id].nil? ? r.name == data[:emoji][:name] : r.id == data[:emoji][:id] })
|
959
|
+
target_message.reactions.delete(target_reaction)
|
960
|
+
end
|
961
|
+
dispatch(:reaction_remove_emoji, ReactionRemoveEmojiEvent.new(data))
|
962
|
+
when "TYPING_START"
|
963
|
+
dispatch(:typing_start, TypingStartEvent.new(self, data))
|
964
|
+
when "INTERACTION_CREATE"
|
965
|
+
interaction = Interaction.make_interaction(self, data)
|
966
|
+
dispatch(:integration_create, interaction)
|
967
|
+
|
968
|
+
dispatch(interaction.class.event_name, interaction)
|
969
|
+
when "RESUMED"
|
970
|
+
@log.info("Successfully resumed connection")
|
971
|
+
dispatch(:resumed)
|
972
|
+
else
|
973
|
+
@log.warn "Unknown event: #{event_name}\n#{data.inspect}"
|
932
974
|
end
|
933
|
-
dispatch(:reaction_add, ReactionEvent.new(self, data))
|
934
|
-
when "MESSAGE_REACTION_REMOVE"
|
935
|
-
if (target_message = @messages[data[:message_id]]) &&
|
936
|
-
(target_reaction = target_message.reactions.find do |r|
|
937
|
-
data[:emoji][:id].nil? ? r.emoji.name == data[:emoji][:name] : r.emoji.id == data[:emoji][:id]
|
938
|
-
end)
|
939
|
-
target_reaction.set_instance_variable(:@count, target_reaction.count - 1)
|
940
|
-
target_message.reactions.delete(target_reaction) if target_reaction.count.zero?
|
941
|
-
end
|
942
|
-
dispatch(:reaction_remove, ReactionEvent.new(self, data))
|
943
|
-
when "MESSAGE_REACTION_REMOVE_ALL"
|
944
|
-
if (target_message = @messages[data[:message_id]])
|
945
|
-
target_message.reactions = []
|
946
|
-
end
|
947
|
-
dispatch(:reaction_remove_all, ReactionRemoveAllEvent.new(self, data))
|
948
|
-
when "MESSAGE_REACTION_REMOVE_EMOJI"
|
949
|
-
if (target_message = @messages[data[:message_id]]) &&
|
950
|
-
(target_reaction = target_message.reactions.find { |r| data[:emoji][:id].nil? ? r.name == data[:emoji][:name] : r.id == data[:emoji][:id] })
|
951
|
-
target_message.reactions.delete(target_reaction)
|
952
|
-
end
|
953
|
-
dispatch(:reaction_remove_emoji, ReactionRemoveEmojiEvent.new(data))
|
954
|
-
when "TYPING_START"
|
955
|
-
dispatch(:typing_start, TypingStartEvent.new(self, data))
|
956
|
-
when "INTERACTION_CREATE"
|
957
|
-
interaction = Interaction.make_interaction(self, data)
|
958
|
-
dispatch(:integration_create, interaction)
|
959
|
-
|
960
|
-
dispatch(interaction.class.event_name, interaction)
|
961
|
-
when "RESUMED"
|
962
|
-
@log.info("Successfully resumed connection")
|
963
|
-
dispatch(:resumed)
|
964
|
-
else
|
965
|
-
@log.warn "Unknown event: #{event_name}\n#{data.inspect}"
|
966
975
|
end
|
967
976
|
end
|
968
977
|
end
|
969
|
-
end
|
978
|
+
end
|