|
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 |