simmsb / calamity

A library for writing discord bots in haskell
https://hackage.haskell.org/package/calamity
MIT License
109 stars 11 forks source link

ModifyGuildMember parameters are not nullable #36

Closed Innf107 closed 3 years ago

Innf107 commented 3 years ago

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.

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

Innf107 commented 3 years ago

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

simmsb commented 3 years ago

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

simmsb commented 3 years ago

This should now be possible using the changes introduced in 4ebdc717480d957c387e99fb6dbf528a97ffe10e

Innf107 commented 3 years ago

Great, thank you!