module Network.Mollom
( getServerList
, checkContent
, sendFeedback
, getImageCaptcha
, getAudioCaptcha
, checkCaptcha
, getStatistics
, verifyKey
, detectLanguage
, addBlacklistText
, removeBlacklistText
, listBlacklistText
, addBlacklistURL
, removeBlacklistURL
, listBlacklistURL
, MollomConn(..)
) where
import Control.Monad.Error
import Data.Maybe(fromJust, isJust)
import Network.XmlRpc.Client
import Network.XmlRpc.Internals
import Network.Mollom.Auth
mollomApiVersion :: String
mollomApiVersion = "1.0"
mollomFallbackServer :: String
mollomFallbackServer = "http://xmlrpc2.mollom.com/"
mollomTimeFormat = "%Y-%m-%dT%H:%M:%S.000+0200"
data MollomConn = MollomConn
{ mcPublicKey :: String
, mcPrivateKey :: String
, mcSessionID :: String
, mcServerList :: [String]
}
data MollomMonad a = MollomMonad (MollomConn -> IO (a, MollomConn))
instance Monad MollomMonad where
return a = MollomMonad $ \conn -> return (a, conn)
(MollomMonad m) >>= k = MollomMonad $ \conn -> do
(a, conn') <- m conn
let (MollomMonad m') = k a
m' conn'
data MollomRequest = MollomRequest [(String, String)]
data MollomValue = MInt Int
| MBool Bool
| MDouble Double
| MString String deriving (Show, Eq)
instance XmlRpcType MollomValue where
toValue (MInt i) = toValue i
toValue (MBool b) = toValue b
toValue (MDouble d) = toValue d
toValue (MString s) = toValue s
fromValue (ValueInt i) = maybeToM "" (Just (MInt i))
fromValue (ValueBool b) = maybeToM "" (Just (MBool b))
fromValue (ValueDouble d) = maybeToM "" (Just (MDouble d))
fromValue (ValueString s) = maybeToM "" (Just (MString s))
getType (MInt _) = TInt
getType (MBool _) = TBool
getType (MDouble _) = TDouble
getType (MString _) = TString
service :: XmlRpcType a
=> MollomConn
-> String
-> MollomRequest
-> IO a
service conn function (MollomRequest fields) = do
let publicKey = mcPublicKey conn
privateKey = mcPrivateKey conn
timeStamp = getMollomTime mollomTimeFormat
nonce = getMollomNonce
hash = authenticate publicKey privateKey timeStamp nonce
requestStruct = [("public_key", publicKey), ("time", timeStamp), ("hash", hash), ("nonce", nonce)] ++ fields
response <- remote (mollomFallbackServer ++ mollomApiVersion ++ "/") function requestStruct
return response
getServerList :: MollomConn
-> IO [String]
getServerList conn =
service conn "mollom.getServerList" (MollomRequest [])
checkContent :: MollomConn
-> [(String, String)]
-> IO [(String, MollomValue)]
checkContent conn ds =
service conn "mollom.checkContent" (MollomRequest ds)
sendFeedback :: MollomConn
-> String
-> String
-> IO Bool
sendFeedback conn sessionID feedback = do
service conn "mollom.sendFeedback" (MollomRequest [("session_id", sessionID), ("feedback", feedback)])
getImageCaptcha :: MollomConn
-> Maybe String
-> Maybe String
-> IO [(String, MollomValue)]
getImageCaptcha conn sessionID authorIP = do
let ds = map (\(n, v) -> (n, fromJust v)) $ filter (isJust . snd) [("session_id", sessionID), ("author_ip", authorIP)]
service conn "mollom.getImageCaptcha" (MollomRequest ds)
getAudioCaptcha :: MollomConn
-> Maybe String
-> Maybe String
-> IO [(String, MollomValue)]
getAudioCaptcha conn sessionID authorIP = do
let ds = map (\(n, v) -> (n, fromJust v)) $ filter (isJust . snd) [("session_id", sessionID), ("author_ip", authorIP)]
service conn "mollom.getAudioCaptcha" (MollomRequest ds)
checkCaptcha :: MollomConn
-> String
-> String
-> IO Bool
checkCaptcha conn sessionID solution = do
let ds = [("session_id", sessionID), ("solution", solution)]
service conn "mollom.checkCaptcha" (MollomRequest ds)
getStatistics :: MollomConn
-> String
-> IO Int
getStatistics conn statType = do
service conn "mollom.getStatistics" (MollomRequest [("type", statType)])
verifyKey :: MollomConn
-> IO Bool
verifyKey conn = do
service conn "mollom.verifyKey" (MollomRequest [])
detectLanguage :: MollomConn
-> String
-> IO [[(String, MollomValue)]]
detectLanguage conn text = do
service conn "mollom.detectLanguage" (MollomRequest [("text", text)])
addBlacklistText :: MollomConn
-> String
-> String
-> String
-> IO Bool
addBlacklistText conn text match reason = do
let ds = [("text", text), ("match", match), ("reason", reason)]
service conn "mollom.addBlacklistText" (MollomRequest ds)
removeBlacklistText :: MollomConn
-> String
-> IO Bool
removeBlacklistText conn text = do
let ds = [("text", text)]
service conn "mollom.removeBlacklistText" (MollomRequest ds)
listBlacklistText :: MollomConn
-> IO ()
listBlacklistText conn = do
r <- service conn "mollom.listBlacklistText" (MollomRequest [])
p <- handleError fail (parseResponse r)
putStrLn $ show p
addBlacklistURL :: MollomConn
-> String
-> IO Bool
addBlacklistURL conn url = do
let ds = [("url", url)]
service conn "mollom.addBlacklistURL" (MollomRequest ds)
removeBlacklistURL :: MollomConn
-> String
-> IO Bool
removeBlacklistURL conn url = do
let ds = [("url", url)]
service conn "mollom.removeBlacklistURL" (MollomRequest ds)
listBlacklistURL :: MollomConn
-> IO [[(String, MollomValue)]]
listBlacklistURL conn = do
service conn "mollom.listBlacklistURL" (MollomRequest [])