linklater-2.0.0.2: The fast and fun way to write Slack.com bots

PortabilityGHC
Stabilityexperimental
Maintainerme@haolian.org
Safe HaskellNone

Network.Linklater

Description

Here's a /jpgto bot! If you run this program and then tell Slack about your server (incoming hook and custom slash command) and then type /jpgto baby corgi in one of your channels, you'll get the image from http:baby.corgi.jpg.to. How, you say? Screen scraping.

 -- Remaining imports left as an exercise to the reader.
 import Network.Linklater (say, slashSimple, Command(..), Config(..), Message(..), Icon(..), Format(..))
 --

 findUrl :: Text -> Maybe Text
 findUrl = fmap fromStrict . maybeResult . parse (manyTill (notChar '\n') (string "src=\"") *> takeTill (== '"'))

 jpgto :: Maybe Command -> IO Text
 jpgto (Just (Command user channel (Just text))) = do
   message <- (fmap messageOf . findUrl . decodeUtf8 . flip (^.) responseBody) <$> get ("http://" <> (unpack subdomain) <> ".jpg.to/")
   case (debug, message) of
     (True, _) -> putStrLn ("+ Pretending to post " <> (unpack . decodeUtf8 . encode) message) >> return ""
     (False, Just m) -> config' >>= say m >> return ""
     (False, Nothing) -> return "Something went wrong!"
   where config' = (Config "trello.slack.com" . filter (/= '\n') . pack) <$> readFile "token"
         subdomain = (intercalate "." . fmap (filter isLetter . filter isAscii) . words) text
         messageOf url = FormattedMessage (EmojiIcon "gift") "jpgtobot" channel [FormatAt user, FormatLink url (subdomain <> ".jpg.to>"), FormatString "no way!: &<>"]
         debug = True
 jpgto _ = return "Type more! (Did you know? jpgtobot is only 26 lines of Haskell. <https://github.com/hlian/jpgtobot/blob/master/Main.hs>)"

 main :: IO ()
 main = let port = 3000 in putStrLn ("+ Listening on port " <> show port) >> run port (slashSimple jpgto)

One /jpgto baby corgi, et voila.

For the full example (since this one is missing a ton of imports), see the examples/ directory on GitHub.

https:github.comhlianlinklater

Synopsis

Documentation

say :: Message -> Config -> IO (Response ByteString)Source

The say function posts a Message, with a capital M, to Slack. It'll, however, need a Config (a.k.a. incoming token) first.

slash :: (Maybe Command -> Application) -> ApplicationSource

A bot server! As if by magic. This acts like a WAI middleware: Linklater wraps around your application. (Really, it just gives you a Command to work with instead of a raw HTTP request.)

slashSimple :: (Maybe Command -> IO Text) -> ApplicationSource

A bot server for people who are in a hurry. Make a function that takes a Command and returns some Text in IO world, and we'll convert it into a WAI application. If you want more control over the request and respond, see slash.

data Channel Source

Where slash commands come from, and where Messages go.

Constructors

GroupChannel Text

A public or private group.

IMChannel Text

A private conversation with your best friend -- or lover ;).

newtype User Source

A username: no at-signs, just text!

Constructors

User Text 

Instances

data Message whereSource

Here's how you talk: you make one of these and pass it to say. Before the day is done, Linklater will convert this to a JSON blob using Aeson.

  • Simple messages are parsed by Slack with parse=full (i.e. as if you had typed it into the input box).
  • Complex messages are parsed according to Slack formatting. See Format.

Constructors

SimpleMessage :: Icon -> Text -> Channel -> Text -> Message 
FormattedMessage :: Icon -> Text -> Channel -> [Format] -> Message 

Instances

data Config Source

Like a curiosity about the world, you'll need one of these to say something.

Constructors

Config 

Fields

_configHostname :: Text

This is where your Slack account is hosted. For example, trello.slack.com.

_configIncomingHookToken :: Text

This is the incoming web hook token that Slack gave you. It's usually a long alphanumberic string of garbage.

data Command Source

Incoming HTTP requests to the slash function get parsed into one of these babies.

Constructors

Command 

Fields

_commandUser :: User

Who ran your slash command.

_commandChannel :: Channel

Where the person ran your slash command.

_commandText :: Maybe Text

Text for the slash command, if any.

newtype Icon Source

The icon next to the messages you say. (Images unsupported right now, sorry.)

Constructors

EmojiIcon Text

For example, :stars2:.

Instances