tools/ubot-plugins/hs-echo/app/Main.hs
changeset 15816 7598960819a1
equal deleted inserted replaced
15815:96443d9b48c9 15816:7598960819a1
       
     1 {-# LANGUAGE OverloadedStrings #-}
       
     2 module Main where
       
     3 
       
     4 import Text.Megaparsec (Parsec, parseMaybe)
       
     5 import Text.URI
       
     6 import System.Environment (getEnv)
       
     7 import Data.Text (Text, pack, unpack)
       
     8 import Data.Maybe
       
     9 import Control.Monad (when)
       
    10 import Network.AMQP
       
    11 import qualified Data.ByteString.Lazy.Char8 as BL
       
    12 
       
    13 assert :: String -> Bool -> a -> a
       
    14 assert message False x = error message
       
    15 assert _ _ x = x
       
    16 
       
    17 unRpack = unpack . unRText
       
    18 
       
    19 main :: IO ()
       
    20 main = do
       
    21     amqpUri <- getEnv "AMQP_URL"
       
    22     let uri = fromJust $ parseMaybe (parser :: Parsec Int Text URI) $ pack amqpUri
       
    23     when (uriScheme uri /= mkScheme "amqp") $ error "AMQP_URL environment variable scheme should be amqp"
       
    24     let Right (Authority (Just (UserInfo username (Just password))) rHost maybePort) = uriAuthority uri
       
    25  
       
    26     conn <- openConnection' (unRpack rHost) (fromInteger . toInteger $ fromMaybe 5672 maybePort) "/" (unRText username) (unRText password)
       
    27     chan <- openChannel conn
       
    28 
       
    29     (queueName, messageCount, consumerCount) <- declareQueue chan newQueue
       
    30     bindQueue chan queueName "irc" "cmd.echo.hedgewars"
       
    31 
       
    32     -- subscribe to the queue
       
    33     consumeMsgs chan queueName Ack (myCallback chan)
       
    34 
       
    35     getLine -- wait for keypress
       
    36     closeConnection conn
       
    37     putStrLn "connection closed"
       
    38 
       
    39 
       
    40 myCallback :: Channel -> (Message,Envelope) -> IO ()
       
    41 myCallback chan (msg, env) = do
       
    42     let message = BL.tail . BL.dropWhile (/= '\n') $ msgBody msg
       
    43     putStrLn $ "received message: " ++ (BL.unpack $ message)
       
    44 
       
    45     publishMsg chan "irc" "say.hedgewars"
       
    46         newMsg {msgBody = message}
       
    47 
       
    48     ackEnv env