discord-haskell /discord-haskell

Haskell library for writing Discord bots

★ 300⑂ 63👁 8⑃ 162● 102▤ 0◈ 0
HaskellNOASSERTIONCreated 2018-06-12hackage.haskell.org/package/discord-haskell
300
stars
63
forks
8
watchers
162
prs
102
issues
0
releases
0
discussions

README

discord-haskell                              


Build that discord bot in Haskell! Also checkout the
calamity haskell library
for a more advanced interface.


 Documentation

 [installing] [debugging] [creating-bot]

 [app-commands] [components] [cache] [embeds] [emoji] [intents] [voice]

 [design] [contributing] [todo]

 Example

This is an example bot that replies "pong" to messages that start with "ping". Checkout the other 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  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: 

 Official Discord Documentation

This api closely matches the official discord documentation,
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 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), make sure you have the most recent version, ask on discord, or open a github issue.

Top issues

Snapshot: 2026-11-11T21:00:35Z · Data license Apache-2.0 · JSON