Closed Innf107 closed 3 years ago
Ah I see, though I'm not sure what the best exposed interface would be though, I guess something like
-- unsure on naming
data Maybe2 a = Just2 a | Nothing2 | Null2
data ModifyGuildMemberData = ModifyGuildMemberData
{ nick :: Maybe2 Text
, roles :: Maybe2 [Snowflake Role]
, mute :: Maybe2 Bool
, deaf :: Maybe2 Bool
, channelID :: Maybe2 (Snowflake VoiceChannel)
}
would work
Another option would be
data ModifyGuildMemberData = ModifyGuildMemberData
{ nick :: Maybe (Maybe Text)
, roles :: Maybe (Maybe [Snowflake Role])
, mute :: Maybe (Maybe Bool)
, deaf :: Maybe (Maybe Bool)
, channelID :: Maybe (Maybe (Snowflake VoiceChannel))
}
Not very elegant, but at least this would not have to invent a new type
it would mean the user would have to remember which layer omitted the key, and which one set to null.
I think a better named version of maybe2 would be
data OmittableField a = Provided a | Reset | Unchanged
Another way would be something wrapping Map Text Value
and providing functions like modifyGuildMemberAccessToken :: Text -> ModifyGuildMemberData
and giving monoid/semigroup instances for ModifyGuildMemberData
This should now be possible using the changes introduced in 4ebdc717480d957c387e99fb6dbf528a97ffe10e
Great, thank you!
According to the discord developer documentation, all fields to ModifyGuildMember should be optional and nullable.
In this implementation, all fields are represented as Maybes and are therefore optional, but cannot be set to null.
In practice this means, that disconnecting a player from a voice channel or resetting their nickname is impossible.