@@ -81,7 +81,10 @@ proc voiceStateUpdate(s: Shard, data: JsonNode) {.async.} =
8181 let voiceState = newVoiceState (data)
8282 var oldVoiceState: Option [VoiceState ]
8383 if guild.id in s.cache.guilds and voiceState.user_id in guild.members:
84- guild.members[voiceState.user_id].voice_state = some voiceState
84+ let member = guild.members[voiceState.user_id]
85+ member.voice_state = some voiceState
86+ member.mute = voiceState.mute
87+ member.deaf = voiceState.deaf
8588
8689 if guild.voice_states.hasKeyOrPut (voiceState.user_id, voiceState):
8790 if voiceState.channel_id.isSome:
@@ -422,8 +425,7 @@ proc messageUpdate(s: Shard, data: JsonNode) {.async.} =
422425 oldMessage = some move chan.messages[msg.id]
423426 exists = true
424427
425- msg = msg.updateMessage (data)
426- if msg.id in chan.messages: chan.messages[msg.id] = msg
428+ msg = data.newMessage
427429 elif msg.channel_id in s.cache.dmChannels:
428430 let chan = s.cache.dmChannels[msg.channel_id]
429431
@@ -432,8 +434,7 @@ proc messageUpdate(s: Shard, data: JsonNode) {.async.} =
432434 oldMessage = some move chan.messages[msg.id]
433435 exists = true
434436
435- msg = msg.updateMessage (data)
436- if msg.id in chan.messages: chan.messages[msg.id] = msg
437+ msg = data.newMessage
437438
438439 s.checkAndCall (MessageUpdate , msg, oldMessage, exists)
439440
@@ -569,39 +570,30 @@ proc guildMemberUpdate(s: Shard, data: JsonNode) {.async.} =
569570 Guild (id: data[" guild_id" ].str)
570571 )
571572
572- member = guild.members.getOrDefault (data[" user" ][" id" ].str, Member (
573- user: User (
574- id: data[" user" ][" id" ].str
575- )
576- ))
577-
573+ var member = data.newMember
578574 var oldMember: Option [Member ]
579575
580- if member.user.id in guild.members:
581- oldMember = some move guild.members[member.user.id]
582-
583- guild.members[member.user.id] = member
584-
585- member.user = newUser (data[" user" ])
586-
587576 if s.cache.preferences.cache_users and member.user.id notin s.cache.users:
588577 s.cache.users[member.user.id] = member.user
589578
590- if " nick" in data and data[" nick" ].kind != JNull :
591- member.nick = some data[" nick" ].str
592- if " premium_since" in data and data[" premium_since" ].kind != JNull :
593- member.premium_since = some data[" premium_since" ].str
579+ if member.user.id in guild.members:
580+ oldMember = some move guild.members[member.user.id]
594581
595- member.roles = @ []
596- for role in data[" roles" ].elems:
597- member.roles.add (role.str)
582+ if " mute" notin data:
583+ member.mute = oldMember.get.mute
584+ if " deaf" notin data:
585+ member.deaf = oldMember.get.deaf
586+ if " flags" notin data:
587+ member.flags = oldMember.get.flags
588+ if " permissions" notin data:
589+ member.permissions = oldMember.get.permissions
590+ member.presence = oldMember.get.presence
591+ member.voice_state = oldMember.get.voice_state
592+ # these are the ones that should be kept unchanged and not defaulted
593+ # I noticed that the raw json data includes the stuff that we need to know
594+ # but doesnt include the stuff that we may already know e.g. mute/deaf
598595
599- if " flags" in data and data[" flags" ].kind != JNull :
600- member.flags = cast [set [GuildMemberFlags ]](data[" flags" ].getInt)
601- if " avatar_decoration_data" in data and data[" avatar_decoration_data" ].kind!= JNull :
602- member.avatar_decoration_data= ($ data[" avatar_decoration_data" ]).fromJson (
603- typeof (member.avatar_decoration_data)
604- )
596+ guild.members[member.user.id] = member
605597
606598 s.checkAndCall (GuildMemberUpdate , guild, member, oldMember)
607599
0 commit comments