lambdabot-4.3: src/Lambdabot/OutputFilter.hs
module Lambdabot.OutputFilter
( OutputFilter
, textwidth
, cleanOutput
, lineify
, checkRecip
) where
import Lambdabot.Nick
import Lambdabot.Util
import Data.Char
import Data.List
type OutputFilter m = Nick -> [String] -> m [String]
textwidth :: Int
textwidth = 200 -- IRC maximum msg length, minus a bit for safety.
-- | For now, this just checks for duplicate empty lines.
cleanOutput :: Monad m => OutputFilter m
cleanOutput _ msg = return $ remDups True msg'
where
remDups True ([]:xs) = remDups True xs
remDups False ([]:xs) = []:remDups True xs
remDups _ (x: xs) = x: remDups False xs
remDups _ [] = []
msg' = map dropSpaceEnd msg
-- | wrap long lines.
lineify :: Monad m => OutputFilter m
lineify = const (return . mlines . unlines)
-- | break into lines
mlines :: String -> [String]
mlines = (mbreak =<<) . lines
where
mbreak :: String -> [String]
mbreak xs
| null bs = [as]
| otherwise = (as++cs) : filter (not . null) (mbreak ds)
where
(as,bs) = splitAt (w-n) xs
breaks = filter (not . isAlphaNum . last . fst) $ drop 1 $
take n $ zip (inits bs) (tails bs)
(cs,ds) = last $ (take n bs, drop n bs): breaks
w = textwidth
n = 10
-- | Don't send any output to alleged bots.
checkRecip :: Monad m => OutputFilter m
checkRecip who msg
-- TODO: this doesn't work with plugin protocols :(
-- | who == Config.name Config.config = return []
| "bot" `isSuffixOf` map toLower (nName who) = return []
| otherwise = return msg
-- | Divide the lines' indent by two
{-
reduceIndent :: OutputFilter
reduceIndent _ msg = return $ map redLine msg
where
redLine (' ':' ':xs) = ' ':redLine xs
redLine xs = xs
-}