mij-discord 1.0.9 → 1.0.10
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/lib/mij-discord/bot.rb +88 -36
- data/lib/mij-discord/cache.rb +309 -315
- data/lib/mij-discord/core/api.rb +238 -241
- data/lib/mij-discord/core/api/server.rb +464 -477
- data/lib/mij-discord/core/api/user.rb +142 -154
- data/lib/mij-discord/data/embed.rb +226 -226
- data/lib/mij-discord/data/member.rb +173 -175
- data/lib/mij-discord/data/server.rb +404 -467
- data/lib/mij-discord/data/user.rb +294 -296
- data/lib/mij-discord/events/basic.rb +14 -0
- data/lib/mij-discord/events/channel.rb +2 -0
- data/lib/mij-discord/events/server.rb +91 -101
- data/lib/mij-discord/version.rb +4 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4cfa11fc10dd075526964fe8ffaa8519d5979af3
|
4
|
+
data.tar.gz: '05699e8de50e4d153676da51a365c1cde48f3976'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2eccfc34f2bd4db916f72e42177b6be247899500d25f323042ad8272d8abf273b61064ea50c6d85d545f967277c8dc651d842ac4d195907d6259d1593bfbd89a
|
7
|
+
data.tar.gz: c4532abb901d8a0168423679e2e7a6578289fb8017aedccc36d5380c4a14cbda7a3c568f6c548eb6c639f55a1952e8918afc06cb09638754762b5920db51729d
|
data/lib/mij-discord/bot.rb
CHANGED
@@ -42,6 +42,7 @@ module MijDiscord
|
|
42
42
|
connect: MijDiscord::Events::Connect,
|
43
43
|
disconnect: MijDiscord::Events::Disconnect,
|
44
44
|
exception: MijDiscord::Events::Exception,
|
45
|
+
unhandled: MijDiscord::Events::Unhandled,
|
45
46
|
|
46
47
|
update_user: MijDiscord::Events::UpdateUser,
|
47
48
|
create_server: MijDiscord::Events::CreateServer,
|
@@ -62,6 +63,7 @@ module MijDiscord
|
|
62
63
|
update_channel: MijDiscord::Events::UpdateChannel,
|
63
64
|
delete_channel: MijDiscord::Events::DeleteChannel,
|
64
65
|
update_webhooks: MijDiscord::Events::UpdateWebhooks,
|
66
|
+
update_pins: MijDiscord::Events::UpdatePins,
|
65
67
|
add_recipient: MijDiscord::Events::AddRecipient,
|
66
68
|
remove_recipient: MijDiscord::Events::RemoveRecipient,
|
67
69
|
|
@@ -77,7 +79,6 @@ module MijDiscord
|
|
77
79
|
start_typing: MijDiscord::Events::StartTyping,
|
78
80
|
|
79
81
|
update_presence: MijDiscord::Events::UpdatePresence,
|
80
|
-
update_playing: MijDiscord::Events::UpdatePlaying,
|
81
82
|
update_voice_state: MijDiscord::Events::UpdateVoiceState,
|
82
83
|
}.freeze
|
83
84
|
|
@@ -246,31 +247,65 @@ module MijDiscord
|
|
246
247
|
end
|
247
248
|
end
|
248
249
|
|
249
|
-
def
|
250
|
-
|
250
|
+
def parse_mention_id(mention, type, server_id = nil)
|
251
|
+
case type
|
252
|
+
when :user
|
253
|
+
return server_id ? member(server_id, mention) : user(mention)
|
254
|
+
|
255
|
+
when :channel
|
256
|
+
return channel(mention, server_id)
|
251
257
|
|
252
|
-
|
253
|
-
|
254
|
-
server_id ? member(server_id, $1) : user($1)
|
255
|
-
when /^<@&(\d+)>$/
|
256
|
-
role = role(server_id, $1)
|
258
|
+
when :role
|
259
|
+
role = role(server_id, mention)
|
257
260
|
return role if role
|
258
261
|
|
259
262
|
servers.each do |sv|
|
260
|
-
role = sv.role(
|
263
|
+
role = sv.role(mention)
|
261
264
|
return role if role
|
262
265
|
end
|
263
|
-
|
264
|
-
|
266
|
+
|
267
|
+
when :emoji
|
268
|
+
emoji = emoji(server_id, mention)
|
265
269
|
return emoji if emoji
|
266
270
|
|
267
271
|
servers.each do |sv|
|
268
|
-
emoji = sv.emoji(
|
272
|
+
emoji = sv.emoji(mention)
|
269
273
|
return emoji if emoji
|
270
274
|
end
|
271
275
|
|
276
|
+
else raise TypeError, "Invalid mention type '#{type}'"
|
277
|
+
end
|
278
|
+
|
279
|
+
nil
|
280
|
+
end
|
281
|
+
|
282
|
+
def parse_mention(mention, server_id = nil, type: nil)
|
283
|
+
gateway_check
|
284
|
+
|
285
|
+
mention = mention.to_s.strip
|
286
|
+
|
287
|
+
if !type.nil? && mention =~ /^(\d+)$/
|
288
|
+
parse_mention_id($1, type, server_id)
|
289
|
+
|
290
|
+
elsif mention =~ /^<@!?(\d+)>$/
|
291
|
+
return nil if type && type != :user
|
292
|
+
parse_mention_id($1, :user, server_id)
|
293
|
+
|
294
|
+
elsif mention =~ /^<#(\d+)>$/
|
295
|
+
return nil if type && type != :channel
|
296
|
+
parse_mention_id($1, :channel, server_id)
|
297
|
+
|
298
|
+
elsif mention =~ /^<@&(\d+)>$/
|
299
|
+
return nil if type && type != :role
|
300
|
+
parse_mention_id($1, :role, server_id)
|
301
|
+
|
302
|
+
elsif mention =~ /^<(a?):(\w+):(\d+)>$/
|
303
|
+
return nil if type && type != :emoji
|
304
|
+
parse_mention_id($1, :emoji, server_id) || begin
|
272
305
|
em_data = { 'id' => $3.to_i, 'name' => $2, 'animated' => !$1.empty? }
|
273
306
|
MijDiscord::Data::Emoji.new(em_data, nil)
|
307
|
+
end
|
308
|
+
|
274
309
|
end
|
275
310
|
end
|
276
311
|
|
@@ -305,7 +340,16 @@ module MijDiscord
|
|
305
340
|
end
|
306
341
|
|
307
342
|
def ignored_user?(user)
|
308
|
-
|
343
|
+
user = user.to_id
|
344
|
+
|
345
|
+
return true if @ignore_self && user == @auth.id
|
346
|
+
return true if @ignored_ids.include?(user)
|
347
|
+
|
348
|
+
if @ignore_bots && (user = @cache.get_user(user, local: true))
|
349
|
+
return true if user.bot_account?
|
350
|
+
end
|
351
|
+
|
352
|
+
false
|
309
353
|
end
|
310
354
|
|
311
355
|
def update_presence(status: nil, game: nil)
|
@@ -384,6 +428,9 @@ module MijDiscord
|
|
384
428
|
when :SESSIONS_REPLACE
|
385
429
|
# Do nothing with session replace because no idea what it does.
|
386
430
|
|
431
|
+
when :PRESENCES_REPLACE
|
432
|
+
# Do nothing with presences replace because no idea what it does.
|
433
|
+
|
387
434
|
when :GUILD_MEMBERS_CHUNK
|
388
435
|
server = @cache.get_server(data['guild_id'])
|
389
436
|
server.update_members_chunk(data['members'])
|
@@ -435,6 +482,13 @@ module MijDiscord
|
|
435
482
|
channel = @cache.get_channel(data['channel_id'], nil)
|
436
483
|
trigger_event(:update_webhooks, self, channel)
|
437
484
|
|
485
|
+
when :CHANNEL_PINS_UPDATE
|
486
|
+
channel = @cache.get_channel(data['channel_id'], nil)
|
487
|
+
trigger_event(:update_pins, self, channel)
|
488
|
+
|
489
|
+
when :CHANNEL_PINS_ACK
|
490
|
+
# Do nothing with pins acknowledgement
|
491
|
+
|
438
492
|
when :CHANNEL_RECIPIENT_ADD
|
439
493
|
channel = @cache.get_channel(data['channel_id'], nil)
|
440
494
|
recipient = channel.update_recipient(add: data['user'])
|
@@ -483,20 +537,21 @@ module MijDiscord
|
|
483
537
|
|
484
538
|
when :GUILD_BAN_ADD
|
485
539
|
server = @cache.get_server(data['guild_id'])
|
486
|
-
user = @cache.get_user(data['user']['id'])
|
540
|
+
user = @cache.get_user(data['user']['id'], local: @auth.user?)
|
541
|
+
user ||= MijDiscord::Data::User.new(data['user'], self)
|
487
542
|
trigger_event(:ban_user, self, server, user)
|
488
543
|
|
489
544
|
when :GUILD_BAN_REMOVE
|
490
545
|
server = @cache.get_server(data['guild_id'])
|
491
|
-
user = @cache.get_user(data['user']['id'])
|
546
|
+
user = @cache.get_user(data['user']['id'], local: @auth.user?)
|
547
|
+
user ||= MijDiscord::Data::User.new(data['user'], self)
|
492
548
|
trigger_event(:unban_user, self, server, user)
|
493
549
|
|
494
550
|
when :MESSAGE_CREATE
|
495
|
-
return if ignored_user?(data['author']['id'])
|
496
|
-
return if @ignore_bots && data['author']['bot']
|
497
|
-
|
498
551
|
channel = @cache.get_channel(data['channel_id'], nil)
|
499
552
|
message = channel.cache.put_message(data)
|
553
|
+
|
554
|
+
return if ignored_user?(data['author']['id'])
|
500
555
|
trigger_event(:create_message, self, message)
|
501
556
|
|
502
557
|
if message.channel.private?
|
@@ -512,11 +567,10 @@ module MijDiscord
|
|
512
567
|
author = data['author']
|
513
568
|
return if author.nil?
|
514
569
|
|
515
|
-
return if ignored_user?(author['id'])
|
516
|
-
return if @ignore_bots && author['bot']
|
517
|
-
|
518
570
|
channel = @cache.get_channel(data['channel_id'], nil)
|
519
571
|
message = channel.cache.put_message(data, update: true)
|
572
|
+
|
573
|
+
return if ignored_user?(author['id'])
|
520
574
|
trigger_event(:edit_message, self, message)
|
521
575
|
|
522
576
|
when :MESSAGE_DELETE
|
@@ -534,9 +588,7 @@ module MijDiscord
|
|
534
588
|
message = channel.cache.get_message(data['message_id'], local: true)
|
535
589
|
message.update_reaction(add: data) if message
|
536
590
|
|
537
|
-
# Should add full use ignore support?
|
538
591
|
return if ignored_user?(data['user_id'])
|
539
|
-
|
540
592
|
trigger_event(:add_reaction, self, data)
|
541
593
|
trigger_event(:toggle_reaction, self, data)
|
542
594
|
|
@@ -545,9 +597,7 @@ module MijDiscord
|
|
545
597
|
message = channel.cache.get_message(data['message_id'], local: true)
|
546
598
|
message.update_reaction(remove: data) if message
|
547
599
|
|
548
|
-
# Should add full use ignore support?
|
549
600
|
return if ignored_user?(data['user_id'])
|
550
|
-
|
551
601
|
trigger_event(:remove_reaction, self, data)
|
552
602
|
trigger_event(:toggle_reaction, self, data)
|
553
603
|
|
@@ -560,6 +610,7 @@ module MijDiscord
|
|
560
610
|
|
561
611
|
when :TYPING_START
|
562
612
|
begin
|
613
|
+
return if ignored_user?(data['user_id'])
|
563
614
|
trigger_event(:start_typing, self, data)
|
564
615
|
rescue MijDiscord::Errors::Forbidden
|
565
616
|
# Ignoring the channel we can't access
|
@@ -568,23 +619,23 @@ module MijDiscord
|
|
568
619
|
|
569
620
|
when :USER_UPDATE
|
570
621
|
user = @cache.put_user(data, update: true)
|
622
|
+
@profile.update_data(data) if @profile == user
|
623
|
+
|
571
624
|
trigger_event(:update_user, self, user)
|
572
625
|
|
573
626
|
when :PRESENCE_UPDATE
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
old_game = member.game
|
580
|
-
member.update_presence(data)
|
581
|
-
|
582
|
-
if old_game != member.game
|
583
|
-
trigger_event(:update_playing, self, data)
|
627
|
+
if data['guild_id']
|
628
|
+
server = @cache.get_server(data['guild_id'])
|
629
|
+
user = server.cache.get_member(data['user']['id'])
|
630
|
+
user&.update_presence(data)
|
584
631
|
else
|
585
|
-
|
632
|
+
user = @cache.get_user(data['user']['id'])
|
633
|
+
user&.update_presence(data)
|
634
|
+
@profile.update_presence(data) if @profile == user
|
586
635
|
end
|
587
636
|
|
637
|
+
trigger_event(:update_presence, self, data)
|
638
|
+
|
588
639
|
when :VOICE_STATE_UPDATE
|
589
640
|
server = @cache.get_server(data['guild_id'])
|
590
641
|
state = server.update_voice_state(data)
|
@@ -592,6 +643,7 @@ module MijDiscord
|
|
592
643
|
|
593
644
|
else
|
594
645
|
MijDiscord::LOGGER.warn('Dispatch') { "Unhandled gateway event type: #{type}" }
|
646
|
+
trigger_event(:unhandled, self, type, data)
|
595
647
|
end
|
596
648
|
rescue => exc
|
597
649
|
MijDiscord::LOGGER.error('Dispatch') { 'An error occurred in dispatch handler' }
|
data/lib/mij-discord/cache.rb
CHANGED
@@ -1,316 +1,310 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module MijDiscord::Cache
|
4
|
-
class BotCache
|
5
|
-
def initialize(bot)
|
6
|
-
@bot = bot
|
7
|
-
|
8
|
-
reset
|
9
|
-
end
|
10
|
-
|
11
|
-
def reset
|
12
|
-
@servers, @channels, @users = {}, {}, {}
|
13
|
-
@pm_channels, @restricted_channels = {}, {}
|
14
|
-
end
|
15
|
-
|
16
|
-
def list_servers
|
17
|
-
@servers.values
|
18
|
-
end
|
19
|
-
|
20
|
-
def list_channels
|
21
|
-
@channels.values
|
22
|
-
end
|
23
|
-
|
24
|
-
def list_users
|
25
|
-
@users.values
|
26
|
-
end
|
27
|
-
|
28
|
-
def get_server(key, local: false)
|
29
|
-
id = key&.to_id
|
30
|
-
return @servers[id] if @servers.has_key?(id)
|
31
|
-
return nil if local
|
32
|
-
|
33
|
-
begin
|
34
|
-
response = MijDiscord::Core::API::Server.resolve(@bot.auth, id)
|
35
|
-
rescue MijDiscord::Errors::NotFound
|
36
|
-
return nil
|
37
|
-
end
|
38
|
-
|
39
|
-
@servers[id] = MijDiscord::Data::Server.new(JSON.parse(response), @bot)
|
40
|
-
end
|
41
|
-
|
42
|
-
def get_channel(key, server, local: false)
|
43
|
-
id = key&.to_id
|
44
|
-
return @channels[id] if @channels.has_key?(id)
|
45
|
-
raise MijDiscord::Errors::Forbidden if @restricted_channels[id]
|
46
|
-
return nil if local
|
47
|
-
|
48
|
-
begin
|
49
|
-
response = MijDiscord::Core::API::Channel.resolve(@bot.auth, id)
|
50
|
-
rescue MijDiscord::Errors::NotFound
|
51
|
-
return nil
|
52
|
-
rescue MijDiscord::Errors::Forbidden
|
53
|
-
@restricted_channels[id] = true
|
54
|
-
raise
|
55
|
-
end
|
56
|
-
|
57
|
-
channel = @channels[id] = MijDiscord::Data::Channel.create(JSON.parse(response), @bot, server)
|
58
|
-
@pm_channels[channel.recipient.id] = channel if channel.pm?
|
59
|
-
|
60
|
-
if (server = channel.server)
|
61
|
-
server.cache.put_channel!(channel)
|
62
|
-
end
|
63
|
-
|
64
|
-
channel
|
65
|
-
end
|
66
|
-
|
67
|
-
def get_pm_channel(key, local: false)
|
68
|
-
id = key&.to_id
|
69
|
-
return @pm_channels[id] if @pm_channels.has_key?(id)
|
70
|
-
return nil if local
|
71
|
-
|
72
|
-
response = MijDiscord::Core::API::User.create_pm(@bot.auth, id)
|
73
|
-
channel = MijDiscord::Data::Channel.create(JSON.parse(response), @bot, nil)
|
74
|
-
|
75
|
-
@channels[channel.id] = @pm_channels[id] = channel
|
76
|
-
end
|
77
|
-
|
78
|
-
def get_user(key, local: false)
|
79
|
-
id = key&.to_id
|
80
|
-
return @users[id] if @users.has_key?(id)
|
81
|
-
return nil if local
|
82
|
-
|
83
|
-
begin
|
84
|
-
response =
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
return
|
205
|
-
|
206
|
-
channel =
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
channel
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
@messages.
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
end
|
311
|
-
|
312
|
-
def inspect
|
313
|
-
MijDiscord.make_inspect(self)
|
314
|
-
end
|
315
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MijDiscord::Cache
|
4
|
+
class BotCache
|
5
|
+
def initialize(bot)
|
6
|
+
@bot = bot
|
7
|
+
|
8
|
+
reset
|
9
|
+
end
|
10
|
+
|
11
|
+
def reset
|
12
|
+
@servers, @channels, @users = {}, {}, {}
|
13
|
+
@pm_channels, @restricted_channels = {}, {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def list_servers
|
17
|
+
@servers.values
|
18
|
+
end
|
19
|
+
|
20
|
+
def list_channels
|
21
|
+
@channels.values
|
22
|
+
end
|
23
|
+
|
24
|
+
def list_users
|
25
|
+
@users.values
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_server(key, local: false)
|
29
|
+
id = key&.to_id || return
|
30
|
+
return @servers[id] if @servers.has_key?(id)
|
31
|
+
return nil if local
|
32
|
+
|
33
|
+
begin
|
34
|
+
response = MijDiscord::Core::API::Server.resolve(@bot.auth, id)
|
35
|
+
rescue MijDiscord::Errors::NotFound
|
36
|
+
return nil
|
37
|
+
end
|
38
|
+
|
39
|
+
@servers[id] = MijDiscord::Data::Server.new(JSON.parse(response), @bot)
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_channel(key, server, local: false)
|
43
|
+
id = key&.to_id || return
|
44
|
+
return @channels[id] if @channels.has_key?(id)
|
45
|
+
raise MijDiscord::Errors::Forbidden if @restricted_channels[id]
|
46
|
+
return nil if local
|
47
|
+
|
48
|
+
begin
|
49
|
+
response = MijDiscord::Core::API::Channel.resolve(@bot.auth, id)
|
50
|
+
rescue MijDiscord::Errors::NotFound
|
51
|
+
return nil
|
52
|
+
rescue MijDiscord::Errors::Forbidden
|
53
|
+
@restricted_channels[id] = true
|
54
|
+
raise
|
55
|
+
end
|
56
|
+
|
57
|
+
channel = @channels[id] = MijDiscord::Data::Channel.create(JSON.parse(response), @bot, server)
|
58
|
+
@pm_channels[channel.recipient.id] = channel if channel.pm?
|
59
|
+
|
60
|
+
if (server = channel.server)
|
61
|
+
server.cache.put_channel!(channel)
|
62
|
+
end
|
63
|
+
|
64
|
+
channel
|
65
|
+
end
|
66
|
+
|
67
|
+
def get_pm_channel(key, local: false)
|
68
|
+
id = key&.to_id || return
|
69
|
+
return @pm_channels[id] if @pm_channels.has_key?(id)
|
70
|
+
return nil if local
|
71
|
+
|
72
|
+
response = MijDiscord::Core::API::User.create_pm(@bot.auth, id)
|
73
|
+
channel = MijDiscord::Data::Channel.create(JSON.parse(response), @bot, nil)
|
74
|
+
|
75
|
+
@channels[channel.id] = @pm_channels[id] = channel
|
76
|
+
end
|
77
|
+
|
78
|
+
def get_user(key, local: false)
|
79
|
+
id = key&.to_id || return
|
80
|
+
return @users[id] if @users.has_key?(id)
|
81
|
+
return nil if local
|
82
|
+
|
83
|
+
begin
|
84
|
+
response = MijDiscord::Core::API::User.resolve(@bot.auth, id)
|
85
|
+
rescue MijDiscord::Errors::NotFound
|
86
|
+
return nil
|
87
|
+
end
|
88
|
+
|
89
|
+
@users[id] = MijDiscord::Data::User.new(JSON.parse(response), @bot)
|
90
|
+
end
|
91
|
+
|
92
|
+
def put_server(data, update: false)
|
93
|
+
id = data['id'].to_i
|
94
|
+
if @servers.has_key?(id)
|
95
|
+
@servers[id].update_data(data) if update
|
96
|
+
return @servers[id]
|
97
|
+
end
|
98
|
+
|
99
|
+
@servers[id] = MijDiscord::Data::Server.new(data, @bot)
|
100
|
+
end
|
101
|
+
|
102
|
+
def put_channel(data, server, update: false)
|
103
|
+
id = data['id'].to_i
|
104
|
+
if @channels.has_key?(id)
|
105
|
+
@channels[id].update_data(data) if update
|
106
|
+
return @channels[id]
|
107
|
+
end
|
108
|
+
|
109
|
+
channel = @channels[id] = MijDiscord::Data::Channel.create(data, @bot, server)
|
110
|
+
@pm_channels[channel.recipient.id] = channel if channel.pm?
|
111
|
+
|
112
|
+
if (server = channel.server)
|
113
|
+
server.cache.put_channel!(channel)
|
114
|
+
end
|
115
|
+
|
116
|
+
channel
|
117
|
+
end
|
118
|
+
|
119
|
+
def put_user(data, update: false)
|
120
|
+
id = data['id'].to_i
|
121
|
+
if @users.has_key?(id)
|
122
|
+
@users[id].update_data(data) if update
|
123
|
+
return @users[id]
|
124
|
+
end
|
125
|
+
|
126
|
+
@users[id] = MijDiscord::Data::User.new(data, @bot)
|
127
|
+
end
|
128
|
+
|
129
|
+
def remove_server(key)
|
130
|
+
@servers.delete(key&.to_id)
|
131
|
+
end
|
132
|
+
|
133
|
+
def remove_channel(key)
|
134
|
+
channel = @channels.delete(key&.to_id)
|
135
|
+
@pm_channels.delete(channel.recipient.id) if channel&.pm?
|
136
|
+
|
137
|
+
if (server = channel&.server)
|
138
|
+
server.cache.remove_channel(key)
|
139
|
+
end
|
140
|
+
|
141
|
+
channel
|
142
|
+
end
|
143
|
+
|
144
|
+
def remove_user(key)
|
145
|
+
@users.delete(key&.to_id)
|
146
|
+
end
|
147
|
+
|
148
|
+
def inspect
|
149
|
+
MijDiscord.make_inspect(self)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
class ServerCache
|
154
|
+
def initialize(server, bot)
|
155
|
+
@server, @bot = server, bot
|
156
|
+
|
157
|
+
reset
|
158
|
+
end
|
159
|
+
|
160
|
+
def reset
|
161
|
+
@channels, @members, @roles = {}, {}, {}
|
162
|
+
end
|
163
|
+
|
164
|
+
def list_members
|
165
|
+
@members.values
|
166
|
+
end
|
167
|
+
|
168
|
+
def list_roles
|
169
|
+
@roles.values
|
170
|
+
end
|
171
|
+
|
172
|
+
def list_channels
|
173
|
+
@channels.values
|
174
|
+
end
|
175
|
+
|
176
|
+
def get_member(key, local: false)
|
177
|
+
id = key&.to_id || return
|
178
|
+
return @members[id] if @members.has_key?(id)
|
179
|
+
return nil if local
|
180
|
+
|
181
|
+
begin
|
182
|
+
response = MijDiscord::Core::API::Server.resolve_member(@bot.auth, @server.id, id)
|
183
|
+
rescue MijDiscord::Errors::NotFound
|
184
|
+
return nil
|
185
|
+
end
|
186
|
+
|
187
|
+
@members[id] = MijDiscord::Data::Member.new(JSON.parse(response), @server, @bot)
|
188
|
+
end
|
189
|
+
|
190
|
+
def get_role(key, local: false)
|
191
|
+
id = key&.to_id || return
|
192
|
+
return @roles[id] if @roles.has_key?(id)
|
193
|
+
return nil if local
|
194
|
+
|
195
|
+
# No API to get individual role
|
196
|
+
nil
|
197
|
+
end
|
198
|
+
|
199
|
+
def get_channel(key, local: false)
|
200
|
+
id = key&.to_id || return
|
201
|
+
return @channels[id] if @channels.has_key?(id)
|
202
|
+
|
203
|
+
channel = @bot.cache.get_channel(key, local: local)
|
204
|
+
return nil unless channel&.server == @server
|
205
|
+
|
206
|
+
@channels[channel.id] = channel
|
207
|
+
end
|
208
|
+
|
209
|
+
def put_member(data, update: false)
|
210
|
+
id = data['user']['id'].to_i
|
211
|
+
if @members.has_key?(id)
|
212
|
+
@members[id].update_data(data) if update
|
213
|
+
return @members[id]
|
214
|
+
end
|
215
|
+
|
216
|
+
@members[id] = MijDiscord::Data::Member.new(data, @server, @bot)
|
217
|
+
end
|
218
|
+
|
219
|
+
def put_role(data, update: false)
|
220
|
+
id = data['id'].to_i
|
221
|
+
if @roles.has_key?(id)
|
222
|
+
@roles[id].update_data(data) if update
|
223
|
+
return @roles[id]
|
224
|
+
end
|
225
|
+
|
226
|
+
@roles[id] = MijDiscord::Data::Role.new(data, @server, @bot)
|
227
|
+
end
|
228
|
+
|
229
|
+
def put_channel(data, update: false)
|
230
|
+
channel = @bot.cache.put_channel(data, @server, update: update)
|
231
|
+
@channels[channel.id] = channel
|
232
|
+
end
|
233
|
+
|
234
|
+
def put_channel!(channel)
|
235
|
+
@channels[channel.id] = channel
|
236
|
+
end
|
237
|
+
|
238
|
+
def remove_member(key)
|
239
|
+
@members.delete(key&.to_id)
|
240
|
+
end
|
241
|
+
|
242
|
+
def remove_role(key)
|
243
|
+
@roles.delete(key&.to_id)
|
244
|
+
end
|
245
|
+
|
246
|
+
def remove_channel(key)
|
247
|
+
channel = @channels.delete(key&.to_id)
|
248
|
+
@bot.cache.remove_channel(key) if channel
|
249
|
+
|
250
|
+
channel
|
251
|
+
end
|
252
|
+
|
253
|
+
def inspect
|
254
|
+
MijDiscord.make_inspect(self)
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
class ChannelCache
|
259
|
+
MAX_MESSAGES = 200
|
260
|
+
|
261
|
+
def initialize(channel, bot, max_messages: MAX_MESSAGES)
|
262
|
+
@channel, @bot = channel, bot
|
263
|
+
@max_messages = max_messages
|
264
|
+
|
265
|
+
reset
|
266
|
+
end
|
267
|
+
|
268
|
+
def reset
|
269
|
+
@messages = {}
|
270
|
+
end
|
271
|
+
|
272
|
+
def get_message(key, local: false)
|
273
|
+
id = key&.to_id || return
|
274
|
+
return @messages[id] if @messages.has_key?(id)
|
275
|
+
return nil if local
|
276
|
+
|
277
|
+
begin
|
278
|
+
response = MijDiscord::Core::API::Channel.message(@bot.auth, @channel.id, key)
|
279
|
+
rescue MijDiscord::Errors::NotFound
|
280
|
+
return nil
|
281
|
+
end
|
282
|
+
|
283
|
+
message = @messages.store(id, MijDiscord::Data::Message.new(JSON.parse(response), @bot))
|
284
|
+
@messages.shift while @messages.length > @max_messages
|
285
|
+
|
286
|
+
message
|
287
|
+
end
|
288
|
+
|
289
|
+
def put_message(data, update: false)
|
290
|
+
id = data['id'].to_i
|
291
|
+
if @messages.has_key?(id)
|
292
|
+
@messages[id].update_data(data) if update
|
293
|
+
return @messages[id]
|
294
|
+
end
|
295
|
+
|
296
|
+
message = @messages.store(id, MijDiscord::Data::Message.new(data, @bot))
|
297
|
+
@messages.shift while @messages.length > @max_messages
|
298
|
+
|
299
|
+
message
|
300
|
+
end
|
301
|
+
|
302
|
+
def remove_message(key)
|
303
|
+
@messages.delete(key&.to_id)
|
304
|
+
end
|
305
|
+
|
306
|
+
def inspect
|
307
|
+
MijDiscord.make_inspect(self)
|
308
|
+
end
|
309
|
+
end
|
316
310
|
end
|