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.6 KiB

{-
This directory defines a project that illustrates how to connect, authenticate,
set a simple presence, receive message stanzas, and echo them back to whoever is
sending them, using Pontarius XMPP. This file is in the public domain.
-}
{-# LANGUAGE OverloadedStrings #-}
13 years ago
module Main where
13 years ago
import Control.Concurrent
import Control.Monad
13 years ago
import Data.Default
13 years ago
import Data.Maybe (fromJust)
import qualified Data.Text as Text
import Text.Printf
13 years ago
import Network.Xmpp
import Network.Xmpp.IM
13 years ago
-- import System.Log.Formatter
import System.Log.Handler hiding (setLevel)
import System.Log.Handler.Simple
import System.Log.Logger
13 years ago
-- import Network.Xmpp.IM.Roster
-- Server and authentication details.
13 years ago
realm = "species64739.dyndns.org"
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
friend <- case presenceFrom st of
Just from -> do
sendPresence (presenceSubscribed from) session
return $ show from
Nothing -> return "anonymous" -- this shouldn't happen
printf "Hello %s !" friend
main :: IO ()
main = do
updateGlobalLogger "Pontarius.Xmpp" $ setLevel DEBUG
13 years ago
-- handler <- streamHandler stderr DEBUG >>= \h ->
-- return $ setFormatter h (simpleLogFormatter "$loggername: $msg")
-- updateGlobalLogger "Pontarius.Xmpp" (addHandler handler)
sess' <- session
realm
def
(Just ([scramSha1 username Nothing password], resource))
sess <- case sess' of
Left err -> error $ "Error connection to XMPP server: " ++ show err
Right (_, Just err) -> error $ "Error while authenticating: " ++ show err
Right (sess, Nothing) -> return sess
-- 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 ()