module Main where import Control.Monad ( forM_ , forever , void ) import Control.Monad.Trans ( lift ) import Conduit import qualified Data.Text.IO as TIO import Discord import Discord.Voice import qualified Discord.Requests as R import Discord.Types import UnliftIO ( liftIO ) import Control.Concurrent main :: IO () main = do tok <- TIO.readFile "./examples/production.secret" t <- runDiscord $ def { discordToken = tok , discordOnStart = startHandler , discordOnEnd = liftIO $ putStrLn "Ended" , discordOnEvent = eventHandler , discordOnLog = \s -> TIO.putStrLn s } putStrLn "Finished!" eventHandler :: Event -> DiscordHandler () eventHandler event = pure () startHandler :: DiscordHandler () startHandler = do Right partialGuilds <- restCall R.GetCurrentUserGuilds result <- runVoice $ do forM_ partialGuilds $ \pg -> do Right guild <- liftDiscord $ restCall $ R.GetGuild (partialGuildId pg) Right chans <- liftDiscord $ restCall $ R.GetGuildChannels (guildId guild) case filter isVoiceChannel chans of (c:_) -> void $ join (guildId guild) (channelId c) _ -> pure () -- play something, then sit around in silence for 30 seconds playYouTube "https://www.youtube.com/watch?v=dQw4w9WgXcQ" liftIO $ threadDelay $ 30 * 1000 * 1000 liftIO $ print result pure () isTextChannel :: Channel -> Bool isTextChannel (ChannelText {}) = True isTextChannel _ = False isVoiceChannel :: Channel -> Bool isVoiceChannel (ChannelVoice {}) = True isVoiceChannel _ = False