mij-discord 1.0.9 → 1.0.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ebc5f61a41aee441ed9a1d69a93f995fc96934d0
4
- data.tar.gz: dcfb7ee3f5c9cfc9e82dbe4d2cc45e5ae2816cb1
3
+ metadata.gz: 4cfa11fc10dd075526964fe8ffaa8519d5979af3
4
+ data.tar.gz: '05699e8de50e4d153676da51a365c1cde48f3976'
5
5
  SHA512:
6
- metadata.gz: f68e2a58808f9ae6a33fc8b22948796953135f0c7d7820df2c4d033d9c3a00891f39022287aeb39dc69e8654f4e05619731c540fbe4bbf25518417ffd139e619
7
- data.tar.gz: 15d6056effdbe7da11d6d8508aadb59cb45113b72635e18fd7574adc4bd1e630f229f0ca1c117d170e5a9addb3b4ebf0085250ba34394d32111b96bd2296724e
6
+ metadata.gz: 2eccfc34f2bd4db916f72e42177b6be247899500d25f323042ad8272d8abf273b61064ea50c6d85d545f967277c8dc651d842ac4d195907d6259d1593bfbd89a
7
+ data.tar.gz: c4532abb901d8a0168423679e2e7a6578289fb8017aedccc36d5380c4a14cbda7a3c568f6c548eb6c639f55a1952e8918afc06cb09638754762b5920db51729d
@@ -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 parse_mention(mention, server_id = nil)
250
- gateway_check
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
- case mention
253
- when /^<@!?(\d+)>$/
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($1)
263
+ role = sv.role(mention)
261
264
  return role if role
262
265
  end
