Skip to content

Commit 3f6e0d1

Browse files
feat(gateway): support guild members request and member update events
1 parent 09accfd commit 3f6e0d1

File tree

4 files changed

+71
-3
lines changed

4 files changed

+71
-3
lines changed

Sources/DiscordKitCore/Objects/Data/Member.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,20 @@ public struct Member: Codable, GatewayData {
2121
public let communication_disabled_until: Date? // When the user's timeout will expire and the user will be able to communicate in the guild again, null or a time in the past if the user is not timed out
2222
public let guild_id: Snowflake?
2323
public let user_id: Snowflake? // Only present in merged_members in READY payload!
24+
25+
public init(from updateMember: GuildMemberUpdate, merging: Self? = nil) {
26+
self.user = updateMember.user
27+
self.nick = updateMember.nick
28+
self.avatar = updateMember.avatar
29+
self.roles = updateMember.roles
30+
self.joined_at = merging?.joined_at ?? updateMember.joined_at ?? .distantPast
31+
self.premium_since = updateMember.premium_since
32+
self.deaf = merging?.deaf ?? updateMember.deaf ?? false
33+
self.mute = merging?.mute ?? updateMember.mute ?? false
34+
self.pending = updateMember.pending
35+
self.permissions = merging?.permissions
36+
self.communication_disabled_until = updateMember.communication_disabled_until
37+
self.guild_id = updateMember.guild_id
38+
self.user_id = merging?.user_id
39+
}
2440
}

Sources/DiscordKitCore/Objects/Gateway/DataStructs.swift

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,19 @@ public struct GatewayVoiceStateUpdate: OutgoingGatewayData, GatewayData {
6565
/// Guild Request Members
6666
///
6767
/// > Outgoing Gateway data struct for opcode 8
68-
public struct GatewayGuildRequestMembers: GatewayData {
69-
public let guild_id: Snowflake
68+
public struct GatewayGuildRequestMembers: OutgoingGatewayData, GatewayData {
69+
public init(guild_id: [Snowflake], query: String? = nil, limit: Int? = nil, presences: Bool? = nil, user_ids: [Snowflake]? = nil, nonce: String? = nil) {
70+
self.guild_id = guild_id
71+
self.query = query
72+
self.limit = limit
73+
self.presences = presences
74+
self.user_ids = user_ids
75+
self.nonce = nonce
76+
}
77+
78+
public let guild_id: [Snowflake]
7079
public let query: String?
71-
public let limit: Int
80+
public let limit: Int?
7281
public let presences: Bool? // Used to specify if we want the presences of the matched members
7382
public let user_ids: [Snowflake]? // Used to specify which users you wish to fetch
7483
public let nonce: String? // Nonce to identify the Guild Members Chunk response
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//
2+
// GuildMembersChunk.swift
3+
//
4+
//
5+
// Created by Vincent Kwok on 11/12/23.
6+
//
7+
8+
import Foundation
9+
10+
/// Guild Members Chunk
11+
///
12+
/// Sent in response to a
13+
public struct GuildMembersChunk: GatewayData {
14+
public let guild_id: Snowflake
15+
public let members: [Member]
16+
public let chunk_index: Int
17+
public let chunk_count: Int
18+
public let not_found: [Snowflake]?
19+
public let presences: [Presence]?
20+
public let nonce: String?
21+
}

Sources/DiscordKitCore/Objects/Gateway/GatewayIO.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ public struct GatewayIncoming: Decodable {
8484
/// > server outage.
8585
case guildDelete(GuildUnavailable)
8686

87+
/// Guild members chunk
88+
case guildMembersChunk(GuildMembersChunk)
89+
8790
// MARK: - Channels
8891

8992
/// Channel create event
@@ -166,6 +169,19 @@ public struct GatewayIncoming: Decodable {
166169
/// > presence updates for users in a certain guild.
167170
case presenceUpdate(PresenceUpdate)
168171

172+
// MARK: - Guild Members
173+
174+
/// Guild member add
175+
///
176+
/// Sent when a new user joins a guild
177+
case guildMemberAdd(Member)
178+
179+
/// Guild member remove
180+
case guildMemberRemove(GuildMemberRemove)
181+
182+
/// Guild member update
183+
case guildMemberUpdate(GuildMemberUpdate)
184+
169185
// MARK: - Interactions
170186

171187
/// Interaction create event
@@ -238,6 +254,7 @@ public struct GatewayIncoming: Decodable {
238254
case .guildCreate: data = .guildCreate(try values.decode(Guild.self, forKey: .data))
239255
case .guildUpdate: data = .guildUpdate(try values.decode(Guild.self, forKey: .data))
240256
case .guildDelete: data = .guildDelete(try values.decode(GuildUnavailable.self, forKey: .data))
257+
case .guildMembersChunk: data = .guildMembersChunk(try values.decode(GuildMembersChunk.self, forKey: .data))
241258
/*
242259
case .guildBanAdd, .guildBanRemove: data = try values.decode(GuildBan.self, forKey: .data)
243260
case .guildEmojisUpdate: data = try values.decode(GuildEmojisUpdate.self, forKey: .data)
@@ -264,6 +281,11 @@ public struct GatewayIncoming: Decodable {
264281
case .userUpdate: data = .userUpdate(try values.decode(CurrentUser.self, forKey: .data))
265282
case .presenceUpdate: data = .presenceUpdate(try values.decode(PresenceUpdate.self, forKey: .data))
266283

284+
// MARK: Members
285+
case .guildMemberAdd: data = .guildMemberAdd(try values.decode(Member.self, forKey: .data))
286+
case .guildMemberRemove: data = .guildMemberRemove(try values.decode(GuildMemberRemove.self, forKey: .data))
287+
case .guildMemberUpdate: data = .guildMemberUpdate(try values.decode(GuildMemberUpdate.self, forKey: .data))
288+
267289
// MARK: Interactions
268290
case .interactionCreate: data = .interaction(try values.decode(Interaction.self, forKey: .data))
269291

0 commit comments

Comments
 (0)