Skip to content

Commit 758c306

Browse files
Merge pull request #137 from mineral-dart/fix/members
fix: cache who loose members
2 parents 0f5458a + af43c82 commit 758c306

File tree

4 files changed

+49
-0
lines changed

4 files changed

+49
-0
lines changed

lib/src/constants.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ enum PacketType {
4949
guildScheduledEventUpdate('GUILD_SCHEDULED_EVENT_UPDATE'),
5050
guildScheduledEventUserAdd('GUILD_SCHEDULED_EVENT_USER_ADD'),
5151
guildScheduledEventUserRemove('GUILD_SCHEDULED_EVENT_USER_REMOVE'),
52+
guildMemberChunk('GUILD_MEMBERS_CHUNK'),
5253

5354
webhookUpdate('WEBHOOKS_UPDATE'),
5455

lib/src/internal/mixins/mineral_client.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:mineral/core.dart';
55
import 'package:mineral/core/api.dart';
66
import 'package:mineral/core/builders.dart';
77
import 'package:mineral/framework.dart';
8+
import 'package:mineral/internal.dart';
89
import 'package:mineral/src/api/channels/partial_channel.dart';
910
import 'package:mineral/src/api/managers/channel_manager.dart';
1011
import 'package:mineral/src/api/managers/emoji_manager.dart';
@@ -128,6 +129,14 @@ extension MineralClientExtension on MineralClient {
128129
users.cache.putIfAbsent(user.id, () => user);
129130
}
130131

132+
if(websocketPayload['members'].length > 1000) {
133+
container.use<ShardManager>().send(OpCode.requestGuildMember, {
134+
'guild_id': websocketPayload['id'],
135+
'query': '',
136+
'limit': 0,
137+
});
138+
}
139+
131140
for(dynamic payload in websocketPayload['channels']) {
132141
payload['guild_id'] = websocketPayload['id'];
133142
final GuildChannel? channel = ChannelWrapper.create(payload);
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import 'package:mineral/core/api.dart';
2+
import 'package:mineral/framework.dart';
3+
import 'package:mineral/src/internal/mixins/container.dart';
4+
import 'package:mineral/src/internal/websockets/websocket_packet.dart';
5+
import 'package:mineral/src/internal/websockets/websocket_response.dart';
6+
7+
class GuildMemberChunkPacker with Container implements WebsocketPacket {
8+
@override
9+
Future<void> handle(WebsocketResponse websocketResponse) async {
10+
MineralClient client = container.use<MineralClient>();
11+
dynamic payload = websocketResponse.payload;
12+
13+
if (payload['guild_id'] == null) {
14+
return;
15+
}
16+
17+
Guild? guild = client.guilds.cache.getOrFail(payload['guild_id']);
18+
19+
for (dynamic member in payload['members']) {
20+
if(guild.members.cache.containsKey(member['user']['id'])) {
21+
continue;
22+
}
23+
24+
User user = User.from(member['user']);
25+
GuildMember guildMember = GuildMember.from(
26+
roles: guild.roles,
27+
user: user,
28+
member: member,
29+
guild: guild,
30+
voice: VoiceManager.empty(member['deaf'], member['mute'], user.id, payload['guild_id'])
31+
);
32+
33+
guild.members.cache.putIfAbsent(guildMember.user.id, () => guildMember);
34+
client.users.cache.putIfAbsent(user.id, () => user);
35+
}
36+
}
37+
}

lib/src/internal/websockets/websocket_dispatcher.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:mineral/src/internal/websockets/packets/channel_delete_packet.da
77
import 'package:mineral/src/internal/websockets/packets/channel_update_packet.dart';
88
import 'package:mineral/src/internal/websockets/packets/guild_create_packet.dart';
99
import 'package:mineral/src/internal/websockets/packets/guild_integrations_update.dart';
10+
import 'package:mineral/src/internal/websockets/packets/guild_member_chunk_packet.dart';
1011
import 'package:mineral/src/internal/websockets/packets/guild_remove_packet.dart';
1112
import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_create.dart';
1213
import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_delete.dart';
@@ -70,6 +71,7 @@ class WebsocketDispatcher {
7071
register(PacketType.voiceStateUpdate, VoiceStateUpdatePacket());
7172
register(PacketType.inviteCreate, InviteCreatePacket());
7273
register(PacketType.inviteDelete, InviteDeletePacket());
74+
register(PacketType.guildMemberChunk, GuildMemberChunkPacker());
7375
}
7476

7577
void register (PacketType type, WebsocketPacket packet) {

0 commit comments

Comments
 (0)