263
- when /^<(a?):(\w+):(\d+)>$/
264
- emoji = emoji(server_id, $3)
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($3)
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
- @ignore_self && user.to_id == @auth.id || @ignored_ids.include?(user.to_id)
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
- return unless data['guild_id']
575
-
576
- server = @cache.get_server(data['guild_id'])
577
- member = server.cache.put_member(data, update: true)
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
- trigger_event(:update_presence, self, data)
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' }
@@ -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 = case @bot.auth.type
85
- when :bot then MijDiscord::Core::API::User.resolve(@bot.auth, id)
86
- when :user then MijDiscord::Core::API::User.resolve2(@bot.auth, id)
87
- end
88
- rescue MijDiscord::Errors::NotFound
89
- return nil
90
- end
91
-
92
- @users[id] = MijDiscord::Data::User.new(JSON.parse(response), @bot)
93
- end
94
-
95
- def put_server(data, update: false)
96
- id = data['id'].to_i
97
- if @servers.has_key?(id)
98
- @servers[id].update_data(data) if update
99
- return @servers[id]
100
- end
101
-
102
- @servers[id] = MijDiscord::Data::Server.new(data, @bot)
103
- end
104
-
105
- def put_channel(data, server, update: false)
106
- id = data['id'].to_i
107
- if @channels.has_key?(id)
108
- @channels[id].update_data(data) if update
109
- return @channels[id]
110
- end
111
-
112
- channel = @channels[id] = MijDiscord::Data::Channel.create(data, @bot, server)
113
- @pm_channels[channel.recipient.id] = channel if channel.pm?
114
-
115
- if (server = channel.server)
116
- server.cache.put_channel!(channel)
117
- end
118
-
119
- channel
120
- end
121
-
122
- def put_user(data, update: false)
123
- id = data['id'].to_i
124
- if @users.has_key?(id)
125
- @users[id].update_data(data) if update
126
- return @users[id]
127
- end
128
-
129
- @users[id] = MijDiscord::Data::User.new(data, @bot)
130
- end
131
-
132
- def remove_server(key)
133
- @servers.delete(key&.to_id)
134
- end
135
-
136
- def remove_channel(key)
137
- channel = @channels.delete(key&.to_id)
138
- @pm_channels.delete(channel.recipient.id) if channel&.pm?
139
-
140
- if (server = channel&.server)
141
- server.cache.remove_channel(key)
142
- end
143
-
144
- channel
145
- end
146
-
147
- def remove_user(key)
148
- @users.delete(key&.to_id)
149
- end
150
-
151
- def inspect
152
- MijDiscord.make_inspect(self)
153
- end
154
- end
155
-
156
- class ServerCache
157
- def initialize(server, bot)
158
- @server, @bot = server, bot
159
-
160
- reset
161
- end
162
-
163
- def reset
164
- @channels, @members, @roles = {}, {}, {}
165
- end
166
-
167
- def list_members
168
- @members.values
169
- end
170
-
171
- def list_roles
172
- @roles.values
173
- end
174
-
175
- def list_channels
176
- @channels.values
177
- end
178
-
179
- def get_member(key, local: false)
180
- id = key&.to_id
181
- return @members[id] if @members.has_key?(id)
182
- return nil if local
183
-
184
- begin
185
- response = MijDiscord::Core::API::Server.resolve_member(@bot.auth, @server.id, id)
186
- rescue MijDiscord::Errors::NotFound
187
- return nil
188
- end
189
-
190
- @members[id] = MijDiscord::Data::Member.new(JSON.parse(response), @server, @bot)
191
- end
192
-
193
- def get_role(key, local: false)
194
- id = key&.to_id
195
- return @roles[id] if @roles.has_key?(id)
196
- return nil if local
197
-
198
- # No API to get individual role
199
- nil
200
- end
201
-
202
- def get_channel(key, local: false)
203
- id = key&.to_id
204
- return @channels[id] if @channels.has_key?(id)
205
-
206
- channel = @bot.cache.get_channel(key, local: local)
207
- return nil unless channel&.server == @server
208
-
209
- @channels[channel.id] = channel
210
- end
211
-
212
- def put_member(data, update: false)
213
- id = data['user']['id'].to_i
214
- if @members.has_key?(id)
215
- @members[id].update_data(data) if update
216
- return @members[id]
217
- end
218
-
219
- @members[id] = MijDiscord::Data::Member.new(data, @server, @bot)
220
- end
221
-
222
- def put_role(data, update: false)
223
- id = data['id'].to_i
224
- if @roles.has_key?(id)
225
- @roles[id].update_data(data) if update
226
- return @roles[id]
227
- end
228
-
229
- @roles[id] = MijDiscord::Data::Role.new(data, @server, @bot)
230
- end
231
-
232
- def put_channel(data, update: false)
233
- channel = @bot.cache.put_channel(data, @server, update: update)
234
- @channels[channel.id] = channel
235
- end
236
-
237
- def put_channel!(channel)
238
- @channels[channel.id] = channel
239
- end
240
-
241
- def remove_member(key)
242
- @members.delete(key&.to_id)
243
- end
244
-
245
- def remove_role(key)
246
- @roles.delete(key&.to_id)
247
- end
248
-
249
- def remove_channel(key)
250
- channel = @channels.delete(key&.to_id)
251
- @bot.cache.remove_channel(key) if channel
252
-
253
- channel
254
- end
255
-
256
- def inspect
257
- MijDiscord.make_inspect(self)
258
- end
259
- end
260
-
261
- class ChannelCache
262
- MAX_MESSAGES = 200
263
-
264
- def initialize(channel, bot, max_messages: MAX_MESSAGES)
265
- @channel, @bot = channel, bot
266
- @max_messages = max_messages
267
-
268
- reset
269
- end
270
-
271
- def reset
272
- @messages = {}
273
- end
274
-
275
- def get_message(key, local: false)
276
- id = key&.to_id
277
- return @messages[id] if @messages.has_key?(id)
278
- return nil if local
279
-
280
- begin
281
- response = case @bot.auth.type
282
- when :bot then MijDiscord::Core::API::Channel.message(@bot.auth, @channel.id, key)
283
- when :user then MijDiscord::Core::API::Channel.messages(@bot.auth, @channel.id, 1, nil, nil, key)
284
- end
285
- rescue MijDiscord::Errors::NotFound
286
- return nil
287
- end
288
-
289
- message = @messages.store(id, MijDiscord::Data::Message.new(JSON.parse(response), @bot))
290
- @messages.shift while @messages.length > @max_messages
291
-
292
- message
293
- end
294
-
295
- def put_message(data, update: false)
296
- id = data['id'].to_i
297
- if @messages.has_key?(id)
298
- @messages[id].update_data(data) if update
299
- return @messages[id]
300
- end
301
-
302
- message = @messages.store(id, MijDiscord::Data::Message.new(data, @bot))
303
- @messages.shift while @messages.length > @max_messages
304
-
305
- message
306
- end
307
-
308
- def remove_message(key)
309
- @messages.delete(key&.to_id)
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