You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.4 KiB

{-
13 years ago
Copyright © 2010-2012 Jon Kristensen, Philipp Balzarek
This file (EchoClient.hs) illustrates how to connect, authenticate, set a simple
presence, receive message stanzas, and echo them back to whoever is sending
them, using Pontarius. The contents of this file may be used freely, as if it is
in the public domain.
-}
{-# LANGUAGE OverloadedStrings #-}
13 years ago
module Main where
13 years ago
import Control.Concurrent
import Control.Monad
import Data.Maybe (fromJust)
import qualified Data.Text as Text
import Text.Printf
13 years ago
import Network.Xmpp
import Network.Xmpp.IM
import System.Log.Formatter
import System.Log.Logger
import System.Log.Handler hiding (setLevel)
import System.Log.Handler.Simple
import System.IO (stderr)
-- Server and authentication details.
13 years ago
host = "localhost"
port = PortNumber 5222
realm = "server.com"
13 years ago
username = "echo"
password = "pwd"
13 years ago
resource = Just "bot"
13 years ago
-- | Automatically accept all subscription requests from other entities
autoAccept :: Session -> IO ()
autoAccept session = forever $ do
st <- waitForPresence isPresenceSubscribe session
13 years ago
let Just friend = presenceFrom st
sendPresence (presenceSubscribed friend) session
13 years ago
printf "Hello %s !" (show friend)
main :: IO ()
main = do
updateGlobalLogger "Pontarius.Xmpp" $ setLevel DEBUG
handler <- streamHandler stderr DEBUG >>= \h ->
return $ setFormatter h (simpleLogFormatter "$time - $loggername: $prio: $msg")
updateGlobalLogger "Pontarius.Xmpp" (addHandler handler)
sess <- simpleConnect
host
port
realm
username
password
resource
-- We won't be able to receive stanzas before we set out status to online
sendPresence presenceOnline sess
putStrLn "Connected."
-- We want to see all incoming stanzas in the auto-accept thread as well.
sess' <- dupSession sess
_thread <- forkIO $ autoAccept sess'
forever $ do
-- Echo all messages back to the user.
msg <- getMessage sess
sendMessage (answerIM (bodies msg) [] msg) sess
-- Print the received message to the screen.
13 years ago
let sender = show . fromJust $ messageFrom msg
let contents = maybe "nothing" Text.unpack $ body msg
printf "%s says \"%s\"\n" sender contents
return ()