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 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