module Network.Discord.Rest.User
(
UserRequest(..)
) where
import Data.Aeson
import Data.Hashable
import Data.Monoid (mempty)
import Data.Text as T
import Network.Discord.Rest.Prelude
import Network.Discord.Types
import Network.Discord.Rest.HTTP
data UserRequest a where
GetCurrentUser :: UserRequest User
GetUser :: Snowflake -> UserRequest User
ModifyCurrentUser :: ToJSON a => a -> UserRequest User
GetCurrentUserGuilds :: Range -> UserRequest Guild
LeaveGuild :: Snowflake -> UserRequest ()
GetUserDMs :: UserRequest [Channel]
CreateDM :: Snowflake -> UserRequest Channel
instance Hashable (UserRequest a) where
hashWithSalt s (GetCurrentUser) = hashWithSalt s ("me"::Text)
hashWithSalt s (GetUser _) = hashWithSalt s ("user"::Text)
hashWithSalt s (ModifyCurrentUser _) = hashWithSalt s ("modify_user"::Text)
hashWithSalt s (GetCurrentUserGuilds _) = hashWithSalt s ("get_user_guilds"::Text)
hashWithSalt s (LeaveGuild g) = hashWithSalt s ("leave_guild"::Text, g)
hashWithSalt s (GetUserDMs) = hashWithSalt s ("get_dms"::Text)
hashWithSalt s (CreateDM _) = hashWithSalt s ("make_dm"::Text)
instance RateLimit (UserRequest a)
instance (FromJSON a) => DoFetch (UserRequest a) where
doFetch req = SyncFetched <$> go req
where
url = baseUrl /: "users"
go :: UserRequest a -> DiscordM a
go r@(GetCurrentUser) = makeRequest r
$ Get (url /: "@me") mempty
go r@(GetUser user) = makeRequest r
$ Get (url // user ) mempty
go r@(ModifyCurrentUser patch) = makeRequest r
$ Patch (url /: "@me") (ReqBodyJson patch) mempty
go r@(GetCurrentUserGuilds range) = makeRequest r
$ Get url $ toQueryString range
go r@(LeaveGuild guild) = makeRequest r
$ Delete (url /: "@me" /: "guilds" // guild) mempty
go r@(GetUserDMs) = makeRequest r
$ Get (url /: "@me" /: "channels") mempty
go r@(CreateDM user) = makeRequest r
$ Post (url /: "@me" /: "channels")
(ReqBodyJson $ object ["recipient_id" .= user])
mempty