diff options
| author | LLLL Colonq <llll@colonq> | 2023-11-16 19:06:43 -0500 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2023-11-16 19:06:43 -0500 |
| commit | dcef0b65069fb38fd0f6c4382353167f603ebff1 (patch) | |
| tree | 45954ffe308c3dd056e6af4f734e6d2af89e5856 /deps/discord-haskell/README.md | |
Initial commit
Diffstat (limited to 'deps/discord-haskell/README.md')
| -rw-r--r-- | deps/discord-haskell/README.md | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/deps/discord-haskell/README.md b/deps/discord-haskell/README.md new file mode 100644 index 0000000..e9a50d9 --- /dev/null +++ b/deps/discord-haskell/README.md @@ -0,0 +1,75 @@ +# discord-haskell [](https://github.com/discord-haskell/discord-haskell/actions/) [](https://hackage.haskell.org/package/discord-haskell) [](https://discord.gg/eaRAGgX3bK) + + +Build that discord bot in Haskell! Also checkout the +[calamity haskell library](https://github.com/nitros12/calamity) +for a more advanced interface. + + +#### Documentation + +#### [[installing](./docs/installing.md)] [[debugging](./docs/debugging.md)] [[creating-bot](./docs/creating-bot.md)] + +#### [[app-commands](./docs/applicationcommands.md)] [[components](./docs/components.md)] [[cache](./docs/cache.md)] [[embeds](./docs/embeds.md)] [[emoji](./docs/emoji.md)] [[intents](./docs/intents.md)] [[voice](./docs/voice.md)] + +#### [[design](./docs/design.md)] [[contributing](./docs/contributing.md)] [[todo](./docs/todo.md)] + +#### Example + +This is an example bot that replies "pong" to messages that start with "ping". Checkout the [other examples](./examples/) for things like state management. + +```haskell +{-# LANGUAGE OverloadedStrings #-} -- allows "string literals" to be Text +import Control.Monad (when, void) +import UnliftIO.Concurrent +import Data.Text (isPrefixOf, toLower, Text) +import qualified Data.Text.IO as TIO + +import Discord +import Discord.Types +import qualified Discord.Requests as R + +-- | Replies "pong" to every message that starts with "ping" +pingpongExample :: IO () +pingpongExample = do + userFacingError <- runDiscord $ def + { discordToken = "Bot ZZZZZZZZZZZZZZZZZZZ" + , discordOnEvent = eventHandler + , discordOnLog = \s -> TIO.putStrLn s >> TIO.putStrLn "" + } -- if you see OnLog error, post in the discord / open an issue + + TIO.putStrLn userFacingError + -- userFacingError is an unrecoverable error + -- put normal 'cleanup' code in discordOnEnd (see examples) + +eventHandler :: Event -> DiscordHandler () +eventHandler event = case event of + MessageCreate m -> when (isPing m && not (fromBot m)) $ do + void $ restCall (R.CreateReaction (messageChannelId m, messageId m) "eyes") + threadDelay (2 * 10^6) + void $ restCall (R.CreateMessage (messageChannelId m) "Pong!") + _ -> return () + +fromBot :: Message -> Bool +fromBot = userIsBot . messageAuthor + +isPing :: Message -> Bool +isPing = ("ping" `isPrefixOf`) . toLower . messageContent +``` + +#### Discord Server + +Ask questions, get updates, request features, etc in the project discord server: <https://discord.gg/eaRAGgX3bK> + +#### Official Discord Documentation + +This api closley matches the [official discord documentation](https://discord.com/developers/docs/intro), +which lists the rest requests, gateway events, and gateway sendables. + +You can use the docs to check the name of something you want to do. For example: +the docs list a [Get Channel](https://discord.com/developers/docs/resources/channel#get-channel) API path, +which translates to discord-haskell's rest request ADT for `GetChannel` of type `ChannelId -> ChannelRequest Channel`. + +#### Open an Issue + +If something goes wrong: check the error message (optional: check [the debugging logs](./docs/debugging.md)), make sure you have the most recent version, ask on discord, or open a github issue. |
